Class: SolidObjects::DatabaseAdapter
- Inherits:
-
Object
- Object
- SolidObjects::DatabaseAdapter
show all
- Defined in:
- lib/solid_objects/database_adapter.rb,
sig/generated/lib/solid_objects/database_adapter.rbs
Constant Summary
collapse
- TRANSACTION_CLOCK =
:solid_objects_transaction_clock
- TRANSACTION_CLOCK_SCOPE =
:solid_objects_transaction_clock_scope
Instance Attribute Summary collapse
Class Method Summary
collapse
Instance Method Summary
collapse
Constructor Details
Returns a new instance of DatabaseAdapter.
30
31
32
33
|
# File 'lib/solid_objects/database_adapter.rb', line 30
def initialize(connection)
@connection_pool = connection.respond_to?(:pool) ? connection.pool : nil
@fixed_connection = connection_pool ? nil : connection
end
|
Instance Attribute Details
#connection_pool ⇒ Object
Returns the value of attribute connection_pool.
131
132
133
|
# File 'lib/solid_objects/database_adapter.rb', line 131
def connection_pool
@connection_pool
end
|
#fixed_connection ⇒ Object
Returns the value of attribute fixed_connection.
131
132
133
|
# File 'lib/solid_objects/database_adapter.rb', line 131
def fixed_connection
@fixed_connection
end
|
Instance Method Details
#additional_server_reasons ⇒ Array[String]
68
69
70
|
# File 'lib/solid_objects/database_adapter.rb', line 68
def additional_server_reasons
[]
end
|
#claim_lock ⇒ String?
78
79
80
|
# File 'lib/solid_objects/database_adapter.rb', line 78
def claim_lock
nil
end
|
This method returns an undefined value.
160
161
|
# File 'lib/solid_objects/database_adapter.rb', line 160
def configure_transaction_deadline(_connection)
end
|
#current_time_expression ⇒ String
83
84
85
|
# File 'lib/solid_objects/database_adapter.rb', line 83
def current_time_expression
"CURRENT_TIMESTAMP"
end
|
#deadline_error?(_error) ⇒ Boolean
164
165
166
|
# File 'lib/solid_objects/database_adapter.rb', line 164
def deadline_error?(_error)
false
end
|
125
126
127
|
# File 'lib/solid_objects/database_adapter.rb', line 125
def lock_candidates(relation)
claim_lock ? relation.lock(claim_lock) : relation
end
|
#minimum_server_version ⇒ Gem::Version?
The oldest server the adapter has been exercised against. Reported rather
than enforced: refusing to boot on an untested server would be a worse
failure than running on one.
39
40
41
|
# File 'lib/solid_objects/database_adapter.rb', line 39
def minimum_server_version
nil
end
|
#read_database_now ⇒ Time
147
148
149
150
151
152
|
# File 'lib/solid_objects/database_adapter.rb', line 147
def read_database_now
value = with_connection do |connection|
connection.select_value("SELECT #{current_time_expression}")
end
value.is_a?(Time) ? value.utc : Time.parse("#{value} UTC").utc
end
|
#server_version ⇒ Gem::Version
44
45
46
47
48
|
# File 'lib/solid_objects/database_adapter.rb', line 44
def server_version
with_connection do |connection|
Gem::Version.new(connection.database_version.to_s)
end
end
|
#supports_skip_locked? ⇒ Boolean
73
74
75
|
# File 'lib/solid_objects/database_adapter.rb', line 73
def supports_skip_locked?
false
end
|
#transaction { ... } ⇒ Object
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
# File 'lib/solid_objects/database_adapter.rb', line 105
def transaction(&block)
raise DatabaseDeadlineExceeded, "synchronous invocation deadline expired" if SyncDeadline.expired?
with_connection do |connection|
with_transaction_deadline(connection) do
connection.transaction(requires_new: true) do
configure_transaction_deadline(connection)
with_transaction_clock { block.call }
end
end
end
rescue => error
raise unless deadline_error?(error)
raise DatabaseDeadlineExceeded,
"database lock wait exceeded the synchronous invocation deadline",
cause: error
end
|
#unsupported_server_reasons(observed = nil) ⇒ Array[String]
One observed version decides both the status and the message. Reading it
again could let a transient failure replace an already determined result.
53
54
55
56
57
58
59
60
61
62
63
64
65
|
# File 'lib/solid_objects/database_adapter.rb', line 53
def unsupported_server_reasons(observed = nil)
observed ||= server_version
reasons = []
minimum = minimum_server_version
if minimum && observed < minimum
reasons << "#{self.class.name.demodulize} #{observed} is older than " \
"Solid Objects requires, which is #{minimum}"
end
reasons.concat(additional_server_reasons)
reasons
rescue => error
[ "the database server could not be verified: #{error.class}: #{error.message}" ]
end
|
#with_connection {|arg0| ... } ⇒ Object
169
170
171
172
173
|
# File 'lib/solid_objects/database_adapter.rb', line 169
def with_connection
return yield fixed_connection unless connection_pool
connection_pool.with_connection { |connection| yield connection }
end
|
#with_lock_probe { ... } ⇒ Object
100
101
102
|
# File 'lib/solid_objects/database_adapter.rb', line 100
def with_lock_probe
yield
end
|
#with_lock_retry { ... } ⇒ Object
95
96
97
|
# File 'lib/solid_objects/database_adapter.rb', line 95
def with_lock_retry
yield
end
|
#with_transaction_clock { ... } ⇒ Object
#with_transaction_deadline(_connection) { ... } ⇒ Object
155
156
157
|
# File 'lib/solid_objects/database_adapter.rb', line 155
def with_transaction_deadline(_connection)
yield
end
|