Add bulk save deferal option to db.delete / doc.destroy, just like on save.

This commit is contained in:
Antony Blakey 2009-01-09 20:29:08 +10:30
parent 245f525902
commit 36945d5a13
4 changed files with 41 additions and 3 deletions

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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