rubyrep 1.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.
- data/History.txt +4 -0
- data/License.txt +20 -0
- data/Manifest.txt +137 -0
- data/README.txt +37 -0
- data/Rakefile +30 -0
- data/bin/rubyrep +8 -0
- data/config/hoe.rb +72 -0
- data/config/mysql_config.rb +25 -0
- data/config/postgres_config.rb +21 -0
- data/config/proxied_test_config.rb +14 -0
- data/config/redmine_config.rb +17 -0
- data/config/rep_config.rb +20 -0
- data/config/requirements.rb +32 -0
- data/config/test_config.rb +20 -0
- data/lib/rubyrep/base_runner.rb +195 -0
- data/lib/rubyrep/command_runner.rb +144 -0
- data/lib/rubyrep/committers/buffered_committer.rb +140 -0
- data/lib/rubyrep/committers/committers.rb +146 -0
- data/lib/rubyrep/configuration.rb +240 -0
- data/lib/rubyrep/connection_extenders/connection_extenders.rb +133 -0
- data/lib/rubyrep/connection_extenders/jdbc_extender.rb +284 -0
- data/lib/rubyrep/connection_extenders/mysql_extender.rb +168 -0
- data/lib/rubyrep/connection_extenders/postgresql_extender.rb +261 -0
- data/lib/rubyrep/database_proxy.rb +52 -0
- data/lib/rubyrep/direct_table_scan.rb +75 -0
- data/lib/rubyrep/generate_runner.rb +105 -0
- data/lib/rubyrep/initializer.rb +39 -0
- data/lib/rubyrep/logged_change.rb +326 -0
- data/lib/rubyrep/proxied_table_scan.rb +171 -0
- data/lib/rubyrep/proxy_block_cursor.rb +145 -0
- data/lib/rubyrep/proxy_connection.rb +318 -0
- data/lib/rubyrep/proxy_cursor.rb +44 -0
- data/lib/rubyrep/proxy_row_cursor.rb +43 -0
- data/lib/rubyrep/proxy_runner.rb +89 -0
- data/lib/rubyrep/replication_difference.rb +91 -0
- data/lib/rubyrep/replication_extenders/mysql_replication.rb +271 -0
- data/lib/rubyrep/replication_extenders/postgresql_replication.rb +204 -0
- data/lib/rubyrep/replication_extenders/replication_extenders.rb +26 -0
- data/lib/rubyrep/replication_helper.rb +104 -0
- data/lib/rubyrep/replication_initializer.rb +307 -0
- data/lib/rubyrep/replication_run.rb +48 -0
- data/lib/rubyrep/replication_runner.rb +138 -0
- data/lib/rubyrep/replicators/replicators.rb +37 -0
- data/lib/rubyrep/replicators/two_way_replicator.rb +334 -0
- data/lib/rubyrep/scan_progress_printers/progress_bar.rb +65 -0
- data/lib/rubyrep/scan_progress_printers/scan_progress_printers.rb +65 -0
- data/lib/rubyrep/scan_report_printers/scan_detail_reporter.rb +111 -0
- data/lib/rubyrep/scan_report_printers/scan_report_printers.rb +67 -0
- data/lib/rubyrep/scan_report_printers/scan_summary_reporter.rb +75 -0
- data/lib/rubyrep/scan_runner.rb +25 -0
- data/lib/rubyrep/session.rb +177 -0
- data/lib/rubyrep/sync_helper.rb +111 -0
- data/lib/rubyrep/sync_runner.rb +31 -0
- data/lib/rubyrep/syncers/syncers.rb +112 -0
- data/lib/rubyrep/syncers/two_way_syncer.rb +174 -0
- data/lib/rubyrep/table_scan.rb +54 -0
- data/lib/rubyrep/table_scan_helper.rb +38 -0
- data/lib/rubyrep/table_sorter.rb +70 -0
- data/lib/rubyrep/table_spec_resolver.rb +136 -0
- data/lib/rubyrep/table_sync.rb +68 -0
- data/lib/rubyrep/trigger_mode_switcher.rb +63 -0
- data/lib/rubyrep/type_casting_cursor.rb +31 -0
- data/lib/rubyrep/uninstall_runner.rb +92 -0
- data/lib/rubyrep/version.rb +9 -0
- data/lib/rubyrep.rb +68 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/script/txt2html +74 -0
- data/setup.rb +1585 -0
- data/sims/performance/big_rep_spec.rb +100 -0
- data/sims/performance/big_scan_spec.rb +57 -0
- data/sims/performance/big_sync_spec.rb +141 -0
- data/sims/performance/performance.rake +228 -0
- data/sims/sim_helper.rb +24 -0
- data/spec/base_runner_spec.rb +218 -0
- data/spec/buffered_committer_spec.rb +271 -0
- data/spec/command_runner_spec.rb +145 -0
- data/spec/committers_spec.rb +174 -0
- data/spec/configuration_spec.rb +198 -0
- data/spec/connection_extender_interface_spec.rb +138 -0
- data/spec/connection_extenders_registration_spec.rb +129 -0
- data/spec/database_proxy_spec.rb +48 -0
- data/spec/database_rake_spec.rb +40 -0
- data/spec/db_specific_connection_extenders_spec.rb +34 -0
- data/spec/db_specific_replication_extenders_spec.rb +38 -0
- data/spec/direct_table_scan_spec.rb +61 -0
- data/spec/generate_runner_spec.rb +84 -0
- data/spec/initializer_spec.rb +46 -0
- data/spec/logged_change_spec.rb +480 -0
- data/spec/postgresql_replication_spec.rb +48 -0
- data/spec/postgresql_support_spec.rb +57 -0
- data/spec/progress_bar_spec.rb +77 -0
- data/spec/proxied_table_scan_spec.rb +151 -0
- data/spec/proxy_block_cursor_spec.rb +197 -0
- data/spec/proxy_connection_spec.rb +399 -0
- data/spec/proxy_cursor_spec.rb +56 -0
- data/spec/proxy_row_cursor_spec.rb +66 -0
- data/spec/proxy_runner_spec.rb +70 -0
- data/spec/replication_difference_spec.rb +160 -0
- data/spec/replication_extender_interface_spec.rb +365 -0
- data/spec/replication_extenders_spec.rb +32 -0
- data/spec/replication_helper_spec.rb +121 -0
- data/spec/replication_initializer_spec.rb +477 -0
- data/spec/replication_run_spec.rb +166 -0
- data/spec/replication_runner_spec.rb +213 -0
- data/spec/replicators_spec.rb +31 -0
- data/spec/rubyrep_spec.rb +8 -0
- data/spec/scan_detail_reporter_spec.rb +119 -0
- data/spec/scan_progress_printers_spec.rb +68 -0
- data/spec/scan_report_printers_spec.rb +67 -0
- data/spec/scan_runner_spec.rb +50 -0
- data/spec/scan_summary_reporter_spec.rb +61 -0
- data/spec/session_spec.rb +212 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +295 -0
- data/spec/sync_helper_spec.rb +157 -0
- data/spec/sync_runner_spec.rb +78 -0
- data/spec/syncers_spec.rb +171 -0
- data/spec/table_scan_helper_spec.rb +29 -0
- data/spec/table_scan_spec.rb +49 -0
- data/spec/table_sorter_spec.rb +31 -0
- data/spec/table_spec_resolver_spec.rb +102 -0
- data/spec/table_sync_spec.rb +84 -0
- data/spec/trigger_mode_switcher_spec.rb +83 -0
- data/spec/two_way_replicator_spec.rb +551 -0
- data/spec/two_way_syncer_spec.rb +256 -0
- data/spec/type_casting_cursor_spec.rb +50 -0
- data/spec/uninstall_runner_spec.rb +86 -0
- data/tasks/database.rake +439 -0
- data/tasks/deployment.rake +29 -0
- data/tasks/environment.rake +9 -0
- data/tasks/java.rake +37 -0
- data/tasks/redmine_test.rake +47 -0
- data/tasks/rspec.rake +68 -0
- data/tasks/rubyrep.tailor +18 -0
- data/tasks/stats.rake +19 -0
- data/tasks/task_helper.rb +20 -0
- data.tar.gz.sig +0 -0
- metadata +243 -0
- metadata.gz.sig +0 -0
data/History.txt
ADDED
data/License.txt
ADDED
|
@@ -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.
|
data/Manifest.txt
ADDED
|
@@ -0,0 +1,137 @@
|
|
|
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/logged_change.rb
|
|
30
|
+
lib/rubyrep/proxied_table_scan.rb
|
|
31
|
+
lib/rubyrep/proxy_block_cursor.rb
|
|
32
|
+
lib/rubyrep/proxy_connection.rb
|
|
33
|
+
lib/rubyrep/proxy_cursor.rb
|
|
34
|
+
lib/rubyrep/proxy_row_cursor.rb
|
|
35
|
+
lib/rubyrep/proxy_runner.rb
|
|
36
|
+
lib/rubyrep/replication_difference.rb
|
|
37
|
+
lib/rubyrep/replication_extenders/mysql_replication.rb
|
|
38
|
+
lib/rubyrep/replication_extenders/postgresql_replication.rb
|
|
39
|
+
lib/rubyrep/replication_extenders/replication_extenders.rb
|
|
40
|
+
lib/rubyrep/replication_helper.rb
|
|
41
|
+
lib/rubyrep/replication_initializer.rb
|
|
42
|
+
lib/rubyrep/replication_run.rb
|
|
43
|
+
lib/rubyrep/replication_runner.rb
|
|
44
|
+
lib/rubyrep/replicators/replicators.rb
|
|
45
|
+
lib/rubyrep/replicators/two_way_replicator.rb
|
|
46
|
+
lib/rubyrep/scan_progress_printers/progress_bar.rb
|
|
47
|
+
lib/rubyrep/scan_progress_printers/scan_progress_printers.rb
|
|
48
|
+
lib/rubyrep/scan_report_printers/scan_detail_reporter.rb
|
|
49
|
+
lib/rubyrep/scan_report_printers/scan_report_printers.rb
|
|
50
|
+
lib/rubyrep/scan_report_printers/scan_summary_reporter.rb
|
|
51
|
+
lib/rubyrep/scan_runner.rb
|
|
52
|
+
lib/rubyrep/session.rb
|
|
53
|
+
lib/rubyrep/sync_helper.rb
|
|
54
|
+
lib/rubyrep/sync_runner.rb
|
|
55
|
+
lib/rubyrep/syncers/syncers.rb
|
|
56
|
+
lib/rubyrep/syncers/two_way_syncer.rb
|
|
57
|
+
lib/rubyrep/table_scan.rb
|
|
58
|
+
lib/rubyrep/table_scan_helper.rb
|
|
59
|
+
lib/rubyrep/table_sorter.rb
|
|
60
|
+
lib/rubyrep/table_spec_resolver.rb
|
|
61
|
+
lib/rubyrep/table_sync.rb
|
|
62
|
+
lib/rubyrep/trigger_mode_switcher.rb
|
|
63
|
+
lib/rubyrep/type_casting_cursor.rb
|
|
64
|
+
lib/rubyrep/uninstall_runner.rb
|
|
65
|
+
lib/rubyrep/version.rb
|
|
66
|
+
script/destroy
|
|
67
|
+
script/generate
|
|
68
|
+
script/txt2html
|
|
69
|
+
setup.rb
|
|
70
|
+
sims/performance/big_rep_spec.rb
|
|
71
|
+
sims/performance/big_scan_spec.rb
|
|
72
|
+
sims/performance/big_sync_spec.rb
|
|
73
|
+
sims/performance/performance.rake
|
|
74
|
+
sims/sim_helper.rb
|
|
75
|
+
spec/base_runner_spec.rb
|
|
76
|
+
spec/buffered_committer_spec.rb
|
|
77
|
+
spec/command_runner_spec.rb
|
|
78
|
+
spec/committers_spec.rb
|
|
79
|
+
spec/configuration_spec.rb
|
|
80
|
+
spec/connection_extender_interface_spec.rb
|
|
81
|
+
spec/connection_extenders_registration_spec.rb
|
|
82
|
+
spec/database_proxy_spec.rb
|
|
83
|
+
spec/database_rake_spec.rb
|
|
84
|
+
spec/db_specific_connection_extenders_spec.rb
|
|
85
|
+
spec/db_specific_replication_extenders_spec.rb
|
|
86
|
+
spec/direct_table_scan_spec.rb
|
|
87
|
+
spec/generate_runner_spec.rb
|
|
88
|
+
spec/initializer_spec.rb
|
|
89
|
+
spec/logged_change_spec.rb
|
|
90
|
+
spec/postgresql_replication_spec.rb
|
|
91
|
+
spec/postgresql_support_spec.rb
|
|
92
|
+
spec/progress_bar_spec.rb
|
|
93
|
+
spec/proxied_table_scan_spec.rb
|
|
94
|
+
spec/proxy_block_cursor_spec.rb
|
|
95
|
+
spec/proxy_connection_spec.rb
|
|
96
|
+
spec/proxy_cursor_spec.rb
|
|
97
|
+
spec/proxy_row_cursor_spec.rb
|
|
98
|
+
spec/proxy_runner_spec.rb
|
|
99
|
+
spec/replication_difference_spec.rb
|
|
100
|
+
spec/replication_extender_interface_spec.rb
|
|
101
|
+
spec/replication_extenders_spec.rb
|
|
102
|
+
spec/replication_helper_spec.rb
|
|
103
|
+
spec/replication_initializer_spec.rb
|
|
104
|
+
spec/replication_run_spec.rb
|
|
105
|
+
spec/replication_runner_spec.rb
|
|
106
|
+
spec/replicators_spec.rb
|
|
107
|
+
spec/rubyrep_spec.rb
|
|
108
|
+
spec/scan_detail_reporter_spec.rb
|
|
109
|
+
spec/scan_progress_printers_spec.rb
|
|
110
|
+
spec/scan_report_printers_spec.rb
|
|
111
|
+
spec/scan_runner_spec.rb
|
|
112
|
+
spec/scan_summary_reporter_spec.rb
|
|
113
|
+
spec/session_spec.rb
|
|
114
|
+
spec/spec.opts
|
|
115
|
+
spec/spec_helper.rb
|
|
116
|
+
spec/sync_helper_spec.rb
|
|
117
|
+
spec/sync_runner_spec.rb
|
|
118
|
+
spec/syncers_spec.rb
|
|
119
|
+
spec/table_scan_helper_spec.rb
|
|
120
|
+
spec/table_scan_spec.rb
|
|
121
|
+
spec/table_sorter_spec.rb
|
|
122
|
+
spec/table_spec_resolver_spec.rb
|
|
123
|
+
spec/table_sync_spec.rb
|
|
124
|
+
spec/trigger_mode_switcher_spec.rb
|
|
125
|
+
spec/two_way_replicator_spec.rb
|
|
126
|
+
spec/two_way_syncer_spec.rb
|
|
127
|
+
spec/type_casting_cursor_spec.rb
|
|
128
|
+
spec/uninstall_runner_spec.rb
|
|
129
|
+
tasks/database.rake
|
|
130
|
+
tasks/deployment.rake
|
|
131
|
+
tasks/environment.rake
|
|
132
|
+
tasks/java.rake
|
|
133
|
+
tasks/redmine_test.rake
|
|
134
|
+
tasks/rspec.rake
|
|
135
|
+
tasks/rubyrep.tailor
|
|
136
|
+
tasks/stats.rake
|
|
137
|
+
tasks/task_helper.rb
|
data/README.txt
ADDED
|
@@ -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://rubyrep.github.com
|
|
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.
|
data/Rakefile
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
require 'config/requirements'
|
|
2
|
+
require 'config/hoe' if Object.const_defined? 'Hoe' # setup Hoe + all gem configuration
|
|
3
|
+
|
|
4
|
+
require 'lib/rubyrep'
|
|
5
|
+
require 'tasks/task_helper'
|
|
6
|
+
|
|
7
|
+
Dir['tasks/**/*.rake'].each { |rake| load rake }
|
|
8
|
+
load 'sims/performance/performance.rake'
|
|
9
|
+
|
|
10
|
+
desc "Creates the repository commit statistics"
|
|
11
|
+
task :repostats do
|
|
12
|
+
# phase 0: create the repository tmp directory
|
|
13
|
+
system 'mkdir -p tmp'
|
|
14
|
+
# phase 1: migrate the hg repository to svn
|
|
15
|
+
tailor_path = '~/usr/tailor/tailor'
|
|
16
|
+
cmd = "#{tailor_path} --use-propset --configfile '#{File.dirname(__FILE__) + '/tasks/rubyrep.tailor'}'"
|
|
17
|
+
system cmd
|
|
18
|
+
|
|
19
|
+
# phase 2: create the repository statistics through the statsvn library
|
|
20
|
+
jar_path = '~/usr/statsvn/statsvn.jar'
|
|
21
|
+
log_path = File.dirname(__FILE__) + '/tmp/statsvn.log'
|
|
22
|
+
checkout_path = '/tmp/rubyrep_tailor/svn'
|
|
23
|
+
svnstats_dir = File.dirname(__FILE__) + '/statsvn'
|
|
24
|
+
|
|
25
|
+
system "cd #{checkout_path}; svn update"
|
|
26
|
+
cmd = "cd #{checkout_path}; svn log -v --xml >#{log_path}"
|
|
27
|
+
system cmd
|
|
28
|
+
cmd = "java -jar #{jar_path} -output-dir #{svnstats_dir} -exclude 'setup.rb:website/**' #{log_path} #{checkout_path}"
|
|
29
|
+
system cmd
|
|
30
|
+
end
|
data/bin/rubyrep
ADDED
data/config/hoe.rb
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
$LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib/rubyrep'
|
|
2
|
+
#require 'rubyrep/version'
|
|
3
|
+
|
|
4
|
+
AUTHOR = 'Arndt Lehmann' # can also be an array of Authors
|
|
5
|
+
EMAIL = "mail@arndtlehman.com"
|
|
6
|
+
DESCRIPTION = "Asynchronous master-master replication of relational databases."
|
|
7
|
+
GEM_NAME = 'rubyrep' # what ppl will type to install your gem
|
|
8
|
+
RUBYFORGE_PROJECT = 'rubyrep' # The unix name for your project
|
|
9
|
+
HOMEPATH = "http://#{RUBYFORGE_PROJECT}.rubyforge.org"
|
|
10
|
+
DOWNLOAD_PATH = "http://rubyforge.org/projects/#{RUBYFORGE_PROJECT}"
|
|
11
|
+
|
|
12
|
+
@config_file = "~/.rubyforge/user-config.yml"
|
|
13
|
+
@config = nil
|
|
14
|
+
RUBYFORGE_USERNAME = "alehmann"
|
|
15
|
+
def rubyforge_username
|
|
16
|
+
unless @config
|
|
17
|
+
begin
|
|
18
|
+
@config = YAML.load(File.read(File.expand_path(@config_file)))
|
|
19
|
+
rescue
|
|
20
|
+
puts <<-EOS
|
|
21
|
+
ERROR: No rubyforge config file found: #{@config_file}
|
|
22
|
+
Run 'rubyforge setup' to prepare your env for access to Rubyforge
|
|
23
|
+
- See http://newgem.rubyforge.org/rubyforge.html for more details
|
|
24
|
+
EOS
|
|
25
|
+
exit
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
RUBYFORGE_USERNAME.replace @config["username"]
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
REV = nil
|
|
33
|
+
# UNCOMMENT IF REQUIRED:
|
|
34
|
+
# REV = `svn info`.each {|line| if line =~ /^Revision:/ then k,v = line.split(': '); break v.chomp; else next; end} rescue nil
|
|
35
|
+
VERS = RR::VERSION::STRING + (REV ? ".#{REV}" : "")
|
|
36
|
+
|
|
37
|
+
ENV['RDOCOPT'] = "-S -f html -T hanna"
|
|
38
|
+
|
|
39
|
+
class Hoe
|
|
40
|
+
def extra_deps
|
|
41
|
+
@extra_deps.reject! { |x| Array(x).first == 'hoe' }
|
|
42
|
+
@extra_deps
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Generate all the Rake tasks
|
|
47
|
+
# Run 'rake -T' to see list of generated tasks (from gem root directory)
|
|
48
|
+
hoe = Hoe.new(GEM_NAME, VERS) do |p|
|
|
49
|
+
p.author = AUTHOR
|
|
50
|
+
p.description = DESCRIPTION
|
|
51
|
+
p.email = EMAIL
|
|
52
|
+
p.summary = DESCRIPTION
|
|
53
|
+
p.url = HOMEPATH
|
|
54
|
+
p.rubyforge_name = RUBYFORGE_PROJECT if RUBYFORGE_PROJECT
|
|
55
|
+
p.test_globs = ["test/**/test_*.rb"]
|
|
56
|
+
p.clean_globs |= ['**/.*.sw?', '*.gem', '.config', '**/.DS_Store'] #An array of file patterns to delete on clean.
|
|
57
|
+
|
|
58
|
+
# == Optional
|
|
59
|
+
p.changes = p.paragraphs_of("History.txt", 0..1).join("\\n\\n")
|
|
60
|
+
#p.extra_deps = [] # An array of rubygem dependencies [name, version], e.g. [ ['active_support', '>= 1.3.1'] ]
|
|
61
|
+
p.extra_deps = [
|
|
62
|
+
['activesupport', '>= 2.2.2'],
|
|
63
|
+
['activerecord' , '>= 2.2.2']
|
|
64
|
+
]
|
|
65
|
+
|
|
66
|
+
#p.spec_extras = {} # A hash of extra values to set in the gemspec.
|
|
67
|
+
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
CHANGES = hoe.paragraphs_of('History.txt', 0..1).join("\\n\\n")
|
|
71
|
+
PATH = (RUBYFORGE_PROJECT == GEM_NAME) ? RUBYFORGE_PROJECT : "#{RUBYFORGE_PROJECT}/#{GEM_NAME}"
|
|
72
|
+
hoe.remote_rdoc_dir = File.join(PATH.gsub(/^#{RUBYFORGE_PROJECT}\/?/,''))
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Used as component of a rubyrep config file.
|
|
2
|
+
# Defines connection parameters to the mysql databases.
|
|
3
|
+
|
|
4
|
+
RR::Initializer::run do |config|
|
|
5
|
+
config.left = {
|
|
6
|
+
:adapter => 'mysql',
|
|
7
|
+
:database => 'rr_left',
|
|
8
|
+
:username => 'root',
|
|
9
|
+
:password => '',
|
|
10
|
+
:host => 'localhost',
|
|
11
|
+
:port => 3306,
|
|
12
|
+
:encoding => 'utf8'
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
config.right = {
|
|
16
|
+
:adapter => 'mysql',
|
|
17
|
+
:database => 'rr_right',
|
|
18
|
+
:username => 'root',
|
|
19
|
+
:password => '',
|
|
20
|
+
:host => 'localhost',
|
|
21
|
+
:port => 3306,
|
|
22
|
+
:encoding => 'utf8'
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Used as component of a rubyrep config file.
|
|
2
|
+
# Defines connection parameters to the postgresql databases.
|
|
3
|
+
|
|
4
|
+
RR::Initializer::run do |config|
|
|
5
|
+
config.left = {
|
|
6
|
+
:adapter => 'postgresql',
|
|
7
|
+
:database => 'rr_left',
|
|
8
|
+
:username => 'postgres',
|
|
9
|
+
:password => 'password',
|
|
10
|
+
:host => 'localhost'
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
config.right = {
|
|
14
|
+
:adapter => 'postgresql',
|
|
15
|
+
:database => 'rr_right',
|
|
16
|
+
:username => 'postgres',
|
|
17
|
+
:password => 'password',
|
|
18
|
+
:host => 'localhost'
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Rubyrep configuration file.
|
|
2
|
+
# "Proxyfies" test_config.rb.
|
|
3
|
+
|
|
4
|
+
load File.dirname(__FILE__) + '/test_config.rb'
|
|
5
|
+
|
|
6
|
+
# $start_proxy_as_external_process = true
|
|
7
|
+
|
|
8
|
+
RR::Initializer::run do |config|
|
|
9
|
+
config.left.merge!({
|
|
10
|
+
:proxy_host => 'localhost',
|
|
11
|
+
:proxy_port => '9876',
|
|
12
|
+
})
|
|
13
|
+
|
|
14
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Test configuration file for replication between two Redmine issue tracking
|
|
2
|
+
# systems
|
|
3
|
+
|
|
4
|
+
database = ENV['RR_TEST_DB'] ? ENV['RR_TEST_DB'] : :postgres
|
|
5
|
+
|
|
6
|
+
load File.dirname(__FILE__) + "/#{database}_config.rb"
|
|
7
|
+
|
|
8
|
+
RR::Initializer::run do |config|
|
|
9
|
+
config.left[:database] = 'leftmine'
|
|
10
|
+
config.right[:database] = 'rightmine'
|
|
11
|
+
|
|
12
|
+
config.include_tables(/./)
|
|
13
|
+
config.exclude_tables 'schema_migrations'
|
|
14
|
+
config.exclude_tables 'plugin_schema_infos'
|
|
15
|
+
|
|
16
|
+
config.options[:auto_key_limit] = 2
|
|
17
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Simple rubyrep configuration file.
|
|
2
|
+
# Intendet to be used for manual tests of the rubyrep commands.
|
|
3
|
+
#
|
|
4
|
+
# IMPORTANT:
|
|
5
|
+
# After completion of manual tests, use the 'db:test:rebuild' command to
|
|
6
|
+
# recreate the test databases.
|
|
7
|
+
# Otherwise the rspec tests will fail.
|
|
8
|
+
|
|
9
|
+
database = ENV['RR_TEST_DB'] ? ENV['RR_TEST_DB'] : :postgres
|
|
10
|
+
# $start_proxy_as_external_process = true
|
|
11
|
+
|
|
12
|
+
load File.dirname(__FILE__) + "/#{database}_config.rb"
|
|
13
|
+
|
|
14
|
+
RR::Initializer::run do |config|
|
|
15
|
+
config.options = {
|
|
16
|
+
}
|
|
17
|
+
config.include_tables 'scanner_left_records_only'
|
|
18
|
+
config.include_tables 'table_with_manual_key', :key => 'id'
|
|
19
|
+
config.include_tables 'extender_combined_key'
|
|
20
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
require 'fileutils'
|
|
2
|
+
include FileUtils
|
|
3
|
+
|
|
4
|
+
require 'rubygems'
|
|
5
|
+
|
|
6
|
+
# Load essential gems. Exit if not available.
|
|
7
|
+
%w[rake activerecord].each do |req_gem|
|
|
8
|
+
begin
|
|
9
|
+
require req_gem
|
|
10
|
+
rescue LoadError
|
|
11
|
+
puts "This Rakefile requires the '#{req_gem}' RubyGem."
|
|
12
|
+
puts "Installation: gem install #{req_gem} -y"
|
|
13
|
+
exit
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# Load gem builder / ruby-forge integration gems. Complain but continue if not available.
|
|
18
|
+
%w[hoe].each do |req_gem|
|
|
19
|
+
begin
|
|
20
|
+
require req_gem
|
|
21
|
+
rescue LoadError
|
|
22
|
+
# The jruby platform is probably only used for testing.
|
|
23
|
+
# So if on jruby, do not even complain.
|
|
24
|
+
if not RUBY_PLATFORM =~ /java/
|
|
25
|
+
puts "Without #{req_gem} rake tasks to build the gem / integrate the RubyForge will not be available."
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
$:.unshift(File.join(File.dirname(__FILE__), %w[.. lib]))
|
|
31
|
+
|
|
32
|
+
require 'rubyrep'
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Simple rubyrep configuration file for use by rspec tests.
|
|
2
|
+
# Can be tweaked to either use mysql or postgresql.
|
|
3
|
+
#
|
|
4
|
+
# IMPORTANT:
|
|
5
|
+
# Due to configuration of committer :default will NOT work for manual running
|
|
6
|
+
# of rubyrep commands!
|
|
7
|
+
|
|
8
|
+
database = ENV['RR_TEST_DB'] ? ENV['RR_TEST_DB'] : :postgres
|
|
9
|
+
# $start_proxy_as_external_process = true
|
|
10
|
+
|
|
11
|
+
load File.dirname(__FILE__) + "/#{database}_config.rb"
|
|
12
|
+
|
|
13
|
+
RR::Initializer::run do |config|
|
|
14
|
+
config.options = {
|
|
15
|
+
:committer => :default,
|
|
16
|
+
:sync_conflict_handling => :left_wins
|
|
17
|
+
}
|
|
18
|
+
config.include_tables 'scanner_left_records_only'
|
|
19
|
+
config.include_tables 'table_with_manual_key', :key => 'id'
|
|
20
|
+
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
|
+
|