From 7f86a9e1ba027cc22a37d6fa9adcebd5b4d58932 Mon Sep 17 00:00:00 2001 From: Sarah Mei Date: Tue, 4 Jan 2011 22:43:32 -0800 Subject: [PATCH] ImportToMysql now loads users.csv. Spec currently failing on datetime conversion. --- app/models/mongo.rb | 7 +++ .../20110105051803_create_import_tables.rb | 24 +++++++++ db/schema.rb | 19 ++++++- lib/data_conversion/base.rb | 7 +-- lib/data_conversion/import_from_mysql.rb | 8 --- lib/data_conversion/import_to_mysql.rb | 21 ++++++++ spec/fixtures/data_conversion/users.csv | 53 +++++++++++++++++++ .../data_conversion/import_to_mysql_spec.rb | 40 +++++++++++++- 8 files changed, 164 insertions(+), 15 deletions(-) create mode 100644 app/models/mongo.rb create mode 100644 db/migrate/20110105051803_create_import_tables.rb delete mode 100644 lib/data_conversion/import_from_mysql.rb create mode 100644 lib/data_conversion/import_to_mysql.rb create mode 100644 spec/fixtures/data_conversion/users.csv diff --git a/app/models/mongo.rb b/app/models/mongo.rb new file mode 100644 index 000000000..8befea7b3 --- /dev/null +++ b/app/models/mongo.rb @@ -0,0 +1,7 @@ +module Mongo + def self.table_name_prefix + "mongo_" + end + + class User < ActiveRecord::Base; end +end \ No newline at end of file diff --git a/db/migrate/20110105051803_create_import_tables.rb b/db/migrate/20110105051803_create_import_tables.rb new file mode 100644 index 000000000..141c0b11d --- /dev/null +++ b/db/migrate/20110105051803_create_import_tables.rb @@ -0,0 +1,24 @@ +class CreateImportTables < ActiveRecord::Migration + def self.up + create_table :mongo_users do |t| + t.string :mongo_id + t.string :username + t.text :serialized_private_key + t.string :encrypted_password + t.integer :invites + t.string :invitation_token + t.datetime :invitation_sent_at + t.boolean :getting_started + t.boolean :disable_mail + t.string :language + t.string :last_sign_in_ip + t.datetime :last_sign_in_at + t.string :reset_password_token + t.string :password_salt + end + end + + def self.down + drop_table :mongo_users + end +end diff --git a/db/schema.rb b/db/schema.rb index e6817892c..2ee656817 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 0) do +ActiveRecord::Schema.define(:version => 20110105051803) do create_table "aspect_memberships", :force => true do |t| t.integer "aspect_id" @@ -70,6 +70,23 @@ ActiveRecord::Schema.define(:version => 0) do add_index "invitations", ["sender_id"], :name => "index_invitations_on_sender_id" + create_table "mongo_users", :force => true do |t| + t.string "mongo_id" + t.string "username" + t.text "serialized_private_key" + t.string "encrypted_password" + t.integer "invites" + t.string "invitation_token" + t.datetime "invitation_sent_at" + t.boolean "getting_started" + t.boolean "disable_mail" + t.string "language" + t.string "last_sign_in_ip" + t.datetime "last_sign_in_at" + t.string "reset_password_token" + t.string "password_salt" + end + create_table "notifications", :force => true do |t| t.string "target_type" t.integer "target_id" diff --git a/lib/data_conversion/base.rb b/lib/data_conversion/base.rb index 871a6297d..64abe9a9d 100644 --- a/lib/data_conversion/base.rb +++ b/lib/data_conversion/base.rb @@ -4,11 +4,12 @@ module DataConversion class Base - attr_accessor :start_time, :directory + attr_accessor :start_time, :directory, :full_path def initialize(start_time = Time.now) @start_time = start_time @directory = "tmp/export-for-mysql" + @full_path = "#{Rails.root}/#{directory}" end def log(message) @@ -17,9 +18,5 @@ module DataConversion end Rails.logger.debug(message) if Rails.logger end - - def full_path - "#{Rails.root}/#{directory}" - end end end \ No newline at end of file diff --git a/lib/data_conversion/import_from_mysql.rb b/lib/data_conversion/import_from_mysql.rb deleted file mode 100644 index d95a4c242..000000000 --- a/lib/data_conversion/import_from_mysql.rb +++ /dev/null @@ -1,8 +0,0 @@ -# Copyright (c) 2010, Diaspora Inc. This file is -# licensed under the Affero General Public License version 3 or later. See -# the COPYRIGHT file. - -module DataConversion - class ImportToMysql < DataConversion::Base - end -end \ No newline at end of file diff --git a/lib/data_conversion/import_to_mysql.rb b/lib/data_conversion/import_to_mysql.rb new file mode 100644 index 000000000..ed79df7e0 --- /dev/null +++ b/lib/data_conversion/import_to_mysql.rb @@ -0,0 +1,21 @@ +# Copyright (c) 2010, Diaspora Inc. This file is +# licensed under the Affero General Public License version 3 or later. See +# the COPYRIGHT file. + +module DataConversion + class ImportToMysql < DataConversion::Base + def import_raw + Mongo::User.connection.execute <<-SQL + LOAD DATA INFILE '#{full_path}/users.csv' INTO TABLE mongo_users + FIELDS TERMINATED BY ',' + ENCLOSED BY '"' + IGNORE 1 LINES + (mongo_id, username, serialized_private_key, encrypted_password, + invites, invitation_token, invitation_sent_at, getting_started, + disable_mail, language, last_sign_in_ip, last_sign_in_at, + reset_password_token, password_salt) + SQL + end + end + +end \ No newline at end of file diff --git a/spec/fixtures/data_conversion/users.csv b/spec/fixtures/data_conversion/users.csv new file mode 100644 index 000000000..e87efcf34 --- /dev/null +++ b/spec/fixtures/data_conversion/users.csv @@ -0,0 +1,53 @@ +mongo_id,username,serialized_private_key,encrypted_password,invites,invitation_token,invitation_sent_at,getting_started,disable_mail,language,last_sign_in_ip,last_sign_in_at,reset_password_token,password_salt +4d1513542367bc2525000002,beckett,"-----BEGIN RSA PRIVATE KEY----- +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 +-----END RSA PRIVATE KEY----- +",$2a$10$i7ulgssUfhg9lA.FxT2ugOiYSUh.91NvD9X21m1M2AkPRfxbkQv5W,5,,,false,false,en,127.0.0.1,1293241318000,,$2a$10$i7ulgssUfhg9lA.FxT2ugO diff --git a/spec/lib/data_conversion/import_to_mysql_spec.rb b/spec/lib/data_conversion/import_to_mysql_spec.rb index 66e74c0c0..2d29b4c5a 100644 --- a/spec/lib/data_conversion/import_to_mysql_spec.rb +++ b/spec/lib/data_conversion/import_to_mysql_spec.rb @@ -6,8 +6,46 @@ require 'spec_helper' Dir.glob(File.join(Rails.root, 'lib', 'data_conversion', '*.rb')).each { |f| require f } describe DataConversion::ImportToMysql do + def copy_fixture_for(table_name) + FileUtils.cp("#{Rails.root}/spec/fixtures/data_conversion/#{table_name}.csv", + "#{@migrator.full_path}/#{table_name}.csv") + end + before do @migrator = DataConversion::ImportToMysql.new + @migrator.full_path = "/tmp/data_conversion" + system("rm -rf #{@migrator.full_path}") + FileUtils.mkdir_p(@migrator.full_path) + end + + describe "#import_raw" do + describe "users" do + before do + copy_fixture_for("users") + end + it "imports data into the mongo_users table" do + Mongo::User.count.should == 0 + @migrator.import_raw + Mongo::User.count.should == 1 + end + it "imports all the columns" do + @migrator.import_raw + beckett = Mongo::User.first + beckett.mongo_id.should == "4d1513542367bc2525000002" + beckett.username.should == "beckett" + beckett.serialized_private_key.should_not be_nil + beckett.encrypted_password.should_not be_nil + beckett.invites.should == 5 + beckett.invitation_token.should == "" + beckett.invitation_sent_at.should be_nil + beckett.getting_started.should be_false + beckett.disable_mail.should be_false + beckett.language.should == 'en' + beckett.last_sign_in_ip.should == '127.0.0.1' + beckett.last_sign_in_at.should_not be_nil + beckett.reset_password_token.should == "" + beckett.password_salt.should_not be_nil + end + end end - end