@@ -638,6 +638,135 @@ exqlite_bind(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
638
638
return make_atom (env , "ok" );
639
639
}
640
640
641
+ static ERL_NIF_TERM
642
+ exqlite_bind_text (ErlNifEnv * env , int argc , const ERL_NIF_TERM argv [])
643
+ {
644
+ assert (argc == 3 );
645
+
646
+ statement_t * statement ;
647
+ if (!enif_get_resource (env , argv [0 ], statement_type , (void * * )& statement )) {
648
+ ERL_NIF_TERM badarg = enif_make_tuple2 (env , make_atom (env , "badarg" ), argv [0 ]);
649
+ return enif_raise_exception (env , badarg );
650
+ }
651
+
652
+ unsigned int idx ;
653
+ if (!enif_get_uint (env , argv [1 ], & idx )) {
654
+ ERL_NIF_TERM badarg = enif_make_tuple2 (env , make_atom (env , "badarg" ), argv [1 ]);
655
+ return enif_raise_exception (env , badarg );
656
+ }
657
+
658
+ ErlNifBinary text ;
659
+ if (!enif_inspect_binary (env , argv [2 ], & text )) {
660
+ ERL_NIF_TERM badarg = enif_make_tuple2 (env , make_atom (env , "badarg" ), argv [2 ]);
661
+ return enif_raise_exception (env , badarg );
662
+ }
663
+
664
+ int rc = sqlite3_bind_text (statement -> statement , idx , (char * )text .data , text .size , SQLITE_TRANSIENT );
665
+ return enif_make_int (env , rc );
666
+ }
667
+
668
+ static ERL_NIF_TERM
669
+ exqlite_bind_blob (ErlNifEnv * env , int argc , const ERL_NIF_TERM argv [])
670
+ {
671
+ assert (argc == 3 );
672
+
673
+ statement_t * statement ;
674
+ if (!enif_get_resource (env , argv [0 ], statement_type , (void * * )& statement )) {
675
+ ERL_NIF_TERM badarg = enif_make_tuple2 (env , make_atom (env , "badarg" ), argv [0 ]);
676
+ return enif_raise_exception (env , badarg );
677
+ }
678
+
679
+ unsigned int idx ;
680
+ if (!enif_get_uint (env , argv [1 ], & idx )) {
681
+ ERL_NIF_TERM badarg = enif_make_tuple2 (env , make_atom (env , "badarg" ), argv [1 ]);
682
+ return enif_raise_exception (env , badarg );
683
+ }
684
+
685
+ ErlNifBinary blob ;
686
+ if (!enif_inspect_binary (env , argv [2 ], & blob )) {
687
+ ERL_NIF_TERM badarg = enif_make_tuple2 (env , make_atom (env , "badarg" ), argv [2 ]);
688
+ return enif_raise_exception (env , badarg );
689
+ }
690
+
691
+ int rc = sqlite3_bind_blob (statement -> statement , idx , (char * )blob .data , blob .size , SQLITE_TRANSIENT );
692
+ return enif_make_int (env , rc );
693
+ }
694
+
695
+ static ERL_NIF_TERM
696
+ exqlite_bind_integer (ErlNifEnv * env , int argc , const ERL_NIF_TERM argv [])
697
+ {
698
+ assert (argc == 3 );
699
+
700
+ statement_t * statement ;
701
+ if (!enif_get_resource (env , argv [0 ], statement_type , (void * * )& statement )) {
702
+ ERL_NIF_TERM badarg = enif_make_tuple2 (env , make_atom (env , "badarg" ), argv [0 ]);
703
+ return enif_raise_exception (env , badarg );
704
+ }
705
+
706
+ unsigned int idx ;
707
+ if (!enif_get_uint (env , argv [1 ], & idx )) {
708
+ ERL_NIF_TERM badarg = enif_make_tuple2 (env , make_atom (env , "badarg" ), argv [1 ]);
709
+ return enif_raise_exception (env , badarg );
710
+ }
711
+
712
+ ErlNifSInt64 i ;
713
+ if (!enif_get_int64 (env , argv [2 ], & i )) {
714
+ ERL_NIF_TERM badarg = enif_make_tuple2 (env , make_atom (env , "badarg" ), argv [2 ]);
715
+ return enif_raise_exception (env , badarg );
716
+ }
717
+
718
+ int rc = sqlite3_bind_int64 (statement -> statement , idx , i );
719
+ return enif_make_int (env , rc );
720
+ }
721
+
722
+ static ERL_NIF_TERM
723
+ exqlite_bind_float (ErlNifEnv * env , int argc , const ERL_NIF_TERM argv [])
724
+ {
725
+ assert (argc == 3 );
726
+
727
+ statement_t * statement ;
728
+ if (!enif_get_resource (env , argv [0 ], statement_type , (void * * )& statement )) {
729
+ ERL_NIF_TERM badarg = enif_make_tuple2 (env , make_atom (env , "badarg" ), argv [0 ]);
730
+ return enif_raise_exception (env , badarg );
731
+ }
732
+
733
+ unsigned int idx ;
734
+ if (!enif_get_uint (env , argv [1 ], & idx )) {
735
+ ERL_NIF_TERM badarg = enif_make_tuple2 (env , make_atom (env , "badarg" ), argv [1 ]);
736
+ return enif_raise_exception (env , badarg );
737
+ }
738
+
739
+ double f ;
740
+ if (!enif_get_double (env , argv [2 ], & f )) {
741
+ ERL_NIF_TERM badarg = enif_make_tuple2 (env , make_atom (env , "badarg" ), argv [2 ]);
742
+ return enif_raise_exception (env , badarg );
743
+ }
744
+
745
+ int rc = sqlite3_bind_double (statement -> statement , idx , f );
746
+ return enif_make_int (env , rc );
747
+ }
748
+
749
+ static ERL_NIF_TERM
750
+ exqlite_bind_null (ErlNifEnv * env , int argc , const ERL_NIF_TERM argv [])
751
+ {
752
+ assert (argc == 2 );
753
+
754
+ statement_t * statement ;
755
+ if (!enif_get_resource (env , argv [0 ], statement_type , (void * * )& statement )) {
756
+ ERL_NIF_TERM badarg = enif_make_tuple2 (env , make_atom (env , "badarg" ), argv [0 ]);
757
+ return enif_raise_exception (env , badarg );
758
+ }
759
+
760
+ unsigned int idx ;
761
+ if (!enif_get_uint (env , argv [1 ], & idx )) {
762
+ ERL_NIF_TERM badarg = enif_make_tuple2 (env , make_atom (env , "badarg" ), argv [1 ]);
763
+ return enif_raise_exception (env , badarg );
764
+ }
765
+
766
+ int rc = sqlite3_bind_null (statement -> statement , idx );
767
+ return enif_make_int (env , rc );
768
+ }
769
+
641
770
static ERL_NIF_TERM
642
771
make_cell (ErlNifEnv * env , sqlite3_stmt * statement , unsigned int i )
643
772
{
@@ -1272,6 +1401,45 @@ exqlite_interrupt(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
1272
1401
return make_atom (env , "ok" );
1273
1402
}
1274
1403
1404
+ static ERL_NIF_TERM
1405
+ exqlite_errmsg (ErlNifEnv * env , int argc , const ERL_NIF_TERM argv [])
1406
+ {
1407
+ assert (argc == 1 );
1408
+
1409
+ connection_t * conn ;
1410
+ statement_t * statement ;
1411
+ const char * msg ;
1412
+
1413
+ if (enif_get_resource (env , argv [0 ], connection_type , (void * * )& conn )) {
1414
+ msg = sqlite3_errmsg (conn -> db );
1415
+ } else if (enif_get_resource (env , argv [0 ], statement_type , (void * * )& statement )) {
1416
+ msg = sqlite3_errmsg (sqlite3_db_handle (statement -> statement ));
1417
+ } else {
1418
+ ERL_NIF_TERM badarg = enif_make_tuple2 (env , make_atom (env , "badarg" ), argv [0 ]);
1419
+ return enif_raise_exception (env , badarg );
1420
+ }
1421
+
1422
+ if (!msg )
1423
+ return make_atom (env , "nil" );
1424
+
1425
+ return make_binary (env , msg , strlen (msg ));
1426
+ }
1427
+
1428
+ static ERL_NIF_TERM
1429
+ exqlite_errstr (ErlNifEnv * env , int argc , const ERL_NIF_TERM argv [])
1430
+ {
1431
+ assert (argc == 1 );
1432
+
1433
+ int rc ;
1434
+ if (!enif_get_int (env , argv [0 ], & rc )) {
1435
+ ERL_NIF_TERM badarg = enif_make_tuple2 (env , make_atom (env , "badarg" ), argv [0 ]);
1436
+ return enif_raise_exception (env , badarg );
1437
+ }
1438
+
1439
+ const char * msg = sqlite3_errstr (rc );
1440
+ return make_binary (env , msg , strlen (msg ));
1441
+ }
1442
+
1275
1443
//
1276
1444
// Most of our nif functions are going to be IO bounded
1277
1445
//
@@ -1283,6 +1451,11 @@ static ErlNifFunc nif_funcs[] = {
1283
1451
{"changes" , 1 , exqlite_changes , ERL_NIF_DIRTY_JOB_IO_BOUND },
1284
1452
{"prepare" , 2 , exqlite_prepare , ERL_NIF_DIRTY_JOB_IO_BOUND },
1285
1453
{"bind" , 3 , exqlite_bind , ERL_NIF_DIRTY_JOB_IO_BOUND },
1454
+ {"bind_text" , 3 , exqlite_bind_text },
1455
+ {"bind_blob" , 3 , exqlite_bind_blob },
1456
+ {"bind_integer" , 3 , exqlite_bind_integer },
1457
+ {"bind_float" , 3 , exqlite_bind_float },
1458
+ {"bind_null" , 2 , exqlite_bind_null },
1286
1459
{"step" , 2 , exqlite_step , ERL_NIF_DIRTY_JOB_IO_BOUND },
1287
1460
{"multi_step" , 3 , exqlite_multi_step , ERL_NIF_DIRTY_JOB_IO_BOUND },
1288
1461
{"columns" , 2 , exqlite_columns , ERL_NIF_DIRTY_JOB_IO_BOUND },
@@ -1295,6 +1468,8 @@ static ErlNifFunc nif_funcs[] = {
1295
1468
{"set_update_hook" , 2 , exqlite_set_update_hook , ERL_NIF_DIRTY_JOB_IO_BOUND },
1296
1469
{"set_log_hook" , 1 , exqlite_set_log_hook , ERL_NIF_DIRTY_JOB_IO_BOUND },
1297
1470
{"interrupt" , 1 , exqlite_interrupt , ERL_NIF_DIRTY_JOB_IO_BOUND },
1471
+ {"errmsg" , 1 , exqlite_errmsg },
1472
+ {"errstr" , 1 , exqlite_errstr },
1298
1473
};
1299
1474
1300
1475
ERL_NIF_INIT (Elixir .Exqlite .Sqlite3NIF , nif_funcs , on_load , NULL , NULL , on_unload )
0 commit comments