qubole_rails_sql_views 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. data/CHANGELOG +22 -0
  2. data/LICENSE +7 -0
  3. data/README +51 -0
  4. data/Rakefile +74 -0
  5. data/TODO +2 -0
  6. data/lib/active_record/view.rb +76 -0
  7. data/lib/core_ext/module.rb +13 -0
  8. data/lib/rails_sql_views/connection_adapters/abstract/schema_definitions.rb +63 -0
  9. data/lib/rails_sql_views/connection_adapters/abstract/schema_statements.rb +79 -0
  10. data/lib/rails_sql_views/connection_adapters/abstract_adapter.rb +41 -0
  11. data/lib/rails_sql_views/connection_adapters/mysql_adapter.rb +62 -0
  12. data/lib/rails_sql_views/connection_adapters/oci_adapter.rb +33 -0
  13. data/lib/rails_sql_views/connection_adapters/oracle_adapter.rb +33 -0
  14. data/lib/rails_sql_views/connection_adapters/oracleenhanced_adapter.rb +39 -0
  15. data/lib/rails_sql_views/connection_adapters/oracleenhanced_adapter.rb.orig +72 -0
  16. data/lib/rails_sql_views/connection_adapters/postgresql_adapter.rb +65 -0
  17. data/lib/rails_sql_views/connection_adapters/postgresql_adapter.rb.orig +69 -0
  18. data/lib/rails_sql_views/connection_adapters/sqlite_adapter.rb +66 -0
  19. data/lib/rails_sql_views/connection_adapters/sqlserver_adapter.rb +43 -0
  20. data/lib/rails_sql_views/loader.rb +18 -0
  21. data/lib/rails_sql_views/schema_dumper.rb +112 -0
  22. data/lib/rails_sql_views/version.rb +9 -0
  23. data/lib/rails_sql_views.rb +47 -0
  24. data/test/adapter_test.rb +82 -0
  25. data/test/connection/native_mysql/connection.rb +32 -0
  26. data/test/connection/native_postgresql/connection.rb +31 -0
  27. data/test/connection/oracle_enhanced/connection.rb +29 -0
  28. data/test/models/item.rb +4 -0
  29. data/test/models/person.rb +5 -0
  30. data/test/models/person2.rb +3 -0
  31. data/test/models/place.rb +2 -0
  32. data/test/models/v_person.rb +4 -0
  33. data/test/models/v_profile.rb +3 -0
  34. data/test/schema.native_mysql.expected.rb +51 -0
  35. data/test/schema.native_postgresql.expected.rb +51 -0
  36. data/test/schema.oracle_enhanced.expected.rb +51 -0
  37. data/test/schema_dumper_test.rb +117 -0
  38. data/test/test_helper.rb +30 -0
  39. data/test/view_model_test.rb +63 -0
  40. data/test/view_operations_test.rb +36 -0
  41. metadata +135 -0
data/CHANGELOG ADDED
@@ -0,0 +1,22 @@
1
+ 0.1.0 - Released Dec 27, 2006
2
+ * Initial release
3
+
4
+ 0.5.0 - Released Dec 29, 2006
5
+ * Added support for PostgreSQL (Michael Schuerig)
6
+ * Fixed the schema dumper
7
+
8
+ 0.5.1 - Released Jan 10, 2007
9
+ * Patch by Clifford T. Matthews to use String.dump to dump out the view select statement
10
+
11
+ 0.6.0 - Released May 9, 2007
12
+ * Added support for SQL Server (Seth Ladd)-
13
+ * Added support for using views to map non-friendly database field names to AR-friendly names (Nathan Vack)
14
+ * Added support for Oracle (Alistair Davidson)
15
+
16
+ 0.6.1 - Released June 6, 2007
17
+ * Added test for union support
18
+ * Updated tests to include new table to support union test
19
+
20
+ 0.7.0
21
+ * Updated dependency versions to get on ActiveRecord 2.x. May not be compatible with Rails versions less than 2.x.
22
+ * Add nonview_tables support to *all* of the adapters (was missing from Postgres and SQLServer)
data/LICENSE ADDED
@@ -0,0 +1,7 @@
1
+ Copyright (c) 2006-2008 Anthony Eden
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
4
+
5
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
6
+
7
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README ADDED
@@ -0,0 +1,51 @@
1
+ == Rails SQL Views
2
+
3
+ Library which adds SQL Views to Rails. Adds create_view and drop_view to the ActiveRecord::ConnectionAdapters::AbstractAdapter (which makes them available to migrations) and adds support for dumping views in the ActiveRecord::SchemaDumper.
4
+
5
+ == Installation
6
+
7
+ To install:
8
+
9
+ gem install rails_sql_views
10
+
11
+ Then add the following to your Rails config/environment.rb:
12
+
13
+ require_gem 'rails_sql_views'
14
+ require 'rails_sql_views'
15
+
16
+ == Usage
17
+
18
+ You can then use create_view and drop_view in your migrations. For example:
19
+
20
+ class CreatePersonView < ActiveRecord::Migration
21
+ def self.up
22
+ create_view :v_people, "select * from people" do |t|
23
+ t.column :id
24
+ t.column :name
25
+ t.column :social_security
26
+ end
27
+ end
28
+
29
+ def self.down
30
+ drop_view :v_people
31
+ end
32
+ end
33
+
34
+ This extension also adds support for views in the ActiveRecord::SchemaDumper class.
35
+
36
+ The following drivers are supported:
37
+
38
+ MySQL
39
+ PostgreSQL (Native and Pure Ruby)
40
+ Oracle
41
+ SQL Server
42
+
43
+ == Known Issues
44
+
45
+ * Drivers not mentioned above are not supported.
46
+
47
+ If you find any issues please send an email to anthonyeden@gmail.com .
48
+
49
+ == Contributing
50
+
51
+ If you would like to implement view support for other adapters then please drop me an email. Better yet, write up the adapter modifications and send them to me. :-)
data/Rakefile ADDED
@@ -0,0 +1,74 @@
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+ require 'rake/rdoctask'
4
+ require 'rake/packagetask'
5
+ require 'rake/gempackagetask'
6
+
7
+ require File.join(File.dirname(__FILE__), 'lib/rails_sql_views', 'version')
8
+
9
+ PKG_BUILD = ENV['PKG_BUILD'] ? '.' + ENV['PKG_BUILD'] : ''
10
+ PKG_NAME = 'rails_sql_views'
11
+ PKG_VERSION = RailsSqlViews::VERSION::STRING + PKG_BUILD
12
+ PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
13
+ PKG_DESTINATION = ENV["PKG_DESTINATION"] || "../#{PKG_NAME}"
14
+
15
+ RELEASE_NAME = "REL #{PKG_VERSION}"
16
+
17
+ RUBY_FORGE_PROJECT = "activewarehouse"
18
+ RUBY_FORGE_USER = "aeden"
19
+
20
+ desc 'Default: run unit tests.'
21
+ task :default => :test
22
+
23
+ desc 'Test the library.'
24
+ Rake::TestTask.new(:test) do |t|
25
+ t.libs << 'lib'
26
+ t.pattern = 'test/**/*_test.rb'
27
+ t.verbose = true
28
+ end
29
+
30
+ namespace :rcov do
31
+ desc 'Measures test coverage'
32
+ task :test do
33
+ rm_f 'coverage.data'
34
+ mkdir 'coverage' unless File.exist?('coverage')
35
+ rcov = "rcov --aggregate coverage.data --text-summary -Ilib"
36
+ system("#{rcov} test/*_test.rb test/**/*_test.rb")
37
+ system("open coverage/index.html") if PLATFORM['darwin']
38
+ end
39
+ end
40
+
41
+ desc 'Generate documentation library.'
42
+ Rake::RDocTask.new(:rdoc) do |rdoc|
43
+ rdoc.rdoc_dir = 'rdoc'
44
+ rdoc.title = 'Rails SQL Views'
45
+ rdoc.options << '--line-numbers' << '--inline-source'
46
+ rdoc.rdoc_files.include('README')
47
+ rdoc.rdoc_files.include('lib/**/*.rb')
48
+ end
49
+
50
+ begin
51
+ require 'jeweler'
52
+ Jeweler::Tasks.new do |s|
53
+ s.name = "rails_sql_views"
54
+ s.summary = "Library which adds SQL Views to ActiveRecord."
55
+ s.email = "josh@technicalpickles.com"
56
+ s.homepage = "http://activewarehouse.rubyforge.org/rails_sql_views"
57
+ s.description = "Adds support for using SQL views within ActiveRecord"
58
+ s.authors = ["Anthony Eden"]
59
+ s.files = FileList[
60
+ "CHANGELOG",
61
+ "README",
62
+ "Rakefile",
63
+ "{bin,lib}/**/*"
64
+ ]
65
+ s.add_dependency 'activerecord'
66
+ end
67
+ rescue LoadError
68
+ puts "Jeweler, or one of its dependencies, is not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
69
+ end
70
+
71
+ desc "Publish the API documentation"
72
+ task :pdoc => [:rdoc] do
73
+ Rake::SshDirPublisher.new("aeden@rubyforge.org", "/var/www/gforge-projects/activewarehouse/rails_sql_views/rdoc", "rdoc").upload
74
+ end
data/TODO ADDED
@@ -0,0 +1,2 @@
1
+
2
+ - Use pre-existing Adapter#supports_views? where possible
@@ -0,0 +1,76 @@
1
+
2
+ # A base class for database views.
3
+ # It is primarily useful for views that are centered around a single table/model.
4
+ module ActiveRecord # :nodoc:
5
+ class View < Base
6
+ self.abstract_class = true
7
+
8
+ def readonly?
9
+ true
10
+ end
11
+
12
+ class << self
13
+ # Clones all applicable associations from +model+ to this view
14
+ # and provides an instance method
15
+ # <tt>to_<em>model</em></tt>
16
+ # that casts a view object to an object of the kind view is
17
+ # based on. This latter object may be missing attributes; to fill
18
+ # them in, call #reload.
19
+ def based_on(model)
20
+ define_method("to_#{model.name.demodulize.underscore}") do
21
+ becomes(model)
22
+ end
23
+
24
+ model.reflect_on_all_associations.each do |assoc|
25
+ clone_association(model, assoc)
26
+ end
27
+ end
28
+
29
+ # Clone one or more associations from +model+ to this view class.
30
+ #
31
+ # NOTE: Currently only <tt>belongs_to</tt>, <tt>has_many</tt> (withouth
32
+ # <tt>:through</tt>), and <tt>has_and_belongs_to_many</tt> associations
33
+ # are supported.
34
+ def clone_association(model, *associations)
35
+ associations.each do |association|
36
+ r = case association
37
+ when String, Symbol
38
+ model.reflect_on_association(association.to_sym)
39
+ when ActiveRecord::Reflection::AssociationReflection
40
+ association
41
+ else
42
+ raise ArgumentError, "Unrecognized association #{association.inspect}; must be a Symbol, String, or AssociationReflection."
43
+ end
44
+ case r.macro
45
+ when :belongs_to
46
+ if self.column_names.include?(r.primary_key_name.to_s)
47
+ if !r.options[:foreign_type] || self.column_names.include?(r.options[:foreign_type])
48
+ options = r.options.merge(
49
+ :class_name => r.class_name,
50
+ :foreign_key => r.primary_key_name
51
+ )
52
+ belongs_to r.name, options
53
+ end
54
+ end
55
+ when :has_many
56
+ ### TODO :through assocications
57
+ options = r.options.merge(
58
+ :class_name => r.class_name,
59
+ :foreign_key => r.primary_key_name
60
+ )
61
+ has_many r.name, options
62
+ when :has_and_belongs_to_many
63
+ options = r.options.merge(
64
+ :class_name => r.class_name,
65
+ :foreign_key => r.primary_key_name,
66
+ :association_foreign_key => r.association_foreign_key
67
+ )
68
+ has_and_belongs_to_many r.name, options
69
+ when :has_one
70
+ ### TODO
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,13 @@
1
+ # This is required for 1.1.6 support
2
+ unless Module.respond_to?(:alias_method_chain)
3
+ class Module
4
+ def alias_method_chain(target, feature)
5
+ # Strip out punctuation on predicates or bang methods since
6
+ # e.g. target?_without_feature is not a valid method name.
7
+ aliased_target, punctuation = target.to_s.sub(/([?!=])$/, ''), $1
8
+ yield(aliased_target, punctuation) if block_given?
9
+ alias_method "#{aliased_target}_without_#{feature}#{punctuation}", target
10
+ alias_method target, "#{aliased_target}_with_#{feature}#{punctuation}"
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,63 @@
1
+ module RailsSqlViews
2
+ module ConnectionAdapters #:nodoc:
3
+ # Abstract definition of a View
4
+ class ViewDefinition
5
+ attr_accessor :columns, :select_query
6
+
7
+ def initialize(base, select_query)
8
+ @columns = []
9
+ @base = base
10
+ @select_query = select_query
11
+ end
12
+
13
+ def column(name)
14
+ column = name.to_s
15
+ @columns << column unless @columns.include? column
16
+ self
17
+ end
18
+
19
+ def to_sql
20
+ @columns.collect { |c| @base.quote_column_name(c) } * ', '
21
+ end
22
+
23
+ end
24
+
25
+ class MappingDefinition
26
+
27
+ # Generates a hash of the form :old_column => :new_column
28
+ # Initially, it'll map column names to themselves.
29
+ # use map_column to modify the list.
30
+ def initialize(columns)
31
+ @columns = columns
32
+ @map = Hash.new()
33
+ columns.each do |c|
34
+ @map[c] = c
35
+ end
36
+
37
+ end
38
+
39
+ # Create a mapping from an old column name to a new one.
40
+ # If the new name is nil, specify that the old column shouldn't
41
+ # appear in this new view.
42
+ def map_column(old_name, new_name)
43
+ unless @map.include?(old_name)
44
+ raise ActiveRecord::ActiveRecordError, "column #{old_name} not found, can't be mapped"
45
+ end
46
+ if new_name.nil?
47
+ @map.delete old_name
48
+ @columns.delete old_name
49
+ else
50
+ @map[old_name] = new_name
51
+ end
52
+ end
53
+
54
+ def select_cols
55
+ @columns
56
+ end
57
+
58
+ def view_cols
59
+ @columns.map { |c| @map[c] }
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,79 @@
1
+ module RailsSqlViews
2
+ module ConnectionAdapters # :nodoc:
3
+ module SchemaStatements
4
+ def self.included(base)
5
+ base.alias_method_chain :drop_table, :cascade
6
+ end
7
+
8
+ # Create a view.
9
+ # The +options+ hash can include the following keys:
10
+ # [<tt>:check_option</tt>]
11
+ # Specify restrictions for inserts or updates in updatable views. ANSI SQL 92 defines two check option
12
+ # values: CASCADED and LOCAL. See your database documentation for allowed values.
13
+ def create_view(name, select_query, options={})
14
+ if supports_views?
15
+ view_definition = ViewDefinition.new(self, select_query)
16
+
17
+ if block_given?
18
+ yield view_definition
19
+ end
20
+
21
+ if options[:force]
22
+ drop_view(name) rescue nil
23
+ end
24
+
25
+ create_sql = "CREATE VIEW "
26
+ create_sql << "#{quote_table_name(name)} "
27
+ if supports_view_columns_definition? && !view_definition.to_sql.blank?
28
+ create_sql << "("
29
+ create_sql << view_definition.to_sql
30
+ create_sql << ") "
31
+ end
32
+ create_sql << "AS #{view_definition.select_query}"
33
+ create_sql << " WITH #{options[:check_option]} CHECK OPTION" if options[:check_option]
34
+ execute create_sql
35
+ end
36
+ end
37
+
38
+ # Also creates a view, with the specific purpose of remapping column names
39
+ # to make non-ActiveRecord tables friendly with the naming
40
+ # conventions, while maintaining legacy app compatibility.
41
+ def create_mapping_view(old_name, new_name, options = {})
42
+ return unless supports_views?
43
+
44
+ col_names = columns(old_name).collect { |col| col.name.to_sym }
45
+ mapper = MappingDefinition.new(col_names)
46
+
47
+ yield mapper
48
+
49
+ if options[:force]
50
+ drop_view(new_name) rescue nil
51
+ end
52
+
53
+ view_sql = "CREATE VIEW #{new_name} "
54
+ if supports_view_columns_definition?
55
+ view_sql << "(#{mapper.view_cols.collect { |c| quote_column_name(c) }.join(', ')}) "
56
+ end
57
+ view_sql << "AS SELECT #{mapper.select_cols.collect { |c| quote_column_name(c) }.join(', ')} FROM #{old_name}"
58
+ execute view_sql
59
+ end
60
+
61
+ def drop_table_with_cascade(table_name, options = {})
62
+ execute "DROP TABLE #{quote_table_name(table_name)} CASCADE"
63
+ end
64
+
65
+ # Drop a view.
66
+ # The +options+ hash can include the following keys:
67
+ # [<tt>:drop_behavior</tt>]
68
+ # Specify the drop behavior. ANSI SQL 92 defines two drop behaviors, CASCADE and RESTRICT. See your
69
+ # database documentation to determine what drop behaviors are available.
70
+ def drop_view(name, options={})
71
+ if supports_views?
72
+ drop_sql = "DROP VIEW #{quote_table_name(name)}"
73
+ drop_sql << " #{options[:drop_behavior]}" if options[:drop_behavior]
74
+ execute drop_sql
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,41 @@
1
+ module RailsSqlViews
2
+ module ConnectionAdapters
3
+ module AbstractAdapter
4
+ def self.included(base)
5
+ base.alias_method_chain :disable_referential_integrity, :views_excluded
6
+ end
7
+
8
+ # Subclasses should override and return true if they support views.
9
+ def supports_views?
10
+ return false
11
+ end
12
+
13
+ # Subclasses should override and return false if they don't support CASCADE
14
+ def supports_drop_table_cascade?
15
+ return true
16
+ end
17
+
18
+ def disable_referential_integrity_with_views_excluded(&block)
19
+ self.class.send(:alias_method, :original_tables_method, :tables)
20
+ self.class.send(:alias_method, :tables, :base_tables)
21
+ disable_referential_integrity_without_views_excluded(&block)
22
+ ensure
23
+ self.class.send(:alias_method, :tables, :original_tables_method)
24
+ end
25
+
26
+ def supports_view_columns_definition?
27
+ true
28
+ end
29
+
30
+ # Get a list of all views for the current database
31
+ def views(name = nil)
32
+ raise NotImplementedError, "views is an abstract method"
33
+ end
34
+
35
+ # Get the select statement for the specified view
36
+ def view_select_statement(view, name=nil)
37
+ raise NotImplementedError, "view_select_statement is an abstract method"
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,62 @@
1
+ module RailsSqlViews
2
+ module ConnectionAdapters
3
+ module MysqlAdapter
4
+ def self.included(base)
5
+ if base.private_method_defined?(:supports_views?)
6
+ base.send(:public, :supports_views?)
7
+ end
8
+ end
9
+
10
+ # Returns true as this adapter supports views.
11
+ def supports_views?
12
+ true
13
+ end
14
+
15
+ def base_tables(name = nil) #:nodoc:
16
+ tables = []
17
+ execute("SHOW FULL TABLES WHERE TABLE_TYPE='BASE TABLE'").each{|row| tables << row[0]}
18
+ tables
19
+ end
20
+ alias nonview_tables base_tables
21
+
22
+ def views(name = nil) #:nodoc:
23
+ views = []
24
+ execute("SHOW FULL TABLES WHERE TABLE_TYPE='VIEW'").each{|row| views << row[0]}
25
+ views
26
+ end
27
+
28
+ def tables_with_views_included(name = nil)
29
+ nonview_tables(name) + views(name)
30
+ end
31
+
32
+ def structure_dump
33
+ structure = ""
34
+ base_tables.each do |table|
35
+ structure += select_one("SHOW CREATE TABLE #{quote_table_name(table)}")["Create Table"] + ";\n\n"
36
+ end
37
+
38
+ views.each do |view|
39
+ structure += select_one("SHOW CREATE VIEW #{quote_table_name(view)}")["Create View"] + ";\n\n"
40
+ end
41
+
42
+ return structure
43
+ end
44
+
45
+ # Get the view select statement for the specified table.
46
+ def view_select_statement(view, name=nil)
47
+ begin
48
+ row = execute("SHOW CREATE VIEW #{view}", name).each do |row|
49
+ return convert_statement(row[1]) if row[0] == view
50
+ end
51
+ rescue ActiveRecord::StatementInvalid => e
52
+ raise "No view called #{view} found"
53
+ end
54
+ end
55
+
56
+ private
57
+ def convert_statement(s)
58
+ s.gsub!(/.* AS (select .*)/, '\1')
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,33 @@
1
+ module RailsSqlViews
2
+ module ConnectionAdapters
3
+ module OciAdapter
4
+ # Returns true as this adapter supports views.
5
+ def supports_views?
6
+ true
7
+ end
8
+
9
+ def base_tables(name = nil) #:nodoc:
10
+ tables = []
11
+ execute("SELECT TABLE_NAME FROM USER_TABLES", name).each { |row| tables << row[0] }
12
+ tables
13
+ end
14
+ alias nonview_tables base_tables
15
+
16
+ def views(name = nil) #:nodoc:
17
+ views = []
18
+ execute("SELECT VIEW_NAME FROM USER_VIEWS", name).each { |row| views << row[0] }
19
+ views
20
+ end
21
+
22
+ # Get the view select statement for the specified table.
23
+ def view_select_statement(view, name=nil)
24
+ row = execute("SELECT TEXT FROM USER_VIEWS WHERE VIEW_NAME = '#{view}'", name).each do |row|
25
+ return row[0]
26
+ end
27
+ raise "No view called #{view} found"
28
+ end
29
+
30
+
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,33 @@
1
+ module RailsSqlViews
2
+ module ConnectionAdapters
3
+ module OracleAdapter
4
+ # Returns true as this adapter supports views.
5
+ def supports_views?
6
+ true
7
+ end
8
+
9
+ def base_tables(name = nil) #:nodoc:
10
+ tables = []
11
+ execute("SELECT TABLE_NAME FROM USER_TABLES", name).each { |row| tables << row[0] }
12
+ tables
13
+ end
14
+ alias nonview_tables base_tables
15
+
16
+ def views(name = nil) #:nodoc:
17
+ views = []
18
+ execute("SELECT VIEW_NAME FROM USER_VIEWS", name).each { |row| views << row[0] }
19
+ views
20
+ end
21
+
22
+ # Get the view select statement for the specified table.
23
+ def view_select_statement(view, name=nil)
24
+ row = execute("SELECT TEXT FROM USER_VIEWS WHERE VIEW_NAME = '#{view}'", name).each do |row|
25
+ return row[0]
26
+ end
27
+ raise "No view called #{view} found"
28
+ end
29
+
30
+
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,39 @@
1
+ module RailsSqlViews
2
+ module ConnectionAdapters
3
+ module OracleEnhancedAdapter
4
+ # Returns true as this adapter supports views.
5
+ def supports_views?
6
+ true
7
+ end
8
+
9
+ def base_tables(name = nil) #:nodoc:
10
+ tables = []
11
+ cursor = execute("SELECT TABLE_NAME FROM USER_TABLES", name)
12
+ while row = cursor.fetch
13
+ tables << row[0]
14
+ end
15
+ tables
16
+ end
17
+ alias nonview_tables base_tables
18
+
19
+ def views(name = nil) #:nodoc:
20
+ views = []
21
+ cursor = execute("SELECT VIEW_NAME FROM USER_VIEWS", name)
22
+ while row = cursor.fetch
23
+ views << row[0]
24
+ end
25
+ views
26
+ end
27
+
28
+ # Get the view select statement for the specified table.
29
+ def view_select_statement(view, name=nil)
30
+ cursor = execute("SELECT TEXT FROM USER_VIEWS WHERE VIEW_NAME = '#{view}'", name)
31
+ if row = cursor.fetch
32
+ return row[0]
33
+ else
34
+ raise "No view called #{view} found"
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,72 @@
1
+ module RailsSqlViews
2
+ module ConnectionAdapters
3
+ module OracleEnhancedAdapter
4
+ <<<<<<< HEAD
5
+ def self.included(base)
6
+ base.alias_method_chain :tables, :views_included
7
+ end
8
+ =======
9
+ >>>>>>> Add support for oracle_enhanced adapter. Don't alias tables in PostgreSQL adapter if it's already been aliased.
10
+ # Returns true as this adapter supports views.
11
+ def supports_views?
12
+ true
13
+ end
14
+
15
+ <<<<<<< HEAD
16
+ def tables_with_views_included(name = nil)
17
+ tables = []
18
+ sql = " SELECT TABLE_NAME FROM USER_TABLES
19
+ UNION
20
+ SELECT VIEW_NAME AS TABLE_NAME FROM USER_VIEWS"
21
+ cursor = execute(sql, name)
22
+ while row = cursor.fetch
23
+ tables << row[0].downcase
24
+ end
25
+ tables
26
+ end
27
+
28
+ =======
29
+ >>>>>>> Add support for oracle_enhanced adapter. Don't alias tables in PostgreSQL adapter if it's already been aliased.
30
+ def base_tables(name = nil) #:nodoc:
31
+ tables = []
32
+ cursor = execute("SELECT TABLE_NAME FROM USER_TABLES", name)
33
+ while row = cursor.fetch
34
+ <<<<<<< HEAD
35
+ tables << row[0].downcase
36
+ =======
37
+ tables << row[0]
38
+ >>>>>>> Add support for oracle_enhanced adapter. Don't alias tables in PostgreSQL adapter if it's already been aliased.
39
+ end
40
+ tables
41
+ end
42
+ alias nonview_tables base_tables
43
+
44
+ def views(name = nil) #:nodoc:
45
+ views = []
46
+ cursor = execute("SELECT VIEW_NAME FROM USER_VIEWS", name)
47
+ while row = cursor.fetch
48
+ <<<<<<< HEAD
49
+ views << row[0].downcase
50
+ =======
51
+ views << row[0]
52
+ >>>>>>> Add support for oracle_enhanced adapter. Don't alias tables in PostgreSQL adapter if it's already been aliased.
53
+ end
54
+ views
55
+ end
56
+
57
+ # Get the view select statement for the specified table.
58
+ def view_select_statement(view, name=nil)
59
+ <<<<<<< HEAD
60
+ view.upcase!
61
+ =======
62
+ >>>>>>> Add support for oracle_enhanced adapter. Don't alias tables in PostgreSQL adapter if it's already been aliased.
63
+ cursor = execute("SELECT TEXT FROM USER_VIEWS WHERE VIEW_NAME = '#{view}'", name)
64
+ if row = cursor.fetch
65
+ return row[0]
66
+ else
67
+ raise "No view called #{view} found"
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end