def wrapper(*args, **kwargs): with get_redis_conn().pipeline() as pipe: get_thread_local().transaction_pipeline = pipe get_thread_local().in_transaction = True for i in xrange(MAX_TRANSACTION_RETRIES): get_thread_local().queued_writes = collections.defaultdict(list) try: ret_value = f(*args, **kwargs) pipe.multi() for queued_write_list in get_thread_local().queued_writes.values(): for queued_write in queued_write_list: execute_queued_write(pipe, queued_write) pipe.execute() get_thread_local().in_transaction = False return ret_value except WatchError: continue except Exception: get_thread_local().in_transaction = False raise get_thread_local().in_transaction = False raise MaxTransactionRetriesError("Maximum retries done on transaction, bailing out.")
def load(base_model): model_dict = get_redis_conn().hgetall(base_model.key) if not model_dict: raise NoSuchKeyError("Key {} does not exist in DB.".format(base_model.key)) new_dict = {} for k, v in base_model.__dict__.iteritems(): new_dict[k] = v if isinstance(v, KeyValueField): if v.key_short in model_dict: value = json.loads(model_dict[v.key_short]) else: value = new_dict[k].default_value new_dict[k].value = value elif isinstance(v, RemoteKeyValueField): if v.key_short in model_dict: remote_key = json.loads(model_dict[v.key_short]) else: remote_key = new_dict[k].default_remote_key new_dict[k].remote_key = remote_key base_model.__dict__ = new_dict for migration in base_model.get_migrations()[base_model.version:]: migration(base_model) base_model.version = len(base_model.get_migrations())
def ltrim(self, start, end): return get_redis_conn().ltrim(self.key, start, end)
def rpop(self): return get_redis_conn().rpop(self.key)
def scard(self): return get_redis_conn().scard(self.key)
def save(base_model): value_dict = _get_value_dict(base_model, True, True) value_dict['_v'] = len(base_model.get_migrations()) get_redis_conn().hmset(base_model.key, value_dict)
def __len__(self): return get_redis_conn().llen(self.key)
def hlen(self): return get_redis_conn().hlen(self.key)
def zcard(self): return get_redis_conn().zcard(self.key)
def zadd(self, *args, **kwargs): get_redis_conn().zadd(self.key, *args, **kwargs)
def sdiff(self, other_set_key): return get_redis_conn().sdiff(self.key, other_set_key)
def sinter(self, other_set_key): return get_redis_conn().sinter(self.key, other_set_key)
def sunion(self, other_set_key): return get_redis_conn().sunion(self.key, other_set_key)
def srem(self, elem): return get_redis_conn().srem(self.key, elem)
def sadd(self, elem): return get_redis_conn().sadd(self.key, elem)
def hgetall(self): return get_redis_conn().hgetall(self.key)
def hset(self, key, value): return get_redis_conn().hset(self.key, key, value)
def zremrangebyscore(self, min, max): return get_redis_conn().zremrangebyscore(self.key, min, max)
def hdel(self, *args): return get_redis_conn().hdel(self.key, *args)
def lindex(self, idx): return get_redis_conn().lindex(self.key, idx)
def sismember(self, elem): return get_redis_conn().sismember(self.key, elem)
def rpush(self, *args): return get_redis_conn().rpush(self.key, *args)
def lrange(self, start, end): return get_redis_conn().lrange(self.key, start, end)
def lpop(self): return get_redis_conn().lpop(self.key)
def delete(base_model): return get_redis_conn().delete(base_model.key)
def smembers(self): return get_redis_conn().smembers(self.key)