Formatting
This commit is contained in:
@@ -51,7 +51,6 @@
|
||||
-type result() :: {'ok', pid()} | 'ignore' | {'error', any()}.
|
||||
|
||||
-spec start_link(atom()) -> result().
|
||||
|
||||
start_link(Db) ->
|
||||
open(Db, []).
|
||||
|
||||
@@ -314,7 +313,7 @@ write_many(Db, Tbl, Data) ->
|
||||
%%--------------------------------------------------------------------
|
||||
-spec update(atom(), {atom(), sql_value()}, [{atom(), sql_value()}]) -> sql_non_query_result().
|
||||
update(Tbl, {Key, Value}, Data) ->
|
||||
update(?MODULE, Tbl, {Key, Value}, Data).
|
||||
update(?MODULE, Tbl, {Key, Value}, Data).
|
||||
|
||||
%%--------------------------------------------------------------------
|
||||
%% @spec update(Db :: atom(), Tbl :: atom(), Key :: atom(), Value, Data) -> sql_non_query_result()
|
||||
@@ -389,7 +388,7 @@ read(Db, Tbl, {Column, Value}) ->
|
||||
%%--------------------------------------------------------------------
|
||||
-spec read(atom(), atom(), {atom(), sql_value()}, [atom()]) -> sql_result().
|
||||
read(Db, Tbl, {Key, Value}, Columns) ->
|
||||
gen_server:call(Db, {read, Tbl, Key, Value, Columns}).
|
||||
gen_server:call(Db, {read, Tbl, Key, Value, Columns}).
|
||||
|
||||
%%--------------------------------------------------------------------
|
||||
%% @spec delete(Tbl :: atom(), Key) -> any()
|
||||
@@ -536,16 +535,16 @@ init(Options) ->
|
||||
DbFile = proplists:get_value(file, Options),
|
||||
PrivDir = get_priv_dir(),
|
||||
case erl_ddll:load(PrivDir, atom_to_list(?DRIVER_NAME)) of
|
||||
ok ->
|
||||
Port = open_port({spawn, create_port_cmd(DbFile)}, [binary]),
|
||||
{ok, #state{port = Port, ops = Options}};
|
||||
{error, permanent} -> %% already loaded!
|
||||
Port = open_port({spawn, create_port_cmd(DbFile)}, [binary]),
|
||||
{ok, #state{port = Port, ops = Options}};
|
||||
{error, Error} ->
|
||||
Msg = io_lib:format("Error loading ~p: ~s",
|
||||
[?DRIVER_NAME, erl_ddll:format_error(Error)]),
|
||||
{stop, lists:flatten(Msg)}
|
||||
ok ->
|
||||
Port = open_port({spawn, create_port_cmd(DbFile)}, [binary]),
|
||||
{ok, #state{port = Port, ops = Options}};
|
||||
{error, permanent} -> %% already loaded!
|
||||
Port = open_port({spawn, create_port_cmd(DbFile)}, [binary]),
|
||||
{ok, #state{port = Port, ops = Options}};
|
||||
{error, Error} ->
|
||||
Msg = io_lib:format("Error loading ~p: ~s",
|
||||
[?DRIVER_NAME, erl_ddll:format_error(Error)]),
|
||||
{stop, lists:flatten(Msg)}
|
||||
end.
|
||||
|
||||
%%--------------------------------------------------------------------
|
||||
@@ -737,31 +736,33 @@ do_sql_bind_and_exec(SQL, Params, #state{port = Port}) ->
|
||||
exec(Port, {sql_bind_and_exec, SQL, Params}).
|
||||
|
||||
exec(_Port, {create_function, _FunctionName, _Function}) ->
|
||||
error_logger:error_report([{application, sqlite3}, "NOT IMPL YET"]);
|
||||
%port_control(Port, ?SQL_CREATE_FUNCTION, list_to_binary(Cmd)),
|
||||
%wait_result(Port);
|
||||
error_logger:error_report([{application, sqlite3}, "NOT IMPL YET"]);
|
||||
%port_control(Port, ?SQL_CREATE_FUNCTION, list_to_binary(Cmd)),
|
||||
%wait_result(Port);
|
||||
exec(Port, {sql_exec, Cmd}) ->
|
||||
port_control(Port, ?SQL_EXEC_COMMAND, Cmd),
|
||||
wait_result(Port);
|
||||
port_control(Port, ?SQL_EXEC_COMMAND, Cmd),
|
||||
wait_result(Port);
|
||||
exec(Port, {sql_bind_and_exec, SQL, Params}) ->
|
||||
Bin = term_to_binary({iolist_to_binary(SQL), Params}),
|
||||
port_control(Port, ?SQL_BIND_AND_EXEC_COMMAND, Bin),
|
||||
wait_result(Port).
|
||||
Bin = term_to_binary({iolist_to_binary(SQL), Params}),
|
||||
port_control(Port, ?SQL_BIND_AND_EXEC_COMMAND, Bin),
|
||||
wait_result(Port).
|
||||
|
||||
wait_result(Port) ->
|
||||
receive
|
||||
{Port, error, Code, Reason} ->
|
||||
error_logger:error_msg("sqlite3 driver error: ~s~n", [Reason]),
|
||||
% ?dbg("Error: ~p~n", [Reason]),
|
||||
{error, Code, Reason};
|
||||
{Port, Reply} ->
|
||||
% ?dbg("Reply: ~p~n", [Reply]),
|
||||
Reply;
|
||||
{'EXIT', Port, Reason} ->
|
||||
error_logger:error_msg("sqlite3 driver port closed with reason ~p~n", [Reason]),
|
||||
% ?dbg("Error: ~p~n", [Reason]),
|
||||
{error, -1, Reason}
|
||||
end.
|
||||
receive
|
||||
{Port, error, Code, Reason} ->
|
||||
error_logger:error_msg("sqlite3 driver error: ~s~n",
|
||||
[Reason]),
|
||||
% ?dbg("Error: ~p~n", [Reason]),
|
||||
{error, Code, Reason};
|
||||
{Port, Reply} ->
|
||||
% ?dbg("Reply: ~p~n", [Reply]),
|
||||
Reply;
|
||||
{'EXIT', Port, Reason} ->
|
||||
error_logger:error_msg("sqlite3 driver port closed with reason ~p~n",
|
||||
[Reason]),
|
||||
% ?dbg("Error: ~p~n", [Reason]),
|
||||
{error, -1, Reason}
|
||||
end.
|
||||
|
||||
parse_table_info(Info) ->
|
||||
[_, Tail] = string:tokens(Info, "()"),
|
||||
|
||||
@@ -168,11 +168,11 @@ bin_to_hex(Binary) -> << <<(half_byte_to_hex(X)):8>> || <<X:4>> <= Binary>>.
|
||||
%%--------------------------------------------------------------------
|
||||
-spec update_set_sql([{atom(), sql_value()}]) -> iolist().
|
||||
update_set_sql(Data) ->
|
||||
ColValueToSqlFun =
|
||||
fun({Col, Value}) ->
|
||||
[atom_to_list(Col), " = ", value_to_sql(Value)]
|
||||
end,
|
||||
map_intersperse(ColValueToSqlFun, Data, ", ").
|
||||
ColValueToSqlFun =
|
||||
fun({Col, Value}) ->
|
||||
[atom_to_list(Col), " = ", value_to_sql(Value)]
|
||||
end,
|
||||
map_intersperse(ColValueToSqlFun, Data, ", ").
|
||||
|
||||
%%--------------------------------------------------------------------
|
||||
%% @spec read_cols_sql(Columns::[atom()]) -> iolist()
|
||||
@@ -182,7 +182,7 @@ update_set_sql(Data) ->
|
||||
%%--------------------------------------------------------------------
|
||||
-spec read_cols_sql([atom()]) -> iolist().
|
||||
read_cols_sql(Columns) ->
|
||||
map_intersperse(fun atom_to_list/1, Columns, ", ").
|
||||
map_intersperse(fun atom_to_list/1, Columns, ", ").
|
||||
|
||||
%%--------------------------------------------------------------------
|
||||
%% @spec create_table_sql(Tbl :: atom(), ColumnData) -> iolist()
|
||||
@@ -356,7 +356,8 @@ sql_number(NumberStr) ->
|
||||
|
||||
-spec sql_string(string()) -> binary().
|
||||
sql_string(StringWithEscapedQuotes) ->
|
||||
Res1 = re:replace(StringWithEscapedQuotes, "''", "'", [global, {return, binary}]),
|
||||
Res1 = re:replace(StringWithEscapedQuotes, "''", "'",
|
||||
[global, {return, binary}]),
|
||||
binary_part(Res1, 0, byte_size(Res1) - 1).
|
||||
|
||||
-spec sql_blob(string()) -> binary().
|
||||
@@ -386,8 +387,12 @@ constraint_sql(Constraint) ->
|
||||
-spec table_constraint_sql(any()) -> iolist().
|
||||
table_constraint_sql(TableConstraint) ->
|
||||
case TableConstraint of
|
||||
{primary_key, Columns} -> ["PRIMARY KEY(", map_intersperse(fun indexed_column_sql/1, Columns, ", "), ")"];
|
||||
{unique, Columns} -> ["UNIQUE(", map_intersperse(fun indexed_column_sql/1, Columns, ", "), ")"]
|
||||
{primary_key, Columns} ->
|
||||
["PRIMARY KEY(",
|
||||
map_intersperse(fun indexed_column_sql/1, Columns, ", "), ")"];
|
||||
{unique, Columns} ->
|
||||
["UNIQUE(",
|
||||
map_intersperse(fun indexed_column_sql/1, Columns, ", "), ")"]
|
||||
%% TODO: foreign key
|
||||
end.
|
||||
|
||||
@@ -409,8 +414,8 @@ indexed_column_sql(ColumnName) -> atom_to_list(ColumnName).
|
||||
-ifdef(TEST).
|
||||
-include_lib("eunit/include/eunit.hrl").
|
||||
|
||||
-define(FLAT(X), iolist_to_binary(X)).
|
||||
-define(assertFlat(Expected, Value), ?assertEqual(iolist_to_binary(Expected), iolist_to_binary(Value))).
|
||||
-define(assertFlat(Expected, Value),
|
||||
?assertEqual(iolist_to_binary(Expected), iolist_to_binary(Value))).
|
||||
|
||||
quote_test() ->
|
||||
?assertFlat("'abc'", value_to_sql("abc")),
|
||||
@@ -422,7 +427,9 @@ create_table_sql_test() ->
|
||||
create_table_sql(user, [{id, integer, [primary_key]}, {name, text}])),
|
||||
?assertFlat(
|
||||
"CREATE TABLE user (id INTEGER, name TEXT, PRIMARY KEY(id));",
|
||||
create_table_sql(user, [{id, integer}, {name, text}], [{primary_key, [id]}])).
|
||||
create_table_sql(user,
|
||||
[{id, integer}, {name, text}],
|
||||
[{primary_key, [id]}])).
|
||||
|
||||
update_sql_test() ->
|
||||
?assertFlat(
|
||||
|
||||
Reference in New Issue
Block a user