Skip to content

Commit

Permalink
add library level rename/renamenx commands
Browse files Browse the repository at this point in the history
  • Loading branch information
salimane committed Nov 19, 2012
1 parent e5d5318 commit 02bdbb2
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 10 deletions.
44 changes: 44 additions & 0 deletions rediscluster/cluster_client.py
Expand Up @@ -380,3 +380,47 @@ def _rc_mget(self, keys, *args):
for key in args:
result.append(self.get(key))
return result

def _rc_rename(self, src, dst):
"""
Rename key ``src`` to ``dst``
"""
if src == dst:
return self.rename(src + "{" + src + "}", src)
if not self.exists(src):
return self.rename(src + "{" + src + "}", src)

self.delete(dst)
ktype = self.type(src)
kttl = self.ttl(src)

if ktype == b('none'):
return False

if ktype == b('string'):
self.set(dst, self.get(src))
elif ktype == b('hash'):
self.hmset(dst, self.hgetall(src))
elif ktype == b('list'):
for k in self.lrange(src, 0, -1):
self.rpush(dst, k)
elif ktype == b('set'):
for k in self.smembers(src):
self.sadd(dst, k)
elif ktype == b('zset'):
for k, v in self.zrange(src, 0, -1, withscores=True):
self.zadd(dst, v, k)

# Handle keys with an expire time set
kttl = -1 if kttl is None or kttl < 0 else int(kttl)
if kttl != -1:
dst.expire(dst, kttl)

return self.delete(src)

def _rc_renamenx(self, src, dst):
"Rename key ``src`` to ``dst`` if ``dst`` doesn't already exist"
if self.exists(dst):
return False

return self.rename(src, dst)
10 changes: 0 additions & 10 deletions tests/cluster_commands.py
Expand Up @@ -505,22 +505,12 @@ def test_randomkey(self):
self.assert_(self.client.randomkey() in (b('a'), b('b'), b('c')))

def test_rename(self):
# CLUSTER
try:
raise unittest.SkipTest()
except AttributeError:
return
self.client['a'] = '1'
self.assert_(self.client.rename('a', 'b'))
self.assertEquals(self.client.get('a'), None)
self.assertEquals(self.client['b'], b('1'))

def test_renamenx(self):
# CLUSTER
try:
raise unittest.SkipTest()
except AttributeError:
return
self.client['a'] = '1'
self.client['b'] = '2'
self.assert_(not self.client.renamenx('a', 'b'))
Expand Down

0 comments on commit 02bdbb2

Please sign in to comment.