From 1e64e8b322acca7cec14ac1989ef84c6cbf37be4 Mon Sep 17 00:00:00 2001 From: Christophe Raffalli Date: Wed, 18 Jun 2025 16:57:03 -1000 Subject: [PATCH 1/2] add binary_result to send_query and send_query_prepared --- lib/postgresql.ml | 12 ++++++++---- lib/postgresql.mli | 7 ++++++- lib/postgresql_stubs.c | 25 +++++++++++++++++-------- 3 files changed, 31 insertions(+), 13 deletions(-) diff --git a/lib/postgresql.ml b/lib/postgresql.ml index b6f99aa..fe0dda6 100644 --- a/lib/postgresql.ml +++ b/lib/postgresql.ml @@ -482,6 +482,7 @@ module Stub = struct oid array -> string array -> bool array -> + bool -> (int[@untagged]) = "PQsendQueryParams_stub_bc" "PQsendQueryParams_stub" external send_prepare : @@ -490,7 +491,8 @@ module Stub = struct [@@noalloc] external send_query_prepared : - connection -> string -> string array -> bool array -> (int[@untagged]) + connection -> string -> string array -> bool array -> bool -> + (int[@untagged]) = "PQsendQueryPrepared_stub_bc" "PQsendQueryPrepared_stub" external send_describe_prepared : connection -> string -> (int[@untagged]) @@ -1006,11 +1008,11 @@ class connection ?host ?hostaddr ?port ?dbname ?user ?password ?options ?tty if Stub.result_isnull r then signal_error conn else r)) method send_query ?(param_types = [||]) ?(params = [||]) - ?(binary_params = [||]) query = + ?(binary_params = [||]) ?(binary_result=false) query = wrap_conn (fun conn -> if Stub.send_query_params conn query param_types params - binary_params + binary_params binary_result <> 1 then signal_error conn) @@ -1020,9 +1022,11 @@ class connection ?host ?hostaddr ?port ?dbname ?user ?password ?options ?tty signal_error conn) method send_query_prepared ?(params = [||]) ?(binary_params = [||]) + ?(binary_result=false) stm_name = wrap_conn (fun conn -> - if Stub.send_query_prepared conn stm_name params binary_params <> 1 + if Stub.send_query_prepared conn stm_name params + binary_params binary_result <> 1 then signal_error conn) method send_describe_prepared stm_name = diff --git a/lib/postgresql.mli b/lib/postgresql.mli index f6590f8..b33a7dd 100644 --- a/lib/postgresql.mli +++ b/lib/postgresql.mli @@ -722,6 +722,7 @@ object ?param_types:oid array -> ?params:string array -> ?binary_params:bool array -> + ?binary_result:bool -> string -> unit (** [send_query ?param_types ?params ?binary_params query] asynchronous @@ -751,7 +752,11 @@ object @raise Error if there is a connection error. *) method send_query_prepared : - ?params:string array -> ?binary_params:bool array -> string -> unit + ?params:string array -> + ?binary_params:bool array -> + ?binary_result:bool -> + string -> + unit (** [#send_query_prepared ?params ?binary_params stm_name] is an asynchronous version of {!connection.exec_prepared}. The semantics is otherwise the same, and the result is reported by {!connection.get_result} when diff --git a/lib/postgresql_stubs.c b/lib/postgresql_stubs.c index 9d06c1a..b3bbb4b 100644 --- a/lib/postgresql_stubs.c +++ b/lib/postgresql_stubs.c @@ -949,7 +949,8 @@ NOALLOC_CONN_INFO(PQisnonblocking, Val_bool) CAMLprim intnat PQsendQueryParams_stub(value v_conn, value v_query, value v_param_types, value v_params, - value v_binary_params) { + value v_binary_params, + value v_binary_result) { PGconn *conn = get_conn(v_conn); const char *query = String_val(v_query); size_t nparams = Wosize_val(v_params); @@ -959,9 +960,11 @@ CAMLprim intnat PQsendQueryParams_stub(value v_conn, value v_query, int *lengths, *formats; intnat res; copy_binary_params(v_params, v_binary_params, nparams, &formats, &lengths); + bool binary_result = Bool_val(v_binary_result); res = (nparams == 0) ? PQsendQuery(conn, query) : PQsendQueryParams(conn, query, nparams, param_types, - params, lengths, formats, 0); + params, lengths, formats, + binary_result); if (param_types != NULL) caml_stat_free(param_types); free_binary_params(formats, lengths); @@ -971,9 +974,10 @@ CAMLprim intnat PQsendQueryParams_stub(value v_conn, value v_query, CAMLprim value PQsendQueryParams_stub_bc(value v_conn, value v_query, value v_param_types, value v_params, - value v_binary_params) { + value v_binary_params, + value v_binary_result) { return Val_int(PQsendQueryParams_stub(v_conn, v_query, v_param_types, - v_params, v_binary_params)); + v_params, v_binary_params, v_binary_result)); } CAMLprim intnat PQsendPrepare_stub(value v_conn, value v_stm_name, @@ -997,7 +1001,8 @@ CAMLprim value PQsendPrepare_stub_bc(value v_conn, value v_stm_name, CAMLprim intnat PQsendQueryPrepared_stub(value v_conn, value v_stm_name, value v_params, - value v_binary_params) { + value v_binary_params, + value v_binary_result) { PGconn *conn = get_conn(v_conn); const char *stm_name = String_val(v_stm_name); size_t nparams = Wosize_val(v_params); @@ -1005,8 +1010,10 @@ CAMLprim intnat PQsendQueryPrepared_stub(value v_conn, value v_stm_name, int *lengths, *formats; intnat res; copy_binary_params(v_params, v_binary_params, nparams, &formats, &lengths); + bool binary_result = Bool_val(v_binary_result); res = - PQsendQueryPrepared(conn, stm_name, nparams, params, lengths, formats, 0); + PQsendQueryPrepared(conn, stm_name, nparams, params, lengths, + formats, binary_result); free_binary_params(formats, lengths); free_params_shallow(params, nparams); return res; @@ -1014,9 +1021,11 @@ CAMLprim intnat PQsendQueryPrepared_stub(value v_conn, value v_stm_name, CAMLprim value PQsendQueryPrepared_stub_bc(value v_conn, value v_stm_name, value v_params, - value v_binary_params) { + value v_binary_params, + value v_binary_result) { return Val_int( - PQsendQueryPrepared_stub(v_conn, v_stm_name, v_params, v_binary_params)); + PQsendQueryPrepared_stub(v_conn, v_stm_name, v_params, + v_binary_params, v_binary_result)); } #ifdef PG_OCAML_8_2 From 06f1a2cb931edeb16837dde219cd226b9e19e29c Mon Sep 17 00:00:00 2001 From: Christophe Raffalli Date: Thu, 19 Jun 2025 07:59:47 -1000 Subject: [PATCH 2/2] make lint happy --- lib/postgresql.ml | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/lib/postgresql.ml b/lib/postgresql.ml index fe0dda6..8a21818 100644 --- a/lib/postgresql.ml +++ b/lib/postgresql.ml @@ -491,9 +491,12 @@ module Stub = struct [@@noalloc] external send_query_prepared : - connection -> string -> string array -> bool array -> bool -> - (int[@untagged]) - = "PQsendQueryPrepared_stub_bc" "PQsendQueryPrepared_stub" + connection -> + string -> + string array -> + bool array -> + bool -> + (int[@untagged]) = "PQsendQueryPrepared_stub_bc" "PQsendQueryPrepared_stub" external send_describe_prepared : connection -> string -> (int[@untagged]) = "PQsendDescribePrepared_stub_bc" "PQsendDescribePrepared_stub" @@ -1008,7 +1011,7 @@ class connection ?host ?hostaddr ?port ?dbname ?user ?password ?options ?tty if Stub.result_isnull r then signal_error conn else r)) method send_query ?(param_types = [||]) ?(params = [||]) - ?(binary_params = [||]) ?(binary_result=false) query = + ?(binary_params = [||]) ?(binary_result = false) query = wrap_conn (fun conn -> if Stub.send_query_params conn query param_types params @@ -1022,11 +1025,12 @@ class connection ?host ?hostaddr ?port ?dbname ?user ?password ?options ?tty signal_error conn) method send_query_prepared ?(params = [||]) ?(binary_params = [||]) - ?(binary_result=false) - stm_name = + ?(binary_result = false) stm_name = wrap_conn (fun conn -> - if Stub.send_query_prepared conn stm_name params - binary_params binary_result <> 1 + if + Stub.send_query_prepared conn stm_name params binary_params + binary_result + <> 1 then signal_error conn) method send_describe_prepared stm_name =