From d7c254e1a0c51dd2cb1c0d484b434426d6419d28 Mon Sep 17 00:00:00 2001 From: King_DuckZ Date: Tue, 12 Jul 2016 20:31:57 +0100 Subject: [PATCH] Implement find_set_details(). --- src/backends/redis/backend_redis.cpp | 10 ++++++--- src/backends/redis/find.cpp | 32 ++++++++++++++++++++++++++-- src/backends/redis/find.hpp | 2 ++ src/backends/redis/scan_iterator.hpp | 4 ++-- 4 files changed, 41 insertions(+), 7 deletions(-) diff --git a/src/backends/redis/backend_redis.cpp b/src/backends/redis/backend_redis.cpp index 72b5ae8..555337e 100644 --- a/src/backends/redis/backend_redis.cpp +++ b/src/backends/redis/backend_redis.cpp @@ -32,6 +32,7 @@ #include #include #include +#include namespace dindb { namespace { @@ -180,7 +181,8 @@ namespace dindb { "content_type", parSetData.content_type, "base_file_id", lexical_cast(base_file_id), "item_count", lexical_cast(parData.size()), - "dir_count", lexical_cast(std::count_if(parData.begin(), parData.end(), [](const mchlib::FileRecordData& r){return r.is_directory;})) + "dir_count", lexical_cast(std::count_if(parData.begin(), parData.end(), [](const mchlib::FileRecordData& r){return r.is_directory;})), + "creation", lexical_cast(std::time(nullptr)) ); #if !defined(NDEBUG) @@ -204,7 +206,9 @@ namespace dindb { "is_symlink", (file_data.is_symlink ? '1' : '0'), "unreadable", (file_data.unreadable ? '1' : '0'), "hash_valid", (file_data.hash_valid ? '1' : '0'), - "group_id", group_id + "group_id", group_id, + "atime", lexical_cast(file_data.atime), + "mtime", lexical_cast(file_data.mtime) ); batch.sadd( @@ -267,7 +271,7 @@ namespace dindb { } std::vector> BackendRedis::find_set_details (const std::vector& parSets) { - return std::vector>(); + return dindb::find_set_details(m_redis, parSets); } std::vector> BackendRedis::find_file_details (GroupIDType parSetID, uint16_t parLevel, boost::string_ref parDir) { diff --git a/src/backends/redis/find.cpp b/src/backends/redis/find.cpp index 18b578d..f6b6e96 100644 --- a/src/backends/redis/find.cpp +++ b/src/backends/redis/find.cpp @@ -84,7 +84,6 @@ namespace dindb { using boost::adaptors::transformed; using boost::tuple; using boost::make_tuple; - using redis::get_string; using redis::Reply; using std::vector; using dinhelp::lexical_cast; @@ -259,6 +258,35 @@ namespace dindb { filter = filter_case_sens; return locate_in_bursts(parRedis, PROGRAM_NAME ":set:*", filter, "desc", "item_count", "dir_count"); - } + + std::vector> find_set_details (redis::IncRedis& parRedis, const std::vector& parSets) { + using dinhelp::lexical_cast; + using MArr = dinhelp::MaxSizedArray; + + auto batch = parRedis.make_batch(); + for (auto set_id : parSets) { + const auto set_key = PROGRAM_NAME ":set:" + lexical_cast(set_id); + batch.hmget(set_key, "creation", "name", "disk_label"); + } + batch.throw_if_failed(); + + std::vector retval; + auto curr_set = parSets.begin(); + for (const auto& reply : batch.replies()) { + const auto& reply_list = get_array(reply); + if (redis::RedisVariantType_Nil != reply_list[0].which() and + redis::RedisVariantType_Nil != reply_list[1].which() and + redis::RedisVariantType_Nil != reply_list[2].which()) + { + retval.resize(retval.size() + 1); + retval.back().push_back(lexical_cast(*curr_set)); + retval.back().push_back(get_string(reply_list[1])); + retval.back().push_back(get_string(reply_list[0])); + retval.back().push_back(get_string(reply_list[2])); + } + ++curr_set; + } + return retval; + }; } //namespace dindb diff --git a/src/backends/redis/find.hpp b/src/backends/redis/find.hpp index 6db9ea1..b31b64d 100644 --- a/src/backends/redis/find.hpp +++ b/src/backends/redis/find.hpp @@ -19,6 +19,7 @@ #define idB4972996B4494E66A03B6AE205B1FA36 #include "backends/db_backend.hpp" +#include "helpers/MaxSizedArray.hpp" #include namespace redis { @@ -31,6 +32,7 @@ namespace dindb { std::vector locate_in_db ( redis::IncRedis& parRedis, const mchlib::TigerHash& parSearch, const TagList& parTags ); std::vector locate_sets_in_db ( redis::IncRedis& parRedis, const std::string& parSubstr, bool parCaseInsensitive ); std::vector locate_sets_in_db ( redis::IncRedis& parRedis, const std::string& parSubstr, const std::vector& parSets, bool parCaseInsensitive ); + std::vector> find_set_details ( redis::IncRedis& parRedis, const std::vector& parSets ); } //namespace dindb #endif diff --git a/src/backends/redis/scan_iterator.hpp b/src/backends/redis/scan_iterator.hpp index b6f1a0c..339abaf 100644 --- a/src/backends/redis/scan_iterator.hpp +++ b/src/backends/redis/scan_iterator.hpp @@ -78,9 +78,9 @@ namespace redis { private: template - Reply forward_scan_command ( typename std::enable_if::value, int>::type parDummy ); + Reply forward_scan_command ( typename std::enable_if::value, long long>::type parContext ); template - Reply forward_scan_command ( typename std::enable_if::value, int>::type parDummy ); + Reply forward_scan_command ( typename std::enable_if::value, long long>::type parContext ); bool is_end ( void ) const; void increment ( void );