Module: Sequel::Platform

Defined in:
lib/sequel/extensions/platform.rb

Overview

The Platform module provides database platform abstraction through configuration-driven capabilities and code-driven function translations.

Defined Under Namespace

Classes: Athena, Base, Postgres, Snowflake, Spark

Constant Summary collapse

PLATFORM_CLASSES =

Map adapter schemes to platform classes

{
  postgres: Postgres,
  postgresql: Postgres,
  spark: Spark,
  athena: Athena,
  presto: Athena,
  trino: Athena,
  snowflake: Snowflake,
}.freeze
ADAPTER_CONFIG_NAMES =

Map adapter schemes to config file names

{
  postgres: 'postgres',
  postgresql: 'postgres',
  spark: 'spark',
  athena: 'athena',
  presto: 'athena',
  trino: 'athena',
  snowflake: 'snowflake',
}.freeze

Class Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Class Attribute Details

.config_dirObject

Find the config directory, searching gem paths



210
211
212
# File 'lib/sequel/extensions/platform.rb', line 210

def config_dir
  @config_dir ||= find_config_dir
end

Class Method Details

.build_platform(db, extra_configs = []) ⇒ Platform::Base

Build platform instance for database

Parameters:

  • db (Sequel::Database)

    Database connection

  • extra_configs (Array<String>) (defaults to: [])

    Additional config paths

Returns:



261
262
263
264
265
266
# File 'lib/sequel/extensions/platform.rb', line 261

def self.build_platform(db, extra_configs = [])
  adapter = effective_adapter(db)
  platform_class = PLATFORM_CLASSES.fetch(adapter, Base)
  config_paths = config_paths_for(adapter, extra_configs)
  platform_class.new(db, *config_paths)
end

.config_paths_for(adapter_scheme, extra_configs = []) ⇒ Array<String>

Build config paths for the given adapter

Parameters:

  • adapter_scheme (Symbol)

    Database adapter scheme

  • extra_configs (Array<String>) (defaults to: [])

    Additional config paths to stack

Returns:

  • (Array<String>)

    Ordered config paths



238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
# File 'lib/sequel/extensions/platform.rb', line 238

def self.config_paths_for(adapter_scheme, extra_configs = [])
  paths = []

  if config_dir
    base_config = File.join(config_dir, 'base.csv')
    paths << base_config if File.exist?(base_config)

    adapter_name = ADAPTER_CONFIG_NAMES[adapter_scheme]
    if adapter_name
      rdbms_config = File.join(config_dir, 'rdbms', "#{adapter_name}.csv")
      paths << rdbms_config if File.exist?(rdbms_config)
    end
  end

  paths.concat(extra_configs.select { |p| File.exist?(p) })
  paths
end

.effective_adapter(db) ⇒ Symbol

Detect the effective adapter for platform selection. For mock databases, use database_type or host option; otherwise use adapter_scheme.

Parameters:

  • db (Sequel::Database)

    Database connection

Returns:

  • (Symbol)

    Effective adapter type



273
274
275
276
277
278
279
280
281
282
# File 'lib/sequel/extensions/platform.rb', line 273

def self.effective_adapter(db)
  return db.adapter_scheme unless db.adapter_scheme == :mock

  # Mock databases: try database_type first (set for known types like postgres, spark)
  db_type = db.database_type
  return db_type if db_type && db_type != :mock

  # Fall back to host option (for unknown types like snowflake, athena)
  db.opts[:host]
end

.extended(db) ⇒ Object

Extension hook - called when extension is loaded



285
286
287
288
# File 'lib/sequel/extensions/platform.rb', line 285

def self.extended(db)
  extra_configs = db.opts[:platform_configs] || []
  db.instance_variable_set(:@platform, build_platform(db, extra_configs))
end

Instance Method Details

#platformPlatform::Base

Access the platform instance

Returns:



293
294
295
# File 'lib/sequel/extensions/platform.rb', line 293

def platform
  @platform
end