Skip to content

Commit 8b39b74

Browse files
committed
Show Sqlite error message on failure
1 parent ddc3601 commit 8b39b74

File tree

2 files changed

+45
-45
lines changed

2 files changed

+45
-45
lines changed

lib/dao.ml

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@ let create db =
2525
rc INTEGER NOT NULL,
2626
parent TEXT,
2727
FOREIGN KEY (parent) REFERENCES builds (id) ON DELETE RESTRICT
28-
) |} |> Db.or_fail ~cmd:"create builds";
28+
) |} |> Db.or_fail db ~cmd:"create builds";
2929
Sqlite3.exec db {| CREATE INDEX IF NOT EXISTS lru
30-
ON builds (rc, used) |} |> Db.or_fail ~cmd:"create lru index";
30+
ON builds (rc, used) |} |> Db.or_fail db ~cmd:"create lru index";
3131
let begin_transaction = Sqlite3.prepare db "BEGIN TRANSACTION" in
3232
let commit = Sqlite3.prepare db "COMMIT" in
3333
let rollback = Sqlite3.prepare db {| ROLLBACK |} in
@@ -44,30 +44,30 @@ let create db =
4444
{ db; begin_transaction; commit; rollback; add; set_used; update_rc; exists; children; delete; lru; parent }
4545

4646
let with_transaction t fn =
47-
Db.exec t.begin_transaction [];
47+
Db.exec t.db t.begin_transaction [];
4848
match fn () with
49-
| x -> Db.exec t.commit []; x
50-
| exception ex -> Db.exec t.rollback []; raise ex
49+
| x -> Db.exec t.db t.commit []; x
50+
| exception ex -> Db.exec t.db t.rollback []; raise ex
5151

5252
let add ?parent ~id ~now t =
5353
let now = format_timestamp now in
5454
match parent with
55-
| None -> Db.exec t.add Sqlite3.Data.[ TEXT id; TEXT now; TEXT now; NULL ];
55+
| None -> Db.exec t.db t.add Sqlite3.Data.[ TEXT id; TEXT now; TEXT now; NULL ];
5656
| Some parent ->
5757
with_transaction t (fun () ->
58-
Db.exec t.add Sqlite3.Data.[ TEXT id; TEXT now; TEXT now; TEXT parent ];
59-
Db.exec t.update_rc Sqlite3.Data.[ INT 1L; TEXT parent ];
58+
Db.exec t.db t.add Sqlite3.Data.[ TEXT id; TEXT now; TEXT now; TEXT parent ];
59+
Db.exec t.db t.update_rc Sqlite3.Data.[ INT 1L; TEXT parent ];
6060
)
6161

6262
let set_used ~id ~now t =
6363
let now = format_timestamp now in
64-
Db.exec t.set_used Sqlite3.Data.[ TEXT now; TEXT id ]
64+
Db.exec t.db t.set_used Sqlite3.Data.[ TEXT now; TEXT id ]
6565

6666
let children t id =
67-
match Db.query_one t.exists Sqlite3.Data.[ TEXT id ] with
67+
match Db.query_one t.db t.exists Sqlite3.Data.[ TEXT id ] with
6868
| [ INT 0L ] -> Error `No_such_id
6969
| [ INT 1L ] ->
70-
Db.query t.children Sqlite3.Data.[ TEXT id ] |> List.map (function
70+
Db.query t.db t.children Sqlite3.Data.[ TEXT id ] |> List.map (function
7171
| Sqlite3.Data.[ TEXT dep ] -> dep
7272
| x -> Fmt.failwith "Invalid row: %a" Db.dump_row x
7373
)
@@ -76,31 +76,31 @@ let children t id =
7676

7777
let delete t id =
7878
with_transaction t (fun () ->
79-
match Db.query_one t.parent Sqlite3.Data.[ TEXT id ] with
79+
match Db.query_one t.db t.parent Sqlite3.Data.[ TEXT id ] with
8080
| [ TEXT parent ] ->
81-
Db.exec t.delete Sqlite3.Data.[ TEXT id ];
82-
Db.exec t.update_rc Sqlite3.Data.[ INT (-1L); TEXT parent ]
81+
Db.exec t.db t.delete Sqlite3.Data.[ TEXT id ];
82+
Db.exec t.db t.update_rc Sqlite3.Data.[ INT (-1L); TEXT parent ]
8383
| [ NULL ] ->
84-
Db.exec t.delete Sqlite3.Data.[ TEXT id ]
84+
Db.exec t.db t.delete Sqlite3.Data.[ TEXT id ]
8585
| x -> Fmt.failwith "Invalid row: %a" Db.dump_row x
8686
)
8787

8888
let lru t ~before n =
89-
Db.query t.lru Sqlite3.Data.[ TEXT (format_timestamp before); INT (Int64.of_int n) ]
89+
Db.query t.db t.lru Sqlite3.Data.[ TEXT (format_timestamp before); INT (Int64.of_int n) ]
9090
|> List.map @@ function
9191
| Sqlite3.Data.[ TEXT id ] -> id
9292
| x -> Fmt.failwith "Invalid row: %a" Db.dump_row x
9393

9494
let close t =
95-
Sqlite3.finalize t.begin_transaction |> Db.or_fail ~cmd:"finalize";
96-
Sqlite3.finalize t.commit |> Db.or_fail ~cmd:"finalize";
97-
Sqlite3.finalize t.rollback |> Db.or_fail ~cmd:"finalize";
98-
Sqlite3.finalize t.add |> Db.or_fail ~cmd:"finalize";
99-
Sqlite3.finalize t.set_used |> Db.or_fail ~cmd:"finalize";
100-
Sqlite3.finalize t.update_rc |> Db.or_fail ~cmd:"finalize";
101-
Sqlite3.finalize t.exists |> Db.or_fail ~cmd:"finalize";
102-
Sqlite3.finalize t.children |> Db.or_fail ~cmd:"finalize";
103-
Sqlite3.finalize t.delete |> Db.or_fail ~cmd:"finalize";
104-
Sqlite3.finalize t.lru |> Db.or_fail ~cmd:"finalize";
105-
Sqlite3.finalize t.parent |> Db.or_fail ~cmd:"finalize";
95+
Sqlite3.finalize t.begin_transaction |> Db.or_fail t.db ~cmd:"finalize";
96+
Sqlite3.finalize t.commit |> Db.or_fail t.db ~cmd:"finalize";
97+
Sqlite3.finalize t.rollback |> Db.or_fail t.db ~cmd:"finalize";
98+
Sqlite3.finalize t.add |> Db.or_fail t.db ~cmd:"finalize";
99+
Sqlite3.finalize t.set_used |> Db.or_fail t.db ~cmd:"finalize";
100+
Sqlite3.finalize t.update_rc |> Db.or_fail t.db ~cmd:"finalize";
101+
Sqlite3.finalize t.exists |> Db.or_fail t.db ~cmd:"finalize";
102+
Sqlite3.finalize t.children |> Db.or_fail t.db ~cmd:"finalize";
103+
Sqlite3.finalize t.delete |> Db.or_fail t.db ~cmd:"finalize";
104+
Sqlite3.finalize t.lru |> Db.or_fail t.db ~cmd:"finalize";
105+
Sqlite3.finalize t.parent |> Db.or_fail t.db ~cmd:"finalize";
106106
Db.close t.db

lib/db.ml

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,52 @@
11
type t = Sqlite3.db
22

3-
let or_fail ~cmd x =
3+
let or_fail db ~cmd x =
44
match x with
55
| Sqlite3.Rc.OK -> ()
6-
| err -> Fmt.failwith "Sqlite3: %s (executing %S)" (Sqlite3.Rc.to_string err) cmd
6+
| err -> Fmt.failwith "Sqlite3: [%s] %s (executing %S)" (Sqlite3.Rc.to_string err) (Sqlite3.errmsg db) cmd
77

88
let no_callback _ = failwith "[exec] used with a query!"
99

10-
let exec_stmt ?(cb=no_callback) stmt =
10+
let exec_stmt db ?(cb=no_callback) stmt =
1111
let rec loop () =
1212
match Sqlite3.step stmt with
1313
| Sqlite3.Rc.DONE -> ()
1414
| Sqlite3.Rc.ROW ->
1515
let cols = Sqlite3.data_count stmt in
1616
cb @@ List.init cols (fun i -> Sqlite3.column stmt i);
1717
loop ()
18-
| x -> Fmt.failwith "Sqlite3 exec error: %s" (Sqlite3.Rc.to_string x)
18+
| x -> Fmt.failwith "Sqlite3 exec error: [%s] %s" (Sqlite3.Rc.to_string x) (Sqlite3.errmsg db)
1919
in
2020
loop ()
2121

2222
let exec_literal db sql =
23-
Sqlite3.exec db sql |> or_fail ~cmd:sql
23+
Sqlite3.exec db sql |> or_fail db ~cmd:sql
2424

25-
let bind stmt values =
26-
Sqlite3.reset stmt |> or_fail ~cmd:"reset";
27-
List.iteri (fun i v -> Sqlite3.bind stmt (i + 1) v |> or_fail ~cmd:"bind") values
25+
let bind db stmt values =
26+
Sqlite3.reset stmt |> or_fail db ~cmd:"reset";
27+
List.iteri (fun i v -> Sqlite3.bind stmt (i + 1) v |> or_fail db ~cmd:"bind") values
2828

29-
let exec stmt values =
30-
bind stmt values;
31-
exec_stmt stmt
29+
let exec db stmt values =
30+
bind db stmt values;
31+
exec_stmt db stmt
3232

33-
let query stmt values =
34-
bind stmt values;
33+
let query db stmt values =
34+
bind db stmt values;
3535
let results = ref [] in
3636
let cb row =
3737
results := row :: !results
3838
in
39-
exec_stmt ~cb stmt;
39+
exec_stmt db ~cb stmt;
4040
List.rev !results
4141

42-
let query_one stmt values =
43-
match query stmt values with
42+
let query_one db stmt values =
43+
match query db stmt values with
4444
| [row] -> row
4545
| [] -> failwith "No results from SQL query!"
4646
| _ -> failwith "Multiple results from SQL query!"
4747

48-
let query_some stmt values =
49-
match query stmt values with
48+
let query_some db stmt values =
49+
match query db stmt values with
5050
| [] -> None
5151
| [row] -> Some row
5252
| _ -> failwith "Multiple results from SQL query!"

0 commit comments

Comments
 (0)