Sha256: 63eef6ccac6bd97f8169c60df2a8894a95596ed978ae32193222d57e1b0d27bd

Contents?: true

Size: 1.81 KB

Versions: 11

Compression:

Stored size: 1.81 KB

Contents

require 'mock_redis/undef_redis_methods'

class MockRedis
  class MultiDbWrapper
    include UndefRedisMethods

    def initialize(db)
      @db_index = 0

      @prototype_db = db.clone

      @databases = Hash.new {|h,k| h[k] = @prototype_db.clone}
      @databases[@db_index] = db
    end

    def respond_to?(method, include_private=false)
      super || current_db.respond_to?(method, include_private)
    end

    def method_missing(method, *args)
      current_db.send(method, *args)
    end

    def initialize_copy(source)
      super
      @databases = @databases.clone
      @databases.keys.each do |k|
        @databases[k] = @databases[k].clone
      end
    end

    # Redis commands
    def flushall
      @databases.values.each(&:flushdb)
      'OK'
    end

    def move(key, db_index)
      src = current_db
      dest = db(db_index)

      if !src.exists(key) || dest.exists(key)
        false
      else
        case current_db.type(key)
        when 'hash'
          dest.hmset(key, *(src.hgetall(key).map{|k,v| [k,v]}.flatten))
        when 'list'
          while value = src.rpop(key)
            dest.lpush(key, value)
          end
        when 'set'
          while value = src.spop(key)
            dest.sadd(key, value)
          end
        when 'string'
          dest.set(key, src.get(key))
        when 'zset'
          src.zrange(key, 0, -1, :with_scores => true).each_slice(2) do |(m,s)|
            dest.zadd(key, s, m)
          end
        else
          raise ArgumentError,
          "Can't move a key of type #{current_db.type(key).inspect}"
        end

        src.del(key)
        true
      end
    end

    def select(db_index)
      @db_index = db_index.to_i
      'OK'
    end

    private
    def current_db
      @databases[@db_index]
    end

    def db(index)
      @databases[index]
    end
  end
end

Version data entries

11 entries across 11 versions & 3 rubygems

Version Path
redis_migrator-0.0.1 spec/mock_redis/lib/mock_redis/multi_db_wrapper.rb
mock_redis-0.4.1 lib/mock_redis/multi_db_wrapper.rb
mock_redis-0.4.0 lib/mock_redis/multi_db_wrapper.rb
mock_redis-0.3.0 lib/mock_redis/multi_db_wrapper.rb
ryansch-mock_redis-0.3.0 lib/mock_redis/multi_db_wrapper.rb
ryansch-mock_redis-0.2.0.2 lib/mock_redis/multi_db_wrapper.rb
ryansch-mock_redis-0.2.0.1 lib/mock_redis/multi_db_wrapper.rb
mock_redis-0.2.0 lib/mock_redis/multi_db_wrapper.rb
mock_redis-0.1.2 lib/mock_redis/multi_db_wrapper.rb
mock_redis-0.1.1 lib/mock_redis/multi_db_wrapper.rb
mock_redis-0.1.0 lib/mock_redis/multi_db_wrapper.rb