X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fdatabase-redis.cpp;h=3bcedad9bfdaddc71b50e753570164b2ab66d5b4;hb=ba52a34f94504e966ee3842e724561eec037cbc0;hp=196d72f251e307005bde1cb489638b333e47ee77;hpb=8a46c5df1c1b7d7c2b46b73f973a45388a517e71;p=oweals%2Fminetest.git diff --git a/src/database-redis.cpp b/src/database-redis.cpp index 196d72f25..3bcedad9b 100644 --- a/src/database-redis.cpp +++ b/src/database-redis.cpp @@ -46,11 +46,11 @@ Database_Redis::Database_Redis(Settings &conf) int port = conf.exists("redis_port") ? conf.getU16("redis_port") : 6379; ctx = redisConnect(addr, port); if (!ctx) { - throw FileNotGoodException("Cannot allocate redis context"); + throw DatabaseException("Cannot allocate redis context"); } else if (ctx->err) { std::string err = std::string("Connection error: ") + ctx->errstr; redisFree(ctx); - throw FileNotGoodException(err); + throw DatabaseException(err); } } @@ -62,7 +62,7 @@ Database_Redis::~Database_Redis() void Database_Redis::beginSave() { redisReply *reply = static_cast(redisCommand(ctx, "MULTI")); if (!reply) { - throw FileNotGoodException(std::string( + throw DatabaseException(std::string( "Redis command 'MULTI' failed: ") + ctx->errstr); } freeReplyObject(reply); @@ -71,7 +71,7 @@ void Database_Redis::beginSave() { void Database_Redis::endSave() { redisReply *reply = static_cast(redisCommand(ctx, "EXEC")); if (!reply) { - throw FileNotGoodException(std::string( + throw DatabaseException(std::string( "Redis command 'EXEC' failed: ") + ctx->errstr); } freeReplyObject(reply); @@ -92,7 +92,7 @@ bool Database_Redis::saveBlock(const v3s16 &pos, const std::string &data) if (reply->type == REDIS_REPLY_ERROR) { warningstream << "saveBlock: saving block " << PP(pos) - << " failed: " << reply->str << std::endl; + << " failed: " << std::string(reply->str, reply->len) << std::endl; freeReplyObject(reply); return false; } @@ -101,42 +101,45 @@ bool Database_Redis::saveBlock(const v3s16 &pos, const std::string &data) return true; } -std::string Database_Redis::loadBlock(const v3s16 &pos) +void Database_Redis::loadBlock(const v3s16 &pos, std::string *block) { std::string tmp = i64tos(getBlockAsInteger(pos)); redisReply *reply = static_cast(redisCommand(ctx, "HGET %s %s", hash.c_str(), tmp.c_str())); if (!reply) { - throw FileNotGoodException(std::string( + throw DatabaseException(std::string( "Redis command 'HGET %s %s' failed: ") + ctx->errstr); } + switch (reply->type) { case REDIS_REPLY_STRING: { - std::string str(reply->str, reply->len); + *block = std::string(reply->str, reply->len); // std::string copies the memory so this won't cause any problems freeReplyObject(reply); - return str; + return; } case REDIS_REPLY_ERROR: { - std::string errstr = reply->str; + std::string errstr(reply->str, reply->len); freeReplyObject(reply); errorstream << "loadBlock: loading block " << PP(pos) << " failed: " << errstr << std::endl; - throw FileNotGoodException(std::string( + throw DatabaseException(std::string( "Redis command 'HGET %s %s' errored: ") + errstr); } case REDIS_REPLY_NIL: { + *block = ""; // block not found in database freeReplyObject(reply); - return ""; + return; } } + errorstream << "loadBlock: loading block " << PP(pos) << " returned invalid reply type " << reply->type - << ": " << reply->str << std::endl; + << ": " << std::string(reply->str, reply->len) << std::endl; freeReplyObject(reply); - throw FileNotGoodException(std::string( + throw DatabaseException(std::string( "Redis command 'HGET %s %s' gave invalid reply.")); } @@ -147,11 +150,11 @@ bool Database_Redis::deleteBlock(const v3s16 &pos) redisReply *reply = static_cast(redisCommand(ctx, "HDEL %s %s", hash.c_str(), tmp.c_str())); if (!reply) { - throw FileNotGoodException(std::string( + throw DatabaseException(std::string( "Redis command 'HDEL %s %s' failed: ") + ctx->errstr); } else if (reply->type == REDIS_REPLY_ERROR) { warningstream << "deleteBlock: deleting block " << PP(pos) - << " failed: " << reply->str << std::endl; + << " failed: " << std::string(reply->str, reply->len) << std::endl; freeReplyObject(reply); return false; } @@ -164,7 +167,7 @@ void Database_Redis::listAllLoadableBlocks(std::vector &dst) { redisReply *reply = static_cast(redisCommand(ctx, "HKEYS %s", hash.c_str())); if (!reply) { - throw FileNotGoodException(std::string( + throw DatabaseException(std::string( "Redis command 'HKEYS %s' failed: ") + ctx->errstr); } switch (reply->type) { @@ -176,8 +179,9 @@ void Database_Redis::listAllLoadableBlocks(std::vector &dst) } break; case REDIS_REPLY_ERROR: - throw FileNotGoodException(std::string( - "Failed to get keys from database: ") + reply->str); + throw DatabaseException(std::string( + "Failed to get keys from database: ") + + std::string(reply->str, reply->len)); } freeReplyObject(reply); }