diff --git a/lib/rails_sql_views.rb b/lib/rails_sql_views.rb index 7850b3b..477e9ac 100644 --- a/lib/rails_sql_views.rb +++ b/lib/rails_sql_views.rb @@ -22,6 +22,7 @@ #++ $:.unshift(File.dirname(__FILE__)) +ActiveSupport::Dependencies.autoload_paths.unshift File.expand_path("../../lib", __FILE__) require 'active_record' diff --git a/lib/rails_sql_views/connection_adapters/mysql2_adapter.rb b/lib/rails_sql_views/connection_adapters/mysql2_adapter.rb new file mode 100644 index 0000000..cd8a405 --- /dev/null +++ b/lib/rails_sql_views/connection_adapters/mysql2_adapter.rb @@ -0,0 +1,76 @@ +module RailsSqlViews + module ConnectionAdapters + module Mysql2Adapter + def self.included(base) + if base.private_method_defined?(:supports_views?) + base.send(:public, :supports_views?) + end + end + + # Returns true as this adapter supports views. + def supports_views? + true + end + + def base_tables(name = nil, database = nil, like = nil) #:nodoc: + sql = "SHOW FULL TABLES " + sql << "IN #{quote_table_name(database)} " if database + + if database && like + sql << "WHERE TABLE_TYPE='BASE TABLE' " + c = "TABLES_IN_#{database.upcase}" + sql << "AND #{quote_table_name(c)} LIKE #{quote(like)}" + elsif like + sql << "LIKE #{quote(like)}" + else + sql << "WHERE TABLE_TYPE='BASE TABLE' " + end + + execute_and_free(sql, 'SCHEMA') do |result| + result = result.select {|field| field.last == 'BASE TABLE' } unless database + result.collect { |field| field.first } + end + end + alias nonview_tables base_tables + + def views(name = nil) #:nodoc: + views = [] + execute("SHOW FULL TABLES WHERE TABLE_TYPE='VIEW'").each{|row| views << row[0]} + views + end + + def tables_with_views_included(name = nil) + nonview_tables(name) + views(name) + end + + def structure_dump + structure = "" + base_tables.each do |table| + structure += select_one("SHOW CREATE TABLE #{quote_table_name(table)}")["Create Table"] + ";\n\n" + end + + views.each do |view| + structure += select_one("SHOW CREATE VIEW #{quote_table_name(view)}")["Create View"] + ";\n\n" + end + + return structure + end + + # Get the view select statement for the specified table. + def view_select_statement(view, name=nil) + begin + row = execute("SHOW CREATE VIEW #{view}", name).each do |row| + return convert_statement(row[1]) if row[0] == view + end + rescue ActiveRecord::StatementInvalid => e + raise "No view called #{view} found" + end + end + + private + def convert_statement(s) + s.gsub!(/.* AS (select .*)/, '\1') + end + end + end +end diff --git a/lib/rails_sql_views/loader.rb b/lib/rails_sql_views/loader.rb index 7c85018..2db2821 100644 --- a/lib/rails_sql_views/loader.rb +++ b/lib/rails_sql_views/loader.rb @@ -1,7 +1,7 @@ module RailsSqlViews module Loader - SUPPORTED_ADAPTERS = %w( Mysql PostgreSQL SQLServer SQLite OracleEnhanced ) + SUPPORTED_ADAPTERS = %w( Mysql Mysql2 PostgreSQL SQLServer SQLite OracleEnhanced ) def self.load_extensions SUPPORTED_ADAPTERS.each do |db| diff --git a/lib/rails_sql_views/schema_dumper.rb b/lib/rails_sql_views/schema_dumper.rb index 612e67f..d0b0be8 100644 --- a/lib/rails_sql_views/schema_dumper.rb +++ b/lib/rails_sql_views/schema_dumper.rb @@ -26,7 +26,7 @@ def trailer_with_views(stream) def dump_with_views(stream) dump_without_views(stream) begin - if @connection.supports_views? + if @connection.send(:supports_views?) views(stream) end rescue => e diff --git a/rails_sql_views.gemspec b/rails_sql_views.gemspec index 31f742d..60d331f 100644 --- a/rails_sql_views.gemspec +++ b/rails_sql_views.gemspec @@ -28,6 +28,7 @@ Gem::Specification.new do |s| "lib/rails_sql_views/connection_adapters/abstract/schema_statements.rb", "lib/rails_sql_views/connection_adapters/abstract_adapter.rb", "lib/rails_sql_views/connection_adapters/mysql_adapter.rb", + "lib/rails_sql_views/connection_adapters/mysql2_adapter.rb", "lib/rails_sql_views/connection_adapters/oci_adapter.rb", "lib/rails_sql_views/connection_adapters/oracle_adapter.rb", "lib/rails_sql_views/connection_adapters/oracleenhanced_adapter.rb",