Artifact 4bb86b5c646a49f44f24982c375ee147500808da:
- File sqlite3.sls — part of check-in [538cf8286e] at 2019-04-11 18:15:56 on branch trunk — add sql field to sqlite3 statement (user: aldo size: 30080)
0000: 3b 3b 3b 3b 20 73 71 6c 69 74 65 33 2e 73 63 6d ;;;; sqlite3.scm 0010: 0a 3b 3b 3b 3b 20 3a 74 61 62 53 69 7a 65 3d 32 .;;;; :tabSize=2 0020: 3a 69 6e 64 65 6e 74 53 69 7a 65 3d 32 3a 6e 6f :indentSize=2:no 0030: 54 61 62 73 3d 74 72 75 65 3a 0a 3b 3b 3b 3b 20 Tabs=true:.;;;; 0040: 62 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 65 20 bindings to the 0050: 53 51 4c 69 74 65 33 20 64 61 74 61 62 61 73 65 SQLite3 database 0060: 20 6c 69 62 72 61 72 79 0a 0a 23 21 63 68 65 7a library..#!chez 0070: 73 63 68 65 6d 65 0a 28 6c 69 62 72 61 72 79 0a scheme.(library. 0080: 20 28 73 71 6c 69 74 65 33 29 0a 20 28 65 78 70 (sqlite3). (exp 0090: 6f 72 74 0a 20 20 3b 3b 20 70 72 6f 63 65 64 75 ort. ;; procedu 00a0: 72 65 73 0a 20 20 6f 70 65 6e 2d 64 61 74 61 62 res. open-datab 00b0: 61 73 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 ase. 00c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 00d0: 20 20 20 20 20 20 20 20 20 20 20 20 3b 64 65 66 ;def 00e0: 69 6e 65 2d 63 6f 6c 6c 61 74 69 6f 6e 0a 20 20 ine-collation. 00f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0110: 20 20 20 20 20 20 3b 64 65 66 69 6e 65 2d 66 75 ;define-fu 0120: 6e 63 74 69 6f 6e 0a 20 20 73 65 74 2d 62 75 73 nction. set-bus 0130: 79 2d 68 61 6e 64 6c 65 72 21 0a 20 20 20 20 20 y-handler!. 0140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0160: 20 20 20 3b 6d 61 6b 65 2d 62 75 73 79 2d 74 69 ;make-busy-ti 0170: 6d 65 6f 75 74 0a 20 20 73 71 6c 69 74 65 33 2d meout. sqlite3- 0180: 62 75 73 79 2d 74 69 6d 65 6f 75 74 0a 20 20 69 busy-timeout. i 0190: 6e 74 65 72 72 75 70 74 21 0a 20 20 61 75 74 6f nterrupt!. auto 01a0: 2d 63 6f 6d 6d 69 74 74 69 6e 67 3f 0a 20 20 63 -committing?. c 01b0: 68 61 6e 67 65 2d 63 6f 75 6e 74 0a 20 20 6c 61 hange-count. la 01c0: 73 74 2d 69 6e 73 65 72 74 2d 72 6f 77 69 64 0a st-insert-rowid. 01d0: 20 20 66 69 6e 61 6c 69 7a 65 21 0a 20 20 70 72 finalize!. pr 01e0: 65 70 61 72 65 0a 20 20 73 6f 75 72 63 65 2d 73 epare. source-s 01f0: 71 6c 0a 20 20 72 65 73 65 74 21 0a 20 20 62 69 ql. reset!. bi 0200: 6e 64 2d 70 61 72 61 6d 65 74 65 72 2d 63 6f 75 nd-parameter-cou 0210: 6e 74 0a 20 20 62 69 6e 64 2d 70 61 72 61 6d 65 nt. bind-parame 0220: 74 65 72 2d 69 6e 64 65 78 0a 20 20 62 69 6e 64 ter-index. bind 0230: 2d 70 61 72 61 6d 65 74 65 72 2d 6e 61 6d 65 0a -parameter-name. 0240: 20 20 62 69 6e 64 21 0a 20 20 62 69 6e 64 2d 70 bind!. bind-p 0250: 61 72 61 6d 65 74 65 72 73 21 0a 20 20 73 74 65 arameters!. ste 0260: 70 21 0a 20 20 63 6f 6c 75 6d 6e 2d 63 6f 75 6e p!. column-coun 0270: 74 0a 20 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 0a t. column-type. 0280: 20 20 63 6f 6c 75 6d 6e 2d 64 65 63 6c 61 72 65 column-declare 0290: 64 2d 74 79 70 65 0a 20 20 63 6f 6c 75 6d 6e 2d d-type. column- 02a0: 6e 61 6d 65 0a 20 20 63 6f 6c 75 6d 6e 2d 64 61 name. column-da 02b0: 74 61 0a 20 20 63 61 6c 6c 2d 77 69 74 68 2d 74 ta. call-with-t 02c0: 65 6d 70 6f 72 61 72 79 2d 73 74 61 74 65 6d 65 emporary-stateme 02d0: 6e 74 73 0a 20 20 65 78 65 63 75 74 65 0a 20 20 nts. execute. 02e0: 75 70 64 61 74 65 0a 20 20 66 69 72 73 74 2d 72 update. first-r 02f0: 65 73 75 6c 74 0a 20 20 66 69 72 73 74 2d 72 6f esult. first-ro 0300: 77 0a 20 20 66 6f 6c 64 2d 72 6f 77 0a 20 20 66 w. fold-row. f 0310: 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20 20 6d 61 or-each-row. ma 0320: 70 2d 72 6f 77 0a 20 20 77 69 74 68 2d 74 72 61 p-row. with-tra 0330: 6e 73 61 63 74 69 6f 6e 0a 20 20 73 71 6c 2d 63 nsaction. sql-c 0340: 6f 6d 70 6c 65 74 65 3f 0a 20 20 64 61 74 61 62 omplete?. datab 0350: 61 73 65 2d 76 65 72 73 69 6f 6e 0a 20 20 64 61 ase-version. da 0360: 74 61 62 61 73 65 2d 6d 65 6d 6f 72 79 2d 75 73 tabase-memory-us 0370: 65 64 0a 20 20 64 61 74 61 62 61 73 65 2d 6d 65 ed. database-me 0380: 6d 6f 72 79 2d 68 69 67 68 77 61 74 65 72 0a 20 mory-highwater. 0390: 20 65 6e 61 62 6c 65 2d 73 68 61 72 65 64 2d 63 enable-shared-c 03a0: 61 63 68 65 21 0a 20 20 65 6e 61 62 6c 65 2d 6c ache!. enable-l 03b0: 6f 61 64 2d 65 78 74 65 6e 73 69 6f 6e 21 0a 0a oad-extension!.. 03c0: 20 20 73 71 6c 69 74 65 33 2d 74 72 61 63 65 0a sqlite3-trace. 03d0: 20 20 73 71 6c 69 74 65 33 2d 63 6f 6e 66 69 67 sqlite3-config 03e0: 2d 6c 6f 67 29 0a 0a 20 28 69 6d 70 6f 72 74 0a -log).. (import. 03f0: 20 20 28 63 68 65 7a 73 63 68 65 6d 65 29 0a 20 (chezscheme). 0400: 20 28 73 72 66 69 20 73 30 20 63 6f 6e 64 2d 65 (srfi s0 cond-e 0410: 78 70 61 6e 64 29 0a 20 20 28 73 72 66 69 20 73 xpand). (srfi s 0420: 32 20 61 6e 64 2d 6c 65 74 29 0a 20 20 28 6d 61 2 and-let). (ma 0430: 74 63 68 61 62 6c 65 29 0a 20 20 28 6f 6e 6c 79 tchable). (only 0440: 20 28 73 72 66 69 20 73 31 33 20 73 74 72 69 6e (srfi s13 strin 0450: 67 73 29 20 73 74 72 69 6e 67 2d 63 6f 6e 74 61 gs) string-conta 0460: 69 6e 73 2d 63 69 29 0a 20 20 28 73 72 66 69 20 ins-ci). (srfi 0470: 73 31 31 20 6c 65 74 2d 76 61 6c 75 65 73 29 0a s11 let-values). 0480: 20 20 28 73 72 66 69 20 73 32 36 20 63 75 74 29 (srfi s26 cut) 0490: 0a 20 20 28 73 71 6c 2d 6e 75 6c 6c 29 29 0a 0a . (sql-null)).. 04a0: 20 23 3b 28 64 65 66 69 6e 65 20 28 73 71 6c 69 #;(define (sqli 04b0: 74 65 33 2d 6c 69 62 72 61 72 79 2d 69 6e 69 74 te3-library-init 04c0: 29 29 0a 20 28 64 65 66 69 6e 65 20 6c 69 62 69 )). (define libi 04d0: 6e 69 74 0a 20 20 20 28 62 65 67 69 6e 0a 20 20 nit. (begin. 04e0: 20 20 20 28 63 61 73 65 20 28 6d 61 63 68 69 6e (case (machin 04f0: 65 2d 74 79 70 65 29 0a 20 20 20 20 20 20 20 5b e-type). [ 0500: 28 69 33 6e 74 20 61 36 6e 74 20 69 33 6d 77 20 (i3nt a6nt i3mw 0510: 61 36 6d 77 29 0a 09 28 6c 6f 61 64 2d 73 68 61 a6mw)..(load-sha 0520: 72 65 64 2d 6f 62 6a 65 63 74 20 22 73 71 6c 69 red-object "sqli 0530: 74 65 33 2e 64 6c 6c 22 29 5d 0a 20 20 20 20 20 te3.dll")]. 0540: 20 20 5b 65 6c 73 65 0a 09 28 6c 6f 61 64 2d 73 [else..(load-s 0550: 68 61 72 65 64 2d 6f 62 6a 65 63 74 20 22 6c 69 hared-object "li 0560: 62 73 71 6c 69 74 65 33 2e 73 6f 2e 30 22 29 5d bsqlite3.so.0")] 0570: 29 29 29 0a 20 3b 28 64 65 66 69 6e 65 20 6c 69 ))). ;(define li 0580: 62 69 6e 69 74 20 28 62 65 67 69 6e 20 28 6c 6f binit (begin (lo 0590: 61 64 2d 73 68 61 72 65 64 2d 6f 62 6a 65 63 74 ad-shared-object 05a0: 20 22 73 71 6c 69 74 65 33 2e 64 6c 6c 22 29 29 "sqlite3.dll")) 05b0: 29 0a 20 3b 3b 20 63 6f 6d 70 61 74 69 62 69 6c ). ;; compatibil 05c0: 69 74 79 20 66 75 6e 63 74 69 6f 6e 73 0a 20 28 ity functions. ( 05d0: 64 65 66 69 6e 65 20 28 68 61 73 68 74 61 62 6c define (hashtabl 05e0: 65 2d 77 61 6c 6b 20 68 74 20 66 29 0a 20 20 20 e-walk ht f). 05f0: 28 76 65 63 74 6f 72 2d 66 6f 72 2d 65 61 63 68 (vector-for-each 0600: 20 28 6c 61 6d 62 64 61 20 28 78 29 0a 20 20 20 (lambda (x). 0610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0620: 20 20 20 28 66 20 78 20 28 68 61 73 68 74 61 62 (f x (hashtab 0630: 6c 65 2d 72 65 66 20 68 74 20 78 20 23 66 29 29 le-ref ht x #f)) 0640: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ). 0650: 20 20 20 20 20 20 28 68 61 73 68 74 61 62 6c 65 (hashtable 0660: 2d 6b 65 79 73 20 68 74 29 29 29 0a 0a 20 28 64 -keys ht))).. (d 0670: 65 66 69 6e 65 20 28 2d 3e 73 74 72 69 6e 67 20 efine (->string 0680: 78 29 0a 20 20 20 28 77 69 74 68 2d 6f 75 74 70 x). (with-outp 0690: 75 74 2d 74 6f 2d 73 74 72 69 6e 67 20 28 6c 61 ut-to-string (la 06a0: 6d 62 64 61 20 28 29 20 28 64 69 73 70 6c 61 79 mbda () (display 06b0: 20 78 29 29 29 29 0a 0a 20 28 64 65 66 69 6e 65 x)))).. (define 06c0: 20 28 63 6f 6e 63 20 2e 20 61 72 67 73 29 0a 20 (conc . args). 06d0: 20 20 28 61 70 70 6c 79 20 73 74 72 69 6e 67 2d (apply string- 06e0: 61 70 70 65 6e 64 20 28 6d 61 70 20 2d 3e 73 74 append (map ->st 06f0: 72 69 6e 67 20 61 72 67 73 29 29 20 29 0a 0a 3b ring args)) )..; 0700: 3b 3b 20 46 6f 72 65 69 67 6e 20 74 79 70 65 73 ;; Foreign types 0710: 20 26 20 76 61 6c 75 65 73 0a 0a 20 3b 3b 20 45 & values.. ;; E 0720: 6e 75 6d 65 72 61 74 69 6f 6e 20 61 6e 64 20 63 numeration and c 0730: 6f 6e 73 74 61 6e 74 20 64 65 66 69 6e 69 74 69 onstant definiti 0740: 6f 6e 73 0a 20 28 64 65 66 69 6e 65 20 73 71 6c ons. (define sql 0750: 69 74 65 33 3a 73 74 61 74 75 73 0a 20 20 20 27 ite3:status. ' 0760: 28 28 6f 6b 20 20 20 20 20 20 20 20 20 2e 20 20 ((ok . 0770: 30 29 20 3b 20 53 75 63 63 65 73 73 66 75 6c 20 0) ; Successful 0780: 72 65 73 75 6c 74 20 28 23 66 3f 29 0a 20 20 20 result (#f?). 0790: 20 20 28 65 72 72 6f 72 20 20 20 20 20 20 2e 20 (error . 07a0: 20 31 29 20 3b 20 53 51 4c 20 65 72 72 6f 72 20 1) ; SQL error 07b0: 6f 72 20 6d 69 73 73 69 6e 67 20 64 61 74 61 62 or missing datab 07c0: 61 73 65 0a 20 20 20 20 20 28 69 6e 74 65 72 6e ase. (intern 07d0: 61 6c 20 20 20 2e 20 20 32 29 20 3b 20 4e 4f 54 al . 2) ; NOT 07e0: 20 55 53 45 44 2e 20 49 6e 74 65 72 6e 61 6c 20 USED. Internal 07f0: 6c 6f 67 69 63 20 65 72 72 6f 72 20 69 6e 20 53 logic error in S 0800: 51 4c 69 74 65 0a 20 20 20 20 20 28 70 65 72 6d QLite. (perm 0810: 69 73 73 69 6f 6e 20 2e 20 20 33 29 20 3b 20 41 ission . 3) ; A 0820: 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e ccess permission 0830: 20 64 65 6e 69 65 64 0a 20 20 20 20 20 28 61 62 denied. (ab 0840: 6f 72 74 20 20 20 20 20 20 2e 20 20 34 29 20 3b ort . 4) ; 0850: 20 43 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e Callback routin 0860: 65 20 72 65 71 75 65 73 74 65 64 20 61 6e 20 61 e requested an a 0870: 62 6f 72 74 0a 20 20 20 20 20 28 62 75 73 79 20 bort. (busy 0880: 20 20 20 20 20 20 2e 20 20 35 29 20 3b 20 54 68 . 5) ; Th 0890: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 e database file 08a0: 69 73 20 6c 6f 63 6b 65 64 0a 20 20 20 20 20 28 is locked. ( 08b0: 6c 6f 63 6b 65 64 20 20 20 20 20 2e 20 20 36 29 locked . 6) 08c0: 20 3b 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 ; A table in th 08d0: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f e database is lo 08e0: 63 6b 65 64 0a 20 20 20 20 20 28 6e 6f 2d 6d 65 cked. (no-me 08f0: 6d 6f 72 79 20 20 2e 20 20 37 29 20 3b 20 41 20 mory . 7) ; A 0900: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 0a malloc() failed. 0910: 20 20 20 20 20 28 72 65 61 64 2d 6f 6e 6c 79 20 (read-only 0920: 20 2e 20 20 38 29 20 3b 20 41 74 74 65 6d 70 74 . 8) ; Attempt 0930: 20 74 6f 20 77 72 69 74 65 20 61 20 72 65 61 64 to write a read 0940: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 0a 20 20 only database. 0950: 20 20 20 28 69 6e 74 65 72 72 75 70 74 20 20 2e (interrupt . 0960: 20 20 39 29 20 3b 20 4f 70 65 72 61 74 69 6f 6e 9) ; Operation 0970: 20 74 65 72 6d 69 6e 61 74 65 64 20 62 79 20 73 terminated by s 0980: 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 qlite3_interrupt 0990: 28 29 0a 20 20 20 20 20 28 69 6f 2d 65 72 72 6f (). (io-erro 09a0: 72 20 20 20 2e 20 31 30 29 20 3b 20 53 6f 6d 65 r . 10) ; Some 09b0: 20 6b 69 6e 64 20 6f 66 20 64 69 73 6b 20 49 2f kind of disk I/ 09c0: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 O error occurred 09d0: 0a 20 20 20 20 20 28 63 6f 72 72 75 70 74 20 20 . (corrupt 09e0: 20 20 2e 20 31 31 29 20 3b 20 54 68 65 20 64 61 . 11) ; The da 09f0: 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67 tabase disk imag 0a00: 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 0a 20 e is malformed. 0a10: 20 20 20 20 28 6e 6f 74 2d 66 6f 75 6e 64 20 20 (not-found 0a20: 2e 20 31 32 29 20 3b 20 4e 4f 54 20 55 53 45 44 . 12) ; NOT USED 0a30: 2e 20 54 61 62 6c 65 20 6f 72 20 72 65 63 6f 72 . Table or recor 0a40: 64 20 6e 6f 74 20 66 6f 75 6e 64 0a 20 20 20 20 d not found. 0a50: 20 28 66 75 6c 6c 20 20 20 20 20 20 20 2e 20 31 (full . 1 0a60: 33 29 20 3b 20 49 6e 73 65 72 74 69 6f 6e 20 66 3) ; Insertion f 0a70: 61 69 6c 65 64 20 62 65 63 61 75 73 65 20 64 61 ailed because da 0a80: 74 61 62 61 73 65 20 69 73 20 66 75 6c 6c 0a 20 tabase is full. 0a90: 20 20 20 20 28 63 61 6e 74 2d 6f 70 65 6e 20 20 (cant-open 0aa0: 2e 20 31 34 29 20 3b 20 55 6e 61 62 6c 65 20 74 . 14) ; Unable t 0ab0: 6f 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61 62 o open the datab 0ac0: 61 73 65 20 66 69 6c 65 0a 20 20 20 20 20 28 70 ase file. (p 0ad0: 72 6f 74 6f 63 6f 6c 20 20 20 2e 20 31 35 29 20 rotocol . 15) 0ae0: 3b 20 4e 4f 54 20 55 53 45 44 2e 20 44 61 74 61 ; NOT USED. Data 0af0: 62 61 73 65 20 6c 6f 63 6b 20 70 72 6f 74 6f 63 base lock protoc 0b00: 6f 6c 20 65 72 72 6f 72 0a 20 20 20 20 20 28 65 ol error. (e 0b10: 6d 70 74 79 20 20 20 20 20 20 2e 20 31 36 29 20 mpty . 16) 0b20: 3b 20 44 61 74 61 62 61 73 65 20 69 73 20 65 6d ; Database is em 0b30: 70 74 79 0a 20 20 20 20 20 28 73 63 68 65 6d 61 pty. (schema 0b40: 20 20 20 20 20 2e 20 31 37 29 20 3b 20 54 68 65 . 17) ; The 0b50: 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 database schema 0b60: 20 63 68 61 6e 67 65 64 0a 20 20 20 20 20 28 74 changed. (t 0b70: 6f 6f 2d 62 69 67 20 20 20 20 2e 20 31 38 29 20 oo-big . 18) 0b80: 20 3b 20 53 74 72 69 6e 67 20 6f 72 20 42 4c 4f ; String or BLO 0b90: 42 20 65 78 63 65 65 64 73 20 73 69 7a 65 20 6c B exceeds size l 0ba0: 69 6d 69 74 0a 20 20 20 20 20 28 63 6f 6e 73 74 imit. (const 0bb0: 72 61 69 6e 74 20 2e 20 31 39 29 20 3b 20 41 62 raint . 19) ; Ab 0bc0: 6f 72 74 20 64 75 65 20 74 6f 20 63 6f 6e 74 72 ort due to contr 0bd0: 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 0a 20 aint violation. 0be0: 20 20 20 20 28 6d 69 73 6d 61 74 63 68 20 20 20 (mismatch 0bf0: 2e 20 32 30 29 20 3b 20 44 61 74 61 20 74 79 70 . 20) ; Data typ 0c00: 65 20 6d 69 73 6d 61 74 63 68 0a 20 20 20 20 20 e mismatch. 0c10: 28 6d 69 73 75 73 65 20 20 20 20 20 2e 20 32 31 (misuse . 21 0c20: 29 20 3b 20 4c 69 62 72 61 72 79 20 75 73 65 64 ) ; Library used 0c30: 20 69 6e 63 6f 72 72 65 63 74 6c 79 0a 20 20 20 incorrectly. 0c40: 20 20 28 6e 6f 2d 6c 66 73 20 20 20 20 20 2e 20 (no-lfs . 0c50: 32 32 29 20 3b 20 55 73 65 73 20 4f 53 20 66 65 22) ; Uses OS fe 0c60: 61 74 75 72 65 73 20 6e 6f 74 20 73 75 70 70 6f atures not suppo 0c70: 72 74 65 64 20 6f 6e 20 68 6f 73 74 0a 20 20 20 rted on host. 0c80: 20 20 28 61 75 74 68 20 20 20 20 20 20 20 2e 20 (auth . 0c90: 32 33 29 20 3b 20 41 75 74 68 6f 72 69 7a 61 74 23) ; Authorizat 0ca0: 69 6f 6e 20 64 65 6e 69 65 64 0a 20 20 20 20 20 ion denied. 0cb0: 28 66 6f 72 6d 61 74 20 20 20 20 20 2e 20 32 34 (format . 24 0cc0: 29 20 3b 20 41 75 78 69 6c 69 61 72 79 20 64 61 ) ; Auxiliary da 0cd0: 74 61 62 61 73 65 20 66 6f 72 6d 61 74 20 65 72 tabase format er 0ce0: 72 6f 72 0a 20 20 20 20 20 28 72 61 6e 67 65 20 ror. (range 0cf0: 20 20 20 20 20 2e 20 32 35 29 20 3b 20 32 6e 64 . 25) ; 2nd 0d00: 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 73 71 parameter to sq 0d10: 6c 69 74 65 33 5f 62 69 6e 64 20 6f 75 74 20 6f lite3_bind out o 0d20: 66 20 72 61 6e 67 65 0a 20 20 20 20 20 28 6e 6f f range. (no 0d30: 74 2d 61 2d 64 62 20 20 20 2e 20 32 36 29 20 3b t-a-db . 26) ; 0d40: 20 46 69 6c 65 20 6f 70 65 6e 65 64 20 74 68 61 File opened tha 0d50: 74 20 69 73 20 6e 6f 74 20 61 20 64 61 74 61 62 t is not a datab 0d60: 61 73 65 20 66 69 6c 65 0a 20 20 20 20 20 28 6e ase file. (n 0d70: 6f 74 69 63 65 20 20 20 20 20 2e 20 32 37 29 20 otice . 27) 0d80: 3b 20 4e 6f 74 69 66 69 63 61 74 69 6f 6e 73 20 ; Notifications 0d90: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6c 6f 67 from sqlite3_log 0da0: 28 29 0a 20 20 20 20 20 28 77 61 72 6e 69 6e 67 (). (warning 0db0: 20 20 20 20 2e 20 32 38 29 20 3b 20 57 61 72 6e . 28) ; Warn 0dc0: 69 6e 67 73 20 66 72 6f 6d 20 73 71 6c 69 74 65 ings from sqlite 0dd0: 33 5f 6c 6f 67 28 29 0a 20 20 20 20 20 28 72 6f 3_log(). (ro 0de0: 77 20 20 20 20 20 20 20 2e 20 31 30 30 29 20 3b w . 100) ; 0df0: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 sqlite3_step() 0e00: 68 61 73 20 61 6e 6f 74 68 65 72 20 72 6f 77 20 has another row 0e10: 72 65 61 64 79 0a 20 20 20 20 20 28 64 6f 6e 65 ready. (done 0e20: 20 20 20 20 20 20 2e 20 31 30 31 29 20 3b 20 73 . 101) ; s 0e30: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 68 61 qlite3_step() ha 0e40: 73 20 66 69 6e 69 73 68 65 64 20 65 78 65 63 75 s finished execu 0e50: 74 69 6e 67 0a 20 20 20 20 20 29 29 0a 0a 20 28 ting. )).. ( 0e60: 64 65 66 69 6e 65 20 28 6e 75 6d 62 65 72 2d 3e define (number-> 0e70: 73 71 6c 69 74 65 33 3a 73 74 61 74 75 73 20 73 sqlite3:status s 0e80: 74 61 74 75 73 29 0a 20 20 20 28 6c 65 74 20 28 tatus). (let ( 0e90: 5b 78 20 28 66 69 6e 64 20 28 6c 61 6d 62 64 61 [x (find (lambda 0ea0: 20 28 61 29 20 28 65 71 75 61 6c 3f 20 28 63 64 (a) (equal? (cd 0eb0: 72 20 61 29 20 73 74 61 74 75 73 29 29 20 73 71 r a) status)) sq 0ec0: 6c 69 74 65 33 3a 73 74 61 74 75 73 29 5d 29 0a lite3:status)]). 0ed0: 20 20 20 20 20 28 69 66 20 28 70 61 69 72 3f 20 (if (pair? 0ee0: 78 29 20 28 63 61 72 20 78 29 20 23 66 29 29 29 x) (car x) #f))) 0ef0: 0a 0a 20 28 64 65 66 69 6e 65 20 73 71 6c 69 74 .. (define sqlit 0f00: 65 33 3a 74 79 70 65 2d 65 6e 75 6d 20 28 6d 61 e3:type-enum (ma 0f10: 6b 65 2d 65 6e 75 6d 65 72 61 74 69 6f 6e 20 27 ke-enumeration ' 0f20: 28 75 6e 64 65 66 69 6e 65 64 20 69 6e 74 65 67 (undefined integ 0f30: 65 72 20 66 6c 6f 61 74 20 74 65 78 74 20 62 6c er float text bl 0f40: 6f 62 20 6e 75 6c 6c 29 29 29 0a 20 28 64 65 66 ob null))). (def 0f50: 69 6e 65 20 73 71 6c 69 74 65 33 3a 74 79 70 65 ine sqlite3:type 0f60: 2d 69 6e 64 65 78 20 28 65 6e 75 6d 2d 73 65 74 -index (enum-set 0f70: 2d 69 6e 64 65 78 65 72 20 73 71 6c 69 74 65 33 -indexer sqlite3 0f80: 3a 74 79 70 65 2d 65 6e 75 6d 29 29 0a 20 28 64 :type-enum)). (d 0f90: 65 66 69 6e 65 20 28 73 71 6c 69 74 65 33 3a 74 efine (sqlite3:t 0fa0: 79 70 65 2d 72 65 66 20 69 6e 64 65 78 29 0a 20 ype-ref index). 0fb0: 20 20 28 6c 69 73 74 2d 72 65 66 20 28 65 6e 75 (list-ref (enu 0fc0: 6d 2d 73 65 74 2d 3e 6c 69 73 74 20 73 71 6c 69 m-set->list sqli 0fd0: 74 65 33 3a 74 79 70 65 2d 65 6e 75 6d 29 20 69 te3:type-enum) i 0fe0: 6e 64 65 78 29 29 0a 0a 20 0a 0a 20 3b 3b 20 41 ndex)).. .. ;; A 0ff0: 75 78 69 6c 69 61 72 79 20 74 79 70 65 73 0a 0a uxiliary types.. 1000: 20 28 64 65 66 69 6e 65 2d 66 74 79 70 65 20 73 (define-ftype s 1010: 71 6c 69 74 65 33 3a 63 6f 6e 74 65 78 74 20 76 qlite3:context v 1020: 6f 69 64 2a 29 0a 0a 20 28 64 65 66 69 6e 65 2d oid*).. (define- 1030: 66 74 79 70 65 20 73 71 6c 69 74 65 33 3a 76 61 ftype sqlite3:va 1040: 6c 75 65 20 76 6f 69 64 2a 29 0a 0a 20 3b 3b 20 lue void*).. ;; 1050: 54 79 70 65 73 20 66 6f 72 20 64 61 74 61 62 61 Types for databa 1060: 73 65 73 20 61 6e 64 20 73 74 61 74 65 6d 65 6e ses and statemen 1070: 74 73 0a 0a 20 28 64 65 66 69 6e 65 2d 66 74 79 ts.. (define-fty 1080: 70 65 20 73 71 6c 69 74 65 33 3a 64 61 74 61 62 pe sqlite3:datab 1090: 61 73 65 2a 20 76 6f 69 64 2a 29 0a 0a 20 28 64 ase* void*).. (d 10a0: 65 66 69 6e 65 2d 66 74 79 70 65 20 73 71 6c 69 efine-ftype sqli 10b0: 74 65 33 3a 64 61 74 61 62 61 73 65 2a 2a 20 28 te3:database** ( 10c0: 2a 20 73 71 6c 69 74 65 33 3a 64 61 74 61 62 61 * sqlite3:databa 10d0: 73 65 2a 29 29 0a 20 20 20 20 20 20 20 20 20 20 se*)). 10e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 10f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3b 28 ;( 1100: 64 65 66 69 6e 65 2d 63 68 65 63 6b 2b 65 72 72 define-check+err 1110: 6f 72 2d 74 79 70 65 20 64 61 74 61 62 61 73 65 or-type database 1120: 29 0a 20 28 64 65 66 69 6e 65 2d 66 74 79 70 65 ). (define-ftype 1130: 20 73 71 6c 69 74 65 33 3a 73 74 61 74 65 6d 65 sqlite3:stateme 1140: 6e 74 2a 20 76 6f 69 64 2a 29 0a 20 28 64 65 66 nt* void*). (def 1150: 69 6e 65 2d 66 74 79 70 65 20 73 71 6c 69 74 65 ine-ftype sqlite 1160: 33 3a 73 74 61 74 65 6d 65 6e 74 2a 2a 20 28 2a 3:statement** (* 1170: 20 73 71 6c 69 74 65 33 3a 73 74 61 74 65 6d 65 sqlite3:stateme 1180: 6e 74 2a 29 29 0a 0a 20 28 64 65 66 69 6e 65 2d nt*)).. (define- 1190: 72 65 63 6f 72 64 2d 74 79 70 65 20 28 26 73 71 record-type (&sq 11a0: 6c 69 74 65 33 20 6d 61 6b 65 2d 73 71 6c 69 74 lite3 make-sqlit 11b0: 65 33 2d 63 6f 6e 64 69 74 69 6f 6e 20 24 73 71 e3-condition $sq 11c0: 6c 69 74 65 33 2d 63 6f 6e 64 69 74 69 6f 6e 3f lite3-condition? 11d0: 29 0a 20 20 20 28 70 61 72 65 6e 74 20 26 63 6f ). (parent &co 11e0: 6e 64 69 74 69 6f 6e 29 0a 20 20 20 28 66 69 65 ndition). (fie 11f0: 6c 64 73 20 28 69 6d 6d 75 74 61 62 6c 65 20 73 lds (immutable s 1200: 74 61 74 75 73 20 24 73 71 6c 69 74 65 33 2d 63 tatus $sqlite3-c 1210: 6f 6e 64 69 74 69 6f 6e 2d 73 74 61 74 75 73 29 ondition-status) 1220: 29 29 0a 0a 20 28 64 65 66 69 6e 65 2d 72 65 63 )).. (define-rec 1230: 6f 72 64 2d 74 79 70 65 20 64 61 74 61 62 61 73 ord-type databas 1240: 65 0a 20 20 20 28 66 69 65 6c 64 73 0a 20 20 20 e. (fields. 1250: 20 28 6d 75 74 61 62 6c 65 20 70 74 72 29 0a 20 (mutable ptr). 1260: 20 20 20 28 6d 75 74 61 62 6c 65 20 62 75 73 79 (mutable busy 1270: 2d 68 61 6e 64 6c 65 72 29 29 29 0a 0a 20 28 64 -handler))).. (d 1280: 65 66 69 6e 65 2d 72 65 63 6f 72 64 2d 74 79 70 efine-record-typ 1290: 65 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 28 e statement. ( 12a0: 66 69 65 6c 64 73 0a 20 20 20 20 28 6d 75 74 61 fields. (muta 12b0: 62 6c 65 20 70 74 72 29 0a 20 20 20 20 28 6d 75 ble ptr). (mu 12c0: 74 61 62 6c 65 20 64 61 74 61 62 61 73 65 29 0a table database). 12d0: 20 20 20 20 28 6d 75 74 61 62 6c 65 20 73 71 6c (mutable sql 12e0: 29 29 29 0a 0a 20 20 20 20 20 20 20 20 20 20 20 ))).. 12f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 1300: 20 20 20 20 20 20 20 20 20 20 20 20 20 3b 28 64 ;(d 1310: 65 66 69 6e 65 2d 63 68 65 63 6b 2b 65 72 72 6f efine-check+erro 1320: 72 2d 74 79 70 65 20 73 74 61 74 65 6d 65 6e 74 r-type statement 1330: 29 0a 0a 3b 3b 3b 20 48 65 6c 70 65 72 73 0a 0a )..;;; Helpers.. 1340: 20 3b 3b 20 43 6f 6e 64 69 74 69 6f 6e 73 0a 20 ;; Conditions. 1350: 28 64 65 66 69 6e 65 20 72 74 64 20 28 72 65 63 (define rtd (rec 1360: 6f 72 64 2d 74 79 70 65 2d 64 65 73 63 72 69 70 ord-type-descrip 1370: 74 6f 72 20 26 73 71 6c 69 74 65 33 29 29 0a 20 tor &sqlite3)). 1380: 28 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 2d (define sqlite3- 1390: 63 6f 6e 64 69 74 69 6f 6e 3f 20 28 63 6f 6e 64 condition? (cond 13a0: 69 74 69 6f 6e 2d 70 72 65 64 69 63 61 74 65 20 ition-predicate 13b0: 72 74 64 29 29 0a 20 28 64 65 66 69 6e 65 20 73 rtd)). (define s 13c0: 71 6c 69 74 65 33 2d 73 74 61 74 75 73 20 28 63 qlite3-status (c 13d0: 6f 6e 64 69 74 69 6f 6e 2d 61 63 63 65 73 73 6f ondition-accesso 13e0: 72 20 72 74 64 20 24 73 71 6c 69 74 65 33 2d 63 r rtd $sqlite3-c 13f0: 6f 6e 64 69 74 69 6f 6e 2d 73 74 61 74 75 73 29 ondition-status) 1400: 29 0a 0a 20 28 64 65 66 69 6e 65 20 28 6d 61 6b ).. (define (mak 1410: 65 2d 73 71 6c 69 74 65 33 2d 65 72 72 6f 72 2d e-sqlite3-error- 1420: 63 6f 6e 64 69 74 69 6f 6e 20 6c 6f 63 20 6d 73 condition loc ms 1430: 67 20 73 74 61 20 2e 20 61 72 67 73 29 0a 20 20 g sta . args). 1440: 20 28 63 6f 6e 64 69 74 69 6f 6e 0a 20 20 20 20 (condition. 1450: 28 6d 61 6b 65 2d 73 71 6c 69 74 65 33 2d 63 6f (make-sqlite3-co 1460: 6e 64 69 74 69 6f 6e 20 73 74 61 29 0a 20 20 20 ndition sta). 1470: 20 28 6d 61 6b 65 2d 77 68 6f 2d 63 6f 6e 64 69 (make-who-condi 1480: 74 69 6f 6e 20 6c 6f 63 29 0a 20 20 20 20 28 6d tion loc). (m 1490: 61 6b 65 2d 6d 65 73 73 61 67 65 2d 63 6f 6e 64 ake-message-cond 14a0: 69 74 69 6f 6e 20 6d 73 67 29 0a 20 20 20 20 28 ition msg). ( 14b0: 6d 61 6b 65 2d 69 72 72 69 74 61 6e 74 73 2d 63 make-irritants-c 14c0: 6f 6e 64 69 74 69 6f 6e 20 61 72 67 73 29 0a 20 ondition args). 14d0: 20 20 20 29 29 0a 0a 20 28 64 65 66 69 6e 65 20 )).. (define 14e0: 28 6d 61 6b 65 2d 6e 6f 2d 64 61 74 61 2d 63 6f (make-no-data-co 14f0: 6e 64 69 74 69 6f 6e 20 6c 6f 63 20 73 74 6d 74 ndition loc stmt 1500: 20 70 61 72 61 6d 73 29 0a 20 20 20 28 6d 61 6b params). (mak 1510: 65 2d 73 71 6c 69 74 65 33 2d 65 72 72 6f 72 2d e-sqlite3-error- 1520: 63 6f 6e 64 69 74 69 6f 6e 20 6c 6f 63 0a 20 20 condition loc. 1530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 1540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 " 1550: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 72 65 the statement re 1560: 74 75 72 6e 65 64 20 6e 6f 20 64 61 74 61 22 0a turned no data". 1570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 1580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 1590: 20 27 64 6f 6e 65 0a 20 20 20 20 20 20 20 20 20 'done. 15a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 15b0: 20 20 20 20 20 20 20 20 73 74 6d 74 20 70 61 72 stmt par 15c0: 61 6d 73 29 29 0a 0a 20 3b 3b 20 45 72 72 6f 72 ams)).. ;; Error 15d0: 73 0a 20 28 64 65 66 69 6e 65 20 28 61 62 6f 72 s. (define (abor 15e0: 74 2d 73 71 6c 69 74 65 33 2d 65 72 72 6f 72 20 t-sqlite3-error 15f0: 6c 6f 63 20 64 62 20 2e 20 61 72 67 73 29 0a 20 loc db . args). 1600: 20 20 28 6c 61 6d 62 64 61 20 28 73 74 61 29 0a (lambda (sta). 1610: 20 20 20 20 20 28 69 66 20 28 6e 6f 74 20 28 65 (if (not (e 1620: 71 75 61 6c 3f 20 73 74 61 20 30 29 29 0a 20 20 qual? sta 0)). 1630: 20 20 20 20 20 20 20 28 72 61 69 73 65 0a 20 20 (raise. 1640: 20 20 20 20 20 20 20 20 28 61 70 70 6c 79 20 6d (apply m 1650: 61 6b 65 2d 73 71 6c 69 74 65 33 2d 65 72 72 6f ake-sqlite3-erro 1660: 72 2d 63 6f 6e 64 69 74 69 6f 6e 0a 20 20 20 20 r-condition. 1670: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 loc 1680: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 . 1690: 20 20 28 69 66 20 64 62 20 28 73 71 6c 69 74 65 (if db (sqlite 16a0: 33 2d 65 72 72 6d 73 67 20 64 62 29 20 22 73 74 3-errmsg db) "st 16b0: 61 22 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 a"). 16c0: 20 20 20 20 20 73 74 61 0a 20 20 20 20 20 20 20 sta. 16d0: 20 20 20 20 20 20 20 20 20 20 61 72 67 73 29 29 args)) 16e0: 29 29 29 0a 0a 20 28 64 65 66 69 6e 65 20 28 70 ))).. (define (p 16f0: 72 69 6e 74 2d 65 72 72 6f 72 2d 6d 65 73 73 61 rint-error-messa 1700: 67 65 20 6f 62 6a 20 70 6f 72 74 20 73 74 72 29 ge obj port str) 1710: 0a 20 20 20 28 64 69 73 70 6c 61 79 20 6f 62 6a . (display obj 1720: 20 70 6f 72 74 29 20 28 64 69 73 70 6c 61 79 20 port) (display 1730: 73 74 72 20 70 6f 72 74 29 20 28 6e 65 77 6c 69 str port) (newli 1740: 6e 65 20 70 6f 72 74 29 29 0a 0a 20 28 64 65 66 ne port)).. (def 1750: 69 6e 65 20 28 70 72 69 6e 74 2d 65 72 72 6f 72 ine (print-error 1760: 20 6d 73 67 20 6f 62 6a 29 0a 20 20 20 28 70 72 msg obj). (pr 1770: 69 6e 74 2d 65 72 72 6f 72 2d 6d 65 73 73 61 67 int-error-messag 1780: 65 20 6f 62 6a 20 28 63 75 72 72 65 6e 74 2d 65 e obj (current-e 1790: 72 72 6f 72 2d 70 6f 72 74 29 20 28 73 74 72 69 rror-port) (stri 17a0: 6e 67 2d 61 70 70 65 6e 64 20 22 45 72 72 6f 72 ng-append "Error 17b0: 3a 20 22 20 6d 73 67 29 29 29 0a 0a 3b 3b 3b 20 : " msg)))..;;; 17c0: 44 61 74 61 62 61 73 65 20 69 6e 74 65 72 66 61 Database interfa 17d0: 63 65 0a 0a 20 3b 3b 20 47 65 74 20 61 6e 79 20 ce.. ;; Get any 17e0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 28 error message. ( 17f0: 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 5f 65 define sqlite3_e 1800: 72 72 6d 73 67 0a 20 20 20 28 66 6f 72 65 69 67 rrmsg. (foreig 1810: 6e 2d 70 72 6f 63 65 64 75 72 65 20 22 73 71 6c n-procedure "sql 1820: 69 74 65 33 5f 65 72 72 6d 73 67 22 20 28 73 71 ite3_errmsg" (sq 1830: 6c 69 74 65 33 3a 64 61 74 61 62 61 73 65 2a 29 lite3:database*) 1840: 20 73 74 72 69 6e 67 29 29 0a 20 28 64 65 66 69 string)). (defi 1850: 6e 65 20 28 73 71 6c 69 74 65 33 2d 65 72 72 6d ne (sqlite3-errm 1860: 73 67 20 64 62 29 0a 20 20 20 28 63 68 65 63 6b sg db). (check 1870: 2d 64 61 74 61 62 61 73 65 20 27 73 71 6c 69 74 -database 'sqlit 1880: 65 33 2d 65 72 72 6d 73 67 20 64 62 29 0a 20 20 e3-errmsg db). 1890: 20 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 (sqlite3_errmsg 18a0: 20 28 64 61 74 61 62 61 73 65 2d 61 64 64 72 20 (database-addr 18b0: 64 62 29 29 29 0a 0a 20 3b 3b 20 4f 70 65 6e 20 db))).. ;; Open 18c0: 61 20 64 61 74 61 62 61 73 65 0a 20 28 64 65 66 a database. (def 18d0: 69 6e 65 20 28 6f 70 65 6e 2d 64 61 74 61 62 61 ine (open-databa 18e0: 73 65 20 70 61 74 68 29 0a 20 20 20 28 61 73 73 se path). (ass 18f0: 65 72 74 20 28 61 6e 64 20 6f 70 65 6e 2d 64 61 ert (and open-da 1900: 74 61 62 61 73 65 20 28 73 74 72 69 6e 67 3f 20 tabase (string? 1910: 70 61 74 68 29 29 29 0a 20 20 20 28 6c 65 74 2a path))). (let* 1920: 20 28 5b 70 74 72 20 28 6d 61 6b 65 2d 66 74 79 ([ptr (make-fty 1930: 70 65 2d 70 6f 69 6e 74 65 72 20 73 71 6c 69 74 pe-pointer sqlit 1940: 65 33 3a 64 61 74 61 62 61 73 65 2a 2a 0a 20 20 e3:database**. 1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 1970: 20 28 66 6f 72 65 69 67 6e 2d 61 6c 6c 6f 63 20 (foreign-alloc 1980: 28 66 74 79 70 65 2d 73 69 7a 65 6f 66 20 73 71 (ftype-sizeof sq 1990: 6c 69 74 65 33 3a 64 61 74 61 62 61 73 65 2a 2a lite3:database** 19a0: 29 29 29 5d 0a 20 20 20 20 20 20 20 20 20 20 5b )))]. [ 19b0: 66 20 28 66 6f 72 65 69 67 6e 2d 70 72 6f 63 65 f (foreign-proce 19c0: 64 75 72 65 20 22 73 71 6c 69 74 65 33 5f 6f 70 dure "sqlite3_op 19d0: 65 6e 22 20 28 73 74 72 69 6e 67 20 76 6f 69 64 en" (string void 19e0: 2a 29 20 69 6e 74 29 5d 0a 20 20 20 20 20 20 20 *) int)]. 19f0: 20 20 20 5b 65 20 28 66 20 70 61 74 68 20 28 66 [e (f path (f 1a00: 74 79 70 65 2d 70 6f 69 6e 74 65 72 2d 61 64 64 type-pointer-add 1a10: 72 65 73 73 20 70 74 72 29 29 5d 29 0a 20 20 20 ress ptr))]). 1a20: 20 20 28 69 66 20 28 3d 20 65 20 30 29 0a 20 20 (if (= e 0). 1a30: 20 20 20 20 20 20 20 28 6d 61 6b 65 2d 64 61 74 (make-dat 1a40: 61 62 61 73 65 20 28 66 74 79 70 65 2d 26 72 65 abase (ftype-&re 1a50: 66 20 73 71 6c 69 74 65 33 3a 64 61 74 61 62 61 f sqlite3:databa 1a60: 73 65 2a 2a 20 28 2a 29 20 70 74 72 29 20 23 66 se** (*) ptr) #f 1a70: 29 0a 09 20 28 28 61 62 6f 72 74 2d 73 71 6c 69 ).. ((abort-sqli 1a80: 74 65 33 2d 65 72 72 6f 72 20 27 6f 70 65 6e 2d te3-error 'open- 1a90: 64 61 74 61 62 61 73 65 20 23 66 20 70 61 74 68 database #f path 1aa0: 29 20 65 29 29 29 29 0a 0a 20 28 64 65 66 69 6e ) e)))).. (defin 1ab0: 65 20 28 63 68 65 63 6b 2d 64 61 74 61 62 61 73 e (check-databas 1ac0: 65 20 63 6f 6e 74 65 78 74 20 64 62 29 0a 20 20 e context db). 1ad0: 20 28 61 73 73 65 72 74 20 28 61 6e 64 20 63 6f (assert (and co 1ae0: 6e 74 65 78 74 20 28 64 61 74 61 62 61 73 65 3f ntext (database? 1af0: 20 64 62 29 29 29 29 0a 0a 20 28 64 65 66 69 6e db)))).. (defin 1b00: 65 20 28 63 68 65 63 6b 2d 73 74 61 74 65 6d 65 e (check-stateme 1b10: 6e 74 20 63 6f 6e 74 65 78 74 20 64 62 29 0a 20 nt context db). 1b20: 20 20 28 61 73 73 65 72 74 20 28 61 6e 64 20 63 (assert (and c 1b30: 6f 6e 74 65 78 74 20 28 73 74 61 74 65 6d 65 6e ontext (statemen 1b40: 74 3f 20 64 62 29 29 29 29 0a 0a 20 3b 3b 20 53 t? db)))).. ;; S 1b50: 65 74 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 62 et application b 1b60: 75 73 79 20 68 61 6e 64 6c 65 72 2e 20 20 44 6f usy handler. Do 1b70: 65 73 20 6e 6f 74 20 75 73 65 20 61 20 63 61 6c es not use a cal 1b80: 6c 62 61 63 6b 2c 20 73 6f 20 69 74 20 69 73 20 lback, so it is 1b90: 73 61 66 65 0a 20 3b 3b 20 74 6f 20 79 69 65 6c safe. ;; to yiel 1ba0: 64 2e 20 20 48 61 6e 64 6c 65 72 20 69 73 20 63 d. Handler is c 1bb0: 61 6c 6c 65 64 20 77 69 74 68 20 44 42 2c 20 43 alled with DB, C 1bc0: 4f 55 4e 54 20 61 6e 64 20 4c 41 53 54 20 28 74 OUNT and LAST (t 1bd0: 68 65 20 6c 61 73 74 20 76 61 6c 75 65 0a 20 3b he last value. ; 1be0: 3b 20 69 74 20 72 65 74 75 72 6e 65 64 29 2e 20 ; it returned). 1bf0: 20 52 65 74 75 72 6e 20 74 72 75 65 20 76 61 6c Return true val 1c00: 75 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 74 ue to continue t 1c10: 72 79 69 6e 67 2c 20 6f 72 20 23 66 20 74 6f 20 rying, or #f to 1c20: 73 74 6f 70 2e 0a 20 28 64 65 66 69 6e 65 20 28 stop.. (define ( 1c30: 73 65 74 2d 62 75 73 79 2d 68 61 6e 64 6c 65 72 set-busy-handler 1c40: 21 20 64 62 20 68 61 6e 64 6c 65 72 29 0a 20 20 ! db handler). 1c50: 20 28 63 68 65 63 6b 2d 64 61 74 61 62 61 73 65 (check-database 1c60: 20 27 73 65 74 2d 62 75 73 79 2d 68 61 6e 64 6c 'set-busy-handl 1c70: 65 72 21 20 64 62 29 0a 20 20 20 28 64 61 74 61 er! db). (data 1c80: 62 61 73 65 2d 62 75 73 79 2d 68 61 6e 64 6c 65 base-busy-handle 1c90: 72 2d 73 65 74 21 20 64 62 20 68 61 6e 64 6c 65 r-set! db handle 1ca0: 72 29 29 0a 0a 20 28 64 65 66 69 6e 65 20 28 73 r)).. (define (s 1cb0: 71 6c 69 74 65 33 2d 62 75 73 79 2d 74 69 6d 65 qlite3-busy-time 1cc0: 6f 75 74 20 64 62 20 6d 73 29 0a 20 20 20 28 6c out db ms). (l 1cd0: 65 74 20 28 5b 66 20 28 66 6f 72 65 69 67 6e 2d et ([f (foreign- 1ce0: 70 72 6f 63 65 64 75 72 65 20 22 73 71 6c 69 74 procedure "sqlit 1cf0: 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 22 e3_busy_timeout" 1d00: 20 28 73 71 6c 69 74 65 33 3a 64 61 74 61 62 61 (sqlite3:databa 1d10: 73 65 2a 20 69 6e 74 29 20 69 6e 74 29 5d 29 0a se* int) int)]). 1d20: 20 20 20 20 20 28 66 20 28 64 61 74 61 62 61 73 (f (databas 1d30: 65 2d 61 64 64 72 20 64 62 29 20 6d 73 29 29 29 e-addr db) ms))) 1d40: 0a 20 0a 20 28 64 65 66 69 6e 65 20 28 64 61 74 . . (define (dat 1d50: 61 62 61 73 65 2d 61 64 64 72 20 64 62 29 0a 20 abase-addr db). 1d60: 20 20 28 66 74 79 70 65 2d 70 6f 69 6e 74 65 72 (ftype-pointer 1d70: 2d 61 64 64 72 65 73 73 20 28 64 61 74 61 62 61 -address (databa 1d80: 73 65 2d 70 74 72 20 64 62 29 29 29 0a 0a 20 28 se-ptr db))).. ( 1d90: 64 65 66 69 6e 65 20 28 73 74 61 74 65 6d 65 6e define (statemen 1da0: 74 2d 61 64 64 72 20 73 74 6d 74 29 0a 20 20 20 t-addr stmt). 1db0: 28 66 74 79 70 65 2d 70 6f 69 6e 74 65 72 2d 61 (ftype-pointer-a 1dc0: 64 64 72 65 73 73 20 28 73 74 61 74 65 6d 65 6e ddress (statemen 1dd0: 74 2d 70 74 72 20 73 74 6d 74 29 29 29 0a 0a 20 t-ptr stmt))).. 1de0: 3b 3b 20 43 61 6e 63 65 6c 20 61 6e 79 20 72 75 ;; Cancel any ru 1df0: 6e 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20 6f nning database o 1e00: 70 65 72 61 74 69 6f 6e 20 61 73 20 73 6f 6f 6e peration as soon 1e10: 20 61 73 20 70 6f 73 73 69 62 6c 65 0a 20 28 64 as possible. (d 1e20: 65 66 69 6e 65 20 28 69 6e 74 65 72 72 75 70 74 efine (interrupt 1e30: 21 20 64 62 29 0a 20 20 20 28 63 68 65 63 6b 2d ! db). (check- 1e40: 64 61 74 61 62 61 73 65 20 27 69 6e 74 65 72 72 database 'interr 1e50: 75 70 74 21 20 64 62 29 0a 20 20 20 28 6c 65 74 upt! db). (let 1e60: 20 28 5b 66 20 28 66 6f 72 65 69 67 6e 2d 70 72 ([f (foreign-pr 1e70: 6f 63 65 64 75 72 65 20 22 73 71 6c 69 74 65 33 ocedure "sqlite3 1e80: 5f 69 6e 74 65 72 72 75 70 74 22 20 28 73 71 6c _interrupt" (sql 1e90: 69 74 65 33 3a 64 61 74 61 62 61 73 65 2a 29 20 ite3:database*) 1ea0: 76 6f 69 64 29 5d 29 0a 20 20 20 20 20 28 66 20 void)]). (f 1eb0: 28 64 61 74 61 62 61 73 65 2d 61 64 64 72 20 64 (database-addr d 1ec0: 62 29 29 29 29 0a 0a 20 3b 3b 20 43 68 65 63 6b b)))).. ;; Check 1ed0: 20 77 68 65 74 68 65 72 20 74 68 65 20 64 61 74 whether the dat 1ee0: 61 62 61 73 65 20 69 73 20 69 6e 20 61 75 74 6f abase is in auto 1ef0: 63 6f 6d 6d 69 74 20 6d 6f 64 65 0a 20 28 64 65 commit mode. (de 1f00: 66 69 6e 65 20 28 61 75 74 6f 2d 63 6f 6d 6d 69 fine (auto-commi 1f10: 74 74 69 6e 67 3f 20 64 62 29 0a 20 20 20 28 63 tting? db). (c 1f20: 68 65 63 6b 2d 64 61 74 61 62 61 73 65 20 27 61 heck-database 'a 1f30: 75 74 6f 2d 63 6f 6d 6d 69 74 74 69 6e 67 3f 20 uto-committing? 1f40: 64 62 29 0a 20 20 20 28 6c 65 74 20 28 5b 66 20 db). (let ([f 1f50: 28 66 6f 72 65 69 67 6e 2d 70 72 6f 63 65 64 75 (foreign-procedu 1f60: 72 65 20 22 73 71 6c 69 74 65 33 5f 67 65 74 5f re "sqlite3_get_ 1f70: 61 75 74 6f 63 6f 6d 6d 69 74 22 20 28 73 71 6c autocommit" (sql 1f80: 69 74 65 33 3a 64 61 74 61 62 61 73 65 2a 29 20 ite3:database*) 1f90: 62 6f 6f 6c 65 61 6e 29 5d 29 0a 20 20 20 20 20 boolean)]). 1fa0: 28 66 20 28 64 61 74 61 62 61 73 65 2d 61 64 64 (f (database-add 1fb0: 72 20 64 62 29 29 29 29 0a 0a 20 3b 3b 20 47 65 r db)))).. ;; Ge 1fc0: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 t the number of 1fd0: 63 68 61 6e 67 65 73 20 6d 61 64 65 20 74 6f 20 changes made to 1fe0: 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 28 64 the database. (d 1ff0: 65 66 69 6e 65 20 63 68 61 6e 67 65 2d 63 6f 75 efine change-cou 2000: 6e 74 0a 20 20 20 28 63 61 73 65 2d 6c 61 6d 62 nt. (case-lamb 2010: 64 61 0a 20 20 20 20 20 5b 28 64 62 29 20 28 63 da. [(db) (c 2020: 68 61 6e 67 65 2d 63 6f 75 6e 74 20 64 62 20 23 hange-count db # 2030: 66 29 5d 0a 20 20 20 20 20 5b 28 64 62 20 74 6f f)]. [(db to 2040: 74 61 6c 29 0a 20 20 20 20 20 20 28 63 68 65 63 tal). (chec 2050: 6b 2d 64 61 74 61 62 61 73 65 20 27 63 68 61 6e k-database 'chan 2060: 67 65 2d 63 6f 75 6e 74 20 64 62 29 0a 20 20 20 ge-count db). 2070: 20 20 20 28 6c 65 74 20 28 5b 74 6f 74 61 6c 2d (let ([total- 2080: 63 68 61 6e 67 65 73 20 28 66 6f 72 65 69 67 6e changes (foreign 2090: 2d 70 72 6f 63 65 64 75 72 65 20 22 73 71 6c 69 -procedure "sqli 20a0: 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 te3_total_change 20b0: 73 22 20 28 73 71 6c 69 74 65 33 3a 64 61 74 61 s" (sqlite3:data 20c0: 62 61 73 65 2a 29 20 69 6e 74 29 5d 0a 20 20 20 base*) int)]. 20d0: 20 20 20 20 20 20 20 20 20 5b 63 68 61 6e 67 65 [change 20e0: 73 20 28 66 6f 72 65 69 67 6e 2d 70 72 6f 63 65 s (foreign-proce 20f0: 64 75 72 65 20 22 73 71 6c 69 74 65 33 5f 63 68 dure "sqlite3_ch 2100: 61 6e 67 65 73 22 20 28 73 71 6c 69 74 65 33 3a anges" (sqlite3: 2110: 64 61 74 61 62 61 73 65 2a 29 20 69 6e 74 29 5d database*) int)] 2120: 29 0a 20 20 20 20 20 20 20 20 28 69 66 20 74 6f ). (if to 2130: 74 61 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 tal. 2140: 28 74 6f 74 61 6c 2d 63 68 61 6e 67 65 73 20 28 (total-changes ( 2150: 64 61 74 61 62 61 73 65 2d 61 64 64 72 20 64 62 database-addr db 2160: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 )). ( 2170: 63 68 61 6e 67 65 73 20 28 64 61 74 61 62 61 73 changes (databas 2180: 65 2d 61 64 64 72 20 64 62 29 29 29 29 5d 29 29 e-addr db))))])) 2190: 0a 0a 20 3b 3b 20 47 65 74 20 74 68 65 20 72 6f .. ;; Get the ro 21a0: 77 20 49 44 20 6f 66 20 74 68 65 20 6c 61 73 74 w ID of the last 21b0: 20 69 6e 73 65 72 74 65 64 20 72 6f 77 0a 20 28 inserted row. ( 21c0: 64 65 66 69 6e 65 20 28 6c 61 73 74 2d 69 6e 73 define (last-ins 21d0: 65 72 74 2d 72 6f 77 69 64 20 64 62 29 0a 20 20 ert-rowid db). 21e0: 20 28 63 68 65 63 6b 2d 64 61 74 61 62 61 73 65 (check-database 21f0: 20 27 6c 61 73 74 2d 69 6e 73 65 72 74 2d 72 6f 'last-insert-ro 2200: 77 69 64 20 64 62 29 0a 20 20 20 28 6c 65 74 20 wid db). (let 2210: 28 5b 66 20 28 66 6f 72 65 69 67 6e 2d 70 72 6f ([f (foreign-pro 2220: 63 65 64 75 72 65 20 22 73 71 6c 69 74 65 33 5f cedure "sqlite3_ 2230: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 last_insert_rowi 2240: 64 22 20 28 73 71 6c 69 74 65 33 3a 64 61 74 61 d" (sqlite3:data 2250: 62 61 73 65 2a 29 20 69 6e 74 29 5d 29 0a 20 20 base*) int)]). 2260: 20 20 20 28 66 20 28 64 61 74 61 62 61 73 65 2d (f (database- 2270: 61 64 64 72 20 64 62 29 29 29 29 0a 0a 20 3b 3b addr db)))).. ;; 2280: 20 43 6c 6f 73 65 20 61 20 64 61 74 61 62 61 73 Close a databas 2290: 65 20 6f 72 20 73 74 61 74 65 6d 65 6e 74 20 68 e or statement h 22a0: 61 6e 64 6c 65 0a 20 28 64 65 66 69 6e 65 20 28 andle. (define ( 22b0: 73 71 6c 69 74 65 33 2d 66 69 6e 61 6c 69 7a 65 sqlite3-finalize 22c0: 20 64 62 29 0a 20 20 20 28 63 68 65 63 6b 2d 64 db). (check-d 22d0: 61 74 61 62 61 73 65 20 27 73 71 6c 69 74 65 33 atabase 'sqlite3 22e0: 2d 66 69 6e 61 6c 69 7a 65 20 64 62 29 0a 20 20 -finalize db). 22f0: 20 28 6c 65 74 2a 20 28 5b 66 20 28 66 6f 72 65 (let* ([f (fore 2300: 69 67 6e 2d 70 72 6f 63 65 64 75 72 65 20 22 73 ign-procedure "s 2310: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 22 qlite3_finalize" 2320: 20 20 28 73 71 6c 69 74 65 33 3a 64 61 74 61 62 (sqlite3:datab 2330: 61 73 65 2a 29 20 69 6e 74 29 5d 0a 20 20 20 20 ase*) int)]. 2340: 20 20 20 20 20 20 5b 6e 20 28 66 20 28 64 61 74 [n (f (dat 2350: 61 62 61 73 65 2d 61 64 64 72 20 64 62 29 29 5d abase-addr db))] 2360: 29 0a 20 20 20 20 20 28 64 61 74 61 62 61 73 65 ). (database 2370: 2d 70 74 72 2d 73 65 74 21 20 64 62 20 23 66 29 -ptr-set! db #f) 2380: 0a 20 20 20 20 20 6e 29 29 0a 0a 20 28 64 65 66 . n)).. (def 2390: 69 6e 65 20 28 73 71 6c 69 74 65 33 2d 6e 65 78 ine (sqlite3-nex 23a0: 74 2d 73 74 6d 74 20 64 62 29 0a 20 20 20 28 63 t-stmt db). (c 23b0: 68 65 63 6b 2d 64 61 74 61 62 61 73 65 20 27 73 heck-database 's 23c0: 71 6c 69 74 65 33 2d 6e 65 78 74 2d 73 74 6d 74 qlite3-next-stmt 23d0: 20 64 62 29 0a 20 20 20 28 6c 65 74 2a 20 28 5b db). (let* ([ 23e0: 66 20 28 66 6f 72 65 69 67 6e 2d 70 72 6f 63 65 f (foreign-proce 23f0: 64 75 72 65 20 22 73 71 6c 69 74 65 33 5f 6e 65 dure "sqlite3_ne 2400: 78 74 5f 73 74 6d 74 22 20 28 73 71 6c 69 74 65 xt_stmt" (sqlite 2410: 33 3a 64 61 74 61 62 61 73 65 2a 29 20 73 71 6c 3:database*) sql 2420: 69 74 65 33 3a 73 74 61 74 65 6d 65 6e 74 2a 29 ite3:statement*) 2430: 5d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 6d ]. [stm 2440: 74 2a 20 28 66 20 28 64 61 74 61 62 61 73 65 2d t* (f (database- 2450: 61 64 64 72 20 64 62 29 29 5d 29 0a 20 20 20 20 addr db))]). 2460: 20 28 6d 61 6b 65 2d 73 74 61 74 65 6d 65 6e 74 (make-statement 2470: 20 28 6d 61 6b 65 2d 66 74 79 70 65 2d 70 6f 69 (make-ftype-poi 2480: 6e 74 65 72 20 73 71 6c 69 74 65 33 3a 73 74 61 nter sqlite3:sta 2490: 74 65 6d 65 6e 74 2a 20 73 74 6d 74 2a 29 0a 20 tement* stmt*). 24a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24b0: 20 20 20 20 64 62 20 22 22 29 29 29 0a 0a 20 28 db ""))).. ( 24c0: 64 65 66 69 6e 65 20 66 69 6e 61 6c 69 7a 65 21 define finalize! 24d0: 0a 20 20 20 28 63 61 73 65 2d 6c 61 6d 62 64 61 . (case-lambda 24e0: 0a 20 20 20 20 5b 28 78 29 0a 20 20 20 20 20 28 . [(x). ( 24f0: 66 69 6e 61 6c 69 7a 65 21 20 78 20 23 66 29 5d finalize! x #f)] 2500: 0a 20 20 20 20 5b 28 78 20 66 69 6e 61 6c 69 7a . [(x finaliz 2510: 65 2d 73 74 61 74 65 6d 65 6e 74 73 3f 29 0a 20 e-statements?). 2520: 20 20 20 20 28 64 65 66 69 6e 65 20 73 71 6c 69 (define sqli 2530: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 28 66 6f te3_finalize (fo 2540: 72 65 69 67 6e 2d 70 72 6f 63 65 64 75 72 65 20 reign-procedure 2550: 22 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a "sqlite3_finaliz 2560: 65 22 20 28 73 71 6c 69 74 65 33 3a 73 74 61 74 e" (sqlite3:stat 2570: 65 6d 65 6e 74 2a 29 20 69 6e 74 29 29 0a 20 20 ement*) int)). 2580: 20 20 20 28 63 6f 6e 64 0a 20 20 20 20 20 20 5b (cond. [ 2590: 28 64 61 74 61 62 61 73 65 3f 20 78 29 0a 20 20 (database? x). 25a0: 20 20 20 20 20 28 63 6f 6e 64 0a 09 5b 28 6e 6f (cond..[(no 25b0: 74 20 28 64 61 74 61 62 61 73 65 2d 70 74 72 20 t (database-ptr 25c0: 78 29 29 0a 09 20 28 76 6f 69 64 29 5d 0a 09 5b x)).. (void)]..[ 25d0: 28 6c 65 74 20 6c 6f 6f 70 20 28 5b 73 74 6d 74 (let loop ([stmt 25e0: 0a 09 09 20 20 20 20 20 28 61 6e 64 0a 09 09 20 ... (and... 25f0: 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 2d 73 74 finalize-st 2600: 61 74 65 6d 65 6e 74 73 3f 0a 09 09 20 20 20 20 atements?... 2610: 20 20 28 73 71 6c 69 74 65 33 2d 6e 65 78 74 2d (sqlite3-next- 2620: 73 74 6d 74 20 78 29 29 5d 29 0a 09 20 20 20 28 stmt x))]).. ( 2630: 69 66 20 73 74 6d 74 0a 09 20 20 20 20 20 20 20 if stmt.. 2640: 28 6f 72 20 28 73 71 6c 69 74 65 33 5f 66 69 6e (or (sqlite3_fin 2650: 61 6c 69 7a 65 20 28 73 74 61 74 65 6d 65 6e 74 alize (statement 2660: 2d 70 74 72 20 73 74 6d 74 29 29 0a 09 09 20 20 -ptr stmt))... 2670: 20 28 6c 6f 6f 70 20 28 73 71 6c 69 74 65 33 2d (loop (sqlite3- 2680: 6e 65 78 74 2d 73 74 6d 74 20 28 73 74 61 74 65 next-stmt (state 2690: 6d 65 6e 74 2d 64 61 74 61 62 61 73 65 20 73 74 ment-database st 26a0: 6d 74 29 29 29 29 0a 09 20 20 20 20 20 20 20 28 mt)))).. ( 26b0: 6c 65 74 20 28 5b 66 20 28 66 6f 72 65 69 67 6e let ([f (foreign 26c0: 2d 70 72 6f 63 65 64 75 72 65 20 22 73 71 6c 69 -procedure "sqli 26d0: 74 65 33 5f 63 6c 6f 73 65 22 20 28 73 71 6c 69 te3_close" (sqli 26e0: 74 65 33 3a 64 61 74 61 62 61 73 65 2a 29 20 69 te3:database*) i 26f0: 6e 74 29 5d 29 0a 09 09 20 28 66 20 28 64 61 74 nt)])... (f (dat 2700: 61 62 61 73 65 2d 61 64 64 72 20 78 29 29 29 29 abase-addr x)))) 2710: 29 0a 09 20 3d 3e 20 28 61 62 6f 72 74 2d 73 71 ).. => (abort-sq 2720: 6c 69 74 65 33 2d 65 72 72 6f 72 20 27 66 69 6e lite3-error 'fin 2730: 61 6c 69 7a 65 21 20 78 20 78 29 5d 29 5d 0a 20 alize! x x)])]. 2740: 20 20 20 20 20 5b 28 73 74 61 74 65 6d 65 6e 74 [(statement 2750: 3f 20 78 29 0a 20 20 20 20 20 20 20 28 63 6f 6e ? x). (con 2760: 64 0a 09 5b 28 6e 6f 74 20 28 73 74 61 74 65 6d d..[(not (statem 2770: 65 6e 74 2d 70 74 72 20 78 29 29 0a 09 20 28 76 ent-ptr x)).. (v 2780: 6f 69 64 29 5d 0a 09 5b 20 28 73 71 6c 69 74 65 oid)]..[ (sqlite 2790: 33 5f 66 69 6e 61 6c 69 7a 65 20 28 73 74 61 74 3_finalize (stat 27a0: 65 6d 65 6e 74 2d 61 64 64 72 20 78 29 29 0a 09 ement-addr x)).. 27b0: 20 20 3d 3e 20 28 61 62 6f 72 74 2d 73 71 6c 69 => (abort-sqli 27c0: 74 65 33 2d 65 72 72 6f 72 20 27 66 69 6e 61 6c te3-error 'final 27d0: 69 7a 65 21 20 28 73 74 61 74 65 6d 65 6e 74 2d ize! (statement- 27e0: 64 61 74 61 62 61 73 65 20 78 29 20 78 29 5d 0a database x) x)]. 27f0: 09 5b 65 6c 73 65 0a 09 20 28 73 74 61 74 65 6d .[else.. (statem 2800: 65 6e 74 2d 70 74 72 2d 73 65 74 21 20 78 20 23 ent-ptr-set! x # 2810: 66 29 5d 29 5d 0a 20 20 20 20 20 20 5b 65 6c 73 f)])]. [els 2820: 65 0a 20 20 20 20 20 20 20 28 65 72 72 6f 72 66 e. (errorf 2830: 20 27 66 69 6e 61 6c 69 7a 65 21 20 22 64 61 74 'finalize! "dat 2840: 61 62 61 73 65 20 6f 72 20 73 74 61 74 65 6d 65 abase or stateme 2850: 6e 74 20 7e 64 22 20 78 29 5d 29 5d 29 29 0a 20 nt ~d" x)])])). 2860: 20 20 20 20 3b 3b 20 23 3b 28 64 65 66 69 6e 65 ;; #;(define 2870: 20 66 69 6e 61 6c 69 7a 65 21 0a 20 3b 3b 20 20 finalize!. ;; 2880: 20 28 6d 61 74 63 68 2d 6c 61 6d 62 64 61 2a 0a (match-lambda*. 2890: 20 3b 3b 20 20 20 20 5b 28 28 3f 20 64 61 74 61 ;; [((? data 28a0: 62 61 73 65 3f 20 64 62 29 20 2e 20 66 69 6e 61 base? db) . fina 28b0: 6c 69 7a 65 2d 73 74 61 74 65 6d 65 6e 74 73 3f lize-statements? 28c0: 29 0a 20 3b 3b 20 20 20 20 20 20 28 63 6f 6e 64 ). ;; (cond 28d0: 0a 20 3b 3b 20 20 20 20 20 20 20 5b 28 6e 6f 74 . ;; [(not 28e0: 20 28 64 61 74 61 62 61 73 65 2d 70 74 72 20 64 (database-ptr d 28f0: 62 29 29 0a 20 3b 3b 20 20 20 20 20 20 20 28 76 b)). ;; (v 2900: 6f 69 64 29 5d 0a 20 3b 3b 20 20 20 20 20 20 20 oid)]. ;; 2910: 5b 28 6c 65 74 20 6c 6f 6f 70 20 28 5b 73 74 6d [(let loop ([stm 2920: 74 0a 20 3b 3b 20 20 20 20 20 20 20 20 20 20 20 t. ;; 2930: 20 20 20 20 20 20 20 20 28 61 6e 64 0a 20 3b 3b (and. ;; 2940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2950: 20 20 20 20 20 28 6f 70 74 69 6f 6e 61 6c 20 66 (optional f 2960: 69 6e 61 6c 69 7a 65 2d 73 74 61 74 65 6d 65 6e inalize-statemen 2970: 74 73 3f 20 23 66 29 0a 20 3b 3b 20 20 20 20 20 ts? #f). ;; 2980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2990: 28 73 71 6c 69 74 65 33 5f 6e 65 78 74 5f 73 74 (sqlite3_next_st 29a0: 6d 74 20 64 62 20 23 66 29 29 5d 29 0a 20 3b 3b mt db #f))]). ;; 29b0: 20 20 20 20 20 20 20 20 20 20 28 69 66 20 73 74 (if st 29c0: 6d 74 0a 20 3b 3b 20 20 20 20 20 20 20 20 20 20 mt. ;; 29d0: 20 20 20 20 28 6f 72 20 28 73 71 6c 69 74 65 33 (or (sqlite3 29e0: 5f 66 69 6e 61 6c 69 7a 65 20 73 74 6d 74 29 20 _finalize stmt) 29f0: 28 6c 6f 6f 70 20 28 73 71 6c 69 74 65 33 5f 6e (loop (sqlite3_n 2a00: 65 78 74 5f 73 74 6d 74 20 64 62 20 73 74 6d 74 ext_stmt db stmt 2a10: 29 29 29 0a 20 3b 3b 20 20 20 20 20 20 20 20 20 ))). ;; 2a20: 20 20 20 20 20 28 28 66 6f 72 65 69 67 6e 2d 73 ((foreign-s 2a30: 61 66 65 2d 6c 61 6d 62 64 61 20 73 71 6c 69 74 afe-lambda sqlit 2a40: 65 33 3a 73 74 61 74 75 73 20 22 73 71 6c 69 74 e3:status "sqlit 2a50: 65 33 5f 63 6c 6f 73 65 22 20 73 71 6c 69 74 65 e3_close" sqlite 2a60: 33 3a 64 61 74 61 62 61 73 65 29 20 64 62 29 29 3:database) db)) 2a70: 29 0a 20 3b 3b 20 20 20 20 20 20 20 3d 3e 20 28 ). ;; => ( 2a80: 61 62 6f 72 74 2d 73 71 6c 69 74 65 33 2d 65 72 abort-sqlite3-er 2a90: 72 6f 72 20 27 66 69 6e 61 6c 69 7a 65 21 20 64 ror 'finalize! d 2aa0: 62 20 64 62 29 5d 0a 20 3b 3b 20 20 20 20 20 20 b db)]. ;; 2ab0: 20 5b 65 6c 73 65 0a 20 3b 3b 20 20 20 20 20 20 [else. ;; 2ac0: 20 28 6c 65 74 20 28 5b 69 64 20 28 70 6f 69 6e (let ([id (poin 2ad0: 74 65 72 2d 3e 61 64 64 72 65 73 73 20 28 64 61 ter->address (da 2ae0: 74 61 62 61 73 65 2d 70 74 72 20 64 62 29 29 5d tabase-ptr db))] 2af0: 0a 20 3b 3b 20 20 20 20 20 20 20 20 20 20 20 20 . ;; 2b00: 20 5b 72 65 6c 65 61 73 65 2d 71 6e 73 20 28 6c [release-qns (l 2b10: 61 6d 62 64 61 20 28 5f 20 69 6e 66 6f 29 20 28 ambda (_ info) ( 2b20: 6f 62 6a 65 63 74 2d 72 65 6c 65 61 73 65 20 28 object-release ( 2b30: 76 65 63 74 6f 72 2d 72 65 66 20 69 6e 66 6f 20 vector-ref info 2b40: 30 29 29 29 5d 29 0a 20 3b 3b 20 20 20 20 20 20 0)))]). ;; 2b50: 20 20 20 28 63 61 6c 6c 2d 77 69 74 68 2f 73 79 (call-with/sy 2b60: 6e 63 68 20 2a 63 6f 6c 6c 61 74 69 6f 6e 73 2a nch *collations* 2b70: 0a 20 3b 3b 20 20 20 20 20 20 20 20 20 20 20 20 . ;; 2b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 ( 2b90: 63 75 74 65 20 68 61 73 68 2d 74 61 62 6c 65 2d cute hash-table- 2ba0: 74 72 65 65 2d 63 6c 65 61 72 21 20 3c 3e 20 69 tree-clear! <> i 2bb0: 64 20 72 65 6c 65 61 73 65 2d 71 6e 73 29 29 0a d release-qns)). 2bc0: 20 3b 3b 20 20 20 20 20 20 20 20 20 28 63 61 6c ;; (cal 2bd0: 6c 2d 77 69 74 68 2f 73 79 6e 63 68 20 2a 66 75 l-with/synch *fu 2be0: 6e 63 74 69 6f 6e 73 2a 0a 20 3b 3b 20 20 20 20 nctions*. ;; 2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2c00: 20 20 20 20 20 20 20 28 63 75 74 65 20 68 61 73 (cute has 2c10: 68 2d 74 61 62 6c 65 2d 74 72 65 65 2d 63 6c 65 h-table-tree-cle 2c20: 61 72 21 20 3c 3e 20 69 64 20 72 65 6c 65 61 73 ar! <> id releas 2c30: 65 2d 71 6e 73 29 29 0a 20 3b 3b 20 20 20 20 20 e-qns)). ;; 2c40: 20 20 20 20 28 64 61 74 61 62 61 73 65 2d 70 74 (database-pt 2c50: 72 2d 73 65 74 21 20 64 62 20 23 66 29 0a 20 3b r-set! db #f). ; 2c60: 3b 20 20 20 20 20 20 20 20 20 28 64 61 74 61 62 ; (datab 2c70: 61 73 65 2d 62 75 73 79 2d 68 61 6e 64 6c 65 72 ase-busy-handler 2c80: 2d 73 65 74 21 20 64 62 20 23 66 29 29 5d 29 5d -set! db #f))])] 2c90: 0a 20 3b 3b 20 20 20 20 5b 28 28 3f 20 73 74 61 . ;; [((? sta 2ca0: 74 65 6d 65 6e 74 3f 20 73 74 6d 74 29 29 0a 20 tement? stmt)). 2cb0: 3b 3b 20 20 20 20 20 20 28 63 6f 6e 64 0a 20 3b ;; (cond. ; 2cc0: 3b 20 20 20 20 20 20 20 5b 28 6e 6f 74 20 28 73 ; [(not (s 2cd0: 74 61 74 65 6d 65 6e 74 2d 70 74 72 20 73 74 6d tatement-ptr stm 2ce0: 74 29 29 0a 20 3b 3b 20 20 20 20 20 20 20 28 76 t)). ;; (v 2cf0: 6f 69 64 29 5d 0a 20 3b 3b 20 20 20 20 20 20 20 oid)]. ;; 2d00: 5b 28 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 [(sqlite3_finali 2d10: 7a 65 20 28 73 74 61 74 65 6d 65 6e 74 2d 70 74 ze (statement-pt 2d20: 72 20 73 74 6d 74 29 29 0a 20 3b 3b 20 20 20 20 r stmt)). ;; 2d30: 20 20 20 3d 3e 20 28 61 62 6f 72 74 2d 73 71 6c => (abort-sql 2d40: 69 74 65 33 2d 65 72 72 6f 72 20 27 66 69 6e 61 ite3-error 'fina 2d50: 6c 69 7a 65 21 20 28 73 74 61 74 65 6d 65 6e 74 lize! (statement 2d60: 2d 64 61 74 61 62 61 73 65 20 73 74 6d 74 29 20 -database stmt) 2d70: 73 74 6d 74 29 5d 0a 20 3b 3b 20 20 20 20 20 20 stmt)]. ;; 2d80: 20 5b 65 6c 73 65 0a 20 3b 3b 20 20 20 20 20 20 [else. ;; 2d90: 20 28 73 74 61 74 65 6d 65 6e 74 2d 70 74 72 2d (statement-ptr- 2da0: 73 65 74 21 20 73 74 6d 74 20 23 66 29 5d 29 5d set! stmt #f)])] 2db0: 0a 20 3b 3b 20 20 20 20 5b 28 76 20 2e 20 5f 29 . ;; [(v . _) 2dc0: 0a 20 3b 3b 20 20 20 20 20 20 28 65 72 72 6f 72 . ;; (error 2dd0: 2d 61 72 67 75 6d 65 6e 74 2d 74 79 70 65 20 27 -argument-type ' 2de0: 66 69 6e 61 6c 69 7a 65 21 20 76 20 22 64 61 74 finalize! v "dat 2df0: 61 62 61 73 65 20 6f 72 20 73 74 61 74 65 6d 65 abase or stateme 2e00: 6e 74 22 29 5d 29 29 0a 0a 3b 3b 3b 20 53 74 61 nt")]))..;;; Sta 2e10: 74 65 6d 65 6e 74 20 69 6e 74 65 72 66 61 63 65 tement interface 2e20: 0a 20 28 64 65 66 69 6e 65 20 73 71 6c 69 74 65 . (define sqlite 2e30: 33 5f 70 72 65 70 61 72 65 5f 76 32 20 28 66 6f 3_prepare_v2 (fo 2e40: 72 65 69 67 6e 2d 70 72 6f 63 65 64 75 72 65 20 reign-procedure 2e50: 22 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 "sqlite3_prepare 2e60: 5f 76 32 22 0a 20 20 20 20 20 20 20 20 20 20 20 _v2". 2e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2e90: 20 20 20 20 28 20 73 71 6c 69 74 65 33 3a 64 61 ( sqlite3:da 2ea0: 74 61 62 61 73 65 2a 20 75 38 2a 20 69 6e 74 20 tabase* u8* int 2eb0: 76 6f 69 64 2a 20 75 38 2a 29 20 69 6e 74 29 29 void* u8*) int)) 2ec0: 0a 20 28 64 65 66 69 6e 65 20 28 61 6c 6c 6f 63 . (define (alloc 2ed0: 2d 73 74 61 74 65 6d 65 6e 74 2a 29 0a 20 20 20 -statement*). 2ee0: 28 6d 61 6b 65 2d 66 74 79 70 65 2d 70 6f 69 6e (make-ftype-poin 2ef0: 74 65 72 20 73 71 6c 69 74 65 33 3a 73 74 61 74 ter sqlite3:stat 2f00: 65 6d 65 6e 74 2a 2a 0a 20 20 20 20 20 20 20 20 ement**. 2f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 ( 2f20: 66 6f 72 65 69 67 6e 2d 61 6c 6c 6f 63 20 28 66 foreign-alloc (f 2f30: 74 79 70 65 2d 73 69 7a 65 6f 66 20 73 71 6c 69 type-sizeof sqli 2f40: 74 65 33 3a 73 74 61 74 65 6d 65 6e 74 2a 2a 29 te3:statement**) 2f50: 29 29 29 0a 0a 20 3b 3b 20 43 72 65 61 74 65 20 ))).. ;; Create 2f60: 61 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 0a a new statement. 2f70: 20 28 64 65 66 69 6e 65 20 28 70 72 65 70 61 72 (define (prepar 2f80: 65 20 64 62 20 73 71 6c 29 0a 20 20 20 28 63 68 e db sql). (ch 2f90: 65 63 6b 2d 64 61 74 61 62 61 73 65 20 27 70 72 eck-database 'pr 2fa0: 65 70 61 72 65 20 64 62 29 0a 20 20 20 28 61 73 epare db). (as 2fb0: 73 65 72 74 20 28 61 6e 64 20 70 72 65 70 61 72 sert (and prepar 2fc0: 65 20 28 73 74 72 69 6e 67 3f 20 73 71 6c 29 29 e (string? sql)) 2fd0: 29 0a 20 20 20 28 6c 65 74 20 72 65 74 72 79 20 ). (let retry 2fe0: 28 5b 72 65 74 72 69 65 73 20 30 5d 29 0a 20 20 ([retries 0]). 2ff0: 20 20 20 28 6c 65 74 2a 20 28 5b 70 74 72 20 28 (let* ([ptr ( 3000: 61 6c 6c 6f 63 2d 73 74 61 74 65 6d 65 6e 74 2a alloc-statement* 3010: 29 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b )]. [ 3020: 7a 53 71 6c 20 28 73 74 72 69 6e 67 2d 3e 75 74 zSql (string->ut 3030: 66 38 20 73 71 6c 29 5d 0a 20 20 20 20 20 20 20 f8 sql)]. 3040: 20 20 20 20 20 5b 6e 42 79 74 65 20 28 62 79 74 [nByte (byt 3050: 65 76 65 63 74 6f 72 2d 6c 65 6e 67 74 68 20 7a evector-length z 3060: 53 71 6c 29 5d 0a 20 20 20 20 20 20 20 20 20 20 Sql)]. 3070: 20 20 5b 65 20 28 73 71 6c 69 74 65 33 5f 70 72 [e (sqlite3_pr 3080: 65 70 61 72 65 5f 76 32 20 28 64 61 74 61 62 61 epare_v2 (databa 3090: 73 65 2d 61 64 64 72 20 64 62 29 20 7a 53 71 6c se-addr db) zSql 30a0: 20 6e 42 79 74 65 20 28 66 74 79 70 65 2d 70 6f nByte (ftype-po 30b0: 69 6e 74 65 72 2d 61 64 64 72 65 73 73 20 70 74 inter-address pt 30c0: 72 29 20 23 66 29 5d 29 0a 20 20 20 20 20 20 20 r) #f)]). 30d0: 28 63 6f 6e 64 20 5b 28 65 71 75 61 6c 3f 20 65 (cond [(equal? e 30e0: 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 0). 30f0: 20 20 28 6d 61 6b 65 2d 73 74 61 74 65 6d 65 6e (make-statemen 3100: 74 20 28 66 74 79 70 65 2d 26 72 65 66 20 73 71 t (ftype-&ref sq 3110: 6c 69 74 65 33 3a 73 74 61 74 65 6d 65 6e 74 2a lite3:statement* 3120: 2a 20 28 2a 29 20 70 74 72 29 20 64 62 20 73 71 * (*) ptr) db sq 3130: 6c 29 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 l)]. 3140: 20 5b 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 [else. 3150: 20 20 20 20 20 28 63 61 73 65 20 28 6e 75 6d 62 (case (numb 3160: 65 72 2d 3e 73 71 6c 69 74 65 33 3a 73 74 61 74 er->sqlite3:stat 3170: 75 73 20 65 29 0a 20 20 20 20 20 20 20 20 20 20 us e). 3180: 20 20 20 20 20 20 23 3b 5b 28 62 75 73 79 29 0a #;[(busy). 3190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31a0: 20 28 6c 65 74 20 28 5b 68 20 28 64 61 74 61 62 (let ([h (datab 31b0: 61 73 65 2d 62 75 73 79 2d 68 61 6e 64 6c 65 72 ase-busy-handler 31c0: 20 64 62 29 5d 29 0a 20 20 20 20 20 20 20 20 20 db)]). 31d0: 20 20 20 20 20 20 20 20 20 20 28 63 6f 6e 64 0a (cond. 31e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31f0: 20 20 20 20 5b 28 61 6e 64 20 68 20 28 68 20 64 [(and h (h d 3200: 62 20 72 65 74 72 69 65 73 29 29 0a 20 20 20 20 b retries)). 3210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3220: 20 28 72 65 74 72 79 20 28 66 78 2b 20 72 65 74 (retry (fx+ ret 3230: 72 69 65 73 20 31 29 29 5d 0a 20 20 20 20 20 20 ries 1))]. 3240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 65 [e 3250: 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 lse. 3260: 20 20 20 20 20 20 20 20 20 28 28 61 62 6f 72 74 ((abort 3270: 2d 73 71 6c 69 74 65 33 2d 65 72 72 6f 72 20 27 -sqlite3-error ' 3280: 70 72 65 70 61 72 65 20 64 62 20 64 62 20 73 71 prepare db db sq 3290: 6c 29 20 65 29 5d 29 29 5d 0a 20 20 20 20 20 20 l) e)]))]. 32a0: 20 20 20 20 20 20 20 20 20 20 5b 65 6c 73 65 0a [else. 32b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32c0: 20 28 28 61 62 6f 72 74 2d 73 71 6c 69 74 65 33 ((abort-sqlite3 32d0: 2d 65 72 72 6f 72 20 27 70 72 65 70 61 72 65 20 -error 'prepare 32e0: 64 62 20 64 62 20 73 71 6c 29 20 65 29 5d 29 5d db db sql) e)])] 32f0: 29 29 29 29 0a 0a 20 3b 3b 20 52 65 74 72 69 65 )))).. ;; Retrie 3300: 76 65 20 74 68 65 20 53 51 4c 20 73 6f 75 72 63 ve the SQL sourc 3310: 65 20 63 6f 64 65 20 6f 66 20 61 20 73 74 61 74 e code of a stat 3320: 65 6d 65 6e 74 0a 20 28 64 65 66 69 6e 65 20 28 ement. (define ( 3330: 73 6f 75 72 63 65 2d 73 71 6c 20 73 74 6d 74 29 source-sql stmt) 3340: 0a 20 20 20 28 63 68 65 63 6b 2d 73 74 61 74 65 . (check-state 3350: 6d 65 6e 74 20 27 73 6f 75 72 63 65 2d 73 71 6c ment 'source-sql 3360: 20 73 74 6d 74 29 0a 20 20 20 28 6c 65 74 2a 20 stmt). (let* 3370: 28 5b 66 20 28 66 6f 72 65 69 67 6e 2d 70 72 6f ([f (foreign-pro 3380: 63 65 64 75 72 65 20 22 73 71 6c 69 74 65 33 5f cedure "sqlite3_ 3390: 73 71 6c 22 20 28 73 71 6c 69 74 65 33 3a 73 74 sql" (sqlite3:st 33a0: 61 74 65 6d 65 6e 74 2a 29 20 73 74 72 69 6e 67 atement*) string 33b0: 29 5d 29 0a 20 20 20 20 20 28 66 20 28 73 74 61 )]). (f (sta 33c0: 74 65 6d 65 6e 74 2d 61 64 64 72 20 73 74 6d 74 tement-addr stmt 33d0: 29 29 29 29 0a 0a 20 28 64 65 66 69 6e 65 20 28 )))).. (define ( 33e0: 66 69 6e 61 6c 69 7a 65 2d 73 74 61 74 65 6d 65 finalize-stateme 33f0: 6e 74 21 20 73 74 6d 74 29 0a 20 20 20 28 63 68 nt! stmt). (ch 3400: 65 63 6b 2d 73 74 61 74 65 6d 65 6e 74 20 27 66 eck-statement 'f 3410: 69 6e 61 6c 69 7a 65 2d 73 74 61 74 65 6d 65 6e inalize-statemen 3420: 74 21 20 73 74 6d 74 29 0a 20 20 20 28 6c 65 74 t! stmt). (let 3430: 2a 20 28 5b 66 20 28 66 6f 72 65 69 67 6e 2d 70 * ([f (foreign-p 3440: 72 6f 63 65 64 75 72 65 20 22 73 71 6c 69 74 65 rocedure "sqlite 3450: 33 5f 66 69 6e 61 6c 69 7a 65 22 20 20 28 73 71 3_finalize" (sq 3460: 6c 69 74 65 33 3a 73 74 61 74 65 6d 65 6e 74 2a lite3:statement* 3470: 29 20 69 6e 74 29 5d 0a 20 20 20 20 20 20 20 20 ) int)]. 3480: 20 20 5b 6e 20 28 66 20 28 73 74 61 74 65 6d 65 [n (f (stateme 3490: 6e 74 2d 61 64 64 72 20 73 74 6d 74 29 29 5d 29 nt-addr stmt))]) 34a0: 0a 20 20 20 20 20 28 73 74 61 74 65 6d 65 6e 74 . (statement 34b0: 2d 70 74 72 2d 73 65 74 21 20 73 74 6d 74 20 23 -ptr-set! stmt # 34c0: 66 29 0a 20 20 20 20 20 6e 29 29 0a 0a 20 3b 3b f). n)).. ;; 34d0: 20 52 65 73 65 74 20 61 6e 20 65 78 69 73 74 69 Reset an existi 34e0: 6e 67 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 ng statement to 34f0: 70 72 6f 63 65 73 73 20 69 74 20 61 67 61 69 6e process it again 3500: 0a 20 28 64 65 66 69 6e 65 20 28 72 65 73 65 74 . (define (reset 3510: 21 20 73 74 6d 74 29 0a 20 20 20 28 63 68 65 63 ! stmt). (chec 3520: 6b 2d 73 74 61 74 65 6d 65 6e 74 20 27 72 65 73 k-statement 'res 3530: 65 74 21 20 73 74 6d 74 29 0a 20 20 20 28 63 6f et! stmt). (co 3540: 6e 64 20 5b 28 28 66 6f 72 65 69 67 6e 2d 70 72 nd [((foreign-pr 3550: 6f 63 65 64 75 72 65 20 20 22 73 71 6c 69 74 65 ocedure "sqlite 3560: 33 5f 72 65 73 65 74 22 20 28 73 71 6c 69 74 65 3_reset" (sqlite 3570: 33 3a 73 74 61 74 65 6d 65 6e 74 2a 29 20 69 6e 3:statement*) in 3580: 74 29 0a 20 20 20 20 20 20 20 20 20 20 20 28 73 t). (s 3590: 74 61 74 65 6d 65 6e 74 2d 61 64 64 72 20 73 74 tatement-addr st 35a0: 6d 74 29 29 0a 20 20 20 20 20 20 20 20 20 20 3d mt)). = 35b0: 3e 20 28 61 62 6f 72 74 2d 73 71 6c 69 74 65 33 > (abort-sqlite3 35c0: 2d 65 72 72 6f 72 20 27 72 65 73 65 74 21 20 28 -error 'reset! ( 35d0: 73 74 61 74 65 6d 65 6e 74 2d 64 61 74 61 62 61 statement-databa 35e0: 73 65 20 73 74 6d 74 29 20 73 74 6d 74 29 5d 29 se stmt) stmt)]) 35f0: 29 0a 0a 20 3b 3b 20 47 65 74 20 6e 75 6d 62 65 ).. ;; Get numbe 3600: 72 20 6f 66 20 62 69 6e 64 61 62 6c 65 20 70 61 r of bindable pa 3610: 72 61 6d 65 74 65 72 73 0a 20 28 64 65 66 69 6e rameters. (defin 3620: 65 20 28 62 69 6e 64 2d 70 61 72 61 6d 65 74 65 e (bind-paramete 3630: 72 2d 63 6f 75 6e 74 20 73 74 6d 74 29 0a 20 20 r-count stmt). 3640: 20 28 63 68 65 63 6b 2d 73 74 61 74 65 6d 65 6e (check-statemen 3650: 74 20 27 62 69 6e 64 2d 70 61 72 61 6d 65 74 65 t 'bind-paramete 3660: 72 2d 63 6f 75 6e 74 20 73 74 6d 74 29 0a 20 20 r-count stmt). 3670: 20 28 28 66 6f 72 65 69 67 6e 2d 70 72 6f 63 65 ((foreign-proce 3680: 64 75 72 65 20 22 73 71 6c 69 74 65 33 5f 62 69 dure "sqlite3_bi 3690: 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 nd_parameter_cou 36a0: 6e 74 22 20 28 73 71 6c 69 74 65 33 3a 73 74 61 nt" (sqlite3:sta 36b0: 74 65 6d 65 6e 74 2a 29 20 69 6e 74 29 0a 20 20 tement*) int). 36c0: 20 20 28 73 74 61 74 65 6d 65 6e 74 2d 61 64 64 (statement-add 36d0: 72 20 73 74 6d 74 29 29 29 0a 0a 20 3b 3b 20 47 r stmt))).. ;; G 36e0: 65 74 20 69 6e 64 65 78 20 6f 66 20 61 20 62 69 et index of a bi 36f0: 6e 64 61 62 6c 65 20 70 61 72 61 6d 65 74 65 72 ndable parameter 3700: 20 6f 72 20 23 66 20 69 66 20 6e 6f 20 70 61 72 or #f if no par 3710: 61 6d 65 74 65 72 20 77 69 74 68 20 74 68 65 0a ameter with the. 3720: 20 3b 3b 20 67 69 76 65 6e 20 6e 61 6d 65 20 65 ;; given name e 3730: 78 69 73 74 73 0a 20 28 64 65 66 69 6e 65 20 28 xists. (define ( 3740: 62 69 6e 64 2d 70 61 72 61 6d 65 74 65 72 2d 69 bind-parameter-i 3750: 6e 64 65 78 20 73 74 6d 74 20 6e 61 6d 65 29 0a ndex stmt name). 3760: 20 20 20 28 63 68 65 63 6b 2d 73 74 61 74 65 6d (check-statem 3770: 65 6e 74 20 27 62 69 6e 64 2d 70 61 72 61 6d 65 ent 'bind-parame 3780: 74 65 72 2d 69 6e 64 65 78 20 73 74 6d 74 29 0a ter-index stmt). 3790: 20 20 20 28 6c 65 74 20 28 5b 69 20 28 28 66 6f (let ([i ((fo 37a0: 72 65 69 67 6e 2d 70 72 6f 63 65 64 75 72 65 20 reign-procedure 37b0: 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 "sqlite3_bind_pa 37c0: 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 22 0a 20 rameter_index". 37d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 37e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 ( 37f0: 73 71 6c 69 74 65 33 3a 73 74 61 74 65 6d 65 6e sqlite3:statemen 3800: 74 2a 20 73 74 72 69 6e 67 29 20 69 6e 74 29 0a t* string) int). 3810: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 74 (st 3820: 61 74 65 6d 65 6e 74 2d 61 64 64 72 20 73 74 6d atement-addr stm 3830: 74 29 20 6e 61 6d 65 29 5d 29 0a 20 20 20 20 20 t) name)]). 3840: 28 69 66 20 28 7a 65 72 6f 3f 20 69 29 0a 20 20 (if (zero? i). 3850: 20 20 20 20 20 20 20 23 66 0a 20 20 20 20 20 20 #f. 3860: 20 20 20 28 66 78 2d 20 69 20 31 29 29 29 29 0a (fx- i 1)))). 3870: 0a 20 3b 3b 20 47 65 74 20 74 68 65 20 6e 61 6d . ;; Get the nam 3880: 65 20 6f 66 20 61 20 62 69 6e 64 61 62 6c 65 20 e of a bindable 3890: 70 61 72 61 6d 65 74 65 72 0a 20 28 64 65 66 69 parameter. (defi 38a0: 6e 65 20 28 62 69 6e 64 2d 70 61 72 61 6d 65 74 ne (bind-paramet 38b0: 65 72 2d 6e 61 6d 65 20 73 74 6d 74 20 69 29 0a er-name stmt i). 38c0: 20 20 20 28 63 68 65 63 6b 2d 73 74 61 74 65 6d (check-statem 38d0: 65 6e 74 20 27 62 69 6e 64 2d 70 61 72 61 6d 65 ent 'bind-parame 38e0: 74 65 72 2d 6e 61 6d 65 20 73 74 6d 74 29 0a 20 ter-name stmt). 38f0: 20 20 28 28 66 6f 72 65 69 67 6e 2d 70 72 6f 63 ((foreign-proc 3900: 65 64 75 72 65 20 22 73 71 6c 69 74 65 33 5f 62 edure "sqlite3_b 3910: 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 ind_parameter_na 3920: 6d 65 22 20 28 73 71 6c 69 74 65 33 3a 73 74 61 me" (sqlite3:sta 3930: 74 65 6d 65 6e 74 2a 20 69 6e 74 29 20 73 74 72 tement* int) str 3940: 69 6e 67 29 0a 20 20 20 20 28 73 74 61 74 65 6d ing). (statem 3950: 65 6e 74 2d 61 64 64 72 20 73 74 6d 74 29 20 28 ent-addr stmt) ( 3960: 66 78 2b 20 69 20 31 29 29 29 0a 0a 20 3b 3b 20 fx+ i 1))).. ;; 3970: 42 69 6e 64 20 64 61 74 61 20 61 73 20 70 61 72 Bind data as par 3980: 61 6d 65 74 65 72 73 20 74 6f 20 61 6e 20 65 78 ameters to an ex 3990: 69 73 74 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 isting statement 39a0: 0a 0a 20 28 64 65 66 69 6e 65 20 53 51 4c 49 54 .. (define SQLIT 39b0: 45 5f 54 52 41 4e 53 49 45 4e 54 20 2d 31 29 0a E_TRANSIENT -1). 39c0: 20 28 64 65 66 69 6e 65 20 28 62 69 6e 64 21 20 (define (bind! 39d0: 73 74 6d 74 20 69 20 76 29 0a 20 20 20 28 63 68 stmt i v). (ch 39e0: 65 63 6b 2d 73 74 61 74 65 6d 65 6e 74 20 27 62 eck-statement 'b 39f0: 69 6e 64 21 20 73 74 6d 74 29 0a 20 20 20 28 61 ind! stmt). (a 3a00: 73 73 65 72 74 20 28 61 6e 64 20 62 69 6e 64 21 ssert (and bind! 3a10: 20 28 6e 75 6d 62 65 72 3f 20 69 29 20 28 3e 3d (number? i) (>= 3a20: 20 69 20 30 29 29 29 0a 20 20 20 28 63 6f 6e 64 i 0))). (cond 3a30: 0a 20 20 20 20 5b 28 62 79 74 65 76 65 63 74 6f . [(bytevecto 3a40: 72 3f 20 76 29 0a 20 20 20 20 20 28 63 6f 6e 64 r? v). (cond 3a50: 20 5b 28 28 66 6f 72 65 69 67 6e 2d 70 72 6f 63 [((foreign-proc 3a60: 65 64 75 72 65 20 22 73 71 6c 69 74 65 33 5f 62 edure "sqlite3_b 3a70: 69 6e 64 5f 62 6c 6f 62 22 20 28 73 71 6c 69 74 ind_blob" (sqlit 3a80: 65 33 3a 73 74 61 74 65 6d 65 6e 74 2a 20 69 6e e3:statement* in 3a90: 74 20 75 38 2a 20 69 6e 74 20 76 6f 69 64 2a 29 t u8* int void*) 3aa0: 20 69 6e 74 29 0a 20 20 20 20 20 20 20 20 20 20 int). 3ab0: 20 20 20 28 73 74 61 74 65 6d 65 6e 74 2d 61 64 (statement-ad 3ac0: 64 72 20 73 74 6d 74 29 20 28 66 78 2b 20 69 20 dr stmt) (fx+ i 3ad0: 31 29 20 76 20 28 62 79 74 65 76 65 63 74 6f 72 1) v (bytevector 3ae0: 2d 6c 65 6e 67 74 68 20 76 29 20 53 51 4c 49 54 -length v) SQLIT 3af0: 45 5f 54 52 41 4e 53 49 45 4e 54 29 0a 20 20 20 E_TRANSIENT). 3b00: 20 20 20 20 20 20 20 20 20 3d 3e 20 28 61 62 6f => (abo 3b10: 72 74 2d 73 71 6c 69 74 65 33 2d 65 72 72 6f 72 rt-sqlite3-error 3b20: 20 27 62 69 6e 64 21 20 28 73 74 61 74 65 6d 65 'bind! (stateme 3b30: 6e 74 2d 64 61 74 61 62 61 73 65 20 73 74 6d 74 nt-database stmt 3b40: 29 20 73 74 6d 74 20 69 20 76 29 5d 29 5d 0a 20 ) stmt i v)])]. 3b50: 20 20 20 5b 28 6f 72 20 28 61 6e 64 20 28 66 69 [(or (and (fi 3b60: 78 6e 75 6d 3f 20 76 29 20 76 29 20 28 61 6e 64 xnum? v) v) (and 3b70: 20 28 62 6f 6f 6c 65 61 6e 3f 20 76 29 20 28 69 (boolean? v) (i 3b80: 66 20 76 20 31 20 30 29 29 29 0a 20 20 20 20 20 f v 1 0))). 3b90: 3d 3e 20 28 6c 61 6d 62 64 61 20 28 76 29 0a 20 => (lambda (v). 3ba0: 20 20 20 20 20 20 20 20 20 28 63 6f 6e 64 20 5b (cond [ 3bb0: 28 28 66 6f 72 65 69 67 6e 2d 70 72 6f 63 65 64 ((foreign-proced 3bc0: 75 72 65 20 22 73 71 6c 69 74 65 33 5f 62 69 6e ure "sqlite3_bin 3bd0: 64 5f 69 6e 74 36 34 22 0a 20 20 20 20 20 20 20 d_int64". 3be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 (s 3c00: 71 6c 69 74 65 33 3a 73 74 61 74 65 6d 65 6e 74 qlite3:statement 3c10: 2a 20 69 6e 74 20 69 6e 74 65 67 65 72 2d 36 34 * int integer-64 3c20: 29 20 69 6e 74 29 0a 20 20 20 20 20 20 20 20 20 ) int). 3c30: 20 20 20 20 20 20 20 20 20 28 73 74 61 74 65 6d (statem 3c40: 65 6e 74 2d 61 64 64 72 20 73 74 6d 74 29 20 28 ent-addr stmt) ( 3c50: 66 78 2b 20 69 20 31 29 20 76 29 0a 20 20 20 20 fx+ i 1) v). 3c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3e 20 => 3c70: 28 61 62 6f 72 74 2d 73 71 6c 69 74 65 33 2d 65 (abort-sqlite3-e 3c80: 72 72 6f 72 20 27 62 69 6e 64 21 20 28 73 74 61 rror 'bind! (sta 3c90: 74 65 6d 65 6e 74 2d 64 61 74 61 62 61 73 65 20 tement-database 3ca0: 73 74 6d 74 29 20 73 74 6d 74 20 69 20 76 29 5d stmt) stmt i v)] 3cb0: 29 29 5d 0a 20 20 20 20 5b 28 66 6c 6f 6e 75 6d ))]. [(flonum 3cc0: 3f 20 76 29 0a 20 20 20 20 20 28 63 6f 6e 64 20 ? v). (cond 3cd0: 5b 28 28 66 6f 72 65 69 67 6e 2d 70 72 6f 63 65 [((foreign-proce 3ce0: 64 75 72 65 20 22 73 71 6c 69 74 65 33 5f 62 69 dure "sqlite3_bi 3cf0: 6e 64 5f 64 6f 75 62 6c 65 22 0a 20 20 20 20 20 nd_double". 3d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d10: 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 (sqli 3d20: 74 65 33 3a 73 74 61 74 65 6d 65 6e 74 2a 20 69 te3:statement* i 3d30: 6e 74 20 64 6f 75 62 6c 65 29 20 69 6e 74 29 0a nt double) int). 3d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 74 (st 3d50: 61 74 65 6d 65 6e 74 2d 61 64 64 72 20 73 74 6d atement-addr stm 3d60: 74 29 20 28 66 78 2b 20 69 20 31 29 20 28 65 78 t) (fx+ i 1) (ex 3d70: 61 63 74 2d 3e 69 6e 65 78 61 63 74 20 76 29 29 act->inexact v)) 3d80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 3d 3e 20 . => 3d90: 28 61 62 6f 72 74 2d 73 71 6c 69 74 65 33 2d 65 (abort-sqlite3-e 3da0: 72 72 6f 72 20 27 62 69 6e 64 21 20 28 73 74 61 rror 'bind! (sta 3db0: 74 65 6d 65 6e 74 2d 64 61 74 61 62 61 73 65 20 tement-database 3dc0: 73 74 6d 74 29 20 73 74 6d 74 20 69 20 76 29 5d stmt) stmt i v)] 3dd0: 29 5d 0a 20 20 20 20 5b 28 6f 72 20 28 73 74 72 )]. [(or (str 3de0: 69 6e 67 3f 20 76 29 20 28 6e 75 6d 62 65 72 3f ing? v) (number? 3df0: 20 76 29 29 0a 20 20 20 20 20 28 6c 65 74 20 28 v)). (let ( 3e00: 5b 66 20 28 66 6f 72 65 69 67 6e 2d 70 72 6f 63 [f (foreign-proc 3e10: 65 64 75 72 65 20 22 73 71 6c 69 74 65 33 5f 62 edure "sqlite3_b 3e20: 69 6e 64 5f 74 65 78 74 22 0a 20 20 20 20 20 20 ind_text". 3e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3e40: 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 (sqli 3e50: 74 65 33 3a 73 74 61 74 65 6d 65 6e 74 2a 20 69 te3:statement* i 3e60: 6e 74 20 75 38 2a 20 69 6e 74 20 76 6f 69 64 2a nt u8* int void* 3e70: 29 20 69 6e 74 29 5d 0a 20 20 20 20 20 20 20 20 ) int)]. 3e80: 20 20 20 5b 73 20 28 69 66 20 28 73 74 72 69 6e [s (if (strin 3e90: 67 3f 20 76 29 0a 09 09 20 20 28 73 74 72 69 6e g? v)... (strin 3ea0: 67 2d 3e 75 74 66 38 20 76 29 0a 09 09 20 20 28 g->utf8 v)... ( 3eb0: 6e 75 6d 62 65 72 2d 3e 73 74 72 69 6e 67 20 76 number->string v 3ec0: 29 29 5d 29 0a 20 20 20 20 20 20 20 28 63 6f 6e ))]). (con 3ed0: 64 20 5b 28 66 20 28 73 74 61 74 65 6d 65 6e 74 d [(f (statement 3ee0: 2d 61 64 64 72 20 73 74 6d 74 29 20 28 66 78 2b -addr stmt) (fx+ 3ef0: 20 69 20 31 29 20 73 20 28 62 79 74 65 76 65 63 i 1) s (bytevec 3f00: 74 6f 72 2d 6c 65 6e 67 74 68 20 73 29 20 53 51 tor-length s) SQ 3f10: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 0a LITE_TRANSIENT). 3f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3e => 3f30: 20 28 61 62 6f 72 74 2d 73 71 6c 69 74 65 33 2d (abort-sqlite3- 3f40: 65 72 72 6f 72 20 27 62 69 6e 64 21 20 28 73 74 error 'bind! (st 3f50: 61 74 65 6d 65 6e 74 2d 64 61 74 61 62 61 73 65 atement-database 3f60: 20 73 74 6d 74 29 20 73 74 6d 74 20 69 20 76 29 stmt) stmt i v) 3f70: 5d 29 29 5d 0a 20 20 20 20 5b 28 73 71 6c 2d 6e ]))]. [(sql-n 3f80: 75 6c 6c 3f 20 76 29 0a 20 20 20 20 20 28 63 6f ull? v). (co 3f90: 6e 64 20 5b 28 28 66 6f 72 65 69 67 6e 2d 70 72 nd [((foreign-pr 3fa0: 6f 63 65 64 75 72 65 20 22 73 71 6c 69 74 65 33 ocedure "sqlite3 3fb0: 5f 62 69 6e 64 5f 6e 75 6c 6c 22 20 28 73 71 6c _bind_null" (sql 3fc0: 69 74 65 33 3a 73 74 61 74 65 6d 65 6e 74 2a 20 ite3:statement* 3fd0: 69 6e 74 29 20 69 6e 74 29 0a 20 20 20 20 20 20 int) int). 3fe0: 20 20 20 20 20 20 20 28 73 74 61 74 65 6d 65 6e (statemen 3ff0: 74 2d 61 64 64 72 20 73 74 6d 74 29 20 28 66 78 t-addr stmt) (fx 4000: 2b 20 69 20 31 29 29 0a 20 20 20 20 20 20 20 20 + i 1)). 4010: 20 20 20 20 3d 3e 20 28 61 62 6f 72 74 2d 73 71 => (abort-sq 4020: 6c 69 74 65 33 2d 65 72 72 6f 72 20 27 62 69 6e lite3-error 'bin 4030: 64 21 20 28 73 74 61 74 65 6d 65 6e 74 2d 64 61 d! (statement-da 4040: 74 61 62 61 73 65 20 73 74 6d 74 29 20 73 74 6d tabase stmt) stm 4050: 74 20 69 29 5d 29 5d 0a 20 20 20 20 5b 65 6c 73 t i)])]. [els 4060: 65 0a 20 20 20 20 20 28 65 72 72 6f 72 20 27 62 e. (error 'b 4070: 69 6e 64 21 20 22 62 6c 6f 62 2c 20 6e 75 6d 62 ind! "blob, numb 4080: 65 72 2c 20 62 6f 6f 6c 65 61 6e 2c 20 73 74 72 er, boolean, str 4090: 69 6e 67 20 6f 72 20 73 71 6c 2d 6e 75 6c 6c 22 ing or sql-null" 40a0: 20 76 29 5d 29 29 0a 0a 20 20 20 20 20 20 20 20 v)])).. 40b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 40c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 40d0: 3b 20 48 65 6c 70 65 72 0a 0a 20 28 64 65 66 69 ; Helper.. (defi 40e0: 6e 65 20 28 25 62 69 6e 64 2d 70 61 72 61 6d 65 ne (%bind-parame 40f0: 74 65 72 73 21 20 6c 6f 63 20 73 74 6d 74 20 70 ters! loc stmt p 4100: 61 72 61 6d 73 29 0a 20 20 20 28 72 65 73 65 74 arams). (reset 4110: 21 20 73 74 6d 74 29 0a 20 20 20 28 6c 65 74 20 ! stmt). (let 4120: 28 5b 63 6e 74 20 28 62 69 6e 64 2d 70 61 72 61 ([cnt (bind-para 4130: 6d 65 74 65 72 2d 63 6f 75 6e 74 20 73 74 6d 74 meter-count stmt 4140: 29 5d 0a 20 20 20 20 20 20 20 20 20 5b 76 73 20 )]. [vs 4150: 28 6d 61 6b 65 2d 65 71 2d 68 61 73 68 74 61 62 (make-eq-hashtab 4160: 6c 65 29 5d 29 0a 20 20 20 20 20 28 6c 65 74 20 le)]). (let 4170: 6c 6f 6f 70 20 28 5b 69 20 30 5d 20 5b 70 61 72 loop ([i 0] [par 4180: 61 6d 73 20 70 61 72 61 6d 73 5d 29 0a 20 20 20 ams params]). 4190: 20 20 20 20 28 6d 61 74 63 68 20 70 61 72 61 6d (match param 41a0: 73 0a 20 20 20 20 20 20 20 20 20 5b 28 28 3f 20 s. [((? 41b0: 73 79 6d 62 6f 6c 3f 20 6b 29 20 76 20 2e 20 72 symbol? k) v . r 41c0: 65 73 74 29 0a 20 20 20 20 20 20 20 20 20 20 28 est). ( 41d0: 63 6f 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 cond. 41e0: 5b 28 62 69 6e 64 2d 70 61 72 61 6d 65 74 65 72 [(bind-parameter 41f0: 2d 69 6e 64 65 78 20 73 74 6d 74 20 28 73 74 72 -index stmt (str 4200: 69 6e 67 2d 61 70 70 65 6e 64 20 22 3a 22 20 28 ing-append ":" ( 4210: 73 79 6d 62 6f 6c 2d 3e 73 74 72 69 6e 67 20 6b symbol->string k 4220: 29 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 ))). 4230: 3d 3e 20 28 6c 61 6d 62 64 61 20 28 6a 29 0a 20 => (lambda (j). 4240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4250: 28 68 61 73 68 74 61 62 6c 65 2d 73 65 74 21 20 (hashtable-set! 4260: 76 73 20 6a 20 76 29 0a 20 20 20 20 20 20 20 20 vs j v). 4270: 20 20 20 20 20 20 20 20 20 28 6c 6f 6f 70 20 69 (loop i 4280: 20 72 65 73 74 29 29 5d 0a 20 20 20 20 20 20 20 rest))]. 4290: 20 20 20 20 5b 65 6c 73 65 0a 20 20 20 20 20 20 [else. 42a0: 20 20 20 20 20 20 28 65 72 72 6f 72 20 6c 6f 63 (error loc 42b0: 20 22 76 61 6c 75 65 20 6f 72 20 6b 65 79 77 6f "value or keywo 42c0: 72 64 20 6d 61 74 63 68 69 6e 67 20 61 20 62 69 rd matching a bi 42d0: 6e 64 20 70 61 72 61 6d 65 74 65 72 20 6e 61 6d nd parameter nam 42e0: 65 22 20 6b 29 5d 29 5d 0a 20 20 20 20 20 20 20 e" k)])]. 42f0: 20 20 5b 28 76 20 2e 20 72 65 73 74 29 0a 20 20 [(v . rest). 4300: 20 20 20 20 20 20 20 20 28 68 61 73 68 74 61 62 (hashtab 4310: 6c 65 2d 73 65 74 21 20 76 73 20 69 20 76 29 0a le-set! vs i v). 4320: 20 20 20 20 20 20 20 20 20 20 28 6c 6f 6f 70 20 (loop 4330: 28 66 78 2b 20 69 20 31 29 20 72 65 73 74 29 5d (fx+ i 1) rest)] 4340: 0a 20 20 20 20 20 20 20 20 20 5b 28 29 0a 20 20 . [(). 4350: 20 20 20 20 20 20 20 20 28 76 6f 69 64 29 5d 29 (void)]) 4360: 29 0a 20 20 20 20 20 28 69 66 20 28 3d 20 28 68 ). (if (= (h 4370: 61 73 68 74 61 62 6c 65 2d 73 69 7a 65 20 76 73 ashtable-size vs 4380: 29 20 63 6e 74 29 0a 20 20 20 20 20 20 20 20 20 ) cnt). 4390: 28 75 6e 6c 65 73 73 20 28 7a 65 72 6f 3f 20 63 (unless (zero? c 43a0: 6e 74 29 0a 20 20 20 20 20 20 20 20 20 20 20 28 nt). ( 43b0: 68 61 73 68 74 61 62 6c 65 2d 77 61 6c 6b 20 76 hashtable-walk v 43c0: 73 20 28 63 75 74 20 62 69 6e 64 21 20 73 74 6d s (cut bind! stm 43d0: 74 20 3c 3e 20 3c 3e 29 29 29 0a 20 20 20 20 20 t <> <>))). 43e0: 20 20 20 20 28 72 61 69 73 65 0a 20 20 20 20 20 (raise. 43f0: 20 20 20 20 20 28 63 6f 6e 64 69 74 69 6f 6e 0a (condition. 4400: 20 20 20 20 20 20 20 20 20 20 20 28 6d 61 6b 65 (make 4410: 2d 77 68 6f 2d 63 6f 6e 64 69 74 69 6f 6e 20 6c -who-condition l 4420: 6f 63 29 0a 20 20 20 20 20 20 20 20 20 20 20 28 oc). ( 4430: 6d 61 6b 65 2d 6d 65 73 73 61 67 65 2d 63 6f 6e make-message-con 4440: 64 69 74 69 6f 6e 20 28 63 6f 6e 63 20 22 62 61 dition (conc "ba 4450: 64 20 70 61 72 61 6d 65 74 65 72 20 63 6f 75 6e d parameter coun 4460: 74 20 2d 20 72 65 63 65 69 76 65 64 20 22 20 28 t - received " ( 4470: 68 61 73 68 74 61 62 6c 65 2d 73 69 7a 65 20 76 hashtable-size v 4480: 73 29 20 22 20 62 75 74 20 65 78 70 65 63 74 65 s) " but expecte 4490: 64 20 22 20 63 6e 74 29 29 0a 20 20 20 20 20 20 d " cnt)). 44a0: 20 20 20 20 20 28 6d 61 6b 65 2d 73 71 6c 69 74 (make-sqlit 44b0: 65 33 2d 63 6f 6e 64 69 74 69 6f 6e 20 27 65 72 e3-condition 'er 44c0: 72 6f 72 29 29 29 29 29 29 0a 0a 20 28 64 65 66 ror)))))).. (def 44d0: 69 6e 65 20 28 62 69 6e 64 2d 70 61 72 61 6d 65 ine (bind-parame 44e0: 74 65 72 73 21 20 73 74 6d 74 20 2e 20 70 61 72 ters! stmt . par 44f0: 61 6d 73 29 0a 20 20 20 28 25 62 69 6e 64 2d 70 ams). (%bind-p 4500: 61 72 61 6d 65 74 65 72 73 21 20 27 62 69 6e 64 arameters! 'bind 4510: 2d 70 61 72 61 6d 65 74 65 72 73 21 20 73 74 6d -parameters! stm 4520: 74 20 70 61 72 61 6d 73 29 29 0a 0a 20 3b 3b 20 t params)).. ;; 4530: 53 69 6e 67 6c 65 2d 73 74 65 70 20 61 20 70 72 Single-step a pr 4540: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 epared statement 4550: 2c 20 72 65 74 75 72 6e 20 23 74 20 69 66 20 64 , return #t if d 4560: 61 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65 ata is available 4570: 2c 0a 20 3b 3b 20 23 66 20 6f 74 68 65 72 77 69 ,. ;; #f otherwi 4580: 73 65 0a 20 28 64 65 66 69 6e 65 20 28 73 74 65 se. (define (ste 4590: 70 21 20 73 74 6d 74 29 0a 20 20 20 28 63 68 65 p! stmt). (che 45a0: 63 6b 2d 73 74 61 74 65 6d 65 6e 74 20 27 73 74 ck-statement 'st 45b0: 65 70 21 20 73 74 6d 74 29 0a 20 20 20 28 6c 65 ep! stmt). (le 45c0: 74 20 28 5b 64 62 20 28 73 74 61 74 65 6d 65 6e t ([db (statemen 45d0: 74 2d 64 61 74 61 62 61 73 65 20 73 74 6d 74 29 t-database stmt) 45e0: 5d 29 0a 20 20 20 20 20 28 6c 65 74 20 72 65 74 ]). (let ret 45f0: 72 79 20 28 5b 72 65 74 72 69 65 73 20 30 5d 29 ry ([retries 0]) 4600: 0a 20 20 20 20 20 20 20 28 6c 65 74 20 28 5b 73 . (let ([s 4610: 20 28 28 66 6f 72 65 69 67 6e 2d 70 72 6f 63 65 ((foreign-proce 4620: 64 75 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 dure. 4630: 20 20 20 20 20 20 20 22 73 71 6c 69 74 65 33 5f "sqlite3_ 4640: 73 74 65 70 22 20 28 73 71 6c 69 74 65 33 3a 73 step" (sqlite3:s 4650: 74 61 74 65 6d 65 6e 74 2a 29 20 69 6e 74 29 20 tatement*) int) 4660: 28 73 74 61 74 65 6d 65 6e 74 2d 61 64 64 72 20 (statement-addr 4670: 73 74 6d 74 29 29 5d 29 0a 20 20 20 20 20 20 20 stmt))]). 4680: 20 20 28 63 61 73 65 20 28 6e 75 6d 62 65 72 2d (case (number- 4690: 3e 73 71 6c 69 74 65 33 3a 73 74 61 74 75 73 20 >sqlite3:status 46a0: 73 29 0a 20 20 20 20 20 20 20 20 20 20 20 5b 28 s). [( 46b0: 72 6f 77 29 0a 20 20 20 20 20 20 20 20 20 20 20 row). 46c0: 20 23 74 5d 0a 20 20 20 20 20 20 20 20 20 20 20 #t]. 46d0: 5b 28 64 6f 6e 65 29 0a 20 20 20 20 20 20 20 20 [(done). 46e0: 20 20 20 20 23 66 5d 0a 20 20 20 20 20 20 20 20 #f]. 46f0: 20 20 20 5b 28 62 75 73 79 29 0a 20 20 20 20 20 [(busy). 4700: 20 20 20 20 20 20 20 28 6c 65 74 20 28 5b 68 20 (let ([h 4710: 28 64 61 74 61 62 61 73 65 2d 62 75 73 79 2d 68 (database-busy-h 4720: 61 6e 64 6c 65 72 20 64 62 29 5d 29 0a 20 20 20 andler db)]). 4730: 20 20 20 20 20 20 20 20 20 20 20 28 63 6f 6e 64 (cond 4740: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 . 4750: 5b 28 61 6e 64 20 68 20 28 68 20 64 62 20 72 65 [(and h (h db re 4760: 74 72 69 65 73 29 29 0a 20 20 20 20 20 20 20 20 tries)). 4770: 20 20 20 20 20 20 20 20 28 72 65 74 72 79 20 28 (retry ( 4780: 66 78 2b 20 72 65 74 72 69 65 73 20 31 29 29 5d fx+ retries 1))] 4790: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 . 47a0: 5b 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 [else. 47b0: 20 20 20 20 20 20 28 28 61 62 6f 72 74 2d 73 71 ((abort-sq 47c0: 6c 69 74 65 33 2d 65 72 72 6f 72 20 27 73 74 65 lite3-error 'ste 47d0: 70 21 20 64 62 20 73 74 6d 74 29 20 73 29 5d 29 p! db stmt) s)]) 47e0: 29 5d 0a 20 20 20 20 20 20 20 20 20 20 20 5b 65 )]. [e 47f0: 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 lse. 4800: 28 28 61 62 6f 72 74 2d 73 71 6c 69 74 65 33 2d ((abort-sqlite3- 4810: 65 72 72 6f 72 20 27 73 74 65 70 21 20 64 62 20 error 'step! db 4820: 73 74 6d 74 29 20 73 29 5d 29 29 29 29 29 0a 0a stmt) s)]))))).. 4830: 20 3b 3b 20 52 65 74 72 69 65 76 65 20 69 6e 66 ;; Retrieve inf 4840: 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 20 ormation from a 4850: 70 72 65 70 61 72 65 64 2f 73 74 65 70 70 65 64 prepared/stepped 4860: 20 73 74 61 74 65 6d 65 6e 74 0a 20 28 64 65 66 statement. (def 4870: 69 6e 65 20 28 63 6f 6c 75 6d 6e 2d 63 6f 75 6e ine (column-coun 4880: 74 20 73 74 6d 74 29 0a 20 20 20 28 63 68 65 63 t stmt). (chec 4890: 6b 2d 73 74 61 74 65 6d 65 6e 74 20 27 63 6f 6c k-statement 'col 48a0: 75 6d 6e 2d 63 6f 75 6e 74 20 73 74 6d 74 29 0a umn-count stmt). 48b0: 20 20 20 28 28 66 6f 72 65 69 67 6e 2d 70 72 6f ((foreign-pro 48c0: 63 65 64 75 72 65 20 22 73 71 6c 69 74 65 33 5f cedure "sqlite3_ 48d0: 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 22 20 28 73 column_count" (s 48e0: 71 6c 69 74 65 33 3a 73 74 61 74 65 6d 65 6e 74 qlite3:statement 48f0: 2a 29 20 69 6e 74 29 20 28 73 74 61 74 65 6d 65 *) int) (stateme 4900: 6e 74 2d 61 64 64 72 20 73 74 6d 74 29 29 29 0a nt-addr stmt))). 4910: 0a 20 28 64 65 66 69 6e 65 20 28 63 6f 6c 75 6d . (define (colum 4920: 6e 2d 74 79 70 65 20 73 74 6d 74 20 69 29 0a 20 n-type stmt i). 4930: 20 20 28 63 68 65 63 6b 2d 73 74 61 74 65 6d 65 (check-stateme 4940: 6e 74 20 27 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 nt 'column-type 4950: 73 74 6d 74 29 0a 20 20 20 28 73 71 6c 69 74 65 stmt). (sqlite 4960: 33 3a 74 79 70 65 2d 72 65 66 20 28 28 66 6f 72 3:type-ref ((for 4970: 65 69 67 6e 2d 70 72 6f 63 65 64 75 72 65 20 20 eign-procedure 4980: 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f "sqlite3_column_ 4990: 74 79 70 65 22 20 28 73 71 6c 69 74 65 33 3a 73 type" (sqlite3:s 49a0: 74 61 74 65 6d 65 6e 74 2a 20 69 6e 74 29 20 69 tatement* int) i 49b0: 6e 74 29 20 28 73 74 61 74 65 6d 65 6e 74 2d 61 nt) (statement-a 49c0: 64 64 72 20 73 74 6d 74 29 20 69 29 29 29 0a 0a ddr stmt) i))).. 49d0: 20 28 64 65 66 69 6e 65 20 28 63 6f 6c 75 6d 6e (define (column 49e0: 2d 64 65 63 6c 61 72 65 64 2d 74 79 70 65 20 73 -declared-type s 49f0: 74 6d 74 20 69 29 0a 20 20 20 28 63 68 65 63 6b tmt i). (check 4a00: 2d 73 74 61 74 65 6d 65 6e 74 20 27 63 6f 6c 75 -statement 'colu 4a10: 6d 6e 2d 64 65 63 6c 61 72 65 64 2d 74 79 70 65 mn-declared-type 4a20: 20 73 74 6d 74 29 0a 20 20 20 28 28 66 6f 72 65 stmt). ((fore 4a30: 69 67 6e 2d 70 72 6f 63 65 64 75 72 65 20 22 73 ign-procedure "s 4a40: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 qlite3_column_de 4a50: 63 6c 74 79 70 65 22 20 28 73 71 6c 69 74 65 33 cltype" (sqlite3 4a60: 3a 73 74 61 74 65 6d 65 6e 74 2a 20 69 6e 74 29 :statement* int) 4a70: 20 73 74 72 69 6e 67 29 20 28 73 74 61 74 65 6d string) (statem 4a80: 65 6e 74 2d 61 64 64 72 20 73 74 6d 74 29 20 69 ent-addr stmt) i 4a90: 29 29 0a 0a 20 28 64 65 66 69 6e 65 20 28 63 6f )).. (define (co 4aa0: 6c 75 6d 6e 2d 6e 61 6d 65 20 73 74 6d 74 20 69 lumn-name stmt i 4ab0: 29 0a 20 20 20 28 63 68 65 63 6b 2d 73 74 61 74 ). (check-stat 4ac0: 65 6d 65 6e 74 20 27 63 6f 6c 75 6d 6e 2d 6e 61 ement 'column-na 4ad0: 6d 65 20 73 74 6d 74 29 0a 20 20 20 28 28 66 6f me stmt). ((fo 4ae0: 72 65 69 67 6e 2d 70 72 6f 63 65 64 75 72 65 20 reign-procedure 4af0: 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f "sqlite3_column_ 4b00: 6e 61 6d 65 22 20 28 73 71 6c 69 74 65 33 3a 73 name" (sqlite3:s 4b10: 74 61 74 65 6d 65 6e 74 2a 20 69 6e 74 29 20 73 tatement* int) s 4b20: 74 72 69 6e 67 29 20 28 73 74 61 74 65 6d 65 6e tring) (statemen 4b30: 74 2d 61 64 64 72 20 73 74 6d 74 29 20 69 29 29 t-addr stmt) i)) 4b40: 0a 0a 20 28 64 65 66 69 6e 65 20 73 71 6c 69 74 .. (define sqlit 4b50: 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 e3_column_double 4b60: 0a 20 20 20 28 66 6f 72 65 69 67 6e 2d 70 72 6f . (foreign-pro 4b70: 63 65 64 75 72 65 20 22 73 71 6c 69 74 65 33 5f cedure "sqlite3_ 4b80: 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 22 20 28 column_double" ( 4b90: 73 71 6c 69 74 65 33 3a 73 74 61 74 65 6d 65 6e sqlite3:statemen 4ba0: 74 2a 20 69 6e 74 29 20 64 6f 75 62 6c 65 29 29 t* int) double)) 4bb0: 0a 0a 20 28 64 65 66 69 6e 65 20 73 71 6c 69 74 .. (define sqlit 4bc0: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 0a e3_column_int64. 4bd0: 20 20 20 28 66 6f 72 65 69 67 6e 2d 70 72 6f 63 (foreign-proc 4be0: 65 64 75 72 65 20 22 73 71 6c 69 74 65 33 5f 63 edure "sqlite3_c 4bf0: 6f 6c 75 6d 6e 5f 69 6e 74 36 34 22 20 28 73 71 olumn_int64" (sq 4c00: 6c 69 74 65 33 3a 73 74 61 74 65 6d 65 6e 74 2a lite3:statement* 4c10: 20 69 6e 74 29 20 69 6e 74 65 67 65 72 2d 36 34 int) integer-64 4c20: 29 29 0a 0a 20 28 64 65 66 69 6e 65 20 73 71 6c )).. (define sql 4c30: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6f 6f 6c ite3_column_bool 4c40: 65 61 6e 0a 20 20 20 28 66 6f 72 65 69 67 6e 2d ean. (foreign- 4c50: 70 72 6f 63 65 64 75 72 65 20 22 73 71 6c 69 74 procedure "sqlit 4c60: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 22 20 28 e3_column_int" ( 4c70: 73 71 6c 69 74 65 33 3a 73 74 61 74 65 6d 65 6e sqlite3:statemen 4c80: 74 2a 20 69 6e 74 29 20 62 6f 6f 6c 65 61 6e 29 t* int) boolean) 4c90: 29 0a 0a 20 28 64 65 66 69 6e 65 20 28 73 71 6c ).. (define (sql 4ca0: 69 74 65 33 2d 63 6f 6c 75 6d 6e 2d 62 79 74 65 ite3-column-byte 4cb0: 73 20 73 74 6d 74 20 69 29 0a 20 20 20 28 28 66 s stmt i). ((f 4cc0: 6f 72 65 69 67 6e 2d 70 72 6f 63 65 64 75 72 65 oreign-procedure 4cd0: 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e "sqlite3_column 4ce0: 5f 62 79 74 65 73 22 20 28 73 71 6c 69 74 65 33 _bytes" (sqlite3 4cf0: 3a 73 74 61 74 65 6d 65 6e 74 2a 20 69 6e 74 29 :statement* int) 4d00: 20 69 6e 74 29 0a 20 20 20 20 28 73 74 61 74 65 int). (state 4d10: 6d 65 6e 74 2d 61 64 64 72 20 73 74 6d 74 29 20 ment-addr stmt) 4d20: 69 29 29 0a 0a 20 28 64 65 66 69 6e 65 20 28 76 i)).. (define (v 4d30: 6f 69 64 2a 2d 3e 62 79 74 65 76 65 63 74 6f 72 oid*->bytevector 4d40: 20 70 74 72 20 6c 65 6e 29 0a 20 20 20 28 64 65 ptr len). (de 4d50: 66 69 6e 65 2d 66 74 79 70 65 20 62 79 74 65 2d fine-ftype byte- 4d60: 61 72 72 61 79 20 28 61 72 72 61 79 20 30 20 75 array (array 0 u 4d70: 6e 73 69 67 6e 65 64 2d 38 29 29 0a 20 20 20 28 nsigned-8)). ( 4d80: 6c 65 74 20 28 5b 61 72 72 20 28 6d 61 6b 65 2d let ([arr (make- 4d90: 66 74 79 70 65 2d 70 6f 69 6e 74 65 72 20 62 79 ftype-pointer by 4da0: 74 65 2d 61 72 72 61 79 20 70 74 72 29 5d 0a 20 te-array ptr)]. 4db0: 20 20 20 20 20 20 20 20 5b 62 76 20 20 28 6d 61 [bv (ma 4dc0: 6b 65 2d 62 79 74 65 76 65 63 74 6f 72 20 6c 65 ke-bytevector le 4dd0: 6e 29 5d 29 0a 20 20 20 20 20 28 6c 65 74 20 6c n)]). (let l 4de0: 6f 6f 70 20 28 28 69 20 30 29 29 0a 20 20 20 20 oop ((i 0)). 4df0: 20 20 20 28 77 68 65 6e 20 28 3c 20 69 20 6c 65 (when (< i le 4e00: 6e 29 0a 20 20 20 20 20 20 20 20 20 28 62 79 74 n). (byt 4e10: 65 76 65 63 74 6f 72 2d 75 38 2d 73 65 74 21 20 evector-u8-set! 4e20: 62 76 20 69 20 28 66 74 79 70 65 2d 72 65 66 20 bv i (ftype-ref 4e30: 62 79 74 65 2d 61 72 72 61 79 20 28 69 29 20 61 byte-array (i) a 4e40: 72 72 29 29 0a 20 20 20 20 20 20 20 20 20 28 6c rr)). (l 4e50: 6f 6f 70 20 28 66 78 2b 20 31 20 69 29 29 29 29 oop (fx+ 1 i)))) 4e60: 0a 20 20 20 20 20 62 76 29 29 0a 0a 20 28 64 65 . bv)).. (de 4e70: 66 69 6e 65 20 28 76 6f 69 64 2a 2d 3e 73 74 72 fine (void*->str 4e80: 69 6e 67 20 70 74 72 20 6c 65 6e 29 0a 20 20 20 ing ptr len). 4e90: 28 75 74 66 38 2d 3e 73 74 72 69 6e 67 20 28 76 (utf8->string (v 4ea0: 6f 69 64 2a 2d 3e 62 79 74 65 76 65 63 74 6f 72 oid*->bytevector 4eb0: 20 70 74 72 20 6c 65 6e 29 29 29 0a 0a 20 28 64 ptr len))).. (d 4ec0: 65 66 69 6e 65 20 28 73 71 6c 69 74 65 33 2d 63 efine (sqlite3-c 4ed0: 6f 6c 75 6d 6e 2d 74 65 78 74 20 73 74 6d 74 20 olumn-text stmt 4ee0: 69 29 0a 20 20 20 28 6c 65 74 2a 20 28 5b 70 74 i). (let* ([pt 4ef0: 72 20 28 28 66 6f 72 65 69 67 6e 2d 70 72 6f 63 r ((foreign-proc 4f00: 65 64 75 72 65 20 22 73 71 6c 69 74 65 33 5f 63 edure "sqlite3_c 4f10: 6f 6c 75 6d 6e 5f 74 65 78 74 22 20 28 73 71 6c olumn_text" (sql 4f20: 69 74 65 33 3a 73 74 61 74 65 6d 65 6e 74 2a 20 ite3:statement* 4f30: 69 6e 74 29 20 76 6f 69 64 2a 29 0a 20 20 20 20 int) void*). 4f40: 20 20 20 20 20 20 20 20 20 20 20 20 28 73 74 61 (sta 4f50: 74 65 6d 65 6e 74 2d 61 64 64 72 20 73 74 6d 74 tement-addr stmt 4f60: 29 20 69 29 5d 0a 20 20 20 20 20 20 20 20 20 20 ) i)]. 4f70: 5b 6c 65 6e 20 28 73 71 6c 69 74 65 33 2d 63 6f [len (sqlite3-co 4f80: 6c 75 6d 6e 2d 62 79 74 65 73 20 73 74 6d 74 20 lumn-bytes stmt 4f90: 69 29 5d 29 0a 20 20 20 20 20 28 76 6f 69 64 2a i)]). (void* 4fa0: 2d 3e 73 74 72 69 6e 67 20 70 74 72 20 6c 65 6e ->string ptr len 4fb0: 29 29 29 0a 0a 20 28 64 65 66 69 6e 65 20 28 73 ))).. (define (s 4fc0: 71 6c 69 74 65 33 2d 63 6f 6c 75 6d 6e 2d 62 6c qlite3-column-bl 4fd0: 6f 62 20 73 74 6d 74 20 69 29 0a 20 20 20 28 6c ob stmt i). (l 4fe0: 65 74 2a 20 28 5b 70 74 72 20 28 28 66 6f 72 65 et* ([ptr ((fore 4ff0: 69 67 6e 2d 70 72 6f 63 65 64 75 72 65 20 22 73 ign-procedure "s 5000: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c qlite3_column_bl 5010: 6f 62 22 20 28 73 71 6c 69 74 65 33 3a 73 74 61 ob" (sqlite3:sta 5020: 74 65 6d 65 6e 74 2a 20 69 6e 74 29 20 76 6f 69 tement* int) voi 5030: 64 2a 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 d*). 5040: 20 20 20 20 28 73 74 61 74 65 6d 65 6e 74 2d 61 (statement-a 5050: 64 64 72 20 73 74 6d 74 29 20 69 29 5d 0a 20 20 ddr stmt) i)]. 5060: 20 20 20 20 20 20 20 20 5b 6c 65 6e 20 28 73 71 [len (sq 5070: 6c 69 74 65 33 2d 63 6f 6c 75 6d 6e 2d 62 79 74 lite3-column-byt 5080: 65 73 20 73 74 6d 74 20 69 29 5d 29 0a 20 20 20 es stmt i)]). 5090: 20 20 28 76 6f 69 64 2a 2d 3e 62 79 74 65 76 65 (void*->byteve 50a0: 63 74 6f 72 20 70 74 72 20 6c 65 6e 29 29 29 0a ctor ptr len))). 50b0: 0a 20 3b 3b 20 52 65 74 72 69 65 76 65 20 64 61 . ;; Retrieve da 50c0: 74 61 20 66 72 6f 6d 20 61 20 73 74 65 70 70 65 ta from a steppe 50d0: 64 20 73 74 61 74 65 6d 65 6e 74 0a 20 28 64 65 d statement. (de 50e0: 66 69 6e 65 20 28 63 6f 6c 75 6d 6e 2d 64 61 74 fine (column-dat 50f0: 61 20 73 74 6d 74 20 69 29 0a 20 20 20 28 63 61 a stmt i). (ca 5100: 73 65 20 28 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 se (column-type 5110: 73 74 6d 74 20 69 29 0a 20 20 20 20 20 5b 28 69 stmt i). [(i 5120: 6e 74 65 67 65 72 29 0a 20 20 20 20 20 20 28 63 nteger). (c 5130: 6f 6e 64 20 5b 28 61 6e 64 2d 6c 65 74 2a 20 28 ond [(and-let* ( 5140: 5b 74 79 70 65 20 28 63 6f 6c 75 6d 6e 2d 64 65 [type (column-de 5150: 63 6c 61 72 65 64 2d 74 79 70 65 20 73 74 6d 74 clared-type stmt 5160: 20 69 29 5d 29 0a 09 20 20 20 20 20 20 20 28 73 i)]).. (s 5170: 74 72 69 6e 67 2d 63 6f 6e 74 61 69 6e 73 2d 63 tring-contains-c 5180: 69 20 74 79 70 65 20 22 62 6f 6f 6c 22 29 29 0a i type "bool")). 5190: 09 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 63 . (sqlite3_c 51a0: 6f 6c 75 6d 6e 5f 62 6f 6f 6c 65 61 6e 20 28 73 olumn_boolean (s 51b0: 74 61 74 65 6d 65 6e 74 2d 61 64 64 72 20 73 74 tatement-addr st 51c0: 6d 74 29 20 69 29 5d 0a 09 20 20 20 20 5b 65 6c mt) i)].. [el 51d0: 73 65 0a 09 20 20 20 20 20 28 73 71 6c 69 74 65 se.. (sqlite 51e0: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 20 28 3_column_int64 ( 51f0: 73 74 61 74 65 6d 65 6e 74 2d 61 64 64 72 20 73 statement-addr s 5200: 74 6d 74 29 20 69 29 5d 29 5d 0a 20 20 20 20 20 tmt) i)])]. 5210: 5b 28 66 6c 6f 61 74 29 0a 20 20 20 20 20 20 28 [(float). ( 5220: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 sqlite3_column_d 5230: 6f 75 62 6c 65 20 28 73 74 61 74 65 6d 65 6e 74 ouble (statement 5240: 2d 61 64 64 72 20 73 74 6d 74 29 20 69 29 5d 0a -addr stmt) i)]. 5250: 20 20 20 20 20 5b 28 74 65 78 74 29 0a 20 20 20 [(text). 5260: 20 20 20 28 73 71 6c 69 74 65 33 2d 63 6f 6c 75 (sqlite3-colu 5270: 6d 6e 2d 74 65 78 74 20 73 74 6d 74 20 69 29 5d mn-text stmt i)] 5280: 0a 20 20 20 20 20 5b 28 62 6c 6f 62 29 0a 20 20 . [(blob). 5290: 20 20 20 20 28 73 71 6c 69 74 65 33 2d 63 6f 6c (sqlite3-col 52a0: 75 6d 6e 2d 62 6c 6f 62 20 73 74 6d 74 20 69 29 umn-blob stmt i) 52b0: 5d 0a 20 20 20 20 20 5b 65 6c 73 65 0a 20 20 20 ]. [else. 52c0: 20 20 20 28 73 71 6c 2d 6e 75 6c 6c 29 5d 29 29 (sql-null)])) 52d0: 0a 0a 3b 3b 3b 20 45 61 73 79 20 73 74 61 74 65 ..;;; Easy state 52e0: 6d 65 6e 74 20 69 6e 74 65 72 66 61 63 65 0a 0a ment interface.. 52f0: 20 3b 3b 20 43 6f 6d 70 69 6c 65 20 61 20 73 74 ;; Compile a st 5300: 61 74 65 6d 65 6e 74 20 61 6e 64 20 63 61 6c 6c atement and call 5310: 20 61 20 70 72 6f 63 65 64 75 72 65 20 6f 6e 20 a procedure on 5320: 69 74 2c 20 74 68 65 6e 20 66 69 6e 61 6c 69 7a it, then finaliz 5330: 65 20 74 68 65 0a 20 3b 3b 20 73 74 61 74 65 6d e the. ;; statem 5340: 65 6e 74 20 69 6e 20 61 20 64 79 6e 61 6d 69 63 ent in a dynamic 5350: 2d 77 69 6e 64 20 65 78 69 74 20 62 6c 6f 63 6b -wind exit block 5360: 20 69 66 20 69 74 20 68 61 73 6e 27 74 20 62 65 if it hasn't be 5370: 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 79 65 74 en finalized yet 5380: 2e 0a 20 28 64 65 66 69 6e 65 20 28 63 61 6c 6c .. (define (call 5390: 2d 77 69 74 68 2d 74 65 6d 70 6f 72 61 72 79 2d -with-temporary- 53a0: 73 74 61 74 65 6d 65 6e 74 73 20 70 72 6f 63 20 statements proc 53b0: 64 62 20 2e 20 73 71 6c 73 29 0a 20 20 20 28 63 db . sqls). (c 53c0: 68 65 63 6b 2d 64 61 74 61 62 61 73 65 20 27 63 heck-database 'c 53d0: 61 6c 6c 2d 77 69 74 68 2d 74 65 6d 70 6f 72 61 all-with-tempora 53e0: 72 79 2d 73 74 61 74 65 6d 65 6e 74 73 20 64 62 ry-statements db 53f0: 29 0a 20 20 20 28 6c 65 74 20 28 5b 73 74 6d 74 ). (let ([stmt 5400: 73 20 23 66 5d 20 5b 65 78 6e 20 23 66 5d 29 0a s #f] [exn #f]). 5410: 20 20 20 20 20 28 64 79 6e 61 6d 69 63 2d 77 69 (dynamic-wi 5420: 6e 64 0a 20 20 20 20 20 20 20 28 6c 61 6d 62 64 nd. (lambd 5430: 61 20 28 29 0a 20 20 20 20 20 20 20 20 20 28 75 a (). (u 5440: 6e 6c 65 73 73 20 73 74 6d 74 73 0a 20 20 20 20 nless stmts. 5450: 20 20 20 20 20 20 20 28 73 65 74 21 20 73 74 6d (set! stm 5460: 74 73 20 28 6d 61 70 20 28 63 75 74 65 20 70 72 ts (map (cute pr 5470: 65 70 61 72 65 20 64 62 20 3c 3e 29 20 73 71 6c epare db <>) sql 5480: 73 29 29 29 29 0a 20 20 20 20 20 20 20 28 6c 61 s)))). (la 5490: 6d 62 64 61 20 28 29 0a 20 20 20 20 20 20 20 20 mbda (). 54a0: 20 28 67 75 61 72 64 20 28 65 20 5b 65 6c 73 65 (guard (e [else 54b0: 20 28 73 65 74 21 20 65 78 6e 20 65 29 5d 29 0a (set! exn e)]). 54c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54d0: 28 61 70 70 6c 79 20 70 72 6f 63 20 73 74 6d 74 (apply proc stmt 54e0: 73 29 29 29 0a 20 20 20 20 20 20 20 28 6c 61 6d s))). (lam 54f0: 62 64 61 20 28 29 0a 20 20 20 20 20 20 20 20 20 bda (). 5500: 28 61 6e 64 2d 6c 65 74 2a 20 28 5b 73 20 73 74 (and-let* ([s st 5510: 6d 74 73 5d 29 0a 20 20 20 20 20 20 20 20 20 20 mts]). 5520: 20 20 20 20 20 20 20 20 20 28 73 65 74 21 20 73 (set! s 5530: 74 6d 74 73 20 23 66 29 0a 20 20 20 20 20 20 20 tmts #f). 5540: 20 20 20 20 20 20 20 20 20 20 20 20 28 66 6f 72 (for 5550: 2d 65 61 63 68 20 66 69 6e 61 6c 69 7a 65 21 20 -each finalize! 5560: 73 29 29 20 3b 3b 20 6c 65 61 6b 73 20 69 66 20 s)) ;; leaks if 5570: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 62 65 66 error occurs bef 5580: 6f 72 65 20 6c 61 73 74 20 73 74 6d 74 0a 20 20 ore last stmt. 5590: 20 20 20 20 20 20 20 28 61 6e 64 2d 6c 65 74 2a (and-let* 55a0: 20 28 5b 65 20 65 78 6e 5d 29 0a 20 20 20 20 20 ([e exn]). 55b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 (s 55c0: 65 74 21 20 65 78 6e 20 23 66 29 0a 20 20 20 20 et! exn #f). 55d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 ( 55e0: 72 61 69 73 65 20 65 29 29 29 29 29 29 0a 0a 20 raise e)))))).. 55f0: 28 64 65 66 69 6e 65 2d 73 79 6e 74 61 78 20 25 (define-syntax % 5600: 64 65 66 69 6e 65 2f 73 74 61 74 65 6d 65 6e 74 define/statement 5610: 2b 70 61 72 61 6d 73 0a 20 20 20 28 73 79 6e 74 +params. (synt 5620: 61 78 2d 72 75 6c 65 73 20 28 29 0a 20 20 20 20 ax-rules (). 5630: 20 5b 28 25 64 65 66 69 6e 65 2f 73 74 61 74 65 [(%define/state 5640: 6d 65 6e 74 2b 70 61 72 61 6d 73 20 28 28 6e 61 ment+params ((na 5650: 6d 65 20 6c 6f 63 29 20 28 69 6e 69 74 20 2e 2e me loc) (init .. 5660: 2e 29 20 28 73 74 6d 74 20 70 61 72 61 6d 73 29 .) (stmt params) 5670: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ). 5680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5690: 20 20 62 6f 64 79 20 2e 2e 2e 29 0a 20 20 20 20 body ...). 56a0: 20 20 28 64 65 66 69 6e 65 20 6e 61 6d 65 0a 20 (define name. 56b0: 20 20 20 20 20 20 20 28 6c 65 74 20 28 5b 69 6d (let ([im 56c0: 70 6c 20 28 6c 61 6d 62 64 61 20 28 69 6e 69 74 pl (lambda (init 56d0: 20 2e 2e 2e 20 73 74 6d 74 20 70 61 72 61 6d 73 ... stmt params 56e0: 29 20 62 6f 64 79 20 2e 2e 2e 29 5d 29 0a 20 20 ) body ...)]). 56f0: 20 20 20 20 20 20 20 20 28 6c 61 6d 62 64 61 20 (lambda 5700: 28 69 6e 69 74 20 2e 2e 2e 20 64 62 2d 6f 72 2d (init ... db-or- 5710: 73 74 6d 74 20 2e 20 70 61 72 61 6d 73 29 0a 20 stmt . params). 5720: 20 20 20 20 20 20 20 20 20 20 20 28 63 6f 6e 64 (cond 5730: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 28 . [( 5740: 64 61 74 61 62 61 73 65 3f 20 64 62 2d 6f 72 2d database? db-or- 5750: 73 74 6d 74 29 0a 20 20 20 20 20 20 20 20 20 20 stmt). 5760: 20 20 20 20 28 63 61 6c 6c 2d 77 69 74 68 2d 74 (call-with-t 5770: 65 6d 70 6f 72 61 72 79 2d 73 74 61 74 65 6d 65 emporary-stateme 5780: 6e 74 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 nts. 5790: 20 20 20 28 63 75 74 65 20 69 6d 70 6c 20 69 6e (cute impl in 57a0: 69 74 20 2e 2e 2e 20 3c 3e 20 28 63 64 72 20 70 it ... <> (cdr p 57b0: 61 72 61 6d 73 29 29 0a 20 20 20 20 20 20 20 20 arams)). 57c0: 20 20 20 20 20 20 20 64 62 2d 6f 72 2d 73 74 6d db-or-stm 57d0: 74 20 28 63 61 72 20 70 61 72 61 6d 73 29 29 5d t (car params))] 57e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 28 . [( 57f0: 73 74 61 74 65 6d 65 6e 74 3f 20 64 62 2d 6f 72 statement? db-or 5800: 2d 73 74 6d 74 29 0a 20 20 20 20 20 20 20 20 20 -stmt). 5810: 20 20 20 20 20 28 69 6d 70 6c 20 69 6e 69 74 20 (impl init 5820: 2e 2e 2e 20 64 62 2d 6f 72 2d 73 74 6d 74 20 70 ... db-or-stmt p 5830: 61 72 61 6d 73 29 5d 0a 20 20 20 20 20 20 20 20 arams)]. 5840: 20 20 20 20 20 5b 65 6c 73 65 0a 20 20 20 20 20 [else. 5850: 20 20 20 20 20 20 20 20 20 28 65 72 72 6f 72 20 (error 5860: 6c 6f 63 20 22 64 61 74 61 62 61 73 65 20 6f 72 loc "database or 5870: 20 73 74 61 74 65 6d 65 6e 74 22 20 64 62 2d 6f statement" db-o 5880: 72 2d 73 74 6d 74 29 5d 29 29 29 29 5d 0a 20 20 r-stmt)]))))]. 5890: 20 20 20 5b 28 25 64 65 66 69 6e 65 2f 73 74 61 [(%define/sta 58a0: 74 65 6d 65 6e 74 2b 70 61 72 61 6d 73 20 28 6e tement+params (n 58b0: 61 6d 65 20 28 69 6e 69 74 20 2e 2e 2e 29 20 28 ame (init ...) ( 58c0: 73 74 6d 74 20 70 61 72 61 6d 73 29 29 0a 20 20 stmt params)). 58d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 58e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6f bo 58f0: 64 79 20 2e 2e 2e 29 0a 20 20 20 20 20 20 28 25 dy ...). (% 5900: 64 65 66 69 6e 65 2f 73 74 61 74 65 6d 65 6e 74 define/statement 5910: 2b 70 61 72 61 6d 73 20 28 28 6e 61 6d 65 20 27 +params ((name ' 5920: 6e 61 6d 65 29 20 28 69 6e 69 74 20 2e 2e 2e 29 name) (init ...) 5930: 20 28 73 74 6d 74 20 70 61 72 61 6d 73 29 29 0a (stmt params)). 5940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5960: 62 6f 64 79 20 2e 2e 2e 29 5d 0a 20 20 20 20 20 body ...)]. 5970: 5b 28 25 64 65 66 69 6e 65 2f 73 74 61 74 65 6d [(%define/statem 5980: 65 6e 74 2b 70 61 72 61 6d 73 20 28 6e 61 6d 65 ent+params (name 5990: 20 73 74 6d 74 20 70 61 72 61 6d 73 29 0a 20 20 stmt params). 59a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 59b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6f bo 59c0: 64 79 20 2e 2e 2e 29 0a 20 20 20 20 20 20 28 25 dy ...). (% 59d0: 64 65 66 69 6e 65 2f 73 74 61 74 65 6d 65 6e 74 define/statement 59e0: 2b 70 61 72 61 6d 73 20 28 28 6e 61 6d 65 20 27 +params ((name ' 59f0: 6e 61 6d 65 29 20 28 29 20 28 73 74 6d 74 20 70 name) () (stmt p 5a00: 61 72 61 6d 73 29 29 0a 20 20 20 20 20 20 20 20 arams)). 5a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5a20: 20 20 20 20 20 20 20 20 62 6f 64 79 20 2e 2e 2e body ... 5a30: 29 5d 29 29 0a 0a 20 20 20 20 20 20 20 20 20 20 )])).. 5a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 ; 5a60: 66 72 6f 6d 20 63 68 69 63 6b 65 6e 20 6d 69 73 from chicken mis 5a70: 63 6d 61 63 72 6f 73 2e 73 63 6d 0a 20 28 64 65 cmacros.scm. (de 5a80: 66 69 6e 65 2d 73 79 6e 74 61 78 20 77 68 69 6c fine-syntax whil 5a90: 65 0a 20 20 20 28 73 79 6e 74 61 78 2d 72 75 6c e. (syntax-rul 5aa0: 65 73 20 28 29 0a 20 20 20 20 20 28 28 77 68 69 es (). ((whi 5ab0: 6c 65 20 74 65 73 74 20 62 6f 64 79 20 2e 2e 2e le test body ... 5ac0: 29 0a 20 20 20 20 20 20 28 6c 65 74 20 6c 6f 6f ). (let loo 5ad0: 70 20 28 29 0a 20 20 20 20 20 20 20 20 28 69 66 p (). (if 5ae0: 20 74 65 73 74 0a 20 20 20 20 20 20 20 20 20 20 test. 5af0: 20 20 28 62 65 67 69 6e 0a 20 20 20 20 20 20 20 (begin. 5b00: 20 20 20 20 20 20 20 62 6f 64 79 20 2e 2e 2e 0a body .... 5b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6c (l 5b20: 6f 6f 70 29 29 29 29 29 29 29 0a 0a 20 3b 3b 20 oop))))))).. ;; 5b30: 53 74 65 70 20 74 68 72 6f 75 67 68 20 61 20 73 Step through a s 5b40: 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 69 67 6e tatement and ign 5b50: 6f 72 65 20 70 6f 73 73 69 62 6c 65 20 72 65 73 ore possible res 5b60: 75 6c 74 73 0a 20 28 64 65 66 69 6e 65 20 28 25 ults. (define (% 5b70: 65 78 65 63 75 74 65 20 6c 6f 63 20 73 74 6d 74 execute loc stmt 5b80: 20 70 61 72 61 6d 73 29 0a 20 20 20 28 25 62 69 params). (%bi 5b90: 6e 64 2d 70 61 72 61 6d 65 74 65 72 73 21 20 6c nd-parameters! l 5ba0: 6f 63 20 73 74 6d 74 20 70 61 72 61 6d 73 29 0a oc stmt params). 5bb0: 20 20 20 28 77 68 69 6c 65 20 28 73 74 65 70 21 (while (step! 5bc0: 20 73 74 6d 74 29 29 0a 20 20 20 28 76 6f 69 64 stmt)). (void 5bd0: 29 29 0a 0a 20 28 25 64 65 66 69 6e 65 2f 73 74 )).. (%define/st 5be0: 61 74 65 6d 65 6e 74 2b 70 61 72 61 6d 73 20 28 atement+params ( 5bf0: 65 78 65 63 75 74 65 20 73 74 6d 74 20 70 61 72 execute stmt par 5c00: 61 6d 73 29 0a 20 20 20 20 20 20 20 20 20 20 20 ams). 5c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c20: 28 25 65 78 65 63 75 74 65 20 27 65 78 65 63 75 (%execute 'execu 5c30: 74 65 20 73 74 6d 74 20 70 61 72 61 6d 73 29 29 te stmt params)) 5c40: 0a 0a 20 3b 3b 20 53 74 65 70 20 74 68 72 6f 75 .. ;; Step throu 5c50: 67 68 20 61 20 73 74 61 74 65 6d 65 6e 74 2c 20 gh a statement, 5c60: 69 67 6e 6f 72 65 20 70 6f 73 73 69 62 6c 65 20 ignore possible 5c70: 72 65 73 75 6c 74 73 20 61 6e 64 20 72 65 74 75 results and retu 5c80: 72 6e 20 74 68 65 0a 20 3b 3b 20 63 6f 75 6e 74 rn the. ;; count 5c90: 20 6f 66 20 63 68 61 6e 67 65 73 20 70 65 72 66 of changes perf 5ca0: 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20 73 74 ormed by this st 5cb0: 61 74 65 6d 65 6e 74 0a 20 28 25 64 65 66 69 6e atement. (%defin 5cc0: 65 2f 73 74 61 74 65 6d 65 6e 74 2b 70 61 72 61 e/statement+para 5cd0: 6d 73 20 28 75 70 64 61 74 65 20 73 74 6d 74 20 ms (update stmt 5ce0: 70 61 72 61 6d 73 29 0a 20 20 20 20 20 20 20 20 params). 5cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5d00: 20 20 20 28 25 65 78 65 63 75 74 65 20 27 75 70 (%execute 'up 5d10: 64 61 74 65 20 73 74 6d 74 20 70 61 72 61 6d 73 date stmt params 5d20: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ). 5d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 (ch 5d40: 61 6e 67 65 2d 63 6f 75 6e 74 20 28 73 74 61 74 ange-count (stat 5d50: 65 6d 65 6e 74 2d 64 61 74 61 62 61 73 65 20 73 ement-database s 5d60: 74 6d 74 29 29 29 0a 0a 20 3b 3b 20 52 65 74 75 tmt))).. ;; Retu 5d70: 72 6e 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 rn only the firs 5d80: 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 t column of the 5d90: 66 69 72 73 74 20 72 65 73 75 6c 74 20 72 6f 77 first result row 5da0: 20 70 72 6f 64 75 63 65 64 20 62 79 20 74 68 69 produced by thi 5db0: 73 0a 20 3b 3b 20 73 74 61 74 65 6d 65 6e 74 0a s. ;; statement. 5dc0: 0a 20 28 25 64 65 66 69 6e 65 2f 73 74 61 74 65 . (%define/state 5dd0: 6d 65 6e 74 2b 70 61 72 61 6d 73 20 28 66 69 72 ment+params (fir 5de0: 73 74 2d 72 65 73 75 6c 74 20 73 74 6d 74 20 70 st-result stmt p 5df0: 61 72 61 6d 73 29 0a 20 20 20 20 20 20 20 20 20 arams). 5e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5e10: 20 20 28 25 62 69 6e 64 2d 70 61 72 61 6d 65 74 (%bind-paramet 5e20: 65 72 73 21 20 27 66 69 72 73 74 2d 72 65 73 75 ers! 'first-resu 5e30: 6c 74 20 73 74 6d 74 20 70 61 72 61 6d 73 29 0a lt stmt params). 5e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5e50: 20 20 20 20 20 20 20 20 20 20 20 28 69 66 20 28 (if ( 5e60: 73 74 65 70 21 20 73 74 6d 74 29 0a 20 20 20 20 step! stmt). 5e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5e80: 20 20 20 20 20 20 20 20 20 20 20 28 6c 65 74 20 (let 5e90: 28 5b 72 20 28 63 6f 6c 75 6d 6e 2d 64 61 74 61 ([r (column-data 5ea0: 20 73 74 6d 74 20 30 29 5d 29 0a 20 20 20 20 20 stmt 0)]). 5eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5ec0: 20 20 20 20 20 20 20 20 20 20 20 20 28 72 65 73 (res 5ed0: 65 74 21 20 73 74 6d 74 29 0a 20 20 20 20 20 20 et! stmt). 5ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5ef0: 20 20 20 20 20 20 20 20 20 20 20 72 29 0a 20 20 r). 5f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 72 61 (ra 5f20: 69 73 65 20 28 6d 61 6b 65 2d 6e 6f 2d 64 61 74 ise (make-no-dat 5f30: 61 2d 63 6f 6e 64 69 74 69 6f 6e 20 27 66 69 72 a-condition 'fir 5f40: 73 74 2d 72 65 73 75 6c 74 20 73 74 6d 74 20 70 st-result stmt p 5f50: 61 72 61 6d 73 29 29 29 29 0a 0a 20 3b 3b 20 52 arams)))).. ;; R 5f60: 65 74 75 72 6e 20 6f 6e 6c 79 20 74 68 65 20 66 eturn only the f 5f70: 69 72 73 74 20 72 65 73 75 6c 74 20 72 6f 77 20 irst result row 5f80: 70 72 6f 64 75 63 65 64 20 62 79 20 74 68 69 73 produced by this 5f90: 20 73 74 61 74 65 6d 65 6e 74 20 61 73 20 61 20 statement as a 5fa0: 6c 69 73 74 0a 0a 20 28 25 64 65 66 69 6e 65 2f list.. (%define/ 5fb0: 73 74 61 74 65 6d 65 6e 74 2b 70 61 72 61 6d 73 statement+params 5fc0: 20 28 66 69 72 73 74 2d 72 6f 77 20 73 74 6d 74 (first-row stmt 5fd0: 20 70 61 72 61 6d 73 29 0a 20 20 20 20 20 20 20 params). 5fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5ff0: 20 20 20 20 28 25 62 69 6e 64 2d 70 61 72 61 6d (%bind-param 6000: 65 74 65 72 73 21 20 27 66 69 72 73 74 2d 72 6f eters! 'first-ro 6010: 77 20 73 74 6d 74 20 70 61 72 61 6d 73 29 0a 20 w stmt params). 6020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6030: 20 20 20 20 20 20 20 20 20 20 28 69 66 20 28 73 (if (s 6040: 74 65 70 21 20 73 74 6d 74 29 0a 20 20 20 20 20 tep! stmt). 6050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6060: 20 20 20 20 20 20 20 20 20 20 28 6d 61 70 20 28 (map ( 6070: 63 75 74 65 20 63 6f 6c 75 6d 6e 2d 64 61 74 61 cute column-data 6080: 20 73 74 6d 74 20 3c 3e 29 0a 20 20 20 20 20 20 stmt <>). 6090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 60a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 (i 60b0: 6f 74 61 20 28 63 6f 6c 75 6d 6e 2d 63 6f 75 6e ota (column-coun 60c0: 74 20 73 74 6d 74 29 29 29 0a 20 20 20 20 20 20 t stmt))). 60d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 60e0: 20 20 20 20 20 20 20 20 20 28 72 61 69 73 65 20 (raise 60f0: 28 6d 61 6b 65 2d 6e 6f 2d 64 61 74 61 2d 63 6f (make-no-data-co 6100: 6e 64 69 74 69 6f 6e 20 27 66 69 72 73 74 2d 72 ndition 'first-r 6110: 6f 77 20 73 74 6d 74 20 70 61 72 61 6d 73 29 29 ow stmt params)) 6120: 29 29 0a 0a 20 3b 3b 20 41 70 70 6c 79 20 61 20 )).. ;; Apply a 6130: 70 72 6f 63 65 64 75 72 65 20 74 6f 20 74 68 65 procedure to the 6140: 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20 72 values of the r 6150: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 66 6f esult columns fo 6160: 72 20 65 61 63 68 20 72 65 73 75 6c 74 20 72 6f r each result ro 6170: 77 0a 20 3b 3b 20 77 68 69 6c 65 20 65 78 65 63 w. ;; while exec 6180: 75 74 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d uting the statem 6190: 65 6e 74 20 61 6e 64 20 61 63 63 75 6d 75 6c 61 ent and accumula 61a0: 74 69 6e 67 20 72 65 73 75 6c 74 73 2e 0a 0a 20 ting results... 61b0: 28 25 64 65 66 69 6e 65 2f 73 74 61 74 65 6d 65 (%define/stateme 61c0: 6e 74 2b 70 61 72 61 6d 73 20 28 28 25 66 6f 6c nt+params ((%fol 61d0: 64 2d 72 6f 77 20 6c 6f 63 29 20 28 6c 6f 63 20 d-row loc) (loc 61e0: 70 72 6f 63 20 69 6e 69 74 29 20 28 73 74 6d 74 proc init) (stmt 61f0: 20 70 61 72 61 6d 73 29 29 0a 20 20 20 20 20 20 params)). 6200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6210: 20 20 20 20 20 28 25 62 69 6e 64 2d 70 61 72 61 (%bind-para 6220: 6d 65 74 65 72 73 21 20 6c 6f 63 20 73 74 6d 74 meters! loc stmt 6230: 20 70 61 72 61 6d 73 29 0a 20 20 20 20 20 20 20 params). 6240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6250: 20 20 20 20 28 6c 65 74 20 28 5b 63 6c 20 28 69 (let ([cl (i 6260: 6f 74 61 20 28 63 6f 6c 75 6d 6e 2d 63 6f 75 6e ota (column-coun 6270: 74 20 73 74 6d 74 29 29 5d 29 0a 20 20 20 20 20 t stmt))]). 6280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6290: 20 20 20 20 20 20 20 20 28 6c 65 74 20 6c 6f 6f (let loo 62a0: 70 20 28 5b 61 63 63 20 69 6e 69 74 5d 29 0a 20 p ([acc init]). 62b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 (i 62d0: 66 20 28 73 74 65 70 21 20 73 74 6d 74 29 0a 20 f (step! stmt). 62e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6300: 20 20 28 6c 6f 6f 70 20 28 61 70 70 6c 79 20 70 (loop (apply p 6310: 72 6f 63 20 61 63 63 20 28 6d 61 70 20 28 63 75 roc acc (map (cu 6320: 74 65 20 63 6f 6c 75 6d 6e 2d 64 61 74 61 20 73 te column-data s 6330: 74 6d 74 20 3c 3e 29 20 63 6c 29 29 29 0a 20 20 tmt <>) cl))). 6340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6360: 20 61 63 63 29 29 29 29 0a 0a 20 28 64 65 66 69 acc)))).. (defi 6370: 6e 65 2d 73 79 6e 74 61 78 20 63 68 65 63 6b 2d ne-syntax check- 6380: 70 72 6f 63 65 64 75 72 65 0a 20 20 20 28 73 79 procedure. (sy 6390: 6e 74 61 78 2d 72 75 6c 65 73 20 28 29 0a 20 20 ntax-rules (). 63a0: 20 20 20 5b 28 5f 20 6c 6f 63 20 70 72 6f 63 29 [(_ loc proc) 63b0: 0a 20 20 20 20 20 20 28 61 73 73 65 72 74 20 28 . (assert ( 63c0: 61 6e 64 20 6c 6f 63 20 28 70 72 6f 63 65 64 75 and loc (procedu 63d0: 72 65 3f 20 70 72 6f 63 29 29 29 5d 29 29 0a 0a re? proc)))])).. 63e0: 20 28 64 65 66 69 6e 65 20 28 66 6f 6c 64 2d 72 (define (fold-r 63f0: 6f 77 20 70 72 6f 63 20 69 6e 69 74 20 64 62 2d ow proc init db- 6400: 6f 72 2d 73 74 6d 74 20 2e 20 70 61 72 61 6d 73 or-stmt . params 6410: 29 0a 20 20 20 28 61 70 70 6c 79 20 25 66 6f 6c ). (apply %fol 6420: 64 2d 72 6f 77 20 27 66 6f 6c 64 2d 72 6f 77 20 d-row 'fold-row 6430: 70 72 6f 63 20 69 6e 69 74 20 64 62 2d 6f 72 2d proc init db-or- 6440: 73 74 6d 74 20 70 61 72 61 6d 73 29 29 0a 0a 20 stmt params)).. 6450: 3b 3b 20 41 70 70 6c 79 20 61 20 70 72 6f 63 65 ;; Apply a proce 6460: 64 75 72 65 20 74 6f 20 74 68 65 20 76 61 6c 75 dure to the valu 6470: 65 73 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 es of the result 6480: 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 65 61 63 columns for eac 6490: 68 20 72 65 73 75 6c 74 20 72 6f 77 0a 20 3b 3b h result row. ;; 64a0: 20 77 68 69 6c 65 20 65 78 65 63 75 74 69 6e 67 while executing 64b0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 61 the statement a 64c0: 6e 64 20 64 69 73 63 61 72 64 20 74 68 65 20 72 nd discard the r 64d0: 65 73 75 6c 74 73 0a 0a 20 28 64 65 66 69 6e 65 esults.. (define 64e0: 20 28 66 6f 72 2d 65 61 63 68 2d 72 6f 77 20 70 (for-each-row p 64f0: 72 6f 63 20 64 62 2d 6f 72 2d 73 74 6d 74 20 2e roc db-or-stmt . 6500: 20 70 61 72 61 6d 73 29 0a 20 20 20 28 63 68 65 params). (che 6510: 63 6b 2d 70 72 6f 63 65 64 75 72 65 20 66 6f 6c ck-procedure fol 6520: 64 2d 72 6f 77 20 70 72 6f 63 29 0a 20 20 20 28 d-row proc). ( 6530: 61 70 70 6c 79 20 25 66 6f 6c 64 2d 72 6f 77 0a apply %fold-row. 6540: 20 20 20 20 20 20 20 20 20 20 27 66 6f 72 2d 65 'for-e 6550: 61 63 68 2d 72 6f 77 0a 20 20 20 20 20 20 20 20 ach-row. 6560: 20 20 28 6c 61 6d 62 64 61 20 28 61 63 63 20 2e (lambda (acc . 6570: 20 63 6f 6c 75 6d 6e 73 29 0a 20 20 20 20 20 20 columns). 6580: 20 20 20 20 20 20 28 61 70 70 6c 79 20 70 72 6f (apply pro 6590: 63 20 63 6f 6c 75 6d 6e 73 29 29 0a 20 20 20 20 c columns)). 65a0: 20 20 20 20 20 20 28 76 6f 69 64 29 0a 20 20 20 (void). 65b0: 20 20 20 20 20 20 20 64 62 2d 6f 72 2d 73 74 6d db-or-stm 65c0: 74 20 70 61 72 61 6d 73 29 29 0a 0a 20 3b 3b 20 t params)).. ;; 65d0: 41 70 70 6c 79 20 61 20 70 72 6f 63 65 64 75 72 Apply a procedur 65e0: 65 20 74 6f 20 74 68 65 20 76 61 6c 75 65 73 20 e to the values 65f0: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f of the result co 6600: 6c 75 6d 6e 73 20 66 6f 72 20 65 61 63 68 20 72 lumns for each r 6610: 65 73 75 6c 74 20 72 6f 77 0a 20 3b 3b 20 77 68 esult row. ;; wh 6620: 69 6c 65 20 65 78 65 63 75 74 69 6e 67 20 74 68 ile executing th 6630: 65 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 e statement and 6640: 61 63 63 75 6d 75 6c 61 74 65 20 74 68 65 20 72 accumulate the r 6650: 65 73 75 6c 74 73 20 69 6e 20 61 20 6c 69 73 74 esults in a list 6660: 0a 0a 20 28 64 65 66 69 6e 65 20 28 6d 61 70 2d .. (define (map- 6670: 72 6f 77 20 70 72 6f 63 20 64 62 2d 6f 72 2d 73 row proc db-or-s 6680: 74 6d 74 20 2e 20 70 61 72 61 6d 73 29 0a 20 20 tmt . params). 6690: 20 28 63 68 65 63 6b 2d 70 72 6f 63 65 64 75 72 (check-procedur 66a0: 65 20 27 6d 61 70 2d 72 6f 77 20 70 72 6f 63 29 e 'map-row proc) 66b0: 0a 20 20 20 28 72 65 76 65 72 73 65 21 0a 20 20 . (reverse!. 66c0: 20 20 28 61 70 70 6c 79 20 25 66 6f 6c 64 2d 72 (apply %fold-r 66d0: 6f 77 0a 20 20 20 20 20 20 20 20 20 20 20 27 6d ow. 'm 66e0: 61 70 2d 72 6f 77 0a 20 20 20 20 20 20 20 20 20 ap-row. 66f0: 20 20 28 6c 61 6d 62 64 61 20 28 61 63 63 20 2e (lambda (acc . 6700: 20 63 6f 6c 75 6d 6e 73 29 0a 20 20 20 20 20 20 columns). 6710: 20 20 20 20 20 20 20 28 63 6f 6e 73 20 28 61 70 (cons (ap 6720: 70 6c 79 20 70 72 6f 63 20 63 6f 6c 75 6d 6e 73 ply proc columns 6730: 29 20 61 63 63 29 29 0a 20 20 20 20 20 20 20 20 ) acc)). 6740: 20 20 20 27 28 29 0a 20 20 20 20 20 20 20 20 20 '(). 6750: 20 20 64 62 2d 6f 72 2d 73 74 6d 74 20 70 61 72 db-or-stmt par 6760: 61 6d 73 29 29 29 0a 0a 3b 3b 3b 20 55 74 69 6c ams)))..;;; Util 6770: 69 74 79 20 70 72 6f 63 65 64 75 72 65 73 0a 0a ity procedures.. 6780: 20 3b 3b 20 52 75 6e 20 61 20 74 68 75 6e 6b 20 ;; Run a thunk 6790: 77 69 74 68 69 6e 20 61 20 64 61 74 61 62 61 73 within a databas 67a0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 63 e transaction, c 67b0: 6f 6d 6d 69 74 20 69 66 20 72 65 74 75 72 6e 20 ommit if return 67c0: 76 61 6c 75 65 20 69 73 0a 20 3b 3b 20 74 72 75 value is. ;; tru 67d0: 65 2c 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 72 e, rollback if r 67e0: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 66 eturn value is f 67f0: 61 6c 73 65 20 6f 72 20 74 68 65 20 74 68 75 6e alse or the thun 6800: 6b 20 69 73 20 69 6e 74 65 72 72 75 70 74 65 64 k is interrupted 6810: 20 62 79 0a 20 3b 3b 20 61 6e 20 65 78 63 65 70 by. ;; an excep 6820: 74 69 6f 6e 0a 20 28 64 65 66 69 6e 65 20 77 69 tion. (define wi 6830: 74 68 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 th-transaction. 6840: 20 20 28 63 61 73 65 2d 6c 61 6d 62 64 61 0a 20 (case-lambda. 6850: 20 20 20 20 28 28 64 62 20 74 68 75 6e 6b 29 20 ((db thunk) 6860: 28 77 69 74 68 2d 74 72 61 6e 73 61 63 74 69 6f (with-transactio 6870: 6e 20 64 62 20 74 68 75 6e 6b 20 27 64 65 66 65 n db thunk 'defe 6880: 72 72 65 64 29 29 0a 20 20 20 20 20 28 28 64 62 rred)). ((db 6890: 20 74 68 75 6e 6b 20 74 79 70 65 29 0a 20 20 20 thunk type). 68a0: 20 20 20 28 63 68 65 63 6b 2d 64 61 74 61 62 61 (check-databa 68b0: 73 65 20 27 77 69 74 68 2d 74 72 61 6e 73 61 63 se 'with-transac 68c0: 74 69 6f 6e 20 64 62 29 0a 20 20 20 20 20 20 28 tion db). ( 68d0: 63 68 65 63 6b 2d 70 72 6f 63 65 64 75 72 65 20 check-procedure 68e0: 27 77 69 74 68 2d 74 72 61 6e 73 61 63 74 69 6f 'with-transactio 68f0: 6e 20 74 68 75 6e 6b 29 0a 20 20 20 20 20 20 28 n thunk). ( 6900: 75 6e 6c 65 73 73 20 28 6d 65 6d 71 20 74 79 70 unless (memq typ 6910: 65 20 27 28 64 65 66 65 72 72 65 64 20 69 6d 6d e '(deferred imm 6920: 65 64 69 61 74 65 20 65 78 63 6c 75 73 69 76 65 ediate exclusive 6930: 29 29 0a 20 20 20 20 20 20 20 20 28 65 72 72 6f )). (erro 6940: 72 20 27 77 69 74 68 2d 74 72 61 6e 73 61 63 74 r 'with-transact 6950: 69 6f 6e 20 20 22 62 61 64 20 61 72 67 75 6d 65 ion "bad argume 6960: 6e 74 3a 20 65 78 70 65 63 74 65 64 20 64 65 66 nt: expected def 6970: 65 72 72 65 64 2c 20 69 6d 6d 65 64 69 61 74 65 erred, immediate 6980: 20 6f 72 20 65 78 63 6c 75 73 69 76 65 22 29 0a or exclusive"). 6990: 20 20 20 20 20 20 20 20 74 79 70 65 29 0a 20 20 type). 69a0: 20 20 20 20 28 6c 65 74 20 28 5b 73 75 63 63 65 (let ([succe 69b0: 73 73 3f 20 23 66 5d 20 5b 65 78 6e 20 23 66 5d ss? #f] [exn #f] 69c0: 29 0a 20 20 20 20 20 20 20 20 28 64 79 6e 61 6d ). (dynam 69d0: 69 63 2d 77 69 6e 64 0a 20 20 20 20 20 20 20 20 ic-wind. 69e0: 20 20 28 6c 61 6d 62 64 61 20 28 29 0a 20 20 20 (lambda (). 69f0: 20 20 20 20 20 20 20 20 20 28 65 78 65 63 75 74 (execut 6a00: 65 20 64 62 0a 20 20 20 20 20 20 20 20 20 20 20 e db. 6a10: 20 20 20 20 20 20 20 20 20 20 28 73 74 72 69 6e (strin 6a20: 67 2d 61 70 70 65 6e 64 20 22 42 45 47 49 4e 20 g-append "BEGIN 6a30: 22 20 28 73 79 6d 62 6f 6c 2d 3e 73 74 72 69 6e " (symbol->strin 6a40: 67 20 74 79 70 65 29 20 22 20 54 52 41 4e 53 41 g type) " TRANSA 6a50: 43 54 49 4f 4e 3b 22 29 29 29 0a 20 20 20 20 20 CTION;"))). 6a60: 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 29 0a (lambda (). 6a70: 20 20 20 20 20 20 20 20 20 20 20 20 28 67 75 61 (gua 6a80: 72 64 20 28 65 20 5b 65 6c 73 65 20 28 62 65 67 rd (e [else (beg 6a90: 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 in. 6aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6ab0: 20 28 70 72 69 6e 74 2d 65 72 72 6f 72 20 22 77 (print-error "w 6ac0: 69 74 68 2d 74 72 61 6e 73 61 63 74 69 6f 6e 22 ith-transaction" 6ad0: 20 65 78 6e 29 0a 20 20 20 20 20 20 20 20 20 20 exn). 6ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6af0: 20 20 20 20 28 73 65 74 21 20 65 78 6e 20 65 29 (set! exn e) 6b00: 29 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 )]). 6b10: 20 20 20 20 20 20 20 28 73 65 74 21 20 73 75 63 (set! suc 6b20: 63 65 73 73 3f 20 28 74 68 75 6e 6b 29 29 0a 20 cess? (thunk)). 6b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6b40: 20 20 73 75 63 63 65 73 73 3f 29 29 0a 20 20 20 success?)). 6b50: 20 20 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 (lambda ( 6b60: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 65 ). (e 6b70: 78 65 63 75 74 65 20 64 62 0a 20 20 20 20 20 20 xecute db. 6b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 ( 6b90: 69 66 20 73 75 63 63 65 73 73 3f 0a 20 20 20 20 if success?. 6ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6bb0: 20 20 20 20 20 22 43 4f 4d 4d 49 54 20 54 52 41 "COMMIT TRA 6bc0: 4e 53 41 43 54 49 4f 4e 3b 22 0a 20 20 20 20 20 NSACTION;". 6bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6be0: 20 20 20 20 22 52 4f 4c 4c 42 41 43 4b 20 54 52 "ROLLBACK TR 6bf0: 41 4e 53 41 43 54 49 4f 4e 3b 22 29 29 0a 20 20 ANSACTION;")). 6c00: 20 20 20 20 20 20 20 20 20 20 28 61 6e 64 2d 6c (and-l 6c10: 65 74 2a 20 28 5b 65 20 65 78 6e 5d 29 0a 20 20 et* ([e exn]). 6c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c30: 20 20 20 20 28 73 65 74 21 20 65 78 6e 20 23 66 (set! exn #f 6c40: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ). 6c50: 20 20 20 20 20 20 20 20 28 72 61 69 73 65 20 65 (raise e 6c60: 29 29 29 29 29 29 29 29 0a 0a 20 3b 3b 20 43 68 )))))))).. ;; Ch 6c70: 65 63 6b 20 69 66 20 74 68 65 20 67 69 76 65 6e eck if the given 6c80: 20 73 74 72 69 6e 67 20 69 73 20 61 20 76 61 6c string is a val 6c90: 69 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 id SQL statement 6ca0: 0a 20 28 64 65 66 69 6e 65 20 73 71 6c 2d 63 6f . (define sql-co 6cb0: 6d 70 6c 65 74 65 3f 0a 20 20 20 28 66 6f 72 65 mplete?. (fore 6cc0: 69 67 6e 2d 70 72 6f 63 65 64 75 72 65 20 22 73 ign-procedure "s 6cd0: 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 22 qlite3_complete" 6ce0: 20 28 73 74 72 69 6e 67 29 20 62 6f 6f 6c 65 61 (string) boolea 6cf0: 6e 29 29 0a 0a 20 3b 3b 20 52 65 74 75 72 6e 20 n)).. ;; Return 6d00: 61 20 64 65 73 63 72 69 70 74 69 76 65 20 76 65 a descriptive ve 6d10: 72 73 69 6f 6e 20 73 74 72 69 6e 67 0a 20 28 64 rsion string. (d 6d20: 65 66 69 6e 65 20 64 61 74 61 62 61 73 65 2d 76 efine database-v 6d30: 65 72 73 69 6f 6e 0a 20 20 20 28 66 6f 72 65 69 ersion. (forei 6d40: 67 6e 2d 70 72 6f 63 65 64 75 72 65 20 22 73 71 gn-procedure "sq 6d50: 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e lite3_libversion 6d60: 22 20 28 29 20 73 74 72 69 6e 67 29 29 0a 0a 20 " () string)).. 6d70: 3b 3b 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d ;; Return the am 6d80: 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63 ount of memory c 6d90: 75 72 72 65 6e 74 6c 79 20 61 6c 6c 6f 63 61 74 urrently allocat 6da0: 65 64 20 62 79 20 74 68 65 20 64 61 74 61 62 61 ed by the databa 6db0: 73 65 0a 20 28 64 65 66 69 6e 65 20 64 61 74 61 se. (define data 6dc0: 62 61 73 65 2d 6d 65 6d 6f 72 79 2d 75 73 65 64 base-memory-used 6dd0: 0a 20 20 20 28 66 6f 72 65 69 67 6e 2d 70 72 6f . (foreign-pro 6de0: 63 65 64 75 72 65 20 22 73 71 6c 69 74 65 33 5f cedure "sqlite3_ 6df0: 6d 65 6d 6f 72 79 5f 75 73 65 64 22 20 28 29 20 memory_used" () 6e00: 69 6e 74 29 29 0a 0a 20 3b 3b 20 52 65 74 75 72 int)).. ;; Retur 6e10: 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d n the maximum am 6e20: 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 61 ount of memory a 6e30: 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 65 20 llocated by the 6e40: 64 61 74 61 62 61 73 65 20 73 69 6e 63 65 0a 20 database since. 6e50: 3b 3b 20 74 68 65 20 63 6f 75 6e 74 65 72 20 77 ;; the counter w 6e60: 61 73 20 6c 61 73 74 20 72 65 73 65 74 0a 20 28 as last reset. ( 6e70: 64 65 66 69 6e 65 20 64 61 74 61 62 61 73 65 2d define database- 6e80: 6d 65 6d 6f 72 79 2d 68 69 67 68 77 61 74 65 72 memory-highwater 6e90: 0a 20 20 20 28 63 61 73 65 2d 6c 61 6d 62 64 61 . (case-lambda 6ea0: 0a 20 20 20 20 20 28 28 29 20 28 64 61 74 61 62 . (() (datab 6eb0: 61 73 65 2d 6d 65 6d 6f 72 79 2d 68 69 67 68 77 ase-memory-highw 6ec0: 61 74 65 72 20 23 66 29 29 0a 20 20 20 20 20 28 ater #f)). ( 6ed0: 28 72 65 73 65 74 3f 29 20 28 28 66 6f 72 65 69 (reset?) ((forei 6ee0: 67 6e 2d 70 72 6f 63 65 64 75 72 65 20 22 73 71 gn-procedure "sq 6ef0: 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 68 69 67 lite3_memory_hig 6f00: 68 77 61 74 65 72 22 20 28 62 6f 6f 6c 65 61 6e hwater" (boolean 6f10: 29 20 69 6e 74 29 20 72 65 73 65 74 3f 29 29 29 ) int) reset?))) 6f20: 29 0a 0a 20 3b 3b 20 45 6e 61 62 6c 65 73 20 28 ).. ;; Enables ( 6f30: 64 69 73 61 62 6c 65 73 29 20 74 68 65 20 73 68 disables) the sh 6f40: 61 72 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 aring of the dat 6f50: 61 62 61 73 65 20 63 61 63 68 65 20 61 6e 64 20 abase cache and 6f60: 73 63 68 65 6d 61 20 64 61 74 61 0a 20 3b 3b 20 schema data. ;; 6f70: 73 74 72 75 63 74 75 72 65 73 20 62 65 74 77 65 structures betwe 6f80: 65 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 en connections t 6f90: 6f 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 o the same datab 6fa0: 61 73 65 2e 0a 20 28 64 65 66 69 6e 65 20 28 65 ase.. (define (e 6fb0: 6e 61 62 6c 65 2d 73 68 61 72 65 64 2d 63 61 63 nable-shared-cac 6fc0: 68 65 21 20 65 6e 61 62 6c 65 3f 29 0a 20 20 20 he! enable?). 6fd0: 28 63 6f 6e 64 2d 65 78 70 61 6e 64 0a 20 20 20 (cond-expand. 6fe0: 20 5b 64 69 73 61 62 6c 65 2d 73 68 61 72 65 64 [disable-shared 6ff0: 2d 63 61 63 68 65 0a 20 20 20 20 20 23 66 5d 0a -cache. #f]. 7000: 20 20 20 20 5b 65 6c 73 65 0a 20 20 20 20 20 28 [else. ( 7010: 63 6f 6e 64 0a 20 20 20 20 20 20 5b 28 28 66 6f cond. [((fo 7020: 72 65 69 67 6e 2d 70 72 6f 63 65 64 75 72 65 20 reign-procedure 7030: 22 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f "sqlite3_enable_ 7040: 73 68 61 72 65 64 5f 63 61 63 68 65 22 20 28 62 shared_cache" (b 7050: 6f 6f 6c 65 61 6e 29 20 69 6e 74 29 20 65 6e 61 oolean) int) ena 7060: 62 6c 65 3f 29 0a 20 20 20 20 20 20 20 3d 3e 20 ble?). => 7070: 28 61 62 6f 72 74 2d 73 71 6c 69 74 65 33 2d 65 (abort-sqlite3-e 7080: 72 72 6f 72 20 27 65 6e 61 62 6c 65 2d 73 68 61 rror 'enable-sha 7090: 72 65 64 2d 63 61 63 68 65 21 20 23 66 29 5d 0a red-cache! #f)]. 70a0: 20 20 20 20 20 20 5b 65 6c 73 65 0a 20 20 20 20 [else. 70b0: 20 20 20 65 6e 61 62 6c 65 3f 5d 29 5d 29 29 0a enable?])])). 70c0: 0a 20 3b 3b 20 45 6e 61 62 6c 65 73 20 28 64 69 . ;; Enables (di 70d0: 73 61 62 6c 65 73 29 20 74 68 65 20 6c 6f 61 64 sables) the load 70e0: 69 6e 67 20 6f 66 20 6e 61 74 69 76 65 20 65 78 ing of native ex 70f0: 74 65 6e 73 69 6f 6e 73 20 75 73 69 6e 67 20 53 tensions using S 7100: 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 QL statements.. 7110: 28 64 65 66 69 6e 65 20 28 65 6e 61 62 6c 65 2d (define (enable- 7120: 6c 6f 61 64 2d 65 78 74 65 6e 73 69 6f 6e 21 20 load-extension! 7130: 64 62 20 65 6e 61 62 6c 65 3f 29 0a 20 20 20 28 db enable?). ( 7140: 63 6f 6e 64 2d 65 78 70 61 6e 64 0a 20 20 20 20 cond-expand. 7150: 5b 64 69 73 61 62 6c 65 2d 6c 6f 61 64 2d 65 78 [disable-load-ex 7160: 74 65 6e 73 69 6f 6e 0a 20 20 20 20 20 23 66 5d tension. #f] 7170: 0a 20 20 20 20 5b 65 6c 73 65 0a 20 20 20 20 20 . [else. 7180: 28 63 6f 6e 64 0a 20 20 20 20 20 20 5b 28 28 66 (cond. [((f 7190: 6f 72 65 69 67 6e 2d 70 72 6f 63 65 64 75 72 65 oreign-procedure 71a0: 20 22 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 "sqlite3_enable 71b0: 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 22 _load_extension" 71c0: 20 28 73 71 6c 69 74 65 33 3a 64 61 74 61 62 61 (sqlite3:databa 71d0: 73 65 2a 20 62 6f 6f 6c 65 61 6e 29 20 69 6e 74 se* boolean) int 71e0: 29 20 28 64 61 74 61 62 61 73 65 2d 61 64 64 72 ) (database-addr 71f0: 20 64 62 29 20 65 6e 61 62 6c 65 3f 29 0a 20 20 db) enable?). 7200: 20 20 20 20 20 3d 3e 20 28 61 62 6f 72 74 2d 73 => (abort-s 7210: 71 6c 69 74 65 33 2d 65 72 72 6f 72 20 27 65 6e qlite3-error 'en 7220: 61 62 6c 65 2d 6c 6f 61 64 2d 65 78 74 65 6e 73 able-load-extens 7230: 69 6f 6e 21 20 64 62 29 5d 0a 20 20 20 20 20 20 ion! db)]. 7240: 5b 65 6c 73 65 0a 20 20 20 20 20 20 20 65 6e 61 [else. ena 7250: 62 6c 65 3f 5d 29 5d 29 29 0a 0a 20 28 64 65 66 ble?])])).. (def 7260: 69 6e 65 20 28 73 71 6c 69 74 65 33 2d 74 72 61 ine (sqlite3-tra 7270: 63 65 20 64 62 20 66 75 6e 63 20 64 61 74 61 29 ce db func data) 7280: 0a 20 20 20 28 63 68 65 63 6b 2d 64 61 74 61 62 . (check-datab 7290: 61 73 65 20 27 73 71 6c 69 74 65 33 2d 74 72 61 ase 'sqlite3-tra 72a0: 63 65 20 64 62 29 0a 20 20 20 28 6c 65 74 20 28 ce db). (let ( 72b0: 5b 66 20 28 66 6f 72 65 69 67 6e 2d 70 72 6f 63 [f (foreign-proc 72c0: 65 64 75 72 65 20 22 73 71 6c 69 74 65 33 5f 74 edure "sqlite3_t 72d0: 72 61 63 65 22 20 28 73 71 6c 69 74 65 33 3a 64 race" (sqlite3:d 72e0: 61 74 61 62 61 73 65 2a 20 76 6f 69 64 2a 20 76 atabase* void* v 72f0: 6f 69 64 2a 29 20 76 6f 69 64 29 5d 29 0a 20 20 oid*) void)]). 7300: 20 20 20 28 66 20 28 64 61 74 61 62 61 73 65 2d (f (database- 7310: 61 64 64 72 20 64 62 29 20 66 75 6e 63 20 64 61 addr db) func da 7320: 74 61 29 29 29 0a 0a 20 28 64 65 66 69 6e 65 20 ta))).. (define 7330: 28 73 71 6c 69 74 65 33 2d 63 6f 6e 66 69 67 2d (sqlite3-config- 7340: 6c 6f 67 20 66 75 6e 63 20 64 61 74 61 29 0a 20 log func data). 7350: 20 20 3b 28 63 68 65 63 6b 2d 64 61 74 61 62 61 ;(check-databa 7360: 73 65 20 27 73 71 6c 69 74 65 33 2d 63 6f 6e 66 se 'sqlite3-conf 7370: 69 67 2d 6c 6f 67 20 64 62 29 0a 20 20 20 28 6c ig-log db). (l 7380: 65 74 20 28 5b 66 20 28 66 6f 72 65 69 67 6e 2d et ([f (foreign- 7390: 70 72 6f 63 65 64 75 72 65 20 22 73 71 6c 69 74 procedure "sqlit 73a0: 65 33 5f 63 6f 6e 66 69 67 22 20 28 69 6e 74 20 e3_config" (int 73b0: 76 6f 69 64 2a 20 76 6f 69 64 2a 29 20 76 6f 69 void* void*) voi 73c0: 64 29 5d 29 0a 20 20 20 20 20 28 66 20 31 36 20 d)]). (f 16 73d0: 66 75 6e 63 20 64 61 74 61 29 29 29 0a 0a 20 28 func data))).. ( 73e0: 72 65 63 6f 72 64 2d 77 72 69 74 65 72 0a 20 20 record-writer. 73f0: 28 74 79 70 65 2d 64 65 73 63 72 69 70 74 6f 72 (type-descriptor 7400: 20 64 61 74 61 62 61 73 65 29 0a 20 20 28 6c 61 database). (la 7410: 6d 62 64 61 20 28 72 20 70 20 77 72 29 0a 20 20 mbda (r p wr). 7420: 20 20 28 77 72 0a 20 20 20 20 20 28 69 66 20 28 (wr. (if ( 7430: 64 61 74 61 62 61 73 65 2d 70 74 72 20 72 29 0a database-ptr r). 7440: 20 20 20 20 20 20 20 20 20 22 23 3c 73 71 6c 69 "#<sqli 7450: 74 65 33 3a 64 61 74 61 62 61 73 65 3e 22 0a 20 te3:database>". 7460: 20 20 20 20 20 20 20 20 22 23 3c 73 71 6c 69 74 "#<sqlit 7470: 65 33 3a 64 61 74 61 62 61 73 65 20 7a 6f 6d 62 e3:database zomb 7480: 69 65 3e 22 29 0a 20 20 20 20 20 70 29 29 29 0a ie>"). p))). 7490: 20 28 72 65 63 6f 72 64 2d 77 72 69 74 65 72 0a (record-writer. 74a0: 20 20 28 74 79 70 65 2d 64 65 73 63 72 69 70 74 (type-descript 74b0: 6f 72 20 73 74 61 74 65 6d 65 6e 74 29 0a 20 20 or statement). 74c0: 28 6c 61 6d 62 64 61 20 28 72 20 70 20 77 72 29 (lambda (r p wr) 74d0: 0a 20 20 20 20 28 77 72 0a 20 20 20 20 20 28 69 . (wr. (i 74e0: 66 20 28 73 74 61 74 65 6d 65 6e 74 2d 70 74 72 f (statement-ptr 74f0: 20 72 29 0a 20 20 20 20 20 20 20 20 20 28 66 6f r). (fo 7500: 72 6d 61 74 20 22 23 3c 73 71 6c 69 74 65 33 3a rmat "#<sqlite3: 7510: 73 74 61 74 65 6d 65 6e 74 20 73 71 6c 3d 7e 73 statement sql=~s 7520: 3e 22 20 28 73 74 61 74 65 6d 65 6e 74 2d 73 71 >" (statement-sq 7530: 6c 20 72 29 29 0a 20 20 20 20 20 20 20 20 20 22 l r)). " 7540: 23 3c 73 71 6c 69 74 65 33 3a 73 74 61 74 65 6d #<sqlite3:statem 7550: 65 6e 74 20 7a 6f 6d 62 69 65 3e 22 29 0a 20 20 ent zombie>"). 7560: 20 20 20 70 29 29 29 0a 0a 0a 20 29 20 3b 20 6c p)))... ) ; l 7570: 69 62 72 61 72 79 20 73 71 6c 69 74 65 33 0a 0a ibrary sqlite3..