lib/ohm.rb in ohm-1.3.0 vs lib/ohm.rb in ohm-1.3.1
- old
+ new
@@ -1145,11 +1145,11 @@
def load!
update_attributes(db.hgetall(key)) unless new?
return self
end
- # Read an attribute remotly from Redis. Useful if you want to get
+ # Read an attribute remotely from Redis. Useful if you want to get
# the most recent value of the attribute and not rely on locally
# cached value.
#
# Example:
#
@@ -1303,23 +1303,29 @@
_uniques = nil
uniques = nil
_indices = nil
indices = nil
+ existing_indices = nil
+ existing_uniques = nil
t.read do
_verify_uniques
+ existing_indices = _read_attributes(model.indices) if model.indices.any?
+ existing_uniques = _read_attributes(model.uniques) if model.uniques.any?
_uniques = db.hgetall(key[:_uniques])
_indices = db.smembers(key[:_indices])
uniques = _read_index_type(:uniques)
indices = _read_index_type(:indices)
end
t.write do
db.sadd(model.key[:all], id)
- _delete_uniques(_uniques)
+ _delete_existing_indices(existing_indices)
+ _delete_existing_uniques(existing_uniques)
_delete_indices(_indices)
+ _delete_uniques(_uniques)
_save
_save_indices(indices)
_save_uniques(uniques)
end
end
@@ -1335,25 +1341,28 @@
#
def delete
transaction do |t|
_uniques = nil
_indices = nil
+ existing = nil
t.watch(*_unique_keys)
t.watch(key)
t.watch(key[:_indices]) if model.indices.any?
t.watch(key[:_uniques]) if model.uniques.any?
t.read do
+ existing = _read_attributes(model.indices) if model.indices.any?
_uniques = db.hgetall(key[:_uniques])
_indices = db.smembers(key[:_indices])
end
t.write do
_delete_uniques(_uniques)
_delete_indices(_indices)
+ _delete_existing_indices(existing)
model.collections.each { |e| db.del(key[e]) }
db.srem(model.key[:all], id)
db.del(key[:counters])
db.del(key)
end
@@ -1496,37 +1505,62 @@
end
end
end
def _save_uniques(uniques)
+ attrs = model.attributes
+
uniques.each do |att, val|
unique = model.key[:uniques][att]
db.hset(unique, val, id)
- db.hset(key[:_uniques], unique, val)
+ db.hset(key[:_uniques], unique, val) unless attrs.include?(att)
end
end
def _delete_uniques(uniques)
uniques.each do |unique, val|
db.hdel(unique, val)
db.hdel(key[:_uniques], unique)
end
end
+ def _delete_existing_indices(existing)
+ return unless existing
+
+ existing = existing.map { |key, value| model.to_indices(key, value) }
+ existing.flatten!(1)
+
+ _delete_indices(existing)
+ end
+
+ def _delete_existing_uniques(existing)
+ return unless existing
+
+ _delete_uniques(existing.map { |key, value|
+ [model.key[:uniques][key], value]
+ })
+ end
+
def _delete_indices(indices)
indices.each do |index|
db.srem(index, id)
db.srem(key[:_indices], index)
end
end
def _save_indices(indices)
+ attrs = model.attributes
+
indices.each do |att, val|
model.to_indices(att, val).each do |index|
db.sadd(index, id)
- db.sadd(key[:_indices], index)
+ db.sadd(key[:_indices], index) unless attrs.include?(att)
end
end
+ end
+
+ def _read_attributes(attrs)
+ Hash[attrs.zip(db.hmget(key, *attrs))]
end
end
end