Module: ActiveRecord::ConnectionAdapters::Duckdb::DatabaseStatementsRails72

Included in:
ActiveRecord::ConnectionAdapters::DuckdbAdapter
Defined in:
lib/active_record/connection_adapters/duckdb/database_statements_rails72.rb

Instance Method Summary collapse

Instance Method Details

#exec_delete(sql, name = nil, binds = []) ⇒ Integer Also known as: exec_update

Executes a DELETE statement and returns the number of affected rows. Rails 7.2's base class returns ActiveRecord::Result, but we need an integer. DuckDB's DELETE returns the count in the result set as rows[0].

Parameters:

  • sql (String)

    The DELETE SQL statement

  • name (String, nil) (defaults to: nil)

    Optional name for logging

  • binds (Array) (defaults to: [])

    Array of bind parameters

Returns:

  • (Integer)

    Number of rows affected by the delete



45
46
47
48
# File 'lib/active_record/connection_adapters/duckdb/database_statements_rails72.rb', line 45

def exec_delete(sql, name = nil, binds = [])
  result = internal_exec_query(sql, name, binds)
  result.rows.first&.first || 0
end

#internal_exec_query(sql, name = 'SQL', binds = [], prepare: false, async: false, allow_retry: false) ⇒ ActiveRecord::Result

Executes a query and returns an ActiveRecord::Result. Required for Rails 7.2 where the base class raises NotImplementedError.

Parameters:

  • sql (String)

    The SQL query to execute

  • name (String) (defaults to: 'SQL')

    Query name for logging

  • binds (Array) (defaults to: [])

    Array of bind parameters

  • prepare (Boolean) (defaults to: false)

    Whether to prepare the statement (unused - DuckDB doesn't cache)

  • async (Boolean) (defaults to: false)

    Whether to execute asynchronously (unused)

  • allow_retry (Boolean) (defaults to: false)

    Whether to allow retrying on failure

Returns:

  • (ActiveRecord::Result)

    The query result



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/active_record/connection_adapters/duckdb/database_statements_rails72.rb', line 20

def internal_exec_query(sql, name = 'SQL', binds = [], prepare: false, async: false, allow_retry: false)
  # Check for write queries on read-only connections (replica support)
  ensure_write_query_allowed(sql)

  casted_binds = type_casted_binds(binds)

  log(sql, name, binds, casted_binds, async:) do
    with_raw_connection(allow_retry:) do |conn|
      result = if casted_binds.empty?
                 conn.query(sql)
               else
                 conn.query(sql, *casted_binds)
               end
      cast_result(result)
    end
  end
end