qubole_rails_sql_views 0.10.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 +22 -0
- data/LICENSE +7 -0
- data/README +51 -0
- data/Rakefile +74 -0
- data/TODO +2 -0
- data/lib/active_record/view.rb +76 -0
- data/lib/core_ext/module.rb +13 -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 +79 -0
- data/lib/rails_sql_views/connection_adapters/abstract_adapter.rb +41 -0
- data/lib/rails_sql_views/connection_adapters/mysql_adapter.rb +62 -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 +18 -0
- data/lib/rails_sql_views/schema_dumper.rb +112 -0
- data/lib/rails_sql_views/version.rb +9 -0
- data/lib/rails_sql_views.rb +47 -0
- data/test/adapter_test.rb +82 -0
- data/test/connection/native_mysql/connection.rb +32 -0
- data/test/connection/native_postgresql/connection.rb +31 -0
- data/test/connection/oracle_enhanced/connection.rb +29 -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 +51 -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 +117 -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 +135 -0
@@ -0,0 +1,65 @@
|
|
1
|
+
module RailsSqlViews
|
2
|
+
module ConnectionAdapters
|
3
|
+
module PostgreSQLAdapter
|
4
|
+
def self.included(base)
|
5
|
+
base.alias_method_chain :tables, :views_included
|
6
|
+
end
|
7
|
+
# Returns true as this adapter supports views.
|
8
|
+
def supports_views?
|
9
|
+
true
|
10
|
+
end
|
11
|
+
|
12
|
+
def tables_with_views_included(name = nil)
|
13
|
+
q = <<-SQL
|
14
|
+
SELECT table_name, table_type
|
15
|
+
FROM information_schema.tables
|
16
|
+
WHERE table_schema IN (#{schemas})
|
17
|
+
AND table_type IN ('BASE TABLE', 'VIEW')
|
18
|
+
SQL
|
19
|
+
|
20
|
+
query(q, name).map { |row| row[0] }
|
21
|
+
end
|
22
|
+
|
23
|
+
def base_tables(name = nil)
|
24
|
+
q = <<-SQL
|
25
|
+
SELECT table_name, table_type
|
26
|
+
FROM information_schema.tables
|
27
|
+
WHERE table_schema IN (#{schemas})
|
28
|
+
AND table_type = 'BASE TABLE'
|
29
|
+
SQL
|
30
|
+
|
31
|
+
query(q, name).map { |row| row[0] }
|
32
|
+
end
|
33
|
+
alias nonview_tables base_tables
|
34
|
+
|
35
|
+
def views(name = nil) #:nodoc:
|
36
|
+
q = <<-SQL
|
37
|
+
SELECT table_name, table_type
|
38
|
+
FROM information_schema.tables
|
39
|
+
WHERE table_schema IN (#{schemas})
|
40
|
+
AND table_type = 'VIEW'
|
41
|
+
SQL
|
42
|
+
|
43
|
+
query(q, name).map { |row| row[0] }
|
44
|
+
end
|
45
|
+
|
46
|
+
def view_select_statement(view, name = nil)
|
47
|
+
q = <<-SQL
|
48
|
+
SELECT view_definition
|
49
|
+
FROM information_schema.views
|
50
|
+
WHERE table_catalog = (SELECT catalog_name FROM information_schema.information_schema_catalog_name)
|
51
|
+
AND table_schema IN (#{schemas})
|
52
|
+
AND table_name = '#{view}'
|
53
|
+
SQL
|
54
|
+
|
55
|
+
select_value(q, name) or raise "No view called #{view} found"
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
def schemas
|
61
|
+
schema_search_path.split(/,/).map { |p| quote(p) }.join(',')
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
module RailsSqlViews
|
2
|
+
module ConnectionAdapters
|
3
|
+
module PostgreSQLAdapter
|
4
|
+
def self.included(base)
|
5
|
+
<<<<<<< HEAD
|
6
|
+
base.alias_method_chain :tables, :views_included unless method_defined?(:tables_with_views_included)
|
7
|
+
=======
|
8
|
+
base.alias_method_chain :tables, :views_included
|
9
|
+
>>>>>>> Make tests pass again for PostgreSQL and MySQL adapters.
|
10
|
+
end
|
11
|
+
# Returns true as this adapter supports views.
|
12
|
+
def supports_views?
|
13
|
+
true
|
14
|
+
end
|
15
|
+
|
16
|
+
def tables_with_views_included(name = nil)
|
17
|
+
q = <<-SQL
|
18
|
+
SELECT table_name, table_type
|
19
|
+
FROM information_schema.tables
|
20
|
+
WHERE table_schema IN (#{schemas})
|
21
|
+
AND table_type IN ('BASE TABLE', 'VIEW')
|
22
|
+
SQL
|
23
|
+
|
24
|
+
query(q, name).map { |row| row[0] }
|
25
|
+
end
|
26
|
+
|
27
|
+
def base_tables(name = nil)
|
28
|
+
q = <<-SQL
|
29
|
+
SELECT table_name, table_type
|
30
|
+
FROM information_schema.tables
|
31
|
+
WHERE table_schema IN (#{schemas})
|
32
|
+
AND table_type = 'BASE TABLE'
|
33
|
+
SQL
|
34
|
+
|
35
|
+
query(q, name).map { |row| row[0] }
|
36
|
+
end
|
37
|
+
alias nonview_tables base_tables
|
38
|
+
|
39
|
+
def views(name = nil) #:nodoc:
|
40
|
+
q = <<-SQL
|
41
|
+
SELECT table_name, table_type
|
42
|
+
FROM information_schema.tables
|
43
|
+
WHERE table_schema IN (#{schemas})
|
44
|
+
AND table_type = 'VIEW'
|
45
|
+
SQL
|
46
|
+
|
47
|
+
query(q, name).map { |row| row[0] }
|
48
|
+
end
|
49
|
+
|
50
|
+
def view_select_statement(view, name = nil)
|
51
|
+
q = <<-SQL
|
52
|
+
SELECT view_definition
|
53
|
+
FROM information_schema.views
|
54
|
+
WHERE table_catalog = (SELECT catalog_name FROM information_schema.information_schema_catalog_name)
|
55
|
+
AND table_schema IN (#{schemas})
|
56
|
+
AND table_name = '#{view}'
|
57
|
+
SQL
|
58
|
+
|
59
|
+
select_value(q, name) or raise "No view called #{view} found"
|
60
|
+
end
|
61
|
+
|
62
|
+
private
|
63
|
+
|
64
|
+
def schemas
|
65
|
+
schema_search_path.split(/,/).map { |p| quote(p) }.join(',')
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module RailsSqlViews
|
2
|
+
module ConnectionAdapters
|
3
|
+
module SQLiteAdapter
|
4
|
+
def supports_views?
|
5
|
+
true
|
6
|
+
end
|
7
|
+
|
8
|
+
def supports_drop_table_cascade?
|
9
|
+
return false
|
10
|
+
end
|
11
|
+
|
12
|
+
def tables(name = nil) #:nodoc:
|
13
|
+
sql = <<-SQL
|
14
|
+
SELECT name
|
15
|
+
FROM sqlite_master
|
16
|
+
WHERE (type = 'table' OR type = 'view') AND NOT name = 'sqlite_sequence'
|
17
|
+
SQL
|
18
|
+
|
19
|
+
execute(sql, name).map do |row|
|
20
|
+
row[0]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def base_tables(name = nil)
|
25
|
+
sql = <<-SQL
|
26
|
+
SELECT name
|
27
|
+
FROM sqlite_master
|
28
|
+
WHERE (type = 'table') AND NOT name = 'sqlite_sequence'
|
29
|
+
SQL
|
30
|
+
|
31
|
+
execute(sql, name).map do |row|
|
32
|
+
row[0]
|
33
|
+
end
|
34
|
+
end
|
35
|
+
alias nonview_tables base_tables
|
36
|
+
|
37
|
+
def views(name = nil)
|
38
|
+
sql = <<-SQL
|
39
|
+
SELECT name
|
40
|
+
FROM sqlite_master
|
41
|
+
WHERE type = 'view' AND NOT name = 'sqlite_sequence'
|
42
|
+
SQL
|
43
|
+
|
44
|
+
execute(sql, name).map do |row|
|
45
|
+
row[0]
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# Get the view select statement for the specified table.
|
50
|
+
def view_select_statement(view, name = nil)
|
51
|
+
sql = <<-SQL
|
52
|
+
SELECT sql
|
53
|
+
FROM sqlite_master
|
54
|
+
WHERE name = '#{view}' AND NOT name = 'sqlite_sequence'
|
55
|
+
SQL
|
56
|
+
|
57
|
+
(select_value(sql, name).gsub("CREATE VIEW #{view} AS ", "")) or raise "No view called #{view} found"
|
58
|
+
end
|
59
|
+
|
60
|
+
def supports_view_columns_definition?
|
61
|
+
false
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module RailsSqlViews
|
2
|
+
module ConnectionAdapters
|
3
|
+
module SQLServerAdapter
|
4
|
+
# Returns true as this adapter supports views.
|
5
|
+
def supports_views?
|
6
|
+
true
|
7
|
+
end
|
8
|
+
|
9
|
+
# Get all of the non-view tables from the currently connected schema
|
10
|
+
def base_tables(name = nil)
|
11
|
+
# this is untested
|
12
|
+
select_values("SELECT table_name FROM information_schema.tables", name)
|
13
|
+
end
|
14
|
+
alias nonview_tables base_tables
|
15
|
+
|
16
|
+
# Returns all the view names from the currently connected schema.
|
17
|
+
def views(name = nil)
|
18
|
+
select_values("SELECT table_name FROM information_schema.views", name)
|
19
|
+
end
|
20
|
+
|
21
|
+
# Get the view select statement for the specified view.
|
22
|
+
def view_select_statement(view, name=nil)
|
23
|
+
q =<<-ENDSQL
|
24
|
+
SELECT view_definition FROM information_schema.views
|
25
|
+
WHERE table_name = '#{view}'
|
26
|
+
ENDSQL
|
27
|
+
|
28
|
+
view_def = select_value(q, name)
|
29
|
+
|
30
|
+
if view_def
|
31
|
+
return convert_statement(view_def)
|
32
|
+
else
|
33
|
+
raise "No view called #{view} found"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
def convert_statement(s)
|
39
|
+
s.sub(/^CREATE.* AS (select .*)/i, '\1').gsub(/\n/, '')
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
|
2
|
+
module RailsSqlViews
|
3
|
+
module Loader
|
4
|
+
SUPPORTED_ADAPTERS = %w( Mysql Mysql2 PostgreSQL SQLServer SQLite OracleEnhanced )
|
5
|
+
|
6
|
+
def self.load_extensions
|
7
|
+
SUPPORTED_ADAPTERS.each do |db|
|
8
|
+
if ActiveRecord::ConnectionAdapters.const_defined?("#{db}Adapter")
|
9
|
+
require "rails_sql_views/connection_adapters/#{db.downcase}_adapter"
|
10
|
+
ActiveRecord::ConnectionAdapters.const_get("#{db}Adapter").class_eval do
|
11
|
+
include RailsSqlViews::ConnectionAdapters::AbstractAdapter
|
12
|
+
include RailsSqlViews::ConnectionAdapters.const_get("#{db}Adapter")
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
module RailsSqlViews
|
2
|
+
module SchemaDumper
|
3
|
+
def self.included(base)
|
4
|
+
base.alias_method_chain :trailer, :views
|
5
|
+
base.alias_method_chain :dump, :views
|
6
|
+
base.alias_method_chain :tables, :views_excluded
|
7
|
+
|
8
|
+
# A list of views which should not be dumped to the schema.
|
9
|
+
# Acceptable values are strings as well as regexp.
|
10
|
+
# This setting is only used if ActiveRecord::Base.schema_format == :ruby
|
11
|
+
base.cattr_accessor :ignore_views
|
12
|
+
base.ignore_views = []
|
13
|
+
# Optional: specify the order that in which views are created.
|
14
|
+
# This allows views to depend on and include fields from other views.
|
15
|
+
# It is not necessary to specify all the view names, just the ones that
|
16
|
+
# need to be created first
|
17
|
+
base.cattr_accessor :view_creation_order
|
18
|
+
base.view_creation_order = []
|
19
|
+
end
|
20
|
+
|
21
|
+
def trailer_with_views(stream)
|
22
|
+
# do nothing...we'll call this later
|
23
|
+
end
|
24
|
+
|
25
|
+
# Add views to the end of the dump stream
|
26
|
+
def dump_with_views(stream)
|
27
|
+
dump_without_views(stream)
|
28
|
+
begin
|
29
|
+
if @connection.supports_views?
|
30
|
+
views(stream)
|
31
|
+
end
|
32
|
+
rescue => e
|
33
|
+
if ActiveRecord::Base.logger
|
34
|
+
ActiveRecord::Base.logger.error "Unable to dump views: #{e}"
|
35
|
+
else
|
36
|
+
raise e
|
37
|
+
end
|
38
|
+
end
|
39
|
+
trailer_without_views(stream)
|
40
|
+
stream
|
41
|
+
end
|
42
|
+
|
43
|
+
# Add views to the stream
|
44
|
+
def views(stream)
|
45
|
+
if view_creation_order.empty?
|
46
|
+
sorted_views = @connection.views.sort
|
47
|
+
else
|
48
|
+
# set union, merge by joining arrays, removing dups
|
49
|
+
# this will float the view name sin view_creation_order to the top
|
50
|
+
# without requiring all the views to be specified
|
51
|
+
sorted_views = view_creation_order | @connection.views
|
52
|
+
end
|
53
|
+
sorted_views.each do |v|
|
54
|
+
next if [ActiveRecord::Migrator.schema_migrations_table_name, ignore_views].flatten.any? do |ignored|
|
55
|
+
case ignored
|
56
|
+
when String then v == ignored
|
57
|
+
when Symbol then v == ignored.to_s
|
58
|
+
when Regexp then v =~ ignored
|
59
|
+
else
|
60
|
+
raise StandardError, 'ActiveRecord::SchemaDumper.ignore_views accepts an array of String and / or Regexp values.'
|
61
|
+
end
|
62
|
+
end
|
63
|
+
view(v, stream)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
# Add the specified view to the stream
|
68
|
+
def view(view, stream)
|
69
|
+
columns = @connection.columns(view).collect { |c| c.name }
|
70
|
+
begin
|
71
|
+
v = StringIO.new
|
72
|
+
|
73
|
+
v.print " create_view #{view.inspect}"
|
74
|
+
v.print ", #{@connection.view_select_statement(view).dump}"
|
75
|
+
v.print ", :force => true"
|
76
|
+
v.puts " do |v|"
|
77
|
+
|
78
|
+
columns.each do |column|
|
79
|
+
v.print " v.column :#{column}"
|
80
|
+
v.puts
|
81
|
+
end
|
82
|
+
|
83
|
+
v.puts " end"
|
84
|
+
v.puts
|
85
|
+
|
86
|
+
v.rewind
|
87
|
+
stream.print v.read
|
88
|
+
rescue => e
|
89
|
+
stream.puts "# Could not dump view #{view.inspect} because of following #{e.class}"
|
90
|
+
stream.puts "# #{e.message}"
|
91
|
+
stream.puts
|
92
|
+
end
|
93
|
+
|
94
|
+
stream
|
95
|
+
end
|
96
|
+
|
97
|
+
def tables_with_views_excluded(stream)
|
98
|
+
@connection.base_tables.sort.each do |tbl|
|
99
|
+
next if [ActiveRecord::Migrator.schema_migrations_table_name, ignore_tables].flatten.any? do |ignored|
|
100
|
+
case ignored
|
101
|
+
when String then tbl == ignored
|
102
|
+
when Regexp then tbl =~ ignored
|
103
|
+
else
|
104
|
+
raise StandardError, 'ActiveRecord::SchemaDumper.ignore_tables accepts an array of String and / or Regexp values.'
|
105
|
+
end
|
106
|
+
end
|
107
|
+
table(tbl, stream)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|
112
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2006 Anthony Eden
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
5
|
+
# a copy of this software and associated documentation files (the
|
6
|
+
# "Software"), to deal in the Software without restriction, including
|
7
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
8
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
10
|
+
# the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be
|
13
|
+
# included in all copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
19
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
20
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
#++
|
23
|
+
|
24
|
+
$:.unshift(File.dirname(__FILE__))
|
25
|
+
|
26
|
+
require 'active_record'
|
27
|
+
|
28
|
+
require 'core_ext/module'
|
29
|
+
|
30
|
+
require 'rails_sql_views/connection_adapters/abstract/schema_definitions'
|
31
|
+
require 'rails_sql_views/connection_adapters/abstract/schema_statements'
|
32
|
+
require 'rails_sql_views/connection_adapters/abstract_adapter'
|
33
|
+
require 'rails_sql_views/schema_dumper'
|
34
|
+
require 'rails_sql_views/loader'
|
35
|
+
|
36
|
+
ActiveRecord::ConnectionAdapters::AbstractAdapter.class_eval do
|
37
|
+
include RailsSqlViews::ConnectionAdapters::SchemaStatements
|
38
|
+
def self.inherited(sub)
|
39
|
+
RailsSqlViews::Loader.load_extensions
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
ActiveRecord::SchemaDumper.class_eval do
|
44
|
+
include RailsSqlViews::SchemaDumper
|
45
|
+
end
|
46
|
+
|
47
|
+
RailsSqlViews::Loader.load_extensions
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require "#{File.dirname(__FILE__)}/test_helper"
|
2
|
+
|
3
|
+
class AdapterTest < Test::Unit::TestCase
|
4
|
+
def test_current_database
|
5
|
+
if ActiveRecord::Base.connection.respond_to?(:current_database)
|
6
|
+
assert_equal 'rails_sql_views_unittest', ActiveRecord::Base.connection.current_database
|
7
|
+
end
|
8
|
+
end
|
9
|
+
def test_tables
|
10
|
+
create_view
|
11
|
+
found = ActiveRecord::Base.connection.tables.sort
|
12
|
+
found.delete(ActiveRecord::Migrator.schema_migrations_table_name)
|
13
|
+
assert_equal ["items", "items_people", "people", "people2", "places", "v_people"], found
|
14
|
+
end
|
15
|
+
def test_base_tables
|
16
|
+
create_view
|
17
|
+
found = ActiveRecord::Base.connection.base_tables.sort
|
18
|
+
found.delete(ActiveRecord::Migrator.schema_migrations_table_name)
|
19
|
+
assert_equal ["items", "items_people", "people", "people2", "places"], found
|
20
|
+
end
|
21
|
+
def test_views
|
22
|
+
create_view
|
23
|
+
assert_equal ['v_people'], ActiveRecord::Base.connection.views
|
24
|
+
end
|
25
|
+
def test_columns
|
26
|
+
create_view
|
27
|
+
assert_equal ["f_name", "l_name", "social_security"], ActiveRecord::Base.connection.columns('v_people').collect { |c| c.name }
|
28
|
+
end
|
29
|
+
def test_supports_views
|
30
|
+
assert ActiveRecord::Base.connection.supports_views?
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_mapped_views
|
34
|
+
create_mapping
|
35
|
+
assert_equal ['v_people'], ActiveRecord::Base.connection.views
|
36
|
+
end
|
37
|
+
def test_mapped_columns
|
38
|
+
create_mapping
|
39
|
+
assert_equal ["f_name", "l_name", "address_id"], ActiveRecord::Base.connection.columns('v_people').collect { |c| c.name }
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_view_select_statement
|
43
|
+
case ActiveRecord::Base.connection.adapter_name
|
44
|
+
when "MySQL"
|
45
|
+
assert_equal "select `people`.`first_name` AS `f_name`,`people`.`last_name` AS `l_name`,`people`.`ssn` AS `social_security` from `people`", ActiveRecord::Base.connection.view_select_statement('v_people')
|
46
|
+
when "PostgreSQL"
|
47
|
+
assert_equal "SELECT people.first_name AS f_name, people.last_name AS l_name, people.ssn AS social_security FROM people;", ActiveRecord::Base.connection.view_select_statement('v_people')
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_old_name_not_found_error_during_mapping
|
52
|
+
assert_raise ActiveRecord::ActiveRecordError do
|
53
|
+
ActiveRecord::Base.connection.create_mapping_view(:people, :v_people, :force => true) do |v|
|
54
|
+
v.map_column :foo, :bar
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
### TODO
|
60
|
+
# def test_only_base_table_triggers_are_dropped_for_disabled_ref_integrity
|
61
|
+
# ActiveRecord::Base.connection.disable_referential_integrity do
|
62
|
+
# end
|
63
|
+
# end
|
64
|
+
|
65
|
+
private
|
66
|
+
def create_view
|
67
|
+
ActiveRecord::Base.connection.create_view(:v_people, 'select first_name, last_name, ssn from people', :force => true) do |v|
|
68
|
+
v.column :f_name
|
69
|
+
v.column :l_name
|
70
|
+
v.column :social_security
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def create_mapping
|
75
|
+
ActiveRecord::Base.connection.create_mapping_view(:people, :v_people, :force => true) do |v|
|
76
|
+
v.map_column :id, nil
|
77
|
+
v.map_column :first_name, :f_name
|
78
|
+
v.map_column :last_name, :l_name
|
79
|
+
v.map_column :ssn, nil
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
print "Using native MySQL\n"
|
2
|
+
|
3
|
+
adapter_name = 'mysql'
|
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,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,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!
|
data/test/models/item.rb
ADDED