You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
2.8 KiB
84 lines
2.8 KiB
(*
|
|
* Copyright (c) 2017-present, Facebook, Inc.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*)
|
|
|
|
open! IStd
|
|
|
|
(** The functions in this module tend to raise more often than their counterparts in [Sqlite3]. In
|
|
particular, they may raise if the [Sqlite3.Rc.t] result of certain operations is unexpected. *)
|
|
exception Error of string
|
|
|
|
val check_result_code : ?fatal:bool -> Sqlite3.db -> log:string -> Sqlite3.Rc.t -> unit
|
|
(** Assert that the result is either [Sqlite3.Rc.OK] or [Sqlite3.Rc.ROW]. If the result is not
|
|
valid, then if [fatal] is set raise {!Error}, otherwise log the error and proceed. *)
|
|
|
|
val exec : Sqlite3.db -> log:string -> stmt:string -> unit
|
|
(** Execute the given Sqlite [stmt] and check the result with {!check_result_code ~fatal:true}. *)
|
|
|
|
val finalize : Sqlite3.db -> log:string -> Sqlite3.stmt -> unit
|
|
(** Finalize the given [stmt]. Raises {!Error} on failure. *)
|
|
|
|
val result_fold_rows :
|
|
?finalize:bool
|
|
-> Sqlite3.db
|
|
-> log:string
|
|
-> Sqlite3.stmt
|
|
-> init:'a
|
|
-> f:('a -> Sqlite3.stmt -> 'a)
|
|
-> 'a
|
|
(** Fold [f] over each row of the result. [f] must not access the database. *)
|
|
|
|
val result_fold_single_column_rows :
|
|
?finalize:bool
|
|
-> Sqlite3.db
|
|
-> log:string
|
|
-> Sqlite3.stmt
|
|
-> init:'b
|
|
-> f:('b -> Sqlite3.Data.t -> 'b)
|
|
-> 'b
|
|
(** Like {!result_fold_rows} but pass column 0 of each row in the results to [f]. *)
|
|
|
|
val result_option :
|
|
?finalize:bool
|
|
-> Sqlite3.db
|
|
-> log:string
|
|
-> read_row:(Sqlite3.stmt -> 'a)
|
|
-> Sqlite3.stmt
|
|
-> 'a option
|
|
(** Same as {!result_fold_rows} but asserts that at most one row is returned. *)
|
|
|
|
val result_single_column_option :
|
|
?finalize:bool -> Sqlite3.db -> log:string -> Sqlite3.stmt -> Sqlite3.Data.t option
|
|
(** Same as {!result_fold_single_column_rows} but asserts that at most one row is returned. *)
|
|
|
|
val result_unit : ?finalize:bool -> Sqlite3.db -> log:string -> Sqlite3.stmt -> unit
|
|
(** Same as {!result_fold_rows} but asserts that no row is returned. *)
|
|
|
|
val db_close : Sqlite3.db -> unit
|
|
(** Close the given database and asserts that it was effective. Raises {!Error} if not. *)
|
|
|
|
val with_transaction : Sqlite3.db -> f:(unit -> unit) -> unit
|
|
(** Execute [f] within an explicit sqlite transaction. *)
|
|
|
|
(** An API commonly needed to store and retrieve objects from the database *)
|
|
module type Data = sig
|
|
type t
|
|
|
|
val serialize : t -> Sqlite3.Data.t
|
|
|
|
val deserialize : Sqlite3.Data.t -> t
|
|
end
|
|
|
|
(** A default implementation of the Data API that encodes every objects as marshalled blobs *)
|
|
module MarshalledData (D : sig
|
|
type t
|
|
end) : Data with type t = D.t
|
|
|
|
(** A default implementation of the Data API that encodes None as a NULL SQLite value *)
|
|
module MarshalledNullableData (D : sig
|
|
type t
|
|
end) : Data with type t = D.t option
|