lib/rediska/driver.rb in rediska-0.0.11 vs lib/rediska/driver.rb in rediska-0.1.0

- old
+ new

@@ -1,8 +1,8 @@ module Rediska module Driver - attr_accessor :buffer, :database_id + attr_accessor :database_id attr_writer :replies def replies @replies ||= [] end @@ -18,39 +18,18 @@ end def timeout=(usecs) end - def write(command) - meffod = command.shift.to_s.downcase.to_sym - if respond_to?(meffod) - reply = send(meffod, *command) - else - raise Redis::CommandError, "ERR unknown command #{meffod.upcase}" - end - - if reply == true - reply = 1 - elsif reply == false - reply = 0 - end - - replies << reply - buffer << reply if buffer && meffod != :multi - nil - end - def read replies.shift end # NOT IMPLEMENTED: # * blpop # * brpop # * brpoplpush - # * discard - # * sort # * subscribe # * psubscribe # * publish def flushdb @@ -157,12 +136,13 @@ end def hdel(key, field) field = field.to_s data_type_check(key, Hash) - data[key] && data[key].delete(field) + deleted = data[key] && data[key].delete(field) remove_key_for_empty_collection(key) + deleted ? 1 : 0 end def hkeys(key) data_type_check(key, Hash) return [] if data[key].nil? @@ -305,11 +285,11 @@ end def rpoplpush(key1, key2) data_type_check(key1, Array) rpop(key1).tap do |elem| - lpush(key2, elem) + lpush(key2, elem) unless elem.nil? end end def lpop(key) data_type_check(key, Array) @@ -588,13 +568,27 @@ def []=(key, value) set(key, value) end - def set(key, value) + def set(key, value, *array_options) + option_nx = array_options.delete('NX') + option_xx = array_options.delete('XX') + + return false if option_nx && option_xx + + return false if option_nx && exists(key) + return false if option_xx && !exists(key) + data[key] = value.to_s + options = Hash[array_options.each_slice(2).to_a] + ttl_in_seconds = options['EX'] if options['EX'] + ttl_in_seconds = options['PX'] / 1000.0 if options['PX'] + + expire(key, ttl_in_seconds) if ttl_in_seconds + 'OK' end def setbit(key, offset, bit) old_val = data[key] ? data[key].unpack('B*')[0].split('') : [] @@ -644,14 +638,10 @@ return false if keys.any?{|key| data.key?(key) } mset(*pairs) true end - def sort(key) - # TODO: Implement - end - def incr(key) data.merge!({ key => (data[key].to_i + 1).to_s || '1'}) data[key].to_i end @@ -688,29 +678,10 @@ end def slaveof(host, port) end - def exec - buffer.tap {|x| self.buffer = nil } - end - - def multi - self.buffer = [] - yield if block_given? - - 'OK' - end - - def watch(_) - 'OK' - end - - def unwatch - 'OK' - end - def scan(start_cursor, *args) match = '*' count = 10 if args.size.odd? @@ -894,10 +865,21 @@ range = data[key].select_by_score(min, max) range.each {|k,_| data[key].delete(k) } range.size end + def zremrangebyrank(key, start, stop) + data_type_check(key, ZSet) + return 0 unless data[key] + + sorted_elements = data[key].sort_by { |k, v| v } + start = sorted_elements.length if start > sorted_elements.length + elements_to_delete = sorted_elements[start..stop] + elements_to_delete.each { |elem, rank| data[key].delete(elem) } + elements_to_delete.size + end + def zinterstore(out, *args) data_type_check(out, ZSet) args_handler = SortedSetArgumentHandler.new(args) data[out] = SortedSetIntersectStore.new(args_handler, data).call data[out].size @@ -906,17 +888,9 @@ def zunionstore(out, *args) data_type_check(out, ZSet) args_handler = SortedSetArgumentHandler.new(args) data[out] = SortedSetUnionStore.new(args_handler, data).call data[out].size - end - - def zremrangebyrank(key, start, stop) - sorted_elements = data[key].sort_by { |k, v| v } - start = sorted_elements.length if start > sorted_elements.length - elements_to_delete = sorted_elements[start..stop] - elements_to_delete.each { |elem, rank| data[key].delete(elem) } - elements_to_delete.size end private def raise_argument_error(command, match_string = command) error_message = if %w(hmset mset_odd).include?(match_string.downcase)