Class: TursoLibsql::Connection
- Inherits:
-
Object
- Object
- TursoLibsql::Connection
- Defined in:
- lib/turso_libsql/connection.rb
Overview
Hrana v2 HTTP プロトコルを使ったリモート接続Net::HTTP を使用するため fork 後も安全
Instance Attribute Summary collapse
-
#last_insert_rowid ⇒ Object
readonly
最後に挿入した行の rowid を返す.
Instance Method Summary collapse
-
#begin_transaction ⇒ Object
トランザクションを開始する.
-
#commit_transaction ⇒ Object
トランザクションをコミットする fork 後に sqlite3 gem の ForkSafety が接続を強制クローズした場合や、 baton が無効になった場合は “cannot commit - no transaction is active” が返る。 AR の discard! → reconnect フローで子プロセスは正常に動作するため、 このエラーは無視して良い。.
-
#execute(sql) ⇒ Object
SQL を実行し、影響を受けた行数を返す(INSERT/UPDATE/DELETE 用).
-
#execute_with_params(sql, params) ⇒ Object
プリペアドステートメントで SQL を実行(パラメータ付き).
-
#initialize(url, token) ⇒ Connection
constructor
A new instance of Connection.
-
#query(sql) ⇒ Object
SQL を実行し、結果を Array of Hash で返す(SELECT 用).
-
#rollback_transaction ⇒ Object
トランザクションをロールバックする.
Constructor Details
#initialize(url, token) ⇒ Connection
Returns a new instance of Connection.
11 12 13 14 15 16 17 |
# File 'lib/turso_libsql/connection.rb', line 11 def initialize(url, token) @hrana_url = hrana_url(url) @token = token @baton = nil @last_insert_rowid = 0 @last_affected_rows = 0 end |
Instance Attribute Details
#last_insert_rowid ⇒ Object (readonly)
最後に挿入した行の rowid を返す
80 81 82 |
# File 'lib/turso_libsql/connection.rb', line 80 def last_insert_rowid @last_insert_rowid end |
Instance Method Details
#begin_transaction ⇒ Object
トランザクションを開始する
36 37 38 39 40 41 |
# File 'lib/turso_libsql/connection.rb', line 36 def begin_transaction requests = [{ 'type' => 'execute', 'stmt' => { 'sql' => 'BEGIN' } }] resp = hrana_pipeline(nil, requests) @baton = resp['baton'] check_errors(resp) end |
#commit_transaction ⇒ Object
トランザクションをコミットするfork 後に sqlite3 gem の ForkSafety が接続を強制クローズした場合や、baton が無効になった場合は “cannot commit - no transaction is active” が返る。AR の discard! → reconnect フローで子プロセスは正常に動作するため、このエラーは無視して良い。
48 49 50 51 52 53 54 55 56 57 58 59 |
# File 'lib/turso_libsql/connection.rb', line 48 def commit_transaction requests = [ { 'type' => 'execute', 'stmt' => { 'sql' => 'COMMIT' } }, { 'type' => 'close' } ] resp = hrana_pipeline(@baton, requests) @baton = nil check_errors(resp) rescue RuntimeError => e raise unless e..include?('no transaction is active') || e..include?('cannot commit') end |
#execute(sql) ⇒ Object
SQL を実行し、影響を受けた行数を返す(INSERT/UPDATE/DELETE 用)
20 21 22 |
# File 'lib/turso_libsql/connection.rb', line 20 def execute(sql) execute_sql(sql, []) end |
#execute_with_params(sql, params) ⇒ Object
プリペアドステートメントで SQL を実行(パラメータ付き)
30 31 32 33 |
# File 'lib/turso_libsql/connection.rb', line 30 def execute_with_params(sql, params) json_params = params.map { |p| { 'type' => 'text', 'value' => p.to_s } } execute_sql(sql, json_params) end |
#query(sql) ⇒ Object
SQL を実行し、結果を Array of Hash で返す(SELECT 用)
25 26 27 |
# File 'lib/turso_libsql/connection.rb', line 25 def query(sql) query_sql(sql, []) end |
#rollback_transaction ⇒ Object
トランザクションをロールバックする
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
# File 'lib/turso_libsql/connection.rb', line 62 def rollback_transaction requests = [ { 'type' => 'execute', 'stmt' => { 'sql' => 'ROLLBACK' } }, { 'type' => 'close' } ] # baton が無効になっている場合(サーバー側でエラー後に破棄された場合)は # baton なしで ROLLBACK を試みる。失敗しても無視する(接続は既に破棄済み) baton = @baton @baton = nil begin resp = hrana_pipeline(baton, requests) check_errors(resp) rescue StandardError # ROLLBACK 失敗は無視(接続が既に破棄されている場合) end end |