Add bulk save deferal option to db.delete / doc.destroy, just like on save.
This commit is contained in:
parent
245f525902
commit
36945d5a13
|
@ -165,9 +165,18 @@ module CouchRest
|
||||||
|
|
||||||
# DELETE the document from CouchDB that has the given <tt>_id</tt> and
|
# DELETE the document from CouchDB that has the given <tt>_id</tt> and
|
||||||
# <tt>_rev</tt>.
|
# <tt>_rev</tt>.
|
||||||
def delete doc
|
#
|
||||||
|
# If <tt>bulk</tt> is true (false by default) the deletion is recorded for bulk-saving (bulk-deletion :) later.
|
||||||
|
# Bulk saving happens automatically when #bulk_save_cache limit is exceded, or on the next non bulk save.
|
||||||
|
def delete (doc, bulk = false)
|
||||||
raise ArgumentError, "_id and _rev required for deleting" unless doc['_id'] && doc['_rev']
|
raise ArgumentError, "_id and _rev required for deleting" unless doc['_id'] && doc['_rev']
|
||||||
|
|
||||||
|
if bulk
|
||||||
|
@bulk_save_cache << { '_id' => doc['_id'], '_rev' => doc['_rev'], '_deleted' => true }
|
||||||
|
return bulk_save if @bulk_save_cache.length >= @bulk_save_cache_limit
|
||||||
|
return { "ok" => true } # Mimic the non-deferred version
|
||||||
|
end
|
||||||
|
|
||||||
slug = CGI.escape(doc['_id'])
|
slug = CGI.escape(doc['_id'])
|
||||||
CouchRest.delete "#{@root}/#{slug}?rev=#{doc['_rev']}"
|
CouchRest.delete "#{@root}/#{slug}?rev=#{doc['_rev']}"
|
||||||
end
|
end
|
||||||
|
|
|
@ -45,9 +45,11 @@ module CouchRest
|
||||||
# Deletes the document from the database. Runs the :delete callbacks.
|
# Deletes the document from the database. Runs the :delete callbacks.
|
||||||
# Removes the <tt>_id</tt> and <tt>_rev</tt> fields, preparing the
|
# Removes the <tt>_id</tt> and <tt>_rev</tt> fields, preparing the
|
||||||
# document to be saved to a new <tt>_id</tt>.
|
# document to be saved to a new <tt>_id</tt>.
|
||||||
def destroy
|
# If <tt>bulk</tt> is <tt>true</tt> (defaults to false) the document won't
|
||||||
|
# actually be deleted from the db until bulk save.
|
||||||
|
def destroy(bulk = false)
|
||||||
raise ArgumentError, "doc.database required to destroy" unless database
|
raise ArgumentError, "doc.database required to destroy" unless database
|
||||||
result = database.delete self
|
result = database.delete(self, bulk)
|
||||||
if result['ok']
|
if result['ok']
|
||||||
self['_rev'] = nil
|
self['_rev'] = nil
|
||||||
self['_id'] = nil
|
self['_id'] = nil
|
||||||
|
|
|
@ -472,6 +472,14 @@ describe CouchRest::Database do
|
||||||
it "should fail without an _id" do
|
it "should fail without an _id" do
|
||||||
lambda{@db.delete({"not"=>"a real doc"})}.should raise_error(ArgumentError)
|
lambda{@db.delete({"not"=>"a real doc"})}.should raise_error(ArgumentError)
|
||||||
end
|
end
|
||||||
|
it "should defer actual deletion when using bulk save" do
|
||||||
|
doc = @db.get(@docid)
|
||||||
|
@db.delete doc, true
|
||||||
|
lambda{@db.get @docid}.should_not raise_error
|
||||||
|
@db.bulk_save
|
||||||
|
lambda{@db.get @docid}.should raise_error
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "COPY existing document" do
|
describe "COPY existing document" do
|
||||||
|
|
|
@ -109,3 +109,22 @@ describe "destroying a document from a db" do
|
||||||
lambda{@doc.destroy}.should raise_error(ArgumentError)
|
lambda{@doc.destroy}.should raise_error(ArgumentError)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
describe "destroying a document from a db using bulk save" do
|
||||||
|
before(:all) do
|
||||||
|
@db = reset_test_db!
|
||||||
|
@resp = @db.save({
|
||||||
|
"key" => "value"
|
||||||
|
})
|
||||||
|
@doc = @db.get @resp['id']
|
||||||
|
end
|
||||||
|
it "should defer actual deletion" do
|
||||||
|
@doc.destroy(true)
|
||||||
|
@doc['_id'].should == nil
|
||||||
|
@doc['_rev'].should == nil
|
||||||
|
lambda{@db.get @resp['id']}.should_not raise_error
|
||||||
|
@db.bulk_save
|
||||||
|
lambda{@db.get @resp['id']}.should raise_error
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
Loading…
Reference in a new issue