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.
Files changed (103) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +7 -0
  3. data/.rspec +2 -0
  4. data/Gemfile +18 -0
  5. data/Gemfile.lock +84 -0
  6. data/History.txt +6 -0
  7. data/README.txt +1 -1
  8. data/Rakefile +6 -27
  9. data/bin/rubyrep +1 -1
  10. data/config/mysql_config.rb +2 -2
  11. data/config/postgres_config.rb +5 -3
  12. data/lib/rubyrep/command_runner.rb +1 -1
  13. data/lib/rubyrep/connection_extenders/connection_extenders.rb +30 -44
  14. data/lib/rubyrep/connection_extenders/mysql_extender.rb +23 -1
  15. data/lib/rubyrep/connection_extenders/postgresql_extender.rb +31 -168
  16. data/lib/rubyrep/generate_runner.rb +1 -1
  17. data/lib/rubyrep/logged_change.rb +1 -1
  18. data/lib/rubyrep/proxy_connection.rb +22 -12
  19. data/lib/rubyrep/replication_difference.rb +1 -1
  20. data/lib/rubyrep/replication_extenders/mysql_replication.rb +1 -1
  21. data/lib/rubyrep/replication_helper.rb +1 -1
  22. data/lib/rubyrep/replication_runner.rb +10 -0
  23. data/lib/rubyrep/scan_report_printers/scan_detail_reporter.rb +1 -1
  24. data/lib/rubyrep/table_spec_resolver.rb +1 -1
  25. data/lib/rubyrep/type_casting_cursor.rb +8 -4
  26. data/lib/rubyrep/version.rb +1 -7
  27. data/lib/rubyrep.rb +4 -3
  28. data/rubyrep +4 -0
  29. data/rubyrep.bat +5 -0
  30. data/rubyrep.gemspec +29 -0
  31. data/sims/performance/big_rep_spec.rb +34 -17
  32. data/sims/performance/performance.rake +11 -31
  33. data/tasks/database.rake +14 -14
  34. data/tasks/java.rake +18 -5
  35. data/tasks/rspec.rake +14 -34
  36. data/tasks/stats.rake +1 -16
  37. metadata +99 -162
  38. data/.gemtest +0 -0
  39. data/config/requirements.rb +0 -32
  40. data/lib/rubyrep/connection_extenders/jdbc_extender.rb +0 -65
  41. data/spec/base_runner_spec.rb +0 -218
  42. data/spec/buffered_committer_spec.rb +0 -274
  43. data/spec/command_runner_spec.rb +0 -145
  44. data/spec/committers_spec.rb +0 -178
  45. data/spec/configuration_spec.rb +0 -203
  46. data/spec/connection_extender_interface_spec.rb +0 -141
  47. data/spec/connection_extenders_registration_spec.rb +0 -164
  48. data/spec/database_proxy_spec.rb +0 -48
  49. data/spec/database_rake_spec.rb +0 -40
  50. data/spec/db_specific_connection_extenders_spec.rb +0 -34
  51. data/spec/db_specific_replication_extenders_spec.rb +0 -38
  52. data/spec/direct_table_scan_spec.rb +0 -61
  53. data/spec/dolphins.jpg +0 -0
  54. data/spec/generate_runner_spec.rb +0 -84
  55. data/spec/initializer_spec.rb +0 -46
  56. data/spec/log_helper_spec.rb +0 -39
  57. data/spec/logged_change_loader_spec.rb +0 -68
  58. data/spec/logged_change_spec.rb +0 -470
  59. data/spec/noisy_connection_spec.rb +0 -78
  60. data/spec/postgresql_replication_spec.rb +0 -48
  61. data/spec/postgresql_schema_support_spec.rb +0 -212
  62. data/spec/postgresql_support_spec.rb +0 -63
  63. data/spec/progress_bar_spec.rb +0 -77
  64. data/spec/proxied_table_scan_spec.rb +0 -151
  65. data/spec/proxy_block_cursor_spec.rb +0 -197
  66. data/spec/proxy_connection_spec.rb +0 -423
  67. data/spec/proxy_cursor_spec.rb +0 -56
  68. data/spec/proxy_row_cursor_spec.rb +0 -66
  69. data/spec/proxy_runner_spec.rb +0 -70
  70. data/spec/replication_difference_spec.rb +0 -161
  71. data/spec/replication_extender_interface_spec.rb +0 -367
  72. data/spec/replication_extenders_spec.rb +0 -32
  73. data/spec/replication_helper_spec.rb +0 -178
  74. data/spec/replication_initializer_spec.rb +0 -509
  75. data/spec/replication_run_spec.rb +0 -443
  76. data/spec/replication_runner_spec.rb +0 -254
  77. data/spec/replicators_spec.rb +0 -36
  78. data/spec/rubyrep_spec.rb +0 -8
  79. data/spec/scan_detail_reporter_spec.rb +0 -119
  80. data/spec/scan_progress_printers_spec.rb +0 -68
  81. data/spec/scan_report_printers_spec.rb +0 -67
  82. data/spec/scan_runner_spec.rb +0 -50
  83. data/spec/scan_summary_reporter_spec.rb +0 -61
  84. data/spec/session_spec.rb +0 -253
  85. data/spec/spec.opts +0 -1
  86. data/spec/spec_helper.rb +0 -305
  87. data/spec/strange_name_support_spec.rb +0 -135
  88. data/spec/sync_helper_spec.rb +0 -169
  89. data/spec/sync_runner_spec.rb +0 -78
  90. data/spec/syncers_spec.rb +0 -171
  91. data/spec/table_scan_helper_spec.rb +0 -36
  92. data/spec/table_scan_spec.rb +0 -49
  93. data/spec/table_sorter_spec.rb +0 -30
  94. data/spec/table_spec_resolver_spec.rb +0 -111
  95. data/spec/table_sync_spec.rb +0 -140
  96. data/spec/task_sweeper_spec.rb +0 -47
  97. data/spec/trigger_mode_switcher_spec.rb +0 -83
  98. data/spec/two_way_replicator_spec.rb +0 -721
  99. data/spec/two_way_syncer_spec.rb +0 -256
  100. data/spec/type_casting_cursor_spec.rb +0 -50
  101. data/spec/uninstall_runner_spec.rb +0 -93
  102. data/tasks/rubyrep.tailor +0 -18
  103. data/tasks/website.rake +0 -19
@@ -1,256 +0,0 @@
1
- require File.dirname(__FILE__) + '/spec_helper.rb'
2
-
3
- include RR
4
-
5
- describe Syncers::TwoWaySyncer do
6
- before(:each) do
7
- Initializer.configuration = deep_copy(standard_config)
8
- Initializer.configuration.options = {:syncer => :two_way}
9
- end
10
-
11
- it "should register itself" do
12
- Syncers::syncers[:two_way].should == Syncers::TwoWaySyncer
13
- end
14
-
15
- it "initialize should store sync_helper" do
16
- sync = TableSync.new(Session.new, 'scanner_records')
17
- helper = SyncHelper.new(sync)
18
- syncer = Syncers::TwoWaySyncer.new(helper)
19
- syncer.sync_helper.should == helper
20
- end
21
-
22
- it "initialize should throw an error if options are invalid" do
23
- sync = TableSync.new(Session.new, 'scanner_records')
24
- helper = SyncHelper.new(sync)
25
- base_options = {
26
- :syncer => :two_way,
27
- :left_record_handling => :ignore,
28
- :right_record_handling => :ignore,
29
- :sync_conflict_handling => :ignore,
30
- :logged_sync_events => []
31
- }
32
-
33
- # Verify that correct options don't raise errors.
34
- helper.stub!(:sync_options).and_return(base_options)
35
- lambda {Syncers::TwoWaySyncer.new(helper)}.should_not raise_error
36
-
37
- # Also lambda options should not raise errors.
38
- l = lambda {}
39
- helper.stub!(:sync_options).and_return(base_options.merge(
40
- {
41
- :left_record_handling => l,
42
- :right_record_handling => l,
43
- :sync_conflict_handling => l
44
- })
45
- )
46
- lambda {Syncers::TwoWaySyncer.new(helper)}.should_not raise_error
47
-
48
- # Invalid options should raise errors
49
- invalid_options = [
50
- {:left_record_handling => :invalid_left_option},
51
- {:right_record_handling => :invalid_right_option},
52
- {:sync_conflict_handling => :invalid_conflict_option},
53
- {:logged_sync_events => [:invalid_logging_option]}
54
- ]
55
- invalid_options.each do |options|
56
- helper.stub!(:sync_options).and_return(base_options.merge(options))
57
- lambda {Syncers::TwoWaySyncer.new(helper)}.should raise_error(ArgumentError)
58
- end
59
- end
60
-
61
- it "log_sync_outcome should not log if not so configured" do
62
- sync = TableSync.new(Session.new, 'scanner_records')
63
-
64
- helper = SyncHelper.new(sync)
65
- helper.should_not_receive(:log_sync_outcome)
66
- helper.stub!(:sync_options).and_return(
67
- {
68
- :rep_prefix => 'rr',
69
- :left_record_handling => :ignore,
70
- :right_record_handling => :ignore,
71
- :sync_conflict_handling => :ignore,
72
- :logged_sync_events => []
73
- })
74
- syncer = Syncers::TwoWaySyncer.new(helper)
75
- [:left, :right, :conflict].each do |diff_type|
76
- syncer.sync_difference(diff_type, :dummy_row)
77
- end
78
-
79
- helper = SyncHelper.new(sync)
80
- helper.should_not_receive(:log_sync_outcome)
81
- helper.stub!(:sync_options).and_return(
82
- {
83
- :rep_prefix => 'rr',
84
- :left_record_handling => :insert,
85
- :right_record_handling => :insert,
86
- :sync_conflict_handling => :right_wins,
87
- :logged_sync_events => [:ignored_changes, :ignored_conflicts]
88
- })
89
- helper.stub!(:insert_record)
90
- helper.stub!(:update_record)
91
- syncer.sync_difference :left, :dummy_row
92
- syncer.sync_difference :right, :dummy_row
93
- syncer.sync_difference :conflict, [:left_dummy_row, :right_dummy_row]
94
- end
95
-
96
- it "log_sync_outcome should log sync actions correctly" do
97
- sync = TableSync.new(Session.new, 'scanner_records')
98
-
99
- helper = SyncHelper.new(sync)
100
- helper.should_receive(:log_sync_outcome).with(:dummy_row, 'left_record', :insert).ordered
101
- helper.should_receive(:log_sync_outcome).with(:dummy_row, 'right_record', :insert).ordered
102
- helper.should_receive(:log_sync_outcome).with(:left_dummy_row, 'conflict', :right_wins).ordered
103
- helper.stub!(:sync_options).and_return(
104
- {
105
- :rep_prefix => 'rr',
106
- :left_record_handling => :insert,
107
- :right_record_handling => :insert,
108
- :sync_conflict_handling => :right_wins,
109
- :logged_sync_events => [:all_changes, :all_conflicts]
110
- })
111
- helper.stub!(:insert_record)
112
- helper.stub!(:update_record)
113
- syncer = Syncers::TwoWaySyncer.new(helper)
114
- syncer.sync_difference :left, :dummy_row
115
- syncer.sync_difference :right, :dummy_row
116
- syncer.sync_difference :conflict, [:left_dummy_row, :right_dummy_row]
117
- end
118
-
119
- it "log_sync_outcome should log ignored syncs correctly" do
120
- sync = TableSync.new(Session.new, 'scanner_records')
121
-
122
- helper = SyncHelper.new(sync)
123
- helper.should_receive(:log_sync_outcome).with(:dummy_row, 'left_record', :ignore).ordered
124
- helper.should_receive(:log_sync_outcome).with(:dummy_row, 'right_record', :ignore).ordered
125
- helper.should_receive(:log_sync_outcome).with(:left_dummy_row, 'conflict', :ignore).ordered
126
- helper.stub!(:sync_options).and_return(
127
- {
128
- :rep_prefix => 'rr',
129
- :left_record_handling => :ignore,
130
- :right_record_handling => :ignore,
131
- :sync_conflict_handling => :ignore,
132
- :logged_sync_events => [:ignored_changes, :ignored_conflicts]
133
- })
134
- syncer = Syncers::TwoWaySyncer.new(helper)
135
- syncer.sync_difference :left, :dummy_row
136
- syncer.sync_difference :right, :dummy_row
137
- syncer.sync_difference :conflict, [:left_dummy_row, :right_dummy_row]
138
- end
139
-
140
- it "sync_difference should not do anything if ignore option is given" do
141
- sync = TableSync.new(Session.new, 'scanner_records')
142
- helper = SyncHelper.new(sync)
143
- helper.stub!(:sync_options).and_return(
144
- {
145
- :left_record_handling => :ignore,
146
- :right_record_handling => :ignore,
147
- :sync_conflict_handling => :ignore,
148
- :logged_sync_events => []
149
- })
150
-
151
- syncer = Syncers::TwoWaySyncer.new(helper)
152
- helper.should_not_receive(:delete_record)
153
- helper.should_not_receive(:update_record)
154
- helper.should_not_receive(:insert_record)
155
-
156
- [:left, :right, :conflict].each do |diff_type|
157
- syncer.sync_difference(diff_type, :dummy_row)
158
- end
159
- end
160
-
161
- it "sync_difference should call the provided Proc objects" do
162
- sync = TableSync.new(Session.new, 'scanner_records')
163
- helper = SyncHelper.new(sync)
164
-
165
- lambda_parameters = []
166
- l = lambda do |sync_helper, type, row|
167
- lambda_parameters << [sync_helper, type, row]
168
- end
169
- helper.stub!(:sync_options).and_return(
170
- {
171
- :left_record_handling => l,
172
- :right_record_handling => l,
173
- :sync_conflict_handling => l,
174
- :logged_sync_events => [:ignored_conflicts]
175
- })
176
-
177
- syncer = Syncers::TwoWaySyncer.new(helper)
178
- syncer.sync_difference(:left, :dummy_left)
179
- syncer.sync_difference(:right, :dummy_right)
180
- syncer.sync_difference(:conflict, [:dummy_left2, :dummy_right2])
181
-
182
- lambda_parameters.should == [
183
- [helper, :left, :dummy_left],
184
- [helper, :right, :dummy_right],
185
- [helper, :conflict, [:dummy_left2, :dummy_right2]]
186
- ]
187
- end
188
-
189
- it "sync_difference should delete left or right records from source if that option is given" do
190
- sync = TableSync.new(Session.new, 'scanner_records')
191
- helper = SyncHelper.new(sync)
192
- helper.stub!(:sync_options).and_return(
193
- {
194
- :left_record_handling => :delete,
195
- :right_record_handling => :delete,
196
- :sync_conflict_handling => :ignore,
197
- :logged_sync_events => [:ignored_conflicts]
198
- })
199
-
200
- syncer = Syncers::TwoWaySyncer.new(helper)
201
- helper.should_receive(:delete_record).with(:left, 'scanner_records', :dummy_left)
202
- helper.should_receive(:delete_record).with(:right, 'scanner_records', :dummy_right)
203
- syncer.sync_difference(:left, :dummy_left)
204
- syncer.sync_difference(:right, :dummy_right)
205
- end
206
-
207
- it "sync_difference should insert left or right records to target if that option is given" do
208
- sync = TableSync.new(Session.new, 'scanner_records')
209
- helper = SyncHelper.new(sync)
210
- helper.stub!(:sync_options).and_return(
211
- {
212
- :left_record_handling => :insert,
213
- :right_record_handling => :insert,
214
- :sync_conflict_handling => :ignore,
215
- :logged_sync_events => [:ignored_conflicts]
216
- })
217
-
218
- syncer = Syncers::TwoWaySyncer.new(helper)
219
- helper.should_receive(:insert_record).with(:right, 'scanner_records', :dummy_left)
220
- helper.should_receive(:insert_record).with(:left, 'scanner_records', :dummy_right)
221
- syncer.sync_difference(:left, :dummy_left)
222
- syncer.sync_difference(:right, :dummy_right)
223
- end
224
-
225
- it "sync_difference should update the left database if conflict handling is specified with :right_wins" do
226
- sync = TableSync.new(Session.new, 'scanner_records')
227
- helper = SyncHelper.new(sync)
228
- helper.stub!(:sync_options).and_return(
229
- {
230
- :left_record_handling => :ignore,
231
- :right_record_handling => :ignore,
232
- :sync_conflict_handling => :right_wins,
233
- :logged_sync_events => [:ignored_conflicts]
234
- })
235
-
236
- syncer = Syncers::TwoWaySyncer.new(helper)
237
- helper.should_receive(:update_record).with(:left, 'scanner_records', :dummy_right)
238
- syncer.sync_difference(:conflict, [:dummy_left, :dummy_right])
239
- end
240
-
241
- it "sync_difference should update the right database if conflict handling is specified with :left_wins" do
242
- sync = TableSync.new(Session.new, 'scanner_records')
243
- helper = SyncHelper.new(sync)
244
- helper.stub!(:sync_options).and_return(
245
- {
246
- :left_record_handling => :ignore,
247
- :right_record_handling => :ignore,
248
- :sync_conflict_handling => :left_wins,
249
- :logged_sync_events => [:ignored_conflicts]
250
- })
251
-
252
- syncer = Syncers::TwoWaySyncer.new(helper)
253
- helper.should_receive(:update_record).with(:right, 'scanner_records', :dummy_left)
254
- syncer.sync_difference(:conflict, [:dummy_left, :dummy_right])
255
- end
256
- end
@@ -1,50 +0,0 @@
1
- require File.dirname(__FILE__) + '/spec_helper.rb'
2
-
3
- include RR
4
-
5
- describe TypeCastingCursor do
6
- before(:each) do
7
- Initializer.configuration = standard_config
8
- end
9
-
10
- it "initialize should cache the provided cursor and the retrieved Column objects" do
11
- cursor = TypeCastingCursor.new Session.new.left, 'extender_type_check', :dummy_org_cursor
12
- cursor.columns['id'].name.should == 'id'
13
- cursor.columns['decimal_test'].name.should == 'decimal_test'
14
- cursor.org_cursor.should == :dummy_org_cursor
15
- end
16
-
17
- it "next_row should delegate next? and clear to the original cursor" do
18
- session = Session.new
19
- cursor = session.left.select_cursor(
20
- :query => "select id from extender_type_check where id = 1",
21
- :table => "extender_type_check"
22
- )
23
- cursor.next?.should be_true
24
- row = cursor.next_row
25
- cursor.next?.should be_false
26
- cursor.clear
27
- end
28
-
29
- it "next_row should cast rows - including uncommon data types - correctly" do
30
- session = Session.new
31
- row = session.left.select_record(
32
- :query => "select id, decimal_test, timestamp, binary_test from extender_type_check where id = 1",
33
- :table => "extender_type_check"
34
- )
35
-
36
- # verify that the row fields have been converted to the correct types
37
- row['id'].should be_an_instance_of(Fixnum)
38
- row['timestamp'].should be_an_instance_of(Time)
39
- row['decimal_test'].should be_an_instance_of(BigDecimal)
40
- row['binary_test'].should be_an_instance_of(String)
41
-
42
- # verify that the row values were converted correctly
43
- row.should == {
44
- 'id' => 1,
45
- 'decimal_test' => BigDecimal.new("1.234"),
46
- 'timestamp' => Time.local(2007,"nov",10,20,15,1),
47
- 'binary_test' => Marshal.dump(['bla',:dummy,1,2,3])
48
- }
49
- end
50
- end
@@ -1,93 +0,0 @@
1
- require File.dirname(__FILE__) + '/spec_helper.rb'
2
-
3
- include RR
4
-
5
- describe UninstallRunner do
6
- before(:each) do
7
- end
8
-
9
- it "should register itself with CommandRunner" do
10
- CommandRunner.commands['uninstall'][:command].should == UninstallRunner
11
- CommandRunner.commands['uninstall'][:description].should be_an_instance_of(String)
12
- end
13
-
14
- it "process_options should make options as nil and teturn status as 1 if command line parameters are unknown" do
15
- # also verify that an error message is printed
16
- $stderr.should_receive(:puts).any_number_of_times
17
- runner = UninstallRunner.new
18
- status = runner.process_options ["--nonsense"]
19
- runner.options.should == nil
20
- status.should == 1
21
- end
22
-
23
- it "process_options should make options as nil and return status as 1 if config option is not given" do
24
- # also verify that an error message is printed
25
- $stderr.should_receive(:puts).any_number_of_times
26
- runner = UninstallRunner.new
27
- status = runner.process_options []
28
- runner.options.should == nil
29
- status.should == 1
30
- end
31
-
32
- it "process_options should make options as nil and return status as 0 if command line includes '--help'" do
33
- # also verify that the help message is printed
34
- $stderr.should_receive(:puts)
35
- runner = UninstallRunner.new
36
- status = runner.process_options ["--help"]
37
- runner.options.should == nil
38
- status.should == 0
39
- end
40
-
41
- it "process_options should set the correct options" do
42
- runner = UninstallRunner.new
43
- runner.process_options ["-c", "config_path"]
44
- runner.options[:config_file].should == 'config_path'
45
- end
46
-
47
- it "run should not start an uninstall if the command line is invalid" do
48
- $stderr.should_receive(:puts).any_number_of_times
49
- UninstallRunner.any_instance_should_not_receive(:execute) {
50
- UninstallRunner.run(["--nonsense"])
51
- }
52
- end
53
-
54
- it "run should start an uninstall if the command line is correct" do
55
- UninstallRunner.any_instance_should_receive(:execute) {
56
- UninstallRunner.run(["--config=path"])
57
- }
58
- end
59
-
60
- it "session should create and return the session" do
61
- runner = UninstallRunner.new
62
- runner.options = {:config_file => "config/test_config.rb"}
63
- runner.session.should be_an_instance_of(Session)
64
- runner.session.should == runner.session # should only be created one time
65
- end
66
-
67
- it "execute should uninstall all rubyrep elements" do
68
- begin
69
- org_stdout, $stdout = $stdout, StringIO.new
70
- config = deep_copy(standard_config)
71
- config.options[:rep_prefix] = 'rx'
72
- session = Session.new(config)
73
- initializer = ReplicationInitializer.new(session)
74
-
75
- initializer.ensure_infrastructure
76
- initializer.create_trigger :left, 'scanner_records'
77
-
78
- runner = UninstallRunner.new
79
- runner.stub!(:session).and_return(session)
80
-
81
- runner.execute
82
-
83
- initializer.trigger_exists?(:left, 'scanner_records').should be_false
84
- initializer.change_log_exists?(:left).should be_false
85
- session.right.tables.include?('rx_running_flags').should be_false
86
- initializer.event_log_exists?.should be_false
87
-
88
- $stdout.string =~ /uninstall completed/i
89
- ensure
90
- $stdout = org_stdout
91
- end
92
- end
93
- end
data/tasks/rubyrep.tailor DELETED
@@ -1,18 +0,0 @@
1
- [DEFAULT]
2
- verbose = True
3
-
4
- [project]
5
- target = svn:target
6
- start-revision = 1
7
- root-directory = /tmp/rubyrep_tailor
8
- state-file = tailor.state
9
- source = hg:source
10
-
11
- [hg:source]
12
- repository = .
13
- subdir = hg
14
-
15
- [svn:target]
16
- repository = file:///tmp/rubyrep_tailor/svn_repository
17
- module = rubyrep
18
- subdir = svn
data/tasks/website.rake DELETED
@@ -1,19 +0,0 @@
1
- namespace :website do
2
- desc 'Generate website files'
3
- task :generate => :ruby_env do
4
- (Dir['website/**/*.txt'] - Dir['website/version*.txt']).each do |txt|
5
- sh %{ #{RUBY_APP} script/txt2html #{txt} > #{txt.gsub(/txt$/,'html')} }
6
- end
7
- end
8
-
9
- desc 'Upload website files to rubyforge'
10
- task :upload do
11
- host = "#{rubyforge_username}@rubyforge.org"
12
- remote_dir = "/var/www/gforge-projects/#{RUBYFORGE_PROJECT}/"
13
- local_dir = 'website'
14
- sh %{rsync -aCv #{local_dir}/ #{host}:#{remote_dir}}
15
- end
16
-
17
- desc 'Generate and upload website files'
18
- task :build => [:website_generate, :website_upload, :publish_docs]
19
- end