yam-db-charmer 1.7.01 → 1.7.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -0
- data/CHANGES +8 -0
- data/README.rdoc +10 -6
- data/db-charmer.gemspec +2 -2
- data/lib/db_charmer/action_controller/force_slave_reads.rb +2 -2
- data/lib/db_charmer/active_record/connection_switching.rb +17 -0
- data/lib/db_charmer/active_record/db_magic.rb +9 -4
- data/lib/db_charmer/active_record/migration/multi_db_migrations.rb +113 -35
- data/lib/db_charmer/active_record/multi_db_proxy.rb +9 -0
- data/lib/db_charmer/connection_factory.rb +8 -0
- data/lib/db_charmer/rails3/active_record/relation_method.rb +6 -1
- data/lib/db_charmer/rails31/active_record/migration/command_recorder.rb +11 -0
- data/lib/db_charmer/rails31/active_record/preloader/association.rb +21 -0
- data/lib/db_charmer/rails31/active_record/preloader/has_and_belongs_to_many.rb +23 -0
- data/lib/db_charmer/sharding/connection.rb +4 -0
- data/lib/db_charmer/sharding/method/db_block_group_map.rb +12 -177
- data/lib/db_charmer/sharding/method/db_block_group_map_base.rb +270 -0
- data/lib/db_charmer/sharding/method/db_block_map.rb +4 -9
- data/lib/db_charmer/sharding/method/db_block_schema_map.rb +179 -0
- data/lib/db_charmer/sharding/method.rb +2 -0
- data/lib/db_charmer/sharding.rb +28 -0
- data/lib/db_charmer/version.rb +2 -2
- data/lib/db_charmer.rb +50 -22
- data/lib/tasks/databases.rake +30 -4
- data/lib/tasks/test.rake +115 -0
- metadata +19 -12
data/lib/tasks/test.rake
ADDED
@@ -0,0 +1,115 @@
|
|
1
|
+
|
2
|
+
namespace :db_charmer do
|
3
|
+
namespace :test do
|
4
|
+
|
5
|
+
desc 'Reinitialize all test databases'
|
6
|
+
task :prepare => ['db:abort_if_pending_migrations', 'db:load_config'] do |t|
|
7
|
+
old_rails_env = Rails.env
|
8
|
+
Rails.env = 'test'
|
9
|
+
unless ActiveRecord::Base.schema_format==:sql
|
10
|
+
abort "db_charmer can only reset databases using sql, check config.active_record.schema_format"
|
11
|
+
end
|
12
|
+
Rake::Task['db_charmer:test:clone_structure'].invoke
|
13
|
+
Rails.env = old_rails_env
|
14
|
+
end
|
15
|
+
|
16
|
+
task :purge do
|
17
|
+
Rake::Task['db_charmer:drop'].invoke
|
18
|
+
Rake::Task['db_charmer:create'].invoke
|
19
|
+
end
|
20
|
+
|
21
|
+
task :dump_structure do
|
22
|
+
::ActiveRecord::Base.configurations['development'].each_key do |name|
|
23
|
+
config = ::ActiveRecord::Base.configurations['development'][name]
|
24
|
+
next unless config.is_a?(Hash) && config['database']
|
25
|
+
# Only connect to local databases
|
26
|
+
local_database?(config) { dump_database_structure(name, config) }
|
27
|
+
end
|
28
|
+
|
29
|
+
config = ::ActiveRecord::Base.configurations['development']
|
30
|
+
local_database?(config) { dump_database_structure('main', config) }
|
31
|
+
end
|
32
|
+
|
33
|
+
# desc "Recreate the test databases from the development structure"
|
34
|
+
task :clone_structure => [ 'db_charmer:test:dump_structure', 'db_charmer:test:purge' ] do
|
35
|
+
::ActiveRecord::Base.configurations['test'].each_key do |name|
|
36
|
+
config = ::ActiveRecord::Base.configurations['test'][name]
|
37
|
+
next unless config.is_a?(Hash) && config['database']
|
38
|
+
# Only connect to local databases
|
39
|
+
local_database?(config) { clone_database_structure(name, config) }
|
40
|
+
end
|
41
|
+
config = ::ActiveRecord::Base.configurations['test']
|
42
|
+
local_database?(config) { clone_database_structure('main', config) }
|
43
|
+
end
|
44
|
+
|
45
|
+
def dump_database_structure(name, config, origin_env='development')
|
46
|
+
return unless config.is_a?(Hash) && config['database']
|
47
|
+
structure_filename = "#{Rails.root}/db/#{origin_env}_#{name}_structure.sql"
|
48
|
+
case config["adapter"]
|
49
|
+
when /^(jdbc)?mysql/, "oci", "oracle"
|
50
|
+
ActiveRecord::Base.establish_connection(config)
|
51
|
+
File.open(structure_filename, "w+") { |f| f << ActiveRecord::Base.connection.structure_dump }
|
52
|
+
when /^(jdbc)?postgresql$/
|
53
|
+
ENV['PGHOST'] = config["host"] if config["host"]
|
54
|
+
ENV['PGPORT'] = config["port"].to_s if config["port"]
|
55
|
+
search_path = config["schema_search_path"]
|
56
|
+
unless search_path.blank?
|
57
|
+
search_path = search_path.split(",").map{|search_path| "--schema=#{search_path.strip}" }.join(" ")
|
58
|
+
end
|
59
|
+
cmd ="pg_dump -U #{config["username"]} -s -x -O -f db/#{origin_env}_#{name}_structure.sql #{search_path} #{config['database']}"
|
60
|
+
puts cmd
|
61
|
+
`#{cmd}`
|
62
|
+
raise "Error dumping database" if $?.exitstatus == 1
|
63
|
+
when /^(jdbc)?sqlite/
|
64
|
+
dbfile = config["database"] || config["dbfile"]
|
65
|
+
`sqlite3 #{dbfile} .schema > #{structure_filename}`
|
66
|
+
when "sqlserver"
|
67
|
+
`scptxfr /s #{config["host"]} /d #{config["database"]} /I /f db\\#{origin_env}_#{name}_structure.sql /q /A /r`
|
68
|
+
`scptxfr /s #{config["host"]} /d #{config["database"]} /I /F db\ /q /A /r`
|
69
|
+
when "firebird"
|
70
|
+
set_firebird_env(config)
|
71
|
+
db_string = firebird_db_string(config)
|
72
|
+
sh "isql -a #{db_string} > #{structure_filename}"
|
73
|
+
else
|
74
|
+
raise "Task not supported by '#{config["adapter"]}'"
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def clone_database_structure(name, config, origin_env='development')
|
79
|
+
structure_filename = "#{Rails.root}/db/#{origin_env}_#{name}_structure.sql"
|
80
|
+
case config["adapter"]
|
81
|
+
when /^(jdbc)?mysql/
|
82
|
+
ActiveRecord::Base.establish_connection(:test)
|
83
|
+
ActiveRecord::Base.connection.execute('SET foreign_key_checks = 0')
|
84
|
+
IO.readlines(structure_filename).join.split("\n\n").each do |table|
|
85
|
+
ActiveRecord::Base.connection.execute(table)
|
86
|
+
end
|
87
|
+
when /^(jdbc)?postgresql$/
|
88
|
+
ENV['PGHOST'] = config["host"] if config["host"]
|
89
|
+
ENV['PGPORT'] = config["port"].to_s if config["port"]
|
90
|
+
#ENV['PGPASSWORD'] = config["password"].to_s if config["password"]
|
91
|
+
cmd = "psql -U #{config["username"]} -f #{structure_filename} #{config["database"]}"
|
92
|
+
puts cmd
|
93
|
+
`#{cmd}`
|
94
|
+
when /^(jdbc)?sqlite/
|
95
|
+
dbfile = config["database"] || config["dbfile"]
|
96
|
+
`sqlite3 #{dbfile} < #{structure_filename}`
|
97
|
+
when "sqlserver"
|
98
|
+
`osql -E -S #{config["host"]} -d #{config["database"]} -i #{structure_filename}`
|
99
|
+
when "oci", "oracle"
|
100
|
+
ActiveRecord::Base.establish_connection(:test)
|
101
|
+
IO.readlines(structure_filename).join.split(";\n\n").each do |ddl|
|
102
|
+
ActiveRecord::Base.connection.execute(ddl)
|
103
|
+
end
|
104
|
+
when "firebird"
|
105
|
+
set_firebird_env(abcs["test"])
|
106
|
+
db_string = firebird_db_string(abcs["test"])
|
107
|
+
sh "isql -i #{structure_filename} #{db_string}"
|
108
|
+
else
|
109
|
+
raise "Task not supported by '#{config["adapter"]}'"
|
110
|
+
end
|
111
|
+
|
112
|
+
File.delete(structure_filename) if File.exist?(structure_filename)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: yam-db-charmer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 119
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 7
|
9
|
-
-
|
10
|
-
|
9
|
+
- 4
|
10
|
+
- 0
|
11
|
+
version: 1.7.4.0
|
11
12
|
platform: ruby
|
12
13
|
authors:
|
13
14
|
- Oleksiy Kovyrin
|
@@ -16,7 +17,7 @@ autorequire:
|
|
16
17
|
bindir: bin
|
17
18
|
cert_chain: []
|
18
19
|
|
19
|
-
date: 2012-
|
20
|
+
date: 2012-09-18 00:00:00 -07:00
|
20
21
|
default_executable:
|
21
22
|
dependencies:
|
22
23
|
- !ruby/object:Gem::Dependency
|
@@ -25,13 +26,13 @@ dependencies:
|
|
25
26
|
requirement: &id001 !ruby/object:Gem::Requirement
|
26
27
|
none: false
|
27
28
|
requirements:
|
28
|
-
- -
|
29
|
+
- - ~>
|
29
30
|
- !ruby/object:Gem::Version
|
30
|
-
hash:
|
31
|
+
hash: 7
|
31
32
|
segments:
|
32
33
|
- 3
|
33
|
-
-
|
34
|
-
version: "3.
|
34
|
+
- 0
|
35
|
+
version: "3.0"
|
35
36
|
type: :runtime
|
36
37
|
version_requirements: *id001
|
37
38
|
- !ruby/object:Gem::Dependency
|
@@ -40,13 +41,13 @@ dependencies:
|
|
40
41
|
requirement: &id002 !ruby/object:Gem::Requirement
|
41
42
|
none: false
|
42
43
|
requirements:
|
43
|
-
- -
|
44
|
+
- - ~>
|
44
45
|
- !ruby/object:Gem::Version
|
45
|
-
hash:
|
46
|
+
hash: 7
|
46
47
|
segments:
|
47
48
|
- 3
|
48
|
-
-
|
49
|
-
version: "3.
|
49
|
+
- 0
|
50
|
+
version: "3.0"
|
50
51
|
type: :runtime
|
51
52
|
version_requirements: *id002
|
52
53
|
- !ruby/object:Gem::Dependency
|
@@ -130,16 +131,22 @@ files:
|
|
130
131
|
- lib/db_charmer/rails3/active_record/master_slave_routing.rb
|
131
132
|
- lib/db_charmer/rails3/active_record/relation/connection_routing.rb
|
132
133
|
- lib/db_charmer/rails3/active_record/relation_method.rb
|
134
|
+
- lib/db_charmer/rails31/active_record/migration/command_recorder.rb
|
135
|
+
- lib/db_charmer/rails31/active_record/preloader/association.rb
|
136
|
+
- lib/db_charmer/rails31/active_record/preloader/has_and_belongs_to_many.rb
|
133
137
|
- lib/db_charmer/sharding.rb
|
134
138
|
- lib/db_charmer/sharding/connection.rb
|
135
139
|
- lib/db_charmer/sharding/method.rb
|
136
140
|
- lib/db_charmer/sharding/method/db_block_group_map.rb
|
141
|
+
- lib/db_charmer/sharding/method/db_block_group_map_base.rb
|
137
142
|
- lib/db_charmer/sharding/method/db_block_map.rb
|
143
|
+
- lib/db_charmer/sharding/method/db_block_schema_map.rb
|
138
144
|
- lib/db_charmer/sharding/method/hash_map.rb
|
139
145
|
- lib/db_charmer/sharding/method/range.rb
|
140
146
|
- lib/db_charmer/sharding/stub_connection.rb
|
141
147
|
- lib/db_charmer/version.rb
|
142
148
|
- lib/tasks/databases.rake
|
149
|
+
- lib/tasks/test.rake
|
143
150
|
has_rdoc: true
|
144
151
|
homepage: http://kovyrin.github.com/db-charmer
|
145
152
|
licenses: []
|