From efd71181897b4937ebf11735eb23c430ee9e50b9 Mon Sep 17 00:00:00 2001 From: King_DuckZ Date: Tue, 14 Jun 2016 09:10:45 +0100 Subject: [PATCH] Add support for single chars to the run() method. --- src/backends/redis/arg_to_bin_safe.hpp | 10 ++++++++ src/backends/redis/backend_redis.cpp | 35 +++++++++++++++++++++----- src/backends/redis/command.hpp | 3 ++- src/backends/redis/reply.hpp | 2 +- 4 files changed, 42 insertions(+), 8 deletions(-) diff --git a/src/backends/redis/arg_to_bin_safe.hpp b/src/backends/redis/arg_to_bin_safe.hpp index 360e4dd..47e5f42 100644 --- a/src/backends/redis/arg_to_bin_safe.hpp +++ b/src/backends/redis/arg_to_bin_safe.hpp @@ -55,6 +55,16 @@ namespace redis { const std::size_t m_size; }; + template<> + struct MakeCharInfo { + MakeCharInfo ( char parData ) : m_data(parData) {} + const char* data ( void ) const { return &m_data; } + std::size_t size ( void ) const { return 1; } + + private: + const char m_data; + }; + template inline const char* arg_to_bin_safe_char (const T& parArg) { return MakeCharInfo(parArg).data(); diff --git a/src/backends/redis/backend_redis.cpp b/src/backends/redis/backend_redis.cpp index ffdd57c..cf50df3 100644 --- a/src/backends/redis/backend_redis.cpp +++ b/src/backends/redis/backend_redis.cpp @@ -91,9 +91,6 @@ namespace dindb { } void BackendRedis::tag_files (const std::vector& parRegexes, const std::vector& parTags, GroupIDType parSet) { - for (const auto& file_path : m_redis.scan()) { - //std::cout << file_path << '\n'; - } } void BackendRedis::delete_tags (const std::vector& parFiles, const std::vector& parTags, GroupIDType parSet) { @@ -114,9 +111,35 @@ namespace dindb { void BackendRedis::write_files (const std::vector& parData, const mchlib::SetRecordDataFull& parSetData, const std::string& parSignature) { using boost::lexical_cast; - auto incr_reply = m_redis.run("HINCRBY " PROGRAM_NAME ":indices set 1"); - const std::string set_key = PROGRAM_NAME ":set:" + lexical_cast(redis::get_integer(incr_reply)); - auto insert_set_reply = m_redis.run("HMSET %b name %b disk_label %b fs_uuid %b", set_key, parSetData.name, parSetData.disk_label, parSetData.fs_uuid); + redis::Reply set_id_reply = m_redis.run("HINCRBY " PROGRAM_NAME ":indices set 1"); + const std::string set_key = PROGRAM_NAME ":set:" + lexical_cast(redis::get_integer(set_id_reply)); + redis::Reply insert_set_reply = m_redis.run( + "HMSET %b name %b disk_label %b fs_uuid %b type %b content_type %b", + set_key, + parSetData.name, + parSetData.disk_label, + parSetData.fs_uuid, + parSetData.type, + parSetData.content_type + ); + + for (const auto& file_data : parData) { + redis::Reply file_id_reply = m_redis.run("HINCRBY " PROGRAM_NAME ":indices files 1"); + const std::string file_key = PROGRAM_NAME ":file:" + lexical_cast(redis::get_integer(file_id_reply)); + redis::Reply insert_file_reply = m_redis.run( + "HMSET %b hash %b path %b size %b level %b mime_type %b mime_charset %b is_directory %b is_symlink %b is_unreadable %b hash_valid %b", + file_key, + tiger_to_string(file_data.hash), + lexical_cast(file_data.size), + lexical_cast(file_data.level), + file_data.mime_type(), + file_data.mime_charset(), + (file_data.is_directory ? '1' : '0'), + (file_data.is_symlink ? '1' : '0'), + (file_data.unreadable ? '1' : '0'), + (file_data.hash_valid ? '1' : '0') + ); + } } bool BackendRedis::search_file_by_hash (mchlib::FileRecordData& parItem, mchlib::SetRecordDataFull& parSet, const mchlib::TigerHash& parHash) { diff --git a/src/backends/redis/command.hpp b/src/backends/redis/command.hpp index 4524f3d..b3b00a0 100644 --- a/src/backends/redis/command.hpp +++ b/src/backends/redis/command.hpp @@ -81,11 +81,12 @@ namespace redis { using LengthArray = std::array; using implem::arg_to_bin_safe_char; using implem::arg_to_bin_safe_length; + using implem::MakeCharInfo; using boost::string_ref; return this->run_pvt( static_cast(arg_count), - CharPointerArray{ arg_to_bin_safe_char(string_ref(parCommand)), arg_to_bin_safe_char(std::forward(parArgs))... }.data(), + CharPointerArray{ (arg_to_bin_safe_char(string_ref(parCommand))), MakeCharInfo::type>::type>(std::forward(parArgs)).data()... }.data(), LengthArray{ arg_to_bin_safe_length(string_ref(parCommand)), arg_to_bin_safe_length(std::forward(parArgs))... }.data() ); } diff --git a/src/backends/redis/reply.hpp b/src/backends/redis/reply.hpp index 4d60022..24332d6 100644 --- a/src/backends/redis/reply.hpp +++ b/src/backends/redis/reply.hpp @@ -23,7 +23,7 @@ #include namespace redis { - class Reply; + struct Reply; namespace implem { using RedisVariantType = boost::variant<