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
107 108 109 110 111 112 113 114 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 107 def active? return false unless @raw_connection @raw_connection.query('SELECT 1') true rescue StandardError false end |
#adapter_name ⇒ Object
Adapter 識別
60 61 62 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 60 def adapter_name ADAPTER_NAME end |
#affected_rows(_raw_result) ⇒ Object
170 171 172 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 170 def affected_rows(_raw_result) @last_affected_rows || 0 end |
#begin_db_transaction ⇒ Object
トランザクション
178 179 180 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 178 def begin_db_transaction @raw_connection&.begin_transaction end |
#cast_result(raw_result) ⇒ Object
perform_query が返した結果をそのまま使う(すでに ActiveRecord::Result)
166 167 168 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 166 def cast_result(raw_result) raw_result end |
#columns(table_name) ⇒ Object
215 216 217 218 219 220 221 222 223 224 225 226 227 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 215 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) null = row['notnull'].to_i.zero? COLUMN_BUILDER.call(row['name'], cast_type, row['dflt_value'], sql_type_md, null) end end |
#commit_db_transaction ⇒ Object
182 183 184 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 182 def commit_db_transaction @raw_connection&.commit_transaction end |
#connect! ⇒ Object
接続管理(AR 8 スタイル)AR の ConnectionPool はスレッドごとに独立した Adapter インスタンスを払い出すため
102 103 104 105 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 102 def connect! @raw_database, @raw_connection = build_libsql_connection super end |
#disconnect! ⇒ Object
121 122 123 124 125 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 121 def disconnect! @raw_connection = nil @raw_database = nil super end |
#exec_rollback_db_transaction ⇒ Object
186 187 188 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 186 def exec_rollback_db_transaction @raw_connection&.rollback_transaction end |
#last_inserted_id(_result) ⇒ Object
INSERT 後の id AR 8 は last_inserted_id(result) を呼ぶ
195 196 197 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 195 def last_inserted_id(_result) @raw_connection&.last_insert_rowid end |
#native_database_types ⇒ Object
スキーマ情報
203 204 205 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 203 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| } で呼ぶ中核メソッド
139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 139 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() @last_affected_rows = affected.to_i notification_payload[:row_count] = @last_affected_rows if notification_payload ActiveRecord::Result.empty end rescue RuntimeError => e raise translate_exception(e, message: e., sql: , binds: []) end |
#quote_column_name(name) ⇒ Object
クォート
237 238 239 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 237 def quote_column_name(name) %("#{name.to_s.gsub('"', '""')}") end |
#quote_table_name(name) ⇒ Object
241 242 243 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 241 def quote_table_name(name) %("#{name.to_s.gsub('"', '""')}") end |
#quoted_false ⇒ Object
249 250 251 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 249 def quoted_false '0' end |
#quoted_true ⇒ Object
245 246 247 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 245 def quoted_true '1' end |
#reconnect! ⇒ Object
116 117 118 119 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 116 def reconnect! @raw_database, @raw_connection = build_libsql_connection super end |
#supports_ddl_transactions? ⇒ Boolean
72 73 74 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 72 def supports_ddl_transactions? false end |
#supports_explain? ⇒ Boolean
80 81 82 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 80 def supports_explain? false end |
#supports_lazy_transactions? ⇒ Boolean
84 85 86 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 84 def supports_lazy_transactions? false end |
#supports_migrations? ⇒ Boolean
64 65 66 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 64 def supports_migrations? true end |
#supports_primary_key? ⇒ Boolean
68 69 70 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 68 def supports_primary_key? true end |
#supports_savepoints? ⇒ Boolean
76 77 78 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 76 def supports_savepoints? false end |
#sync ⇒ Object
Embedded Replica モードでリモートから最新フレームを手動同期する。Remote モードでは何もしない(no-op)。
129 130 131 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 129 def sync @raw_database&.sync end |
#table_exists?(table_name) ⇒ Boolean
229 230 231 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 229 def table_exists?(table_name) tables.include?(table_name.to_s) end |
#tables(_name = nil) ⇒ Object
207 208 209 210 211 212 213 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 207 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
88 89 90 91 92 |
# File 'lib/active_record/connection_adapters/libsql_adapter.rb', line 88 def write_query?(sql) !READ_QUERY.match?(sql) rescue ArgumentError !READ_QUERY.match?(sql.b) end |