rigrate 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/rigrate.gemspec ADDED
@@ -0,0 +1,21 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'rigrate'
3
+ s.version = '0.0.1'
4
+ s.executables << 'rigrate'
5
+ s.date = '2016-04-01'
6
+ s.summary = 'Ruby Migrate! data migrate tool in ruby.'
7
+ s.description = 'a data migrate tool between diffenect data sources write by ruby.'
8
+ s.authors = ['jiyaping']
9
+ s.email = 'jiyaping0802@gmail.com'
10
+ s.homepage = 'http://rubygems.org/gems/rigrate'
11
+ s.license = 'MIT'
12
+
13
+ s.files = `git ls-files`.split("\n")
14
+ s.test_files = `git ls-files -- test/*`.split("\n")
15
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
16
+ s.require_paths = ["lib"]
17
+
18
+ s.add_dependency 'ruby-oci8', '~> 2.2'
19
+ s.add_dependency 'sqlite3', '~> 1.3'
20
+ s.add_dependency "mysql", "~> 2.9"
21
+ end
@@ -0,0 +1,66 @@
1
+ require File.expand_path('../test_helper', __FILE__)
2
+
3
+ class DataSourceTest < TestHelper
4
+ def setup
5
+ @ds = DataSource.new("sqlite://memory")
6
+
7
+ setup_sql =<<SQL
8
+ create table users (
9
+ id integer primary key not null,
10
+ name varchar,
11
+ age integer,
12
+ birthday datetime default current_date
13
+ );
14
+
15
+ insert into users(id, name, age) values(1, 'jyp1', 23);
16
+ insert into users(id, name, age) values(2, 'jyp2', 24);
17
+ insert into users(id, name, age) values(3, 'jyp3', 25);
18
+ insert into users(id, name, age) values(4, 'jyp4', 26);
19
+
20
+ insert into users(id, name, age) values(5, 'jyp5', 23);
21
+ insert into users(id, name, age) values(6, 'jyp6', 24);
22
+ insert into users(id, name, age) values(7, 'jyp7', 25);
23
+ insert into users(id, name, age) values(8, 'jyp8', 26);
24
+ SQL
25
+
26
+ # setup data
27
+ @ds.dbh.execute_batch(setup_sql)
28
+ end
29
+
30
+ def test_new_data_source
31
+ assert @ds
32
+ end
33
+
34
+ def test_new_data_source_2
35
+ assert DataSource.new("sqlite://#{File.join(Dir.tmpdir, 'tmptest.sqlite3')}")
36
+ end
37
+
38
+ def test_build_sql
39
+ assert_equal "select * from user", @ds.send(:build_sql, 'user')
40
+ assert_equal "select name,age from user", @ds.send(:build_sql, 'user', 'name', 'age')
41
+ end
42
+
43
+ def test_sql_block_given
44
+ result = @ds.sql('select * from users') do |row|
45
+ row
46
+ end
47
+
48
+ assert_equal 8, result.size
49
+ end
50
+
51
+ def test_sql
52
+ result = @ds.sql('select * from users')
53
+
54
+ assert_kind_of ResultSet, result
55
+ assert_equal 8, result.size
56
+ end
57
+
58
+ def test_method_missing
59
+ result = @ds.users(:name, :age) do |row|
60
+ row
61
+ end
62
+
63
+ assert_kind_of ResultSet, result
64
+ assert_equal 8, result.size
65
+ end
66
+ end
@@ -0,0 +1,45 @@
1
+ require File.expand_path('../test_helper', __FILE__)
2
+
3
+ class DriverTest < TestHelper
4
+ def setup
5
+ @inst_str = "test test"
6
+ @driver = Driver.new
7
+ @driver.db = @inst_str
8
+ end
9
+
10
+ def test_driver_not_null
11
+ assert @driver
12
+ end
13
+
14
+ def test_extract_tbl_from_sql
15
+ tbl_name = "user"
16
+ tbl_sql = "select * from user"
17
+
18
+ assert_equal tbl_name, @driver.extract_tbl_from_sql(tbl_sql)
19
+ end
20
+
21
+ def test_extract_tbl_from_sql2
22
+ tbl_name = "user"
23
+ tbl_sql = "select * from user where xxx = 'from'"
24
+
25
+ assert_equal tbl_name, @driver.extract_tbl_from_sql(tbl_sql)
26
+ end
27
+
28
+ def test_extract_tbl_from_sql3
29
+ tbl_name = "user"
30
+ tbl_sql = "select * from user from test" # invalid sql form
31
+
32
+ assert_equal tbl_name, @driver.extract_tbl_from_sql(tbl_sql)
33
+ end
34
+
35
+ def test_method_missing
36
+ execpt_size = @inst_str.length
37
+ assert_equal execpt_size, @driver.length
38
+ end
39
+
40
+ def test_extract_conn_param
41
+ result = @driver.send(:extract_conn_param, URI.parse("mysql://localhost:3306"))
42
+ assert_equal result.size, 3
43
+ assert_equal result['db_type'], 'mysql'
44
+ end
45
+ end
@@ -0,0 +1,87 @@
1
+ require File.expand_path('../test_helper', __FILE__)
2
+
3
+ class Mysqltest < TestHelper
4
+ def setup
5
+ @db = Mysql.new("mysql://root:20080802@127.0.0.1/test")
6
+ stm1 = @db.prepare(get_seed_data('tbl1'))
7
+ stm1.execute
8
+ stm1 = @db.prepare("insert into tbl1 values(?,?,?,?,?)")
9
+ 10.times do |i|
10
+ args = [i, "jyp#{i}", 20+i, 'tbl1', "2001-01-#{1+i}"]
11
+ stm1.execute(*args)
12
+ end
13
+
14
+ stm1 = @db.prepare(get_seed_data('tbl2'))
15
+ stm1.execute
16
+ stm1 = @db.prepare("insert into tbl2 values(?,?,?,?,?)")
17
+ 5.times do |i|
18
+ args = [i, "jyp#{i}", 20+i, 'tbl2', "2001-02-#{1+i}"]
19
+ stm1.execute(*args)
20
+ end
21
+ end
22
+
23
+ def test_new_mysql
24
+ assert @db
25
+ end
26
+
27
+ def test_transaction?
28
+ assert_respond_to @db, :transaction_active?
29
+ end
30
+
31
+ def test_blob_read_and_write
32
+ stm = @db.prepare("create table if not exists test_blob(id integer, pic blob)")
33
+ stm.execute
34
+
35
+ # insert blob
36
+ test_str = "xxxxxxxxxxxxxxxxxxxxxxxxxxx"
37
+ stm_i = @db.prepare("insert into test_blob values(?,?)")
38
+ assert stm_i.execute(1, test_str)
39
+
40
+ # read blob
41
+ rs = @db.select("select * from test_blob")
42
+ assert test_str, rs.rows.first[1]
43
+
44
+ # clean db
45
+ stm = @db.prepare("drop table test_blob")
46
+ stm.execute
47
+ end
48
+
49
+ def test_mysql_migration
50
+ str =<<SCRIPT
51
+ ds :oa, "mysql://root:20080802@127.0.0.1/test"
52
+ ds :oa_bak,"mysql://root:20080802@127.0.0.1/test"
53
+
54
+ from oa.tbl1 to oa_bak.tbl2
55
+ SCRIPT
56
+
57
+ parser = Parser.new
58
+ parser.lex(str)
59
+ parser.parsing
60
+ rs = @db.select("select * from tbl2")
61
+ assert_equal 10, rs.size
62
+ assert_equal 'tbl1', rs.rows.first[3]
63
+ end
64
+
65
+ private
66
+
67
+ def get_seed_data(tbl_name)
68
+ prepare_a_data =<<SQL
69
+ create table if not exists #{tbl_name}(
70
+ id int,
71
+ name varchar(255),
72
+ age int,
73
+ flag varchar(255),
74
+ birth date
75
+ );
76
+ SQL
77
+
78
+ prepare_a_data
79
+ end
80
+
81
+ def teardown
82
+ stm = @db.prepare("drop table tbl1")
83
+ stm.execute
84
+ stm = @db.prepare("drop table tbl2")
85
+ stm.execute
86
+ end
87
+ end
@@ -0,0 +1,109 @@
1
+ require File.expand_path('../test_helper', __FILE__)
2
+
3
+ class OracleTest < TestHelper
4
+ def setup
5
+ @db = Oracle.new("oracle://scott:1234567@jtest")
6
+ @db.db.autocommit = true
7
+
8
+ # test for blob
9
+ @db.exec("create table test_blob(id number(11), pic blob)")
10
+ @db.exec("create table test_blob2(id number(11), pic blob)")
11
+
12
+ # prepare one row
13
+ @test_str = "xxxxxxxxxx"
14
+ b_var = OCI8::BLOB.new(@db.db, @test_str)
15
+ stm = @db.parse("insert into test_blob values (:1,:2)")
16
+ stm.exec(1, b_var)
17
+ stm.exec(2, b_var)
18
+
19
+ # test for data migration
20
+ @db.exec("create table user1(id number(11) primary key, name varchar(255), age number(4), flag varchar(255))")
21
+ stm = @db.parse("insert into user1 values(:1, :2, :3, :4)")
22
+ 5.times do |i|
23
+ stm.exec(i, "user1+#{i}", 20+i, "user1")
24
+ end
25
+ @db.exec("create table user2(id number(11) primary key, name varchar(255), age number(4), flag varchar(255))")
26
+ stm = @db.parse("insert into user2 values(:1, :2, :3, :4)")
27
+ 5.times do |i|
28
+ stm.exec(i+2, "user2+#{i}", 30+i, "user2")
29
+ end
30
+ end
31
+
32
+ def test_new_connection
33
+ assert @db
34
+ end
35
+
36
+ def test_respond_transaction
37
+ assert_respond_to @db, :transaction_active?
38
+ end
39
+
40
+ def test_convert_question_mark_to_sym
41
+ e_sql_1 = "select * from users where id = ?"
42
+ a_sql_1 = "select * from users where id = :1"
43
+ assert_equal a_sql_1, @db.convert_question_mark_to_symbol(e_sql_1, ['a'].size)
44
+
45
+ e_sql_2 = "select * from users"
46
+ a_sql_2 = "select * from users"
47
+ assert_equal a_sql_2, @db.convert_question_mark_to_symbol(e_sql_2, [].size)
48
+
49
+ e_sql_3 = "select * from users where id = ? and name = ?"
50
+ a_sql_3 = "select * from users where id = :1 and name = :2"
51
+ assert_equal a_sql_3, @db.convert_question_mark_to_symbol(e_sql_3, ['a', 'b'].size)
52
+ end
53
+
54
+ def test_blob_read_and_write
55
+ stm = @db.parse("select * from test_blob")
56
+ stm.exec
57
+ row = stm.fetch
58
+ assert_equal @test_str, row[1].read
59
+
60
+ stm.exec
61
+ row = stm.fetch
62
+ rb_row = @db.to_rb_row(row)
63
+ assert_equal [1, @test_str], rb_row
64
+ end
65
+
66
+ def test_select_rs
67
+ rs = @db.select("select * from test_blob")
68
+ assert_equal 2, rs.size
69
+ assert_equal @test_str, rs.rows.first[1]
70
+ end
71
+
72
+ def test_oracle_migration
73
+ str =<<SCRIPT
74
+ ds :oa, "oracle://scott:1234567@jtest"
75
+ ds :hr, "oracle://scott:1234567@jtest"
76
+
77
+ from oa.user1 to hr.user2
78
+ SCRIPT
79
+
80
+ parser = Parser.new
81
+ parser.lex(str).parsing
82
+ @rs = @db.select("select * from user2")
83
+ assert_equal 5, @rs.size
84
+ assert_equal 'user1', @rs.rows.first[3]
85
+ end
86
+
87
+ def test_blob_migration
88
+ str =<<SCRIPT
89
+ ds :oa, "oracle://scott:1234567@jtest"
90
+ ds :hr, "oracle://scott:1234567@jtest"
91
+
92
+ from oa.test_blob to hr.test_blob2
93
+ SCRIPT
94
+
95
+ parser = Parser.new
96
+ parser.lex(str).parsing
97
+ @rs = @db.select("select * from test_blob2")
98
+ assert_equal 2, @rs.size
99
+ assert_equal @test_str, @rs.rows.first[1]
100
+ end
101
+
102
+ def teardown
103
+ # clean environment
104
+ @db.exec("drop table test_blob")
105
+ @db.exec("drop table test_blob2")
106
+ @db.exec('drop table user1')
107
+ @db.exec('drop table user2')
108
+ end
109
+ end
@@ -0,0 +1,85 @@
1
+ require File.expand_path('../test_helper', __FILE__)
2
+
3
+ class SqliteTest < TestHelper
4
+ def setup
5
+ @tbl_name = 'users'
6
+
7
+ @db = Sqlite.new
8
+ setup_sql =<<SQL
9
+ create table users (
10
+ id integer primary key not null,
11
+ name varchar,
12
+ age integer,
13
+ birthday datetime default current_date
14
+ );
15
+
16
+ insert into users(id, name, age) values(1, 'jyp1', 23);
17
+ insert into users(id, name, age) values(2, 'jyp2', 24);
18
+ insert into users(id, name, age) values(3, 'jyp3', 25);
19
+ insert into users(id, name, age) values(4, 'jyp4', 26);
20
+ SQL
21
+
22
+ # setup data
23
+ @db.execute_batch(setup_sql)
24
+ end
25
+
26
+ def test_new_db
27
+ assert @db
28
+ end
29
+
30
+ def test_table_users_exists?
31
+ sql = "select name from sqlite_master\
32
+ where type='table' and name='#{@tbl_name}'"
33
+
34
+ result = @db.execute sql
35
+ if result.size > 0
36
+ q_tbl_name = result.first.first
37
+ end
38
+
39
+ assert_equal q_tbl_name, @tbl_name
40
+ end
41
+
42
+ def test_primary_key_returned_value
43
+ result = @db.primary_key('users')
44
+
45
+ assert Array === result
46
+ end
47
+
48
+ def test_get_users_primary_is_id
49
+ result = @db.primary_key('users')
50
+
51
+ assert_equal ['id'], result
52
+ end
53
+
54
+ def test_insert_values
55
+ sql = "insert into users(id, name) values (1000, 'test')"
56
+ assert @db.insert(sql)
57
+ sql = "insert into users(id, name) values (?, ?)"
58
+ args = [10001, 'testtest']
59
+ assert @db.insert(sql, args)
60
+ end
61
+
62
+ def test_inherit_extract_tblname
63
+ sql = "select * from users"
64
+
65
+ assert_equal "users", @db.extract_tbl_from_sql(sql)
66
+ end
67
+
68
+ def test_select_is_success
69
+ sql = "select id, name from users"
70
+ assert @db.select sql
71
+ end
72
+
73
+ def test_delete
74
+ assert @db.delete("delete from users where id=?", [1])
75
+ end
76
+
77
+ def test_extract_db_path
78
+ assert ":memory:", @db.extract_db_path("sqlite://memory")
79
+ assert "/home/test.db", @db.extract_db_path("sqlite://home/test.db")
80
+ end
81
+
82
+ def teardown
83
+ #@db.close unless @db.closed?
84
+ end
85
+ end
@@ -0,0 +1,9 @@
1
+ gem "minitest"
2
+ require 'minitest/autorun'
3
+ require 'fileutils'
4
+ require 'tmpdir'
5
+ require 'rigrate'
6
+
7
+ class TestHelper < MiniTest::Test
8
+ include Rigrate
9
+ end
@@ -0,0 +1,108 @@
1
+ require File.expand_path('../test_helper', __FILE__)
2
+
3
+ class MigrationTest < TestHelper
4
+ def setup
5
+ @obj = Object.new.extend(Migration)
6
+
7
+ # seed data
8
+ @obj.self_eval("ds :oa, 'sqlite://memory'")
9
+ @obj.oa.dbh.execute_batch(get_seed_sql('oa'))
10
+
11
+ @obj.self_eval("ds :hr, 'sqlite://memory'")
12
+ @obj.hr.dbh.execute_batch(get_seed_sql('hr'))
13
+ end
14
+
15
+ def test_self_eval
16
+ assert_equal 3, @obj.self_eval('1+2')
17
+ end
18
+
19
+ def test_self_eval2
20
+ assert_kind_of ResultSet, @obj.self_eval("oa.dbh.select('select * from users')")
21
+ end
22
+
23
+ def test_data_source
24
+ @obj.ds('oa1', 'sqlite://memory')
25
+
26
+ assert_kind_of DataSource, @obj.oa1
27
+ assert @obj.oa1 = 'test'
28
+ assert_equal @obj.oa1, 'test'
29
+ end
30
+
31
+ def test_union
32
+ rs_first_str = "oa.sql('select id,name,age,flag from users')"
33
+ rs_second_str = "hr.users(:id,:name,:age,:flag)"
34
+
35
+ new_rs = @obj.union(rs_first_str, rs_second_str)
36
+ assert_equal 10, new_rs.size
37
+ end
38
+
39
+ def test_join
40
+ rs_first_str = "oa.sql('select id,name,age,flag from users where id in (1, 2)')"
41
+ rs_second_str = "hr.sql('select id, birthday from users where id in (2, 3)')"
42
+ condition = ":id => :id"
43
+ new_rs = @obj.join(rs_first_str, rs_second_str, condition)
44
+
45
+ assert_equal 2, new_rs.size
46
+
47
+ # TODO when fetch none record , then fill with nil
48
+ end
49
+
50
+ def test_join_2
51
+ end
52
+
53
+ def test_migrate_full_table_migrate
54
+ rs_first_str = "oa.sql('select * from users')"
55
+ rs_second_str = "hr.users"
56
+
57
+ # this will save the migrated resultset
58
+ @obj.migrate(rs_first_str, rs_second_str)
59
+
60
+ # search the db to confirm
61
+ rs = @obj.oa.dbh.select("select flag from users")
62
+
63
+ assert_equal 5, rs.size
64
+ assert_equal 'oa', rs.rows.first[0]
65
+ end
66
+
67
+ def test_migrate_parted_record
68
+ rs_first_str = "oa.sql('select id,name,flag from users where id in (2)')"
69
+ rs_second_str = "hr.sql('select id,name,flag from users where id in (2)')"
70
+
71
+ @obj.migrate(rs_first_str, rs_second_str)
72
+
73
+ rs = @obj.hr.dbh.select("select count(*) from users where flag='oa'")
74
+ assert_equal 1, rs.rows.first[0]
75
+ end
76
+
77
+ def test_migrate_parted_record_2
78
+ # include delete, updated, insert (when target record exists in db but not in rs)
79
+ end
80
+
81
+ private
82
+
83
+ def get_seed_sql(db, insert_times = 5)
84
+ insert_sql = ""
85
+ insert_times.times do |i|
86
+ insert_sql << "insert into users(id, name, age, flag) values(#{i}, 'jyp#{i}', 26, '#{db}');"
87
+ end
88
+
89
+ setup_sql =<<SQL
90
+ create table users (
91
+ id integer primary key not null,
92
+ name varchar,
93
+ age integer,
94
+ flag varchar,
95
+ birthday datetime default current_date
96
+ );
97
+ #{insert_sql}
98
+ SQL
99
+
100
+ setup_sql
101
+ end
102
+ end
103
+
104
+
105
+
106
+
107
+
108
+