Created
November 25, 2014 13:00
-
-
Save praveend/51b8c03ced74238ec552 to your computer and use it in GitHub Desktop.
Patch to support ibm_db in rake create and drop database tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #-- | |
| # Copyright (c) 2004-2014 David Heinemeier Hansson | |
| # | |
| # 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: | |
| # | |
| # The above copyright notice and this permission notice shall be | |
| # included in all copies or substantial portions of the Software. | |
| # | |
| # 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. | |
| #++ | |
| require 'active_support' | |
| require 'active_support/rails' | |
| require 'active_model' | |
| require 'arel' | |
| require 'active_record/version' | |
| module ActiveRecord | |
| extend ActiveSupport::Autoload | |
| autoload :Base | |
| autoload :Callbacks | |
| autoload :Core | |
| autoload :ConnectionHandling | |
| autoload :CounterCache | |
| autoload :DynamicMatchers | |
| autoload :Enum | |
| autoload :Explain | |
| autoload :Inheritance | |
| autoload :Integration | |
| autoload :Migration | |
| autoload :Migrator, 'active_record/migration' | |
| autoload :ModelSchema | |
| autoload :NestedAttributes | |
| autoload :NoTouching | |
| autoload :Persistence | |
| autoload :QueryCache | |
| autoload :Querying | |
| autoload :ReadonlyAttributes | |
| autoload :Reflection | |
| autoload :RuntimeRegistry | |
| autoload :Sanitization | |
| autoload :Schema | |
| autoload :SchemaDumper | |
| autoload :SchemaMigration | |
| autoload :Scoping | |
| autoload :Serialization | |
| autoload :StatementCache | |
| autoload :Store | |
| autoload :Timestamp | |
| autoload :Transactions | |
| autoload :Translation | |
| autoload :Validations | |
| eager_autoload do | |
| autoload :ActiveRecordError, 'active_record/errors' | |
| autoload :ConnectionNotEstablished, 'active_record/errors' | |
| autoload :ConnectionAdapters, 'active_record/connection_adapters/abstract_adapter' | |
| autoload :Aggregations | |
| autoload :Associations | |
| autoload :AttributeAssignment | |
| autoload :AttributeMethods | |
| autoload :AutosaveAssociation | |
| autoload :Relation | |
| autoload :AssociationRelation | |
| autoload :NullRelation | |
| autoload_under 'relation' do | |
| autoload :QueryMethods | |
| autoload :FinderMethods | |
| autoload :Calculations | |
| autoload :PredicateBuilder | |
| autoload :SpawnMethods | |
| autoload :Batches | |
| autoload :Delegation | |
| end | |
| autoload :Result | |
| end | |
| module Coders | |
| autoload :YAMLColumn, 'active_record/coders/yaml_column' | |
| autoload :JSON, 'active_record/coders/json' | |
| end | |
| module AttributeMethods | |
| extend ActiveSupport::Autoload | |
| eager_autoload do | |
| autoload :BeforeTypeCast | |
| autoload :Dirty | |
| autoload :PrimaryKey | |
| autoload :Query | |
| autoload :Read | |
| autoload :TimeZoneConversion | |
| autoload :Write | |
| autoload :Serialization | |
| end | |
| end | |
| module Locking | |
| extend ActiveSupport::Autoload | |
| eager_autoload do | |
| autoload :Optimistic | |
| autoload :Pessimistic | |
| end | |
| end | |
| module ConnectionAdapters | |
| extend ActiveSupport::Autoload | |
| eager_autoload do | |
| autoload :AbstractAdapter | |
| autoload :ConnectionManagement, "active_record/connection_adapters/abstract/connection_pool" | |
| end | |
| end | |
| module Scoping | |
| extend ActiveSupport::Autoload | |
| eager_autoload do | |
| autoload :Named | |
| autoload :Default | |
| end | |
| end | |
| module Tasks | |
| extend ActiveSupport::Autoload | |
| autoload :DatabaseTasks | |
| autoload :SQLiteDatabaseTasks, 'active_record/tasks/sqlite_database_tasks' | |
| autoload :MySQLDatabaseTasks, 'active_record/tasks/mysql_database_tasks' | |
| autoload :PostgreSQLDatabaseTasks, | |
| 'active_record/tasks/postgresql_database_tasks' | |
| autoload :IBMDBDatabaseTasks, 'active_record/tasks/ibm_db_database_tasks' | |
| end | |
| autoload :TestFixtures, 'active_record/fixtures' | |
| def self.eager_load! | |
| super | |
| ActiveRecord::Locking.eager_load! | |
| ActiveRecord::Scoping.eager_load! | |
| ActiveRecord::Associations.eager_load! | |
| ActiveRecord::AttributeMethods.eager_load! | |
| ActiveRecord::ConnectionAdapters.eager_load! | |
| end | |
| end | |
| ActiveSupport.on_load(:active_record) do | |
| Arel::Table.engine = self | |
| end | |
| ActiveSupport.on_load(:i18n) do | |
| I18n.load_path << File.dirname(__FILE__) + '/active_record/locale/en.yml' | |
| end |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| module ActiveRecord | |
| module Tasks # :nodoc: | |
| class DatabaseAlreadyExists < StandardError; end # :nodoc: | |
| class DatabaseNotSupported < StandardError; end # :nodoc: | |
| # <tt>ActiveRecord::Tasks::DatabaseTasks</tt> is a utility class, which encapsulates | |
| # logic behind common tasks used to manage database and migrations. | |
| # | |
| # The tasks defined here are used in rake tasks provided by Active Record. | |
| # | |
| # In order to use DatabaseTasks, a few config values need to be set. All the needed | |
| # config values are set by Rails already, so it's necessary to do it only if you | |
| # want to change the defaults or when you want to use Active Record outside of Rails | |
| # (in such case after configuring the database tasks, you can also use the rake tasks | |
| # defined in Active Record). | |
| # | |
| # | |
| # The possible config values are: | |
| # | |
| # * +env+: current environment (like Rails.env). | |
| # * +database_configuration+: configuration of your databases (as in +config/database.yml+). | |
| # * +db_dir+: your +db+ directory. | |
| # * +fixtures_path+: a path to fixtures directory. | |
| # * +migrations_paths+: a list of paths to directories with migrations. | |
| # * +seed_loader+: an object which will load seeds, it needs to respond to the +load_seed+ method. | |
| # * +root+: a path to the root of the application. | |
| # | |
| # Example usage of +DatabaseTasks+ outside Rails could look as such: | |
| # | |
| # include ActiveRecord::Tasks | |
| # DatabaseTasks.database_configuration = YAML.load(File.read('my_database_config.yml')) | |
| # DatabaseTasks.db_dir = 'db' | |
| # # other settings... | |
| # | |
| # DatabaseTasks.create_current('production') | |
| module DatabaseTasks | |
| extend self | |
| attr_writer :current_config, :db_dir, :migrations_paths, :fixtures_path, :root, :env, :seed_loader | |
| attr_accessor :database_configuration | |
| LOCAL_HOSTS = ['127.0.0.1', 'localhost'] | |
| def register_task(pattern, task) | |
| @tasks ||= {} | |
| @tasks[pattern] = task | |
| end | |
| register_task(/mysql/, ActiveRecord::Tasks::MySQLDatabaseTasks) | |
| register_task(/postgresql/, ActiveRecord::Tasks::PostgreSQLDatabaseTasks) | |
| register_task(/sqlite/, ActiveRecord::Tasks::SQLiteDatabaseTasks) | |
| register_task(/ibm_db/, ActiveRecord::Tasks::IBMDBDatabaseTasks) | |
| def db_dir | |
| @db_dir ||= Rails.application.config.paths["db"].first | |
| end | |
| def migrations_paths | |
| @migrations_paths ||= Rails.application.paths['db/migrate'].to_a | |
| end | |
| def fixtures_path | |
| @fixtures_path ||= File.join(root, 'test', 'fixtures') | |
| end | |
| def root | |
| @root ||= Rails.root | |
| end | |
| def env | |
| @env ||= Rails.env | |
| end | |
| def seed_loader | |
| @seed_loader ||= Rails.application | |
| end | |
| def current_config(options = {}) | |
| options.reverse_merge! :env => env | |
| if options.has_key?(:config) | |
| @current_config = options[:config] | |
| else | |
| @current_config ||= ActiveRecord::Base.configurations[options[:env]] | |
| end | |
| end | |
| def create(*arguments) | |
| configuration = arguments.first | |
| class_for_adapter(configuration['adapter']).new(*arguments).create | |
| rescue DatabaseAlreadyExists | |
| $stderr.puts "#{configuration['database']} already exists" | |
| rescue Exception => error | |
| $stderr.puts error, *(error.backtrace) | |
| $stderr.puts "Couldn't create database for #{configuration.inspect}" | |
| end | |
| def create_all | |
| each_local_configuration { |configuration| create configuration } | |
| end | |
| def create_current(environment = env) | |
| each_current_configuration(environment) { |configuration| | |
| create configuration | |
| } | |
| ActiveRecord::Base.establish_connection(environment.to_sym) | |
| end | |
| def drop(*arguments) | |
| configuration = arguments.first | |
| class_for_adapter(configuration['adapter']).new(*arguments).drop | |
| rescue Exception => error | |
| $stderr.puts error, *(error.backtrace) | |
| $stderr.puts "Couldn't drop #{configuration['database']}" | |
| end | |
| def drop_all | |
| each_local_configuration { |configuration| drop configuration } | |
| end | |
| def drop_current(environment = env) | |
| each_current_configuration(environment) { |configuration| | |
| drop configuration | |
| } | |
| end | |
| def charset_current(environment = env) | |
| charset ActiveRecord::Base.configurations[environment] | |
| end | |
| def charset(*arguments) | |
| configuration = arguments.first | |
| class_for_adapter(configuration['adapter']).new(*arguments).charset | |
| end | |
| def collation_current(environment = env) | |
| collation ActiveRecord::Base.configurations[environment] | |
| end | |
| def collation(*arguments) | |
| configuration = arguments.first | |
| class_for_adapter(configuration['adapter']).new(*arguments).collation | |
| end | |
| def purge(configuration) | |
| class_for_adapter(configuration['adapter']).new(configuration).purge | |
| end | |
| def structure_dump(*arguments) | |
| configuration = arguments.first | |
| filename = arguments.delete_at 1 | |
| class_for_adapter(configuration['adapter']).new(*arguments).structure_dump(filename) | |
| end | |
| def structure_load(*arguments) | |
| configuration = arguments.first | |
| filename = arguments.delete_at 1 | |
| class_for_adapter(configuration['adapter']).new(*arguments).structure_load(filename) | |
| end | |
| def load_schema(format = ActiveRecord::Base.schema_format, file = nil) | |
| load_schema_current(format, file) | |
| end | |
| # This method is the successor of +load_schema+. We should rename it | |
| # after +load_schema+ went through a deprecation cycle. (Rails > 4.2) | |
| def load_schema_for(configuration, format = ActiveRecord::Base.schema_format, file = nil) # :nodoc: | |
| case format | |
| when :ruby | |
| file ||= File.join(db_dir, "schema.rb") | |
| check_schema_file(file) | |
| purge(configuration) | |
| ActiveRecord::Base.establish_connection(configuration) | |
| load(file) | |
| when :sql | |
| file ||= File.join(db_dir, "structure.sql") | |
| check_schema_file(file) | |
| purge(configuration) | |
| structure_load(configuration, file) | |
| else | |
| raise ArgumentError, "unknown format #{format.inspect}" | |
| end | |
| end | |
| def load_schema_current(format = ActiveRecord::Base.schema_format, file = nil, environment = env) | |
| each_current_configuration(environment) { |configuration| | |
| load_schema_for configuration, format, file | |
| } | |
| ActiveRecord::Base.establish_connection(environment.to_sym) | |
| end | |
| def check_schema_file(filename) | |
| unless File.exist?(filename) | |
| message = %{#{filename} doesn't exist yet. Run `rake db:migrate` to create it, then try again.} | |
| message << %{ If you do not intend to use a database, you should instead alter #{Rails.root}/config/application.rb to limit the frameworks that will be loaded.} if defined?(::Rails) | |
| Kernel.abort message | |
| end | |
| end | |
| def load_seed | |
| if seed_loader | |
| seed_loader.load_seed | |
| else | |
| raise "You tried to load seed data, but no seed loader is specified. Please specify seed " + | |
| "loader with ActiveRecord::Tasks::DatabaseTasks.seed_loader = your_seed_loader\n" + | |
| "Seed loader should respond to load_seed method" | |
| end | |
| end | |
| private | |
| def class_for_adapter(adapter) | |
| key = @tasks.keys.detect { |pattern| adapter[pattern] } | |
| unless key | |
| raise DatabaseNotSupported, "Rake tasks not supported by '#{adapter}' adapter" | |
| end | |
| @tasks[key] | |
| end | |
| def each_current_configuration(environment) | |
| environments = [environment] | |
| # add test environment only if no RAILS_ENV was specified. | |
| environments << 'test' if environment == 'development' && ENV['RAILS_ENV'].nil? | |
| configurations = ActiveRecord::Base.configurations.values_at(*environments) | |
| configurations.compact.each do |configuration| | |
| yield configuration unless configuration['database'].blank? | |
| end | |
| end | |
| def each_local_configuration | |
| ActiveRecord::Base.configurations.each_value do |configuration| | |
| next unless configuration['database'] | |
| if local_database?(configuration) | |
| yield configuration | |
| else | |
| $stderr.puts "This task only modifies local databases. #{configuration['database']} is on a remote host." | |
| end | |
| end | |
| end | |
| def local_database?(configuration) | |
| configuration['host'].blank? || LOCAL_HOSTS.include?(configuration['host']) | |
| end | |
| end | |
| end | |
| end |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| module ActiveRecord | |
| module Tasks # :nodoc: | |
| class IBMDBDatabaseTasks # :nodoc: | |
| delegate :connection, :establish_connection, to: ActiveRecord::Base | |
| def initialize(configuration, root = ActiveRecord::Tasks::DatabaseTasks.root) | |
| @configuration, @root = configuration, root | |
| end | |
| def create | |
| silence_warnings do | |
| begin | |
| ActiveRecord::Base.establish_connection configuration.merge('dbops' => true) | |
| $stderr.puts "Create database #{configuration['database']} in progress. Will take few minutes..." | |
| crtSuccessful = ActiveRecord::Base.connection.create_database(configuration['database'],configuration['codeSet'], configuration['mode']) | |
| $stderr.puts "#{configuration['database']} creation successful" if crtSuccessful | |
| establish_connection(configuration) | |
| rescue StandardError => error | |
| $stderr.puts "#{configuration['database']} creation process failed: #{error}" | |
| raise | |
| end | |
| end | |
| end | |
| def drop | |
| silence_warnings do | |
| begin | |
| ActiveRecord::Base.establish_connection(configuration.merge('dbops' => true)) | |
| $stderr.puts "Drop database #{configuration['database']} in progress. Will take few minutes..." | |
| drpSuccessful = ActiveRecord::Base.connection.drop_database configuration['database'] | |
| $stderr.puts "#{configuration['database']} drop successful" if drpSuccessful | |
| ActiveRecord::Base.connection.disconnect! | |
| drpSuccessful | |
| rescue StandardError => error | |
| $stderr.puts "#{configuration['database']} drop failed: #{error}" | |
| return false | |
| end | |
| end | |
| end | |
| def purge | |
| drop | |
| create | |
| end | |
| def charset | |
| connection.encoding | |
| end | |
| private | |
| def configuration | |
| @configuration | |
| end | |
| def root | |
| @root | |
| end | |
| end | |
| end | |
| end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment