Class: ActiveRecordADBCAdapter::Adapter

Inherits:
ActiveRecord::ConnectionAdapters::AbstractAdapter
  • Object
show all
Includes:
DatabaseStatements, Quoting, SchemaStatements
Defined in:
lib/activerecord_adbc_adapter/adapter.rb

Overview

Active Record ADBC Adapter

Options:

Defined Under Namespace

Classes: Connection

Constant Summary collapse

ADAPTER_NAME =
"ADBC"
FEATURES =
[
  :supports_insert_on_duplicate_skip,
]

Constants included from SchemaStatements

SchemaStatements::NATIVE_DATABASE_TYPES

Class Method Summary collapse

Instance Method Summary collapse

Methods included from SchemaStatements

#adbc_catalog, #adbc_db_schema, #adbc_table_type, #adbc_view_type, #column_definitions, #native_database_types, #primary_keys, #tables, #views

Methods included from Quoting

#quoted_date, #quoted_time

Methods included from DatabaseStatements

#cast_result, #perform_query, #write_query?

Constructor Details

#initializeAdapter

Returns a new instance of Adapter.



91
92
93
94
95
96
97
98
99
100
# File 'lib/activerecord_adbc_adapter/adapter.rb', line 91

def initialize(...)
  super

  @connection_parameters = @config.compact
  @connection_parameters.delete(:adapter)

  @raw_connection = nil

  @features = {}
end

Class Method Details

.new_client(params) ⇒ Object



78
79
80
# File 'lib/activerecord_adbc_adapter/adapter.rb', line 78

def new_client(params)
  Connection.new(**params)
end

Instance Method Details

#active?Boolean

Returns:

  • (Boolean)


122
123
124
125
126
127
# File 'lib/activerecord_adbc_adapter/adapter.rb', line 122

def active?
  @lock.synchronize do
    return false unless @raw_connection
  end
  true
end

#arel_visitorObject



179
180
181
182
183
184
185
186
# File 'lib/activerecord_adbc_adapter/adapter.rb', line 179

def arel_visitor
  case backend
  when "postgresql"
    Arel::Visitors::PostgreSQL.new(self)
  else
    super
  end
end

#backendObject



172
173
174
175
176
177
# File 'lib/activerecord_adbc_adapter/adapter.rb', line 172

def backend
  # We can't use @connection_parameters here because #arel_visitor
  # is called before Adapter#initialize. (#arel_visitor is called
  # in AbstractAdapter#initialize.)
  @config[:driver].gsub(/\Aadbc_driver_/, "")
end

#build_insert_sql(insert) ⇒ Object

Borrowed from ActiveRecord::ConnectionAdapters::PostgreSQLAdapter#build_insert_sql.

Copyright © David Heinemeier Hansson

The MIT license.



143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
# File 'lib/activerecord_adbc_adapter/adapter.rb', line 143

def build_insert_sql(insert)
  sql = +"INSERT #{insert.into} #{insert.values_list}"

  if insert.skip_duplicates?
    sql << " ON CONFLICT #{insert.conflict_target} DO NOTHING"
  elsif insert.update_duplicates?
    sql << " ON CONFLICT #{insert.conflict_target} DO UPDATE SET "
    if insert.raw_update_sql?
      sql << insert.raw_update_sql
    else
      sql << insert.touch_model_timestamps_unless { |column| "#{insert.model.quoted_table_name}.#{column} IS NOT DISTINCT FROM excluded.#{column}" }
      sql << insert.updatable_columns.map { |column| "#{column}=excluded.#{column}" }.join(",")
    end
  end

  sql << " RETURNING #{insert.returning}" if insert.returning
  sql
end

#connectObject



108
109
110
111
112
# File 'lib/activerecord_adbc_adapter/adapter.rb', line 108

def connect
  @raw_connection = self.class.new_client(@connection_parameters)
  detect_features
  @raw_connection
end

#disconnect!Object



129
130
131
132
133
134
135
# File 'lib/activerecord_adbc_adapter/adapter.rb', line 129

def disconnect!
  @lock.synchronize do
    super
    @raw_connection&.close rescue nil
    @raw_connection = nil
  end
end

#ingest(table_name, attributes, name: nil) ⇒ Object



162
163
164
165
166
167
168
169
170
# File 'lib/activerecord_adbc_adapter/adapter.rb', line 162

def ingest(table_name, attributes, name: nil)
  log(table_name, name) do |notification_payload|
    with_raw_connection do |raw_connection|
      raw_connection.open_statement do |statement|
        statement.ingest(table_name, attributes, mode: :append)
      end
    end
  end
end

#reconnectObject



114
115
116
117
118
119
120
# File 'lib/activerecord_adbc_adapter/adapter.rb', line 114

def reconnect
  @lock.synchronize do
    @raw_connection&.reconnect
  end

  connect unless @raw_connection
end