diff --git a/lib/couchrest/core/database.rb b/lib/couchrest/core/database.rb index e2ffcd0..82fba7d 100644 --- a/lib/couchrest/core/database.rb +++ b/lib/couchrest/core/database.rb @@ -80,12 +80,12 @@ module CouchRest def get(id, params = {}) slug = escape_docid(id) url = CouchRest.paramify_url("#{@uri}/#{slug}", params) - puts url - hash = CouchRest.get(url) - doc = if /^_design/ =~ hash["_id"] - Design.new(hash) + result = CouchRest.get(url) + return result unless result.is_a?(Hash) + doc = if /^_design/ =~ result["_id"] + Design.new(result) else - Document.new(hash) + Document.new(result) end doc.database = self doc diff --git a/lib/couchrest/helper/upgrade.rb b/lib/couchrest/helper/upgrade.rb index 436e514..3f8126f 100644 --- a/lib/couchrest/helper/upgrade.rb +++ b/lib/couchrest/helper/upgrade.rb @@ -11,7 +11,7 @@ module CouchRest puts "#{dbname} - #{olddb.info['doc_count']} docs" streamer = CouchRest::Streamer.new(olddb) streamer.view("_all_docs_by_seq") do |row| - load_doc_for_row(row) if row + load_row_docs(row) if row maybe_flush_bulks end flush_bulks! @@ -20,53 +20,32 @@ module CouchRest private def maybe_flush_bulks - flush_bulks! if (@bulk_docs.length > 1000) + flush_bulks! if (@bulk_docs.length > 99) end def flush_bulks! url = CouchRest.paramify_url "#{@newdb.uri}/_bulk_docs", {:all_or_nothing => true} - puts "posting bulk to #{url}" - puts @bulk_docs.collect{|b|b.id} + puts "posting #{@bulk_docs.length} bulk docs to #{url}" begin CouchRest.post url, {:docs => @bulk_docs} + @bulk_docs = [] rescue Exception => e puts e.response + raise e end end - def load_doc_for_row(row) - if row["value"]["conflicts"] - puts "doc #{row["id"]} has conflicts #{row.inspect}" - # load the doc, and it's conflicts - load_conflicts_doc(row) - elsif row["value"]["deleted_conflicts"] - puts "doc #{row["id"]} has deleted conflicts" - elsif row["value"]["deleted"] - # puts "doc #{row["id"]} is deleted" - @bulk_docs << {"_id" => row["id"], "_deleted" => true} - else - load_normal_doc(row) - end - end - - def load_conflicts_doc(row) + def load_row_docs(row) results = @olddb.get(row["id"], {:open_revs => "all", :attachments => true}) results.select{|r|r["ok"]}.each do |r| doc = r["ok"] + if /^_/.match(doc["_id"]) && !/^_design/.match(doc["_id"]) + puts "invalid docid #{doc["_id"]} -- trimming" + doc["_id"] = doc["_id"].sub('_','') + end doc.delete('_rev') @bulk_docs << doc end end - - def load_normal_doc(row) - # puts row["id"] - doc = @olddb.get(row["id"], :attachments => true) - if /^_/.match(doc.id) && !/^_design/.match(doc.id) - puts "trimming invalid docid #{doc.id}" - doc["_id"] = doc.id.sub('_','') - end - doc.delete("_rev"); - @bulk_docs << doc - end end end