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
@@ -0,0 +1,28 @@
|
|
1
|
+
namespace :sqlite3 do
|
2
|
+
desc 'Build the sqlite test databases'
|
3
|
+
task :build_databases => :load_connection do
|
4
|
+
file = File.join(SCHEMA_PATH, 'sqlite.sql')
|
5
|
+
dbfile = File.join(PROJECT_ROOT, ENV['cpk_adapter_options_str'])
|
6
|
+
cmd = "mkdir -p #{File.dirname(dbfile)}"
|
7
|
+
puts cmd
|
8
|
+
sh %{ #{cmd} }
|
9
|
+
cmd = "sqlite3 #{dbfile} < #{file}"
|
10
|
+
puts cmd
|
11
|
+
sh %{ #{cmd} }
|
12
|
+
end
|
13
|
+
|
14
|
+
desc 'Drop the sqlite test databases'
|
15
|
+
task :drop_databases => :load_connection do
|
16
|
+
dbfile = ENV['cpk_adapter_options_str']
|
17
|
+
sh %{ rm -f #{dbfile} }
|
18
|
+
end
|
19
|
+
|
20
|
+
desc 'Rebuild the sqlite test databases'
|
21
|
+
task :rebuild_databases => [:drop_databases, :build_databases]
|
22
|
+
|
23
|
+
task :load_connection do
|
24
|
+
require File.join(PROJECT_ROOT, %w[lib adapter_helper sqlite3])
|
25
|
+
spec = AdapterHelper::Sqlite3.load_connection_from_env
|
26
|
+
ENV['cpk_adapter_options_str'] = spec[:dbfile]
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
desc 'Release the website and new gem version'
|
2
|
+
task :deploy => [:check_version, :website, :release] do
|
3
|
+
puts "Remember to create SVN tag:"
|
4
|
+
puts "svn copy svn+ssh://#{RUBYFORGE_USERNAME}@rubyforge.org/var/svn/#{PATH}/trunk " +
|
5
|
+
"svn+ssh://#{RUBYFORGE_USERNAME}@rubyforge.org/var/svn/#{PATH}/tags/REL-#{VERS} "
|
6
|
+
puts "Suggested comment:"
|
7
|
+
puts "Tagging release #{CHANGES}"
|
8
|
+
end
|
9
|
+
|
10
|
+
desc 'Runs tasks website_generate and install_gem as a local deployment of the gem'
|
11
|
+
task :local_deploy => [:website_generate, :install_gem]
|
12
|
+
|
13
|
+
task :check_version do
|
14
|
+
unless ENV['VERSION']
|
15
|
+
puts 'Must pass a VERSION=x.y.z release version'
|
16
|
+
exit
|
17
|
+
end
|
18
|
+
unless ENV['VERSION'] == VERS
|
19
|
+
puts "Please update your version.rb to match the release version, currently #{VERS}"
|
20
|
+
exit
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
namespace :local do
|
2
|
+
desc 'Copies over the same local files ready for editing'
|
3
|
+
task :setup do
|
4
|
+
sample_files = Dir[File.join(PROJECT_ROOT, "local/*.rb.sample")]
|
5
|
+
sample_files.each do |sample_file|
|
6
|
+
file = sample_file.sub(".sample","")
|
7
|
+
unless File.exists?(file)
|
8
|
+
puts "Copying #{sample_file} -> #{file}"
|
9
|
+
sh %{ cp #{sample_file} #{file} }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
data/tasks/website.rake
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
desc 'Generate website files'
|
2
|
+
task :website_generate do
|
3
|
+
sh %{ ruby scripts/txt2html website/index.txt > website/index.html }
|
4
|
+
sh %{ ruby scripts/txt2js website/version.txt > website/version.js }
|
5
|
+
sh %{ ruby scripts/txt2js website/version-raw.txt > website/version-raw.js }
|
6
|
+
end
|
7
|
+
|
8
|
+
desc 'Upload website files to rubyforge'
|
9
|
+
task :website_upload do
|
10
|
+
config = YAML.load(File.read(File.expand_path("~/.rubyforge/user-config.yml")))
|
11
|
+
host = "#{config["username"]}@rubyforge.org"
|
12
|
+
remote_dir = "/var/www/gforge-projects/#{RUBYFORGE_PROJECT}/"
|
13
|
+
local_dir = 'website'
|
14
|
+
sh %{rsync -aCv #{local_dir}/ #{host}:#{remote_dir}}
|
15
|
+
end
|
16
|
+
|
17
|
+
desc 'Generate and upload website files'
|
18
|
+
task :website => [:website_generate, :website_upload, :publish_docs]
|
@@ -0,0 +1,67 @@
|
|
1
|
+
= Composite Primary Keys - Testing Readme
|
2
|
+
|
3
|
+
== Testing an adapter
|
4
|
+
|
5
|
+
There are tests available for the following adapters:
|
6
|
+
|
7
|
+
* ibmdb
|
8
|
+
* mysql
|
9
|
+
* oracle
|
10
|
+
* postgresql
|
11
|
+
* sqlite
|
12
|
+
|
13
|
+
To run the tests for on of the adapters, follow these steps (using mysql in the example):
|
14
|
+
|
15
|
+
* rake -T | grep mysql
|
16
|
+
|
17
|
+
rake mysql:build_databases # Build the MySQL test databases
|
18
|
+
rake mysql:drop_databases # Drop the MySQL test databases
|
19
|
+
rake mysql:rebuild_databases # Rebuild the MySQL test databases
|
20
|
+
rake test_mysql # Run tests for test_mysql
|
21
|
+
|
22
|
+
* rake mysql:build_databases
|
23
|
+
* rake test_mysql
|
24
|
+
|
25
|
+
== Testing against different ActiveRecord versions (or Edge Rails)
|
26
|
+
|
27
|
+
ActiveRecord is a RubyGem within Rails, and is constantly being improved/changed on
|
28
|
+
its repository (http://dev.rubyonrails.org). These changes may create errors for the CPK
|
29
|
+
gem. So, we need a way to test CPK against Edge Rails, as well as officially released RubyGems.
|
30
|
+
|
31
|
+
The default test (as above) uses the latest RubyGem in your cache.
|
32
|
+
|
33
|
+
You can select an older RubyGem version by running the following:
|
34
|
+
|
35
|
+
* rake ar:set VERSION=1.14.4 test_mysql
|
36
|
+
|
37
|
+
== Edge Rails
|
38
|
+
|
39
|
+
Before you can test CPK against Edge Rails, you must checkout a copy of edge rails somewhere (see http://dev.rubyonrails.org for for examples)
|
40
|
+
|
41
|
+
* cd /path/to/gems
|
42
|
+
* svn co http://svn.rubyonrails.org/rails/trunk rails
|
43
|
+
|
44
|
+
Say the rails folder is /path/to/gems/rails
|
45
|
+
|
46
|
+
Three ways to run CPK tests for Edge Rails:
|
47
|
+
|
48
|
+
i) Run:
|
49
|
+
|
50
|
+
EDGE_RAILS_DIR=/path/to/gems/rails rake ar:edge test_mysql
|
51
|
+
|
52
|
+
ii) In your .profile, set the environment variable EDGE_RAILS_DIR=/path/to/gems/rails,
|
53
|
+
and once you reload your profile, run:
|
54
|
+
|
55
|
+
rake ar:edge test_mysql
|
56
|
+
|
57
|
+
iii) Store the path in local/paths.rb. Run:
|
58
|
+
|
59
|
+
cp local/paths.rb.sample local/paths.rb
|
60
|
+
# Now set ENV['EDGE_RAILS_DIR']=/path/to/gems/rails
|
61
|
+
rake ar:edge test_mysql
|
62
|
+
|
63
|
+
These are all variations of the same theme:
|
64
|
+
|
65
|
+
* Set the environment variable EDGE_RAILS_DIR to the path to Rails (which contains the activerecord/lib folder)
|
66
|
+
* Run: rake ar:edge test_<adapter>
|
67
|
+
|
data/test/abstract_unit.rb
CHANGED
@@ -1,12 +1,10 @@
|
|
1
|
-
$:.unshift(
|
1
|
+
$:.unshift(ENV['AR_LOAD_PATH']) if ENV['AR_LOAD_PATH']
|
2
2
|
|
3
|
-
require 'rubygems'
|
4
3
|
require 'test/unit'
|
5
4
|
require 'hash_tricks'
|
5
|
+
require 'rubygems'
|
6
6
|
require 'active_record'
|
7
7
|
require 'active_record/fixtures'
|
8
|
-
require 'active_support/binding_of_caller'
|
9
|
-
require 'active_support/breakpoint'
|
10
8
|
begin
|
11
9
|
require 'connection'
|
12
10
|
rescue MissingSourceFile => e
|
@@ -0,0 +1,23 @@
|
|
1
|
+
print "Using IBM2 \n"
|
2
|
+
require 'logger'
|
3
|
+
|
4
|
+
gem 'ibm_db'
|
5
|
+
require 'IBM_DB'
|
6
|
+
|
7
|
+
RAILS_CONNECTION_ADAPTERS = %w( mysql postgresql sqlite firebird sqlserver db2 oracle sybase openbase frontbase ibm_db )
|
8
|
+
|
9
|
+
|
10
|
+
ActiveRecord::Base.logger = Logger.new("debug.log")
|
11
|
+
|
12
|
+
db1 = 'composite_primary_keys_unittest'
|
13
|
+
|
14
|
+
connection_options = {
|
15
|
+
:adapter => "ibm_db",
|
16
|
+
:database => "ocdpdev",
|
17
|
+
:username => "db2inst1",
|
18
|
+
:password => "password",
|
19
|
+
:host => '192.168.2.21'
|
20
|
+
}
|
21
|
+
|
22
|
+
ActiveRecord::Base.configurations = { db1 => connection_options }
|
23
|
+
ActiveRecord::Base.establish_connection(connection_options)
|
@@ -1,18 +1,13 @@
|
|
1
1
|
print "Using native MySQL\n"
|
2
|
+
require 'fileutils'
|
2
3
|
require 'logger'
|
4
|
+
require 'adapter_helper/mysql'
|
3
5
|
|
4
|
-
|
6
|
+
log_path = File.expand_path(File.join(File.dirname(__FILE__), %w[.. .. .. log]))
|
7
|
+
FileUtils.mkdir_p log_path
|
8
|
+
puts "Logging to #{log_path}/debug.log"
|
9
|
+
ActiveRecord::Base.logger = Logger.new("#{log_path}/debug.log")
|
5
10
|
|
6
|
-
|
7
|
-
|
8
|
-
connection_options = {
|
9
|
-
:adapter => "mysql",
|
10
|
-
:username => "root",
|
11
|
-
:password => "root",
|
12
|
-
:socket => '/Applications/MAMP/tmp/mysql/mysql.sock',
|
13
|
-
:encoding => "utf8",
|
14
|
-
:database => db1
|
15
|
-
}
|
16
|
-
|
17
|
-
ActiveRecord::Base.configurations = { db1 => connection_options }
|
11
|
+
# Adapter config setup in locals/database_connections.rb
|
12
|
+
connection_options = AdapterHelper::MySQL.load_connection_from_env
|
18
13
|
ActiveRecord::Base.establish_connection(connection_options)
|
@@ -1,16 +1,13 @@
|
|
1
1
|
print "Using native Oracle\n"
|
2
|
+
require 'fileutils'
|
2
3
|
require 'logger'
|
4
|
+
require 'adapter_helper/oracle'
|
3
5
|
|
4
|
-
|
6
|
+
log_path = File.expand_path(File.join(File.dirname(__FILE__), %w[.. .. .. log]))
|
7
|
+
FileUtils.mkdir_p log_path
|
8
|
+
puts "Logging to #{log_path}/debug.log"
|
9
|
+
ActiveRecord::Base.logger = Logger.new("#{log_path}/debug.log")
|
5
10
|
|
6
|
-
|
7
|
-
|
8
|
-
connection_options = {
|
9
|
-
:adapter => 'oci',
|
10
|
-
:username => 'holstdl',
|
11
|
-
:password => 'holstdl',
|
12
|
-
:host => 'test'
|
13
|
-
}
|
14
|
-
|
15
|
-
ActiveRecord::Base.configurations = { db1 => connection_options }
|
11
|
+
# Adapter config setup in locals/database_connections.rb
|
12
|
+
connection_options = AdapterHelper::MySQL.load_connection_from_env
|
16
13
|
ActiveRecord::Base.establish_connection(connection_options)
|
@@ -1,15 +1,9 @@
|
|
1
1
|
print "Using native Postgresql\n"
|
2
2
|
require 'logger'
|
3
|
+
require 'adapter_helper/postgresql'
|
3
4
|
|
4
5
|
ActiveRecord::Base.logger = Logger.new("debug.log")
|
5
6
|
|
6
|
-
|
7
|
-
|
8
|
-
connection_options = {
|
9
|
-
:adapter => "postgresql",
|
10
|
-
:encoding => "utf8",
|
11
|
-
:database => db1
|
12
|
-
}
|
13
|
-
|
14
|
-
ActiveRecord::Base.configurations = { db1 => connection_options }
|
7
|
+
# Adapter config setup in locals/database_connections.rb
|
8
|
+
connection_options = AdapterHelper::Postgresql.load_connection_from_env
|
15
9
|
ActiveRecord::Base.establish_connection(connection_options)
|
@@ -1,10 +1,9 @@
|
|
1
1
|
print "Using native Sqlite3\n"
|
2
2
|
require 'logger'
|
3
|
+
require 'adapter_helper/sqlite3'
|
3
4
|
|
4
5
|
ActiveRecord::Base.logger = Logger.new("debug.log")
|
5
6
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
)
|
10
|
-
|
7
|
+
# Adapter config setup in locals/database_connections.rb
|
8
|
+
connection_options = AdapterHelper::Sqlite3.load_connection_from_env
|
9
|
+
ActiveRecord::Base.establish_connection(connection_options)
|
@@ -0,0 +1,92 @@
|
|
1
|
+
CREATE TABLE reference_types (
|
2
|
+
reference_type_id integer NOT NULL generated by default as identity (start with 100, increment by 1, no cache),
|
3
|
+
type_label varchar(50) default NULL,
|
4
|
+
abbreviation varchar(50) default NULL,
|
5
|
+
description varchar(50) default NULL,
|
6
|
+
PRIMARY KEY (reference_type_id)
|
7
|
+
);
|
8
|
+
|
9
|
+
CREATE TABLE reference_codes (
|
10
|
+
reference_type_id integer NOT NULL,
|
11
|
+
reference_code integer NOT NULL,
|
12
|
+
code_label varchar(50) default NULL,
|
13
|
+
abbreviation varchar(50) default NULL,
|
14
|
+
description varchar(50) default NULL,
|
15
|
+
PRIMARY KEY (reference_type_id,reference_code)
|
16
|
+
);
|
17
|
+
|
18
|
+
CREATE TABLE products (
|
19
|
+
id integer NOT NULL,
|
20
|
+
name varchar(50) default NULL,
|
21
|
+
PRIMARY KEY (id)
|
22
|
+
);
|
23
|
+
|
24
|
+
CREATE TABLE tariffs (
|
25
|
+
tariff_id integer NOT NULL,
|
26
|
+
start_date date NOT NULL,
|
27
|
+
amount integer default NULL,
|
28
|
+
PRIMARY KEY (tariff_id,start_date)
|
29
|
+
);
|
30
|
+
|
31
|
+
CREATE TABLE product_tariffs (
|
32
|
+
product_id integer NOT NULL,
|
33
|
+
tariff_id integer NOT NULL,
|
34
|
+
tariff_start_date date NOT NULL,
|
35
|
+
PRIMARY KEY (product_id,tariff_id,tariff_start_date)
|
36
|
+
);
|
37
|
+
|
38
|
+
CREATE TABLE suburbs (
|
39
|
+
city_id integer NOT NULL,
|
40
|
+
suburb_id integer NOT NULL,
|
41
|
+
name varchar(50) NOT NULL,
|
42
|
+
PRIMARY KEY (city_id,suburb_id)
|
43
|
+
);
|
44
|
+
|
45
|
+
CREATE TABLE streets (
|
46
|
+
id integer NOT NULL ,
|
47
|
+
city_id integer NOT NULL,
|
48
|
+
suburb_id integer NOT NULL,
|
49
|
+
name varchar(50) NOT NULL,
|
50
|
+
PRIMARY KEY (id)
|
51
|
+
);
|
52
|
+
|
53
|
+
CREATE TABLE users (
|
54
|
+
id integer NOT NULL ,
|
55
|
+
name varchar(50) NOT NULL,
|
56
|
+
PRIMARY KEY (id)
|
57
|
+
);
|
58
|
+
|
59
|
+
CREATE TABLE articles (
|
60
|
+
id integer NOT NULL ,
|
61
|
+
name varchar(50) NOT NULL,
|
62
|
+
PRIMARY KEY (id)
|
63
|
+
);
|
64
|
+
|
65
|
+
CREATE TABLE readings (
|
66
|
+
id integer NOT NULL ,
|
67
|
+
user_id integer NOT NULL,
|
68
|
+
article_id integer NOT NULL,
|
69
|
+
rating integer NOT NULL,
|
70
|
+
PRIMARY KEY (id)
|
71
|
+
);
|
72
|
+
|
73
|
+
CREATE TABLE groups (
|
74
|
+
id integer NOT NULL ,
|
75
|
+
name varchar(50) NOT NULL,
|
76
|
+
PRIMARY KEY (id)
|
77
|
+
);
|
78
|
+
|
79
|
+
CREATE TABLE memberships (
|
80
|
+
user_id integer NOT NULL,
|
81
|
+
group_id integer NOT NULL,
|
82
|
+
PRIMARY KEY (user_id,group_id)
|
83
|
+
);
|
84
|
+
|
85
|
+
CREATE TABLE membership_statuses (
|
86
|
+
id integer NOT NULL ,
|
87
|
+
user_id integer NOT NULL,
|
88
|
+
group_id integer NOT NULL,
|
89
|
+
status varchar(50) NOT NULL,
|
90
|
+
PRIMARY KEY (id)
|
91
|
+
);
|
92
|
+
|
@@ -0,0 +1,13 @@
|
|
1
|
+
drop table MEMBERSHIPS;
|
2
|
+
drop table REFERENCE_CODES;
|
3
|
+
drop table TARIFFS;
|
4
|
+
drop table ARTICLES;
|
5
|
+
drop table GROUPS;
|
6
|
+
drop table MEMBERSHIP_STATUSES;
|
7
|
+
drop table READINGS;
|
8
|
+
drop table REFERENCE_TYPES;
|
9
|
+
drop table STREETS;
|
10
|
+
drop table PRODUCTS;
|
11
|
+
drop table USERS;
|
12
|
+
drop table SUBURBS;
|
13
|
+
drop table PRODUCT_TARIFFS;
|
@@ -90,3 +90,27 @@ CREATE TABLE membership_statuses (
|
|
90
90
|
PRIMARY KEY (id)
|
91
91
|
) TYPE=InnoDB;
|
92
92
|
|
93
|
+
CREATE TABLE departments (
|
94
|
+
department_id int(11) NOT NULL,
|
95
|
+
location_id int(11) NOT NULL,
|
96
|
+
PRIMARY KEY (department_id, location_id)
|
97
|
+
);
|
98
|
+
|
99
|
+
CREATE TABLE employees (
|
100
|
+
id int(11) NOT NULL auto_increment,
|
101
|
+
department_id int(11) DEFAULT NULL,
|
102
|
+
location_id int(11) DEFAULT NULL,
|
103
|
+
PRIMARY KEY (id)
|
104
|
+
);
|
105
|
+
|
106
|
+
CREATE TABLE comments (
|
107
|
+
id int(11) NOT NULL auto_increment,
|
108
|
+
person_id varchar(100) DEFAULT NULL,
|
109
|
+
person_type varchar(100) DEFAULT NULL,
|
110
|
+
PRIMARY KEY (id)
|
111
|
+
);
|
112
|
+
|
113
|
+
CREATE TABLE hacks (
|
114
|
+
name varchar(50) NOT NULL,
|
115
|
+
PRIMARY KEY (name)
|
116
|
+
);
|