Class: ActiveRecord::ConnectionAdapters::LibsqlAdapter
- Inherits:
-
AbstractAdapter
- Object
- AbstractAdapter
- ActiveRecord::ConnectionAdapters::LibsqlAdapter
- Defined in:
- lib/active_record/connection_adapters/libsql_adapter.rb
Constant Summary collapse
- ADAPTER_NAME =
'Turso'- NATIVE_DATABASE_TYPES =
SQLite 互換の型マッピング(libSQL は SQLite 方言)
{ primary_key: 'INTEGER PRIMARY KEY AUTOINCREMENT', string: { name: 'TEXT' }, text: { name: 'TEXT' }, integer: { name: 'INTEGER' }, float: { name: 'REAL' }, decimal: { name: 'REAL' }, datetime: { name: 'TEXT' }, timestamp: { name: 'TEXT' }, time: { name: 'TEXT' }, date: { name: 'TEXT' }, binary: { name: 'BLOB' }, boolean: { name: 'INTEGER' }, json: { name: 'TEXT' } }.freeze
Instance Method Summary collapse
- #active? ⇒ Boolean
-
#adapter_name ⇒ Object
———————————————————————– Adapter 識別 ———————————————————————–.
- #affected_rows(raw_result) ⇒ Object
-
#begin_db_transaction ⇒ Object
———————————————————————– トランザクション ———————————————————————–.
-
#cast_result(raw_result) ⇒ Object
perform_query が返した結果をそのまま使う(すでに ActiveRecord::Result).
- #columns(table_name) ⇒ Object
- #commit_db_transaction ⇒ Object
-
#connect! ⇒ Object
———————————————————————– 接続管理(AR 8 スタイル) AR の ConnectionPool はスレッドごとに独立した Adapter インスタンスを払い出すため ———————————————————————–.
- #disconnect! ⇒ Object
- #exec_rollback_db_transaction ⇒ Object
-
#last_inserted_id(_result) ⇒ Object
———————————————————————– INSERT 後の id AR 8 は last_inserted_id(result) を呼ぶ ———————————————————————–.
-
#native_database_types ⇒ Object
———————————————————————– スキーマ情報 ———————————————————————–.
-
#perform_query(raw_connection, sql, _binds, type_casted_binds, prepare:, notification_payload:, batch: false) ⇒ Object
AR 8 が with_raw_connection { |conn| } で呼ぶ中核メソッド.
-
#quote_column_name(name) ⇒ Object
———————————————————————– クォート ———————————————————————–.
- #quote_table_name(name) ⇒ Object
- #quoted_false ⇒ Object
- #quoted_true ⇒ Object
- #reconnect! ⇒ Object
- #supports_ddl_transactions? ⇒ Boolean
- #supports_explain? ⇒ Boolean
- #supports_lazy_transactions? ⇒ Boolean
- #supports_migrations? ⇒ Boolean
- #supports_primary_key? ⇒ Boolean
- #supports_savepoints? ⇒ Boolean
-
#sync ⇒ Object
Embedded Replica モードでリモートから最新フレームを手動同期する。 Remote モードでは何もしない(no-op)。.
- #table_exists?(table_name) ⇒ Boolean
- #tables(_name = nil) ⇒ Object
- #write_query?(sql) ⇒ Boolean
Instance Method Details
#active? ⇒ Boolean
95 96 97 98 99 100 101 102 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 95 def active? return false unless @raw_connection @raw_connection.query('SELECT 1') true rescue StandardError false end |
#adapter_name ⇒ Object
Adapter 識別
48 49 50 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 48 def adapter_name ADAPTER_NAME end |
#affected_rows(raw_result) ⇒ Object
157 158 159 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 157 def affected_rows(raw_result) raw_result.length end |
#begin_db_transaction ⇒ Object
トランザクション
165 166 167 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 165 def begin_db_transaction @raw_connection&.begin_transaction end |
#cast_result(raw_result) ⇒ Object
perform_query が返した結果をそのまま使う(すでに ActiveRecord::Result)
153 154 155 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 153 def cast_result(raw_result) raw_result end |
#columns(table_name) ⇒ Object
202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 202 def columns(table_name) result = internal_exec_query( "PRAGMA table_info(#{quote_table_name(table_name)})", 'SCHEMA' ) result.map do |row| sql_type = row['type'].to_s cast_type = type_map.lookup(sql_type) || Type::Value.new sql_type_md = (sql_type) # AR 8.1: Column.new(name, cast_type, default, sql_type_metadata, null) Column.new( row['name'], cast_type, row['dflt_value'], sql_type_md, row['notnull'].to_i.zero? ) end end |
#commit_db_transaction ⇒ Object
169 170 171 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 169 def commit_db_transaction @raw_connection&.commit_transaction end |
#connect! ⇒ Object
接続管理(AR 8 スタイル)AR の ConnectionPool はスレッドごとに独立した Adapter インスタンスを払い出すため
90 91 92 93 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 90 def connect! @raw_database, @raw_connection = build_libsql_connection super end |
#disconnect! ⇒ Object
109 110 111 112 113 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 109 def disconnect! @raw_connection = nil @raw_database = nil super end |
#exec_rollback_db_transaction ⇒ Object
173 174 175 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 173 def exec_rollback_db_transaction @raw_connection&.rollback_transaction end |
#last_inserted_id(_result) ⇒ Object
INSERT 後の id AR 8 は last_inserted_id(result) を呼ぶ
182 183 184 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 182 def last_inserted_id(_result) @raw_connection&.last_insert_rowid end |
#native_database_types ⇒ Object
スキーマ情報
190 191 192 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 190 def native_database_types NATIVE_DATABASE_TYPES end |
#perform_query(raw_connection, sql, _binds, type_casted_binds, prepare:, notification_payload:, batch: false) ⇒ Object
AR 8 が with_raw_connection { |conn| } で呼ぶ中核メソッド
127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 127 def perform_query(raw_connection, sql, _binds, type_casted_binds, prepare:, notification_payload:, batch: false) # バインドパラメータを SQL に展開する(libsql の ? プレースホルダーに対応) = if type_casted_binds&.any? i = -1 sql.gsub('?') do i += 1 quote(type_casted_binds[i]) end else sql end if read_query?() rows = raw_connection.query() notification_payload[:row_count] = rows.size if notification_payload build_result(rows) else affected = raw_connection.execute() notification_payload[:row_count] = affected if notification_payload ActiveRecord::Result.empty(affected_rows: affected.to_i) end rescue RuntimeError => e raise translate_exception(e, message: e., sql: , binds: []) end |
#quote_column_name(name) ⇒ Object
クォート
230 231 232 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 230 def quote_column_name(name) %("#{name.to_s.gsub('"', '""')}") end |
#quote_table_name(name) ⇒ Object
234 235 236 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 234 def quote_table_name(name) %("#{name.to_s.gsub('"', '""')}") end |
#quoted_false ⇒ Object
242 243 244 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 242 def quoted_false '0' end |
#quoted_true ⇒ Object
238 239 240 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 238 def quoted_true '1' end |
#reconnect! ⇒ Object
104 105 106 107 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 104 def reconnect! @raw_database, @raw_connection = build_libsql_connection super end |
#supports_ddl_transactions? ⇒ Boolean
60 61 62 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 60 def supports_ddl_transactions? false end |
#supports_explain? ⇒ Boolean
68 69 70 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 68 def supports_explain? false end |
#supports_lazy_transactions? ⇒ Boolean
72 73 74 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 72 def supports_lazy_transactions? false end |
#supports_migrations? ⇒ Boolean
52 53 54 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 52 def supports_migrations? true end |
#supports_primary_key? ⇒ Boolean
56 57 58 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 56 def supports_primary_key? true end |
#supports_savepoints? ⇒ Boolean
64 65 66 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 64 def supports_savepoints? false end |
#sync ⇒ Object
Embedded Replica モードでリモートから最新フレームを手動同期する。Remote モードでは何もしない(no-op)。
117 118 119 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 117 def sync @raw_database&.sync end |
#table_exists?(table_name) ⇒ Boolean
222 223 224 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 222 def table_exists?(table_name) tables.include?(table_name.to_s) end |
#tables(_name = nil) ⇒ Object
194 195 196 197 198 199 200 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 194 def tables(_name = nil) result = internal_exec_query( "SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'", 'SCHEMA' ) result.rows.flatten end |
#write_query?(sql) ⇒ Boolean
76 77 78 79 80 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 76 def write_query?(sql) !READ_QUERY.match?(sql) rescue ArgumentError !READ_QUERY.match?(sql.b) end |