Class: Chef::CouchDB

Inherits:
Object
  • Object
show all
Includes:
Mixin::ParamsValidate
Defined in:
lib/chef/couchdb.rb

Instance Method Summary collapse

Methods included from Mixin::ParamsValidate

#set_or_return, #validate

Constructor Details

#initialize(url = nil) ⇒ CouchDB

Returns a new instance of CouchDB.



29
30
31
32
# File 'lib/chef/couchdb.rb', line 29

def initialize(url=nil)
  url ||= Chef::Config[:couchdb_url]
  @rest = Chef::REST.new(url)
end

Instance Method Details

#create_dbObject



34
35
36
37
38
39
40
# File 'lib/chef/couchdb.rb', line 34

def create_db
  @database_list = @rest.get_rest("_all_dbs")
  unless @database_list.detect { |db| db == Chef::Config[:couchdb_database] }
    response = @rest.put_rest(Chef::Config[:couchdb_database], Hash.new)
  end
  Chef::Config[:couchdb_database]
end

#create_design_document(name, data) ⇒ Object



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/chef/couchdb.rb', line 42

def create_design_document(name, data)
  create_db
  to_update = true
  begin
    old_doc = @rest.get_rest("#{Chef::Config[:couchdb_database]}/_design%2F#{name}")
    if data["version"] != old_doc["version"]
      data["_rev"] = old_doc["_rev"]
      Chef::Log.debug("Updating #{name} views")
    else
      to_update = false
    end
  rescue
    Chef::Log.debug("Creating #{name} views for the first time")
  end
  if to_update
    @rest.put_rest("#{Chef::Config[:couchdb_database]}/_design%2F#{name}", data)
  end
  true
end

#delete(obj_type, name, rev = nil) ⇒ Object



90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/chef/couchdb.rb', line 90

def delete(obj_type, name, rev=nil)
  validate(
    {
      :obj_type => obj_type,
      :name => name,
    },
    {
      :obj_type => { :kind_of => String },
      :name => { :kind_of => String },
    }
  )
  unless rev
    last_obj = @rest.get_rest("#{Chef::Config[:couchdb_database]}/#{obj_type}_#{safe_name(name)}")
    if last_obj.respond_to?(:couchdb_rev)
      rev = last_obj.couchdb_rev
    else
      rev = last_obj['_rev']
    end
  end
  @rest.delete_rest("#{Chef::Config[:couchdb_database]}/#{obj_type}_#{safe_name(name)}?rev=#{rev}")
end

#get_view(design, view, options = {}) ⇒ Object



147
148
149
150
151
152
153
# File 'lib/chef/couchdb.rb', line 147

def get_view(design, view, options={})
  view_string = view_uri(design, view)
  view_string << "?" if options.length != 0
  first = true;
  options.each { |k,v| view_string << "#{first ? '' : '&'}#{k}=#{URI.escape(v.to_json)}"; first = false }
  @rest.get_rest(view_string)
end

#has_key?(obj_type, name) ⇒ Boolean

Returns:

  • (Boolean)


128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
# File 'lib/chef/couchdb.rb', line 128

def has_key?(obj_type, name)
  validate(
    {
      :obj_type => obj_type,
      :name => name,
    },
    {
      :obj_type => { :kind_of => String },
      :name => { :kind_of => String },
    }
  )
  begin
    @rest.get_rest("#{Chef::Config[:couchdb_database]}/#{obj_type}_#{safe_name(name)}")
    true
  rescue
    false
  end
end

#list(view, inflate = false) ⇒ Object



112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# File 'lib/chef/couchdb.rb', line 112

def list(view, inflate=false)
  validate(
    { 
      :view => view,
    },
    {
      :view => { :kind_of => String }
    }
  )
  if inflate
    @rest.get_rest(view_uri(view, "all"))
  else
    @rest.get_rest(view_uri(view, "all_id"))
  end
end

#load(obj_type, name) ⇒ Object



76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/chef/couchdb.rb', line 76

def load(obj_type, name)
  validate(
    {
      :obj_type => obj_type,
      :name => name,
    },
    {
      :obj_type => { :kind_of => String },
      :name => { :kind_of => String },
    }
  )
  @rest.get_rest("#{Chef::Config[:couchdb_database]}/#{obj_type}_#{safe_name(name)}")
end

#store(obj_type, name, object) ⇒ Object



62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/chef/couchdb.rb', line 62

def store(obj_type, name, object)
  validate(
    {
      :obj_type => obj_type,
      :name => name,
      :object => object,
    },
    {
      :object => { :respond_to => :to_json },
    }
  )
  @rest.put_rest("#{Chef::Config[:couchdb_database]}/#{obj_type}_#{safe_name(name)}", object)
end

#view_uri(design, view) ⇒ Object



155
156
157
158
159
160
161
162
163
164
165
166
167
# File 'lib/chef/couchdb.rb', line 155

def view_uri(design, view)
  Chef::Config[:couchdb_version] ||= @rest.run_request(:GET,
                                                       URI.parse(@rest.url + "/"),
                                                       false,
                                                       10,
                                                       false)["version"].gsub(/-.+/,"").to_f
  case Chef::Config[:couchdb_version]
  when 0.8
    "#{Chef::Config[:couchdb_database]}/_view/#{design}/#{view}"
  else
    "#{Chef::Config[:couchdb_database]}/_design/#{design}/_view/#{view}"
  end
end