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.
- checksums.yaml +7 -0
- data/README.md +160 -0
- data/Rakefile +9 -0
- data/bin/rigrate +69 -0
- data/lib/rigrate.rb +97 -0
- data/lib/rigrate/data_source.rb +43 -0
- data/lib/rigrate/error.rb +11 -0
- data/lib/rigrate/interface.rb +20 -0
- data/lib/rigrate/interface/driver.rb +41 -0
- data/lib/rigrate/interface/mysql.rb +148 -0
- data/lib/rigrate/interface/oracle.rb +172 -0
- data/lib/rigrate/interface/result_set.rb +389 -0
- data/lib/rigrate/interface/row.rb +69 -0
- data/lib/rigrate/interface/sqlite.rb +106 -0
- data/lib/rigrate/migration.rb +89 -0
- data/lib/rigrate/parser.rb +270 -0
- data/rigrate.gemspec +21 -0
- data/test/test_datasource.rb +66 -0
- data/test/test_driver.rb +45 -0
- data/test/test_driver_mysql.rb +87 -0
- data/test/test_driver_oracle.rb +109 -0
- data/test/test_driver_sqlite.rb +85 -0
- data/test/test_helper.rb +9 -0
- data/test/test_migration.rb +108 -0
- data/test/test_parser.rb +262 -0
- data/test/test_resultset.rb +300 -0
- data/test/test_rigrate.rb +6 -0
- data/test/test_rigrate_row.rb +51 -0
- metadata +124 -0
data/test/test_parser.rb
ADDED
@@ -0,0 +1,262 @@
|
|
1
|
+
require File.expand_path('../test_helper', __FILE__)
|
2
|
+
|
3
|
+
class ParserTest < TestHelper
|
4
|
+
def setup
|
5
|
+
@parser = Parser.new
|
6
|
+
|
7
|
+
# define two real sqlite db in disk
|
8
|
+
@hr = SQLite3::Database.new(File.join(Dir.tmpdir, 'hr.sqlite3'))
|
9
|
+
@oa = SQLite3::Database.new(File.join(Dir.tmpdir, 'oa.sqlite3'))
|
10
|
+
|
11
|
+
# fuck slowing .....
|
12
|
+
@hr.execute("create table users(id integer, name varchar, age integer, flag varchar);")
|
13
|
+
5.times do |i|
|
14
|
+
@hr.execute("insert into users values(#{i}, 'hrname#{i}', #{20 + i}, 'hr')")
|
15
|
+
end
|
16
|
+
|
17
|
+
@oa.execute("create table users(idx integer, name varchar, age integer, flag varchar);")
|
18
|
+
10.times do |i|
|
19
|
+
@oa.execute("insert into users values(#{i}, 'oaname#{i}', #{40 + i}, 'oa')")
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_lex
|
24
|
+
@parser.lex("from oa.user to hr.account")
|
25
|
+
|
26
|
+
assert_equal 4, @parser.tokens.size
|
27
|
+
assert_equal 4, @parser.tokens.size
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_lex2
|
31
|
+
@parser.lex("FroM oa.sql('select * from user')\
|
32
|
+
to hr.account on :jc=>:job_code")
|
33
|
+
assert_equal 6, @parser.tokens.size
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_lext4
|
37
|
+
@parser.lex("FroM oa.sql('select * from user')\
|
38
|
+
to hr.account on :jc=>:job_code using :echo")
|
39
|
+
assert_equal 8, @parser.tokens.size
|
40
|
+
assert_equal :USING_TAG, @parser.tokens[-2].type
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_lex3
|
44
|
+
str =<<EOF
|
45
|
+
# comment test
|
46
|
+
# comment 2222
|
47
|
+
from
|
48
|
+
oa.user(:id)
|
49
|
+
join
|
50
|
+
hr.account(:job_code)
|
51
|
+
union
|
52
|
+
hr2.account(:test)
|
53
|
+
to
|
54
|
+
oa_test.user(:id)
|
55
|
+
on :job_code=>:jc
|
56
|
+
using :sync
|
57
|
+
EOF
|
58
|
+
@parser.lex(str)
|
59
|
+
assert_equal 13, @parser.tokens.size
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_parser_full_migration
|
63
|
+
str =<<SCRIPT
|
64
|
+
ds :oa, "sqlite://#{File.join(Dir.tmpdir, 'oa.sqlite3')}"
|
65
|
+
ds :hr, "sqlite://#{File.join(Dir.tmpdir, 'hr.sqlite3')}"
|
66
|
+
|
67
|
+
from oa.users to hr.users
|
68
|
+
SCRIPT
|
69
|
+
|
70
|
+
# migration
|
71
|
+
parser = Parser.new
|
72
|
+
parser.lex(str)
|
73
|
+
parser.parsing
|
74
|
+
|
75
|
+
db = DataSource.new("sqlite://#{File.join(Dir.tmpdir, 'hr.sqlite3')}")
|
76
|
+
rs = db.dbh.select("select * from users")
|
77
|
+
assert_equal 10, rs.size
|
78
|
+
assert_equal 'oa', rs.rows.first[3]
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_parser_full_table_migration_with_columns
|
82
|
+
str =<<SCRIPT
|
83
|
+
ds :oa, "sqlite://#{File.join(Dir.tmpdir, 'oa.sqlite3')}"
|
84
|
+
ds :hr, "sqlite://#{File.join(Dir.tmpdir, 'hr.sqlite3')}"
|
85
|
+
|
86
|
+
from
|
87
|
+
oa.sql('select * from users')
|
88
|
+
to
|
89
|
+
hr.users(:id, :name, :age, :flag)
|
90
|
+
SCRIPT
|
91
|
+
|
92
|
+
# migration
|
93
|
+
parser = Parser.new
|
94
|
+
parser.lex(str)
|
95
|
+
parser.parsing
|
96
|
+
|
97
|
+
db = DataSource.new("sqlite://#{File.join(Dir.tmpdir, 'hr.sqlite3')}")
|
98
|
+
rs = db.dbh.select("select * from users")
|
99
|
+
assert_equal 10, rs.size
|
100
|
+
assert_equal 'oa', rs.rows.first[3]
|
101
|
+
end
|
102
|
+
|
103
|
+
def test_parser_migration_with_single_condition
|
104
|
+
str =<<SCRIPT
|
105
|
+
ds :oa, "sqlite://#{File.join(Dir.tmpdir, 'oa.sqlite3')}"
|
106
|
+
ds :hr, "sqlite://#{File.join(Dir.tmpdir, 'hr.sqlite3')}"
|
107
|
+
|
108
|
+
from
|
109
|
+
oa.sql('select idx,name,flag from users where idx in (1,2)')
|
110
|
+
to
|
111
|
+
hr.users(:id, :name, :flag)
|
112
|
+
on :idx=>:id
|
113
|
+
SCRIPT
|
114
|
+
|
115
|
+
# migration
|
116
|
+
parser = Parser.new
|
117
|
+
parser.lex(str)
|
118
|
+
parser.parsing
|
119
|
+
|
120
|
+
db = DataSource.new("sqlite://#{File.join(Dir.tmpdir, 'hr.sqlite3')}")
|
121
|
+
rs = db.dbh.select("select * from users")
|
122
|
+
# TODO need rework
|
123
|
+
assert rs
|
124
|
+
end
|
125
|
+
|
126
|
+
def test_parser_join_result
|
127
|
+
str =<<SCRIPT
|
128
|
+
ds :oa, "sqlite://#{File.join(Dir.tmpdir, 'oa.sqlite3')}"
|
129
|
+
ds :hr, "sqlite://#{File.join(Dir.tmpdir, 'hr.sqlite3')}"
|
130
|
+
ds :oa_alias, "sqlite://#{File.join(Dir.tmpdir, 'oa.sqlite3')}"
|
131
|
+
|
132
|
+
from
|
133
|
+
oa.sql('select idx,name from users where idx=1 or idx = 2')
|
134
|
+
join
|
135
|
+
oa_alias.sql('select idx,flag from users where idx=1 or idx=2')
|
136
|
+
on :idx => :idx
|
137
|
+
to
|
138
|
+
hr.users(:id, :name, :flag)
|
139
|
+
SCRIPT
|
140
|
+
|
141
|
+
# migration
|
142
|
+
parser = Parser.new
|
143
|
+
parser.lex(str)
|
144
|
+
parser.parsing
|
145
|
+
|
146
|
+
db = DataSource.new("sqlite://#{File.join(Dir.tmpdir, 'hr.sqlite3')}")
|
147
|
+
rs = db.dbh.select("select * from users")
|
148
|
+
assert_equal 2, rs.size
|
149
|
+
assert_equal 'oa', rs.rows.first[3]
|
150
|
+
end
|
151
|
+
|
152
|
+
def test_parser_union_parted_fields
|
153
|
+
str =<<SCRIPT
|
154
|
+
ds :oa, "sqlite://#{File.join(Dir.tmpdir, 'oa.sqlite3')}"
|
155
|
+
ds :hr, "sqlite://#{File.join(Dir.tmpdir, 'hr.sqlite3')}"
|
156
|
+
ds :oa_alias, "sqlite://#{File.join(Dir.tmpdir, 'oa.sqlite3')}"
|
157
|
+
|
158
|
+
from
|
159
|
+
oa.sql('select idx,name,flag from users where idx=1 or idx = 2')
|
160
|
+
union
|
161
|
+
oa_alias.sql('select idx,name,flag from users where idx=2 or idx=3')
|
162
|
+
to
|
163
|
+
hr.users(:id, :name, :flag)
|
164
|
+
SCRIPT
|
165
|
+
|
166
|
+
# migration
|
167
|
+
parser = Parser.new
|
168
|
+
parser.lex(str)
|
169
|
+
parser.parsing
|
170
|
+
|
171
|
+
db = DataSource.new("sqlite://#{File.join(Dir.tmpdir, 'hr.sqlite3')}")
|
172
|
+
rs = db.dbh.select("select * from users")
|
173
|
+
assert_equal 4, rs.size
|
174
|
+
assert_equal 'oa', rs.rows.first[3]
|
175
|
+
end
|
176
|
+
|
177
|
+
def test_parser_minus_parted_fields
|
178
|
+
str =<<SCRIPT
|
179
|
+
ds :oa, "sqlite://#{File.join(Dir.tmpdir, 'oa.sqlite3')}"
|
180
|
+
ds :hr, "sqlite://#{File.join(Dir.tmpdir, 'hr.sqlite3')}"
|
181
|
+
ds :oa_alias, "sqlite://#{File.join(Dir.tmpdir, 'oa.sqlite3')}"
|
182
|
+
|
183
|
+
from
|
184
|
+
oa.sql('select idx,name,flag from users where idx=1 or idx = 2')
|
185
|
+
minus
|
186
|
+
oa_alias.sql('select idx,name,flag from users where idx=2 or idx=3')
|
187
|
+
to
|
188
|
+
hr.users(:id, :name, :flag)
|
189
|
+
SCRIPT
|
190
|
+
|
191
|
+
# migration
|
192
|
+
parser = Parser.new
|
193
|
+
parser.lex(str)
|
194
|
+
parser.parsing
|
195
|
+
|
196
|
+
db = DataSource.new("sqlite://#{File.join(Dir.tmpdir, 'hr.sqlite3')}")
|
197
|
+
rs = db.dbh.select("select * from users")
|
198
|
+
assert_equal 1, rs.size
|
199
|
+
assert_equal 'oa', rs.rows.first[3]
|
200
|
+
end
|
201
|
+
|
202
|
+
def test_echo_and_mode
|
203
|
+
str_echo =<<SCRIPT
|
204
|
+
ds :oa, "sqlite://#{File.join(Dir.tmpdir, 'oa.sqlite3')}"
|
205
|
+
ds :hr, "sqlite://#{File.join(Dir.tmpdir, 'hr.sqlite3')}"
|
206
|
+
|
207
|
+
from oa.users to hr.users using :echo
|
208
|
+
SCRIPT
|
209
|
+
|
210
|
+
# migration
|
211
|
+
parser = Parser.new
|
212
|
+
parser.lex(str_echo).parsing
|
213
|
+
db = DataSource.new("sqlite://#{File.join(Dir.tmpdir, 'hr.sqlite3')}")
|
214
|
+
assert_equal 10, db.dbh.select("select * from users").size
|
215
|
+
end
|
216
|
+
|
217
|
+
def test_contribute_and_mode
|
218
|
+
str_echo =<<SCRIPT
|
219
|
+
ds :oa, "sqlite://#{File.join(Dir.tmpdir, 'oa.sqlite3')}"
|
220
|
+
ds :hr, "sqlite://#{File.join(Dir.tmpdir, 'hr.sqlite3')}"
|
221
|
+
|
222
|
+
from oa.users to hr.users using :contribute
|
223
|
+
SCRIPT
|
224
|
+
|
225
|
+
# migration
|
226
|
+
parser = Parser.new
|
227
|
+
parser.lex(str_echo).parsing
|
228
|
+
db = DataSource.new("sqlite://#{File.join(Dir.tmpdir, 'hr.sqlite3')}")
|
229
|
+
assert_equal 15, db.dbh.select("select * from users").size
|
230
|
+
end
|
231
|
+
|
232
|
+
def test_multi_migration_task
|
233
|
+
str =<<SCRIPT
|
234
|
+
ds :oa, "sqlite://#{File.join(Dir.tmpdir, 'oa.sqlite3')}"
|
235
|
+
ds :hr, "sqlite://#{File.join(Dir.tmpdir, 'hr.sqlite3')}"
|
236
|
+
|
237
|
+
from oa.users to hr.users
|
238
|
+
from hr.users to oa.users
|
239
|
+
SCRIPT
|
240
|
+
|
241
|
+
# migration
|
242
|
+
parser = Parser.new
|
243
|
+
parser.lex(str)
|
244
|
+
parser.parsing
|
245
|
+
|
246
|
+
db = DataSource.new("sqlite://#{File.join(Dir.tmpdir, 'oa.sqlite3')}")
|
247
|
+
rs = db.dbh.select("select * from users")
|
248
|
+
rs2 = db.dbh.select('select * from users')
|
249
|
+
assert_equal 10, rs.size
|
250
|
+
assert_equal 10, rs2.size
|
251
|
+
assert_equal 'oa', rs.rows.first[3]
|
252
|
+
end
|
253
|
+
|
254
|
+
def teardown
|
255
|
+
@hr.execute('drop table users')
|
256
|
+
@hr.close
|
257
|
+
@oa.execute('drop table users')
|
258
|
+
@oa.close
|
259
|
+
# FileUtils.rm File.join(Dir.tmpdir, 'oa.sqlite3')
|
260
|
+
# FileUtils.rm File.join(Dir.tmpdir, 'hr.sqlite3')
|
261
|
+
end
|
262
|
+
end
|
@@ -0,0 +1,300 @@
|
|
1
|
+
require File.expand_path('../test_helper', __FILE__)
|
2
|
+
|
3
|
+
class ResultSetTest < 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
|
+
|
21
|
+
insert into users(id, name, age) values(5, 'jyp5', 23);
|
22
|
+
insert into users(id, name, age) values(6, 'jyp6', 24);
|
23
|
+
insert into users(id, name, age) values(7, 'jyp7', 25);
|
24
|
+
insert into users(id, name, age) values(8, 'jyp8', 26);
|
25
|
+
SQL
|
26
|
+
|
27
|
+
# setup data
|
28
|
+
@db.execute_batch(setup_sql)
|
29
|
+
@rs = @db.select("select * from users where id < 5")
|
30
|
+
@rs2 = @db.select("select * from users where id > 4")
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_rs_attribute_db
|
34
|
+
assert_instance_of Sqlite, @rs.db
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_rs_attribute_target_tbl_name
|
38
|
+
assert_equal 'users', @rs.target_tbl_name
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_rs_attribute_rows
|
42
|
+
assert_operator 0, :<, @rs.rows.size
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_rs_attribute_rows_item_type
|
46
|
+
assert_instance_of Array, @rs.rows.first.data
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_fill_with_nil
|
50
|
+
rows = [[1, 2], [2, 3]]
|
51
|
+
assert_equal [[1, 2, nil], [2, 3, nil]], @rs.send(:fill_with_nil, rows, 1)
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_get_columns_idx
|
55
|
+
assert_equal [1, 2], @rs.send(:column_idx, :name, :age)
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_get_columns_idx2
|
59
|
+
assert_equal [], @rs.send(:column_idx, :testtesttest)
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_union_two_result
|
63
|
+
assert_equal 8, @rs.union(@rs2).rows.size
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_union_two_result_2
|
67
|
+
rs1 = ResultSet.new.tap do |rs|
|
68
|
+
rs.column_info = [Column.new(:name1, :type1),
|
69
|
+
Column.new(:name2, :type2)]
|
70
|
+
rs.rows = [Row.new([111, 112]),
|
71
|
+
Row.new([121, 122])]
|
72
|
+
end
|
73
|
+
|
74
|
+
rs2 = ResultSet.new.tap do |rs|
|
75
|
+
rs.column_info = [Column.new(:name5, :type3),
|
76
|
+
Column.new(:name6, :type4),
|
77
|
+
Column.new(:name7, :type5)]
|
78
|
+
rs.rows = [Row.new([211, 212, 213]),
|
79
|
+
Row.new([221, 222, 223])]
|
80
|
+
end
|
81
|
+
|
82
|
+
assert_equal 4, rs1.union(rs2).rows.size
|
83
|
+
end
|
84
|
+
|
85
|
+
def test_union_two_result_3
|
86
|
+
rs1 = ResultSet.new.tap do |rs|
|
87
|
+
rs.column_info = [Column.new(:name1, :type1),
|
88
|
+
Column.new(:name2, :type2)]
|
89
|
+
rs.rows = [Row.new([111, 112]),
|
90
|
+
Row.new([121, 122])]
|
91
|
+
end
|
92
|
+
|
93
|
+
rs2 = ResultSet.new.tap do |rs|
|
94
|
+
rs.column_info = [Column.new(:name5, :type3),
|
95
|
+
Column.new(:name6, :type4),
|
96
|
+
Column.new(:name7, :type5)]
|
97
|
+
rs.rows = [Row.new([211, 212, 213]),
|
98
|
+
Row.new([221, 222, 223])]
|
99
|
+
end
|
100
|
+
|
101
|
+
assert_equal 4, rs2.union(rs1).rows.size
|
102
|
+
|
103
|
+
# all rows type are Rigrate::Row
|
104
|
+
row = rs2.rows.select { |r| ! Row === r }
|
105
|
+
assert_equal 0, row.size
|
106
|
+
end
|
107
|
+
|
108
|
+
def test_join_two_result_1
|
109
|
+
assert_raises(ResultSetError) do
|
110
|
+
@rs.join(@rs2)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def test_join_two_resulset_2
|
115
|
+
rs1 = ResultSet.new.tap do |rs|
|
116
|
+
rs.column_info = [Column.new('name1', :type1),
|
117
|
+
Column.new('name2', :type2)]
|
118
|
+
rs.rows = [Row.new([1, 112]),
|
119
|
+
Row.new([2, 122]),
|
120
|
+
Row.new([3, 122])]
|
121
|
+
end
|
122
|
+
|
123
|
+
rs2 = ResultSet.new.tap do |rs|
|
124
|
+
rs.column_info = [Column.new('name5', :type3),
|
125
|
+
Column.new('name6', :type4),
|
126
|
+
Column.new('name7', :type5)]
|
127
|
+
rs.rows = [Row.new([1, 212, 213]),
|
128
|
+
Row.new([2, 222, 223]),
|
129
|
+
Row.new([2, 332, 333])]
|
130
|
+
end
|
131
|
+
|
132
|
+
rs = rs1.join(rs2, :name1 => :name5)
|
133
|
+
# rows size is 3
|
134
|
+
assert_equal 4, rs.rows.size
|
135
|
+
# column size is 4
|
136
|
+
assert_equal 4, rs.column_info.size
|
137
|
+
# column name1 should fill with 2 nil
|
138
|
+
row = rs.rows.select {|r| r[0] == 3}.first
|
139
|
+
assert_equal 2, row.data.select {|field| field.nil?}.size
|
140
|
+
end
|
141
|
+
|
142
|
+
def test_minus_1
|
143
|
+
rs1 = ResultSet.new.tap do |rs|
|
144
|
+
rs.column_info = [Column.new('name1', :type1),
|
145
|
+
Column.new('name2', :type2)]
|
146
|
+
rs.rows = [Row.new([1, 112]),
|
147
|
+
Row.new([2, 122])]
|
148
|
+
end
|
149
|
+
|
150
|
+
rs2 = ResultSet.new.tap do |rs|
|
151
|
+
rs.column_info = [Column.new('name5', :type3),
|
152
|
+
Column.new('name6', :type4)]
|
153
|
+
rs.rows = [Row.new([1, 112])]
|
154
|
+
end
|
155
|
+
|
156
|
+
assert_equal 1, (rs1 - rs2).rows.size
|
157
|
+
end
|
158
|
+
|
159
|
+
def test_get_sql
|
160
|
+
rs = @db.select('select id,name,age from users')
|
161
|
+
|
162
|
+
|
163
|
+
# get insert
|
164
|
+
assert_equal "insert into users (id,name,age) values (?,?,?)", rs.get_sql(:insert)
|
165
|
+
# get update
|
166
|
+
assert_equal "update users set name=?,age=? where id=?", rs.get_sql(:update)
|
167
|
+
assert_equal "update users set id=?,name=? where age=?", rs.get_sql(:update, ['age'])
|
168
|
+
# get delete
|
169
|
+
assert_equal "delete from users where id=?", rs.get_sql(:delete, ['id'])
|
170
|
+
end
|
171
|
+
|
172
|
+
def test_handle_delete
|
173
|
+
rs_old = @db.select("select * from users")
|
174
|
+
rs_old.rows.first.status = RowStatus::DELETE
|
175
|
+
|
176
|
+
# delete the first row
|
177
|
+
rs_old.handle_delete!
|
178
|
+
rs_new = @db.select("select * from users")
|
179
|
+
# result set size reduce 1
|
180
|
+
assert_equal rs_old.size, (rs_new.size + 1)
|
181
|
+
end
|
182
|
+
|
183
|
+
def test_handle_update
|
184
|
+
rs = @db.select("select * from users")
|
185
|
+
# update the first row name of rs
|
186
|
+
temp = 'xxxxxxxxxxx'
|
187
|
+
rs.rows.first[1] = temp
|
188
|
+
rs.handle_update!
|
189
|
+
new_rs = @db.select('select * from users')
|
190
|
+
assert_equal new_rs.rows.first[1], temp
|
191
|
+
end
|
192
|
+
|
193
|
+
def test_handle_update2
|
194
|
+
rs = @db.select('select name,age from users')
|
195
|
+
temp = 1000
|
196
|
+
rs.rows.first[1] = temp
|
197
|
+
rs.handle_update!(['name'])
|
198
|
+
new_rs = @db.select('select name,age from users')
|
199
|
+
assert_equal new_rs.rows.first[1], temp
|
200
|
+
end
|
201
|
+
|
202
|
+
def test_handle_insert
|
203
|
+
rs = @db.select('select * from users')
|
204
|
+
old_size = rs.size
|
205
|
+
n_row = Row.new.tap do |row|
|
206
|
+
row.data = [50, 'jiyaping', 25, '1990-08-02']
|
207
|
+
row.status = RowStatus::NEW
|
208
|
+
end
|
209
|
+
rs.rows << n_row
|
210
|
+
rs.handle_insert!
|
211
|
+
|
212
|
+
new_rs = @db.select('select * from users')
|
213
|
+
|
214
|
+
assert_equal new_rs.size, (old_size + 1)
|
215
|
+
assert_equal new_rs.rows.last[1], 'jiyaping'
|
216
|
+
end
|
217
|
+
|
218
|
+
def test_handle_save
|
219
|
+
rs = @db.select('select * from users')
|
220
|
+
rs.rows.first.status = RowStatus::DELETE
|
221
|
+
old_size = rs.size
|
222
|
+
n_row = Row.new.tap do |row|
|
223
|
+
row.data = [50, 'jiyaping', 25, '1990-08-02']
|
224
|
+
row.status = RowStatus::NEW
|
225
|
+
end
|
226
|
+
rs.rows << n_row
|
227
|
+
new_rs = @db.select('select * from users')
|
228
|
+
assert_equal new_rs.size, old_size
|
229
|
+
end
|
230
|
+
|
231
|
+
def test_handle_row
|
232
|
+
rs1 = @db.select('select * from users where id = 1')
|
233
|
+
rs2 = @db.select('select * from users where id in (1,2)')
|
234
|
+
mode = :echo
|
235
|
+
rows = rs1.handle_rows(rs2.rows, mode)
|
236
|
+
assert_equal 3, rows.size
|
237
|
+
new_rows = rows.select do |r|
|
238
|
+
r.status == RowStatus::NEW
|
239
|
+
end
|
240
|
+
|
241
|
+
upd_rows = rows.select do |r|
|
242
|
+
r.status == RowStatus::UPDATED
|
243
|
+
end
|
244
|
+
|
245
|
+
del_rows = rows.select do |r|
|
246
|
+
r.status == RowStatus::DELETE
|
247
|
+
end
|
248
|
+
|
249
|
+
assert_equal 2, new_rows.size
|
250
|
+
assert_equal 0, upd_rows.size
|
251
|
+
assert_equal 1, del_rows.size
|
252
|
+
end
|
253
|
+
|
254
|
+
def test_handle_row2
|
255
|
+
rs1 = @db.select('select id,name,age from users where id = 1')
|
256
|
+
rs2 = @db.select('select id idx,name,age from users where id =2')
|
257
|
+
|
258
|
+
rows = rs1.handle_rows(rs2.rows, [0], [0])
|
259
|
+
assert_equal 1, rows.size
|
260
|
+
new_rows = rows.select do |r|
|
261
|
+
r.status == RowStatus::NEW
|
262
|
+
end
|
263
|
+
|
264
|
+
upd_rows = rows.select do |r|
|
265
|
+
r.status == RowStatus::UPDATED
|
266
|
+
end
|
267
|
+
|
268
|
+
del_rows = rows.select do |r|
|
269
|
+
r.status == RowStatus::DELETE
|
270
|
+
end
|
271
|
+
|
272
|
+
orig_rows = rows.select do |r|
|
273
|
+
r.status == RowStatus::DELETE
|
274
|
+
end
|
275
|
+
|
276
|
+
assert_equal 1, new_rows.size
|
277
|
+
assert_equal 0, upd_rows.size
|
278
|
+
assert_equal 0, del_rows.size
|
279
|
+
assert_equal 0, orig_rows.size
|
280
|
+
end
|
281
|
+
|
282
|
+
def test_migrate_from
|
283
|
+
rs1 = @db.select('select id,name,age from users')
|
284
|
+
old_size = rs1.size
|
285
|
+
rs2 = @db.select('select id idx,name,age from users')
|
286
|
+
|
287
|
+
rs2.rows.first[1] = 'xxxxxxxx'
|
288
|
+
rs2.rows << Row.new.tap do |row|
|
289
|
+
row.status = RowStatus::NEW
|
290
|
+
row.data = [10, 'jiyaping', 25]
|
291
|
+
end
|
292
|
+
|
293
|
+
rs2.rows.delete_at(3)
|
294
|
+
|
295
|
+
rs1.migrate_from(rs2,nil,{:mode=>:echo})
|
296
|
+
|
297
|
+
new_rs = @db.select('select id,name,age from users')
|
298
|
+
assert_equal old_size, (new_rs.size)
|
299
|
+
end
|
300
|
+
end
|