composite_primary_keys 0.8.6 → 0.9.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 +9 -0
- data/Manifest.txt +37 -0
- data/README.txt +34 -9
- data/README_DB2.txt +33 -0
- data/Rakefile +8 -119
- data/init.rb +2 -0
- data/lib/adapter_helper/base.rb +63 -0
- data/lib/adapter_helper/mysql.rb +13 -0
- data/lib/adapter_helper/oracle.rb +13 -0
- data/lib/adapter_helper/postgresql.rb +13 -0
- data/lib/adapter_helper/sqlite3.rb +13 -0
- data/lib/composite_primary_keys.rb +2 -2
- data/lib/composite_primary_keys/associations.rb +53 -28
- data/lib/composite_primary_keys/base.rb +4 -1
- data/lib/composite_primary_keys/connection_adapters/ibm_db_adapter.rb +21 -0
- data/lib/composite_primary_keys/connection_adapters/postgresql_adapter.rb +1 -1
- data/lib/composite_primary_keys/migration.rb +13 -0
- data/lib/composite_primary_keys/version.rb +2 -2
- data/loader.rb +24 -0
- data/local/database_connections.rb.sample +10 -0
- data/local/paths.rb.sample +2 -0
- data/local/tasks.rb.sample +2 -0
- data/scripts/console.rb +25 -0
- data/tasks/activerecord_selection.rake +43 -0
- data/tasks/databases.rake +10 -0
- data/tasks/databases/mysql.rake +30 -0
- data/tasks/databases/oracle.rake +15 -0
- data/tasks/databases/postgresql.rake +26 -0
- data/tasks/databases/sqlite3.rake +28 -0
- data/tasks/deployment.rake +22 -0
- data/tasks/local_setup.rake +13 -0
- data/tasks/website.rake +18 -0
- data/test/README_tests.txt +67 -0
- data/test/abstract_unit.rb +2 -4
- data/test/connections/native_ibm_db/connection.rb +23 -0
- data/test/connections/native_mysql/connection.rb +8 -13
- data/test/connections/native_oracle/connection.rb +8 -11
- data/test/connections/native_postgresql/connection.rb +3 -9
- data/test/connections/native_sqlite/connection.rb +4 -5
- data/test/fixtures/comment.rb +5 -0
- data/test/fixtures/comments.yml +14 -0
- data/test/fixtures/db_definitions/db2-create-tables.sql +92 -0
- data/test/fixtures/db_definitions/db2-drop-tables.sql +13 -0
- data/test/fixtures/db_definitions/mysql.sql +24 -0
- data/test/fixtures/db_definitions/oracle.drop.sql +6 -0
- data/test/fixtures/db_definitions/oracle.sql +28 -1
- data/test/fixtures/db_definitions/postgresql.sql +24 -0
- data/test/fixtures/db_definitions/sqlite.sql +21 -0
- data/test/fixtures/department.rb +5 -0
- data/test/fixtures/departments.yml +3 -0
- data/test/fixtures/employee.rb +4 -0
- data/test/fixtures/employees.yml +9 -0
- data/test/fixtures/hack.rb +6 -0
- data/test/fixtures/hacks.yml +2 -0
- data/test/fixtures/product.rb +3 -2
- data/test/fixtures/streets.yml +11 -1
- data/test/fixtures/suburb.rb +2 -0
- data/test/fixtures/suburbs.yml +6 -1
- data/test/fixtures/user.rb +1 -0
- data/test/test_associations.rb +29 -5
- data/test/test_delete.rb +23 -2
- data/test/test_polymorphic.rb +24 -0
- data/tmp/test.db +0 -0
- data/website/index.html +2 -2
- data/website/version-raw.js +1 -1
- data/website/version.js +1 -1
- metadata +43 -3
@@ -26,7 +26,6 @@ $:.unshift(File.dirname(__FILE__)) unless
|
|
26
26
|
|
27
27
|
unless defined?(ActiveRecord)
|
28
28
|
begin
|
29
|
-
$:.unshift(File.dirname(__FILE__) + "/../../activerecord/lib")
|
30
29
|
require 'active_record'
|
31
30
|
rescue LoadError
|
32
31
|
require 'rubygems'
|
@@ -40,6 +39,7 @@ require 'composite_primary_keys/associations'
|
|
40
39
|
require 'composite_primary_keys/reflection'
|
41
40
|
require 'composite_primary_keys/base'
|
42
41
|
require 'composite_primary_keys/calculations'
|
42
|
+
require 'composite_primary_keys/migration'
|
43
43
|
|
44
44
|
ActiveRecord::Base.class_eval do
|
45
45
|
include CompositePrimaryKeys::ActiveRecord::Base
|
@@ -47,7 +47,7 @@ end
|
|
47
47
|
|
48
48
|
Dir[File.dirname(__FILE__) + '/composite_primary_keys/connection_adapters/*.rb'].each do |adapter|
|
49
49
|
begin
|
50
|
-
require
|
50
|
+
require adapter.gsub('.rb','')
|
51
51
|
rescue MissingSourceFile
|
52
52
|
end
|
53
53
|
end
|
@@ -80,7 +80,8 @@ module ActiveRecord::Associations::ClassMethods
|
|
80
80
|
association = join.instantiate(row)
|
81
81
|
collection.target.push(association) unless collection.target.include?(association)
|
82
82
|
when :has_one, :belongs_to
|
83
|
-
return if record.id.to_s != join.parent.record_id(row).to_s or
|
83
|
+
return if record.id.to_s != join.parent.record_id(row).to_s or
|
84
|
+
join.aliased_primary_key.to_a.any? { |key| row[key].nil? }
|
84
85
|
association = join.instantiate(row)
|
85
86
|
record.send("set_#{join.reflection.name}_target", association)
|
86
87
|
else
|
@@ -125,17 +126,20 @@ module ActiveRecord::Associations::ClassMethods
|
|
125
126
|
def composite_association_join
|
126
127
|
join = case reflection.macro
|
127
128
|
when :has_and_belongs_to_many
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
129
|
+
" LEFT OUTER JOIN %s ON %s " % [
|
130
|
+
table_alias_for(options[:join_table], aliased_join_table_name),
|
131
|
+
composite_join_clause(
|
132
|
+
full_keys(aliased_join_table_name, options[:foreign_key] || reflection.active_record.to_s.classify.foreign_key),
|
133
|
+
full_keys(reflection.active_record.table_name, reflection.active_record.primary_key)
|
134
|
+
)
|
135
|
+
] +
|
136
|
+
" LEFT OUTER JOIN %s ON %s " % [
|
137
|
+
table_name_and_alias,
|
138
|
+
composite_join_clause(
|
139
|
+
full_keys(aliased_table_name, klass.primary_key),
|
140
|
+
full_keys(aliased_join_table_name, options[:association_foreign_key] || klass.table_name.classify.foreign_key)
|
141
|
+
)
|
142
|
+
]
|
139
143
|
when :has_many, :has_one
|
140
144
|
case
|
141
145
|
when reflection.macro == :has_many && reflection.options[:through]
|
@@ -155,16 +159,19 @@ module ActiveRecord::Associations::ClassMethods
|
|
155
159
|
second_key = options[:foreign_key] || primary_key
|
156
160
|
end
|
157
161
|
|
158
|
-
|
159
|
-
" LEFT OUTER JOIN %s ON (%s) = (%s) " % [
|
162
|
+
" LEFT OUTER JOIN %s ON %s " % [
|
160
163
|
table_alias_for(through_reflection.klass.table_name, aliased_join_table_name),
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
164
|
+
composite_join_clause(
|
165
|
+
full_keys(aliased_join_table_name, through_reflection.primary_key_name),
|
166
|
+
full_keys(parent.aliased_table_name, parent.primary_key)
|
167
|
+
)
|
168
|
+
] +
|
169
|
+
" LEFT OUTER JOIN %s ON %s " % [
|
170
|
+
table_name_and_alias,
|
171
|
+
composite_join_clause(
|
172
|
+
full_keys(aliased_table_name, first_key),
|
173
|
+
full_keys(aliased_join_table_name, second_key)
|
174
|
+
)
|
168
175
|
]
|
169
176
|
end
|
170
177
|
end
|
@@ -175,7 +182,6 @@ module ActiveRecord::Associations::ClassMethods
|
|
175
182
|
raise AssociationNotSupported, "Polymorphic joins not supported for composite keys"
|
176
183
|
else
|
177
184
|
foreign_key = options[:foreign_key] || reflection.active_record.name.foreign_key
|
178
|
-
# TODO replace (keys) = (ids), with key1=id1 and key2=id2
|
179
185
|
" LEFT OUTER JOIN %s ON %s " % [
|
180
186
|
table_name_and_alias,
|
181
187
|
composite_join_clause(
|
@@ -184,7 +190,6 @@ module ActiveRecord::Associations::ClassMethods
|
|
184
190
|
]
|
185
191
|
end
|
186
192
|
when :belongs_to
|
187
|
-
# TODO replace (keys) = (ids), with key1=id1 and key2=id2
|
188
193
|
" LEFT OUTER JOIN %s ON %s " % [
|
189
194
|
table_name_and_alias,
|
190
195
|
composite_join_clause(
|
@@ -197,7 +202,7 @@ module ActiveRecord::Associations::ClassMethods
|
|
197
202
|
join << %(AND %s.%s = %s ) % [
|
198
203
|
aliased_table_name,
|
199
204
|
reflection.active_record.connection.quote_column_name(reflection.active_record.inheritance_column),
|
200
|
-
klass.quote(klass.name)] unless klass.descends_from_active_record?
|
205
|
+
klass.connection.quote(klass.name)] unless klass.descends_from_active_record?
|
201
206
|
join << "AND #{interpolate_sql(sanitize_sql(reflection.options[:conditions]))} " if reflection.options[:conditions]
|
202
207
|
join
|
203
208
|
end
|
@@ -273,7 +278,7 @@ module ActiveRecord::Associations
|
|
273
278
|
when @reflection.options[:as]
|
274
279
|
@finder_sql =
|
275
280
|
"#{@reflection.klass.table_name}.#{@reflection.options[:as]}_id = #{@owner.quoted_id} AND " +
|
276
|
-
"#{@reflection.klass.table_name}.#{@reflection.options[:as]}_type = #{@owner.class.
|
281
|
+
"#{@reflection.klass.table_name}.#{@reflection.options[:as]}_type = #{@owner.class.quote_value(@owner.class.base_class.name.to_s)}"
|
277
282
|
@finder_sql << " AND (#{conditions})" if conditions
|
278
283
|
|
279
284
|
else
|
@@ -292,6 +297,26 @@ module ActiveRecord::Associations
|
|
292
297
|
@counter_sql = @finder_sql
|
293
298
|
end
|
294
299
|
end
|
300
|
+
|
301
|
+
def delete_records(records)
|
302
|
+
if @reflection.options[:dependent]
|
303
|
+
records.each { |r| r.destroy }
|
304
|
+
else
|
305
|
+
field_names = @reflection.primary_key_name.split(',')
|
306
|
+
field_names.collect! {|n|
|
307
|
+
n + " = NULL"
|
308
|
+
}
|
309
|
+
records.each { |r|
|
310
|
+
where_class = nil
|
311
|
+
if r.quoted_id.include?(',')
|
312
|
+
where_class = [@reflection.klass.primary_key, r.quoted_id].transpose.map {|pair| "(#{pair[0]} = #{pair[1]})"}.join(" AND ")
|
313
|
+
else
|
314
|
+
where_class = @reflection.klass.primary_key + ' = ' + r.quoted_id
|
315
|
+
end
|
316
|
+
@reflection.klass.update_all( field_names.join(',') , where_class)
|
317
|
+
}
|
318
|
+
end
|
319
|
+
end
|
295
320
|
end
|
296
321
|
|
297
322
|
class HasOneAssociation < BelongsToAssociation #:nodoc:
|
@@ -300,7 +325,7 @@ module ActiveRecord::Associations
|
|
300
325
|
when @reflection.options[:as]
|
301
326
|
@finder_sql =
|
302
327
|
"#{@reflection.klass.table_name}.#{@reflection.options[:as]}_id = #{@owner.quoted_id} AND " +
|
303
|
-
"#{@reflection.klass.table_name}.#{@reflection.options[:as]}_type = #{@owner.class.
|
328
|
+
"#{@reflection.klass.table_name}.#{@reflection.options[:as]}_type = #{@owner.class.quote_value(@owner.class.base_class.name.to_s)}"
|
304
329
|
else
|
305
330
|
@finder_sql = full_columns_equals(@reflection.klass.table_name,
|
306
331
|
@reflection.primary_key_name, @owner.quoted_id)
|
@@ -313,7 +338,7 @@ module ActiveRecord::Associations
|
|
313
338
|
def construct_conditions
|
314
339
|
conditions = if @reflection.through_reflection.options[:as]
|
315
340
|
"#{@reflection.through_reflection.table_name}.#{@reflection.through_reflection.options[:as]}_id = #{@owner.quoted_id} " +
|
316
|
-
"AND #{@reflection.through_reflection.table_name}.#{@reflection.through_reflection.options[:as]}_type = #{@owner.class.
|
341
|
+
"AND #{@reflection.through_reflection.table_name}.#{@reflection.through_reflection.options[:as]}_type = #{@owner.class.quote_value(@owner.class.base_class.name.to_s)}"
|
317
342
|
else
|
318
343
|
@finder_sql = full_columns_equals(@reflection.through_reflection.table_name,
|
319
344
|
@reflection.through_reflection.primary_key_name, @owner.quoted_id)
|
@@ -334,7 +359,7 @@ module ActiveRecord::Associations
|
|
334
359
|
if @reflection.source_reflection.options[:as]
|
335
360
|
polymorphic_join = "AND %s.%s = %s" % [
|
336
361
|
@reflection.table_name, "#{@reflection.source_reflection.options[:as]}_type",
|
337
|
-
@owner.class.
|
362
|
+
@owner.class.quote_value(@reflection.through_reflection.klass.name)
|
338
363
|
]
|
339
364
|
end
|
340
365
|
end
|
@@ -293,7 +293,10 @@ module CompositePrimaryKeys
|
|
293
293
|
|
294
294
|
conditions = ids.map do |id_set|
|
295
295
|
[primary_keys, id_set].transpose.map do |key, id|
|
296
|
-
|
296
|
+
col = columns_hash[key.to_s]
|
297
|
+
val = quote_value(id, col)
|
298
|
+
|
299
|
+
"#{table_name}.#{key.to_s}=#{val}"
|
297
300
|
end.join(" AND ")
|
298
301
|
end.join(") OR (")
|
299
302
|
options.update :conditions => "(#{conditions})"
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module ActiveRecord
|
2
|
+
module ConnectionAdapters
|
3
|
+
class IBM_DBAdapter < AbstractAdapter
|
4
|
+
|
5
|
+
# This mightn't be in Core, but count(distinct x,y) doesn't work for me
|
6
|
+
def supports_count_distinct? #:nodoc:
|
7
|
+
false
|
8
|
+
end
|
9
|
+
|
10
|
+
alias_method :quote_original, :quote
|
11
|
+
def quote(value, column = nil)
|
12
|
+
if value.kind_of?(String) && column && [:integer, :float].include?(column.type)
|
13
|
+
value = column.type == :integer ? value.to_i : value.to_f
|
14
|
+
value.to_s
|
15
|
+
else
|
16
|
+
quote_original(value, column)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
ActiveRecord::ConnectionAdapters::ColumnDefinition.send(:alias_method, :to_s_without_composite_keys, :to_s)
|
2
|
+
|
3
|
+
ActiveRecord::ConnectionAdapters::ColumnDefinition.class_eval <<-'EOF'
|
4
|
+
def to_s
|
5
|
+
if name.is_a? Array
|
6
|
+
"PRIMARY KEY (#{name.join(',')})"
|
7
|
+
else
|
8
|
+
to_s_without_composite_keys
|
9
|
+
end
|
10
|
+
end
|
11
|
+
EOF
|
12
|
+
|
13
|
+
|
data/loader.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# Load local config files in /local
|
2
|
+
begin
|
3
|
+
local_file_supported = Dir[File.join(PROJECT_ROOT, 'local/*.sample')].map { |path| File.basename(path).sub(".sample","") }
|
4
|
+
local_file_supported.each do |file|
|
5
|
+
require "local/#{file}"
|
6
|
+
end
|
7
|
+
rescue LoadError
|
8
|
+
puts <<-EOS
|
9
|
+
This Gem supports local developer extensions in local/ folder.
|
10
|
+
Supported files:
|
11
|
+
#{local_file_supported.map { |f| "local/#{f}"}.join(', ')}
|
12
|
+
|
13
|
+
Setup default sample files:
|
14
|
+
rake local:setup
|
15
|
+
|
16
|
+
Current warning: #{$!}
|
17
|
+
|
18
|
+
EOS
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
# Now load Rake tasks from /tasks
|
23
|
+
rakefiles = Dir[File.join(File.dirname(__FILE__), "tasks/**/*.rake")]
|
24
|
+
rakefiles.each { |rakefile| load File.expand_path(rakefile) }
|
data/scripts/console.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# FIXME:
|
2
|
+
# I haven't figured out how to setup an irb console yet.
|
3
|
+
# So, from the root, run:
|
4
|
+
# irb -f -r scripts/console
|
5
|
+
|
6
|
+
PROJECT_ROOT = '.' #File.join(File.dirname(__FILE__), '..')
|
7
|
+
|
8
|
+
adapter = 'mysql'
|
9
|
+
$:.unshift 'lib'
|
10
|
+
|
11
|
+
require "local/database_connections"
|
12
|
+
begin
|
13
|
+
require "local/paths"
|
14
|
+
$:.unshift "#{ENV['EDGE_RAILS_DIR']}/activerecord/lib" if ENV['EDGE_RAILS_DIR']
|
15
|
+
$:.unshift "#{ENV['EDGE_RAILS_DIR']}/activesupport/lib" if ENV['EDGE_RAILS_DIR']
|
16
|
+
rescue
|
17
|
+
end
|
18
|
+
|
19
|
+
require 'active_support'
|
20
|
+
require 'active_record'
|
21
|
+
|
22
|
+
require "test/connections/native_#{adapter}/connection"
|
23
|
+
require 'composite_primary_keys'
|
24
|
+
|
25
|
+
Dir[File.join(PROJECT_ROOT,'test/fixtures/*.rb')].each { |model| require model }
|
@@ -0,0 +1,43 @@
|
|
1
|
+
namespace :ar do
|
2
|
+
desc 'Pre-load edge rails ActiveRecord'
|
3
|
+
task :edge do
|
4
|
+
unless path = ENV['EDGE_RAILS_DIR'] || ENV['EDGE_RAILS']
|
5
|
+
puts <<-EOS
|
6
|
+
|
7
|
+
Need to define env var EDGE_RAILS_DIR or EDGE_RAILS- root of edge rails on your machine.
|
8
|
+
i) Get copy of Edge Rails - http://dev.rubyonrails.org
|
9
|
+
ii) Set EDGE_RAILS_DIR to this folder in local/paths.rb - see local/paths.rb.sample for example
|
10
|
+
or
|
11
|
+
a) Set folder from environment or command line (rake ar:edge EDGE_RAILS_DIR=/path/to/rails)
|
12
|
+
|
13
|
+
EOS
|
14
|
+
exit
|
15
|
+
end
|
16
|
+
|
17
|
+
ENV['AR_LOAD_PATH'] = File.join(path, "activerecord/lib")
|
18
|
+
end
|
19
|
+
|
20
|
+
desc 'Pre-load ActiveRecord using VERSION=X.Y.Z, instead of latest'
|
21
|
+
task :set do
|
22
|
+
unless version = ENV['VERSION']
|
23
|
+
puts <<-EOS
|
24
|
+
Usage: rake ar:get_version VERSION=1.15.3
|
25
|
+
Specify the version number with VERSION=X.Y.Z; and make sure you have that activerecord gem version installed.
|
26
|
+
|
27
|
+
EOS
|
28
|
+
end
|
29
|
+
version = nil if version == "" || version == []
|
30
|
+
begin
|
31
|
+
version ? gem('activerecord', version) : gem('activerecord')
|
32
|
+
require 'active_record'
|
33
|
+
ENV['AR_LOAD_PATH'] = $:.reverse.find { |path| /activerecord/ =~ path }
|
34
|
+
rescue LoadError
|
35
|
+
puts <<-EOS
|
36
|
+
Missing: Cannot find activerecord #{version} installed.
|
37
|
+
Install: gem install activerecord -v #{version}
|
38
|
+
|
39
|
+
EOS
|
40
|
+
exit
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
# UNTESTED - firebird sqlserver sqlserver_odbc db2 sybase openbase
|
2
|
+
for adapter in %w( mysql sqlite oracle postgresql ibm_db )
|
3
|
+
Rake::TestTask.new("test_#{adapter}") { |t|
|
4
|
+
t.libs << "test" << "test/connections/native_#{adapter}"
|
5
|
+
t.pattern = "test/test_*.rb"
|
6
|
+
t.verbose = true
|
7
|
+
}
|
8
|
+
end
|
9
|
+
|
10
|
+
SCHEMA_PATH = File.join(PROJECT_ROOT, *%w(test fixtures db_definitions))
|
@@ -0,0 +1,30 @@
|
|
1
|
+
namespace :mysql do
|
2
|
+
desc 'Build the MySQL test databases'
|
3
|
+
task :build_databases => :load_connection do
|
4
|
+
puts File.join(SCHEMA_PATH, 'mysql.sql')
|
5
|
+
options_str = ENV['cpk_adapter_options_str']
|
6
|
+
# creates something like "-u#{username} -p#{password} -S#{socket}"
|
7
|
+
sh %{ mysqladmin #{options_str} create "#{GEM_NAME}_unittest" }
|
8
|
+
sh %{ mysql #{options_str} "#{GEM_NAME}_unittest" < #{File.join(SCHEMA_PATH, 'mysql.sql')} }
|
9
|
+
end
|
10
|
+
|
11
|
+
desc 'Drop the MySQL test databases'
|
12
|
+
task :drop_databases => :load_connection do
|
13
|
+
options_str = ENV['cpk_adapter_options_str']
|
14
|
+
sh %{ mysqladmin #{options_str} -f drop "#{GEM_NAME}_unittest" }
|
15
|
+
end
|
16
|
+
|
17
|
+
desc 'Rebuild the MySQL test databases'
|
18
|
+
task :rebuild_databases => [:drop_databases, :build_databases]
|
19
|
+
|
20
|
+
task :load_connection do
|
21
|
+
require File.join(PROJECT_ROOT, %w[lib adapter_helper mysql])
|
22
|
+
spec = AdapterHelper::MySQL.load_connection_from_env
|
23
|
+
options = {}
|
24
|
+
options['u'] = spec[:username] if spec[:username]
|
25
|
+
options['p'] = spec[:password] if spec[:password]
|
26
|
+
options['S'] = spec[:sock] if spec[:sock]
|
27
|
+
options_str = options.map { |key, value| "-#{key}#{value}" }.join(" ")
|
28
|
+
ENV['cpk_adapter_options_str'] = options_str
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
namespace :oracle do
|
2
|
+
desc 'Build the Oracle test databases'
|
3
|
+
task :build_databases do
|
4
|
+
puts File.join(SCHEMA_PATH, 'oracle.sql')
|
5
|
+
sh %( sqlplus holstdl/holstdl@test < #{File.join(SCHEMA_PATH, 'oracle.sql')} )
|
6
|
+
end
|
7
|
+
|
8
|
+
desc 'Drop the Oracle test databases'
|
9
|
+
task :drop_databases do
|
10
|
+
sh %( sqlplus holstdl/holstdl@test < #{File.join(SCHEMA_PATH, 'oracle.drop.sql')} )
|
11
|
+
end
|
12
|
+
|
13
|
+
desc 'Rebuild the Oracle test databases'
|
14
|
+
task :rebuild_databases => [:drop_databases, :build_databases]
|
15
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
namespace :postgresql do
|
2
|
+
desc 'Build the PostgreSQL test databases'
|
3
|
+
task :build_databases => :load_connection do
|
4
|
+
sh %{ createdb "#{GEM_NAME}_unittest" }
|
5
|
+
sh %{ psql "#{GEM_NAME}_unittest" -f #{File.join(SCHEMA_PATH, 'postgresql.sql')} }
|
6
|
+
end
|
7
|
+
|
8
|
+
desc 'Drop the PostgreSQL test databases'
|
9
|
+
task :drop_databases => :load_connection do
|
10
|
+
sh %{ dropdb "#{GEM_NAME}_unittest" }
|
11
|
+
end
|
12
|
+
|
13
|
+
desc 'Rebuild the PostgreSQL test databases'
|
14
|
+
task :rebuild_databases => [:drop_databases, :build_databases]
|
15
|
+
|
16
|
+
task :load_connection do
|
17
|
+
require File.join(PROJECT_ROOT, %w[lib adapter_helper postgresql])
|
18
|
+
spec = AdapterHelper::Postgresql.load_connection_from_env
|
19
|
+
options = {}
|
20
|
+
options['u'] = spec[:username] if spec[:username]
|
21
|
+
options['p'] = spec[:password] if spec[:password]
|
22
|
+
options_str = options.map { |key, value| "-#{key}#{value}" }.join(" ")
|
23
|
+
ENV['cpk_adapter_options_str'] = options_str
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|