diff options
Diffstat (limited to 'src/database-redis.cpp')
-rw-r--r-- | src/database-redis.cpp | 37 |
1 files changed, 27 insertions, 10 deletions
diff --git a/src/database-redis.cpp b/src/database-redis.cpp index cc4e5bade..498e9d39a 100644 --- a/src/database-redis.cpp +++ b/src/database-redis.cpp @@ -84,15 +84,15 @@ bool Database_Redis::saveBlock(const v3s16 &pos, const std::string &data) redisReply *reply = static_cast<redisReply *>(redisCommand(ctx, "HSET %s %s %b", hash.c_str(), tmp.c_str(), data.c_str(), data.size())); if (!reply) { - errorstream << "WARNING: saveBlock: redis command 'HSET' failed on " + warningstream << "saveBlock: redis command 'HSET' failed on " "block " << PP(pos) << ": " << ctx->errstr << std::endl; freeReplyObject(reply); return false; } if (reply->type == REDIS_REPLY_ERROR) { - errorstream << "WARNING: saveBlock: saving block " << PP(pos) - << " failed: " << reply->str << std::endl; + warningstream << "saveBlock: saving block " << PP(pos) + << " failed: " << std::string(reply->str, reply->len) << std::endl; freeReplyObject(reply); return false; } @@ -118,12 +118,26 @@ std::string Database_Redis::loadBlock(const v3s16 &pos) freeReplyObject(reply); return str; } - case REDIS_REPLY_ERROR: - errorstream << "WARNING: loadBlock: loading block " << PP(pos) - << " failed: " << reply->str << std::endl; + case REDIS_REPLY_ERROR: { + std::string errstr(reply->str, reply->len); + freeReplyObject(reply); + errorstream << "loadBlock: loading block " << PP(pos) + << " failed: " << errstr << std::endl; + throw FileNotGoodException(std::string( + "Redis command 'HGET %s %s' errored: ") + errstr); + } + case REDIS_REPLY_NIL: { + // block not found in database + freeReplyObject(reply); + return ""; + } } + errorstream << "loadBlock: loading block " << PP(pos) + << " returned invalid reply type " << reply->type + << ": " << std::string(reply->str, reply->len) << std::endl; freeReplyObject(reply); - return ""; + throw FileNotGoodException(std::string( + "Redis command 'HGET %s %s' gave invalid reply.")); } bool Database_Redis::deleteBlock(const v3s16 &pos) @@ -136,8 +150,8 @@ bool Database_Redis::deleteBlock(const v3s16 &pos) throw FileNotGoodException(std::string( "Redis command 'HDEL %s %s' failed: ") + ctx->errstr); } else if (reply->type == REDIS_REPLY_ERROR) { - errorstream << "WARNING: deleteBlock: deleting block " << PP(pos) - << " failed: " << reply->str << std::endl; + warningstream << "deleteBlock: deleting block " << PP(pos) + << " failed: " << std::string(reply->str, reply->len) << std::endl; freeReplyObject(reply); return false; } @@ -155,13 +169,16 @@ void Database_Redis::listAllLoadableBlocks(std::vector<v3s16> &dst) } switch (reply->type) { case REDIS_REPLY_ARRAY: + dst.reserve(reply->elements); for (size_t i = 0; i < reply->elements; i++) { assert(reply->element[i]->type == REDIS_REPLY_STRING); dst.push_back(getIntegerAsBlock(stoi64(reply->element[i]->str))); } + break; case REDIS_REPLY_ERROR: throw FileNotGoodException(std::string( - "Failed to get keys from database: ") + reply->str); + "Failed to get keys from database: ") + + std::string(reply->str, reply->len)); } freeReplyObject(reply); } |