Class: TursoLibsql::LocalConnection
- Inherits:
-
Object
- Object
- TursoLibsql::LocalConnection
- Defined in:
- lib/turso_libsql/database.rb
Overview
ローカル SQLite 接続(Embedded Replica 用)sqlite3 gem を使用sqlite3 gem 2.x は fork 後に接続を自動クローズする(ForkSafety)。AR の discard! が @raw_connection を nil にするので、子プロセスではreconnect が走って新しい接続が確立される。
Constant Summary collapse
- BUSY_TIMEOUT_MS =
Solid Queue など複数プロセスが同時に書き込む場合のロック待機時間(ミリ秒)。デフォルトの 0ms だと即 SQLite3::BusyException になる。
5000
Instance Attribute Summary collapse
-
#last_insert_rowid ⇒ Object
readonly
Returns the value of attribute last_insert_rowid.
Instance Method Summary collapse
- #begin_transaction ⇒ Object
- #commit_transaction ⇒ Object
- #execute(sql) ⇒ Object
- #execute_with_params(sql, params) ⇒ Object
-
#initialize(path, remote_url, token, mode) ⇒ LocalConnection
constructor
A new instance of LocalConnection.
- #query(sql) ⇒ Object
- #rollback_transaction ⇒ Object
Constructor Details
#initialize(path, remote_url, token, mode) ⇒ LocalConnection
Returns a new instance of LocalConnection.
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 |
# File 'lib/turso_libsql/database.rb', line 117 def initialize(path, remote_url, token, mode) require 'sqlite3' @path = path @remote_url = remote_url @token = token @mode = mode @db = SQLite3::Database.new(path) @db.results_as_hash = true # WAL モード: 読み取りと書き込みを並行できる。 # デフォルトの DELETE ジャーナルモードは同時書き込みで database is locked になる。 # Solid Queue のように複数 fork が同じファイルに書く場合に必須。 @db.execute('PRAGMA journal_mode=WAL') # ロック競合時に即エラーにならず、指定ミリ秒待ってリトライする。 @db.execute("PRAGMA busy_timeout=#{BUSY_TIMEOUT_MS}") @last_insert_rowid = 0 @last_affected_rows = 0 end |
Instance Attribute Details
#last_insert_rowid ⇒ Object (readonly)
Returns the value of attribute last_insert_rowid.
173 174 175 |
# File 'lib/turso_libsql/database.rb', line 173 def last_insert_rowid @last_insert_rowid end |
Instance Method Details
#begin_transaction ⇒ Object
153 154 155 |
# File 'lib/turso_libsql/database.rb', line 153 def begin_transaction @db.execute('BEGIN') end |
#commit_transaction ⇒ Object
157 158 159 160 161 162 163 |
# File 'lib/turso_libsql/database.rb', line 157 def commit_transaction @db.execute('COMMIT') rescue SQLite3::Exception => e # fork 後に接続が強制クローズされた場合など、トランザクションが # 既に存在しない状態での COMMIT は無視する raise unless e..include?('no transaction is active') end |
#execute(sql) ⇒ Object
135 136 137 138 139 140 |
# File 'lib/turso_libsql/database.rb', line 135 def execute(sql) @db.execute(sql) @last_affected_rows = @db.changes @last_insert_rowid = @db.last_insert_row_id @last_affected_rows end |
#execute_with_params(sql, params) ⇒ Object
146 147 148 149 150 151 |
# File 'lib/turso_libsql/database.rb', line 146 def execute_with_params(sql, params) @db.execute(sql, params) @last_affected_rows = @db.changes @last_insert_rowid = @db.last_insert_row_id @last_affected_rows end |
#query(sql) ⇒ Object
142 143 144 |
# File 'lib/turso_libsql/database.rb', line 142 def query(sql) @db.execute(sql) end |
#rollback_transaction ⇒ Object
165 166 167 168 169 170 171 |
# File 'lib/turso_libsql/database.rb', line 165 def rollback_transaction @db.execute('ROLLBACK') rescue SQLite3::Exception => e # fork 後に接続が強制クローズされた場合など、トランザクションが # 既に存在しない状態での ROLLBACK は無視する raise unless e..include?('no transaction is active') end |