lib/couchrest/mixins/design_doc.rb in jchris-couchrest-0.22 vs lib/couchrest/mixins/design_doc.rb in jchris-couchrest-0.23
- old
+ new
@@ -7,18 +7,23 @@
def self.included(base)
base.extend(ClassMethods)
end
module ClassMethods
+ attr_accessor :design_doc, :design_doc_slug_cache, :design_doc_fresh
+
+ def design_doc
+ @design_doc ||= Design.new(default_design_doc)
+ end
+
def design_doc_id
"_design/#{design_doc_slug}"
end
def design_doc_slug
return design_doc_slug_cache if (design_doc_slug_cache && design_doc_fresh)
funcs = []
- design_doc ||= Design.new(default_design_doc)
design_doc['views'].each do |name, view|
funcs << "#{name}/#{view['map']}#{view['reduce']}"
end
md5 = Digest::MD5.hexdigest(funcs.sort.join(''))
self.design_doc_slug_cache = "#{self.to_s}-#{md5}"
@@ -38,24 +43,45 @@
}
}
end
def refresh_design_doc
- did = design_doc_id
- saved = database.get(did) rescue nil
+ design_doc['_id'] = design_doc_id
+ design_doc.delete('_rev')
+ #design_doc.database = nil
+ self.design_doc_fresh = true
+ end
+
+ # Save the design doc onto the default database, and update the
+ # design_doc attribute
+ def save_design_doc
+ refresh_design_doc unless design_doc_fresh
+ self.design_doc = update_design_doc(design_doc)
+ end
+
+ # Save the design doc onto a target database in a thread-safe way,
+ # not modifying the model's design_doc
+ def save_design_doc_on(db)
+ update_design_doc(Design.new(design_doc), db)
+ end
+
+ private
+
+ # Writes out a design_doc to a given database, returning the
+ # updated design doc
+ def update_design_doc(design_doc, db = database)
+ saved = db.get(design_doc['_id']) rescue nil
if saved
design_doc['views'].each do |name, view|
saved['views'][name] = view
end
- database.save_doc(saved)
- self.design_doc = saved
+ db.save_doc(saved)
+ saved
else
- design_doc['_id'] = did
- design_doc.delete('_rev')
- design_doc.database = database
+ design_doc.database = db
design_doc.save
+ design_doc
end
- self.design_doc_fresh = true
end
end # module ClassMethods
end
\ No newline at end of file