Skip to content

Commit 669fa56

Browse files
committed
use raise_badarg more
1 parent 5ca194f commit 669fa56

File tree

1 file changed

+62
-80
lines changed

1 file changed

+62
-80
lines changed

c_src/sqlite3_nif.c

+62-80
Original file line numberDiff line numberDiff line change
@@ -18,27 +18,17 @@ static ERL_NIF_TERM am_out_of_memory;
1818
static ERL_NIF_TERM am_done;
1919
static ERL_NIF_TERM am_row;
2020
static ERL_NIF_TERM am_rows;
21-
static ERL_NIF_TERM am_invalid_filename;
22-
static ERL_NIF_TERM am_invalid_flags;
23-
static ERL_NIF_TERM am_database_open_failed;
2421
static ERL_NIF_TERM am_failed_to_create_mutex;
25-
static ERL_NIF_TERM am_invalid_connection;
26-
static ERL_NIF_TERM am_sql_not_iolist;
2722
static ERL_NIF_TERM am_connection_closed;
28-
static ERL_NIF_TERM am_invalid_statement;
29-
static ERL_NIF_TERM am_invalid_chunk_size;
3023
static ERL_NIF_TERM am_busy;
3124
static ERL_NIF_TERM am_invalid_column_count;
3225
static ERL_NIF_TERM am_transaction;
3326
static ERL_NIF_TERM am_idle;
34-
static ERL_NIF_TERM am_database_name_not_iolist;
3527
static ERL_NIF_TERM am_serialization_failed;
3628
static ERL_NIF_TERM am_deserialization_failed;
37-
static ERL_NIF_TERM am_invalid_enable_load_extension_value;
3829
static ERL_NIF_TERM am_insert;
3930
static ERL_NIF_TERM am_delete;
4031
static ERL_NIF_TERM am_update;
41-
static ERL_NIF_TERM am_invalid_pid;
4232
static ERL_NIF_TERM am_log;
4333

4434
static ErlNifResourceType* connection_type = NULL;
@@ -195,6 +185,13 @@ make_sqlite3_error_tuple(ErlNifEnv* env, int rc, sqlite3* db)
195185
return make_error_tuple(make_binary(env, msg, len));
196186
}
197187

188+
static ERL_NIF_TERM
189+
raise_badarg(ErlNifEnv* env, ERL_NIF_TERM term)
190+
{
191+
ERL_NIF_TERM badarg = enif_make_tuple2(env, am_badarg, term);
192+
return enif_raise_exception(env, badarg);
193+
}
194+
198195
static ERL_NIF_TERM
199196
exqlite_open(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
200197
{
@@ -216,16 +213,17 @@ exqlite_open(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
216213
}
217214

218215
if (!enif_inspect_iolist_as_binary(env, enif_make_list2(env, argv[0], eos), &bin)) {
219-
return make_error_tuple(env, am_invalid_filename);
216+
return raise_badarg(env, argv[0]);
220217
}
221218

222219
if (!enif_get_int(env, argv[1], &flags)) {
223-
return make_error_tuple(env, am_invalid_flags);
220+
return raise_badarg(env, argv[1]);
224221
}
225222

226223
rc = sqlite3_open_v2((char*)bin.data, &db, flags, NULL);
227224
if (rc != SQLITE_OK) {
228-
return make_error_tuple(env, am_database_open_failed);
225+
const char* errstr = sqlite3_errstr(rc);
226+
return make_error_tuple(env, make_binary(env, errstr, strlen(errstr)));
229227
}
230228

231229
mutex = enif_mutex_create("exqlite:connection");
@@ -264,7 +262,7 @@ exqlite_close(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
264262
}
265263

266264
if (!enif_get_resource(env, argv[0], connection_type, (void**)&conn)) {
267-
return make_error_tuple(env, am_invalid_connection);
265+
return raise_badarg(env, argv[0]);
268266
}
269267

270268
// DB is already closed, nothing to do here
@@ -320,11 +318,11 @@ exqlite_execute(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
320318
}
321319

322320
if (!enif_get_resource(env, argv[0], connection_type, (void**)&conn)) {
323-
return make_error_tuple(env, am_invalid_connection);
321+
return raise_badarg(env, argv[0]);
324322
}
325323

326324
if (!enif_inspect_iolist_as_binary(env, enif_make_list2(env, argv[1], eos), &bin)) {
327-
return make_error_tuple(env, am_sql_not_iolist);
325+
return raise_badarg(env, argv[1]);
328326
}
329327

330328
rc = sqlite3_exec(conn->db, (char*)bin.data, NULL, NULL, NULL);
@@ -350,7 +348,7 @@ exqlite_changes(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
350348
}
351349

352350
if (!enif_get_resource(env, argv[0], connection_type, (void**)&conn)) {
353-
return make_error_tuple(env, am_invalid_connection);
351+
return raise_badarg(env, argv[0]);
354352
}
355353

356354
if (conn->db == NULL) {
@@ -381,11 +379,11 @@ exqlite_prepare(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
381379
}
382380

383381
if (!enif_get_resource(env, argv[0], connection_type, (void**)&conn)) {
384-
return make_error_tuple(env, am_invalid_connection);
382+
return raise_badarg(env, argv[0]);
385383
}
386384

387385
if (!enif_inspect_iolist_as_binary(env, enif_make_list2(env, argv[1], eos), &bin)) {
388-
return make_error_tuple(env, am_sql_not_iolist);
386+
return raise_badarg(env, argv[1]);
389387
}
390388

391389
statement = enif_alloc_resource(statement_type, sizeof(statement_t));
@@ -418,13 +416,6 @@ exqlite_prepare(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
418416
return make_ok_tuple(env, result);
419417
}
420418

421-
static ERL_NIF_TERM
422-
raise_badarg(ErlNifEnv* env, ERL_NIF_TERM term)
423-
{
424-
ERL_NIF_TERM badarg = enif_make_tuple2(env, am_badarg, term);
425-
return enif_raise_exception(env, badarg);
426-
}
427-
428419
static ERL_NIF_TERM
429420
exqlite_reset(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
430421
{
@@ -581,6 +572,7 @@ make_row(ErlNifEnv* env, sqlite3_stmt* statement)
581572

582573
columns = enif_alloc(sizeof(ERL_NIF_TERM) * count);
583574
if (!columns) {
575+
// TODO: should be exception, otherwise it's practically invisible
584576
return make_error_tuple(env, am_out_of_memory);
585577
}
586578

@@ -609,23 +601,23 @@ exqlite_multi_step(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
609601
}
610602

611603
if (!enif_get_resource(env, argv[0], connection_type, (void**)&conn)) {
612-
return make_error_tuple(env, am_invalid_connection);
604+
return raise_badarg(env, argv[0]);
613605
}
614606

615607
if (!enif_get_resource(env, argv[1], statement_type, (void**)&statement)) {
616-
return make_error_tuple(env, am_invalid_statement);
608+
return raise_badarg(env, argv[1]);
617609
}
618610

619611
if (!statement || !statement->statement) {
620-
return make_error_tuple(env, am_invalid_statement);
612+
return raise_badarg(env, argv[1]);
621613
}
622614

623615
if (!enif_get_int(env, argv[2], &chunk_size)) {
624-
return make_error_tuple(env, am_invalid_chunk_size);
616+
return raise_badarg(env, argv[2]);
625617
}
626618

627619
if (chunk_size < 1) {
628-
return make_error_tuple(env, am_invalid_chunk_size);
620+
return raise_badarg(env, argv[2]);
629621
}
630622

631623
ERL_NIF_TERM rows = enif_make_list_from_array(env, NULL, 0);
@@ -668,11 +660,11 @@ exqlite_step(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
668660
}
669661

670662
if (!enif_get_resource(env, argv[0], connection_type, (void**)&conn)) {
671-
return make_error_tuple(env, am_invalid_connection);
663+
return raise_badarg(env, argv[0]);
672664
}
673665

674666
if (!enif_get_resource(env, argv[1], statement_type, (void**)&statement)) {
675-
return make_error_tuple(env, am_invalid_statement);
667+
return raise_badarg(env, argv[1]);
676668
}
677669

678670
int rc = sqlite3_step(statement->statement);
@@ -707,11 +699,11 @@ exqlite_columns(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
707699
}
708700

709701
if (!enif_get_resource(env, argv[0], connection_type, (void**)&conn)) {
710-
return make_error_tuple(env, am_invalid_connection);
702+
return raise_badarg(env, argv[0]);
711703
}
712704

713705
if (!enif_get_resource(env, argv[1], statement_type, (void**)&statement)) {
714-
return make_error_tuple(env, am_invalid_statement);
706+
return raise_badarg(env, argv[1]);
715707
}
716708

717709
size = sqlite3_column_count(statement->statement);
@@ -754,7 +746,7 @@ exqlite_last_insert_rowid(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
754746
}
755747

756748
if (!enif_get_resource(env, argv[0], connection_type, (void**)&conn)) {
757-
return make_error_tuple(env, am_invalid_connection);
749+
return raise_badarg(env, argv[0]);
758750
}
759751

760752
sqlite3_int64 last_rowid = sqlite3_last_insert_rowid(conn->db);
@@ -773,7 +765,7 @@ exqlite_transaction_status(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
773765
}
774766

775767
if (!enif_get_resource(env, argv[0], connection_type, (void**)&conn)) {
776-
return make_error_tuple(env, am_invalid_connection);
768+
return raise_badarg(env, argv[0]);
777769
}
778770

779771
// If the connection times out, DbConnection disconnects the client
@@ -806,11 +798,11 @@ exqlite_serialize(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
806798
}
807799

808800
if (!enif_get_resource(env, argv[0], connection_type, (void**)&conn)) {
809-
return make_error_tuple(env, am_invalid_connection);
801+
return raise_badarg(env, argv[0]);
810802
}
811803

812804
if (!enif_inspect_iolist_as_binary(env, enif_make_list2(env, argv[1], eos), &database_name)) {
813-
return make_error_tuple(env, am_database_name_not_iolist);
805+
return raise_badarg(env, argv[1]);
814806
}
815807

816808
buffer = sqlite3_serialize(conn->db, (char*)database_name.data, &buffer_size, 0);
@@ -843,15 +835,15 @@ exqlite_deserialize(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
843835
}
844836

845837
if (!enif_get_resource(env, argv[0], connection_type, (void**)&conn)) {
846-
return make_error_tuple(env, am_invalid_connection);
838+
return raise_badarg(env, argv[0]);
847839
}
848840

849841
if (!enif_inspect_iolist_as_binary(env, enif_make_list2(env, argv[1], eos), &database_name)) {
850-
return make_error_tuple(env, am_database_name_not_iolist);
842+
return raise_badarg(env, argv[1]);
851843
}
852844

853845
if (!enif_inspect_binary(env, argv[2], &serialized)) {
854-
return enif_make_badarg(env);
846+
return raise_badarg(env, argv[2]);
855847
}
856848

857849
size = serialized.size;
@@ -882,11 +874,11 @@ exqlite_release(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
882874
}
883875

884876
if (!enif_get_resource(env, argv[0], connection_type, (void**)&conn)) {
885-
return make_error_tuple(env, am_invalid_connection);
877+
return raise_badarg(env, argv[0]);
886878
}
887879

888880
if (!enif_get_resource(env, argv[1], statement_type, (void**)&statement)) {
889-
return make_error_tuple(env, am_invalid_statement);
881+
return raise_badarg(env, argv[1]);
890882
}
891883

892884
if (statement->statement) {
@@ -953,36 +945,26 @@ on_load(ErlNifEnv* env, void** priv, ERL_NIF_TERM info)
953945
sqlite3_config(SQLITE_CONFIG_GETMALLOC, &default_alloc_methods);
954946
sqlite3_config(SQLITE_CONFIG_MALLOC, &methods);
955947

956-
am_ok = enif_make_atom(env, "ok");
957-
am_error = enif_make_atom(env, "error");
958-
am_badarg = enif_make_atom(env, "badarg");
959-
am_nil = enif_make_atom(env, "nil");
960-
am_out_of_memory = enif_make_atom(env, "out_of_memory");
961-
am_done = enif_make_atom(env, "done");
962-
am_row = enif_make_atom(env, "row");
963-
am_rows = enif_make_atom(env, "rows");
964-
am_invalid_filename = enif_make_atom(env, "invalid_filename");
965-
am_invalid_flags = enif_make_atom(env, "invalid_flags");
966-
am_database_open_failed = enif_make_atom(env, "database_open_failed");
967-
am_failed_to_create_mutex = enif_make_atom(env, "failed_to_create_mutex");
968-
am_invalid_connection = enif_make_atom(env, "invalid_connection");
969-
am_sql_not_iolist = enif_make_atom(env, "sql_not_iolist");
970-
am_connection_closed = enif_make_atom(env, "connection_closed");
971-
am_invalid_statement = enif_make_atom(env, "invalid_statement");
972-
am_invalid_chunk_size = enif_make_atom(env, "invalid_chunk_size");
973-
am_busy = enif_make_atom(env, "busy");
974-
am_invalid_column_count = enif_make_atom(env, "invalid_column_count");
975-
am_transaction = enif_make_atom(env, "transaction");
976-
am_idle = enif_make_atom(env, "idle");
977-
am_database_name_not_iolist = enif_make_atom(env, "database_name_not_iolist");
978-
am_serialization_failed = enif_make_atom(env, "serialization_failed");
979-
am_deserialization_failed = enif_make_atom(env, "deserialization_failed");
980-
am_invalid_enable_load_extension_value = enif_make_atom(env, "invalid_enable_load_extension_value");
981-
am_insert = enif_make_atom(env, "insert");
982-
am_delete = enif_make_atom(env, "delete");
983-
am_update = enif_make_atom(env, "update");
984-
am_invalid_pid = enif_make_atom(env, "invalid_pid");
985-
am_log = enif_make_atom(env, "log");
948+
am_ok = enif_make_atom(env, "ok");
949+
am_error = enif_make_atom(env, "error");
950+
am_badarg = enif_make_atom(env, "badarg");
951+
am_nil = enif_make_atom(env, "nil");
952+
am_out_of_memory = enif_make_atom(env, "out_of_memory");
953+
am_done = enif_make_atom(env, "done");
954+
am_row = enif_make_atom(env, "row");
955+
am_rows = enif_make_atom(env, "rows");
956+
am_failed_to_create_mutex = enif_make_atom(env, "failed_to_create_mutex");
957+
am_connection_closed = enif_make_atom(env, "connection_closed");
958+
am_busy = enif_make_atom(env, "busy");
959+
am_invalid_column_count = enif_make_atom(env, "invalid_column_count");
960+
am_transaction = enif_make_atom(env, "transaction");
961+
am_idle = enif_make_atom(env, "idle");
962+
am_serialization_failed = enif_make_atom(env, "serialization_failed");
963+
am_deserialization_failed = enif_make_atom(env, "deserialization_failed");
964+
am_insert = enif_make_atom(env, "insert");
965+
am_delete = enif_make_atom(env, "delete");
966+
am_update = enif_make_atom(env, "update");
967+
am_log = enif_make_atom(env, "log");
986968

987969
connection_type = enif_open_resource_type(
988970
env,
@@ -1040,11 +1022,11 @@ exqlite_enable_load_extension(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[
10401022
}
10411023

10421024
if (!enif_get_resource(env, argv[0], connection_type, (void**)&conn)) {
1043-
return make_error_tuple(env, am_invalid_connection);
1025+
return raise_badarg(env, argv[0]);
10441026
}
10451027

10461028
if (!enif_get_int(env, argv[1], &enable_load_extension_value)) {
1047-
return make_error_tuple(env, am_invalid_enable_load_extension_value);
1029+
return raise_badarg(env, argv[1]);
10481030
}
10491031

10501032
rc = sqlite3_enable_load_extension(conn->db, enable_load_extension_value);
@@ -1106,11 +1088,11 @@ exqlite_set_update_hook(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
11061088
}
11071089

11081090
if (!enif_get_resource(env, argv[0], connection_type, (void**)&conn)) {
1109-
return am_invalid_connection;
1091+
return raise_badarg(env, argv[0]);
11101092
}
11111093

11121094
if (!enif_get_local_pid(env, argv[1], &conn->update_hook_pid)) {
1113-
return am_invalid_pid;
1095+
return raise_badarg(env, argv[1]);
11141096
}
11151097

11161098
// Passing the connection as the third argument causes it to be
@@ -1159,7 +1141,7 @@ exqlite_set_log_hook(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
11591141
ErlNifPid* pid = (ErlNifPid*)enif_alloc(sizeof(ErlNifPid));
11601142
if (!enif_get_local_pid(env, argv[0], pid)) {
11611143
enif_free(pid);
1162-
return make_error_tuple(env, am_invalid_pid);
1144+
return raise_badarg(env, argv[0]);
11631145
}
11641146

11651147
enif_mutex_lock(log_hook_mutex);
@@ -1191,7 +1173,7 @@ exqlite_interrupt(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
11911173
}
11921174

11931175
if (!enif_get_resource(env, argv[0], connection_type, (void**)&conn)) {
1194-
return make_error_tuple(env, am_invalid_connection);
1176+
return raise_badarg(env, argv[0]);
11951177
}
11961178

11971179
// DB is already closed, nothing to do here

0 commit comments

Comments
 (0)