-module(gdo@connection). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/gdo/connection.gleam"). -export([driver/1, sqlite/1, sqlite_config/1, server/6, no_authentication/0, username_and_password/2, disable_tls/0, prefer_tls/0, require_tls/0, with_option/3, config_driver/1, config_target/1, config_options/1, open/1, database/1, capabilities/1, target/1, options/1, in_transaction/1, 'begin'/1, commit/1, rollback/1, prepare/2, close/1, exec/3, query_one/3, query_all/3, query_one_as/4, query_all_as/4, last_insert_id/1]). -export_type([connection_config/0, connection/0]). -type connection_config() :: {connection_config, gdo@driver:driver(), gdo@driver:connection_target(), list({binary(), binary()})}. -opaque connection() :: {connection, connection_config(), gdo@transaction:transaction_state(), gdo@driver:driver_contract(), gdo@driver:driver_connection_state()}. -file("src/gdo/connection.gleam", 132). -spec driver(connection()) -> gdo@driver:driver(). driver(Connection) -> {connection, Config, _, _, _} = Connection, {connection_config, Driver, _, _} = Config, Driver. -file("src/gdo/connection.gleam", 30). -spec sqlite(binary()) -> connection_config(). sqlite(Database) -> {connection_config, sqlite, {embedded_database, Database}, []}. -file("src/gdo/connection.gleam", 38). -spec sqlite_config(binary()) -> connection_config(). sqlite_config(Database) -> sqlite(Database). -file("src/gdo/connection.gleam", 42). -spec server( gdo@driver:driver(), binary(), integer(), binary(), gdo@driver:authentication(), gdo@driver:transport_security() ) -> connection_config(). server(Current_driver, Host, Port, Database, Authentication, Tls) -> {connection_config, Current_driver, {server_database, {network_endpoint, Host, Port, Database, Authentication, Tls}}, []}. -file("src/gdo/connection.gleam", 63). -spec no_authentication() -> gdo@driver:authentication(). no_authentication() -> no_authentication. -file("src/gdo/connection.gleam", 67). -spec username_and_password(binary(), binary()) -> gdo@driver:authentication(). username_and_password(Username, Password) -> {username_and_password, Username, Password}. -file("src/gdo/connection.gleam", 74). -spec disable_tls() -> gdo@driver:transport_security(). disable_tls() -> disable_tls. -file("src/gdo/connection.gleam", 78). -spec prefer_tls() -> gdo@driver:transport_security(). prefer_tls() -> prefer_tls. -file("src/gdo/connection.gleam", 82). -spec require_tls() -> gdo@driver:transport_security(). require_tls() -> require_tls. -file("src/gdo/connection.gleam", 86). -spec with_option(connection_config(), binary(), binary()) -> connection_config(). with_option(Config, Key, Value) -> {connection_config, Driver, Target, Options} = Config, {connection_config, Driver, Target, [{Key, Value} | Options]}. -file("src/gdo/connection.gleam", 95). -spec config_driver(connection_config()) -> gdo@driver:driver(). config_driver(Config) -> {connection_config, Driver, _, _} = Config, Driver. -file("src/gdo/connection.gleam", 100). -spec config_target(connection_config()) -> gdo@driver:connection_target(). config_target(Config) -> {connection_config, _, Target, _} = Config, Target. -file("src/gdo/connection.gleam", 105). -spec config_options(connection_config()) -> list({binary(), binary()}). config_options(Config) -> {connection_config, _, _, Options} = Config, Options. -file("src/gdo/connection.gleam", 352). -spec validate_authentication(gdo@driver:authentication()) -> {ok, nil} | {error, gdo@error:error()}. validate_authentication(Authentication) -> case Authentication of no_authentication -> {ok, nil}; {username_and_password, Username, _} -> case gleam@string:is_empty(gleam@string:trim(Username)) of true -> {error, {invalid_configuration, <<"Username cannot be empty."/utf8>>}}; false -> {ok, nil} end end. -file("src/gdo/connection.gleam", 327). -spec validate_network_endpoint(gdo@driver:network_endpoint()) -> {ok, nil} | {error, gdo@error:error()}. validate_network_endpoint(Network) -> {network_endpoint, Host, Port, Database, Authentication, _} = Network, case gleam@string:is_empty(gleam@string:trim(Host)) of true -> {error, {invalid_configuration, <<"Host cannot be empty."/utf8>>}}; false -> case Port =< 0 of true -> {error, {invalid_configuration, <<"Port must be greater than zero."/utf8>>}}; false -> case gleam@string:is_empty(gleam@string:trim(Database)) of true -> {error, {invalid_configuration, <<"Database cannot be empty."/utf8>>}}; false -> validate_authentication(Authentication) end end end. -file("src/gdo/connection.gleam", 315). -spec validate_target(gdo@driver:connection_target()) -> {ok, nil} | {error, gdo@error:error()}. validate_target(Target) -> case Target of {embedded_database, Path} -> case gleam@string:is_empty(gleam@string:trim(Path)) of true -> {error, {invalid_configuration, <<"Database cannot be empty."/utf8>>}}; false -> {ok, nil} end; {server_database, Network} -> validate_network_endpoint(Network) end. -file("src/gdo/connection.gleam", 110). -spec open(connection_config()) -> {ok, connection()} | {error, gdo@error:error()}. open(Config) -> {connection_config, Current_driver, Target, _} = Config, case validate_target(Target) of {ok, _} -> Contract = gdo@driver@registry:contract(Current_driver), case gdo@driver:connect(Contract, Target) of {ok, Connection_state} -> {ok, {connection, Config, idle, Contract, Connection_state}}; {error, Error} -> {error, Error} end; {error, Error@1} -> {error, Error@1} end. -file("src/gdo/connection.gleam", 138). -spec database(connection()) -> binary(). database(Connection) -> {connection, Config, _, _, _} = Connection, {connection_config, _, Target, _} = Config, gdo@driver:identifier(Target). -file("src/gdo/connection.gleam", 144). -spec capabilities(connection()) -> list(gdo@driver:capability()). capabilities(Connection) -> gdo@driver:capabilities(driver(Connection)). -file("src/gdo/connection.gleam", 148). -spec target(connection()) -> gdo@driver:connection_target(). target(Connection) -> {connection, Config, _, _, _} = Connection, {connection_config, _, Target, _} = Config, Target. -file("src/gdo/connection.gleam", 154). -spec options(connection()) -> list({binary(), binary()}). options(Connection) -> {connection, Config, _, _, _} = Connection, {connection_config, _, _, Options} = Config, Options. -file("src/gdo/connection.gleam", 160). -spec in_transaction(connection()) -> boolean(). in_transaction(Connection) -> {connection, _, Transaction_state, _, _} = Connection, gdo@transaction:is_active(Transaction_state). -file("src/gdo/connection.gleam", 165). -spec 'begin'(connection()) -> {ok, connection()} | {error, gdo@error:error()}. 'begin'(Connection) -> {connection, Config, Transaction_state, Contract, Connection_state} = Connection, case gdo@transaction:'begin'(Transaction_state) of {ok, Next_state} -> case gdo@driver:'begin'(Contract, Connection_state) of {ok, Next_connection_state} -> {ok, {connection, Config, Next_state, Contract, Next_connection_state}}; {error, Error} -> {error, Error} end; {error, Error@1} -> {error, Error@1} end. -file("src/gdo/connection.gleam", 185). -spec commit(connection()) -> {ok, connection()} | {error, gdo@error:error()}. commit(Connection) -> {connection, Config, Transaction_state, Contract, Connection_state} = Connection, case gdo@transaction:commit(Transaction_state) of {ok, Next_state} -> case gdo@driver:commit(Contract, Connection_state) of {ok, Next_connection_state} -> {ok, {connection, Config, Next_state, Contract, Next_connection_state}}; {error, Error} -> {error, Error} end; {error, Error@1} -> {error, Error@1} end. -file("src/gdo/connection.gleam", 205). -spec rollback(connection()) -> {ok, connection()} | {error, gdo@error:error()}. rollback(Connection) -> {connection, Config, Transaction_state, Contract, Connection_state} = Connection, case gdo@transaction:rollback(Transaction_state) of {ok, Next_state} -> case gdo@driver:rollback(Contract, Connection_state) of {ok, Next_connection_state} -> {ok, {connection, Config, Next_state, Contract, Next_connection_state}}; {error, Error} -> {error, Error} end; {error, Error@1} -> {error, Error@1} end. -file("src/gdo/connection.gleam", 225). -spec prepare(connection(), binary()) -> {ok, gdo@statement:statement()} | {error, gdo@error:error()}. prepare(Connection, Sql) -> {connection, _, _, Contract, Connection_state} = Connection, case gdo@statement:prepare(Sql) of {ok, Prepared_statement} -> case gdo@driver:prepare( Contract, Connection_state, gdo@statement:sql(Prepared_statement) ) of {ok, Statement_state} -> {ok, gdo@statement:bind( Prepared_statement, Contract, Statement_state )}; {error, Error} -> {error, Error} end; {error, Error@1} -> {error, Error@1} end. -file("src/gdo/connection.gleam", 248). -spec close(connection()) -> {ok, nil} | {error, gdo@error:error()}. close(Connection) -> {connection, _, _, Contract, Connection_state} = Connection, gdo@driver:close(Contract, Connection_state). -file("src/gdo/connection.gleam", 253). -spec exec(connection(), binary(), list(gdo@value:param())) -> {ok, gdo@result:execution_result()} | {error, gdo@error:error()}. exec(Connection, Sql, Params) -> case prepare(Connection, Sql) of {ok, Prepared} -> gdo@statement:exec(Prepared, Params); {error, Error} -> {error, Error} end. -file("src/gdo/connection.gleam", 264). -spec query_one(connection(), binary(), list(gdo@value:param())) -> {ok, gleam@option:option(gdo@row:row())} | {error, gdo@error:error()}. query_one(Connection, Sql, Params) -> case prepare(Connection, Sql) of {ok, Prepared} -> gdo@statement:query_one(Prepared, Params); {error, Error} -> {error, Error} end. -file("src/gdo/connection.gleam", 275). -spec query_all(connection(), binary(), list(gdo@value:param())) -> {ok, gdo@result:query_result()} | {error, gdo@error:error()}. query_all(Connection, Sql, Params) -> case prepare(Connection, Sql) of {ok, Prepared} -> gdo@statement:query_all(Prepared, Params); {error, Error} -> {error, Error} end. -file("src/gdo/connection.gleam", 286). -spec query_one_as( connection(), binary(), list(gdo@value:param()), fun((gdo@row:row()) -> {ok, LVE} | {error, gdo@error:error()}) ) -> {ok, gleam@option:option(LVE)} | {error, gdo@error:error()}. query_one_as(Connection, Sql, Params, Decoder) -> case prepare(Connection, Sql) of {ok, Prepared} -> gdo@statement:query_one_as(Prepared, Params, Decoder); {error, Error} -> {error, Error} end. -file("src/gdo/connection.gleam", 298). -spec query_all_as( connection(), binary(), list(gdo@value:param()), fun((gdo@row:row()) -> {ok, LVK} | {error, gdo@error:error()}) ) -> {ok, list(LVK)} | {error, gdo@error:error()}. query_all_as(Connection, Sql, Params, Decoder) -> case prepare(Connection, Sql) of {ok, Prepared} -> gdo@statement:query_all_as(Prepared, Params, Decoder); {error, Error} -> {error, Error} end. -file("src/gdo/connection.gleam", 310). -spec last_insert_id(connection()) -> gleam@option:option(integer()). last_insert_id(Connection) -> {connection, _, _, Contract, Connection_state} = Connection, gdo@driver:last_insert_id(Contract, Connection_state).