-
Notifications
You must be signed in to change notification settings - Fork 0
/
run.scm
73 lines (62 loc) · 1.6 KB
/
run.scm
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
(cond-expand
(chicken-4
(use sqlite3pth lolevel)
(import chicken))
(else
(import sqlite3pth)
(import (chicken memory))))
;; Backing-store is a string of 8x4096 bytes only.
(define-values (vfsfile backing-store)
(let* ((bsz 4096)
(fszmx (* bsz 8))
(store (cons 0 (make-string fszmx #\x0))))
(define fsz car) (define fsz! set-car!) (define fbuf cdr)
(values
(make-vfs
store
(lambda (_) bsz)
(lambda (store) (fsz store))
(lambda (store to n off) ;; read
(move-memory! (fbuf store) to n off 0)
(if (< (fsz store) (+ n off)) 'SQLITE_IOERR_SHORT_READ 'SQLITE_OK))
(lambda (store from n off) ;; write
(fsz! store (max (fsz store) (+ n off)))
(move-memory! from (fbuf store) n 0 off)
'SQLITE_OK)
(lambda (store n) (fsz! store (min (fsz store) n)) 'SQLITE_OK)
(lambda (store) #t))
store)))
(define db
(sqlite3-open-restricted
"/tmp/db"
"askemos"
vfsfile))
(sqlite3-exec db "create table pairs (a integer, d integer)")
(define (xkns a b) (sqlite3-exec db "insert into pairs values(?1, ?2)" a b))
(xkns 1 2)
(xkns 1 3)
(xkns 3 4)
(assert
(equal?
(sql-fold
(sqlite3-exec db "select * from pairs")
(lambda (column initial) `((,(column 0) . ,(column 1)) . ,initial))
'())
'((3 . 4) (1 . 3) (1 . 2))))
(assert
(= (sql-ref
(sqlite3-exec db "select * from pairs where a = ?1" 3)
0 "d")
4))
;; Close and reopen...
(sqlite3-close db)
(set! db
(sqlite3-open-restricted
"/tmp/db"
"askemos"
vfsfile))
(assert
(= (sql-ref
(sqlite3-exec db "select * from pairs where a = ?1" 3)
0 1)
4))