robdimarco_rails_sql_views 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +22 -0
- data/CONTRIB +8 -0
- data/LICENSE +7 -0
- data/README +51 -0
- data/Rakefile +41 -0
- data/TODO +2 -0
- data/init.rb +1 -0
- data/lib/active_record/view.rb +76 -0
- data/lib/core_ext/module.rb +13 -0
- data/lib/rails_sql_views.rb +51 -0
- data/lib/rails_sql_views/connection_adapters/abstract/schema_definitions.rb +63 -0
- data/lib/rails_sql_views/connection_adapters/abstract/schema_statements.rb +81 -0
- data/lib/rails_sql_views/connection_adapters/abstract_adapter.rb +41 -0
- data/lib/rails_sql_views/connection_adapters/mysql2_adapter.rb +62 -0
- data/lib/rails_sql_views/connection_adapters/mysql_adapter.rb +66 -0
- data/lib/rails_sql_views/connection_adapters/oci_adapter.rb +33 -0
- data/lib/rails_sql_views/connection_adapters/oracle_adapter.rb +33 -0
- data/lib/rails_sql_views/connection_adapters/oracleenhanced_adapter.rb +39 -0
- data/lib/rails_sql_views/connection_adapters/oracleenhanced_adapter.rb.orig +72 -0
- data/lib/rails_sql_views/connection_adapters/postgresql_adapter.rb +65 -0
- data/lib/rails_sql_views/connection_adapters/postgresql_adapter.rb.orig +69 -0
- data/lib/rails_sql_views/connection_adapters/sqlite_adapter.rb +66 -0
- data/lib/rails_sql_views/connection_adapters/sqlserver_adapter.rb +43 -0
- data/lib/rails_sql_views/loader.rb +20 -0
- data/lib/rails_sql_views/schema_dumper.rb +113 -0
- data/lib/rails_sql_views/version.rb +9 -0
- data/rails/init.rb +1 -0
- data/test/README +63 -0
- data/test/adapter_test.rb +82 -0
- data/test/connection.example.yml +12 -0
- data/test/connection/native_mysql/connection.rb +32 -0
- data/test/connection/native_mysql/schema.sql +33 -0
- data/test/connection/native_mysql2/connection.rb +32 -0
- data/test/connection/native_mysql2/schema.sql +33 -0
- data/test/connection/native_postgresql/connection.rb +31 -0
- data/test/connection/native_postgresql/schema.sql +33 -0
- data/test/connection/oracle_enhanced/connection.rb +29 -0
- data/test/connection/oracle_enhanced/procedures.sql +15 -0
- data/test/connection/oracle_enhanced/schema.sql +39 -0
- data/test/models/item.rb +4 -0
- data/test/models/person.rb +5 -0
- data/test/models/person2.rb +3 -0
- data/test/models/place.rb +2 -0
- data/test/models/v_person.rb +4 -0
- data/test/models/v_profile.rb +3 -0
- data/test/schema.native_mysql.expected.rb +57 -0
- data/test/schema.native_mysql2.expected.rb +58 -0
- data/test/schema.native_postgresql.expected.rb +51 -0
- data/test/schema.oracle_enhanced.expected.rb +51 -0
- data/test/schema_dumper_test.rb +130 -0
- data/test/test_helper.rb +30 -0
- data/test/view_model_test.rb +63 -0
- data/test/view_operations_test.rb +36 -0
- metadata +246 -0
@@ -0,0 +1,33 @@
|
|
1
|
+
drop table if exists people;
|
2
|
+
create table people (
|
3
|
+
id int(11) DEFAULT NULL auto_increment PRIMARY KEY,
|
4
|
+
first_name char(255),
|
5
|
+
last_name char(255),
|
6
|
+
ssn char(64),
|
7
|
+
address_id integer
|
8
|
+
);
|
9
|
+
drop table if exists people2;
|
10
|
+
create table people2 (
|
11
|
+
id int(11) DEFAULT NULL auto_increment PRIMARY KEY,
|
12
|
+
first_name char(255),
|
13
|
+
last_name char(255),
|
14
|
+
ssn char(64)
|
15
|
+
);
|
16
|
+
drop table if exists places;
|
17
|
+
create table places (
|
18
|
+
id int(11) DEFAULT NULL auto_increment PRIMARY KEY,
|
19
|
+
address text,
|
20
|
+
city char(255),
|
21
|
+
cstate char(255),
|
22
|
+
country char(2)
|
23
|
+
);
|
24
|
+
drop table if exists items;
|
25
|
+
create table items (
|
26
|
+
id int(11) DEFAULT NULL auto_increment PRIMARY KEY,
|
27
|
+
person_id int(11)
|
28
|
+
);
|
29
|
+
drop table if exists items_people;
|
30
|
+
create table items_people (
|
31
|
+
person_id int(11),
|
32
|
+
item_id int(11)
|
33
|
+
);
|
@@ -0,0 +1,32 @@
|
|
1
|
+
print "Using native MySQL2\n"
|
2
|
+
|
3
|
+
adapter_name = 'mysql2'
|
4
|
+
config = YAML.load_file(File.join(File.dirname(__FILE__), '/../../connection.yml'))[adapter_name]
|
5
|
+
|
6
|
+
#require 'logger'
|
7
|
+
#ActiveRecord::Base.logger = Logger.new("debug.log")
|
8
|
+
|
9
|
+
ActiveRecord::Base.silence do
|
10
|
+
ActiveRecord::Base.configurations = {
|
11
|
+
config['database'] => {
|
12
|
+
:adapter => adapter_name,
|
13
|
+
:username => config['username'],
|
14
|
+
:password => config['password'],
|
15
|
+
:host => config['host'],
|
16
|
+
:database => config['database'],
|
17
|
+
:encoding => config['encoding'],
|
18
|
+
:schema_file => config['schema_file'],
|
19
|
+
}
|
20
|
+
}
|
21
|
+
|
22
|
+
ActiveRecord::Base.establish_connection config['database']
|
23
|
+
ActiveRecord::Migration.verbose = false
|
24
|
+
|
25
|
+
puts "Resetting database"
|
26
|
+
conn = ActiveRecord::Base.connection
|
27
|
+
conn.recreate_database(conn.current_database)
|
28
|
+
conn.reconnect!
|
29
|
+
lines = open(File.join(File.dirname(__FILE__), ActiveRecord::Base.configurations[config['database']][:schema_file])).readlines
|
30
|
+
lines.join.split(';').each { |line| conn.execute(line) }
|
31
|
+
conn.reconnect!
|
32
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
drop table if exists people;
|
2
|
+
create table people (
|
3
|
+
id int(11) DEFAULT NULL auto_increment PRIMARY KEY,
|
4
|
+
first_name char(255),
|
5
|
+
last_name char(255),
|
6
|
+
ssn char(64),
|
7
|
+
address_id integer
|
8
|
+
);
|
9
|
+
drop table if exists people2;
|
10
|
+
create table people2 (
|
11
|
+
id int(11) DEFAULT NULL auto_increment PRIMARY KEY,
|
12
|
+
first_name char(255),
|
13
|
+
last_name char(255),
|
14
|
+
ssn char(64)
|
15
|
+
);
|
16
|
+
drop table if exists places;
|
17
|
+
create table places (
|
18
|
+
id int(11) DEFAULT NULL auto_increment PRIMARY KEY,
|
19
|
+
address text,
|
20
|
+
city char(255),
|
21
|
+
cstate char(255),
|
22
|
+
country char(2)
|
23
|
+
);
|
24
|
+
drop table if exists items;
|
25
|
+
create table items (
|
26
|
+
id int(11) DEFAULT NULL auto_increment PRIMARY KEY,
|
27
|
+
person_id int(11)
|
28
|
+
);
|
29
|
+
drop table if exists items_people;
|
30
|
+
create table items_people (
|
31
|
+
person_id int(11),
|
32
|
+
item_id int(11)
|
33
|
+
);
|
@@ -0,0 +1,31 @@
|
|
1
|
+
print "Using native PostgreSQL\n"
|
2
|
+
|
3
|
+
adapter_name = 'postgresql'
|
4
|
+
config = YAML.load_file(File.join(File.dirname(__FILE__), '/../../connection.yml'))[adapter_name]
|
5
|
+
|
6
|
+
#require 'logger'
|
7
|
+
#ActiveRecord::Base.logger = Logger.new("debug.log")
|
8
|
+
|
9
|
+
ActiveRecord::Base.silence do
|
10
|
+
ActiveRecord::Base.configurations = {
|
11
|
+
'rails_sql_views_unittest' => {
|
12
|
+
:adapter => adapter_name,
|
13
|
+
:username => config['username'],
|
14
|
+
:password => config['password'],
|
15
|
+
:host => config['host'],
|
16
|
+
:database => config['database'],
|
17
|
+
:encoding => config['encoding'],
|
18
|
+
:schema_file => config['schema_file'],
|
19
|
+
}
|
20
|
+
}
|
21
|
+
|
22
|
+
ActiveRecord::Base.establish_connection config['database']
|
23
|
+
|
24
|
+
puts "Resetting database"
|
25
|
+
conn = ActiveRecord::Base.connection
|
26
|
+
#conn.recreate_database(conn.current_database)
|
27
|
+
conn.reconnect!
|
28
|
+
lines = open(File.join(File.dirname(__FILE__), ActiveRecord::Base.configurations[config['database']][:schema_file])).readlines
|
29
|
+
lines.join.split(';').each { |line| conn.execute(line) }
|
30
|
+
conn.reconnect!
|
31
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
drop table if exists people CASCADE;
|
2
|
+
create table people (
|
3
|
+
id serial primary key,
|
4
|
+
first_name char(255),
|
5
|
+
last_name char(255),
|
6
|
+
ssn char(64),
|
7
|
+
address_id integer
|
8
|
+
);
|
9
|
+
drop table if exists people2 CASCADE;
|
10
|
+
create table people2 (
|
11
|
+
id serial primary key,
|
12
|
+
first_name char(255),
|
13
|
+
last_name char(255),
|
14
|
+
ssn char(64)
|
15
|
+
);
|
16
|
+
drop table if exists places CASCADE;
|
17
|
+
create table places (
|
18
|
+
id serial primary key,
|
19
|
+
address text,
|
20
|
+
city char(255),
|
21
|
+
cstate char(255),
|
22
|
+
country char(2)
|
23
|
+
);
|
24
|
+
drop table if exists items CASCADE;
|
25
|
+
create table items (
|
26
|
+
id serial primary key,
|
27
|
+
person_id integer
|
28
|
+
);
|
29
|
+
drop table if exists items_people CASCADE;
|
30
|
+
create table items_people (
|
31
|
+
person_id integer,
|
32
|
+
item_id integer
|
33
|
+
);
|
@@ -0,0 +1,29 @@
|
|
1
|
+
print "Using Oracle Enhanced\n"
|
2
|
+
|
3
|
+
#require 'logger'
|
4
|
+
#ActiveRecord::Base.logger = Logger.new("debug.log")
|
5
|
+
|
6
|
+
ActiveRecord::Base.configurations = {
|
7
|
+
'rails_sql_views_unittest' => {
|
8
|
+
:adapter => :oracle_enhanced,
|
9
|
+
:username => 'rails_sql_views_unittest',
|
10
|
+
:password => 'rails',
|
11
|
+
:host => 'localhost',
|
12
|
+
:database => 'mydev',
|
13
|
+
:encoding => 'utf8',
|
14
|
+
:procedures_file => 'procedures.sql',
|
15
|
+
:schema_file => 'schema.sql',
|
16
|
+
}
|
17
|
+
}
|
18
|
+
|
19
|
+
ActiveRecord::Base.establish_connection 'rails_sql_views_unittest'
|
20
|
+
|
21
|
+
puts "Resetting database"
|
22
|
+
conn = ActiveRecord::Base.connection
|
23
|
+
#conn.recreate_database(conn.current_database)
|
24
|
+
conn.reconnect!
|
25
|
+
[:procedures_file, :schema_file].each do |file|
|
26
|
+
lines = open(File.join(File.dirname(__FILE__), ActiveRecord::Base.configurations['rails_sql_views_unittest'][file])).readlines
|
27
|
+
conn.execute(lines.to_s)
|
28
|
+
end
|
29
|
+
conn.reconnect!
|
@@ -0,0 +1,15 @@
|
|
1
|
+
create or replace
|
2
|
+
procedure dropTable (tab_name varchar2) as
|
3
|
+
this_tab_name user_tables.table_name%type;
|
4
|
+
cursor table_cur is
|
5
|
+
select table_name
|
6
|
+
from user_tables
|
7
|
+
where table_name = tab_name;
|
8
|
+
begin
|
9
|
+
open table_cur;
|
10
|
+
loop
|
11
|
+
fetch table_cur into this_tab_name;
|
12
|
+
exit when table_cur%notfound;
|
13
|
+
execute immediate 'drop table "' || this_tab_name || '"';
|
14
|
+
end loop;
|
15
|
+
end;
|
@@ -0,0 +1,39 @@
|
|
1
|
+
BEGIN
|
2
|
+
dropTable('PEOPLE');
|
3
|
+
EXECUTE IMMEDIATE 'create table people (
|
4
|
+
id integer primary key,
|
5
|
+
first_name varchar2(255),
|
6
|
+
last_name varchar2(255),
|
7
|
+
ssn varchar2(64),
|
8
|
+
address_id integer
|
9
|
+
)';
|
10
|
+
|
11
|
+
dropTable('PEOPLE2');
|
12
|
+
EXECUTE IMMEDIATE 'create table people2 (
|
13
|
+
id integer primary key,
|
14
|
+
first_name varchar2(255),
|
15
|
+
last_name varchar2(255),
|
16
|
+
ssn varchar2(64)
|
17
|
+
)';
|
18
|
+
|
19
|
+
dropTable('PLACES');
|
20
|
+
EXECUTE IMMEDIATE 'create table places (
|
21
|
+
id integer primary key,
|
22
|
+
address varchar2(2000),
|
23
|
+
city varchar2(255),
|
24
|
+
cstate varchar2(255),
|
25
|
+
country char(2)
|
26
|
+
)';
|
27
|
+
|
28
|
+
dropTable('ITEMS');
|
29
|
+
EXECUTE IMMEDIATE 'create table items (
|
30
|
+
id integer primary key,
|
31
|
+
person_id integer
|
32
|
+
)';
|
33
|
+
|
34
|
+
dropTable('ITEMS_PEOPLE');
|
35
|
+
EXECUTE IMMEDIATE 'create table items_people (
|
36
|
+
person_id integer,
|
37
|
+
item_id integer
|
38
|
+
)';
|
39
|
+
END;
|
data/test/models/item.rb
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
# This file is auto-generated from the current state of the database. Instead of editing this file,
|
2
|
+
# please use the migrations feature of Active Record to incrementally modify your database, and
|
3
|
+
# then regenerate this schema definition.
|
4
|
+
#
|
5
|
+
# Note that this schema.rb definition is the authoritative source for your database schema. If you need
|
6
|
+
# to create the application database on another system, you should be using db:schema:load, not running
|
7
|
+
# all the migrations from scratch. The latter is a flawed and unsustainable approach (the more migrations
|
8
|
+
# you'll amass, the slower it'll run and the greater likelihood for issues).
|
9
|
+
#
|
10
|
+
# It's strongly recommended to check this file into your version control system.
|
11
|
+
|
12
|
+
ActiveRecord::Schema.define(:version => 0) do
|
13
|
+
|
14
|
+
create_table "items", :force => true do |t|
|
15
|
+
t.integer "person_id"
|
16
|
+
end
|
17
|
+
|
18
|
+
create_table "items_people", :id => false, :force => true do |t|
|
19
|
+
t.integer "person_id"
|
20
|
+
t.integer "item_id"
|
21
|
+
end
|
22
|
+
|
23
|
+
create_table "people", :force => true do |t|
|
24
|
+
t.string "first_name"
|
25
|
+
t.string "last_name"
|
26
|
+
t.string "ssn", :limit => 64
|
27
|
+
t.integer "address_id"
|
28
|
+
end
|
29
|
+
|
30
|
+
create_table "people2", :force => true do |t|
|
31
|
+
t.string "first_name"
|
32
|
+
t.string "last_name"
|
33
|
+
t.string "ssn", :limit => 64
|
34
|
+
end
|
35
|
+
|
36
|
+
create_table "places", :force => true do |t|
|
37
|
+
t.text "address"
|
38
|
+
t.string "city"
|
39
|
+
t.string "cstate"
|
40
|
+
t.string "country", :limit => 2
|
41
|
+
end
|
42
|
+
|
43
|
+
create_view "v_people", "select `people`.`id` AS `id`,`people`.`first_name` AS `f_name`,`people`.`last_name` AS `l_name`,`people`.`ssn` AS `social_security`,`people`.`address_id` AS `address_id` from `people`", :force => true do |v|
|
44
|
+
v.column :id
|
45
|
+
v.column :f_name
|
46
|
+
v.column :l_name
|
47
|
+
v.column :social_security
|
48
|
+
v.column :address_id
|
49
|
+
end
|
50
|
+
|
51
|
+
create_view "v_profile", "select `people`.`first_name` AS `first_name`,`people`.`last_name` AS `last_name`,`people`.`ssn` AS `ssn` from `people` union select `people2`.`first_name` AS `first_name`,`people2`.`last_name` AS `last_name`,`people2`.`ssn` AS `ssn` from `people2`", :force => true do |v|
|
52
|
+
v.column :first_name
|
53
|
+
v.column :last_name
|
54
|
+
v.column :ssn
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# This file is auto-generated from the current state of the database. Instead
|
2
|
+
# of editing this file, please use the migrations feature of Active Record to
|
3
|
+
# incrementally modify your database, and then regenerate this schema definition.
|
4
|
+
#
|
5
|
+
# Note that this schema.rb definition is the authoritative source for your
|
6
|
+
# database schema. If you need to create the application database on another
|
7
|
+
# system, you should be using db:schema:load, not running all the migrations
|
8
|
+
# from scratch. The latter is a flawed and unsustainable approach (the more migrations
|
9
|
+
# you'll amass, the slower it'll run and the greater likelihood for issues).
|
10
|
+
#
|
11
|
+
# It's strongly recommended to check this file into your version control system.
|
12
|
+
|
13
|
+
ActiveRecord::Schema.define(:version => 0) do
|
14
|
+
|
15
|
+
create_table "items", :force => true do |t|
|
16
|
+
t.integer "person_id"
|
17
|
+
end
|
18
|
+
|
19
|
+
create_table "items_people", :id => false, :force => true do |t|
|
20
|
+
t.integer "person_id"
|
21
|
+
t.integer "item_id"
|
22
|
+
end
|
23
|
+
|
24
|
+
create_table "people", :force => true do |t|
|
25
|
+
t.string "first_name"
|
26
|
+
t.string "last_name"
|
27
|
+
t.string "ssn", :limit => 64
|
28
|
+
t.integer "address_id"
|
29
|
+
end
|
30
|
+
|
31
|
+
create_table "people2", :force => true do |t|
|
32
|
+
t.string "first_name"
|
33
|
+
t.string "last_name"
|
34
|
+
t.string "ssn", :limit => 64
|
35
|
+
end
|
36
|
+
|
37
|
+
create_table "places", :force => true do |t|
|
38
|
+
t.text "address"
|
39
|
+
t.string "city"
|
40
|
+
t.string "cstate"
|
41
|
+
t.string "country", :limit => 2
|
42
|
+
end
|
43
|
+
|
44
|
+
create_view "v_people", "select `people`.`id` AS `id`,`people`.`first_name` AS `f_name`,`people`.`last_name` AS `l_name`,`people`.`ssn` AS `social_security`,`people`.`address_id` AS `address_id` from `people`", :force => true do |v|
|
45
|
+
v.column :id
|
46
|
+
v.column :f_name
|
47
|
+
v.column :l_name
|
48
|
+
v.column :social_security
|
49
|
+
v.column :address_id
|
50
|
+
end
|
51
|
+
|
52
|
+
create_view "v_profile", "select `people`.`first_name` AS `first_name`,`people`.`last_name` AS `last_name`,`people`.`ssn` AS `ssn` from `people` union select `people2`.`first_name` AS `first_name`,`people2`.`last_name` AS `last_name`,`people2`.`ssn` AS `ssn` from `people2`", :force => true do |v|
|
53
|
+
v.column :first_name
|
54
|
+
v.column :last_name
|
55
|
+
v.column :ssn
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# This file is auto-generated from the current state of the database. Instead of editing this file,
|
2
|
+
# please use the migrations feature of Active Record to incrementally modify your database, and
|
3
|
+
# then regenerate this schema definition.
|
4
|
+
#
|
5
|
+
# Note that this schema.rb definition is the authoritative source for your database schema. If you need
|
6
|
+
# to create the application database on another system, you should be using db:schema:load, not running
|
7
|
+
# all the migrations from scratch. The latter is a flawed and unsustainable approach (the more migrations
|
8
|
+
# you'll amass, the slower it'll run and the greater likelihood for issues).
|
9
|
+
#
|
10
|
+
# It's strongly recommended to check this file into your version control system.
|
11
|
+
|
12
|
+
ActiveRecord::Schema.define(:version => 0) do
|
13
|
+
|
14
|
+
create_table "items", :force => true do |t|
|
15
|
+
t.integer "person_id"
|
16
|
+
end
|
17
|
+
|
18
|
+
create_table "items_people", :id => false, :force => true do |t|
|
19
|
+
t.integer "person_id"
|
20
|
+
t.integer "item_id"
|
21
|
+
end
|
22
|
+
|
23
|
+
create_table "people", :force => true do |t|
|
24
|
+
t.string "first_name"
|
25
|
+
t.string "last_name"
|
26
|
+
t.string "ssn", :limit => 64
|
27
|
+
t.integer "address_id"
|
28
|
+
end
|
29
|
+
|
30
|
+
create_table "people2", :force => true do |t|
|
31
|
+
t.string "first_name"
|
32
|
+
t.string "last_name"
|
33
|
+
t.string "ssn", :limit => 64
|
34
|
+
end
|
35
|
+
|
36
|
+
create_table "places", :force => true do |t|
|
37
|
+
t.text "address"
|
38
|
+
t.string "city"
|
39
|
+
t.string "cstate"
|
40
|
+
t.string "country", :limit => 2
|
41
|
+
end
|
42
|
+
|
43
|
+
create_view "v_people", "SELECT people.id, people.first_name AS f_name, people.last_name AS l_name, people.ssn AS social_security, people.address_id FROM people;", :force => true do |v|
|
44
|
+
v.column :id
|
45
|
+
v.column :f_name
|
46
|
+
v.column :l_name
|
47
|
+
v.column :social_security
|
48
|
+
v.column :address_id
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|