package mssql
Install
    
    dune-project
 Dependency
Authors
Maintainers
Sources
sha256=dd957434ffc0c4e571476a9b3459518755c6799992eeff9c7bbd9b4cb23e9f43
    
    
  sha512=f837a7552013660fcf489286756ea53fcd94918f11cf638215d41f671b34e38ee08b554a8bcdef9d913532e1845095533a27a3798e2af57ac8e01ebd87682c7f
    
    
  doc/README.html
Mssql is an Async OCaml SQL Server library, currently using FreeTDS.
Features
- Queries run in a background thread and play nicely with Async (assuming you're pinning 
freetdsso it releases the runtime lock) - Supports single connections or connection pools
 - Supports automatic conversions for common data types
 - Supports parameterized queries (although internally it's not very nice; we parse the query for $ parameters and then insert quoted params)
 - We have workarounds for FreeTDS madness, like how there's no simple way to know what date format FreeTDS was configured with
 - Intellegently handles concurrent usage for both executing queries and with transactions
 - Heavily tested
 
Regarding concurrent usage, the following code is safe:
let%map res1 = Mssql.execute db "SELECT * FROM table_a"
and res2 = Mssql.execute db "SELECT * FROM table_b"
in
...Since we don't support actual concurrency, this will run one query and then the other (order is not defined).
This is also safe and will never cause a duplicate primary key error, since we prevent concurrent usage of a connection outside of a transactio if a transaction is in progress on that connection:
Mssql.execute_unit "CREATE TABLE x (id INT PRIMARY KEY)"
>>= fun () ->
let%map () =
  Mssql.with_transaction db (fun db ->
    Mssql.execute_unit db "INSERT INTO x (id) VALUES (1)"
    >>= fun ()->
    Mssql.execute_unit db ~params:Mssql.Param.[Some (Int 1)]
      "DELETE FROM x WHERE id = $1")
and Mssql.execute db "INSERT INTO x (id) VALUES (1)"Obviously this only works if we know about the transaction, so using Mssql.begin_transaction or Mssql.execute_unit "begin" won't have this feature.
Contributions
This library is heavily optimized for our use-case, but we would love to see contributions to:
- Support Lwt and blocking IO
 - Support parameterized queries in a better way
 - Switch to pure OCaml and not use FreeTDS
 
This is not an exhaustive list -- feel free to create an issue if you're considering making a new feature and want to know if we'll accept it, or just open a pull request.
Installation
You can find mssql on opam:
opam install mssqlOr you can pin this repo if you want:
opam pin add mssql https://github.com/arenadotio/ocaml-mssql.gitUsage
The tests are full of examples and you can find documentation here.
Example
Mssql.with_conn ~host ~db ~user ~password (fun db ->
  Mssql.execute_unit db
    "CREATE TABLE example (id INT NOT NULL, value INT NOT NULL)"
  >>= fun () ->
  Mssql.execute_unit db "INSERT INTO example (id, value) VALUES (1, 2)"
  >>= fun () ->
  Mssql.execute db ~params:Mssql.Param.[Some (Int 1)]
    "SELECT id FROM example WHERE id = $1"
  >>| function
  | [ row ] ->
    let id = Mssql.Row.int_exn row "id"
    and value = Mssql.Row.int_exn row "value" in
    printf "Got row with id=%d value=%d" id value
  | _ -> assert false)