SHI1485
SHI1485

Reputation: 121

Sqlite with OCaml

I'm sorry for my bad english if somethig is not clear please ask me and I will explain. My goal is make back end in OCaml for start to "play seriusly" with this language, I chose to do beck end project because I wanna make front end too in React for improve my skill with React too (I use OCaml for passion, and Ract for job I'm web developer)

I chose sqlite (with this lib: http://mmottl.github.io/sqlite3-ocaml/api/Sqlite3.html) as db for avoid db configuration

I have idea to make little wrapper for db calls(so if I chose to change db type I just need to change it), and make a function like this:

val exec_query : query -> 'a List Deferred.t = <fun>

but in lib I see this signature for exec function:

val exec : db -> ?cb:(row -> headers -> unit) -> string -> Rc.t = <fun>

The result is passed row by row to callback, but for my purpose I think I need to have some kind of object (list, array, etc.), but I have no idea how to make it from this function.

Can someone suggest how to proceed?

Upvotes: 3

Views: 780

Answers (1)

ChriS
ChriS

Reputation: 606

I guess you want val exec_query : query -> row List Deferred.t. Since Sqlite3 does not know about Async, you want to execute the call returning the list of rows in a separate system thread. The function In_thread.run : (unit -> 'a) -> 'a Deferred.t (optional args removed from signature) is the function to use for that. Thus you want to write (untested):

let exec_query db query =
  let rows_of_query () =
    let rows = ref [] in
    let rc = Sqlite3.exec_no_headers db query
                ~cb:(fun r -> rows := r :: !rows) in
    (* Note: you want to use result to handle errors *)
    !rows in
  In_thread.run rows_of_query

Upvotes: 4

Related Questions