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
|
||||
# <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']
|
||||
|
||||
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'])
|
||||
CouchRest.delete "#{@root}/#{slug}?rev=#{doc['_rev']}"
|
||||
end
|
||||
|
|
|
@ -45,9 +45,11 @@ module CouchRest
|
|||
# Deletes the document from the database. Runs the :delete callbacks.
|
||||
# Removes the <tt>_id</tt> and <tt>_rev</tt> fields, preparing the
|
||||
# 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
|
||||
result = database.delete self
|
||||
result = database.delete(self, bulk)
|
||||
if result['ok']
|
||||
self['_rev'] = nil
|
||||
self['_id'] = nil
|
||||
|
|
|
@ -472,6 +472,14 @@ describe CouchRest::Database do
|
|||
it "should fail without an _id" do
|
||||
lambda{@db.delete({"not"=>"a real doc"})}.should raise_error(ArgumentError)
|
||||
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
|
||||
|
||||
describe "COPY existing document" do
|
||||
|
|
|
@ -109,3 +109,22 @@ describe "destroying a document from a db" do
|
|||
lambda{@doc.destroy}.should raise_error(ArgumentError)
|
||||
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