module CouchRest
class Response < Hash
def initialize keys = {}
keys.each do |k,v|
self[k.to_s] = v
end
end
def []= key, value
super(key.to_s, value)
end
def [] key
super(key.to_s)
end
end
class Document < Response
attr_accessor :database
# alias for self['_id']
def id
self['_id']
end
# alias for self['_rev']
def rev
self['_rev']
end
# 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 _id and _rev fields based on
# CouchDB's response.
# If bulk is true (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 self, bulk
result['ok']
end
# Deletes the document from the database. Runs the :delete callbacks.
# Removes the _id and _rev fields, preparing the
# document to be saved to a new _id.
# If bulk is true (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, bulk)
if result['ok']
self['_rev'] = nil
self['_id'] = nil
end
result['ok']
end
# copies the document to a new id. If the destination id currently exists, a rev must be provided.
# dest can take one of two forms if overwriting: "id_to_overwrite?rev=revision" or the actual doc
# hash with a '_rev' key
def copy(dest)
raise ArgumentError, "doc.database required to copy" unless database
result = database.copy(self, dest)
result['ok']
end
# moves the document to a new id. If the destination id currently exists, a rev must be provided.
# dest can take one of two forms if overwriting: "id_to_overwrite?rev=revision" or the actual doc
# hash with a '_rev' key
def move(dest)
raise ArgumentError, "doc.database required to copy" unless database
result = database.move(self, dest)
result['ok']
end
end
end