redhillonrails_core 1.0.9.1 → 1.1.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/CHANGELOG +7 -0
- data/README.rdoc +31 -47
- data/lib/redhillonrails_core/active_record/base.rb +63 -0
- data/lib/redhillonrails_core/active_record/connection_adapters/abstract_adapter.rb +75 -0
- data/lib/redhillonrails_core/active_record/connection_adapters/column.rb +25 -0
- data/lib/redhillonrails_core/active_record/connection_adapters/foreign_key_definition.rb +30 -0
- data/lib/redhillonrails_core/active_record/connection_adapters/index_definition.rb +17 -0
- data/lib/redhillonrails_core/active_record/connection_adapters/mysql_adapter.rb +78 -0
- data/lib/redhillonrails_core/active_record/connection_adapters/mysql_column.rb +12 -0
- data/lib/redhillonrails_core/active_record/connection_adapters/postgresql_adapter.rb +160 -0
- data/lib/redhillonrails_core/active_record/connection_adapters/sqlite3_adapter.rb +111 -0
- data/lib/redhillonrails_core/active_record/connection_adapters/table_definition.rb +31 -0
- data/lib/redhillonrails_core/active_record/schema.rb +27 -0
- data/lib/redhillonrails_core/active_record/schema_dumper.rb +70 -0
- data/lib/redhillonrails_core.rb +20 -26
- data/redhillonrails_core.gemspec +34 -40
- data/spec/connections/mysql/connection.rb +18 -0
- data/spec/connections/mysql2/connection.rb +18 -0
- data/spec/connections/postgresql/connection.rb +15 -0
- data/spec/connections/sqlite3/connection.rb +14 -0
- data/spec/foreign_key_spec.rb +100 -0
- data/spec/index_definition_spec.rb +145 -0
- data/spec/index_spec.rb +67 -0
- data/spec/models/comment.rb +5 -0
- data/spec/models/post.rb +6 -0
- data/spec/models/user.rb +5 -0
- data/spec/schema/schema.rb +21 -0
- data/spec/schema_dumper_spec.rb +117 -0
- data/spec/spec_helper.rb +16 -0
- data/spec/support/reference.rb +66 -0
- metadata +32 -57
- data/.document +0 -5
- data/.gitignore +0 -23
- data/.rvmrc +0 -1
- data/Gemfile +0 -20
- data/Gemfile.lock +0 -50
- data/Rakefile +0 -76
- data/VERSION +0 -1
- data/examples/example_helper.rb +0 -44
- data/examples/postgresql_index_parser_example.rb +0 -198
- data/lib/red_hill_consulting/core/active_record/base.rb +0 -61
- data/lib/red_hill_consulting/core/active_record/connection_adapters/abstract_adapter.rb +0 -71
- data/lib/red_hill_consulting/core/active_record/connection_adapters/column.rb +0 -21
- data/lib/red_hill_consulting/core/active_record/connection_adapters/foreign_key_definition.rb +0 -26
- data/lib/red_hill_consulting/core/active_record/connection_adapters/index_definition.rb +0 -13
- data/lib/red_hill_consulting/core/active_record/connection_adapters/mysql4_adapter.rb +0 -37
- data/lib/red_hill_consulting/core/active_record/connection_adapters/mysql5_adapter.rb +0 -40
- data/lib/red_hill_consulting/core/active_record/connection_adapters/mysql_adapter.rb +0 -103
- data/lib/red_hill_consulting/core/active_record/connection_adapters/mysql_column.rb +0 -8
- data/lib/red_hill_consulting/core/active_record/connection_adapters/postgresql_adapter.rb +0 -178
- data/lib/red_hill_consulting/core/active_record/connection_adapters/schema_statements.rb +0 -23
- data/lib/red_hill_consulting/core/active_record/connection_adapters/sqlite3_adapter.rb +0 -109
- data/lib/red_hill_consulting/core/active_record/connection_adapters/table_definition.rb +0 -27
- data/lib/red_hill_consulting/core/active_record/schema.rb +0 -25
- data/lib/red_hill_consulting/core/active_record/schema_dumper.rb +0 -66
- data/lib/red_hill_consulting/core/active_record.rb +0 -4
- data/lib/red_hill_consulting/core.rb +0 -4
- data/tasks/db/comments.rake +0 -9
data/Gemfile.lock
DELETED
@@ -1,50 +0,0 @@
|
|
1
|
-
GEM
|
2
|
-
remote: http://rubygems.org/
|
3
|
-
specs:
|
4
|
-
activerecord (2.3.10)
|
5
|
-
activesupport (= 2.3.10)
|
6
|
-
activesupport (2.3.10)
|
7
|
-
archive-tar-minitar (0.5.2)
|
8
|
-
columnize (0.3.1)
|
9
|
-
gemcutter (0.6.1)
|
10
|
-
git (1.2.5)
|
11
|
-
jeweler (1.4.0)
|
12
|
-
gemcutter (>= 0.1.0)
|
13
|
-
git (>= 1.2.5)
|
14
|
-
rubyforge (>= 2.0.0)
|
15
|
-
json_pure (1.4.6)
|
16
|
-
linecache (0.43)
|
17
|
-
linecache19 (0.5.11)
|
18
|
-
ruby_core_source (>= 0.1.4)
|
19
|
-
micronaut (0.3.0)
|
20
|
-
pg (0.9.0)
|
21
|
-
rake (0.8.7)
|
22
|
-
ruby-debug (0.10.3)
|
23
|
-
columnize (>= 0.1)
|
24
|
-
ruby-debug-base (~> 0.10.3.0)
|
25
|
-
ruby-debug-base (0.10.3)
|
26
|
-
linecache (>= 0.3)
|
27
|
-
ruby-debug-base19 (0.11.24)
|
28
|
-
columnize (>= 0.3.1)
|
29
|
-
linecache19 (>= 0.5.11)
|
30
|
-
ruby_core_source (>= 0.1.4)
|
31
|
-
ruby-debug19 (0.11.6)
|
32
|
-
columnize (>= 0.3.1)
|
33
|
-
linecache19 (>= 0.5.11)
|
34
|
-
ruby-debug-base19 (>= 0.11.19)
|
35
|
-
ruby_core_source (0.1.4)
|
36
|
-
archive-tar-minitar (>= 0.5.2)
|
37
|
-
rubyforge (2.0.4)
|
38
|
-
json_pure (>= 1.1.7)
|
39
|
-
|
40
|
-
PLATFORMS
|
41
|
-
ruby
|
42
|
-
|
43
|
-
DEPENDENCIES
|
44
|
-
activerecord (< 3.0.0)
|
45
|
-
jeweler
|
46
|
-
micronaut
|
47
|
-
pg
|
48
|
-
rake
|
49
|
-
ruby-debug
|
50
|
-
ruby-debug19
|
data/Rakefile
DELETED
@@ -1,76 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
require 'rubygems'
|
3
|
-
require 'rake'
|
4
|
-
|
5
|
-
begin
|
6
|
-
require 'jeweler'
|
7
|
-
Jeweler::Tasks.new do |gem|
|
8
|
-
gem.name = "redhillonrails_core"
|
9
|
-
gem.summary = %Q{RedHill on Rails Core is a plugin that features to support other RedHill on Rails plugins}
|
10
|
-
gem.description = %Q{RedHill on Rails Core is a plugin that features to support other RedHill on Rails plugins. It creates and drops views and foreign-keys or obtains indexes directly from a model class.}
|
11
|
-
gem.email = "michal.lomnicki@gmail.com"
|
12
|
-
gem.homepage = "http://github.com/mlomnicki/redhillonrails_core"
|
13
|
-
gem.authors = ["Michał Łomnicki"]
|
14
|
-
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
15
|
-
|
16
|
-
gem.add_dependency "activerecord"
|
17
|
-
|
18
|
-
gem.add_development_dependency "micronaut"
|
19
|
-
end
|
20
|
-
Jeweler::GemcutterTasks.new
|
21
|
-
rescue LoadError
|
22
|
-
puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
|
23
|
-
end
|
24
|
-
|
25
|
-
require 'rake/testtask'
|
26
|
-
Rake::TestTask.new(:test) do |test|
|
27
|
-
test.libs << 'lib' << 'test'
|
28
|
-
test.pattern = 'test/**/test_*.rb'
|
29
|
-
test.verbose = true
|
30
|
-
end
|
31
|
-
|
32
|
-
begin
|
33
|
-
require 'rcov/rcovtask'
|
34
|
-
Rcov::RcovTask.new do |test|
|
35
|
-
test.libs << 'test'
|
36
|
-
test.pattern = 'test/**/test_*.rb'
|
37
|
-
test.verbose = true
|
38
|
-
end
|
39
|
-
rescue LoadError
|
40
|
-
task :rcov do
|
41
|
-
abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
require 'rake/rdoctask'
|
46
|
-
Rake::RDocTask.new do |rdoc|
|
47
|
-
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
48
|
-
|
49
|
-
rdoc.rdoc_dir = 'rdoc'
|
50
|
-
rdoc.title = "redhillonrails_core #{version}"
|
51
|
-
rdoc.rdoc_files.include('README*')
|
52
|
-
rdoc.rdoc_files.include('lib/**/*.rb')
|
53
|
-
end
|
54
|
-
|
55
|
-
require "micronaut/rake_task"
|
56
|
-
Micronaut::RakeTask.new(:examples) do |examples|
|
57
|
-
examples.pattern = "examples/**/*_example.rb"
|
58
|
-
examples.ruby_opts << "-Ilib -Iexamples"
|
59
|
-
end
|
60
|
-
|
61
|
-
Micronaut::RakeTask.new(:rcov) do |examples|
|
62
|
-
examples.pattern = "examples/**/*_example.rb"
|
63
|
-
examples.rcov_opts = "-Ilib -Iexamples"
|
64
|
-
examples.rcov = true
|
65
|
-
end
|
66
|
-
|
67
|
-
task :examples => :check_dependencies
|
68
|
-
|
69
|
-
task :default => :examples
|
70
|
-
|
71
|
-
namespace :postgresql do
|
72
|
-
task :examples do
|
73
|
-
ENV["ADAPTER"] = "postgresql"
|
74
|
-
Rake::Task["examples"].invoke
|
75
|
-
end
|
76
|
-
end
|
data/VERSION
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
1.0.9.1
|
data/examples/example_helper.rb
DELETED
@@ -1,44 +0,0 @@
|
|
1
|
-
require "micronaut"
|
2
|
-
require "active_record"
|
3
|
-
require "redhillonrails_core"
|
4
|
-
require "fileutils"
|
5
|
-
|
6
|
-
begin
|
7
|
-
require "ruby-debug"
|
8
|
-
rescue LoadError
|
9
|
-
# Don't care - debugging won't be available
|
10
|
-
end
|
11
|
-
|
12
|
-
# Log data somewhere interesting
|
13
|
-
FileUtils.mkdir_p("log") rescue nil
|
14
|
-
ActiveRecord::Base.logger = Logger.new("log/test.log")
|
15
|
-
|
16
|
-
# The model we'll be playing along with. Nothing ActiveRecord-like is expected or required here.
|
17
|
-
class User < ActiveRecord::Base
|
18
|
-
end
|
19
|
-
|
20
|
-
# We drop and reload the schema on all specs, to make it easier to know what'll be in the DB
|
21
|
-
case ENV["ADAPTER"]
|
22
|
-
when "postgresql"
|
23
|
-
ActiveRecord::Base.establish_connection :adapter => "postgresql", :database => "redhillonrails_core_test", :min_messages => "warning"
|
24
|
-
else
|
25
|
-
raise ArgumentError, "ADAPTER environment variable left unset: run tests and set ADAPTER to a known value. Valid values are: postgresql"
|
26
|
-
end
|
27
|
-
|
28
|
-
Micronaut.configure do |c|
|
29
|
-
c.before :each do
|
30
|
-
@migrator.suppress_messages do
|
31
|
-
@migrator.up
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
c.before :each do
|
36
|
-
User.reset_column_information
|
37
|
-
end
|
38
|
-
|
39
|
-
c.after :each do
|
40
|
-
@migrator.suppress_messages do
|
41
|
-
@migrator.down
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
@@ -1,198 +0,0 @@
|
|
1
|
-
require "example_helper"
|
2
|
-
require "red_hill_consulting/core/active_record/connection_adapters/postgresql_adapter"
|
3
|
-
|
4
|
-
describe RedHillConsulting::Core::ActiveRecord::ConnectionAdapters::PostgresqlAdapter, "simple indexes" do
|
5
|
-
|
6
|
-
before :all do
|
7
|
-
@migrator = Class.new(ActiveRecord::Migration) do
|
8
|
-
def self.up
|
9
|
-
create_table :users do |t|
|
10
|
-
t.string :username
|
11
|
-
end
|
12
|
-
|
13
|
-
add_index :users, :username
|
14
|
-
end
|
15
|
-
|
16
|
-
def self.down
|
17
|
-
drop_table :users
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
it "should parse the index and return appropriate information" do
|
23
|
-
indexes = User.indexes
|
24
|
-
indexes.length.should == 1
|
25
|
-
|
26
|
-
index = indexes.first
|
27
|
-
index.name.should == "index_users_on_username"
|
28
|
-
index.columns.should == ["username"]
|
29
|
-
index.unique.should == false
|
30
|
-
index.should be_case_sensitive
|
31
|
-
index.expression.should be_nil
|
32
|
-
end
|
33
|
-
|
34
|
-
end
|
35
|
-
|
36
|
-
describe RedHillConsulting::Core::ActiveRecord::ConnectionAdapters::PostgresqlAdapter, "unique indexes" do
|
37
|
-
|
38
|
-
before :all do
|
39
|
-
@migrator = Class.new(ActiveRecord::Migration) do
|
40
|
-
def self.up
|
41
|
-
create_table :users do |t|
|
42
|
-
t.string :username
|
43
|
-
end
|
44
|
-
|
45
|
-
add_index :users, :username, :unique => true, :case_sensitive => true
|
46
|
-
end
|
47
|
-
|
48
|
-
def self.down
|
49
|
-
drop_table :users
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
it "should parse the index and return appropriate information" do
|
55
|
-
indexes = User.indexes
|
56
|
-
indexes.length.should == 1
|
57
|
-
|
58
|
-
index = indexes.first
|
59
|
-
index.name.should == "index_users_on_username"
|
60
|
-
index.columns.should == ["username"]
|
61
|
-
index.unique.should == true
|
62
|
-
index.should be_case_sensitive
|
63
|
-
index.expression.should be_nil
|
64
|
-
end
|
65
|
-
|
66
|
-
end
|
67
|
-
|
68
|
-
describe RedHillConsulting::Core::ActiveRecord::ConnectionAdapters::PostgresqlAdapter, "case-insensitive indexes" do
|
69
|
-
|
70
|
-
before :all do
|
71
|
-
@migrator = Class.new(ActiveRecord::Migration) do
|
72
|
-
def self.up
|
73
|
-
create_table :users do |t|
|
74
|
-
t.string :username
|
75
|
-
end
|
76
|
-
|
77
|
-
add_index :users, :username, :case_sensitive => false
|
78
|
-
end
|
79
|
-
|
80
|
-
def self.down
|
81
|
-
drop_table :users
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
it "should parse the index and return appropriate information" do
|
87
|
-
indexes = User.indexes
|
88
|
-
indexes.length.should == 1
|
89
|
-
|
90
|
-
index = indexes.first
|
91
|
-
index.name.should == "index_users_on_username"
|
92
|
-
index.columns.should == ["username"]
|
93
|
-
index.unique.should == false
|
94
|
-
index.should_not be_case_sensitive
|
95
|
-
index.expression.should be_nil
|
96
|
-
end
|
97
|
-
|
98
|
-
end
|
99
|
-
|
100
|
-
describe RedHillConsulting::Core::ActiveRecord::ConnectionAdapters::PostgresqlAdapter, "partial indexes" do
|
101
|
-
|
102
|
-
before :all do
|
103
|
-
@migrator = Class.new(ActiveRecord::Migration) do
|
104
|
-
def self.up
|
105
|
-
create_table :users do |t|
|
106
|
-
t.string :username, :state
|
107
|
-
end
|
108
|
-
|
109
|
-
add_index :users, :username, :unique => true, :name => "index_users_on_active_usernames", :conditions => {:state => "active"}
|
110
|
-
end
|
111
|
-
|
112
|
-
def self.down
|
113
|
-
drop_table :users
|
114
|
-
end
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
it "should parse conditional index and report conditions" do
|
119
|
-
indexes = User.indexes
|
120
|
-
indexes.length.should == 1
|
121
|
-
|
122
|
-
index = indexes.first
|
123
|
-
index.should be_case_sensitive
|
124
|
-
index.columns.should == ["username"]
|
125
|
-
|
126
|
-
# FIXME: This is subject to change depending on the PostgreSQL version
|
127
|
-
index.conditions.should == "state::text = 'active'::text"
|
128
|
-
end
|
129
|
-
|
130
|
-
end
|
131
|
-
|
132
|
-
describe RedHillConsulting::Core::ActiveRecord::ConnectionAdapters::PostgresqlAdapter, "expression indexes" do
|
133
|
-
|
134
|
-
before :all do
|
135
|
-
@migrator = Class.new(ActiveRecord::Migration) do
|
136
|
-
def self.up
|
137
|
-
create_table :users do |t|
|
138
|
-
t.string :username, :state
|
139
|
-
end
|
140
|
-
|
141
|
-
add_index :users, :expression => "USING gin (to_tsvector('english', username))", :name => "index_users_full_text"
|
142
|
-
end
|
143
|
-
|
144
|
-
def self.down
|
145
|
-
drop_table :users
|
146
|
-
end
|
147
|
-
end
|
148
|
-
end
|
149
|
-
|
150
|
-
it "should parse conditional index and report conditions" do
|
151
|
-
indexes = User.indexes
|
152
|
-
indexes.length.should == 1
|
153
|
-
|
154
|
-
index = indexes.first
|
155
|
-
index.unique.should == false
|
156
|
-
index.should be_case_sensitive
|
157
|
-
index.columns.should be_nil
|
158
|
-
|
159
|
-
# FIXME: This is subject to change depending on the PostgreSQL version
|
160
|
-
index.conditions.should be_nil
|
161
|
-
index.expression.should == "gin (to_tsvector('english'::regconfig, username::text))"
|
162
|
-
end
|
163
|
-
|
164
|
-
end
|
165
|
-
|
166
|
-
describe RedHillConsulting::Core::ActiveRecord::ConnectionAdapters::PostgresqlAdapter, "case insensitive + partial index" do
|
167
|
-
|
168
|
-
before :all do
|
169
|
-
@migrator = Class.new(ActiveRecord::Migration) do
|
170
|
-
def self.up
|
171
|
-
create_table :users do |t|
|
172
|
-
t.string :username, :state
|
173
|
-
end
|
174
|
-
|
175
|
-
add_index :users, :username, :unique => true, :case_sensitive => false, :conditions => {:state => %w(active suspended invited)}
|
176
|
-
end
|
177
|
-
|
178
|
-
def self.down
|
179
|
-
drop_table :users
|
180
|
-
end
|
181
|
-
end
|
182
|
-
end
|
183
|
-
|
184
|
-
it "should parse as an expression index" do
|
185
|
-
indexes = User.indexes
|
186
|
-
indexes.length.should == 1
|
187
|
-
|
188
|
-
index = indexes.first
|
189
|
-
index.unique.should == false # We don't attempt to determine if this is true/false when it's an expression index
|
190
|
-
index.should be_case_sensitive # Same here: return the default value - expression trumps all other values
|
191
|
-
index.columns.should be_nil # And we know the columns aren't specified when it's an expression
|
192
|
-
|
193
|
-
# FIXME: This is subject to change depending on the PostgreSQL version
|
194
|
-
index.conditions.should be_nil
|
195
|
-
index.expression.should == "btree (lower(username::text)) WHERE state::text = ANY (ARRAY['active'::character varying, 'suspended'::character varying, 'invited'::character varying]::text[])"
|
196
|
-
end
|
197
|
-
|
198
|
-
end
|
@@ -1,61 +0,0 @@
|
|
1
|
-
module RedHillConsulting::Core::ActiveRecord
|
2
|
-
module Base
|
3
|
-
def self.included(base)
|
4
|
-
base.extend(ClassMethods)
|
5
|
-
end
|
6
|
-
|
7
|
-
module ClassMethods
|
8
|
-
def self.extended(base)
|
9
|
-
class << base
|
10
|
-
alias_method_chain :columns, :redhillonrails_core
|
11
|
-
alias_method_chain :abstract_class?, :redhillonrails_core
|
12
|
-
alias_method_chain :reset_column_information, :redhillonrails_core
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
def base_class?
|
17
|
-
self == base_class
|
18
|
-
end
|
19
|
-
|
20
|
-
def abstract_class_with_redhillonrails_core?
|
21
|
-
abstract_class_without_redhillonrails_core? || !(name =~ /^Abstract/).nil?
|
22
|
-
end
|
23
|
-
|
24
|
-
def columns_with_redhillonrails_core
|
25
|
-
unless @columns
|
26
|
-
columns_without_redhillonrails_core
|
27
|
-
cols = columns_hash
|
28
|
-
indexes.each do |index|
|
29
|
-
next if index.columns.blank?
|
30
|
-
column_name = index.columns.reverse.detect { |name| name !~ /_id$/ } || index.columns.last
|
31
|
-
column = cols[column_name]
|
32
|
-
column.case_sensitive = index.case_sensitive?
|
33
|
-
column.unique_scope = index.columns.reject { |name| name == column_name } if index.unique
|
34
|
-
end
|
35
|
-
end
|
36
|
-
@columns
|
37
|
-
end
|
38
|
-
|
39
|
-
def reset_column_information_with_redhillonrails_core
|
40
|
-
reset_column_information_without_redhillonrails_core
|
41
|
-
@indexes = @foreign_keys = nil
|
42
|
-
end
|
43
|
-
|
44
|
-
def pluralized_table_name(table_name)
|
45
|
-
ActiveRecord::Base.pluralize_table_names ? table_name.to_s.pluralize : table_name
|
46
|
-
end
|
47
|
-
|
48
|
-
def indexes
|
49
|
-
@indexes ||= connection.indexes(table_name, "#{name} Indexes")
|
50
|
-
end
|
51
|
-
|
52
|
-
def foreign_keys
|
53
|
-
@foreign_keys ||= connection.foreign_keys(table_name, "#{name} Foreign Keys")
|
54
|
-
end
|
55
|
-
|
56
|
-
def reverse_foreign_keys
|
57
|
-
connection.reverse_foreign_keys(table_name, "#{name} Reverse Foreign Keys")
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
@@ -1,71 +0,0 @@
|
|
1
|
-
module RedHillConsulting::Core::ActiveRecord::ConnectionAdapters
|
2
|
-
module AbstractAdapter
|
3
|
-
def self.included(base)
|
4
|
-
base.alias_method_chain :initialize, :redhillonrails_core
|
5
|
-
base.alias_method_chain :drop_table, :redhillonrails_core
|
6
|
-
end
|
7
|
-
|
8
|
-
def initialize_with_redhillonrails_core(*args)
|
9
|
-
initialize_without_redhillonrails_core(*args)
|
10
|
-
adapter = nil
|
11
|
-
case adapter_name
|
12
|
-
# name of MySQL adapter depends on mysql gem
|
13
|
-
# * with mysql gem adapter is named MySQL
|
14
|
-
# * with mysql2 gem adapter is named Mysql2
|
15
|
-
# Here we handle this and hopefully futher adapter names
|
16
|
-
when /^MySQL/i
|
17
|
-
adapter = 'MysqlAdapter'
|
18
|
-
when 'PostgreSQL'
|
19
|
-
adapter = 'PostgresqlAdapter'
|
20
|
-
when 'SQLite'
|
21
|
-
adapter = 'SqliteAdapter'
|
22
|
-
end
|
23
|
-
if adapter
|
24
|
-
adapter_module = RedHillConsulting::Core::ActiveRecord::ConnectionAdapters.const_get(adapter)
|
25
|
-
self.class.send(:include, adapter_module) unless self.class.include?(adapter_module)
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
def create_view(view_name, definition)
|
30
|
-
execute "CREATE VIEW #{view_name} AS #{definition}"
|
31
|
-
end
|
32
|
-
|
33
|
-
def drop_view(view_name)
|
34
|
-
execute "DROP VIEW #{view_name}"
|
35
|
-
end
|
36
|
-
|
37
|
-
def views(name = nil)
|
38
|
-
[]
|
39
|
-
end
|
40
|
-
|
41
|
-
def view_definition(view_name, name = nil)
|
42
|
-
end
|
43
|
-
|
44
|
-
def foreign_keys(table_name, name = nil)
|
45
|
-
[]
|
46
|
-
end
|
47
|
-
|
48
|
-
def reverse_foreign_keys(table_name, name = nil)
|
49
|
-
[]
|
50
|
-
end
|
51
|
-
|
52
|
-
def add_foreign_key(table_name, column_names, references_table_name, references_column_names, options = {})
|
53
|
-
foreign_key = ForeignKeyDefinition.new(options[:name], table_name, column_names, ActiveRecord::Migrator.proper_table_name(references_table_name), references_column_names, options[:on_update], options[:on_delete], options[:deferrable])
|
54
|
-
execute "ALTER TABLE #{table_name} ADD #{foreign_key}"
|
55
|
-
end
|
56
|
-
|
57
|
-
def remove_foreign_key(table_name, foreign_key_name, options = {})
|
58
|
-
execute "ALTER TABLE #{table_name} DROP CONSTRAINT #{foreign_key_name}"
|
59
|
-
end
|
60
|
-
|
61
|
-
def drop_table_with_redhillonrails_core(name, options = {})
|
62
|
-
reverse_foreign_keys(name).each { |foreign_key| remove_foreign_key(foreign_key.table_name, foreign_key.name, options) }
|
63
|
-
drop_table_without_redhillonrails_core(name, options)
|
64
|
-
end
|
65
|
-
|
66
|
-
def supports_partial_indexes?
|
67
|
-
false
|
68
|
-
end
|
69
|
-
|
70
|
-
end
|
71
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
module RedHillConsulting::Core::ActiveRecord::ConnectionAdapters
|
2
|
-
module Column
|
3
|
-
attr_accessor :unique_scope
|
4
|
-
attr_accessor :case_sensitive
|
5
|
-
alias case_sensitive? case_sensitive
|
6
|
-
|
7
|
-
def unique?
|
8
|
-
!unique_scope.nil?
|
9
|
-
end
|
10
|
-
|
11
|
-
def required_on
|
12
|
-
if null
|
13
|
-
nil
|
14
|
-
elsif default.nil?
|
15
|
-
:save
|
16
|
-
else
|
17
|
-
:update
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
data/lib/red_hill_consulting/core/active_record/connection_adapters/foreign_key_definition.rb
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
module RedHillConsulting::Core::ActiveRecord::ConnectionAdapters
|
2
|
-
class ForeignKeyDefinition < Struct.new(:name, :table_name, :column_names, :references_table_name, :references_column_names, :on_update, :on_delete, :deferrable)
|
3
|
-
ACTIONS = { :cascade => "CASCADE", :restrict => "RESTRICT", :set_null => "SET NULL", :set_default => "SET DEFAULT", :no_action => "NO ACTION" }.freeze
|
4
|
-
|
5
|
-
def to_dump
|
6
|
-
dump = "add_foreign_key"
|
7
|
-
dump << " #{table_name.inspect}, [#{Array(column_names).collect{ |name| name.inspect }.join(', ')}]"
|
8
|
-
dump << ", #{references_table_name.inspect}, [#{Array(references_column_names).collect{ |name| name.inspect }.join(', ')}]"
|
9
|
-
dump << ", :on_update => :#{on_update}" if on_update
|
10
|
-
dump << ", :on_delete => :#{on_delete}" if on_delete
|
11
|
-
dump << ", :deferrable => #{deferrable}" if deferrable
|
12
|
-
dump << ", :name => #{name.inspect}" if name
|
13
|
-
dump
|
14
|
-
end
|
15
|
-
|
16
|
-
def to_sql
|
17
|
-
sql = name ? "CONSTRAINT #{name} " : ""
|
18
|
-
sql << "FOREIGN KEY (#{Array(column_names).join(", ")}) REFERENCES #{references_table_name} (#{Array(references_column_names).join(", ")})"
|
19
|
-
sql << " ON UPDATE #{ACTIONS[on_update]}" if on_update
|
20
|
-
sql << " ON DELETE #{ACTIONS[on_delete]}" if on_delete
|
21
|
-
sql << " DEFERRABLE" if deferrable
|
22
|
-
sql
|
23
|
-
end
|
24
|
-
alias :to_s :to_sql
|
25
|
-
end
|
26
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
module RedHillConsulting::Core::ActiveRecord::ConnectionAdapters
|
2
|
-
module IndexDefinition
|
3
|
-
attr_accessor :conditions, :expression
|
4
|
-
|
5
|
-
def case_sensitive?
|
6
|
-
@case_sensitive.nil? ? true : @case_sensitive
|
7
|
-
end
|
8
|
-
|
9
|
-
def case_sensitive=(case_sensitive)
|
10
|
-
@case_sensitive = case_sensitive
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
@@ -1,37 +0,0 @@
|
|
1
|
-
module RedHillConsulting::Core::ActiveRecord::ConnectionAdapters
|
2
|
-
# MySQL4-specific behaviors
|
3
|
-
module Mysql4Adapter
|
4
|
-
def reverse_foreign_keys(table_name, name = nil)
|
5
|
-
tables = execute("SHOW TABLES")
|
6
|
-
|
7
|
-
foreign_keys = []
|
8
|
-
|
9
|
-
tables.each do |table|
|
10
|
-
results = execute("SHOW CREATE TABLE #{table}")
|
11
|
-
results.each do |row|
|
12
|
-
row[1].lines.each do |line|
|
13
|
-
if line =~ /^ CONSTRAINT [`"](.+?)[`"] FOREIGN KEY \([`"](.+?)[`"]\) REFERENCES [`"](.+?)[`"] \((.+?)\)( ON DELETE (.+?))?( ON UPDATE (.+?))?,?$/
|
14
|
-
name = $1
|
15
|
-
column_names = $2
|
16
|
-
references_table_name = $3
|
17
|
-
references_column_names = $4
|
18
|
-
on_update = $8
|
19
|
-
on_delete = $6
|
20
|
-
on_update = on_update.downcase.gsub(' ', '_').to_sym if on_update
|
21
|
-
on_delete = on_delete.downcase.gsub(' ', '_').to_sym if on_delete
|
22
|
-
|
23
|
-
if references_table_name == table_name
|
24
|
-
foreign_keys << ForeignKeyDefinition.new(name,
|
25
|
-
table, column_names.gsub('`', '').split(', '),
|
26
|
-
references_table_name, references_column_names.gsub('`', '').split(', '),
|
27
|
-
on_update, on_delete)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
foreign_keys
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
@@ -1,40 +0,0 @@
|
|
1
|
-
module RedHillConsulting::Core::ActiveRecord::ConnectionAdapters
|
2
|
-
# MySQL5-specific behaviors
|
3
|
-
module Mysql5Adapter
|
4
|
-
def reverse_foreign_keys(table_name, name = nil)
|
5
|
-
@@schema ||= nil
|
6
|
-
@@schema_version ||= 0
|
7
|
-
current_version = ActiveRecord::Migrator.current_version
|
8
|
-
if @@schema.nil? || @@schema_version != current_version
|
9
|
-
@@schema_version = current_version
|
10
|
-
ans = execute(<<-SQL, name)
|
11
|
-
SELECT constraint_name, table_name, column_name, referenced_table_name, referenced_column_name
|
12
|
-
FROM information_schema.key_column_usage
|
13
|
-
WHERE table_schema = SCHEMA()
|
14
|
-
AND referenced_table_schema = table_schema
|
15
|
-
ORDER BY constraint_name, ordinal_position;
|
16
|
-
SQL
|
17
|
-
@@schema = []
|
18
|
-
ans.each do | row |
|
19
|
-
@@schema << [row[0], row[1], row[2], row[3], row[4]]
|
20
|
-
end
|
21
|
-
end
|
22
|
-
results = @@schema
|
23
|
-
current_foreign_key = nil
|
24
|
-
foreign_keys = []
|
25
|
-
|
26
|
-
results.each do |row|
|
27
|
-
next unless table_name.casecmp(row[3]) == 0
|
28
|
-
if current_foreign_key != row[0]
|
29
|
-
foreign_keys << ForeignKeyDefinition.new(row[0], row[1], [], row[3], [])
|
30
|
-
current_foreign_key = row[0]
|
31
|
-
end
|
32
|
-
|
33
|
-
foreign_keys.last.column_names << row[2]
|
34
|
-
foreign_keys.last.references_column_names << row[4]
|
35
|
-
end
|
36
|
-
|
37
|
-
foreign_keys
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|