Class: SolidObjects::DatabaseAdapters::Postgresql

Inherits:
SolidObjects::DatabaseAdapter show all
Defined in:
lib/solid_objects/database_adapters/postgresql.rb,
sig/generated/lib/solid_objects/database_adapters/postgresql.rbs

Constant Summary

Constants inherited from SolidObjects::DatabaseAdapter

SolidObjects::DatabaseAdapter::FAMILIES, SolidObjects::DatabaseAdapter::TRANSACTION_CLOCK, SolidObjects::DatabaseAdapter::TRANSACTION_CLOCK_SCOPE

Instance Attribute Summary

Attributes inherited from SolidObjects::DatabaseAdapter

#connection_pool, #fixed_connection

Instance Method Summary collapse

Methods inherited from SolidObjects::DatabaseAdapter

#additional_server_reasons, #current_time_expression, #database_now, family, for, #initialize, #lock_candidates, #read_database_now, #transaction, #unsupported_server_reasons, #with_connection, #with_lock_probe, #with_lock_retry, #with_transaction_clock, #with_transaction_deadline

Constructor Details

This class inherits a constructor from SolidObjects::DatabaseAdapter

Instance Method Details

#claim_lockString

RBS:

  • () -> String

Returns:

  • (String)


27
28
29
# File 'lib/solid_objects/database_adapters/postgresql.rb', line 27

def claim_lock
  "FOR UPDATE SKIP LOCKED"
end

#configure_transaction_deadline(connection) ⇒ void

This method returns an undefined value.

RBS:

  • (untyped) -> void

Parameters:

  • (Object)


34
35
36
37
38
39
40
41
42
43
# File 'lib/solid_objects/database_adapters/postgresql.rb', line 34

def configure_transaction_deadline(connection)
  return unless SyncDeadline.active?

  connection.execute(
    "SET LOCAL lock_timeout = #{SyncDeadline.remaining_milliseconds}"
  )
  connection.execute(
    "SET LOCAL statement_timeout = #{SyncDeadline.remaining_milliseconds}"
  )
end

#deadline_error?(error) ⇒ Boolean

RBS:

  • (Exception) -> bool

Parameters:

  • (Exception)

Returns:

  • (Boolean)


46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/solid_objects/database_adapters/postgresql.rb', line 46

def deadline_error?(error)
  return false unless SyncDeadline.active?
  return true if error.is_a?(ActiveRecord::LockWaitTimeout)

  cause = error
  while cause
    result = cause.respond_to?(:result) ? cause.result : nil
    return true if result&.error_field(PG::Result::PG_DIAG_SQLSTATE) == "57014"

    cause = cause.cause
  end
  false
end

#minimum_server_versionGem::Version?

RBS:

  • () -> Gem::Version?

Returns:

  • (Gem::Version, nil)


7
8
9
# File 'lib/solid_objects/database_adapters/postgresql.rb', line 7

def minimum_server_version
  Gem::Version.new("13")
end

#server_versionGem::Version

PostgreSQL reports a packed integer, 170010 for 17.10, so comparing it directly would make every server look newer than any minimum.

RBS:

  • () -> Gem::Version

Returns:

  • (Gem::Version)


14
15
16
17
18
19
# File 'lib/solid_objects/database_adapters/postgresql.rb', line 14

def server_version
  packed = with_connection { |connection| connection.database_version.to_i }
  return super unless packed.positive?

  Gem::Version.new("#{packed / 10_000}.#{packed % 10_000}")
end

#supports_skip_locked?Boolean

RBS:

  • () -> bool

Returns:

  • (Boolean)


22
23
24
# File 'lib/solid_objects/database_adapters/postgresql.rb', line 22

def supports_skip_locked?
  true
end