Class: TursoLibsql::Connection

Inherits:
Object
  • Object
show all
Defined in:
lib/turso_libsql/connection.rb

Overview

Hrana v2 HTTP プロトコルを使ったリモート接続Net::HTTP を使用するため fork 後も安全

Instance Attribute Summary collapse

Instance Method Summary collapse

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

トランザクションを開始する



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_transactionObject

トランザクションをコミットする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.message.include?('no transaction is active') ||
               e.message.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_transactionObject

トランザクションをロールバックする



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