def put(doc, opts={})
opts = opts.inject({}) { |h, (k, v)| h[k.to_s] = v; h }
doc = Rufus::Json.dup(doc) unless opts['update_rev']
type, key = doc['type'], doc['_id']
raise(
ArgumentError.new("missing values for keys 'type' and/or '_id'")
) if type.nil? || key.nil?
rev = (doc['_rev'] ||= -1)
raise(
ArgumentError.new("values for '_rev' must be positive integers")
) if rev.class != Fixnum && rev.class != Bignum
r =
lock(rev == -1 ? :create : :write, type, key) do |file|
cur = do_get(file)
return cur if cur && cur['_rev'] != doc['_rev']
return true if cur.nil? && doc['_rev'] != -1
doc['_rev'] += 1
File.open(file.path, 'wb') { |io| io.write(Rufus::Json.encode(doc)) }
end
r == false ? true : nil
end