blob: 576d6cdd0cdf59ebfe9e9be4659a50729d7a60d5 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
;;; Database helpers
;;;
;;; These functions should have been a part of guile-dbi. Never too
;;; late to contribute upstream!
(define-module (dump sql)
#:use-module (srfi srfi-26)
#:use-module (ice-9 match)
#:use-module (dbi dbi)
#:export (call-with-database
sql-exec
sql-fold
sql-map
sql-for-each
sql-find))
(define (call-with-database backend connection-string proc)
(let ((db #f))
(dynamic-wind (lambda ()
(set! db (dbi-open backend connection-string)))
(cut proc db)
(cut dbi-close db))))
(define (database-check-status db)
(match (dbi-get_status db)
((code . str)
(unless (zero? code)
(error str)))))
(define (sql-exec db statement)
(dbi-query db statement)
(database-check-status db))
(define (sql-fold proc init db statement)
(sql-exec db statement)
(let loop ((result init))
(let ((row (dbi-get_row db)))
(if row
(loop (proc row result))
result))))
(define (sql-map proc db statement)
(sql-fold (lambda (row result)
(cons (proc row) result))
(list) db statement))
(define (sql-for-each proc db statement)
(sql-fold (lambda (row _)
(proc row))
#f db statement))
(define (sql-find db statement)
(sql-exec db statement)
(dbi-get_row db))
|