1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Add #views and #view_exists? methods on connection adapters

This commit is contained in:
Ryuta Kamizono 2015-09-13 20:03:30 +09:00
parent 602ec7a4a2
commit dcd39949f8
6 changed files with 88 additions and 0 deletions

View file

@ -1,3 +1,7 @@
* Add `#views` and `#view_exists?` methods on connection adapters.
*Ryuta Kamizono*
* Correct query for PostgreSQL 8.2 compatibility.
*Ben Murphy*, *Matthew Draper*

View file

@ -36,6 +36,19 @@ module ActiveRecord
tables.include?(table_name.to_s)
end
# Returns an array of view names defined in the database.
def views
raise NotImplementedError, "#views is not implemented"
end
# Checks to see if the view +view_name+ exists on the database.
#
# view_exists?(:ebooks)
#
def view_exists?(view_name)
views.include?(view_name.to_s)
end
# Returns an array of indexes for the given table.
# def indexes(table_name, name = nil) end

View file

@ -549,6 +549,22 @@ module ActiveRecord
tables(nil, schema, table).any?
end
def views # :nodoc:
select_values("SHOW FULL TABLES WHERE table_type = 'VIEW'", 'SCHEMA')
end
def view_exists?(view_name) # :nodoc:
return false unless view_name.present?
schema, name = view_name.to_s.split('.', 2)
schema, name = @config[:database], schema unless name # A view was provided without a schema
sql = "SELECT table_name FROM information_schema.tables WHERE table_type = 'VIEW'"
sql << " AND table_schema = #{quote(schema)} AND table_name = #{quote(name)}"
select_values(sql, 'SCHEMA').any?
end
# Returns an array of indexes for the given table.
def indexes(table_name, name = nil) #:nodoc:
indexes = []

View file

@ -90,6 +90,30 @@ module ActiveRecord
SQL
end
def views # :nodoc:
select_values(<<-SQL, 'SCHEMA')
SELECT c.relname
FROM pg_class c
LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('v','m') -- (v)iew, (m)aterialized view
AND n.nspname = ANY (current_schemas(false))
SQL
end
def view_exists?(view_name) # :nodoc:
name = Utils.extract_schema_qualified_name(view_name.to_s)
return false unless name.identifier
select_values(<<-SQL, 'SCHEMA').any?
SELECT c.relname
FROM pg_class c
LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('v','m') -- (v)iew, (m)aterialized view
AND c.relname = '#{name.identifier}'
AND n.nspname = #{name.schema ? "'#{name.schema}'" : 'ANY (current_schemas(false))'}
SQL
end
def drop_table(table_name, options = {}) # :nodoc:
execute "DROP TABLE#{' IF EXISTS' if options[:if_exists]} #{quote_table_name(table_name)}#{' CASCADE' if options[:force] == :cascade}"
end

View file

@ -325,6 +325,19 @@ module ActiveRecord
table_name && tables(nil, table_name).any?
end
def views # :nodoc:
select_values("SELECT name FROM sqlite_master WHERE type = 'view' AND name <> 'sqlite_sequence'", 'SCHEMA')
end
def view_exists?(view_name) # :nodoc:
return false unless view_name.present?
sql = "SELECT name FROM sqlite_master WHERE type = 'view' AND name <> 'sqlite_sequence'"
sql << " AND name = #{quote(view_name)}"
select_values(sql, 'SCHEMA').any?
end
# Returns an array of +Column+ objects for the table specified by +table_name+.
def columns(table_name) #:nodoc:
table_structure(table_name).map do |field|

View file

@ -31,6 +31,15 @@ module ViewBehavior
assert_equal ["Ruby for Rails"], books.map(&:name)
end
def test_views
assert_equal [Ebook.table_name], @connection.views
end
def test_view_exists
view_name = Ebook.table_name
assert @connection.view_exists?(view_name), "'#{view_name}' view should exist"
end
def test_table_exists
view_name = Ebook.table_name
assert @connection.table_exists?(view_name), "'#{view_name}' table should exist"
@ -91,6 +100,15 @@ class ViewWithoutPrimaryKeyTest < ActiveRecord::TestCase
assert_equal ["Agile Web Development with Rails"], books.map(&:name)
end
def test_views
assert_equal [Paperback.table_name], @connection.views
end
def test_view_exists
view_name = Paperback.table_name
assert @connection.view_exists?(view_name), "'#{view_name}' view should exist"
end
def test_table_exists
view_name = Paperback.table_name
assert @connection.table_exists?(view_name), "'#{view_name}' table should exist"