diff --git a/src/backends/redis/command.cpp b/src/backends/redis/command.cpp index 171d9c7..7445b61 100644 --- a/src/backends/redis/command.cpp +++ b/src/backends/redis/command.cpp @@ -133,4 +133,8 @@ namespace redis { auto Command::hscan (boost::string_ref parKey) -> hscan_range { return hscan_range(hscan_iterator(this, parKey, false), hscan_iterator(this, parKey, true)); } + + auto Command::sscan (boost::string_ref parKey) -> sscan_range { + return sscan_range(sscan_iterator(this, parKey, false), sscan_iterator(this, parKey, true)); + } } //namespace redis diff --git a/src/backends/redis/command.hpp b/src/backends/redis/command.hpp index d4e1ce6..1b3e840 100644 --- a/src/backends/redis/command.hpp +++ b/src/backends/redis/command.hpp @@ -41,6 +41,8 @@ namespace redis { typedef boost::iterator_range scan_range; typedef ScanIterator>> hscan_iterator; typedef boost::iterator_range hscan_range; + typedef ScanIterator> sscan_iterator; + typedef boost::iterator_range sscan_range; Command ( std::string&& parAddress, uint16_t parPort ); ~Command ( void ) noexcept; @@ -56,6 +58,7 @@ namespace redis { //Single Redis command wrappers scan_range scan ( void ); hscan_range hscan ( boost::string_ref parKey ); + sscan_range sscan ( boost::string_ref parKey ); private: using RedisConnection = std::unique_ptr; diff --git a/src/backends/redis/scan_iterator.hpp b/src/backends/redis/scan_iterator.hpp index 3c24139..f0f5231 100644 --- a/src/backends/redis/scan_iterator.hpp +++ b/src/backends/redis/scan_iterator.hpp @@ -95,6 +95,22 @@ namespace redis { static const T& make_value ( const RedisReplyType* parItem ); }; + template + struct ScanSingleValuesInKey { + typedef T value_type; + + explicit ScanSingleValuesInKey ( boost::string_ref parScanTarget ) : m_scan_target(parScanTarget) {} + + static constexpr const char* command ( void ) { return "SSCAN"; } + static constexpr const std::size_t step = 1; + + static const T& make_value ( const RedisReplyType* parItem ); + boost::string_ref scan_target ( void ) const { return m_scan_target; } + + private: + boost::string_ref m_scan_target; + }; + template struct ScanPairs { typedef P value_type; @@ -105,7 +121,7 @@ namespace redis { static constexpr const std::size_t step = 2; static value_type make_value ( const RedisReplyType* parItem ); - boost::string_ref scan_target ( void ); + boost::string_ref scan_target ( void ) const { return m_scan_target; } private: boost::string_ref m_scan_target; diff --git a/src/backends/redis/scan_iterator.inl b/src/backends/redis/scan_iterator.inl index fa75eff..5ef01c8 100644 --- a/src/backends/redis/scan_iterator.inl +++ b/src/backends/redis/scan_iterator.inl @@ -147,14 +147,15 @@ namespace redis { return get(*parItem); } + template + auto ScanSingleValuesInKey::make_value (const RedisReplyType* parItem) -> const value_type& { + assert(parItem); + return get(*parItem); + } + template auto ScanPairs::make_value (const RedisReplyType* parItem) -> value_type { assert(parItem); return value_type(get(parItem[0]), get(parItem[1])); } - - template - boost::string_ref ScanPairs::scan_target() { - return m_scan_target; - } } //namespace redis