lib/padrino-gen/padrino-tasks/mongoid.rb in padrino-gen-0.10.7 vs lib/padrino-gen/padrino-tasks/mongoid.rb in padrino-gen-0.11.0

- old
+ new

@@ -1,11 +1,69 @@ -if defined?(Mongoid) +if PadrinoTasks.load?(:mongoid, defined?(Mongoid)) + require 'mongoid' # eagerly load mongoid for version check + namespace :mi do + if Mongoid::VERSION =~ /^[012]\./ + # Mongoid 2 API + def mongoid_collections + Mongoid.master.collections + end + + def mongoid_collection(name) + Mongoid.master.collection(name) + end + + def mongoid_new_collection(collection, name) + collection.db.collection(name) + end + + def enum_mongoid_documents(collection) + collection.find({}, :timeout => false, :sort => "_id") do |cursor| + cursor.each do |doc| + yield doc + end + end + end + + def rename_mongoid_collection(collection, new_name) + collection.rename(new_name) + end + else + # Mongoid 3+ API + def mongoid_collections + Mongoid.default_session.collections + end + + def mongoid_collection(name) + Mongoid.default_session[name] + end + + def mongoid_new_collection(collection, name) + Mongoid.default_session[name] + end + + def enum_mongoid_documents(collection) + collection.find.sort(:_id => 1).each do |doc| + yield doc + end + end + + def rename_mongoid_collection(collection, new_name) + db_name = collection.database.name + collection.database.session.with(:database => :admin) do |admin| + admin.command( + :renameCollection => "#{db_name}.#{collection.name}", + :to => "#{db_name}.#{new_name}", + :dropTarget => true) + end + end + end + desc 'Drops all the collections for the database for the current Padrino.env' task :drop => :environment do - Mongoid.master.collections.select {|c| c.name !~ /system/ }.each(&:drop) + mongoid_collections.select {|c| c.name !~ /system/ }.each(&:drop) end # Helper to retrieve a list of models. def get_mongoid_models documents = [] @@ -31,11 +89,11 @@ get_mongoid_models.each { |model| model.create_indexes } end def convert_ids(obj) if obj.is_a?(String) && obj =~ /^[a-f0-9]{24}$/ - BSON::ObjectId(obj) + defined?(Moped) ? Moped::BSON::ObjectId.from_string(obj) : BSON::ObjectId(obj) elsif obj.is_a?(Array) obj.map do |v| convert_ids(v) end elsif obj.is_a?(Hash) @@ -55,48 +113,46 @@ task :objectid_convert => :environment do collection_names.each do |collection_name| puts "Converting #{collection_name} to use ObjectIDs" # get old collection - collection = Mongoid.master.collection(collection_name) + collection = mongoid_collection(collection_name) # get new collection (a clean one) - collection.db["#{collection_name}_new"].drop - new_collection = collection.db["#{collection_name}_new"] + mongoid_collection("#{collection_name}_new").drop + new_collection = mongoid_new_collection(collection, "#{collection_name}_new") # convert collection documents - collection.find({}, :timeout => false, :sort => "_id") do |cursor| - cursor.each do |doc| - new_doc = convert_ids(doc) - new_collection.insert(new_doc, :safe => true) - end + enum_mongoid_documents(collection) do |doc| + new_doc = convert_ids(doc) + new_collection.insert(new_doc, :safe => true) end puts "Done! Converted collection is in #{new_collection.name}\n\n" end # no errors. great! now rename _new to collection_name collection_names.each do |collection_name| - collection = Mongoid.master.collection(collection_name) - new_collection = collection.db["#{collection_name}_new"] + collection = mongoid_collection(collection_name) + new_collection = mongoid_new_collection(collection, "#{collection_name}_new") # swap collection to _old puts "Moving #{collection.name} to #{collection_name}_old" - collection.db["#{collection_name}_old"].drop + mongoid_new_collection(collection, "#{collection_name}_old").drop begin - collection.rename("#{collection_name}_old") + rename_mongoid_collection(collection, "#{collection_name}_old") rescue StandardError => e puts "Unable to rename database #{collection_name} to #{collection_name}_old" puts "reason: #{e.message}\n\n" end # swap _new to collection puts "Moving #{new_collection.name} to #{collection_name}\n\n" begin - new_collection.rename(collection_name) + rename_mongoid_collection(new_collection, collection_name) rescue StandardError => e puts "Unable to rename database #{new_collection.name} to #{collection_name}" puts "reason: #{e.message}\n\n" end end @@ -105,11 +161,13 @@ end desc "Clean up old collections backed up by objectid_convert" task :cleanup_old_collections => :environment do collection_names.each do |collection_name| - collection = Mongoid.master.collection(collection_name) - collection.db["#{collection.name}_old"].drop + collection = mongoid_collection(collection_name) + mongoid_new_collection(collection, "#{collection.name}_old").drop end end end + + task 'db:drop' => 'mi:drop' end