Cleaner error handling

This commit is contained in:
Alexey Romanov
2010-11-18 17:05:56 +03:00
parent 10950c2b85
commit da4efc61f6
3 changed files with 18 additions and 15 deletions

View File

@@ -115,15 +115,17 @@ static int control(ErlDrvData drv_data, unsigned int command, char *buf,
static inline int return_error(sqlite3_drv_t *drv, const char *error, static inline int return_error(sqlite3_drv_t *drv, const char *error,
ErlDrvTermData **spec, int *term_count) { ErlDrvTermData **spec, int *term_count) {
*spec = (ErlDrvTermData *) calloc(7, sizeof(ErlDrvTermData)); *spec = (ErlDrvTermData *) malloc(9 * sizeof(ErlDrvTermData));
(*spec)[0] = ERL_DRV_ATOM; (*spec)[0] = ERL_DRV_PORT;
(*spec)[1] = drv->atom_error; (*spec)[1] = driver_mk_port(drv->port);
(*spec)[2] = ERL_DRV_STRING; (*spec)[2] = ERL_DRV_ATOM;
(*spec)[3] = (ErlDrvTermData) error; (*spec)[3] = drv->atom_error;
(*spec)[4] = strlen(error); (*spec)[4] = ERL_DRV_STRING;
(*spec)[5] = ERL_DRV_TUPLE; (*spec)[5] = (ErlDrvTermData) error;
(*spec)[6] = 2; (*spec)[6] = strlen(error);
*term_count = 7; (*spec)[7] = ERL_DRV_TUPLE;
(*spec)[8] = 3;
*term_count = 9;
return 0; return 0;
} }

View File

@@ -716,13 +716,13 @@ exec(Port, {sql_exec, Cmd}) ->
wait_result(Port) -> wait_result(Port) ->
receive receive
%% Messages given at http://www.erlang.org/doc/reference_manual/ports.html %% Messages given at http://www.erlang.org/doc/reference_manual/ports.html
{Port, Reply} -> {Port, error, Reason} ->
% ?dbg("Reply: ~p~n", [Reply]),
Reply;
{error, Reason} ->
error_logger:error_msg("sqlite3 driver error: ~s~n", [Reason]), error_logger:error_msg("sqlite3 driver error: ~s~n", [Reason]),
% ?dbg("Error: ~p~n", [Reason]), % ?dbg("Error: ~p~n", [Reason]),
{error, Reason}; {error, Reason};
{Port, Reply} ->
% ?dbg("Reply: ~p~n", [Reply]),
Reply;
{'EXIT', Port, Reason} -> {'EXIT', Port, Reason} ->
error_logger:error_msg("sqlite3 driver port closed with reason ~p~n", [Reason]), error_logger:error_msg("sqlite3 driver port closed with reason ~p~n", [Reason]),
% ?dbg("Error: ~p~n", [Reason]), % ?dbg("Error: ~p~n", [Reason]),

View File

@@ -56,16 +56,17 @@ basic_functionality() ->
Columns = ["id", "name", "age", "wage"], Columns = ["id", "name", "age", "wage"],
AllRows = [{1, <<"abby">>, 20, 2000}, {2, <<"marge">>, 30, 2000}], AllRows = [{1, <<"abby">>, 20, 2000}, {2, <<"marge">>, 30, 2000}],
AbbyOnly = [{1, <<"abby">>, 20, 2000}], AbbyOnly = [{1, <<"abby">>, 20, 2000}],
TableInfo = [{id, integer, [primary_key]}, {name, text}, {age, integer}, {wage, integer}],
drop_all_tables(ct), drop_all_tables(ct),
?assertEqual( ?assertEqual(
[], [],
sqlite3:list_tables(ct)), sqlite3:list_tables(ct)),
{ok, TableId} = sqlite3:create_table(ct, user, [{id, integer, [primary_key]}, {name, text}, {age, integer}, {wage, integer}]), {ok, TableId} = sqlite3:create_table(ct, user, TableInfo),
?assertEqual( ?assertEqual(
[user], [user],
sqlite3:list_tables(ct)), sqlite3:list_tables(ct)),
?assertEqual( ?assertEqual(
[{id, integer, [primary_key]}, {name, text}, {age, integer}, {wage, integer}], TableInfo,
sqlite3:table_info(ct, user)), sqlite3:table_info(ct, user)),
?assertEqual( ?assertEqual(
{id, 1}, {id, 1},