-module(gdo@driver@sqlite). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/gdo/driver/sqlite.gleam"). -export([capabilities/0, contract/0]). -file("src/gdo/driver/sqlite.gleam", 19). -spec capabilities() -> list(gdo@driver:capability()). capabilities() -> gdo@driver:capabilities(sqlite). -file("src/gdo/driver/sqlite.gleam", 334). -spec sqlite_error_details(sqlight:error_code(), integer()) -> list({binary(), binary()}). sqlite_error_details(Code, Offset) -> [{<<"driver"/utf8>>, <<"sqlite"/utf8>>}, {<<"driver_code"/utf8>>, erlang:integer_to_binary(sqlight:error_code_to_int(Code))}, {<<"error_offset"/utf8>>, erlang:integer_to_binary(Offset)}]. -file("src/gdo/driver/sqlite.gleam", 206). -spec query_error(sqlight:error()) -> gdo@error:error(). query_error(Sqlight_error) -> {sqlight_error, Code, Message, Offset} = Sqlight_error, {query_error, Message, none, {some, erlang:integer_to_binary(sqlight:error_code_to_int(Code))}, sqlite_error_details(Code, Offset)}. -file("src/gdo/driver/sqlite.gleam", 250). -spec read_last_insert_id(sqlight:connection()) -> {ok, gleam@option:option(integer())} | {error, gdo@error:error()}. read_last_insert_id(Connection) -> case sqlight:'query'( <<"select last_insert_rowid()"/utf8>>, Connection, [], gleam@dynamic@decode:at( [0], {decoder, fun gleam@dynamic@decode:decode_int/1} ) ) of {ok, [0]} -> {ok, none}; {ok, [Last_insert_id]} -> {ok, {some, Last_insert_id}}; {ok, _} -> {error, {decode_error, <<"SQLite did not return a last_insert_rowid() value."/utf8>>}}; {error, Error} -> {error, query_error(Error)} end. -file("src/gdo/driver/sqlite.gleam", 165). -spec last_insert_id(gdo@driver:driver_connection_state()) -> gleam@option:option(integer()). last_insert_id(Connection_state) -> {sqlite_connection_state, _, Connection, _} = Connection_state, case read_last_insert_id(Connection) of {ok, Last_insert_id} -> Last_insert_id; {error, _} -> none end. -file("src/gdo/driver/sqlite.gleam", 216). -spec transaction_error(sqlight:error()) -> gdo@error:error(). transaction_error(Sqlight_error) -> {sqlight_error, _, Message, _} = Sqlight_error, {transaction_error, Message}. -file("src/gdo/driver/sqlite.gleam", 154). -spec rollback(gdo@driver:driver_connection_state()) -> {ok, gdo@driver:driver_connection_state()} | {error, gdo@error:error()}. rollback(Connection_state) -> {sqlite_connection_state, _, Connection, _} = Connection_state, case sqlight:exec(<<"ROLLBACK"/utf8>>, Connection) of {ok, _} -> {ok, Connection_state}; {error, Error} -> {error, transaction_error(Error)} end. -file("src/gdo/driver/sqlite.gleam", 143). -spec commit(gdo@driver:driver_connection_state()) -> {ok, gdo@driver:driver_connection_state()} | {error, gdo@error:error()}. commit(Connection_state) -> {sqlite_connection_state, _, Connection, _} = Connection_state, case sqlight:exec(<<"COMMIT"/utf8>>, Connection) of {ok, _} -> {ok, Connection_state}; {error, Error} -> {error, transaction_error(Error)} end. -file("src/gdo/driver/sqlite.gleam", 132). -spec 'begin'(gdo@driver:driver_connection_state()) -> {ok, gdo@driver:driver_connection_state()} | {error, gdo@error:error()}. 'begin'(Connection_state) -> {sqlite_connection_state, _, Connection, _} = Connection_state, case sqlight:exec(<<"BEGIN"/utf8>>, Connection) of {ok, _} -> {ok, Connection_state}; {error, Error} -> {error, transaction_error(Error)} end. -file("src/gdo/driver/sqlite.gleam", 330). -spec column_name(integer()) -> binary(). column_name(Index) -> <<"column_"/utf8, (erlang:integer_to_binary(Index))/binary>>. -file("src/gdo/driver/sqlite.gleam", 304). -spec decode_non_null_db_value(gleam@dynamic:dynamic_()) -> {ok, gdo@value:db_value()} | {error, gdo@error:error()}. decode_non_null_db_value(Dynamic_value) -> case gleam@dynamic@decode:run( Dynamic_value, {decoder, fun gleam@dynamic@decode:decode_int/1} ) of {ok, Current_value} -> {ok, {int, Current_value}}; {error, _} -> case gleam@dynamic@decode:run( Dynamic_value, {decoder, fun gleam@dynamic@decode:decode_float/1} ) of {ok, Current_value@1} -> {ok, {float, Current_value@1}}; {error, _} -> case gleam@dynamic@decode:run( Dynamic_value, {decoder, fun gleam@dynamic@decode:decode_string/1} ) of {ok, Current_value@2} -> {ok, {string, Current_value@2}}; {error, _} -> case gleam@dynamic@decode:run( Dynamic_value, {decoder, fun gleam@dynamic@decode:decode_bit_array/1} ) of {ok, Current_value@3} -> {ok, {bytes, Current_value@3}}; {error, _} -> case gleam@dynamic@decode:run( Dynamic_value, {decoder, fun gleam@dynamic@decode:decode_bool/1} ) of {ok, Current_value@4} -> {ok, {bool, Current_value@4}}; {error, _} -> {error, {decode_error, <<"Unsupported SQLite value type."/utf8>>}} end end end end end. -file("src/gdo/driver/sqlite.gleam", 296). -spec dynamic_to_db_value(gleam@dynamic:dynamic_()) -> {ok, gdo@value:db_value()} | {error, gdo@error:error()}. dynamic_to_db_value(Dynamic_value) -> case gleam@dynamic@decode:run( Dynamic_value, gleam@dynamic@decode:optional( {decoder, fun gleam@dynamic@decode:decode_dynamic/1} ) ) of {ok, none} -> {ok, null}; {ok, {some, Non_null_value}} -> decode_non_null_db_value(Non_null_value); {error, _} -> {error, {decode_error, <<"Unsupported SQLite value type."/utf8>>}} end. -file("src/gdo/driver/sqlite.gleam", 276). -spec dynamic_row_to_columns( gleam@dynamic:dynamic_(), integer(), list({binary(), gdo@value:db_value()}) ) -> {ok, list({binary(), gdo@value:db_value()})} | {error, gdo@error:error()}. dynamic_row_to_columns(Current_row, Index, Columns) -> case gleam@dynamic@decode:run( Current_row, gleam@dynamic@decode:at( [Index], {decoder, fun gleam@dynamic@decode:decode_dynamic/1} ) ) of {ok, Dynamic_value} -> case dynamic_to_db_value(Dynamic_value) of {ok, Db_value} -> dynamic_row_to_columns( Current_row, Index + 1, [{column_name(Index), Db_value} | Columns] ); {error, Error} -> {error, Error} end; {error, _} -> {ok, lists:reverse(Columns)} end. -file("src/gdo/driver/sqlite.gleam", 269). -spec decode_sqlite_row(gleam@dynamic:dynamic_()) -> {ok, gdo@row:row()} | {error, gdo@error:error()}. decode_sqlite_row(Current_row) -> case dynamic_row_to_columns(Current_row, 0, []) of {ok, Columns} -> {ok, gdo@row:new(Columns)}; {error, Error} -> {error, Error} end. -file("src/gdo/driver/sqlite.gleam", 185). -spec to_sqlight_value(gdo@value:db_value()) -> sqlight:value(). to_sqlight_value(Db_value) -> case Db_value of null -> sqlight_ffi:null(); {int, Current_value} -> sqlight:int(Current_value); {float, Current_value@1} -> sqlight:float(Current_value@1); {bool, Current_value@2} -> sqlight:bool(Current_value@2); {string, Current_value@3} -> sqlight:text(Current_value@3); {bytes, Current_value@4} -> sqlight_ffi:coerce_blob(Current_value@4) end. -file("src/gdo/driver/sqlite.gleam", 176). -spec to_sqlight_values(list(gdo@value:param())) -> list(sqlight:value()). to_sqlight_values(Params) -> gleam@list:map(Params, fun(Param) -> case Param of {positional, Current_value} -> to_sqlight_value(Current_value); {named, _, Current_value@1} -> to_sqlight_value(Current_value@1) end end). -file("src/gdo/driver/sqlite.gleam", 109). -spec query_all(gdo@driver:driver_statement_state(), list(gdo@value:param())) -> {ok, gdo@result:query_result()} | {error, gdo@error:error()}. query_all(Statement_state, Params) -> {sqlite_statement_state, Connection, Sql} = Statement_state, case sqlight:'query'( Sql, Connection, to_sqlight_values(Params), {decoder, fun gleam@dynamic@decode:decode_dynamic/1} ) of {ok, Rows} -> case gleam@list:try_map(Rows, fun decode_sqlite_row/1) of {ok, Decoded_rows} -> {ok, gdo@result:query_result(Decoded_rows)}; {error, Error} -> {error, Error} end; {error, Error@1} -> {error, query_error(Error@1)} end. -file("src/gdo/driver/sqlite.gleam", 235). -spec read_rows_affected(sqlight:connection()) -> {ok, integer()} | {error, gdo@error:error()}. read_rows_affected(Connection) -> case sqlight:'query'( <<"select changes()"/utf8>>, Connection, [], gleam@dynamic@decode:at( [0], {decoder, fun gleam@dynamic@decode:decode_int/1} ) ) of {ok, [Rows_affected]} -> {ok, Rows_affected}; {ok, _} -> {error, {decode_error, <<"SQLite did not return a changes() value."/utf8>>}}; {error, Error} -> {error, query_error(Error)} end. -file("src/gdo/driver/sqlite.gleam", 221). -spec execution_result(sqlight:connection()) -> {ok, gdo@result:execution_result()} | {error, gdo@error:error()}. execution_result(Connection) -> case read_rows_affected(Connection) of {ok, Rows_affected} -> case read_last_insert_id(Connection) of {ok, Last_insert_id} -> {ok, gdo@result:execution_result( Rows_affected, Last_insert_id )}; {error, Error} -> {error, Error} end; {error, Error@1} -> {error, Error@1} end. -file("src/gdo/driver/sqlite.gleam", 81). -spec exec(gdo@driver:driver_statement_state(), list(gdo@value:param())) -> {ok, gdo@result:execution_result()} | {error, gdo@error:error()}. exec(Statement_state, Params) -> {sqlite_statement_state, Connection, Sql} = Statement_state, case to_sqlight_values(Params) of [] -> case sqlight:exec(Sql, Connection) of {ok, _} -> execution_result(Connection); {error, Error} -> {error, query_error(Error)} end; Arguments -> case sqlight:'query'( Sql, Connection, Arguments, gleam@dynamic@decode:success(nil) ) of {ok, _} -> execution_result(Connection); {error, Error@1} -> {error, query_error(Error@1)} end end. -file("src/gdo/driver/sqlite.gleam", 73). -spec prepare(gdo@driver:driver_connection_state(), binary()) -> {ok, gdo@driver:driver_statement_state()} | {error, gdo@error:error()}. prepare(Connection_state, Sql) -> {sqlite_connection_state, _, Connection, _} = Connection_state, {ok, {sqlite_statement_state, Connection, Sql}}. -file("src/gdo/driver/sqlite.gleam", 196). -spec connection_error(sqlight:error()) -> gdo@error:error(). connection_error(Sqlight_error) -> {sqlight_error, Code, Message, Offset} = Sqlight_error, {connection_error, Message, none, {some, erlang:integer_to_binary(sqlight:error_code_to_int(Code))}, sqlite_error_details(Code, Offset)}. -file("src/gdo/driver/sqlite.gleam", 64). -spec close(gdo@driver:driver_connection_state()) -> {ok, nil} | {error, gdo@error:error()}. close(Connection_state) -> {sqlite_connection_state, _, Connection, _} = Connection_state, case sqlight:close(Connection) of {ok, _} -> {ok, nil}; {error, Error} -> {error, connection_error(Error)} end. -file("src/gdo/driver/sqlite.gleam", 37). -spec connect(gdo@driver:connection_target()) -> {ok, gdo@driver:driver_connection_state()} | {error, gdo@error:error()}. connect(Target) -> case Target of {embedded_database, Path} -> case sqlight:open(Path) of {ok, Connection} -> {ok, {sqlite_connection_state, Path, Connection, none}}; {error, Error} -> {error, connection_error(Error)} end; {server_database, _} -> {error, {connection_error, <<"SQLite does not support network connection targets."/utf8>>, none, none, [{<<"driver"/utf8>>, <<"sqlite"/utf8>>}, {<<"target"/utf8>>, <<"server"/utf8>>}]}} end. -file("src/gdo/driver/sqlite.gleam", 23). -spec contract() -> gdo@driver:driver_contract(). contract() -> {driver_contract, fun connect/1, fun close/1, fun prepare/2, fun exec/2, fun query_all/2, fun 'begin'/1, fun commit/1, fun rollback/1, fun last_insert_id/1}.