@@ -583,6 +583,23 @@ static inline void free_binary_params(int *formats, int *lengths)
583583 if (lengths != NULL ) caml_stat_free (lengths );
584584}
585585
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+
586603static inline const char * const * copy_params (value v_params , size_t nparams )
587604{
588605 char * * params ;
@@ -631,8 +648,8 @@ static inline void free_params_shallow(
631648}
632649
633650CAMLprim 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 )
636653{
637654 CAMLparam1 (v_conn );
638655 PGconn * conn = get_conn (v_conn );
@@ -642,6 +659,8 @@ CAMLprim value PQexecParams_stub(
642659 char * query = caml_stat_alloc (len );
643660 size_t nparams = Wosize_val (v_params );
644661 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 );
645664 int * formats , * lengths ;
646665 copy_binary_params (v_params , v_binary_params , nparams , & formats , & lengths );
647666 memcpy (query , String_val (v_query ), len );
@@ -651,17 +670,26 @@ CAMLprim value PQexecParams_stub(
651670 (nparams == 0 && !binary_result )
652671 ? PQexec (conn , query )
653672 : PQexecParams (
654- conn , query , nparams , NULL ,
673+ conn , query , nparams , param_types ,
655674 params , lengths , formats , binary_result );
675+ if (param_types != NULL ) caml_stat_free (param_types );
656676 free_binary_params (formats , lengths );
657677 free_params (params , nparams );
658678 caml_stat_free (query );
659679 caml_leave_blocking_section ();
660680 CAMLreturn (alloc_result (res , np_cb ));
661681}
662682
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+
663690#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 )
665693{
666694 CAMLparam1 (v_conn );
667695 PGconn * conn = get_conn (v_conn );
@@ -671,10 +699,13 @@ CAMLprim value PQprepare_stub(value v_conn, value v_stm_name, value v_query)
671699 size_t query_len = caml_string_length (v_query ) + 1 ;
672700 char * stm_name = caml_stat_alloc (stm_name_len );
673701 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 );
674704 memcpy (stm_name , String_val (v_stm_name ), stm_name_len );
675705 memcpy (query , String_val (v_query ), query_len );
676706 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 );
678709 caml_stat_free (stm_name );
679710 caml_stat_free (query );
680711 caml_leave_blocking_section ();
@@ -963,45 +994,56 @@ CAMLprim value PQsetnonblocking_stub_bc(value v_conn, value v_arg)
963994noalloc_conn_info (PQisnonblocking , Val_bool )
964995
965996CAMLprim 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 )
967999{
9681000 PGconn * conn = get_conn (v_conn );
9691001 const char * query = String_val (v_query );
9701002 size_t nparams = Wosize_val (v_params );
9711003 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 );
9721006 int * lengths , * formats ;
9731007 intnat res ;
9741008 copy_binary_params (v_params , v_binary_params , nparams , & formats , & lengths );
9751009 res =
9761010 (nparams == 0 )
9771011 ? PQsendQuery (conn , query )
9781012 : 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 );
9801015 free_binary_params (formats , lengths );
9811016 free_params_shallow (params , nparams );
9821017 return res ;
9831018}
9841019
9851020CAMLprim 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 )
9871023{
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 ));
9901026}
9911027
9921028CAMLprim 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 )
9941030{
9951031 PGconn * conn = get_conn (v_conn );
9961032 const char * stm_name = String_val (v_stm_name );
9971033 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 ;
9991040}
10001041
10011042CAMLprim 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 )
10031044{
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 ));
10051047}
10061048
10071049CAMLprim intnat PQsendQueryPrepared_stub (
0 commit comments