Class: CouchClient::Connection

Inherits:
Object
  • Object
show all
Defined in:
lib/couch-client/connection.rb

Overview

Connection is the high-level interface used to interact with the CouchDB Server.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(args = {}) ⇒ Connection

Connection is constructed with a Hash or with a block specifying connection parameters. An error will be raised if a database is not specified.



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/couch-client/connection.rb', line 12

def initialize(args = {})
  handler = ConnectionHandler.new
  
  # Set ConnectionHandler settings via a block
  if block_given?
    yield(handler)
  end
  
  # Set remaining ConnectionHandler settings via a Hash
  args.each_pair do |key, value|
    handler.send("#{key}=", value)
  end
  
  # Ensure a database is provided
  unless handler.database
    raise DatabaseNotGiven.new("specify a database to connect to")
  end
  
  # `@hookup` is used as the HTTP interface and `@database` is a namespace for all
  # database specific commands such as creation, deletion, compaction and replication.
  @hookup = Hookup.new(handler)
  @database = Database.new(self)
end

Instance Attribute Details

#databaseObject (readonly)

Returns the value of attribute database.



8
9
10
# File 'lib/couch-client/connection.rb', line 8

def database
  @database
end

#hookupObject (readonly)

Returns the value of attribute hookup.



8
9
10
# File 'lib/couch-client/connection.rb', line 8

def hookup
  @hookup
end

Instance Method Details

#[](id, options = {}) ⇒ Object

Fetches documents from the CouchDB server. Although ‘[]` makes get requests and therefore could fetch design views and more, anything received that is not a valid document will raise an error. As such, fetching designs can only be done through the `design` method.



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/couch-client/connection.rb', line 39

def [](id, options = {})
  code, body = @hookup.get([id], options)

  case code
  # If something was found
  when 200
    # And that something is a document
    if body["_id"] && body["_rev"]
      # Make a new document object
      Document.new(code, body, self)
    else
      # Else raise an error as `[]` should only return document objects
      raise DocumentNotValid.new("the id '#{id}' does not correspond to a document")
    end
  # If nothing was found
  when 404
    case body["reason"]
    # Because the document was deleted
    when "deleted"
      # Tell the user it was deleted
      raise DocumentNotFound.new("the document with id '#{id}' has been deleted")
    else
      # Else tell the user it was never there to begin with
      raise DocumentNotFound.new("a document could not be found with id '#{id}'")
    end
  # If something else happened
  else
    # Raise an error
    raise Error.new("code: #{code}, error: #{body["error"]}, reason: #{body["reason"]}")
  end
end

#all_design_docs(options = {}) ⇒ Object

Returns a list of all _design documents.



83
84
85
# File 'lib/couch-client/connection.rb', line 83

def all_design_docs(options = {})
  all_docs({"startkey" => "_design/", "endkey" => "_design0"}.merge(options))
end

#all_docs(options = {}) ⇒ Object

Acts as the interface to CouchDB’s ‘_all_docs` map view.



77
78
79
80
# File 'lib/couch-client/connection.rb', line 77

def all_docs(options = {})
  # Create a new Collection with the response code, body and connection.
  Collection.new(*@hookup.get(["_all_docs"], options), self)
end

#build(body = {}) ⇒ Object

The interface used to construct new CouchDB documents. Once constructed, these documents can be saved, updated, validated and deleted.



89
90
91
# File 'lib/couch-client/connection.rb', line 89

def build(body = {})
  Document.new(nil, body, self)
end

#design(id) ⇒ Object

Constructs a new design factory that manages ‘views`, `shows`, `lists` and `fulltext` searches.



72
73
74
# File 'lib/couch-client/connection.rb', line 72

def design(id)
  Design.new(id, self)
end

#inspectObject



93
94
95
96
97
98
99
100
101
102
# File 'lib/couch-client/connection.rb', line 93

def inspect
  head = "#<#{self.class}: "
  body = []
  body << "username: #{@hookup.handler.username}" if @hookup.handler.username
  body << "password: #{@hookup.handler.password}" if @hookup.handler.password
  body << "uri: #{@hookup.handler.uri}"
  tail = ">"

  head + body.join(", ") + tail
end