lib/hanami/cli/commands/app/db/utils/database.rb in hanami-cli-2.2.0.beta1 vs lib/hanami/cli/commands/app/db/utils/database.rb in hanami-cli-2.2.0.beta2

- old
+ new

@@ -9,13 +9,10 @@ module DB module Utils # @api private # @since 2.2.0 class Database - MIGRATIONS_DIR = "config/db/migrate" - private_constant :MIGRATIONS_DIR - DATABASE_CLASS_RESOLVER = Hash.new { |_, key| raise "#{key} is not a supported db scheme" }.update( "sqlite" => -> { require_relative("sqlite") @@ -27,48 +24,61 @@ }, "postgresql" => -> { require_relative("postgres") Postgres }, - "mysql" => -> { + "mysql2" => -> { require_relative("mysql") Mysql } ).freeze - def self.[](slice, system_call:) + def self.database_class(database_url) + database_scheme = URI(database_url).scheme + DATABASE_CLASS_RESOLVER[database_scheme].call + end + + def self.from_slice(slice:, system_call:) provider = slice.container.providers[:db] - raise "this is not a db slice" unless provider + raise "No :db provider for #{slice}" unless provider - database_scheme = provider.source.database_url.then { URI(_1).scheme } - database_class = DATABASE_CLASS_RESOLVER[database_scheme].call - database_class.new(slice: slice, system_call: system_call) + provider.source.database_urls.map { |(gateway_name, database_url)| + database = database_class(database_url).new( + slice: slice, + gateway_name: gateway_name, + system_call: system_call + ) + + [gateway_name, database] + }.to_h end attr_reader :slice + attr_reader :gateway_name attr_reader :system_call - def initialize(slice:, system_call:) + def initialize(slice:, gateway_name:, system_call:) @slice = slice + @gateway_name = gateway_name @system_call = system_call end def name database_uri.path.sub(%r{^/}, "") end def database_url - slice.container.providers[:db].source.database_url + slice.container.providers[:db].source.database_urls.fetch(gateway_name) end def database_uri @database_uri ||= URI(database_url) end def gateway - slice["db.config"].gateways[:default] + slice["db.config"].gateways[gateway_name] end def connection gateway.connection end @@ -125,22 +135,42 @@ def applied_migrations sequel_migrator.applied_migrations end + def db_config_path + slice.root.join("config", "db") + end + + def db_config_dir? + db_config_path.directory? + end + def migrations_path - slice.root.join(MIGRATIONS_DIR) + if gateway_name == :default + db_config_path.join("migrate") + else + db_config_path.join("#{gateway_name}_migrate") + end end def migrations_dir? migrations_path.directory? end def structure_file - slice.root.join("config/db/structure.sql") + path = slice.root.join("config", "db") + + if gateway_name == :default + path.join("structure.sql") + else + path.join("#{gateway_name}_structure.sql") + end end def schema_migrations_sql_dump + return unless migrations_dir? + sql = +"INSERT INTO schema_migrations (filename) VALUES\n" sql << applied_migrations.map { |v| "('#{v}')" }.join(",\n") sql << ";" sql end