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
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
$LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
|
|
2
|
+
|
|
3
|
+
require 'optparse'
|
|
4
|
+
|
|
5
|
+
module RR
|
|
6
|
+
# This class implements the functionality of the 'uninstall' command.
|
|
7
|
+
class UninstallRunner
|
|
8
|
+
|
|
9
|
+
CommandRunner.register 'uninstall' => {
|
|
10
|
+
:command => self,
|
|
11
|
+
:description => 'Removes all rubyrep tables, triggers, etc. from "left" and "right" database'
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
# Provided options. Possible values:
|
|
15
|
+
# * +:config_file+: path to config file
|
|
16
|
+
attr_accessor :options
|
|
17
|
+
|
|
18
|
+
# Parses the given command line parameter array.
|
|
19
|
+
# Returns the status (as per UNIX conventions: 1 if parameters were invalid,
|
|
20
|
+
# 0 otherwise)
|
|
21
|
+
def process_options(args)
|
|
22
|
+
status = 0
|
|
23
|
+
self.options = {}
|
|
24
|
+
|
|
25
|
+
parser = OptionParser.new do |opts|
|
|
26
|
+
opts.banner = <<EOS
|
|
27
|
+
Usage: #{$0} uninstall [options]
|
|
28
|
+
|
|
29
|
+
Removes all rubyrep tables, triggers, etc. from "left" and "right" database.
|
|
30
|
+
EOS
|
|
31
|
+
opts.separator ""
|
|
32
|
+
opts.separator " Specific options:"
|
|
33
|
+
|
|
34
|
+
opts.on("-c", "--config", "=CONFIG_FILE",
|
|
35
|
+
"Mandatory. Path to configuration file.") do |arg|
|
|
36
|
+
options[:config_file] = arg
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
opts.on_tail("--help", "Show this message") do
|
|
40
|
+
$stderr.puts opts
|
|
41
|
+
self.options = nil
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
begin
|
|
46
|
+
parser.parse!(args)
|
|
47
|
+
if options # this will be +nil+ if the --help option is specified
|
|
48
|
+
raise("Please specify configuration file") unless options.include?(:config_file)
|
|
49
|
+
end
|
|
50
|
+
rescue Exception => e
|
|
51
|
+
$stderr.puts "Command line parsing failed: #{e}"
|
|
52
|
+
$stderr.puts parser.help
|
|
53
|
+
self.options = nil
|
|
54
|
+
status = 1
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
return status
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Returns the active +Session+.
|
|
61
|
+
# Loads config file and creates session if necessary.
|
|
62
|
+
def session
|
|
63
|
+
unless @session
|
|
64
|
+
load options[:config_file]
|
|
65
|
+
@session = Session.new Initializer.configuration
|
|
66
|
+
end
|
|
67
|
+
@session
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Removes all rubyrep created database objects.
|
|
71
|
+
def execute
|
|
72
|
+
initializer = ReplicationInitializer.new session
|
|
73
|
+
initializer.restore_unconfigured_tables([])
|
|
74
|
+
initializer.drop_infrastructure
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# Entry points for executing a processing run.
|
|
78
|
+
# args: the array of command line options that were provided by the user.
|
|
79
|
+
def self.run(args)
|
|
80
|
+
runner = new
|
|
81
|
+
|
|
82
|
+
status = runner.process_options(args)
|
|
83
|
+
if runner.options
|
|
84
|
+
runner.execute
|
|
85
|
+
end
|
|
86
|
+
status
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
|
data/lib/rubyrep.rb
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
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', '>= 2.2.2'
|
|
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 'sync_helper'
|
|
38
|
+
require 'table_sorter'
|
|
39
|
+
require 'table_sync'
|
|
40
|
+
require 'syncers/syncers'
|
|
41
|
+
require 'syncers/two_way_syncer'
|
|
42
|
+
require 'sync_runner'
|
|
43
|
+
require 'trigger_mode_switcher'
|
|
44
|
+
require 'logged_change'
|
|
45
|
+
require 'replication_difference'
|
|
46
|
+
require 'replication_helper'
|
|
47
|
+
require 'replicators/replicators'
|
|
48
|
+
require 'replicators/two_way_replicator'
|
|
49
|
+
require 'replication_run'
|
|
50
|
+
require 'replication_runner'
|
|
51
|
+
require 'uninstall_runner'
|
|
52
|
+
require 'generate_runner'
|
|
53
|
+
|
|
54
|
+
Dir["#{File.dirname(__FILE__)}/rubyrep/connection_extenders/*.rb"].each do |extender|
|
|
55
|
+
# jdbc_extender.rb is only loaded if we are running on jruby
|
|
56
|
+
require extender unless extender =~ /jdbc/ and not RUBY_PLATFORM =~ /java/
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
require 'replication_initializer'
|
|
60
|
+
require 'replication_extenders/replication_extenders'
|
|
61
|
+
|
|
62
|
+
Dir["#{File.dirname(__FILE__)}/rubyrep/replication_extenders/*.rb"].each do |extender|
|
|
63
|
+
require extender
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
module RR
|
|
67
|
+
|
|
68
|
+
end
|
data/script/destroy
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
APP_ROOT = File.join(File.dirname(__FILE__), '..')
|
|
3
|
+
|
|
4
|
+
begin
|
|
5
|
+
require 'rubigen'
|
|
6
|
+
rescue LoadError
|
|
7
|
+
require 'rubygems'
|
|
8
|
+
require 'rubigen'
|
|
9
|
+
end
|
|
10
|
+
require 'rubigen/scripts/destroy'
|
|
11
|
+
|
|
12
|
+
ARGV.shift if ['--help', '-h'].include?(ARGV[0])
|
|
13
|
+
RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme]
|
|
14
|
+
RubiGen::Scripts::Destroy.new.run(ARGV)
|
data/script/generate
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
APP_ROOT = File.join(File.dirname(__FILE__), '..')
|
|
3
|
+
|
|
4
|
+
begin
|
|
5
|
+
require 'rubigen'
|
|
6
|
+
rescue LoadError
|
|
7
|
+
require 'rubygems'
|
|
8
|
+
require 'rubigen'
|
|
9
|
+
end
|
|
10
|
+
require 'rubigen/scripts/generate'
|
|
11
|
+
|
|
12
|
+
ARGV.shift if ['--help', '-h'].include?(ARGV[0])
|
|
13
|
+
RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme]
|
|
14
|
+
RubiGen::Scripts::Generate.new.run(ARGV)
|
data/script/txt2html
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
require 'rubygems'
|
|
4
|
+
begin
|
|
5
|
+
require 'newgem'
|
|
6
|
+
rescue LoadError
|
|
7
|
+
puts "\n\nGenerating the website requires the newgem RubyGem"
|
|
8
|
+
puts "Install: gem install newgem\n\n"
|
|
9
|
+
exit(1)
|
|
10
|
+
end
|
|
11
|
+
require 'redcloth'
|
|
12
|
+
require 'syntax/convertors/html'
|
|
13
|
+
require 'erb'
|
|
14
|
+
require File.dirname(__FILE__) + '/../lib/rubyrep/version.rb'
|
|
15
|
+
|
|
16
|
+
version = RR::VERSION::STRING
|
|
17
|
+
download = 'http://rubyforge.org/projects/rubyrep'
|
|
18
|
+
|
|
19
|
+
class Fixnum
|
|
20
|
+
def ordinal
|
|
21
|
+
# teens
|
|
22
|
+
return 'th' if (10..19).include?(self % 100)
|
|
23
|
+
# others
|
|
24
|
+
case self % 10
|
|
25
|
+
when 1: return 'st'
|
|
26
|
+
when 2: return 'nd'
|
|
27
|
+
when 3: return 'rd'
|
|
28
|
+
else return 'th'
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
class Time
|
|
34
|
+
def pretty
|
|
35
|
+
return "#{mday}#{mday.ordinal} #{strftime('%B')} #{year}"
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def convert_syntax(syntax, source)
|
|
40
|
+
return Syntax::Convertors::HTML.for_syntax(syntax).convert(source).gsub(%r!^<pre>|</pre>$!,'')
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
if ARGV.length >= 1
|
|
44
|
+
src, template = ARGV
|
|
45
|
+
template ||= File.join(File.dirname(__FILE__), '/../website/template.rhtml')
|
|
46
|
+
|
|
47
|
+
else
|
|
48
|
+
puts("Usage: #{File.split($0).last} source.txt [template.rhtml] > output.html")
|
|
49
|
+
exit!
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
template = ERB.new(File.open(template).read)
|
|
53
|
+
|
|
54
|
+
title = nil
|
|
55
|
+
body = nil
|
|
56
|
+
File.open(src) do |fsrc|
|
|
57
|
+
title_text = fsrc.readline
|
|
58
|
+
body_text = fsrc.read
|
|
59
|
+
syntax_items = []
|
|
60
|
+
body_text.gsub!(%r!<(pre|code)[^>]*?syntax=['"]([^'"]+)[^>]*>(.*?)</\1>!m){
|
|
61
|
+
ident = syntax_items.length
|
|
62
|
+
element, syntax, source = $1, $2, $3
|
|
63
|
+
syntax_items << "<#{element} class='syntax'>#{convert_syntax(syntax, source)}</#{element}>"
|
|
64
|
+
"syntax-temp-#{ident}"
|
|
65
|
+
}
|
|
66
|
+
title = RedCloth.new(title_text).to_html.gsub(%r!<.*?>!,'').strip
|
|
67
|
+
body = RedCloth.new(body_text).to_html
|
|
68
|
+
body.gsub!(%r!(?:<pre><code>)?syntax-temp-(\d+)(?:</code></pre>)?!){ syntax_items[$1.to_i] }
|
|
69
|
+
end
|
|
70
|
+
stat = File.stat(src)
|
|
71
|
+
created = stat.ctime
|
|
72
|
+
modified = stat.mtime
|
|
73
|
+
|
|
74
|
+
$stdout << template.result(binding)
|