andyjeffries-rubyrep 1.2.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.
Files changed (125) hide show
  1. data/History.txt +83 -0
  2. data/License.txt +20 -0
  3. data/Manifest.txt +151 -0
  4. data/README.txt +37 -0
  5. data/bin/rubyrep +8 -0
  6. data/lib/rubyrep.rb +72 -0
  7. data/lib/rubyrep/base_runner.rb +195 -0
  8. data/lib/rubyrep/command_runner.rb +144 -0
  9. data/lib/rubyrep/committers/buffered_committer.rb +151 -0
  10. data/lib/rubyrep/committers/committers.rb +152 -0
  11. data/lib/rubyrep/configuration.rb +275 -0
  12. data/lib/rubyrep/connection_extenders/connection_extenders.rb +165 -0
  13. data/lib/rubyrep/connection_extenders/jdbc_extender.rb +65 -0
  14. data/lib/rubyrep/connection_extenders/mysql_extender.rb +59 -0
  15. data/lib/rubyrep/connection_extenders/postgresql_extender.rb +277 -0
  16. data/lib/rubyrep/database_proxy.rb +52 -0
  17. data/lib/rubyrep/direct_table_scan.rb +75 -0
  18. data/lib/rubyrep/generate_runner.rb +105 -0
  19. data/lib/rubyrep/initializer.rb +39 -0
  20. data/lib/rubyrep/log_helper.rb +30 -0
  21. data/lib/rubyrep/logged_change.rb +160 -0
  22. data/lib/rubyrep/logged_change_loader.rb +197 -0
  23. data/lib/rubyrep/noisy_connection.rb +80 -0
  24. data/lib/rubyrep/proxied_table_scan.rb +171 -0
  25. data/lib/rubyrep/proxy_block_cursor.rb +145 -0
  26. data/lib/rubyrep/proxy_connection.rb +431 -0
  27. data/lib/rubyrep/proxy_cursor.rb +44 -0
  28. data/lib/rubyrep/proxy_row_cursor.rb +43 -0
  29. data/lib/rubyrep/proxy_runner.rb +89 -0
  30. data/lib/rubyrep/replication_difference.rb +100 -0
  31. data/lib/rubyrep/replication_extenders/mysql_replication.rb +271 -0
  32. data/lib/rubyrep/replication_extenders/postgresql_replication.rb +236 -0
  33. data/lib/rubyrep/replication_extenders/replication_extenders.rb +26 -0
  34. data/lib/rubyrep/replication_helper.rb +142 -0
  35. data/lib/rubyrep/replication_initializer.rb +327 -0
  36. data/lib/rubyrep/replication_run.rb +142 -0
  37. data/lib/rubyrep/replication_runner.rb +166 -0
  38. data/lib/rubyrep/replicators/replicators.rb +42 -0
  39. data/lib/rubyrep/replicators/two_way_replicator.rb +361 -0
  40. data/lib/rubyrep/scan_progress_printers/progress_bar.rb +65 -0
  41. data/lib/rubyrep/scan_progress_printers/scan_progress_printers.rb +65 -0
  42. data/lib/rubyrep/scan_report_printers/scan_detail_reporter.rb +111 -0
  43. data/lib/rubyrep/scan_report_printers/scan_report_printers.rb +67 -0
  44. data/lib/rubyrep/scan_report_printers/scan_summary_reporter.rb +75 -0
  45. data/lib/rubyrep/scan_runner.rb +25 -0
  46. data/lib/rubyrep/session.rb +230 -0
  47. data/lib/rubyrep/sync_helper.rb +121 -0
  48. data/lib/rubyrep/sync_runner.rb +31 -0
  49. data/lib/rubyrep/syncers/syncers.rb +112 -0
  50. data/lib/rubyrep/syncers/two_way_syncer.rb +174 -0
  51. data/lib/rubyrep/table_scan.rb +54 -0
  52. data/lib/rubyrep/table_scan_helper.rb +46 -0
  53. data/lib/rubyrep/table_sorter.rb +70 -0
  54. data/lib/rubyrep/table_spec_resolver.rb +142 -0
  55. data/lib/rubyrep/table_sync.rb +90 -0
  56. data/lib/rubyrep/task_sweeper.rb +77 -0
  57. data/lib/rubyrep/trigger_mode_switcher.rb +63 -0
  58. data/lib/rubyrep/type_casting_cursor.rb +31 -0
  59. data/lib/rubyrep/uninstall_runner.rb +93 -0
  60. data/lib/rubyrep/version.rb +9 -0
  61. data/rubyrep +8 -0
  62. data/rubyrep.bat +4 -0
  63. data/setup.rb +1585 -0
  64. data/spec/base_runner_spec.rb +218 -0
  65. data/spec/buffered_committer_spec.rb +274 -0
  66. data/spec/command_runner_spec.rb +145 -0
  67. data/spec/committers_spec.rb +178 -0
  68. data/spec/configuration_spec.rb +203 -0
  69. data/spec/connection_extender_interface_spec.rb +141 -0
  70. data/spec/connection_extenders_registration_spec.rb +164 -0
  71. data/spec/database_proxy_spec.rb +48 -0
  72. data/spec/database_rake_spec.rb +40 -0
  73. data/spec/db_specific_connection_extenders_spec.rb +34 -0
  74. data/spec/db_specific_replication_extenders_spec.rb +38 -0
  75. data/spec/direct_table_scan_spec.rb +61 -0
  76. data/spec/dolphins.jpg +0 -0
  77. data/spec/generate_runner_spec.rb +84 -0
  78. data/spec/initializer_spec.rb +46 -0
  79. data/spec/log_helper_spec.rb +39 -0
  80. data/spec/logged_change_loader_spec.rb +68 -0
  81. data/spec/logged_change_spec.rb +470 -0
  82. data/spec/noisy_connection_spec.rb +78 -0
  83. data/spec/postgresql_replication_spec.rb +48 -0
  84. data/spec/postgresql_schema_support_spec.rb +212 -0
  85. data/spec/postgresql_support_spec.rb +63 -0
  86. data/spec/progress_bar_spec.rb +77 -0
  87. data/spec/proxied_table_scan_spec.rb +151 -0
  88. data/spec/proxy_block_cursor_spec.rb +197 -0
  89. data/spec/proxy_connection_spec.rb +423 -0
  90. data/spec/proxy_cursor_spec.rb +56 -0
  91. data/spec/proxy_row_cursor_spec.rb +66 -0
  92. data/spec/proxy_runner_spec.rb +70 -0
  93. data/spec/replication_difference_spec.rb +161 -0
  94. data/spec/replication_extender_interface_spec.rb +367 -0
  95. data/spec/replication_extenders_spec.rb +32 -0
  96. data/spec/replication_helper_spec.rb +178 -0
  97. data/spec/replication_initializer_spec.rb +509 -0
  98. data/spec/replication_run_spec.rb +443 -0
  99. data/spec/replication_runner_spec.rb +254 -0
  100. data/spec/replicators_spec.rb +36 -0
  101. data/spec/rubyrep_spec.rb +8 -0
  102. data/spec/scan_detail_reporter_spec.rb +119 -0
  103. data/spec/scan_progress_printers_spec.rb +68 -0
  104. data/spec/scan_report_printers_spec.rb +67 -0
  105. data/spec/scan_runner_spec.rb +50 -0
  106. data/spec/scan_summary_reporter_spec.rb +61 -0
  107. data/spec/session_spec.rb +253 -0
  108. data/spec/spec.opts +1 -0
  109. data/spec/spec_helper.rb +305 -0
  110. data/spec/strange_name_support_spec.rb +135 -0
  111. data/spec/sync_helper_spec.rb +169 -0
  112. data/spec/sync_runner_spec.rb +78 -0
  113. data/spec/syncers_spec.rb +171 -0
  114. data/spec/table_scan_helper_spec.rb +36 -0
  115. data/spec/table_scan_spec.rb +49 -0
  116. data/spec/table_sorter_spec.rb +30 -0
  117. data/spec/table_spec_resolver_spec.rb +111 -0
  118. data/spec/table_sync_spec.rb +140 -0
  119. data/spec/task_sweeper_spec.rb +47 -0
  120. data/spec/trigger_mode_switcher_spec.rb +83 -0
  121. data/spec/two_way_replicator_spec.rb +721 -0
  122. data/spec/two_way_syncer_spec.rb +256 -0
  123. data/spec/type_casting_cursor_spec.rb +50 -0
  124. data/spec/uninstall_runner_spec.rb +93 -0
  125. metadata +190 -0
@@ -0,0 +1,83 @@
1
+ == 1.2.0 2011-03-07
2
+
3
+ * Feature: compatibility with Rails 3
4
+ * Feature: do not replicate record updates that didn't change any fields (props to daudo)
5
+ * Bug fix: reducing deadlock problems (props to gtanzillo)
6
+ * Bug fix: adding missing schema prefix in PostgreSQL triggers
7
+ * Bug fix: scans / syncs fail due to incorrect handling of case sensitivity of string primary key columns
8
+ * Bug fix: reducing risk of foreign key conflicts during replication (props for root cause analysis to TonyB)
9
+
10
+ == 1.1.2 2009-05-10
11
+
12
+ * Bug fix: escape primary keys in replication triggers
13
+
14
+ == 1.1.1 2009-02-02
15
+
16
+ * Feature: optional use of an SQL logger
17
+ * Bug fix: under postgresql, rubyrep triggers now finds the pending_changes table also if not included in current search path
18
+
19
+ == 1.1.0 2009-12-15
20
+
21
+ * Feature: filtering of sync / replication events with custom specified functionality
22
+ * Feature: compatibility with JRuby 1.4.0 and ActiveRecord 2.3.5
23
+
24
+ == 1.0.9 2009-10-14
25
+
26
+ * Bug fix: ReplicationRun#run should load only one change log record to figure out if there are pending changes
27
+
28
+ == 1.0.8 2009-10-01
29
+
30
+ * Feature: replication more robust against connection failures
31
+ * Feature: initial syncs before replication can be disabled with :initial_sync option
32
+ * Bug fix: better detection of failed update and delete replications
33
+ * Bug fix: fix scenario where replication could be logged as successful even when failed
34
+ * Bug fix: make proxied replication work under JRuby
35
+
36
+ == 1.0.7 2009-07-26
37
+
38
+ * Bug fix: buffered LoggedChangeLoader#update to avoid timeouts with large replication backlogs.
39
+
40
+ == 1.0.6 2009-07-25
41
+
42
+ * Bug fix: do not assume anymore that replication log events appear in sequential order
43
+ * Feature: increased resilience of rubyrep to network timeouts
44
+ * Feature: introduced :after_infrastructure_setup handler
45
+
46
+ == 1.0.5 2009-07-03
47
+
48
+ * Bug fix: rubyrep replication runs should survive update or delete attempts rejected by the database.
49
+ * Bug fix: support for multiple PostgreSQL schemas holding tables of the same name.
50
+
51
+ == 1.0.4 2009-06-20
52
+
53
+ * Bug fix: added missing file (log_helper.rb) to gem manifest
54
+
55
+ == 1.0.3 2009-06-20
56
+
57
+ * Minor enhancements:
58
+ * Added support (and according tests) for non-standard table / column names
59
+ * Verified compatibility with jruby 1.3.0
60
+ * Bug fixes:
61
+ * Also big exception messages should be accommodated in event log table.
62
+
63
+ == 1.0.2 2009-06-13
64
+
65
+ * 3 minor enhancements:
66
+ * Simplified low-level functions to read records from the database
67
+ (easier integration of additional databases)
68
+ * Better replication efficiency with large replication backlogs
69
+ * Reduced costs of an empty replication run
70
+ * Ignore tables that only exist in one database
71
+ (tables created for testing / backup don't block scan / sync / replication)
72
+
73
+ == 1.0.1 2009-03-25
74
+
75
+ * 3 minor enhancements:
76
+ * Verified compatibility with active_record 2.3.2 and jruby 1.2.0
77
+ * Released jruby bunde with the updated activerecord and jruby
78
+ * Catch ctrl+c and execute graceful shutdown
79
+
80
+ == 1.0.0 2009-03-07
81
+
82
+ * 1 major enhancement:
83
+ * Initial release
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2007 Arndt Lehmann
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,151 @@
1
+ History.txt
2
+ License.txt
3
+ Manifest.txt
4
+ README.txt
5
+ Rakefile
6
+ bin/rubyrep
7
+ config/hoe.rb
8
+ config/mysql_config.rb
9
+ config/postgres_config.rb
10
+ config/proxied_test_config.rb
11
+ config/redmine_config.rb
12
+ config/rep_config.rb
13
+ config/requirements.rb
14
+ config/test_config.rb
15
+ lib/rubyrep.rb
16
+ lib/rubyrep/base_runner.rb
17
+ lib/rubyrep/command_runner.rb
18
+ lib/rubyrep/committers/buffered_committer.rb
19
+ lib/rubyrep/committers/committers.rb
20
+ lib/rubyrep/configuration.rb
21
+ lib/rubyrep/connection_extenders/connection_extenders.rb
22
+ lib/rubyrep/connection_extenders/jdbc_extender.rb
23
+ lib/rubyrep/connection_extenders/mysql_extender.rb
24
+ lib/rubyrep/connection_extenders/postgresql_extender.rb
25
+ lib/rubyrep/database_proxy.rb
26
+ lib/rubyrep/direct_table_scan.rb
27
+ lib/rubyrep/generate_runner.rb
28
+ lib/rubyrep/initializer.rb
29
+ lib/rubyrep/log_helper.rb
30
+ lib/rubyrep/logged_change.rb
31
+ lib/rubyrep/logged_change_loader.rb
32
+ lib/rubyrep/noisy_connection.rb
33
+ lib/rubyrep/proxied_table_scan.rb
34
+ lib/rubyrep/proxy_block_cursor.rb
35
+ lib/rubyrep/proxy_connection.rb
36
+ lib/rubyrep/proxy_cursor.rb
37
+ lib/rubyrep/proxy_row_cursor.rb
38
+ lib/rubyrep/proxy_runner.rb
39
+ lib/rubyrep/replication_difference.rb
40
+ lib/rubyrep/replication_extenders/mysql_replication.rb
41
+ lib/rubyrep/replication_extenders/postgresql_replication.rb
42
+ lib/rubyrep/replication_extenders/replication_extenders.rb
43
+ lib/rubyrep/replication_helper.rb
44
+ lib/rubyrep/replication_initializer.rb
45
+ lib/rubyrep/replication_run.rb
46
+ lib/rubyrep/replication_runner.rb
47
+ lib/rubyrep/replicators/replicators.rb
48
+ lib/rubyrep/replicators/two_way_replicator.rb
49
+ lib/rubyrep/scan_progress_printers/progress_bar.rb
50
+ lib/rubyrep/scan_progress_printers/scan_progress_printers.rb
51
+ lib/rubyrep/scan_report_printers/scan_detail_reporter.rb
52
+ lib/rubyrep/scan_report_printers/scan_report_printers.rb
53
+ lib/rubyrep/scan_report_printers/scan_summary_reporter.rb
54
+ lib/rubyrep/scan_runner.rb
55
+ lib/rubyrep/session.rb
56
+ lib/rubyrep/sync_helper.rb
57
+ lib/rubyrep/sync_runner.rb
58
+ lib/rubyrep/syncers/syncers.rb
59
+ lib/rubyrep/syncers/two_way_syncer.rb
60
+ lib/rubyrep/table_scan.rb
61
+ lib/rubyrep/table_scan_helper.rb
62
+ lib/rubyrep/table_sorter.rb
63
+ lib/rubyrep/table_spec_resolver.rb
64
+ lib/rubyrep/table_sync.rb
65
+ lib/rubyrep/task_sweeper.rb
66
+ lib/rubyrep/trigger_mode_switcher.rb
67
+ lib/rubyrep/type_casting_cursor.rb
68
+ lib/rubyrep/uninstall_runner.rb
69
+ lib/rubyrep/version.rb
70
+ rubyrep
71
+ rubyrep.bat
72
+ script/destroy
73
+ script/generate
74
+ script/txt2html
75
+ setup.rb
76
+ sims/performance/big_rep_spec.rb
77
+ sims/performance/big_scan_spec.rb
78
+ sims/performance/big_sync_spec.rb
79
+ sims/performance/performance.rake
80
+ sims/sim_helper.rb
81
+ spec/base_runner_spec.rb
82
+ spec/buffered_committer_spec.rb
83
+ spec/command_runner_spec.rb
84
+ spec/committers_spec.rb
85
+ spec/configuration_spec.rb
86
+ spec/connection_extender_interface_spec.rb
87
+ spec/connection_extenders_registration_spec.rb
88
+ spec/database_proxy_spec.rb
89
+ spec/database_rake_spec.rb
90
+ spec/db_specific_connection_extenders_spec.rb
91
+ spec/db_specific_replication_extenders_spec.rb
92
+ spec/direct_table_scan_spec.rb
93
+ spec/dolphins.jpg
94
+ spec/generate_runner_spec.rb
95
+ spec/initializer_spec.rb
96
+ spec/log_helper_spec.rb
97
+ spec/logged_change_loader_spec.rb
98
+ spec/logged_change_spec.rb
99
+ spec/noisy_connection_spec.rb
100
+ spec/postgresql_replication_spec.rb
101
+ spec/postgresql_schema_support_spec.rb
102
+ spec/postgresql_support_spec.rb
103
+ spec/progress_bar_spec.rb
104
+ spec/proxied_table_scan_spec.rb
105
+ spec/proxy_block_cursor_spec.rb
106
+ spec/proxy_connection_spec.rb
107
+ spec/proxy_cursor_spec.rb
108
+ spec/proxy_row_cursor_spec.rb
109
+ spec/proxy_runner_spec.rb
110
+ spec/replication_difference_spec.rb
111
+ spec/replication_extender_interface_spec.rb
112
+ spec/replication_extenders_spec.rb
113
+ spec/replication_helper_spec.rb
114
+ spec/replication_initializer_spec.rb
115
+ spec/replication_run_spec.rb
116
+ spec/replication_runner_spec.rb
117
+ spec/replicators_spec.rb
118
+ spec/rubyrep_spec.rb
119
+ spec/scan_detail_reporter_spec.rb
120
+ spec/scan_progress_printers_spec.rb
121
+ spec/scan_report_printers_spec.rb
122
+ spec/scan_runner_spec.rb
123
+ spec/scan_summary_reporter_spec.rb
124
+ spec/session_spec.rb
125
+ spec/spec.opts
126
+ spec/spec_helper.rb
127
+ spec/strange_name_support_spec.rb
128
+ spec/sync_helper_spec.rb
129
+ spec/sync_runner_spec.rb
130
+ spec/syncers_spec.rb
131
+ spec/table_scan_helper_spec.rb
132
+ spec/table_scan_spec.rb
133
+ spec/table_sorter_spec.rb
134
+ spec/table_spec_resolver_spec.rb
135
+ spec/table_sync_spec.rb
136
+ spec/task_sweeper_spec.rb
137
+ spec/trigger_mode_switcher_spec.rb
138
+ spec/two_way_replicator_spec.rb
139
+ spec/two_way_syncer_spec.rb
140
+ spec/type_casting_cursor_spec.rb
141
+ spec/uninstall_runner_spec.rb
142
+ tasks/database.rake
143
+ tasks/deployment.rake
144
+ tasks/environment.rake
145
+ tasks/java.rake
146
+ tasks/redmine_test.rake
147
+ tasks/rspec.rake
148
+ tasks/rubyrep.tailor
149
+ tasks/stats.rake
150
+ tasks/task_helper.rb
151
+ tasks/website.rake
@@ -0,0 +1,37 @@
1
+ = rubyrep
2
+
3
+ == MISSION:
4
+
5
+ Development of an open-source solution for asynchronous, master-master replication of relational databases that is
6
+ * ridiculously easy to use
7
+ * database independent
8
+
9
+
10
+ == MORE INFORMATION:
11
+
12
+ Refer to the project website at http://www.rubyrep.org
13
+
14
+ == LICENSE:
15
+
16
+ (The MIT License)
17
+
18
+ Copyright (c) 2009 Arndt Lehmann
19
+
20
+ Permission is hereby granted, free of charge, to any person obtaining
21
+ a copy of this software and associated documentation files (the
22
+ 'Software'), to deal in the Software without restriction, including
23
+ without limitation the rights to use, copy, modify, merge, publish,
24
+ distribute, sublicense, and/or sell copies of the Software, and to
25
+ permit persons to whom the Software is furnished to do so, subject to
26
+ the following conditions:
27
+
28
+ The above copyright notice and this permission notice shall be
29
+ included in all copies or substantial portions of the Software.
30
+
31
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
32
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
33
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
34
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
35
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
36
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
37
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/ruby
2
+
3
+ $LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
4
+
5
+ require 'rubyrep'
6
+
7
+ exit RR::CommandRunner.run(ARGV)
8
+
@@ -0,0 +1,72 @@
1
+ $LOAD_PATH.unshift File.dirname(__FILE__)
2
+ $LOAD_PATH.unshift File.dirname(__FILE__) + "/rubyrep"
3
+
4
+ require 'rubygems'
5
+ require 'yaml'
6
+
7
+ gem 'activerecord', '>= 3.0.5'
8
+ require 'active_record'
9
+
10
+ require 'version'
11
+ require 'configuration'
12
+ require 'initializer'
13
+ require 'session'
14
+ require 'connection_extenders/connection_extenders'
15
+ require 'table_scan_helper'
16
+ require 'table_scan'
17
+ require 'type_casting_cursor'
18
+ require 'proxy_cursor'
19
+ require 'proxy_block_cursor'
20
+ require 'proxy_row_cursor'
21
+ require 'direct_table_scan'
22
+ require 'proxied_table_scan'
23
+ require 'database_proxy'
24
+ require 'command_runner'
25
+ require 'proxy_runner'
26
+ require 'proxy_connection'
27
+ require 'table_spec_resolver'
28
+ require 'scan_report_printers/scan_report_printers'
29
+ require 'scan_report_printers/scan_summary_reporter'
30
+ require 'scan_report_printers/scan_detail_reporter'
31
+ require 'scan_progress_printers/scan_progress_printers'
32
+ require 'scan_progress_printers/progress_bar'
33
+ require 'base_runner'
34
+ require 'scan_runner'
35
+ require 'committers/committers'
36
+ require 'committers/buffered_committer'
37
+ require 'log_helper'
38
+ require 'sync_helper'
39
+ require 'table_sorter'
40
+ require 'table_sync'
41
+ require 'syncers/syncers'
42
+ require 'syncers/two_way_syncer'
43
+ require 'sync_runner'
44
+ require 'trigger_mode_switcher'
45
+ require 'logged_change_loader'
46
+ require 'logged_change'
47
+ require 'replication_difference'
48
+ require 'replication_helper'
49
+ require 'replicators/replicators'
50
+ require 'replicators/two_way_replicator'
51
+ require 'task_sweeper'
52
+ require 'replication_run'
53
+ require 'replication_runner'
54
+ require 'uninstall_runner'
55
+ require 'generate_runner'
56
+ require 'noisy_connection'
57
+
58
+ Dir["#{File.dirname(__FILE__)}/rubyrep/connection_extenders/*.rb"].each do |extender|
59
+ # jdbc_extender.rb is only loaded if we are running on jruby
60
+ require extender unless extender =~ /jdbc/ and not RUBY_PLATFORM =~ /java/
61
+ end
62
+
63
+ require 'replication_initializer'
64
+ require 'replication_extenders/replication_extenders'
65
+
66
+ Dir["#{File.dirname(__FILE__)}/rubyrep/replication_extenders/*.rb"].each do |extender|
67
+ require extender
68
+ end
69
+
70
+ module RR
71
+
72
+ end
@@ -0,0 +1,195 @@
1
+ $LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
2
+
3
+ require 'optparse'
4
+
5
+ module RR
6
+ # This class implements the base functionality for runners that process table
7
+ # specs.
8
+ class BaseRunner
9
+
10
+ # Default options if not overriden in command line
11
+ DEFAULT_OPTIONS = {
12
+ :table_specs => []
13
+ }
14
+
15
+ # Provided options. Possible values:
16
+ # * +:config_file+: path to config file
17
+ # * +:table_specs+: array of table specification strings
18
+ attr_accessor :options
19
+
20
+ # The class for the selected report printer
21
+ attr_accessor :report_printer_class
22
+
23
+ # The specified option parameter for the report printer
24
+ attr_accessor :report_printer_arg
25
+
26
+ # Returns the active ScanReportPrinters instance (as selected through the
27
+ # command line options OR if none was selected, the default one).
28
+ def report_printer
29
+ unless @report_printer
30
+ printer_class = report_printer_class || ScanReportPrinters::ScanSummaryReporter
31
+ @report_printer ||= printer_class.new(session, report_printer_arg)
32
+ end
33
+ @report_printer
34
+ end
35
+
36
+ # Returns the command line selected ScanProgressPrinters class
37
+ attr_accessor :selected_progress_printer
38
+
39
+ # Returns the active ScanProgressPrinter class (as selected through the
40
+ # command line options OR if none was selected, the default one).
41
+ def progress_printer
42
+ if selected_progress_printer
43
+ selected_progress_printer
44
+ else
45
+ printer_key = session.configuration.options[:scan_progress_printer]
46
+ ScanProgressPrinters.printers[printer_key][:printer_class]
47
+ end
48
+ end
49
+
50
+ # Returns the default command summary description (nothing).
51
+ # Should be overwritten by child classes.
52
+ def summary_description; ""; end
53
+
54
+ # Parses the given command line parameter array.
55
+ # Returns the status (as per UNIX conventions: 1 if parameters were invalid,
56
+ # 0 otherwise)
57
+ def process_options(args)
58
+ status = 0
59
+ self.options = DEFAULT_OPTIONS.clone
60
+
61
+ parser = OptionParser.new do |opts|
62
+ opts.banner = <<EOS
63
+ Usage: #{$0} #{self.class.name.sub(/^.*::(.*)Runner$/, '\\1').downcase} [options] [table_spec] [table_spec] ...
64
+
65
+ #{summary_description}
66
+
67
+ table_spec can be either:
68
+ * a specific table name (e. g. 'users') or
69
+ * a pair of (specific) table names (e. g.: 'users,users_backup')
70
+ (In this case the first table in the 'left' database is compared
71
+ with the second table in the 'right' database.)
72
+ * a regular expression (e. g. '/^user/') [case insensitive match]
73
+ If no table_specs are provided via command line, the ones from the
74
+ configuration file are used.
75
+ EOS
76
+ opts.separator ""
77
+ opts.separator " Specific options:"
78
+
79
+ ScanReportPrinters.on_printer_selection(opts) do |printer_class, arg|
80
+ self.report_printer_class = printer_class
81
+ self.report_printer_arg = arg
82
+ end
83
+
84
+ ScanProgressPrinters.on_printer_selection(opts) do |printer|
85
+ self.selected_progress_printer = printer
86
+ end
87
+
88
+ opts.on("-c", "--config", "=CONFIG_FILE",
89
+ "Mandatory. Path to configuration file.") do |arg|
90
+ options[:config_file] = arg
91
+ end
92
+
93
+ add_specific_options(opts)
94
+
95
+ opts.on_tail("--help", "Show this message") do
96
+ $stderr.puts opts
97
+ self.options = nil
98
+ end
99
+ end
100
+
101
+ begin
102
+ unprocessed_args = parser.parse!(args)
103
+ if options # this will be +nil+ if the --help option is specified
104
+ options[:table_specs] = unprocessed_args
105
+ raise("Please specify configuration file") unless options.include?(:config_file)
106
+ end
107
+ rescue Exception => e
108
+ $stderr.puts "Command line parsing failed: #{e}"
109
+ $stderr.puts parser.help
110
+ self.options = nil
111
+ status = 1
112
+ end
113
+
114
+ return status
115
+ end
116
+
117
+ # Signals scan completion to the (active) scan report printer if it supports
118
+ # that method.
119
+ def signal_scanning_completion
120
+ if report_printer.respond_to? :scanning_finished
121
+ report_printer.scanning_finished
122
+ end
123
+ end
124
+
125
+ # Creates a processor that does something with the given table.
126
+ # A processor needs to implement a +run+ method that yields for progress
127
+ # reporting purposes pairs of diff_type and row as defined under
128
+ # DirectTableScan#run.
129
+ def create_processor(left_table, right_table)
130
+ # not implemented in the base class
131
+ end
132
+
133
+ # Intended to be overwritten by derived classes that need to add additional
134
+ # options to the provided +OptionParser+ object.
135
+ def add_specific_options(opts)
136
+ end
137
+
138
+ # Intended to be overwritten by derived classes that need to modify the
139
+ # table_pairs.
140
+ # * table_pairs: array of table pairs as returned by TableSpecResolver#resolve
141
+ # Returns the new table pairs array.
142
+ def prepare_table_pairs(table_pairs)
143
+ table_pairs
144
+ end
145
+
146
+ # Returns the active +Session+.
147
+ # Loads config file and creates session if necessary.
148
+ def session
149
+ unless @session
150
+ load options[:config_file]
151
+ @session = Session.new Initializer.configuration
152
+ end
153
+ @session
154
+ end
155
+
156
+ attr_writer :session
157
+
158
+ # Returns the table pairs that should be processed.
159
+ # Refer to TableSpecRsolver#resolve for format of return value.
160
+ def table_pairs
161
+ prepare_table_pairs(session.configured_table_pairs(options[:table_specs]))
162
+ end
163
+
164
+ # Executes a run based on the established options.
165
+ def execute
166
+ session.configuration.exclude_rubyrep_tables
167
+ table_pairs.each do |table_pair|
168
+ report_printer.scan table_pair[:left], table_pair[:right] do
169
+ processor = create_processor \
170
+ table_pair[:left], table_pair[:right]
171
+ processor.progress_printer = progress_printer
172
+ processor.run do |diff_type, row|
173
+ report_printer.report_difference diff_type, row
174
+ end
175
+ end
176
+ end
177
+ signal_scanning_completion
178
+ end
179
+
180
+ # Entry points for executing a processing run.
181
+ # args: the array of command line options that were provided by the user.
182
+ def self.run(args)
183
+ runner = new
184
+
185
+ status = runner.process_options(args)
186
+ if runner.options
187
+ runner.execute
188
+ end
189
+ status
190
+ end
191
+
192
+ end
193
+ end
194
+
195
+