@@ -18,27 +18,17 @@ static ERL_NIF_TERM am_out_of_memory;
18
18
static ERL_NIF_TERM am_done ;
19
19
static ERL_NIF_TERM am_row ;
20
20
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 ;
24
21
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 ;
27
22
static ERL_NIF_TERM am_connection_closed ;
28
- static ERL_NIF_TERM am_invalid_statement ;
29
- static ERL_NIF_TERM am_invalid_chunk_size ;
30
23
static ERL_NIF_TERM am_busy ;
31
24
static ERL_NIF_TERM am_invalid_column_count ;
32
25
static ERL_NIF_TERM am_transaction ;
33
26
static ERL_NIF_TERM am_idle ;
34
- static ERL_NIF_TERM am_database_name_not_iolist ;
35
27
static ERL_NIF_TERM am_serialization_failed ;
36
28
static ERL_NIF_TERM am_deserialization_failed ;
37
- static ERL_NIF_TERM am_invalid_enable_load_extension_value ;
38
29
static ERL_NIF_TERM am_insert ;
39
30
static ERL_NIF_TERM am_delete ;
40
31
static ERL_NIF_TERM am_update ;
41
- static ERL_NIF_TERM am_invalid_pid ;
42
32
static ERL_NIF_TERM am_log ;
43
33
44
34
static ErlNifResourceType * connection_type = NULL ;
@@ -195,6 +185,13 @@ make_sqlite3_error_tuple(ErlNifEnv* env, int rc, sqlite3* db)
195
185
return make_error_tuple (make_binary (env , msg , len ));
196
186
}
197
187
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
+
198
195
static ERL_NIF_TERM
199
196
exqlite_open (ErlNifEnv * env , int argc , const ERL_NIF_TERM argv [])
200
197
{
@@ -216,16 +213,17 @@ exqlite_open(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
216
213
}
217
214
218
215
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 ] );
220
217
}
221
218
222
219
if (!enif_get_int (env , argv [1 ], & flags )) {
223
- return make_error_tuple (env , am_invalid_flags );
220
+ return raise_badarg (env , argv [ 1 ] );
224
221
}
225
222
226
223
rc = sqlite3_open_v2 ((char * )bin .data , & db , flags , NULL );
227
224
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 )));
229
227
}
230
228
231
229
mutex = enif_mutex_create ("exqlite:connection" );
@@ -264,7 +262,7 @@ exqlite_close(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
264
262
}
265
263
266
264
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 ] );
268
266
}
269
267
270
268
// DB is already closed, nothing to do here
@@ -320,11 +318,11 @@ exqlite_execute(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
320
318
}
321
319
322
320
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 ] );
324
322
}
325
323
326
324
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 ] );
328
326
}
329
327
330
328
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[])
350
348
}
351
349
352
350
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 ] );
354
352
}
355
353
356
354
if (conn -> db == NULL ) {
@@ -381,11 +379,11 @@ exqlite_prepare(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
381
379
}
382
380
383
381
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 ] );
385
383
}
386
384
387
385
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 ] );
389
387
}
390
388
391
389
statement = enif_alloc_resource (statement_type , sizeof (statement_t ));
@@ -418,13 +416,6 @@ exqlite_prepare(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
418
416
return make_ok_tuple (env , result );
419
417
}
420
418
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
-
428
419
static ERL_NIF_TERM
429
420
exqlite_reset (ErlNifEnv * env , int argc , const ERL_NIF_TERM argv [])
430
421
{
@@ -581,6 +572,7 @@ make_row(ErlNifEnv* env, sqlite3_stmt* statement)
581
572
582
573
columns = enif_alloc (sizeof (ERL_NIF_TERM ) * count );
583
574
if (!columns ) {
575
+ // TODO: should be exception, otherwise it's practically invisible
584
576
return make_error_tuple (env , am_out_of_memory );
585
577
}
586
578
@@ -609,23 +601,23 @@ exqlite_multi_step(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
609
601
}
610
602
611
603
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 ] );
613
605
}
614
606
615
607
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 ] );
617
609
}
618
610
619
611
if (!statement || !statement -> statement ) {
620
- return make_error_tuple (env , am_invalid_statement );
612
+ return raise_badarg (env , argv [ 1 ] );
621
613
}
622
614
623
615
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 ] );
625
617
}
626
618
627
619
if (chunk_size < 1 ) {
628
- return make_error_tuple (env , am_invalid_chunk_size );
620
+ return raise_badarg (env , argv [ 2 ] );
629
621
}
630
622
631
623
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[])
668
660
}
669
661
670
662
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 ] );
672
664
}
673
665
674
666
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 ] );
676
668
}
677
669
678
670
int rc = sqlite3_step (statement -> statement );
@@ -707,11 +699,11 @@ exqlite_columns(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
707
699
}
708
700
709
701
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 ] );
711
703
}
712
704
713
705
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 ] );
715
707
}
716
708
717
709
size = sqlite3_column_count (statement -> statement );
@@ -754,7 +746,7 @@ exqlite_last_insert_rowid(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
754
746
}
755
747
756
748
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 ] );
758
750
}
759
751
760
752
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[])
773
765
}
774
766
775
767
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 ] );
777
769
}
778
770
779
771
// If the connection times out, DbConnection disconnects the client
@@ -806,11 +798,11 @@ exqlite_serialize(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
806
798
}
807
799
808
800
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 ] );
810
802
}
811
803
812
804
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 ] );
814
806
}
815
807
816
808
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[])
843
835
}
844
836
845
837
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 ] );
847
839
}
848
840
849
841
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 ] );
851
843
}
852
844
853
845
if (!enif_inspect_binary (env , argv [2 ], & serialized )) {
854
- return enif_make_badarg (env );
846
+ return raise_badarg (env , argv [ 2 ] );
855
847
}
856
848
857
849
size = serialized .size ;
@@ -882,11 +874,11 @@ exqlite_release(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
882
874
}
883
875
884
876
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 ] );
886
878
}
887
879
888
880
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 ] );
890
882
}
891
883
892
884
if (statement -> statement ) {
@@ -953,36 +945,26 @@ on_load(ErlNifEnv* env, void** priv, ERL_NIF_TERM info)
953
945
sqlite3_config (SQLITE_CONFIG_GETMALLOC , & default_alloc_methods );
954
946
sqlite3_config (SQLITE_CONFIG_MALLOC , & methods );
955
947
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" );
986
968
987
969
connection_type = enif_open_resource_type (
988
970
env ,
@@ -1040,11 +1022,11 @@ exqlite_enable_load_extension(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[
1040
1022
}
1041
1023
1042
1024
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 ] );
1044
1026
}
1045
1027
1046
1028
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 ] );
1048
1030
}
1049
1031
1050
1032
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[])
1106
1088
}
1107
1089
1108
1090
if (!enif_get_resource (env , argv [0 ], connection_type , (void * * )& conn )) {
1109
- return am_invalid_connection ;
1091
+ return raise_badarg ( env , argv [ 0 ]) ;
1110
1092
}
1111
1093
1112
1094
if (!enif_get_local_pid (env , argv [1 ], & conn -> update_hook_pid )) {
1113
- return am_invalid_pid ;
1095
+ return raise_badarg ( env , argv [ 1 ]) ;
1114
1096
}
1115
1097
1116
1098
// 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[])
1159
1141
ErlNifPid * pid = (ErlNifPid * )enif_alloc (sizeof (ErlNifPid ));
1160
1142
if (!enif_get_local_pid (env , argv [0 ], pid )) {
1161
1143
enif_free (pid );
1162
- return make_error_tuple (env , am_invalid_pid );
1144
+ return raise_badarg (env , argv [ 0 ] );
1163
1145
}
1164
1146
1165
1147
enif_mutex_lock (log_hook_mutex );
@@ -1191,7 +1173,7 @@ exqlite_interrupt(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
1191
1173
}
1192
1174
1193
1175
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 ] );
1195
1177
}
1196
1178
1197
1179
// DB is already closed, nothing to do here
0 commit comments