Class: TursoLibsql::LocalConnection

Inherits:
Object
  • Object
show all
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

Instance Method Summary collapse

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_rowidObject (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_transactionObject



153
154
155
# File 'lib/turso_libsql/database.rb', line 153

def begin_transaction
  @db.execute('BEGIN')
end

#commit_transactionObject



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.message.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_transactionObject



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.message.include?('no transaction is active')
end