rubyrep 1.2.0 → 2.0.0
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/.gitignore +7 -0
- data/.rspec +2 -0
- data/Gemfile +18 -0
- data/Gemfile.lock +84 -0
- data/History.txt +6 -0
- data/README.txt +1 -1
- data/Rakefile +6 -27
- data/bin/rubyrep +1 -1
- data/config/mysql_config.rb +2 -2
- data/config/postgres_config.rb +5 -3
- data/lib/rubyrep/command_runner.rb +1 -1
- data/lib/rubyrep/connection_extenders/connection_extenders.rb +30 -44
- data/lib/rubyrep/connection_extenders/mysql_extender.rb +23 -1
- data/lib/rubyrep/connection_extenders/postgresql_extender.rb +31 -168
- data/lib/rubyrep/generate_runner.rb +1 -1
- data/lib/rubyrep/logged_change.rb +1 -1
- data/lib/rubyrep/proxy_connection.rb +22 -12
- data/lib/rubyrep/replication_difference.rb +1 -1
- data/lib/rubyrep/replication_extenders/mysql_replication.rb +1 -1
- data/lib/rubyrep/replication_helper.rb +1 -1
- data/lib/rubyrep/replication_runner.rb +10 -0
- data/lib/rubyrep/scan_report_printers/scan_detail_reporter.rb +1 -1
- data/lib/rubyrep/table_spec_resolver.rb +1 -1
- data/lib/rubyrep/type_casting_cursor.rb +8 -4
- data/lib/rubyrep/version.rb +1 -7
- data/lib/rubyrep.rb +4 -3
- data/rubyrep +4 -0
- data/rubyrep.bat +5 -0
- data/rubyrep.gemspec +29 -0
- data/sims/performance/big_rep_spec.rb +34 -17
- data/sims/performance/performance.rake +11 -31
- data/tasks/database.rake +14 -14
- data/tasks/java.rake +18 -5
- data/tasks/rspec.rake +14 -34
- data/tasks/stats.rake +1 -16
- metadata +99 -162
- data/.gemtest +0 -0
- data/config/requirements.rb +0 -32
- data/lib/rubyrep/connection_extenders/jdbc_extender.rb +0 -65
- data/spec/base_runner_spec.rb +0 -218
- data/spec/buffered_committer_spec.rb +0 -274
- data/spec/command_runner_spec.rb +0 -145
- data/spec/committers_spec.rb +0 -178
- data/spec/configuration_spec.rb +0 -203
- data/spec/connection_extender_interface_spec.rb +0 -141
- data/spec/connection_extenders_registration_spec.rb +0 -164
- data/spec/database_proxy_spec.rb +0 -48
- data/spec/database_rake_spec.rb +0 -40
- data/spec/db_specific_connection_extenders_spec.rb +0 -34
- data/spec/db_specific_replication_extenders_spec.rb +0 -38
- data/spec/direct_table_scan_spec.rb +0 -61
- data/spec/dolphins.jpg +0 -0
- data/spec/generate_runner_spec.rb +0 -84
- data/spec/initializer_spec.rb +0 -46
- data/spec/log_helper_spec.rb +0 -39
- data/spec/logged_change_loader_spec.rb +0 -68
- data/spec/logged_change_spec.rb +0 -470
- data/spec/noisy_connection_spec.rb +0 -78
- data/spec/postgresql_replication_spec.rb +0 -48
- data/spec/postgresql_schema_support_spec.rb +0 -212
- data/spec/postgresql_support_spec.rb +0 -63
- data/spec/progress_bar_spec.rb +0 -77
- data/spec/proxied_table_scan_spec.rb +0 -151
- data/spec/proxy_block_cursor_spec.rb +0 -197
- data/spec/proxy_connection_spec.rb +0 -423
- data/spec/proxy_cursor_spec.rb +0 -56
- data/spec/proxy_row_cursor_spec.rb +0 -66
- data/spec/proxy_runner_spec.rb +0 -70
- data/spec/replication_difference_spec.rb +0 -161
- data/spec/replication_extender_interface_spec.rb +0 -367
- data/spec/replication_extenders_spec.rb +0 -32
- data/spec/replication_helper_spec.rb +0 -178
- data/spec/replication_initializer_spec.rb +0 -509
- data/spec/replication_run_spec.rb +0 -443
- data/spec/replication_runner_spec.rb +0 -254
- data/spec/replicators_spec.rb +0 -36
- data/spec/rubyrep_spec.rb +0 -8
- data/spec/scan_detail_reporter_spec.rb +0 -119
- data/spec/scan_progress_printers_spec.rb +0 -68
- data/spec/scan_report_printers_spec.rb +0 -67
- data/spec/scan_runner_spec.rb +0 -50
- data/spec/scan_summary_reporter_spec.rb +0 -61
- data/spec/session_spec.rb +0 -253
- data/spec/spec.opts +0 -1
- data/spec/spec_helper.rb +0 -305
- data/spec/strange_name_support_spec.rb +0 -135
- data/spec/sync_helper_spec.rb +0 -169
- data/spec/sync_runner_spec.rb +0 -78
- data/spec/syncers_spec.rb +0 -171
- data/spec/table_scan_helper_spec.rb +0 -36
- data/spec/table_scan_spec.rb +0 -49
- data/spec/table_sorter_spec.rb +0 -30
- data/spec/table_spec_resolver_spec.rb +0 -111
- data/spec/table_sync_spec.rb +0 -140
- data/spec/task_sweeper_spec.rb +0 -47
- data/spec/trigger_mode_switcher_spec.rb +0 -83
- data/spec/two_way_replicator_spec.rb +0 -721
- data/spec/two_way_syncer_spec.rb +0 -256
- data/spec/type_casting_cursor_spec.rb +0 -50
- data/spec/uninstall_runner_spec.rb +0 -93
- data/tasks/rubyrep.tailor +0 -18
- data/tasks/website.rake +0 -19
data/spec/logged_change_spec.rb
DELETED
|
@@ -1,470 +0,0 @@
|
|
|
1
|
-
require File.dirname(__FILE__) + '/spec_helper.rb'
|
|
2
|
-
|
|
3
|
-
include RR
|
|
4
|
-
|
|
5
|
-
describe LoggedChange do
|
|
6
|
-
before(:each) do
|
|
7
|
-
Initializer.configuration = standard_config
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
it "initialize should store session and database" do
|
|
11
|
-
session = Session.new
|
|
12
|
-
loader = LoggedChangeLoader.new session, :left
|
|
13
|
-
change = LoggedChange.new loader
|
|
14
|
-
change.session.should == session
|
|
15
|
-
change.database.should == :left
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
it "load_specified should load the specified change" do
|
|
19
|
-
session = Session.new
|
|
20
|
-
session.left.begin_db_transaction
|
|
21
|
-
begin
|
|
22
|
-
session.left.insert_record 'rr_pending_changes', {
|
|
23
|
-
'change_table' => 'left_table',
|
|
24
|
-
'change_key' => 'id|1',
|
|
25
|
-
'change_type' => 'I',
|
|
26
|
-
'change_time' => Time.now
|
|
27
|
-
}
|
|
28
|
-
session.left.insert_record 'rr_pending_changes', {
|
|
29
|
-
'change_table' => 'right_table',
|
|
30
|
-
'change_key' => 'id|2',
|
|
31
|
-
'change_new_key' => 'id|2',
|
|
32
|
-
'change_type' => 'U',
|
|
33
|
-
'change_time' => Time.now
|
|
34
|
-
}
|
|
35
|
-
session.left.insert_record 'rr_pending_changes', {
|
|
36
|
-
'change_table' => 'left_table',
|
|
37
|
-
'change_key' => 'id|2',
|
|
38
|
-
'change_type' => 'I',
|
|
39
|
-
'change_time' => Time.now
|
|
40
|
-
}
|
|
41
|
-
loader = LoggedChangeLoader.new session, :left
|
|
42
|
-
change = LoggedChange.new loader
|
|
43
|
-
change.load_specified 'left_table', {'id' => '2'}
|
|
44
|
-
|
|
45
|
-
change.table.should == 'left_table'
|
|
46
|
-
change.type.should == :insert
|
|
47
|
-
change.key.should == {'id' => '2'}
|
|
48
|
-
ensure
|
|
49
|
-
session.left.rollback_db_transaction
|
|
50
|
-
end
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
it "load_specified should accept a column_name => value hash as key" do
|
|
54
|
-
config = deep_copy(standard_config)
|
|
55
|
-
config.included_table_specs.clear
|
|
56
|
-
config.include_tables "scanner_records", :key => ['id1', 'id2']
|
|
57
|
-
|
|
58
|
-
session = Session.new config
|
|
59
|
-
session.left.begin_db_transaction
|
|
60
|
-
begin
|
|
61
|
-
session.left.insert_record 'rr_pending_changes', {
|
|
62
|
-
'change_table' => 'scanner_records',
|
|
63
|
-
'change_key' => 'id1|1|id2|2',
|
|
64
|
-
'change_type' => 'I',
|
|
65
|
-
'change_time' => Time.now
|
|
66
|
-
}
|
|
67
|
-
loader = LoggedChangeLoader.new session, :left
|
|
68
|
-
change = LoggedChange.new loader
|
|
69
|
-
change.load_specified 'scanner_records', {'id1' => 1, 'id2' => 2}
|
|
70
|
-
|
|
71
|
-
change.table.should == 'scanner_records'
|
|
72
|
-
change.type.should == :insert
|
|
73
|
-
change.key.should == {'id1' => '1', 'id2' => '2'}
|
|
74
|
-
ensure
|
|
75
|
-
session.left.rollback_db_transaction
|
|
76
|
-
end
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
it "load_specified should delete loaded changes from the database" do
|
|
80
|
-
session = Session.new
|
|
81
|
-
session.left.begin_db_transaction
|
|
82
|
-
begin
|
|
83
|
-
session.left.insert_record 'rr_pending_changes', {
|
|
84
|
-
'change_table' => 'left_table',
|
|
85
|
-
'change_key' => 'id|1',
|
|
86
|
-
'change_type' => 'I',
|
|
87
|
-
'change_time' => Time.now
|
|
88
|
-
}
|
|
89
|
-
loader = LoggedChangeLoader.new session, :left
|
|
90
|
-
change = LoggedChange.new loader
|
|
91
|
-
change.load_specified 'left_table', {'id' => 1}
|
|
92
|
-
|
|
93
|
-
session.left.
|
|
94
|
-
select_one("select * from rr_pending_changes where change_key = 'id|1'").
|
|
95
|
-
should be_nil
|
|
96
|
-
ensure
|
|
97
|
-
session.left.rollback_db_transaction
|
|
98
|
-
end
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
it "load_specified should set first_change_at and last_changed_at correctly" do
|
|
102
|
-
session = Session.new
|
|
103
|
-
session.left.begin_db_transaction
|
|
104
|
-
begin
|
|
105
|
-
t1 = 5.seconds.ago
|
|
106
|
-
t2 = 5.seconds.from_now
|
|
107
|
-
session.left.insert_record 'rr_pending_changes', {
|
|
108
|
-
'change_table' => 'left_table',
|
|
109
|
-
'change_key' => 'id|1',
|
|
110
|
-
'change_type' => 'I',
|
|
111
|
-
'change_time' => t1
|
|
112
|
-
}
|
|
113
|
-
session.left.insert_record 'rr_pending_changes', {
|
|
114
|
-
'change_table' => 'left_table',
|
|
115
|
-
'change_key' => 'id|1',
|
|
116
|
-
'change_new_key' => 'id|1',
|
|
117
|
-
'change_type' => 'U',
|
|
118
|
-
'change_time' => t2
|
|
119
|
-
}
|
|
120
|
-
loader = LoggedChangeLoader.new session, :left
|
|
121
|
-
change = LoggedChange.new loader
|
|
122
|
-
change.load_specified 'left_table', {'id' => 1}
|
|
123
|
-
|
|
124
|
-
(change.first_changed_at - t1).abs.should < 1
|
|
125
|
-
(change.last_changed_at - t2).abs.should < 1
|
|
126
|
-
ensure
|
|
127
|
-
session.left.rollback_db_transaction
|
|
128
|
-
end
|
|
129
|
-
end
|
|
130
|
-
|
|
131
|
-
it "load_specified should follow primary key updates correctly" do
|
|
132
|
-
session = Session.new
|
|
133
|
-
session.left.begin_db_transaction
|
|
134
|
-
begin
|
|
135
|
-
session.left.insert_record 'rr_pending_changes', {
|
|
136
|
-
'change_table' => 'left_table',
|
|
137
|
-
'change_key' => 'id|1',
|
|
138
|
-
'change_new_key' => 'id|2',
|
|
139
|
-
'change_type' => 'U',
|
|
140
|
-
'change_time' => Time.now
|
|
141
|
-
}
|
|
142
|
-
session.left.insert_record 'rr_pending_changes', {
|
|
143
|
-
'change_table' => 'left_table',
|
|
144
|
-
'change_key' => 'id|2',
|
|
145
|
-
'change_new_key' => 'id|3',
|
|
146
|
-
'change_type' => 'U',
|
|
147
|
-
'change_time' => Time.now
|
|
148
|
-
}
|
|
149
|
-
loader = LoggedChangeLoader.new session, :left
|
|
150
|
-
change = LoggedChange.new loader
|
|
151
|
-
change.load_specified 'left_table', {'id' => 1}
|
|
152
|
-
|
|
153
|
-
change.type.should == :update
|
|
154
|
-
change.key.should == {'id' => 1}
|
|
155
|
-
change.new_key.should == {'id' => '3'}
|
|
156
|
-
ensure
|
|
157
|
-
session.left.rollback_db_transaction
|
|
158
|
-
end
|
|
159
|
-
end
|
|
160
|
-
|
|
161
|
-
it "load_specified should recognize if changes cancel each other out" do
|
|
162
|
-
session = Session.new
|
|
163
|
-
session.left.begin_db_transaction
|
|
164
|
-
begin
|
|
165
|
-
session.left.insert_record 'rr_pending_changes', {
|
|
166
|
-
'change_table' => 'left_table',
|
|
167
|
-
'change_key' => 'id|1',
|
|
168
|
-
'change_type' => 'I',
|
|
169
|
-
'change_time' => Time.now
|
|
170
|
-
}
|
|
171
|
-
session.left.insert_record 'rr_pending_changes', {
|
|
172
|
-
'change_table' => 'left_table',
|
|
173
|
-
'change_key' => 'id|1',
|
|
174
|
-
'change_new_key' => 'id|2',
|
|
175
|
-
'change_type' => 'U',
|
|
176
|
-
'change_time' => Time.now
|
|
177
|
-
}
|
|
178
|
-
session.left.insert_record 'rr_pending_changes', {
|
|
179
|
-
'change_table' => 'left_table',
|
|
180
|
-
'change_key' => 'id|2',
|
|
181
|
-
'change_type' => 'D',
|
|
182
|
-
'change_time' => Time.now
|
|
183
|
-
}
|
|
184
|
-
loader = LoggedChangeLoader.new session, :left
|
|
185
|
-
change = LoggedChange.new loader
|
|
186
|
-
change.load_specified 'left_table', {'id' => '1'}
|
|
187
|
-
|
|
188
|
-
change.type.should == :no_change
|
|
189
|
-
ensure
|
|
190
|
-
session.left.rollback_db_transaction
|
|
191
|
-
end
|
|
192
|
-
end
|
|
193
|
-
|
|
194
|
-
it "load_specified should transist states correctly" do
|
|
195
|
-
session = Session.new
|
|
196
|
-
session.left.begin_db_transaction
|
|
197
|
-
begin
|
|
198
|
-
|
|
199
|
-
# first test case
|
|
200
|
-
session.left.insert_record 'rr_pending_changes', {
|
|
201
|
-
'change_table' => 'left_table',
|
|
202
|
-
'change_key' => 'id|1',
|
|
203
|
-
'change_type' => 'I',
|
|
204
|
-
'change_time' => Time.now
|
|
205
|
-
}
|
|
206
|
-
session.left.insert_record 'rr_pending_changes', {
|
|
207
|
-
'change_table' => 'left_table',
|
|
208
|
-
'change_key' => 'id|1',
|
|
209
|
-
'change_type' => 'D',
|
|
210
|
-
'change_time' => Time.now
|
|
211
|
-
}
|
|
212
|
-
session.left.insert_record 'rr_pending_changes', {
|
|
213
|
-
'change_table' => 'left_table',
|
|
214
|
-
'change_key' => 'id|1',
|
|
215
|
-
'change_type' => 'I',
|
|
216
|
-
'change_time' => Time.now
|
|
217
|
-
}
|
|
218
|
-
session.left.insert_record 'rr_pending_changes', {
|
|
219
|
-
'change_table' => 'left_table',
|
|
220
|
-
'change_key' => 'id|1',
|
|
221
|
-
'change_new_key' => 'id|2',
|
|
222
|
-
'change_type' => 'U',
|
|
223
|
-
'change_time' => Time.now
|
|
224
|
-
}
|
|
225
|
-
loader = LoggedChangeLoader.new session, :left
|
|
226
|
-
change = LoggedChange.new loader
|
|
227
|
-
change.load_specified 'left_table', {'id' => '1'}
|
|
228
|
-
change.type.should == :insert
|
|
229
|
-
change.key.should == {'id' => '2'}
|
|
230
|
-
|
|
231
|
-
# second test case
|
|
232
|
-
session.left.insert_record 'rr_pending_changes', {
|
|
233
|
-
'change_table' => 'left_table',
|
|
234
|
-
'change_key' => 'id|5',
|
|
235
|
-
'change_type' => 'D',
|
|
236
|
-
'change_time' => Time.now
|
|
237
|
-
}
|
|
238
|
-
session.left.insert_record 'rr_pending_changes', {
|
|
239
|
-
'change_table' => 'left_table',
|
|
240
|
-
'change_key' => 'id|5',
|
|
241
|
-
'change_type' => 'I',
|
|
242
|
-
'change_time' => Time.now
|
|
243
|
-
}
|
|
244
|
-
loader.update :forced => true
|
|
245
|
-
change = LoggedChange.new loader
|
|
246
|
-
change.load_specified 'left_table', {'id' => '5'}
|
|
247
|
-
change.type.should == :update
|
|
248
|
-
change.key.should == {'id' => '5'}
|
|
249
|
-
change.new_key.should == {'id' => '5'}
|
|
250
|
-
ensure
|
|
251
|
-
session.left.rollback_db_transaction
|
|
252
|
-
end
|
|
253
|
-
end
|
|
254
|
-
|
|
255
|
-
it "amend should work if there were no changes" do
|
|
256
|
-
session = Session.new
|
|
257
|
-
session.left.begin_db_transaction
|
|
258
|
-
begin
|
|
259
|
-
session.left.insert_record 'rr_pending_changes', {
|
|
260
|
-
'change_table' => 'scanner_records',
|
|
261
|
-
'change_key' => 'id|1',
|
|
262
|
-
'change_type' => 'I',
|
|
263
|
-
'change_time' => Time.now
|
|
264
|
-
}
|
|
265
|
-
loader = LoggedChangeLoader.new session, :left
|
|
266
|
-
change = LoggedChange.new loader
|
|
267
|
-
change.load_specified 'scanner_records', {'id' => '1'}
|
|
268
|
-
|
|
269
|
-
change.table.should == 'scanner_records'
|
|
270
|
-
change.type.should == :insert
|
|
271
|
-
change.key.should == {'id' => '1'}
|
|
272
|
-
|
|
273
|
-
change.load
|
|
274
|
-
|
|
275
|
-
change.table.should == 'scanner_records'
|
|
276
|
-
change.type.should == :insert
|
|
277
|
-
change.key.should == {'id' => '1'}
|
|
278
|
-
ensure
|
|
279
|
-
session.left.rollback_db_transaction
|
|
280
|
-
end
|
|
281
|
-
end
|
|
282
|
-
|
|
283
|
-
it "amend should work if the current type is :no_change" do
|
|
284
|
-
session = Session.new
|
|
285
|
-
session.left.begin_db_transaction
|
|
286
|
-
begin
|
|
287
|
-
loader = LoggedChangeLoader.new session, :left
|
|
288
|
-
change = LoggedChange.new loader
|
|
289
|
-
change.load_specified 'scanner_records', {'id' => '1'}
|
|
290
|
-
|
|
291
|
-
change.table.should == 'scanner_records'
|
|
292
|
-
change.type.should == :no_change
|
|
293
|
-
change.key.should == {'id' => '1'}
|
|
294
|
-
|
|
295
|
-
change.load
|
|
296
|
-
|
|
297
|
-
change.table.should == 'scanner_records'
|
|
298
|
-
change.type.should == :no_change
|
|
299
|
-
change.key.should == {'id' => '1'}
|
|
300
|
-
ensure
|
|
301
|
-
session.left.rollback_db_transaction
|
|
302
|
-
end
|
|
303
|
-
end
|
|
304
|
-
|
|
305
|
-
it "amend should amend the change correctly" do
|
|
306
|
-
session = Session.new
|
|
307
|
-
session.left.begin_db_transaction
|
|
308
|
-
begin
|
|
309
|
-
session.left.insert_record 'left_table', {
|
|
310
|
-
:id => '1',
|
|
311
|
-
:name => 'bla'
|
|
312
|
-
}
|
|
313
|
-
session.left.insert_record 'rr_pending_changes', {
|
|
314
|
-
'change_table' => 'left_table',
|
|
315
|
-
'change_key' => 'id|1',
|
|
316
|
-
'change_new_key' => 'id|1',
|
|
317
|
-
'change_type' => 'U',
|
|
318
|
-
'change_time' => Time.now
|
|
319
|
-
}
|
|
320
|
-
loader = LoggedChangeLoader.new session, :left
|
|
321
|
-
change = LoggedChange.new loader
|
|
322
|
-
change.load_specified 'left_table', {'id' => '1'}
|
|
323
|
-
session.left.insert_record 'rr_pending_changes', {
|
|
324
|
-
'change_table' => 'left_table',
|
|
325
|
-
'change_key' => 'id|1',
|
|
326
|
-
'change_type' => 'D',
|
|
327
|
-
'change_time' => Time.now
|
|
328
|
-
}
|
|
329
|
-
loader.update :forced => true
|
|
330
|
-
change.load
|
|
331
|
-
|
|
332
|
-
change.table.should == 'left_table'
|
|
333
|
-
change.type.should == :delete
|
|
334
|
-
change.key.should == {'id' => '1'}
|
|
335
|
-
ensure
|
|
336
|
-
session.left.rollback_db_transaction
|
|
337
|
-
end
|
|
338
|
-
end
|
|
339
|
-
|
|
340
|
-
it "amend should support primary key updates" do
|
|
341
|
-
session = Session.new
|
|
342
|
-
session.left.begin_db_transaction
|
|
343
|
-
begin
|
|
344
|
-
session.left.insert_record 'left_table', {
|
|
345
|
-
:id => '1',
|
|
346
|
-
:name => 'bla'
|
|
347
|
-
}
|
|
348
|
-
session.left.insert_record 'rr_pending_changes', {
|
|
349
|
-
'change_table' => 'left_table',
|
|
350
|
-
'change_key' => 'id|1',
|
|
351
|
-
'change_new_key' => 'id|2',
|
|
352
|
-
'change_type' => 'U',
|
|
353
|
-
'change_time' => Time.now
|
|
354
|
-
}
|
|
355
|
-
loader = LoggedChangeLoader.new session, :left
|
|
356
|
-
change = LoggedChange.new loader
|
|
357
|
-
change.load_specified 'left_table', {'id' => '1'}
|
|
358
|
-
session.left.insert_record 'rr_pending_changes', {
|
|
359
|
-
'change_table' => 'left_table',
|
|
360
|
-
'change_key' => 'id|2',
|
|
361
|
-
'change_new_key' => 'id|3',
|
|
362
|
-
'change_type' => 'U',
|
|
363
|
-
'change_time' => Time.now
|
|
364
|
-
}
|
|
365
|
-
loader.update :forced => true
|
|
366
|
-
change.load
|
|
367
|
-
|
|
368
|
-
change.table.should == 'left_table'
|
|
369
|
-
change.type.should == :update
|
|
370
|
-
change.key.should == {'id' => '1'}
|
|
371
|
-
change.new_key.should == {'id' => '3'}
|
|
372
|
-
ensure
|
|
373
|
-
session.left.rollback_db_transaction
|
|
374
|
-
end
|
|
375
|
-
end
|
|
376
|
-
|
|
377
|
-
it "key_from_raw_key should return the correct column_name => value hash for the given key" do
|
|
378
|
-
loader = LoggedChangeLoader.new Session.new, :left
|
|
379
|
-
change = LoggedChange.new loader
|
|
380
|
-
change.key_to_hash("a|1|b|2").should == {
|
|
381
|
-
'a' => '1',
|
|
382
|
-
'b' => '2'
|
|
383
|
-
}
|
|
384
|
-
end
|
|
385
|
-
|
|
386
|
-
it "key_from_raw_key should work with multi character key_sep strings" do
|
|
387
|
-
loader = LoggedChangeLoader.new Session.new, :left
|
|
388
|
-
change = LoggedChange.new loader
|
|
389
|
-
change.stub!(:key_sep).and_return('BLA')
|
|
390
|
-
change.key_to_hash("aBLA1BLAbBLA2").should == {
|
|
391
|
-
'a' => '1',
|
|
392
|
-
'b' => '2'
|
|
393
|
-
}
|
|
394
|
-
end
|
|
395
|
-
|
|
396
|
-
it "load_oldest should not load a change if none available" do
|
|
397
|
-
loader = LoggedChangeLoader.new Session.new, :left
|
|
398
|
-
change = LoggedChange.new loader
|
|
399
|
-
change.should_not_receive :load_specified
|
|
400
|
-
change.load_oldest
|
|
401
|
-
end
|
|
402
|
-
|
|
403
|
-
it "load_oldest should load the oldest available change" do
|
|
404
|
-
session = Session.new
|
|
405
|
-
session.left.begin_db_transaction
|
|
406
|
-
begin
|
|
407
|
-
session.left.insert_record 'rr_pending_changes', {
|
|
408
|
-
'change_table' => 'left_table',
|
|
409
|
-
'change_key' => 'id|1',
|
|
410
|
-
'change_type' => 'I',
|
|
411
|
-
'change_time' => Time.now
|
|
412
|
-
}
|
|
413
|
-
session.left.insert_record 'rr_pending_changes', {
|
|
414
|
-
'change_table' => 'left_table',
|
|
415
|
-
'change_key' => 'id|2',
|
|
416
|
-
'change_type' => 'I',
|
|
417
|
-
'change_time' => Time.now
|
|
418
|
-
}
|
|
419
|
-
loader = LoggedChangeLoader.new session, :left
|
|
420
|
-
change = LoggedChange.new loader
|
|
421
|
-
change.load_oldest
|
|
422
|
-
|
|
423
|
-
change.key.should == {'id' => '1'}
|
|
424
|
-
ensure
|
|
425
|
-
session.left.rollback_db_transaction
|
|
426
|
-
end
|
|
427
|
-
end
|
|
428
|
-
|
|
429
|
-
it "load_oldest should skip irrelevant changes" do
|
|
430
|
-
session = Session.new
|
|
431
|
-
session.left.begin_db_transaction
|
|
432
|
-
begin
|
|
433
|
-
session.left.insert_record 'rr_pending_changes', {
|
|
434
|
-
'change_table' => 'left_table',
|
|
435
|
-
'change_key' => 'id|1',
|
|
436
|
-
'change_type' => 'I',
|
|
437
|
-
'change_time' => Time.now
|
|
438
|
-
}
|
|
439
|
-
session.left.insert_record 'rr_pending_changes', {
|
|
440
|
-
'change_table' => 'left_table',
|
|
441
|
-
'change_key' => 'id|1',
|
|
442
|
-
'change_type' => 'D',
|
|
443
|
-
'change_time' => Time.now
|
|
444
|
-
}
|
|
445
|
-
session.left.insert_record 'rr_pending_changes', {
|
|
446
|
-
'change_table' => 'left_table',
|
|
447
|
-
'change_key' => 'id|2',
|
|
448
|
-
'change_type' => 'I',
|
|
449
|
-
'change_time' => Time.now
|
|
450
|
-
}
|
|
451
|
-
loader = LoggedChangeLoader.new session, :left
|
|
452
|
-
change = LoggedChange.new loader
|
|
453
|
-
change.load_oldest
|
|
454
|
-
|
|
455
|
-
change.type.should == :insert
|
|
456
|
-
change.key.should == {'id' => '2'}
|
|
457
|
-
ensure
|
|
458
|
-
session.left.rollback_db_transaction
|
|
459
|
-
end
|
|
460
|
-
end
|
|
461
|
-
|
|
462
|
-
it "to_yaml should blank out session and loader" do
|
|
463
|
-
session = Session.new
|
|
464
|
-
loader = LoggedChangeLoader.new session, :left
|
|
465
|
-
change = LoggedChange.new loader
|
|
466
|
-
yaml = change.to_yaml
|
|
467
|
-
yaml.should_not =~ /session/
|
|
468
|
-
yaml.should_not =~ /loader/
|
|
469
|
-
end
|
|
470
|
-
end
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
require File.dirname(__FILE__) + '/spec_helper.rb'
|
|
2
|
-
|
|
3
|
-
include RR
|
|
4
|
-
|
|
5
|
-
describe NoisyConnection do
|
|
6
|
-
before(:each) do
|
|
7
|
-
Initializer.configuration = proxied_config
|
|
8
|
-
@connection = ProxyConnection.new Initializer.configuration.left
|
|
9
|
-
@connection.send(:extend, NoisyConnection)
|
|
10
|
-
@connection.sweeper = TaskSweeper.new(1)
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
it "select_cursor should return correct results" do
|
|
14
|
-
@connection.sweeper.should_receive(:ping).exactly(4).times
|
|
15
|
-
@connection.select_record(:table => 'scanner_records').should == {
|
|
16
|
-
'id' => 1,
|
|
17
|
-
'name' => 'Alice - exists in both databases'
|
|
18
|
-
}
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
it "insert_record should write nil values correctly" do
|
|
22
|
-
@connection.sweeper.should_receive(:ping).exactly(2).times
|
|
23
|
-
@connection.begin_db_transaction
|
|
24
|
-
begin
|
|
25
|
-
@connection.insert_record('extender_combined_key', 'first_id' => 8, 'second_id' => '9', 'name' => nil)
|
|
26
|
-
@connection.select_one(
|
|
27
|
-
"select name from extender_combined_key where (first_id, second_id) = (8, 9)"
|
|
28
|
-
).should == {"name" => nil}
|
|
29
|
-
ensure
|
|
30
|
-
@connection.rollback_db_transaction
|
|
31
|
-
end
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
it "update_record should update the specified record" do
|
|
35
|
-
@connection.sweeper.should_receive(:ping).exactly(2).times
|
|
36
|
-
@connection.begin_db_transaction
|
|
37
|
-
begin
|
|
38
|
-
@connection.update_record('scanner_records', 'id' => 1, 'name' => 'update_test')
|
|
39
|
-
@connection.select_one(
|
|
40
|
-
"select name from scanner_records where id = 1"
|
|
41
|
-
).should == {'name' => 'update_test'}
|
|
42
|
-
ensure
|
|
43
|
-
@connection.rollback_db_transaction
|
|
44
|
-
end
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
it "delete_record should delete the specified record" do
|
|
48
|
-
@connection.sweeper.should_receive(:ping).exactly(2).times
|
|
49
|
-
@connection.begin_db_transaction
|
|
50
|
-
begin
|
|
51
|
-
@connection.delete_record('extender_combined_key', 'first_id' => 1, 'second_id' => '1', 'name' => 'xy')
|
|
52
|
-
@connection.select_one(
|
|
53
|
-
"select first_id, second_id, name
|
|
54
|
-
from extender_combined_key where (first_id, second_id) = (1, 1)") \
|
|
55
|
-
.should be_nil
|
|
56
|
-
ensure
|
|
57
|
-
@connection.rollback_db_transaction
|
|
58
|
-
end
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
it "commit_db_transaction should update TaskSweeper" do
|
|
62
|
-
@connection.begin_db_transaction
|
|
63
|
-
initializer = ReplicationInitializer.new Session.new(standard_config)
|
|
64
|
-
begin
|
|
65
|
-
@connection.execute "insert into scanner_records(id,name) values(99, 'bla')"
|
|
66
|
-
@connection.sweeper.should_receive(:ping).exactly(2).times
|
|
67
|
-
@connection.commit_db_transaction
|
|
68
|
-
initializer.silence_ddl_notices(:left) do # avoid PostgreSQL warning that no transaction is open
|
|
69
|
-
@connection.rollback_db_transaction
|
|
70
|
-
end
|
|
71
|
-
@connection.select_one("select name from scanner_records where id = 99")['name'].
|
|
72
|
-
should == 'bla'
|
|
73
|
-
ensure
|
|
74
|
-
@connection.execute "delete from scanner_records where id = 99"
|
|
75
|
-
end
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
end
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
require File.dirname(__FILE__) + '/spec_helper.rb'
|
|
2
|
-
require 'yaml'
|
|
3
|
-
require 'config/test_config.rb'
|
|
4
|
-
|
|
5
|
-
include RR
|
|
6
|
-
|
|
7
|
-
describe "PostgreSQLReplication", :shared => true do
|
|
8
|
-
before(:each) do
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
it "create_replication_trigger should also work if language plpgsql does not yet exist" do
|
|
12
|
-
session = nil
|
|
13
|
-
begin
|
|
14
|
-
session = Session.new
|
|
15
|
-
session.left.begin_db_transaction
|
|
16
|
-
unless session.left.select_all("select lanname from pg_language where lanname = 'plpgsql'").empty?
|
|
17
|
-
session.left.execute "DROP LANGUAGE plpgsql"
|
|
18
|
-
end
|
|
19
|
-
params = {
|
|
20
|
-
:trigger_name => 'rr_trigger_test',
|
|
21
|
-
:table => 'trigger_test',
|
|
22
|
-
:keys => ['first_id', 'second_id'],
|
|
23
|
-
:log_table => 'rr_pending_changes',
|
|
24
|
-
:key_sep => '|',
|
|
25
|
-
:exclude_rr_activity => false,
|
|
26
|
-
}
|
|
27
|
-
session.left.create_replication_trigger params
|
|
28
|
-
session.left.insert_record 'trigger_test', {
|
|
29
|
-
'first_id' => 1,
|
|
30
|
-
'second_id' => 2,
|
|
31
|
-
'name' => 'bla'
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
row = session.left.select_one("select * from rr_pending_changes")
|
|
35
|
-
row.delete 'id'
|
|
36
|
-
row.delete 'change_time'
|
|
37
|
-
row.should == {
|
|
38
|
-
'change_table' => 'trigger_test',
|
|
39
|
-
'change_key' => 'first_id|1|second_id|2',
|
|
40
|
-
'change_new_key' => nil,
|
|
41
|
-
'change_type' => 'I'
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
ensure
|
|
45
|
-
session.left.rollback_db_transaction if session
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
end
|