Class: SolidObjects::DatabaseAdapters::Sqlite
Constant Summary
collapse
- LOCK_RETRY_INTERVAL =
0.001
- LOCK_RETRY_MUTEX =
Thread::Mutex.new
- LOCK_RETRY_CONDITION =
Thread::ConditionVariable.new
Instance Attribute Summary
#connection_pool, #fixed_connection
Instance Method Summary
collapse
#claim_lock, #configure_transaction_deadline, #database_now, for, #initialize, #lock_candidates, #supports_skip_locked?, #with_connection
Instance Method Details
#current_time_expression ⇒ String
11
12
13
|
# File 'lib/solid_objects/database_adapters/sqlite.rb', line 11
def current_time_expression
"STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')"
end
|
#deadline_error?(error) ⇒ Boolean
78
79
80
81
82
83
84
85
86
87
88
|
# File 'lib/solid_objects/database_adapters/sqlite.rb', line 78
def deadline_error?(error)
return false unless SyncDeadline.active?
cause = error
while cause
return true if cause.class.name.match?(/BusyException|BusyError/)
cause = cause.cause
end
false
end
|
#transaction { ... } ⇒ Object
16
17
18
19
20
|
# File 'lib/solid_objects/database_adapters/sqlite.rb', line 16
def transaction(&block)
return super unless SyncDeadline.active?
with_lock_retry { super }
end
|
#wait_before_retry ⇒ void
This method returns an undefined value.
#with_lock_probe { ... } ⇒ Object
50
51
52
53
54
55
56
57
58
59
60
61
62
|
# File 'lib/solid_objects/database_adapters/sqlite.rb', line 50
def with_lock_probe
return yield unless SyncDeadline.active?
with_connection do |connection|
with_transaction_deadline(connection) { yield }
end
rescue => error
raise unless deadline_error?(error)
raise DatabaseDeadlineExceeded,
"database remained locked at the synchronous invocation deadline",
cause: error
end
|
#with_lock_retry { ... } ⇒ Object
#with_transaction_deadline(connection) { ... } ⇒ Object
67
68
69
70
71
72
73
74
75
|
# File 'lib/solid_objects/database_adapters/sqlite.rb', line 67
def with_transaction_deadline(connection)
return yield unless SyncDeadline.active?
previous_timeout = connection.select_value("PRAGMA busy_timeout").to_i
connection.execute("PRAGMA busy_timeout = 0")
yield
ensure
connection.execute("PRAGMA busy_timeout = #{previous_timeout}") if previous_timeout
end
|