rubyrep 1.2.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
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