Started the refactoring work on couchrest.
* A server can have multiple defined available databases set to be used by documents (think DM repos) * A server can have a default database so documents can easily share the same db connection * Let a document class have a default database to use * Give access to a document uri * extracted some of the document features to a mixin
This commit is contained in:
parent
427122c98a
commit
d9fe6ba374
7 changed files with 392 additions and 240 deletions
|
@ -14,47 +14,20 @@ module CouchRest
|
|||
end
|
||||
|
||||
class Document < Response
|
||||
include CouchRest::Mixins::Views
|
||||
|
||||
attr_accessor :database
|
||||
|
||||
# alias for self['_id']
|
||||
def id
|
||||
self['_id']
|
||||
@@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
|
||||
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 <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']
|
||||
|
||||
def self.database
|
||||
@@database
|
||||
end
|
||||
|
||||
# copies the document to a new id. If the destination id currently exists, a rev must be provided.
|
||||
|
@ -75,6 +48,23 @@ module CouchRest
|
|||
result['ok']
|
||||
end
|
||||
|
||||
# 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
|
||||
|
||||
# saves an attachment directly to couchdb
|
||||
def put_attachment(name, file, options={})
|
||||
raise ArgumentError, "doc.database required to put_attachment" unless database
|
||||
|
@ -97,6 +87,5 @@ module CouchRest
|
|||
result['ok']
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
|
|
|
@ -1,25 +1,62 @@
|
|||
module CouchRest
|
||||
class Server
|
||||
attr_accessor :uri, :uuid_batch_count
|
||||
def initialize server = 'http://127.0.0.1:5984', uuid_batch_count = 1000
|
||||
attr_accessor :uri, :uuid_batch_count, :available_databases
|
||||
def initialize(server = 'http://127.0.0.1:5984', uuid_batch_count = 1000)
|
||||
@uri = server
|
||||
@uuid_batch_count = uuid_batch_count
|
||||
end
|
||||
|
||||
# List all databases on the server
|
||||
# Lists all "available" databases.
|
||||
# An available database, is a database that was specified
|
||||
# as avaiable by your code.
|
||||
# It allows to define common databases to use and reuse in your code
|
||||
def available_databases
|
||||
@available_databases ||= {}
|
||||
end
|
||||
|
||||
# Adds a new available database and create it unless it already exists
|
||||
#
|
||||
# Example:
|
||||
#
|
||||
# @couch = CouchRest::Server.new
|
||||
# @couch.define_available_database(:default, "tech-blog")
|
||||
#
|
||||
def define_available_database(reference, db_name, create_unless_exists = true)
|
||||
available_databases[reference.to_sym] = create_unless_exists ? database!(db_name) : database(db_name)
|
||||
end
|
||||
|
||||
# Checks that a database is set as available
|
||||
#
|
||||
# Example:
|
||||
#
|
||||
# @couch.available_database?(:default)
|
||||
#
|
||||
def available_database?(ref_or_name)
|
||||
ref_or_name.is_a?(Symbol) ? available_databases.keys.include?(ref_or_name) : available_databases.values.map{|db| db.name}.include?(ref_or_name)
|
||||
end
|
||||
|
||||
def default_database=(name, create_unless_exists = true)
|
||||
define_available_database(:default, name, create_unless_exists = true)
|
||||
end
|
||||
|
||||
def default_database
|
||||
available_databases[:default]
|
||||
end
|
||||
|
||||
# Lists all databases on the server
|
||||
def databases
|
||||
CouchRest.get "#{@uri}/_all_dbs"
|
||||
end
|
||||
|
||||
# Returns a CouchRest::Database for the given name
|
||||
def database name
|
||||
def database(name)
|
||||
CouchRest::Database.new(self, name)
|
||||
end
|
||||
|
||||
# Creates the database if it doesn't exist
|
||||
def database! name
|
||||
def database!(name)
|
||||
create_db(name) rescue nil
|
||||
database name
|
||||
database(name)
|
||||
end
|
||||
|
||||
# GET the welcome message
|
||||
|
@ -28,9 +65,9 @@ module CouchRest
|
|||
end
|
||||
|
||||
# Create a database
|
||||
def create_db name
|
||||
def create_db(name)
|
||||
CouchRest.put "#{@uri}/#{name}"
|
||||
database name
|
||||
database(name)
|
||||
end
|
||||
|
||||
# Restart the CouchDB instance
|
||||
|
@ -39,7 +76,7 @@ module CouchRest
|
|||
end
|
||||
|
||||
# Retrive an unused UUID from CouchDB. Server instances manage caching a list of unused UUIDs.
|
||||
def next_uuid count = @uuid_batch_count
|
||||
def next_uuid(count = @uuid_batch_count)
|
||||
@uuids ||= []
|
||||
if @uuids.empty?
|
||||
@uuids = CouchRest.post("#{@uri}/_uuids?count=#{count}")["uuids"]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue