Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 14 additions & 6 deletions lib/postgresql.ml
Original file line number Diff line number Diff line change
Expand Up @@ -482,6 +482,7 @@ module Stub = struct
oid array ->
string array ->
bool array ->
bool ->
(int[@untagged]) = "PQsendQueryParams_stub_bc" "PQsendQueryParams_stub"

external send_prepare :
Expand All @@ -490,8 +491,12 @@ module Stub = struct
[@@noalloc]

external send_query_prepared :
connection -> string -> string array -> bool array -> (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"
Expand Down Expand Up @@ -1006,11 +1011,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)

Expand All @@ -1020,9 +1025,12 @@ class connection ?host ?hostaddr ?port ?dbname ?user ?password ?options ?tty
signal_error conn)

method send_query_prepared ?(params = [||]) ?(binary_params = [||])
stm_name =
?(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 =
Expand Down
7 changes: 6 additions & 1 deletion lib/postgresql.mli
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
25 changes: 17 additions & 8 deletions lib/postgresql_stubs.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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);
Expand All @@ -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,
Expand All @@ -997,26 +1001,31 @@ 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);
const char *const *params = copy_params_shallow(v_params, nparams);
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;
}

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
Expand Down