From 67121461daea16e113d0a0a969bc89b6554aeea6 Mon Sep 17 00:00:00 2001 From: Dario Teixeira Date: Tue, 18 Sep 2018 14:22:10 +0200 Subject: [PATCH 1/3] Fix: Unexpected_number_of_rows -> Unexpected_number_of_columns --- ppx/ppx_mysql.ml | 2 +- tests/test_ppx/test_ppx.expected.ml | 42 +++++++++++++++++++---------- 2 files changed, 29 insertions(+), 15 deletions(-) diff --git a/ppx/ppx_mysql.ml b/ppx/ppx_mysql.ml index 8d5b693..8cf767e 100644 --- a/ppx/ppx_mysql.ml +++ b/ppx/ppx_mysql.ml @@ -79,7 +79,7 @@ let build_out_param_processor ~loc out_params = Ppx_mysql_runtime.Stdlib.Result.Error `Expected_non_null_column else Ppx_mysql_runtime.Stdlib.Result.Error - (`Unexpected_number_of_rows (len_row, [%e len_expected]))] + (`Unexpected_number_of_columns (len_row, [%e len_expected]))] let expand ~loc ~path:_ (sql_variant : string) (query : string) = diff --git a/tests/test_ppx/test_ppx.expected.ml b/tests/test_ppx/test_ppx.expected.ml index 62f25e0..2462b35 100644 --- a/tests/test_ppx/test_ppx.expected.ml +++ b/tests/test_ppx/test_ppx.expected.ml @@ -12,7 +12,8 @@ let test_no_params dbh = Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (f, v)) | Invalid_argument _ -> Ppx_mysql_runtime.Stdlib.Result.Error `Expected_non_null_column - else Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_rows (len_row, 0)) + else + Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 0)) in Prepared.with_stmt dbh query @@ fun stmt -> @@ -59,7 +60,8 @@ let test_single_output_params dbh = Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (f, v)) | Invalid_argument _ -> Ppx_mysql_runtime.Stdlib.Result.Error `Expected_non_null_column - else Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_rows (len_row, 1)) + else + Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 1)) in Prepared.with_stmt dbh query @@ fun stmt -> @@ -109,7 +111,8 @@ let test_pair_output_params dbh = Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (f, v)) | Invalid_argument _ -> Ppx_mysql_runtime.Stdlib.Result.Error `Expected_non_null_column - else Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_rows (len_row, 2)) + else + Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 2)) in Prepared.with_stmt dbh query @@ fun stmt -> @@ -156,7 +159,8 @@ let test_one_input_params dbh ~(id : int) = Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (f, v)) | Invalid_argument _ -> Ppx_mysql_runtime.Stdlib.Result.Error `Expected_non_null_column - else Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_rows (len_row, 1)) + else + Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 1)) in Prepared.with_stmt dbh query @@ fun stmt -> @@ -209,7 +213,8 @@ let test_two_input_pair_output_params dbh ~(id : int) ~(name : string) = Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (f, v)) | Invalid_argument _ -> Ppx_mysql_runtime.Stdlib.Result.Error `Expected_non_null_column - else Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_rows (len_row, 2)) + else + Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 2)) in Prepared.with_stmt dbh query @@ fun stmt -> @@ -259,7 +264,8 @@ let test_select_all dbh = Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (f, v)) | Invalid_argument _ -> Ppx_mysql_runtime.Stdlib.Result.Error `Expected_non_null_column - else Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_rows (len_row, 2)) + else + Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 2)) in Prepared.with_stmt dbh query @@ fun stmt -> @@ -308,7 +314,8 @@ let test_repeated_input_params dbh ~(id : int) = Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (f, v)) | Invalid_argument _ -> Ppx_mysql_runtime.Stdlib.Result.Error `Expected_non_null_column - else Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_rows (len_row, 2)) + else + Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 2)) in Prepared.with_stmt dbh query @@ fun stmt -> @@ -354,7 +361,8 @@ let test_select_opt dbh ~(id : int) = Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (f, v)) | Invalid_argument _ -> Ppx_mysql_runtime.Stdlib.Result.Error `Expected_non_null_column - else Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_rows (len_row, 2)) + else + Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 2)) in Prepared.with_stmt dbh query @@ fun stmt -> @@ -399,7 +407,8 @@ let test_execute dbh ~(id : int) = Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (f, v)) | Invalid_argument _ -> Ppx_mysql_runtime.Stdlib.Result.Error `Expected_non_null_column - else Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_rows (len_row, 0)) + else + Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 0)) in Prepared.with_stmt dbh query @@ fun stmt -> @@ -439,7 +448,8 @@ let test_int dbh ~(a : int) ~(b : int option) = Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (f, v)) | Invalid_argument _ -> Ppx_mysql_runtime.Stdlib.Result.Error `Expected_non_null_column - else Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_rows (len_row, 2)) + else + Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 2)) in Prepared.with_stmt dbh query @@ fun stmt -> @@ -491,7 +501,8 @@ let test_int32 dbh ~(a : int32) ~(b : int32 option) = Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (f, v)) | Invalid_argument _ -> Ppx_mysql_runtime.Stdlib.Result.Error `Expected_non_null_column - else Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_rows (len_row, 2)) + else + Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 2)) in Prepared.with_stmt dbh query @@ fun stmt -> @@ -543,7 +554,8 @@ let test_int64 dbh ~(a : int64) ~(b : int64 option) = Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (f, v)) | Invalid_argument _ -> Ppx_mysql_runtime.Stdlib.Result.Error `Expected_non_null_column - else Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_rows (len_row, 2)) + else + Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 2)) in Prepared.with_stmt dbh query @@ fun stmt -> @@ -595,7 +607,8 @@ let test_bool dbh ~(a : bool) ~(b : bool option) = Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (f, v)) | Invalid_argument _ -> Ppx_mysql_runtime.Stdlib.Result.Error `Expected_non_null_column - else Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_rows (len_row, 2)) + else + Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 2)) in Prepared.with_stmt dbh query @@ fun stmt -> @@ -647,7 +660,8 @@ let test_string dbh ~(a : string) ~(b : string option) = Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (f, v)) | Invalid_argument _ -> Ppx_mysql_runtime.Stdlib.Result.Error `Expected_non_null_column - else Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_rows (len_row, 2)) + else + Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 2)) in Prepared.with_stmt dbh query @@ fun stmt -> From 0a09f6ed5a5d5926725d8d3d3c2948a9b9f2cf28 Mon Sep 17 00:00:00 2001 From: Dario Teixeira Date: Tue, 18 Sep 2018 16:24:08 +0200 Subject: [PATCH 2/3] Errors should report the column where they occurred --- lib/runtime/ppx_mysql_runtime.ml | 19 +- lib/runtime/ppx_mysql_runtime.mli | 10 +- ppx/ppx_mysql.ml | 38 ++- ppx/query.mll | 8 +- tests/test_ppx/test_ppx.expected.ml | 475 ++++++++++++++++++++-------- tests/test_ppx/test_ppx.ml | 28 +- tests/test_query/test_query.ml | 32 +- 7 files changed, 428 insertions(+), 182 deletions(-) diff --git a/lib/runtime/ppx_mysql_runtime.ml b/lib/runtime/ppx_mysql_runtime.ml index 98fb83a..2ef5e0f 100644 --- a/lib/runtime/ppx_mysql_runtime.ml +++ b/lib/runtime/ppx_mysql_runtime.ml @@ -183,23 +183,12 @@ module Stdlib = struct let ( = ) = ( = ) end -exception Deserialization_error of string * string - -let wrap_deserializer f x = - try f x with Failure msg -> raise (Deserialization_error (msg, x)) - - let identity x = x -let int_of_string_exn = wrap_deserializer int_of_string +let int_of_string = int_of_string -let int32_of_string_exn = wrap_deserializer Int32.of_string +let int32_of_string = Int32.of_string -let int64_of_string_exn = wrap_deserializer Int64.of_string +let int64_of_string = Int64.of_string -let bool_of_string_exn str = - match int_of_string str <> 0 with - | v -> - v - | exception Failure _ -> - raise (Deserialization_error ("Ppx_mysql_runtime.bool_of_string_exn", str)) +let bool_of_string str = int_of_string str <> 0 diff --git a/lib/runtime/ppx_mysql_runtime.mli b/lib/runtime/ppx_mysql_runtime.mli index 80fe76c..ec40e77 100644 --- a/lib/runtime/ppx_mysql_runtime.mli +++ b/lib/runtime/ppx_mysql_runtime.mli @@ -116,14 +116,12 @@ module Stdlib : sig val ( = ) : 'a -> 'a -> bool end -exception Deserialization_error of string * string - val identity : 'a -> 'a -val int_of_string_exn : string -> int +val int_of_string : string -> int -val int32_of_string_exn : string -> int32 +val int32_of_string : string -> int32 -val int64_of_string_exn : string -> int64 +val int64_of_string : string -> int64 -val bool_of_string_exn : string -> bool +val bool_of_string : string -> bool diff --git a/ppx/ppx_mysql.ml b/ppx/ppx_mysql.ml index 8cf767e..ae637bc 100644 --- a/ppx/ppx_mysql.ml +++ b/ppx/ppx_mysql.ml @@ -48,13 +48,26 @@ let build_out_param_processor ~loc out_params = ~loc (Loc.make ~loc (Ldot (Lident of_string_mod, of_string_fun))) in + let param_name = Buildef.estring ~loc Query.(param.name) in + let of_string_desc = + Buildef.estring ~loc @@ Printf.sprintf "%s.%s" of_string_mod of_string_fun + in let arg = [%expr Ppx_mysql_runtime.Stdlib.Array.get row [%e Buildef.eint ~loc i]] in - let appl = [%expr (Ppx_mysql_runtime.Stdlib.Option.map [%e of_string]) [%e arg]] in + let appl = + [%expr + let deserialize value = + try [%e of_string] value with Failure _ -> + raise (Deserialization_error ([%e param_name], [%e of_string_desc], value)) + in + Ppx_mysql_runtime.Stdlib.Option.map deserialize [%e arg]] + in match param.opt with | true -> appl - | false -> - [%expr Ppx_mysql_runtime.Stdlib.Option.get [%e appl]] + | false -> ( + [%expr + try Ppx_mysql_runtime.Stdlib.Option.get [%e appl] with Invalid_argument _ -> + raise (Expected_non_null_column [%e param_name])] ) in let ret_expr = match out_params with @@ -62,24 +75,27 @@ let build_out_param_processor ~loc out_params = [%expr ()] | [x] -> make_elem 0 x - | _ :: _ -> + | _ :: _ :: _ -> Buildef.pexp_tuple ~loc @@ List.mapi make_elem out_params in let len_expected = Buildef.eint ~loc (List.length out_params) in [%expr fun row -> + (let exception Deserialization_error of string * string * string in + (let exception Expected_non_null_column of string in let ( = ) = Ppx_mysql_runtime.Stdlib.( = ) in let len_row = Ppx_mysql_runtime.Stdlib.Array.length row in if len_row = [%e len_expected] then try Ppx_mysql_runtime.Stdlib.Result.Ok [%e ret_expr] with - | Ppx_mysql_runtime.Deserialization_error (f, v) -> - Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (f, v)) - | Invalid_argument _ -> - Ppx_mysql_runtime.Stdlib.Result.Error `Expected_non_null_column + | Deserialization_error (col, f, v) -> + Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (col, f, v)) + | Expected_non_null_column col -> + Ppx_mysql_runtime.Stdlib.Result.Error (`Expected_non_null_column col) else Ppx_mysql_runtime.Stdlib.Result.Error - (`Unexpected_number_of_columns (len_row, [%e len_expected]))] + (`Unexpected_number_of_columns (len_row, [%e len_expected]))) [@warning "-38"]) + [@warning "-38"]] let expand ~loc ~path:_ (sql_variant : string) (query : string) = @@ -199,7 +215,9 @@ let expand ~loc ~path:_ (sql_variant : string) (query : string) = (Location.Error.createf ~loc "Error in 'mysql' extension: %s" msg)) -let pattern = Ast_pattern.(pexp_apply (pexp_ident (lident __)) (pair nolabel (estring __) ^:: nil)) +let pattern = + Ast_pattern.(pexp_apply (pexp_ident (lident __)) (pair nolabel (estring __) ^:: nil)) + let name = "mysql" diff --git a/ppx/query.mll b/ppx/query.mll index 9477928..42f7ac5 100644 --- a/ppx/query.mll +++ b/ppx/query.mll @@ -22,10 +22,10 @@ type parse_error = let build_param spec opt name = let open Result in begin match spec with - | "int" -> Ok ("int", ("Ppx_mysql_runtime", "int_of_string_exn"), ("Pervasives", "string_of_int")) - | "int32" -> Ok ("int32", ("Ppx_mysql_runtime", "int32_of_string_exn"), ("Int32", "to_string")) - | "int64" -> Ok ("int64", ("Ppx_mysql_runtime", "int64_of_string_exn"), ("Int64", "to_string")) - | "bool" -> Ok ("bool", ("Ppx_mysql_runtime", "bool_of_string_exn"), ("Pervasives", "string_of_bool")) + | "int" -> Ok ("int", ("Ppx_mysql_runtime", "int_of_string"), ("Pervasives", "string_of_int")) + | "int32" -> Ok ("int32", ("Ppx_mysql_runtime", "int32_of_string"), ("Int32", "to_string")) + | "int64" -> Ok ("int64", ("Ppx_mysql_runtime", "int64_of_string"), ("Int64", "to_string")) + | "bool" -> Ok ("bool", ("Ppx_mysql_runtime", "bool_of_string"), ("Pervasives", "string_of_bool")) | "string" -> Ok ("string", ("Ppx_mysql_runtime", "identity"), ("Ppx_mysql_runtime", "identity")) | spec -> Error (`Unknown_type_spec spec) end >>= fun (typ, of_string, to_string) -> diff --git a/tests/test_ppx/test_ppx.expected.ml b/tests/test_ppx/test_ppx.expected.ml index 2462b35..4503c5c 100644 --- a/tests/test_ppx/test_ppx.expected.ml +++ b/tests/test_ppx/test_ppx.expected.ml @@ -3,17 +3,20 @@ let test_no_params dbh = let query = "SELECT TRUE" in let params = [||] in let[@warning "-26"] process_out_params row = + (let exception Deserialization_error of string * string * string in + (let exception Expected_non_null_column of string in let ( = ) = Ppx_mysql_runtime.Stdlib.( = ) in let len_row = Ppx_mysql_runtime.Stdlib.Array.length row in if len_row = 0 then try Ppx_mysql_runtime.Stdlib.Result.Ok () with - | Ppx_mysql_runtime.Deserialization_error (f, v) -> - Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (f, v)) - | Invalid_argument _ -> - Ppx_mysql_runtime.Stdlib.Result.Error `Expected_non_null_column + | Deserialization_error (col, f, v) -> + Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (col, f, v)) + | Expected_non_null_column col -> + Ppx_mysql_runtime.Stdlib.Result.Error (`Expected_non_null_column col) else - Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 0)) + Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 0))) + [@warning "-38"]) [@warning "-38"] in Prepared.with_stmt dbh query @@ fun stmt -> @@ -46,22 +49,34 @@ let test_single_output_params dbh = let query = "SELECT name FROM users WHERE id = 1" in let params = [||] in let[@warning "-26"] process_out_params row = + (let exception Deserialization_error of string * string * string in + (let exception Expected_non_null_column of string in let ( = ) = Ppx_mysql_runtime.Stdlib.( = ) in let len_row = Ppx_mysql_runtime.Stdlib.Array.length row in if len_row = 1 then try Ppx_mysql_runtime.Stdlib.Result.Ok - (Ppx_mysql_runtime.Stdlib.Option.get - ((Ppx_mysql_runtime.Stdlib.Option.map Ppx_mysql_runtime.identity) - (Ppx_mysql_runtime.Stdlib.Array.get row 0))) + ( try + Ppx_mysql_runtime.Stdlib.Option.get + (let deserialize value = + try Ppx_mysql_runtime.identity value with Failure _ -> + raise + (Deserialization_error + ("name", "Ppx_mysql_runtime.identity", value)) + in + Ppx_mysql_runtime.Stdlib.Option.map + deserialize + (Ppx_mysql_runtime.Stdlib.Array.get row 0)) + with Invalid_argument _ -> raise (Expected_non_null_column "name") ) with - | Ppx_mysql_runtime.Deserialization_error (f, v) -> - Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (f, v)) - | Invalid_argument _ -> - Ppx_mysql_runtime.Stdlib.Result.Error `Expected_non_null_column + | Deserialization_error (col, f, v) -> + Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (col, f, v)) + | Expected_non_null_column col -> + Ppx_mysql_runtime.Stdlib.Result.Error (`Expected_non_null_column col) else - Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 1)) + Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 1))) + [@warning "-38"]) [@warning "-38"] in Prepared.with_stmt dbh query @@ fun stmt -> @@ -94,25 +109,46 @@ let test_pair_output_params dbh = let query = "SELECT id, name FROM users WHERE id = 1" in let params = [||] in let[@warning "-26"] process_out_params row = + (let exception Deserialization_error of string * string * string in + (let exception Expected_non_null_column of string in let ( = ) = Ppx_mysql_runtime.Stdlib.( = ) in let len_row = Ppx_mysql_runtime.Stdlib.Array.length row in if len_row = 2 then try Ppx_mysql_runtime.Stdlib.Result.Ok - ( Ppx_mysql_runtime.Stdlib.Option.get - ((Ppx_mysql_runtime.Stdlib.Option.map Ppx_mysql_runtime.int_of_string_exn) - (Ppx_mysql_runtime.Stdlib.Array.get row 0)) - , Ppx_mysql_runtime.Stdlib.Option.get - ((Ppx_mysql_runtime.Stdlib.Option.map Ppx_mysql_runtime.identity) - (Ppx_mysql_runtime.Stdlib.Array.get row 1)) ) + ( ( try + Ppx_mysql_runtime.Stdlib.Option.get + (let deserialize value = + try Ppx_mysql_runtime.int_of_string value with Failure _ -> + raise + (Deserialization_error + ("id", "Ppx_mysql_runtime.int_of_string", value)) + in + Ppx_mysql_runtime.Stdlib.Option.map + deserialize + (Ppx_mysql_runtime.Stdlib.Array.get row 0)) + with Invalid_argument _ -> raise (Expected_non_null_column "id") ) + , try + Ppx_mysql_runtime.Stdlib.Option.get + (let deserialize value = + try Ppx_mysql_runtime.identity value with Failure _ -> + raise + (Deserialization_error + ("name", "Ppx_mysql_runtime.identity", value)) + in + Ppx_mysql_runtime.Stdlib.Option.map + deserialize + (Ppx_mysql_runtime.Stdlib.Array.get row 1)) + with Invalid_argument _ -> raise (Expected_non_null_column "name") ) with - | Ppx_mysql_runtime.Deserialization_error (f, v) -> - Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (f, v)) - | Invalid_argument _ -> - Ppx_mysql_runtime.Stdlib.Result.Error `Expected_non_null_column + | Deserialization_error (col, f, v) -> + Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (col, f, v)) + | Expected_non_null_column col -> + Ppx_mysql_runtime.Stdlib.Result.Error (`Expected_non_null_column col) else - Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 2)) + Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 2))) + [@warning "-38"]) [@warning "-38"] in Prepared.with_stmt dbh query @@ fun stmt -> @@ -145,22 +181,34 @@ let test_one_input_params dbh ~(id : int) = let query = "SELECT name FROM users WHERE id = ?" in let params = [|Ppx_mysql_runtime.Stdlib.Option.Some (Pervasives.string_of_int id)|] in let[@warning "-26"] process_out_params row = + (let exception Deserialization_error of string * string * string in + (let exception Expected_non_null_column of string in let ( = ) = Ppx_mysql_runtime.Stdlib.( = ) in let len_row = Ppx_mysql_runtime.Stdlib.Array.length row in if len_row = 1 then try Ppx_mysql_runtime.Stdlib.Result.Ok - (Ppx_mysql_runtime.Stdlib.Option.get - ((Ppx_mysql_runtime.Stdlib.Option.map Ppx_mysql_runtime.identity) - (Ppx_mysql_runtime.Stdlib.Array.get row 0))) + ( try + Ppx_mysql_runtime.Stdlib.Option.get + (let deserialize value = + try Ppx_mysql_runtime.identity value with Failure _ -> + raise + (Deserialization_error + ("name", "Ppx_mysql_runtime.identity", value)) + in + Ppx_mysql_runtime.Stdlib.Option.map + deserialize + (Ppx_mysql_runtime.Stdlib.Array.get row 0)) + with Invalid_argument _ -> raise (Expected_non_null_column "name") ) with - | Ppx_mysql_runtime.Deserialization_error (f, v) -> - Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (f, v)) - | Invalid_argument _ -> - Ppx_mysql_runtime.Stdlib.Result.Error `Expected_non_null_column + | Deserialization_error (col, f, v) -> + Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (col, f, v)) + | Expected_non_null_column col -> + Ppx_mysql_runtime.Stdlib.Result.Error (`Expected_non_null_column col) else - Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 1)) + Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 1))) + [@warning "-38"]) [@warning "-38"] in Prepared.with_stmt dbh query @@ fun stmt -> @@ -196,25 +244,46 @@ let test_two_input_pair_output_params dbh ~(id : int) ~(name : string) = ; Ppx_mysql_runtime.Stdlib.Option.Some (Ppx_mysql_runtime.identity name) |] in let[@warning "-26"] process_out_params row = + (let exception Deserialization_error of string * string * string in + (let exception Expected_non_null_column of string in let ( = ) = Ppx_mysql_runtime.Stdlib.( = ) in let len_row = Ppx_mysql_runtime.Stdlib.Array.length row in if len_row = 2 then try Ppx_mysql_runtime.Stdlib.Result.Ok - ( Ppx_mysql_runtime.Stdlib.Option.get - ((Ppx_mysql_runtime.Stdlib.Option.map Ppx_mysql_runtime.int_of_string_exn) - (Ppx_mysql_runtime.Stdlib.Array.get row 0)) - , Ppx_mysql_runtime.Stdlib.Option.get - ((Ppx_mysql_runtime.Stdlib.Option.map Ppx_mysql_runtime.identity) - (Ppx_mysql_runtime.Stdlib.Array.get row 1)) ) + ( ( try + Ppx_mysql_runtime.Stdlib.Option.get + (let deserialize value = + try Ppx_mysql_runtime.int_of_string value with Failure _ -> + raise + (Deserialization_error + ("id", "Ppx_mysql_runtime.int_of_string", value)) + in + Ppx_mysql_runtime.Stdlib.Option.map + deserialize + (Ppx_mysql_runtime.Stdlib.Array.get row 0)) + with Invalid_argument _ -> raise (Expected_non_null_column "id") ) + , try + Ppx_mysql_runtime.Stdlib.Option.get + (let deserialize value = + try Ppx_mysql_runtime.identity value with Failure _ -> + raise + (Deserialization_error + ("name", "Ppx_mysql_runtime.identity", value)) + in + Ppx_mysql_runtime.Stdlib.Option.map + deserialize + (Ppx_mysql_runtime.Stdlib.Array.get row 1)) + with Invalid_argument _ -> raise (Expected_non_null_column "name") ) with - | Ppx_mysql_runtime.Deserialization_error (f, v) -> - Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (f, v)) - | Invalid_argument _ -> - Ppx_mysql_runtime.Stdlib.Result.Error `Expected_non_null_column + | Deserialization_error (col, f, v) -> + Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (col, f, v)) + | Expected_non_null_column col -> + Ppx_mysql_runtime.Stdlib.Result.Error (`Expected_non_null_column col) else - Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 2)) + Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 2))) + [@warning "-38"]) [@warning "-38"] in Prepared.with_stmt dbh query @@ fun stmt -> @@ -247,25 +316,46 @@ let test_select_all dbh = let query = "SELECT id, name FROM users" in let params = [||] in let[@warning "-26"] process_out_params row = + (let exception Deserialization_error of string * string * string in + (let exception Expected_non_null_column of string in let ( = ) = Ppx_mysql_runtime.Stdlib.( = ) in let len_row = Ppx_mysql_runtime.Stdlib.Array.length row in if len_row = 2 then try Ppx_mysql_runtime.Stdlib.Result.Ok - ( Ppx_mysql_runtime.Stdlib.Option.get - ((Ppx_mysql_runtime.Stdlib.Option.map Ppx_mysql_runtime.int_of_string_exn) - (Ppx_mysql_runtime.Stdlib.Array.get row 0)) - , Ppx_mysql_runtime.Stdlib.Option.get - ((Ppx_mysql_runtime.Stdlib.Option.map Ppx_mysql_runtime.identity) - (Ppx_mysql_runtime.Stdlib.Array.get row 1)) ) + ( ( try + Ppx_mysql_runtime.Stdlib.Option.get + (let deserialize value = + try Ppx_mysql_runtime.int_of_string value with Failure _ -> + raise + (Deserialization_error + ("id", "Ppx_mysql_runtime.int_of_string", value)) + in + Ppx_mysql_runtime.Stdlib.Option.map + deserialize + (Ppx_mysql_runtime.Stdlib.Array.get row 0)) + with Invalid_argument _ -> raise (Expected_non_null_column "id") ) + , try + Ppx_mysql_runtime.Stdlib.Option.get + (let deserialize value = + try Ppx_mysql_runtime.identity value with Failure _ -> + raise + (Deserialization_error + ("name", "Ppx_mysql_runtime.identity", value)) + in + Ppx_mysql_runtime.Stdlib.Option.map + deserialize + (Ppx_mysql_runtime.Stdlib.Array.get row 1)) + with Invalid_argument _ -> raise (Expected_non_null_column "name") ) with - | Ppx_mysql_runtime.Deserialization_error (f, v) -> - Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (f, v)) - | Invalid_argument _ -> - Ppx_mysql_runtime.Stdlib.Result.Error `Expected_non_null_column + | Deserialization_error (col, f, v) -> + Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (col, f, v)) + | Expected_non_null_column col -> + Ppx_mysql_runtime.Stdlib.Result.Error (`Expected_non_null_column col) else - Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 2)) + Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 2))) + [@warning "-38"]) [@warning "-38"] in Prepared.with_stmt dbh query @@ fun stmt -> @@ -297,25 +387,46 @@ let test_repeated_input_params dbh ~(id : int) = ; Ppx_mysql_runtime.Stdlib.Option.Some (Pervasives.string_of_int id) |] in let[@warning "-26"] process_out_params row = + (let exception Deserialization_error of string * string * string in + (let exception Expected_non_null_column of string in let ( = ) = Ppx_mysql_runtime.Stdlib.( = ) in let len_row = Ppx_mysql_runtime.Stdlib.Array.length row in if len_row = 2 then try Ppx_mysql_runtime.Stdlib.Result.Ok - ( Ppx_mysql_runtime.Stdlib.Option.get - ((Ppx_mysql_runtime.Stdlib.Option.map Ppx_mysql_runtime.int_of_string_exn) - (Ppx_mysql_runtime.Stdlib.Array.get row 0)) - , Ppx_mysql_runtime.Stdlib.Option.get - ((Ppx_mysql_runtime.Stdlib.Option.map Ppx_mysql_runtime.identity) - (Ppx_mysql_runtime.Stdlib.Array.get row 1)) ) + ( ( try + Ppx_mysql_runtime.Stdlib.Option.get + (let deserialize value = + try Ppx_mysql_runtime.int_of_string value with Failure _ -> + raise + (Deserialization_error + ("id", "Ppx_mysql_runtime.int_of_string", value)) + in + Ppx_mysql_runtime.Stdlib.Option.map + deserialize + (Ppx_mysql_runtime.Stdlib.Array.get row 0)) + with Invalid_argument _ -> raise (Expected_non_null_column "id") ) + , try + Ppx_mysql_runtime.Stdlib.Option.get + (let deserialize value = + try Ppx_mysql_runtime.identity value with Failure _ -> + raise + (Deserialization_error + ("name", "Ppx_mysql_runtime.identity", value)) + in + Ppx_mysql_runtime.Stdlib.Option.map + deserialize + (Ppx_mysql_runtime.Stdlib.Array.get row 1)) + with Invalid_argument _ -> raise (Expected_non_null_column "name") ) with - | Ppx_mysql_runtime.Deserialization_error (f, v) -> - Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (f, v)) - | Invalid_argument _ -> - Ppx_mysql_runtime.Stdlib.Result.Error `Expected_non_null_column + | Deserialization_error (col, f, v) -> + Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (col, f, v)) + | Expected_non_null_column col -> + Ppx_mysql_runtime.Stdlib.Result.Error (`Expected_non_null_column col) else - Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 2)) + Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 2))) + [@warning "-38"]) [@warning "-38"] in Prepared.with_stmt dbh query @@ fun stmt -> @@ -344,25 +455,46 @@ let test_select_opt dbh ~(id : int) = let query = "SELECT id, name FROM users WHERE id = ?" in let params = [|Ppx_mysql_runtime.Stdlib.Option.Some (Pervasives.string_of_int id)|] in let[@warning "-26"] process_out_params row = + (let exception Deserialization_error of string * string * string in + (let exception Expected_non_null_column of string in let ( = ) = Ppx_mysql_runtime.Stdlib.( = ) in let len_row = Ppx_mysql_runtime.Stdlib.Array.length row in if len_row = 2 then try Ppx_mysql_runtime.Stdlib.Result.Ok - ( Ppx_mysql_runtime.Stdlib.Option.get - ((Ppx_mysql_runtime.Stdlib.Option.map Ppx_mysql_runtime.int_of_string_exn) - (Ppx_mysql_runtime.Stdlib.Array.get row 0)) - , Ppx_mysql_runtime.Stdlib.Option.get - ((Ppx_mysql_runtime.Stdlib.Option.map Ppx_mysql_runtime.identity) - (Ppx_mysql_runtime.Stdlib.Array.get row 1)) ) + ( ( try + Ppx_mysql_runtime.Stdlib.Option.get + (let deserialize value = + try Ppx_mysql_runtime.int_of_string value with Failure _ -> + raise + (Deserialization_error + ("id", "Ppx_mysql_runtime.int_of_string", value)) + in + Ppx_mysql_runtime.Stdlib.Option.map + deserialize + (Ppx_mysql_runtime.Stdlib.Array.get row 0)) + with Invalid_argument _ -> raise (Expected_non_null_column "id") ) + , try + Ppx_mysql_runtime.Stdlib.Option.get + (let deserialize value = + try Ppx_mysql_runtime.identity value with Failure _ -> + raise + (Deserialization_error + ("name", "Ppx_mysql_runtime.identity", value)) + in + Ppx_mysql_runtime.Stdlib.Option.map + deserialize + (Ppx_mysql_runtime.Stdlib.Array.get row 1)) + with Invalid_argument _ -> raise (Expected_non_null_column "name") ) with - | Ppx_mysql_runtime.Deserialization_error (f, v) -> - Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (f, v)) - | Invalid_argument _ -> - Ppx_mysql_runtime.Stdlib.Result.Error `Expected_non_null_column + | Deserialization_error (col, f, v) -> + Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (col, f, v)) + | Expected_non_null_column col -> + Ppx_mysql_runtime.Stdlib.Result.Error (`Expected_non_null_column col) else - Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 2)) + Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 2))) + [@warning "-38"]) [@warning "-38"] in Prepared.with_stmt dbh query @@ fun stmt -> @@ -398,17 +530,20 @@ let test_execute dbh ~(id : int) = let query = "DELETE FROM users WHERE id = ?" in let params = [|Ppx_mysql_runtime.Stdlib.Option.Some (Pervasives.string_of_int id)|] in let[@warning "-26"] process_out_params row = + (let exception Deserialization_error of string * string * string in + (let exception Expected_non_null_column of string in let ( = ) = Ppx_mysql_runtime.Stdlib.( = ) in let len_row = Ppx_mysql_runtime.Stdlib.Array.length row in if len_row = 0 then try Ppx_mysql_runtime.Stdlib.Result.Ok () with - | Ppx_mysql_runtime.Deserialization_error (f, v) -> - Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (f, v)) - | Invalid_argument _ -> - Ppx_mysql_runtime.Stdlib.Result.Error `Expected_non_null_column + | Deserialization_error (col, f, v) -> + Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (col, f, v)) + | Expected_non_null_column col -> + Ppx_mysql_runtime.Stdlib.Result.Error (`Expected_non_null_column col) else - Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 0)) + Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 0))) + [@warning "-38"]) [@warning "-38"] in Prepared.with_stmt dbh query @@ fun stmt -> @@ -432,24 +567,42 @@ let test_int dbh ~(a : int) ~(b : int option) = ; (Ppx_mysql_runtime.Stdlib.Option.map Pervasives.string_of_int) b |] in let[@warning "-26"] process_out_params row = + (let exception Deserialization_error of string * string * string in + (let exception Expected_non_null_column of string in let ( = ) = Ppx_mysql_runtime.Stdlib.( = ) in let len_row = Ppx_mysql_runtime.Stdlib.Array.length row in if len_row = 2 then try Ppx_mysql_runtime.Stdlib.Result.Ok - ( Ppx_mysql_runtime.Stdlib.Option.get - ((Ppx_mysql_runtime.Stdlib.Option.map Ppx_mysql_runtime.int_of_string_exn) - (Ppx_mysql_runtime.Stdlib.Array.get row 0)) - , (Ppx_mysql_runtime.Stdlib.Option.map Ppx_mysql_runtime.int_of_string_exn) + ( ( try + Ppx_mysql_runtime.Stdlib.Option.get + (let deserialize value = + try Ppx_mysql_runtime.int_of_string value with Failure _ -> + raise + (Deserialization_error + ("a", "Ppx_mysql_runtime.int_of_string", value)) + in + Ppx_mysql_runtime.Stdlib.Option.map + deserialize + (Ppx_mysql_runtime.Stdlib.Array.get row 0)) + with Invalid_argument _ -> raise (Expected_non_null_column "a") ) + , let deserialize value = + try Ppx_mysql_runtime.int_of_string value with Failure _ -> + raise + (Deserialization_error ("b", "Ppx_mysql_runtime.int_of_string", value)) + in + Ppx_mysql_runtime.Stdlib.Option.map + deserialize (Ppx_mysql_runtime.Stdlib.Array.get row 1) ) with - | Ppx_mysql_runtime.Deserialization_error (f, v) -> - Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (f, v)) - | Invalid_argument _ -> - Ppx_mysql_runtime.Stdlib.Result.Error `Expected_non_null_column + | Deserialization_error (col, f, v) -> + Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (col, f, v)) + | Expected_non_null_column col -> + Ppx_mysql_runtime.Stdlib.Result.Error (`Expected_non_null_column col) else - Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 2)) + Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 2))) + [@warning "-38"]) [@warning "-38"] in Prepared.with_stmt dbh query @@ fun stmt -> @@ -485,24 +638,42 @@ let test_int32 dbh ~(a : int32) ~(b : int32 option) = ; (Ppx_mysql_runtime.Stdlib.Option.map Int32.to_string) b |] in let[@warning "-26"] process_out_params row = + (let exception Deserialization_error of string * string * string in + (let exception Expected_non_null_column of string in let ( = ) = Ppx_mysql_runtime.Stdlib.( = ) in let len_row = Ppx_mysql_runtime.Stdlib.Array.length row in if len_row = 2 then try Ppx_mysql_runtime.Stdlib.Result.Ok - ( Ppx_mysql_runtime.Stdlib.Option.get - ((Ppx_mysql_runtime.Stdlib.Option.map Ppx_mysql_runtime.int32_of_string_exn) - (Ppx_mysql_runtime.Stdlib.Array.get row 0)) - , (Ppx_mysql_runtime.Stdlib.Option.map Ppx_mysql_runtime.int32_of_string_exn) + ( ( try + Ppx_mysql_runtime.Stdlib.Option.get + (let deserialize value = + try Ppx_mysql_runtime.int32_of_string value with Failure _ -> + raise + (Deserialization_error + ("a", "Ppx_mysql_runtime.int32_of_string", value)) + in + Ppx_mysql_runtime.Stdlib.Option.map + deserialize + (Ppx_mysql_runtime.Stdlib.Array.get row 0)) + with Invalid_argument _ -> raise (Expected_non_null_column "a") ) + , let deserialize value = + try Ppx_mysql_runtime.int32_of_string value with Failure _ -> + raise + (Deserialization_error ("b", "Ppx_mysql_runtime.int32_of_string", value)) + in + Ppx_mysql_runtime.Stdlib.Option.map + deserialize (Ppx_mysql_runtime.Stdlib.Array.get row 1) ) with - | Ppx_mysql_runtime.Deserialization_error (f, v) -> - Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (f, v)) - | Invalid_argument _ -> - Ppx_mysql_runtime.Stdlib.Result.Error `Expected_non_null_column + | Deserialization_error (col, f, v) -> + Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (col, f, v)) + | Expected_non_null_column col -> + Ppx_mysql_runtime.Stdlib.Result.Error (`Expected_non_null_column col) else - Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 2)) + Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 2))) + [@warning "-38"]) [@warning "-38"] in Prepared.with_stmt dbh query @@ fun stmt -> @@ -538,24 +709,42 @@ let test_int64 dbh ~(a : int64) ~(b : int64 option) = ; (Ppx_mysql_runtime.Stdlib.Option.map Int64.to_string) b |] in let[@warning "-26"] process_out_params row = + (let exception Deserialization_error of string * string * string in + (let exception Expected_non_null_column of string in let ( = ) = Ppx_mysql_runtime.Stdlib.( = ) in let len_row = Ppx_mysql_runtime.Stdlib.Array.length row in if len_row = 2 then try Ppx_mysql_runtime.Stdlib.Result.Ok - ( Ppx_mysql_runtime.Stdlib.Option.get - ((Ppx_mysql_runtime.Stdlib.Option.map Ppx_mysql_runtime.int64_of_string_exn) - (Ppx_mysql_runtime.Stdlib.Array.get row 0)) - , (Ppx_mysql_runtime.Stdlib.Option.map Ppx_mysql_runtime.int64_of_string_exn) + ( ( try + Ppx_mysql_runtime.Stdlib.Option.get + (let deserialize value = + try Ppx_mysql_runtime.int64_of_string value with Failure _ -> + raise + (Deserialization_error + ("a", "Ppx_mysql_runtime.int64_of_string", value)) + in + Ppx_mysql_runtime.Stdlib.Option.map + deserialize + (Ppx_mysql_runtime.Stdlib.Array.get row 0)) + with Invalid_argument _ -> raise (Expected_non_null_column "a") ) + , let deserialize value = + try Ppx_mysql_runtime.int64_of_string value with Failure _ -> + raise + (Deserialization_error ("b", "Ppx_mysql_runtime.int64_of_string", value)) + in + Ppx_mysql_runtime.Stdlib.Option.map + deserialize (Ppx_mysql_runtime.Stdlib.Array.get row 1) ) with - | Ppx_mysql_runtime.Deserialization_error (f, v) -> - Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (f, v)) - | Invalid_argument _ -> - Ppx_mysql_runtime.Stdlib.Result.Error `Expected_non_null_column + | Deserialization_error (col, f, v) -> + Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (col, f, v)) + | Expected_non_null_column col -> + Ppx_mysql_runtime.Stdlib.Result.Error (`Expected_non_null_column col) else - Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 2)) + Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 2))) + [@warning "-38"]) [@warning "-38"] in Prepared.with_stmt dbh query @@ fun stmt -> @@ -591,24 +780,42 @@ let test_bool dbh ~(a : bool) ~(b : bool option) = ; (Ppx_mysql_runtime.Stdlib.Option.map Pervasives.string_of_bool) b |] in let[@warning "-26"] process_out_params row = + (let exception Deserialization_error of string * string * string in + (let exception Expected_non_null_column of string in let ( = ) = Ppx_mysql_runtime.Stdlib.( = ) in let len_row = Ppx_mysql_runtime.Stdlib.Array.length row in if len_row = 2 then try Ppx_mysql_runtime.Stdlib.Result.Ok - ( Ppx_mysql_runtime.Stdlib.Option.get - ((Ppx_mysql_runtime.Stdlib.Option.map Ppx_mysql_runtime.bool_of_string_exn) - (Ppx_mysql_runtime.Stdlib.Array.get row 0)) - , (Ppx_mysql_runtime.Stdlib.Option.map Ppx_mysql_runtime.bool_of_string_exn) + ( ( try + Ppx_mysql_runtime.Stdlib.Option.get + (let deserialize value = + try Ppx_mysql_runtime.bool_of_string value with Failure _ -> + raise + (Deserialization_error + ("a", "Ppx_mysql_runtime.bool_of_string", value)) + in + Ppx_mysql_runtime.Stdlib.Option.map + deserialize + (Ppx_mysql_runtime.Stdlib.Array.get row 0)) + with Invalid_argument _ -> raise (Expected_non_null_column "a") ) + , let deserialize value = + try Ppx_mysql_runtime.bool_of_string value with Failure _ -> + raise + (Deserialization_error ("b", "Ppx_mysql_runtime.bool_of_string", value)) + in + Ppx_mysql_runtime.Stdlib.Option.map + deserialize (Ppx_mysql_runtime.Stdlib.Array.get row 1) ) with - | Ppx_mysql_runtime.Deserialization_error (f, v) -> - Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (f, v)) - | Invalid_argument _ -> - Ppx_mysql_runtime.Stdlib.Result.Error `Expected_non_null_column + | Deserialization_error (col, f, v) -> + Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (col, f, v)) + | Expected_non_null_column col -> + Ppx_mysql_runtime.Stdlib.Result.Error (`Expected_non_null_column col) else - Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 2)) + Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 2))) + [@warning "-38"]) [@warning "-38"] in Prepared.with_stmt dbh query @@ fun stmt -> @@ -644,24 +851,40 @@ let test_string dbh ~(a : string) ~(b : string option) = ; (Ppx_mysql_runtime.Stdlib.Option.map Ppx_mysql_runtime.identity) b |] in let[@warning "-26"] process_out_params row = + (let exception Deserialization_error of string * string * string in + (let exception Expected_non_null_column of string in let ( = ) = Ppx_mysql_runtime.Stdlib.( = ) in let len_row = Ppx_mysql_runtime.Stdlib.Array.length row in if len_row = 2 then try Ppx_mysql_runtime.Stdlib.Result.Ok - ( Ppx_mysql_runtime.Stdlib.Option.get - ((Ppx_mysql_runtime.Stdlib.Option.map Ppx_mysql_runtime.identity) - (Ppx_mysql_runtime.Stdlib.Array.get row 0)) - , (Ppx_mysql_runtime.Stdlib.Option.map Ppx_mysql_runtime.identity) + ( ( try + Ppx_mysql_runtime.Stdlib.Option.get + (let deserialize value = + try Ppx_mysql_runtime.identity value with Failure _ -> + raise + (Deserialization_error ("a", "Ppx_mysql_runtime.identity", value)) + in + Ppx_mysql_runtime.Stdlib.Option.map + deserialize + (Ppx_mysql_runtime.Stdlib.Array.get row 0)) + with Invalid_argument _ -> raise (Expected_non_null_column "a") ) + , let deserialize value = + try Ppx_mysql_runtime.identity value with Failure _ -> + raise (Deserialization_error ("b", "Ppx_mysql_runtime.identity", value)) + in + Ppx_mysql_runtime.Stdlib.Option.map + deserialize (Ppx_mysql_runtime.Stdlib.Array.get row 1) ) with - | Ppx_mysql_runtime.Deserialization_error (f, v) -> - Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (f, v)) - | Invalid_argument _ -> - Ppx_mysql_runtime.Stdlib.Result.Error `Expected_non_null_column + | Deserialization_error (col, f, v) -> + Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (col, f, v)) + | Expected_non_null_column col -> + Ppx_mysql_runtime.Stdlib.Result.Error (`Expected_non_null_column col) else - Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 2)) + Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 2))) + [@warning "-38"]) [@warning "-38"] in Prepared.with_stmt dbh query @@ fun stmt -> diff --git a/tests/test_ppx/test_ppx.ml b/tests/test_ppx/test_ppx.ml index 4255a27..f7e3b6a 100644 --- a/tests/test_ppx/test_ppx.ml +++ b/tests/test_ppx/test_ppx.ml @@ -33,12 +33,30 @@ let test_select_opt = let test_execute = [%mysql execute "DELETE FROM users WHERE id = %int{id}"] -let test_int = [%mysql select_one "SELECT @int{a}, @int?{b} FROM users where a = %int{a} OR b = %int?{b}"] +let test_int = + [%mysql + select_one "SELECT @int{a}, @int?{b} FROM users where a = %int{a} OR b = %int?{b}"] + -let test_int32 = [%mysql select_one "SELECT @int32{a}, @int32?{b} FROM users where a = %int32{a} OR b = %int32?{b}"] +let test_int32 = + [%mysql + select_one + "SELECT @int32{a}, @int32?{b} FROM users where a = %int32{a} OR b = %int32?{b}"] -let test_int64 = [%mysql select_one "SELECT @int64{a}, @int64?{b} FROM users where a = %int64{a} OR b = %int64?{b}"] -let test_bool = [%mysql select_one "SELECT @bool{a}, @bool?{b} FROM users where a = %bool{a} OR b = %bool?{b}"] +let test_int64 = + [%mysql + select_one + "SELECT @int64{a}, @int64?{b} FROM users where a = %int64{a} OR b = %int64?{b}"] + -let test_string = [%mysql select_one "SELECT @string{a}, @string?{b} FROM users where a = %string{a} OR b = %string?{b}"] +let test_bool = + [%mysql + select_one + "SELECT @bool{a}, @bool?{b} FROM users where a = %bool{a} OR b = %bool?{b}"] + + +let test_string = + [%mysql + select_one + "SELECT @string{a}, @string?{b} FROM users where a = %string{a} OR b = %string?{b}"] diff --git a/tests/test_query/test_query.ml b/tests/test_query/test_query.ml index 7ecbe76..c740348 100644 --- a/tests/test_query/test_query.ml +++ b/tests/test_query/test_query.ml @@ -46,7 +46,7 @@ let parsed_query_out1 = [ { typ = "int64" ; opt = false ; name = "id" - ; of_string = "Ppx_mysql_runtime", "int64_of_string_exn" + ; of_string = "Ppx_mysql_runtime", "int64_of_string" ; to_string = "Int64", "to_string" } ] } @@ -59,7 +59,7 @@ let parsed_query_out2 = [ { typ = "int64" ; opt = false ; name = "id" - ; of_string = "Ppx_mysql_runtime", "int64_of_string_exn" + ; of_string = "Ppx_mysql_runtime", "int64_of_string" ; to_string = "Int64", "to_string" } ; { typ = "string" ; opt = false @@ -77,7 +77,7 @@ let parsed_query_out3 = [ { typ = "int64" ; opt = false ; name = "id" - ; of_string = "Ppx_mysql_runtime", "int64_of_string_exn" + ; of_string = "Ppx_mysql_runtime", "int64_of_string" ; to_string = "Int64", "to_string" } ; { typ = "string" ; opt = false @@ -99,7 +99,7 @@ let parsed_query_in1 = [ { typ = "int64" ; opt = false ; name = "id" - ; of_string = "Ppx_mysql_runtime", "int64_of_string_exn" + ; of_string = "Ppx_mysql_runtime", "int64_of_string" ; to_string = "Int64", "to_string" } ] ; out_params = [] } @@ -112,7 +112,7 @@ let parsed_query_in2 = [ { typ = "int64" ; opt = false ; name = "id" - ; of_string = "Ppx_mysql_runtime", "int64_of_string_exn" + ; of_string = "Ppx_mysql_runtime", "int64_of_string" ; to_string = "Int64", "to_string" } ; { typ = "string" ; opt = false @@ -132,7 +132,7 @@ let parsed_query_in3 = [ { typ = "int64" ; opt = false ; name = "id" - ; of_string = "Ppx_mysql_runtime", "int64_of_string_exn" + ; of_string = "Ppx_mysql_runtime", "int64_of_string" ; to_string = "Int64", "to_string" } ; { typ = "string" ; opt = false @@ -158,7 +158,7 @@ let parsed_query_inout = [ { typ = "int64" ; opt = false ; name = "id" - ; of_string = "Ppx_mysql_runtime", "int64_of_string_exn" + ; of_string = "Ppx_mysql_runtime", "int64_of_string" ; to_string = "Int64", "to_string" } ; { typ = "string" ; opt = false @@ -174,7 +174,7 @@ let parsed_query_inout = [ { typ = "int64" ; opt = false ; name = "id" - ; of_string = "Ppx_mysql_runtime", "int64_of_string_exn" + ; of_string = "Ppx_mysql_runtime", "int64_of_string" ; to_string = "Int64", "to_string" } ; { typ = "string" ; opt = false @@ -199,13 +199,13 @@ let parsed_query_quoted0 = [ { typ = "int64" ; opt = false ; name = "id" - ; of_string = "Ppx_mysql_runtime", "int64_of_string_exn" + ; of_string = "Ppx_mysql_runtime", "int64_of_string" ; to_string = "Int64", "to_string" } ] ; out_params = [ { typ = "int64" ; opt = false ; name = "id" - ; of_string = "Ppx_mysql_runtime", "int64_of_string_exn" + ; of_string = "Ppx_mysql_runtime", "int64_of_string" ; to_string = "Int64", "to_string" } ; { typ = "string" ; opt = false @@ -226,13 +226,13 @@ let parsed_query_quoted1 = [ { typ = "int64" ; opt = false ; name = "id" - ; of_string = "Ppx_mysql_runtime", "int64_of_string_exn" + ; of_string = "Ppx_mysql_runtime", "int64_of_string" ; to_string = "Int64", "to_string" } ] ; out_params = [ { typ = "int64" ; opt = false ; name = "id" - ; of_string = "Ppx_mysql_runtime", "int64_of_string_exn" + ; of_string = "Ppx_mysql_runtime", "int64_of_string" ; to_string = "Int64", "to_string" } ; { typ = "string" ; opt = false @@ -253,13 +253,13 @@ let parsed_query_quoted2 = [ { typ = "int64" ; opt = false ; name = "id" - ; of_string = "Ppx_mysql_runtime", "int64_of_string_exn" + ; of_string = "Ppx_mysql_runtime", "int64_of_string" ; to_string = "Int64", "to_string" } ] ; out_params = [ { typ = "int64" ; opt = false ; name = "id" - ; of_string = "Ppx_mysql_runtime", "int64_of_string_exn" + ; of_string = "Ppx_mysql_runtime", "int64_of_string" ; to_string = "Int64", "to_string" } ; { typ = "string" ; opt = false @@ -280,13 +280,13 @@ let parsed_query_quoted3 = [ { typ = "int64" ; opt = false ; name = "id" - ; of_string = "Ppx_mysql_runtime", "int64_of_string_exn" + ; of_string = "Ppx_mysql_runtime", "int64_of_string" ; to_string = "Int64", "to_string" } ] ; out_params = [ { typ = "int64" ; opt = false ; name = "id" - ; of_string = "Ppx_mysql_runtime", "int64_of_string_exn" + ; of_string = "Ppx_mysql_runtime", "int64_of_string" ; to_string = "Int64", "to_string" } ; { typ = "string" ; opt = false From 4d567be6bf0a3335ef7c56fa659026bd3ad15396 Mon Sep 17 00:00:00 2001 From: Dario Teixeira Date: Wed, 19 Sep 2018 09:00:12 +0200 Subject: [PATCH 3/3] Wrap Deserialization_error and Expected_non_null_column under Column_errors --- ppx/ppx_mysql.ml | 4 +- tests/test_ppx/test_ppx.expected.ml | 84 +++++++++++++++++++---------- 2 files changed, 58 insertions(+), 30 deletions(-) diff --git a/ppx/ppx_mysql.ml b/ppx/ppx_mysql.ml index ae637bc..70ba8f7 100644 --- a/ppx/ppx_mysql.ml +++ b/ppx/ppx_mysql.ml @@ -89,9 +89,9 @@ let build_out_param_processor ~loc out_params = then try Ppx_mysql_runtime.Stdlib.Result.Ok [%e ret_expr] with | Deserialization_error (col, f, v) -> - Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (col, f, v)) + Ppx_mysql_runtime.Stdlib.Result.Error (`Column_errors [(col, `Deserialization_error (f, v))]) | Expected_non_null_column col -> - Ppx_mysql_runtime.Stdlib.Result.Error (`Expected_non_null_column col) + Ppx_mysql_runtime.Stdlib.Result.Error (`Column_errors [(col, `Expected_non_null_value)]) else Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, [%e len_expected]))) [@warning "-38"]) diff --git a/tests/test_ppx/test_ppx.expected.ml b/tests/test_ppx/test_ppx.expected.ml index 4503c5c..0d02724 100644 --- a/tests/test_ppx/test_ppx.expected.ml +++ b/tests/test_ppx/test_ppx.expected.ml @@ -11,9 +11,11 @@ let test_no_params dbh = then try Ppx_mysql_runtime.Stdlib.Result.Ok () with | Deserialization_error (col, f, v) -> - Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (col, f, v)) + Ppx_mysql_runtime.Stdlib.Result.Error + (`Column_errors [col, `Deserialization_error (f, v)]) | Expected_non_null_column col -> - Ppx_mysql_runtime.Stdlib.Result.Error (`Expected_non_null_column col) + Ppx_mysql_runtime.Stdlib.Result.Error + (`Column_errors [col, `Expected_non_null_value]) else Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 0))) [@warning "-38"]) [@warning "-38"] @@ -71,9 +73,11 @@ let test_single_output_params dbh = with Invalid_argument _ -> raise (Expected_non_null_column "name") ) with | Deserialization_error (col, f, v) -> - Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (col, f, v)) + Ppx_mysql_runtime.Stdlib.Result.Error + (`Column_errors [col, `Deserialization_error (f, v)]) | Expected_non_null_column col -> - Ppx_mysql_runtime.Stdlib.Result.Error (`Expected_non_null_column col) + Ppx_mysql_runtime.Stdlib.Result.Error + (`Column_errors [col, `Expected_non_null_value]) else Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 1))) [@warning "-38"]) [@warning "-38"] @@ -143,9 +147,11 @@ let test_pair_output_params dbh = with Invalid_argument _ -> raise (Expected_non_null_column "name") ) with | Deserialization_error (col, f, v) -> - Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (col, f, v)) + Ppx_mysql_runtime.Stdlib.Result.Error + (`Column_errors [col, `Deserialization_error (f, v)]) | Expected_non_null_column col -> - Ppx_mysql_runtime.Stdlib.Result.Error (`Expected_non_null_column col) + Ppx_mysql_runtime.Stdlib.Result.Error + (`Column_errors [col, `Expected_non_null_value]) else Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 2))) [@warning "-38"]) [@warning "-38"] @@ -203,9 +209,11 @@ let test_one_input_params dbh ~(id : int) = with Invalid_argument _ -> raise (Expected_non_null_column "name") ) with | Deserialization_error (col, f, v) -> - Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (col, f, v)) + Ppx_mysql_runtime.Stdlib.Result.Error + (`Column_errors [col, `Deserialization_error (f, v)]) | Expected_non_null_column col -> - Ppx_mysql_runtime.Stdlib.Result.Error (`Expected_non_null_column col) + Ppx_mysql_runtime.Stdlib.Result.Error + (`Column_errors [col, `Expected_non_null_value]) else Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 1))) [@warning "-38"]) [@warning "-38"] @@ -278,9 +286,11 @@ let test_two_input_pair_output_params dbh ~(id : int) ~(name : string) = with Invalid_argument _ -> raise (Expected_non_null_column "name") ) with | Deserialization_error (col, f, v) -> - Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (col, f, v)) + Ppx_mysql_runtime.Stdlib.Result.Error + (`Column_errors [col, `Deserialization_error (f, v)]) | Expected_non_null_column col -> - Ppx_mysql_runtime.Stdlib.Result.Error (`Expected_non_null_column col) + Ppx_mysql_runtime.Stdlib.Result.Error + (`Column_errors [col, `Expected_non_null_value]) else Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 2))) [@warning "-38"]) [@warning "-38"] @@ -350,9 +360,11 @@ let test_select_all dbh = with Invalid_argument _ -> raise (Expected_non_null_column "name") ) with | Deserialization_error (col, f, v) -> - Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (col, f, v)) + Ppx_mysql_runtime.Stdlib.Result.Error + (`Column_errors [col, `Deserialization_error (f, v)]) | Expected_non_null_column col -> - Ppx_mysql_runtime.Stdlib.Result.Error (`Expected_non_null_column col) + Ppx_mysql_runtime.Stdlib.Result.Error + (`Column_errors [col, `Expected_non_null_value]) else Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 2))) [@warning "-38"]) [@warning "-38"] @@ -421,9 +433,11 @@ let test_repeated_input_params dbh ~(id : int) = with Invalid_argument _ -> raise (Expected_non_null_column "name") ) with | Deserialization_error (col, f, v) -> - Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (col, f, v)) + Ppx_mysql_runtime.Stdlib.Result.Error + (`Column_errors [col, `Deserialization_error (f, v)]) | Expected_non_null_column col -> - Ppx_mysql_runtime.Stdlib.Result.Error (`Expected_non_null_column col) + Ppx_mysql_runtime.Stdlib.Result.Error + (`Column_errors [col, `Expected_non_null_value]) else Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 2))) [@warning "-38"]) [@warning "-38"] @@ -489,9 +503,11 @@ let test_select_opt dbh ~(id : int) = with Invalid_argument _ -> raise (Expected_non_null_column "name") ) with | Deserialization_error (col, f, v) -> - Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (col, f, v)) + Ppx_mysql_runtime.Stdlib.Result.Error + (`Column_errors [col, `Deserialization_error (f, v)]) | Expected_non_null_column col -> - Ppx_mysql_runtime.Stdlib.Result.Error (`Expected_non_null_column col) + Ppx_mysql_runtime.Stdlib.Result.Error + (`Column_errors [col, `Expected_non_null_value]) else Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 2))) [@warning "-38"]) [@warning "-38"] @@ -538,9 +554,11 @@ let test_execute dbh ~(id : int) = then try Ppx_mysql_runtime.Stdlib.Result.Ok () with | Deserialization_error (col, f, v) -> - Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (col, f, v)) + Ppx_mysql_runtime.Stdlib.Result.Error + (`Column_errors [col, `Deserialization_error (f, v)]) | Expected_non_null_column col -> - Ppx_mysql_runtime.Stdlib.Result.Error (`Expected_non_null_column col) + Ppx_mysql_runtime.Stdlib.Result.Error + (`Column_errors [col, `Expected_non_null_value]) else Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 0))) [@warning "-38"]) [@warning "-38"] @@ -597,9 +615,11 @@ let test_int dbh ~(a : int) ~(b : int option) = (Ppx_mysql_runtime.Stdlib.Array.get row 1) ) with | Deserialization_error (col, f, v) -> - Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (col, f, v)) + Ppx_mysql_runtime.Stdlib.Result.Error + (`Column_errors [col, `Deserialization_error (f, v)]) | Expected_non_null_column col -> - Ppx_mysql_runtime.Stdlib.Result.Error (`Expected_non_null_column col) + Ppx_mysql_runtime.Stdlib.Result.Error + (`Column_errors [col, `Expected_non_null_value]) else Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 2))) [@warning "-38"]) [@warning "-38"] @@ -668,9 +688,11 @@ let test_int32 dbh ~(a : int32) ~(b : int32 option) = (Ppx_mysql_runtime.Stdlib.Array.get row 1) ) with | Deserialization_error (col, f, v) -> - Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (col, f, v)) + Ppx_mysql_runtime.Stdlib.Result.Error + (`Column_errors [col, `Deserialization_error (f, v)]) | Expected_non_null_column col -> - Ppx_mysql_runtime.Stdlib.Result.Error (`Expected_non_null_column col) + Ppx_mysql_runtime.Stdlib.Result.Error + (`Column_errors [col, `Expected_non_null_value]) else Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 2))) [@warning "-38"]) [@warning "-38"] @@ -739,9 +761,11 @@ let test_int64 dbh ~(a : int64) ~(b : int64 option) = (Ppx_mysql_runtime.Stdlib.Array.get row 1) ) with | Deserialization_error (col, f, v) -> - Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (col, f, v)) + Ppx_mysql_runtime.Stdlib.Result.Error + (`Column_errors [col, `Deserialization_error (f, v)]) | Expected_non_null_column col -> - Ppx_mysql_runtime.Stdlib.Result.Error (`Expected_non_null_column col) + Ppx_mysql_runtime.Stdlib.Result.Error + (`Column_errors [col, `Expected_non_null_value]) else Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 2))) [@warning "-38"]) [@warning "-38"] @@ -810,9 +834,11 @@ let test_bool dbh ~(a : bool) ~(b : bool option) = (Ppx_mysql_runtime.Stdlib.Array.get row 1) ) with | Deserialization_error (col, f, v) -> - Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (col, f, v)) + Ppx_mysql_runtime.Stdlib.Result.Error + (`Column_errors [col, `Deserialization_error (f, v)]) | Expected_non_null_column col -> - Ppx_mysql_runtime.Stdlib.Result.Error (`Expected_non_null_column col) + Ppx_mysql_runtime.Stdlib.Result.Error + (`Column_errors [col, `Expected_non_null_value]) else Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 2))) [@warning "-38"]) [@warning "-38"] @@ -879,9 +905,11 @@ let test_string dbh ~(a : string) ~(b : string option) = (Ppx_mysql_runtime.Stdlib.Array.get row 1) ) with | Deserialization_error (col, f, v) -> - Ppx_mysql_runtime.Stdlib.Result.Error (`Deserialization_error (col, f, v)) + Ppx_mysql_runtime.Stdlib.Result.Error + (`Column_errors [col, `Deserialization_error (f, v)]) | Expected_non_null_column col -> - Ppx_mysql_runtime.Stdlib.Result.Error (`Expected_non_null_column col) + Ppx_mysql_runtime.Stdlib.Result.Error + (`Column_errors [col, `Expected_non_null_value]) else Ppx_mysql_runtime.Stdlib.Result.Error (`Unexpected_number_of_columns (len_row, 2))) [@warning "-38"]) [@warning "-38"]