2009-02-06 02:06:12 +01:00
|
|
|
require 'delegate'
|
|
|
|
|
|
|
|
module CouchRest
|
2008-11-04 07:52:50 +01:00
|
|
|
class Document < Response
|
2009-02-03 01:10:07 +01:00
|
|
|
include CouchRest::Mixins::Attachments
|
2008-11-04 07:52:50 +01:00
|
|
|
|
2008-11-09 01:28:58 +01:00
|
|
|
attr_accessor :database
|
2009-01-29 07:55:42 +01:00
|
|
|
@@database = nil
|
|
|
|
|
|
|
|
# override the CouchRest::Model-wide default_database
|
|
|
|
# This is not a thread safe operation, do not change the model
|
|
|
|
# database at runtime.
|
|
|
|
def self.use_database(db)
|
|
|
|
@@database = db
|
2008-11-09 01:28:58 +01:00
|
|
|
end
|
2009-01-29 07:55:42 +01:00
|
|
|
|
|
|
|
def self.database
|
|
|
|
@@database
|
2008-11-09 01:28:58 +01:00
|
|
|
end
|
2009-01-16 10:07:37 +01:00
|
|
|
|
2009-02-03 00:24:31 +01:00
|
|
|
def id
|
|
|
|
self['_id']
|
|
|
|
end
|
|
|
|
|
|
|
|
def rev
|
|
|
|
self['_rev']
|
|
|
|
end
|
|
|
|
|
2009-02-03 01:10:07 +01:00
|
|
|
# returns true if the document has never been saved
|
|
|
|
def new_document?
|
|
|
|
!rev
|
|
|
|
end
|
|
|
|
|
|
|
|
# Saves the document to the db using create or update. Also runs the :save
|
|
|
|
# callbacks. Sets the <tt>_id</tt> and <tt>_rev</tt> fields based on
|
|
|
|
# CouchDB's response.
|
|
|
|
# If <tt>bulk</tt> is <tt>true</tt> (defaults to false) the document is cached for bulk save.
|
|
|
|
def save(bulk = false)
|
|
|
|
raise ArgumentError, "doc.database required for saving" unless database
|
|
|
|
result = database.save_doc self, bulk
|
|
|
|
result['ok']
|
|
|
|
end
|
|
|
|
|
|
|
|
# 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>.
|
|
|
|
# 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_doc(self, bulk)
|
|
|
|
if result['ok']
|
|
|
|
self['_rev'] = nil
|
|
|
|
self['_id'] = nil
|
|
|
|
end
|
|
|
|
result['ok']
|
|
|
|
end
|
|
|
|
|
2009-02-02 08:34:30 +01:00
|
|
|
# copies the document to a new id. If the destination id currently exists, a rev must be provided.
|
|
|
|
# <tt>dest</tt> can take one of two forms if overwriting: "id_to_overwrite?rev=revision" or the actual doc
|
|
|
|
# hash with a '_rev' key
|
2009-01-16 10:07:37 +01:00
|
|
|
def copy(dest)
|
|
|
|
raise ArgumentError, "doc.database required to copy" unless database
|
2009-01-29 02:36:36 +01:00
|
|
|
result = database.copy_doc(self, dest)
|
2009-01-16 10:07:37 +01:00
|
|
|
result['ok']
|
|
|
|
end
|
|
|
|
|
2009-02-02 08:34:30 +01:00
|
|
|
# moves the document to a new id. If the destination id currently exists, a rev must be provided.
|
|
|
|
# <tt>dest</tt> can take one of two forms if overwriting: "id_to_overwrite?rev=revision" or the actual doc
|
|
|
|
# hash with a '_rev' key
|
2009-01-16 10:07:37 +01:00
|
|
|
def move(dest)
|
|
|
|
raise ArgumentError, "doc.database required to copy" unless database
|
2009-01-29 02:36:36 +01:00
|
|
|
result = database.move_doc(self, dest)
|
2009-01-16 10:07:37 +01:00
|
|
|
result['ok']
|
|
|
|
end
|
2009-02-02 09:35:37 +01:00
|
|
|
|
2009-01-29 07:55:42 +01:00
|
|
|
# Returns the CouchDB uri for the document
|
|
|
|
def uri(append_rev = false)
|
|
|
|
return nil if new_document?
|
|
|
|
couch_uri = "http://#{database.uri}/#{CGI.escape(id)}"
|
|
|
|
if append_rev == true
|
|
|
|
couch_uri << "?rev=#{rev}"
|
|
|
|
elsif append_rev.kind_of?(Integer)
|
|
|
|
couch_uri << "?rev=#{append_rev}"
|
|
|
|
end
|
|
|
|
couch_uri
|
|
|
|
end
|
|
|
|
|
|
|
|
# Returns the document's database
|
|
|
|
def database
|
|
|
|
@database || self.class.database
|
|
|
|
end
|
|
|
|
|
2008-11-04 07:52:50 +01:00
|
|
|
end
|
|
|
|
|
2008-12-15 17:27:53 +01:00
|
|
|
end
|