@@ -583,6 +583,23 @@ static inline void free_binary_params(int *formats, int *lengths)
583
583
if (lengths != NULL ) caml_stat_free (lengths );
584
584
}
585
585
586
+ static inline Oid * copy_param_types (
587
+ value v_param_types , size_t nparams , size_t nparam_types )
588
+ {
589
+ Oid * param_types ;
590
+ size_t i ;
591
+ if (nparam_types == 0 ) return NULL ;
592
+ if (nparam_types > nparams ) nparam_types = nparams ;
593
+ param_types = caml_stat_alloc (nparams * sizeof (Oid ));
594
+ for (i = 0 ; i < nparam_types ; i ++ ) {
595
+ value v_param_type = Field (v_param_types , i );
596
+ param_types [i ] = Int_val (v_param_type );
597
+ }
598
+ memset (param_types + nparam_types , 0 ,
599
+ (nparams - nparam_types ) * sizeof (Oid ));
600
+ return param_types ;
601
+ }
602
+
586
603
static inline const char * const * copy_params (value v_params , size_t nparams )
587
604
{
588
605
char * * params ;
@@ -631,8 +648,8 @@ static inline void free_params_shallow(
631
648
}
632
649
633
650
CAMLprim value PQexecParams_stub (
634
- value v_conn , value v_query , value v_params , value v_binary_params ,
635
- value v_binary_result )
651
+ value v_conn , value v_query , value v_param_types , value v_params ,
652
+ value v_binary_params , value v_binary_result )
636
653
{
637
654
CAMLparam1 (v_conn );
638
655
PGconn * conn = get_conn (v_conn );
@@ -642,6 +659,8 @@ CAMLprim value PQexecParams_stub(
642
659
char * query = caml_stat_alloc (len );
643
660
size_t nparams = Wosize_val (v_params );
644
661
const char * const * params = copy_params (v_params , nparams );
662
+ size_t nparam_types = Wosize_val (v_param_types );
663
+ Oid * param_types = copy_param_types (v_param_types , nparams , nparam_types );
645
664
int * formats , * lengths ;
646
665
copy_binary_params (v_params , v_binary_params , nparams , & formats , & lengths );
647
666
memcpy (query , String_val (v_query ), len );
@@ -651,17 +670,26 @@ CAMLprim value PQexecParams_stub(
651
670
(nparams == 0 && !binary_result )
652
671
? PQexec (conn , query )
653
672
: PQexecParams (
654
- conn , query , nparams , NULL ,
673
+ conn , query , nparams , param_types ,
655
674
params , lengths , formats , binary_result );
675
+ if (param_types != NULL ) caml_stat_free (param_types );
656
676
free_binary_params (formats , lengths );
657
677
free_params (params , nparams );
658
678
caml_stat_free (query );
659
679
caml_leave_blocking_section ();
660
680
CAMLreturn (alloc_result (res , np_cb ));
661
681
}
662
682
683
+ CAMLprim value PQexecParams_stub_bc (value * argv , int argn )
684
+ {
685
+ (void )argn ; /* unused */
686
+ return
687
+ PQexecParams_stub (argv [0 ], argv [1 ], argv [2 ], argv [3 ], argv [4 ], argv [5 ]);
688
+ }
689
+
663
690
#ifdef PG_OCAML_8_2
664
- CAMLprim value PQprepare_stub (value v_conn , value v_stm_name , value v_query )
691
+ CAMLprim value PQprepare_stub (
692
+ value v_conn , value v_stm_name , value v_query , value v_param_types )
665
693
{
666
694
CAMLparam1 (v_conn );
667
695
PGconn * conn = get_conn (v_conn );
@@ -671,10 +699,13 @@ CAMLprim value PQprepare_stub(value v_conn, value v_stm_name, value v_query)
671
699
size_t query_len = caml_string_length (v_query ) + 1 ;
672
700
char * stm_name = caml_stat_alloc (stm_name_len );
673
701
char * query = caml_stat_alloc (query_len );
702
+ size_t nparams = Wosize_val (v_param_types );
703
+ Oid * param_types = copy_param_types (v_param_types , nparams , nparams );
674
704
memcpy (stm_name , String_val (v_stm_name ), stm_name_len );
675
705
memcpy (query , String_val (v_query ), query_len );
676
706
caml_enter_blocking_section ();
677
- res = PQprepare (conn , stm_name , query , 0 , NULL );
707
+ res = PQprepare (conn , stm_name , query , nparams , param_types );
708
+ if (param_types != NULL ) caml_stat_free (param_types );
678
709
caml_stat_free (stm_name );
679
710
caml_stat_free (query );
680
711
caml_leave_blocking_section ();
@@ -963,45 +994,56 @@ CAMLprim value PQsetnonblocking_stub_bc(value v_conn, value v_arg)
963
994
noalloc_conn_info (PQisnonblocking , Val_bool )
964
995
965
996
CAMLprim intnat PQsendQueryParams_stub (
966
- value v_conn , value v_query , value v_params , value v_binary_params )
997
+ value v_conn , value v_query , value v_param_types , value v_params ,
998
+ value v_binary_params )
967
999
{
968
1000
PGconn * conn = get_conn (v_conn );
969
1001
const char * query = String_val (v_query );
970
1002
size_t nparams = Wosize_val (v_params );
971
1003
const char * const * params = copy_params_shallow (v_params , nparams );
1004
+ size_t nparam_types = Wosize_val (v_param_types );
1005
+ Oid * param_types = copy_param_types (v_param_types , nparams , nparam_types );
972
1006
int * lengths , * formats ;
973
1007
intnat res ;
974
1008
copy_binary_params (v_params , v_binary_params , nparams , & formats , & lengths );
975
1009
res =
976
1010
(nparams == 0 )
977
1011
? PQsendQuery (conn , query )
978
1012
: PQsendQueryParams (
979
- conn , query , nparams , NULL , params , lengths , formats , 0 );
1013
+ conn , query , nparams , param_types , params , lengths , formats , 0 );
1014
+ if (param_types != NULL ) caml_stat_free (param_types );
980
1015
free_binary_params (formats , lengths );
981
1016
free_params_shallow (params , nparams );
982
1017
return res ;
983
1018
}
984
1019
985
1020
CAMLprim value PQsendQueryParams_stub_bc (
986
- value v_conn , value v_query , value v_params , value v_binary_params )
1021
+ value v_conn , value v_query , value v_param_types , value v_params ,
1022
+ value v_binary_params )
987
1023
{
988
- return
989
- Val_int ( PQsendQueryParams_stub ( v_conn , v_query , v_params , v_binary_params ));
1024
+ return Val_int ( PQsendQueryParams_stub (
1025
+ v_conn , v_query , v_param_types , v_params , v_binary_params ));
990
1026
}
991
1027
992
1028
CAMLprim intnat PQsendPrepare_stub (
993
- value v_conn , value v_stm_name , value v_query )
1029
+ value v_conn , value v_stm_name , value v_query , value v_param_types )
994
1030
{
995
1031
PGconn * conn = get_conn (v_conn );
996
1032
const char * stm_name = String_val (v_stm_name );
997
1033
const char * query = String_val (v_query );
998
- return PQsendPrepare (conn , stm_name , query , 0 , NULL );
1034
+ size_t nparams = Wosize_val (v_param_types );
1035
+ Oid * param_types = copy_param_types (v_param_types , nparams , nparams );
1036
+ intnat res ;
1037
+ res = PQsendPrepare (conn , stm_name , query , nparams , param_types );
1038
+ if (param_types != NULL ) caml_stat_free (param_types );
1039
+ return res ;
999
1040
}
1000
1041
1001
1042
CAMLprim value PQsendPrepare_stub_bc (
1002
- value v_conn , value v_stm_name , value v_query )
1043
+ value v_conn , value v_stm_name , value v_query , value v_param_types )
1003
1044
{
1004
- return Val_int (PQsendPrepare_stub (v_conn , v_stm_name , v_query ));
1045
+ return
1046
+ Val_int (PQsendPrepare_stub (v_conn , v_stm_name , v_query , v_param_types ));
1005
1047
}
1006
1048
1007
1049
CAMLprim intnat PQsendQueryPrepared_stub (
0 commit comments