sqlite3.scm 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562
  1. ;; Guile-SQLite3
  2. ;; Copyright (C) 2010, 2014 Andy Wingo <wingo at pobox dot com>
  3. ;; Copyright (C) 2018 Ludovic Courtès <ludo@gnu.org>
  4. ;; This library is free software; you can redistribute it and/or modify
  5. ;; it under the terms of the GNU Lesser General Public License as
  6. ;; published by the Free Software Foundation; either version 3 of the
  7. ;; License, or (at your option) any later version.
  8. ;;
  9. ;; This library is distributed in the hope that it will be useful, but
  10. ;; WITHOUT ANY WARRANTY; without even the implied warranty of
  11. ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12. ;; Lesser General Public License for more details.
  13. ;;
  14. ;; You should have received a copy of the GNU Lesser General Public
  15. ;; License along with this program; if not, contact:
  16. ;;
  17. ;; Free Software Foundation Voice: +1-617-542-5942
  18. ;; 59 Temple Place - Suite 330 Fax: +1-617-542-2652
  19. ;; Boston, MA 02111-1307, USA gnu@gnu.org
  20. ;;; Commentary:
  21. ;;
  22. ;; A Guile binding for sqlite.
  23. ;;
  24. ;;; Code:
  25. (define-module (sqlite3)
  26. #:use-module (system foreign)
  27. #:use-module (rnrs bytevectors)
  28. #:use-module (ice-9 match)
  29. #:use-module (srfi srfi-1)
  30. #:use-module (srfi srfi-9)
  31. #:use-module (srfi srfi-19)
  32. #:export (sqlite-open
  33. sqlite-close
  34. sqlite-enable-load-extension
  35. sqlite-prepare*
  36. sqlite-prepare
  37. sqlite-bind
  38. sqlite-bind-arguments
  39. sqlite-column-names
  40. sqlite-step
  41. sqlite-fold
  42. sqlite-fold-right
  43. sqlite-map
  44. sqlite-reset
  45. sqlite-finalize
  46. sqlite-bind-parameter-index
  47. sqlite-busy-timeout
  48. SQLITE_OPEN_READONLY
  49. SQLITE_OPEN_READWRITE
  50. SQLITE_OPEN_CREATE
  51. SQLITE_OPEN_DELETEONCLOSE
  52. SQLITE_OPEN_EXCLUSIVE
  53. SQLITE_OPEN_MAIN_DB
  54. SQLITE_OPEN_TEMP_DB
  55. SQLITE_OPEN_TRANSIENT_DB
  56. SQLITE_OPEN_MAIN_JOURNAL
  57. SQLITE_OPEN_TEMP_JOURNAL
  58. SQLITE_OPEN_SUBJOURNAL
  59. SQLITE_OPEN_MASTER_JOURNAL
  60. SQLITE_OPEN_NOMUTEX
  61. SQLITE_OPEN_FULLMUTEX
  62. SQLITE_OPEN_SHAREDCACHE
  63. SQLITE_OPEN_PRIVATECACHE
  64. SQLITE_CONSTRAINT
  65. SQLITE_CONSTRAINT_PRIMARYKEY
  66. SQLITE_CONSTRAINT_UNIQUE))
  67. ;;
  68. ;; Utils
  69. ;;
  70. (define (string->utf8-pointer s)
  71. (string->pointer s "utf-8"))
  72. (define (utf8-pointer->string p)
  73. (pointer->string p -1 "utf-8"))
  74. ;;
  75. ;; Constants
  76. ;;
  77. ;; FIXME: snarf using compiler. These are just copied from the header...
  78. ;;
  79. (define SQLITE_OPEN_READONLY #x00000001) ;; Ok for sqlite3_open_v2()
  80. (define SQLITE_OPEN_READWRITE #x00000002) ;; Ok for sqlite3_open_v2()
  81. (define SQLITE_OPEN_CREATE #x00000004) ;; Ok for sqlite3_open_v2()
  82. (define SQLITE_OPEN_DELETEONCLOSE #x00000008) ;; VFS only
  83. (define SQLITE_OPEN_EXCLUSIVE #x00000010) ;; VFS only
  84. (define SQLITE_OPEN_MAIN_DB #x00000100) ;; VFS only
  85. (define SQLITE_OPEN_TEMP_DB #x00000200) ;; VFS only
  86. (define SQLITE_OPEN_TRANSIENT_DB #x00000400) ;; VFS only
  87. (define SQLITE_OPEN_MAIN_JOURNAL #x00000800) ;; VFS only
  88. (define SQLITE_OPEN_TEMP_JOURNAL #x00001000) ;; VFS only
  89. (define SQLITE_OPEN_SUBJOURNAL #x00002000) ;; VFS only
  90. (define SQLITE_OPEN_MASTER_JOURNAL #x00004000) ;; VFS only
  91. (define SQLITE_OPEN_NOMUTEX #x00008000) ;; Ok for sqlite3_open_v2()
  92. (define SQLITE_OPEN_FULLMUTEX #x00010000) ;; Ok for sqlite3_open_v2()
  93. (define SQLITE_OPEN_SHAREDCACHE #x00020000) ;; Ok for sqlite3_open_v2()
  94. (define SQLITE_OPEN_PRIVATECACHE #x00040000) ;; Ok for sqlite3_open_v2()
  95. (define SQLITE_CONSTRAINT 19)
  96. (define SQLITE_CONSTRAINT_PRIMARYKEY
  97. (logior SQLITE_CONSTRAINT (ash 6 8)))
  98. (define SQLITE_CONSTRAINT_UNIQUE
  99. (logior SQLITE_CONSTRAINT (ash 8 8)))
  100. (define libsqlite3 (dynamic-link "libsqlite3"))
  101. (define-record-type <sqlite-db>
  102. (make-db pointer open? stmts)
  103. db?
  104. (pointer db-pointer)
  105. (open? db-open? set-db-open?!)
  106. (stmts db-stmts))
  107. (define-record-type <sqlite-stmt>
  108. (make-stmt pointer live? reset? cached?)
  109. stmt?
  110. (pointer stmt-pointer)
  111. (live? stmt-live? set-stmt-live?!)
  112. (reset? stmt-reset? set-stmt-reset?!)
  113. (cached? stmt-cached? set-stmt-cached?!))
  114. (define sqlite-errmsg
  115. (let ((f (pointer->procedure
  116. '*
  117. (dynamic-func "sqlite3_errmsg" libsqlite3)
  118. (list '*))))
  119. (lambda (db)
  120. (utf8-pointer->string (f (db-pointer db))))))
  121. (define sqlite-errcode
  122. (let ((f (pointer->procedure
  123. int
  124. (dynamic-func "sqlite3_extended_errcode" libsqlite3)
  125. (list '*))))
  126. (lambda (db)
  127. (f (db-pointer db)))))
  128. (define* (sqlite-error db who #:optional code
  129. (errmsg (and db (sqlite-errmsg db))))
  130. (throw 'sqlite-error who code errmsg))
  131. (define* (check-error db #:optional who)
  132. (let ((code (sqlite-errcode db)))
  133. (if (not (zero? code))
  134. (sqlite-error db who code))))
  135. (define sqlite-close
  136. (let ((f (pointer->procedure
  137. int
  138. (dynamic-func "sqlite3_close" libsqlite3)
  139. (list '*))))
  140. (lambda (db)
  141. (when (db-open? db)
  142. ;; Finalize cached statements.
  143. (hash-for-each (lambda (sql stmt)
  144. (set-stmt-cached?! stmt #f)
  145. (sqlite-finalize stmt))
  146. (db-stmts db))
  147. (hash-clear! (db-stmts db))
  148. (let ((p (db-pointer db)))
  149. (set-db-open?! db #f)
  150. (f p))))))
  151. (define db-guardian (make-guardian))
  152. (define (pump-db-guardian)
  153. (let ((db (db-guardian)))
  154. (if db
  155. (begin
  156. (sqlite-close db)
  157. (pump-db-guardian)))))
  158. (add-hook! after-gc-hook pump-db-guardian)
  159. (define (static-errcode->errmsg code)
  160. (case code
  161. ((1) "SQL error or missing database")
  162. ((2) "Internal logic error in SQLite")
  163. ((3) "Access permission denied")
  164. ((5) "The database file is locked")
  165. ((6) "A table in the database is locked")
  166. ((7) "A malloc() failed")
  167. ((8) "Attempt to write a readonly database")
  168. ((10) "Some kind of disk I/O error occurred")
  169. ((11) "The database disk image is malformed")
  170. ((14) "Unable to open the database file")
  171. ((21) "Library used incorrectly")
  172. ((22) "Uses OS features not supported on host")
  173. ((23) "Authorization denied")
  174. ((24) "Auxiliary database format error")
  175. ((26) "File opened that is not a database file")
  176. (else "Unknown error")))
  177. (define sqlite-open
  178. (let ((f (pointer->procedure
  179. int
  180. (dynamic-func "sqlite3_open_v2" libsqlite3)
  181. (list '* '* int '*))))
  182. (lambda* (filename #:optional
  183. (flags (logior SQLITE_OPEN_READWRITE SQLITE_OPEN_CREATE))
  184. (vfs #f))
  185. (let* ((out-db (bytevector->pointer (make-bytevector (sizeof '*) 0)))
  186. (ret (f (string->utf8-pointer filename)
  187. out-db
  188. flags
  189. (if vfs (string->utf8-pointer vfs) %null-pointer))))
  190. (if (zero? ret)
  191. (let ((db (make-db (dereference-pointer out-db) #t
  192. (make-hash-table))))
  193. (db-guardian db)
  194. db)
  195. (sqlite-error #f 'sqlite-open ret (static-errcode->errmsg ret)))))))
  196. (define sqlite-enable-load-extension
  197. (let ((ele (pointer->procedure
  198. int
  199. (dynamic-func "sqlite3_enable_load_extension" libsqlite3)
  200. (list '* int))))
  201. (lambda (db onoff)
  202. (ele (db-pointer db) onoff))))
  203. ;;;
  204. ;;; SQL statements
  205. ;;;
  206. (define sqlite-remove-statement!
  207. (lambda (db stmt)
  208. (when (stmt-cached? stmt)
  209. (let* ((stmts (db-stmts db))
  210. (key (catch 'value
  211. (lambda ()
  212. (hash-for-each (lambda (key value)
  213. (when (eq? value stmt)
  214. (throw 'value key)))
  215. stmts)
  216. #f)
  217. (lambda (_ key) key))))
  218. (hash-remove! stmts key)))))
  219. (define sqlite-finalize
  220. (let ((f (pointer->procedure
  221. int
  222. (dynamic-func "sqlite3_finalize" libsqlite3)
  223. (list '*))))
  224. (lambda (stmt)
  225. ;; Note: When STMT is cached, this is a no-op. This ensures caching
  226. ;; actually works while still separating concerns: users can turn
  227. ;; caching on and off without having to change the rest of their code.
  228. (when (and (stmt-live? stmt)
  229. (not (stmt-cached? stmt)))
  230. (let ((p (stmt-pointer stmt)))
  231. (sqlite-remove-statement! (stmt->db stmt) stmt)
  232. (set-stmt-live?! stmt #f)
  233. (f p))))))
  234. (define *stmt-map* (make-weak-key-hash-table))
  235. (define (stmt->db stmt)
  236. (hashq-ref *stmt-map* stmt))
  237. (define stmt-guardian (make-guardian))
  238. (define (pump-stmt-guardian)
  239. (let ((stmt (stmt-guardian)))
  240. (if stmt
  241. (begin
  242. (sqlite-finalize stmt)
  243. (pump-stmt-guardian)))))
  244. (add-hook! after-gc-hook pump-stmt-guardian)
  245. (define sqlite-reset
  246. (let ((reset (pointer->procedure
  247. int
  248. (dynamic-func "sqlite3_reset" libsqlite3)
  249. (list '*))))
  250. (lambda (stmt)
  251. (if (stmt-live? stmt)
  252. (let ((p (stmt-pointer stmt)))
  253. (set-stmt-reset?! stmt #t)
  254. (reset p))
  255. (error "statement already finalized" stmt)))))
  256. (define (assert-live-stmt! stmt)
  257. (if (not (stmt-live? stmt))
  258. (error "statement already finalized" stmt)))
  259. (define (assert-live-db! db)
  260. (if (not (db-open? db))
  261. (error "database already closed" db)))
  262. (define %sqlite-prepare
  263. (let ((prepare (pointer->procedure
  264. int
  265. (dynamic-func "sqlite3_prepare_v2" libsqlite3)
  266. (list '* '* int '* '*))))
  267. (lambda* (db sql #:key cache?)
  268. (assert-live-db! db)
  269. (let* ((out-stmt (bytevector->pointer (make-bytevector (sizeof '*) 0)))
  270. (out-tail (bytevector->pointer (make-bytevector (sizeof '*) 0)))
  271. (bv (string->utf8 sql))
  272. (bvp (bytevector->pointer bv))
  273. (ret (prepare (db-pointer db)
  274. bvp
  275. (bytevector-length bv)
  276. out-stmt
  277. out-tail)))
  278. (if (zero? ret)
  279. (if (= (bytevector-length bv)
  280. (- (pointer-address (dereference-pointer out-tail))
  281. (pointer-address bvp)))
  282. (let ((stmt (make-stmt (dereference-pointer out-stmt) #t #t
  283. cache?)))
  284. (stmt-guardian stmt)
  285. (hashq-set! *stmt-map* stmt db)
  286. stmt)
  287. (error "input sql has useless tail"
  288. (utf8-pointer->string
  289. (dereference-pointer out-tail))))
  290. (check-error db 'sqlite-prepare))))))
  291. (define* (sqlite-prepare db sql #:key cache?)
  292. (if cache?
  293. (match (hash-ref (db-stmts db) sql)
  294. (#f
  295. (let ((stmt (%sqlite-prepare db sql #:cache? #t)))
  296. (hash-set! (db-stmts db) sql stmt)
  297. stmt))
  298. (stmt
  299. (sqlite-reset stmt)
  300. stmt))
  301. (%sqlite-prepare db sql)))
  302. (define sqlite-bind-parameter-index
  303. (let ((bind-parameter-index (pointer->procedure
  304. int
  305. (dynamic-func "sqlite3_bind_parameter_index" libsqlite3)
  306. (list '* '*))))
  307. (lambda (stmt name)
  308. (assert-live-stmt! stmt)
  309. (let* ((ret (bind-parameter-index (stmt-pointer stmt)
  310. (string->utf8-pointer name))))
  311. (if (> ret 0)
  312. ret
  313. (begin
  314. (check-error (stmt->db stmt) 'sqlite-bind-parameter-index)
  315. (write ret)
  316. (newline)
  317. (error "No such parameter" name)))))))
  318. (define key->index
  319. (lambda (stmt key)
  320. (cond
  321. ((string? key) (sqlite-bind-parameter-index stmt key))
  322. ((symbol? key) (sqlite-bind-parameter-index stmt
  323. (string-append ":" (symbol->string key))))
  324. (else key))))
  325. (define sqlite-bind
  326. (let ((bind-blob (pointer->procedure
  327. int
  328. (dynamic-func "sqlite3_bind_blob" libsqlite3)
  329. (list '* int '* int '*)))
  330. (bind-text (pointer->procedure
  331. int
  332. (dynamic-func "sqlite3_bind_text" libsqlite3)
  333. (list '* int '* int '*)))
  334. (bind-int64 (pointer->procedure
  335. int
  336. (dynamic-func "sqlite3_bind_int64" libsqlite3)
  337. (list '* int int64)))
  338. (bind-double (pointer->procedure
  339. int
  340. (dynamic-func "sqlite3_bind_double" libsqlite3)
  341. (list '* int double)))
  342. (bind-null (pointer->procedure
  343. int
  344. (dynamic-func "sqlite3_bind_null" libsqlite3)
  345. (list '* int)))
  346. (sqlite-transient (make-pointer
  347. (bit-extract (lognot 0) 0 (* 8 (sizeof '*))))))
  348. (lambda (stmt key val)
  349. (assert-live-stmt! stmt)
  350. (let ((idx (key->index stmt key))
  351. (p (stmt-pointer stmt)))
  352. (cond
  353. ((bytevector? val)
  354. (bind-blob p idx (bytevector->pointer val) (bytevector-length val)
  355. sqlite-transient))
  356. ((string? val)
  357. (let ((bv (string->utf8 val)))
  358. (bind-text p idx (bytevector->pointer bv) (bytevector-length bv)
  359. sqlite-transient)))
  360. ((and (integer? val) (exact? val))
  361. (bind-int64 p idx val))
  362. ((number? val)
  363. (bind-double p idx (exact->inexact val)))
  364. ((not val)
  365. (bind-null p idx))
  366. (else
  367. (error "unexpected value" val)))
  368. (check-error (stmt->db stmt))))))
  369. (define (sqlite-bind-arguments stmt . args)
  370. "Bind STMT parameters, one after another, to ARGS.
  371. Also bind named parameters to the respective ones."
  372. (let loop ((i 1)
  373. (args args))
  374. (match args
  375. (()
  376. #f)
  377. (((? keyword? kw) value . rest)
  378. (sqlite-bind stmt (keyword->symbol kw) value)
  379. (loop i rest))
  380. ((arg . rest)
  381. (sqlite-bind stmt i arg)
  382. (loop (+ 1 i) rest)))))
  383. (define sqlite-column-count
  384. (let ((column-count
  385. (pointer->procedure
  386. int
  387. (dynamic-pointer "sqlite3_column_count" libsqlite3)
  388. (list '*))))
  389. (lambda (stmt)
  390. (assert-live-stmt! stmt)
  391. (column-count (stmt-pointer stmt)))))
  392. (define sqlite-column-name
  393. (let ((column-name
  394. (pointer->procedure
  395. '*
  396. (dynamic-pointer "sqlite3_column_name" libsqlite3)
  397. (list '* int))))
  398. (lambda (stmt i)
  399. (assert-live-stmt! stmt)
  400. (utf8-pointer->string (column-name (stmt-pointer stmt) i)))))
  401. (define sqlite-column-value
  402. (let ((value-type
  403. (pointer->procedure
  404. int
  405. (dynamic-pointer "sqlite3_column_type" libsqlite3)
  406. (list '* int)))
  407. (value-int
  408. (pointer->procedure
  409. int64
  410. (dynamic-pointer "sqlite3_column_int64" libsqlite3)
  411. (list '* int)))
  412. (value-double
  413. (pointer->procedure
  414. double
  415. (dynamic-pointer "sqlite3_column_double" libsqlite3)
  416. (list '* int)))
  417. (value-text
  418. (pointer->procedure
  419. '*
  420. (dynamic-pointer "sqlite3_column_text" libsqlite3)
  421. (list '* int)))
  422. (value-blob
  423. (pointer->procedure
  424. '*
  425. (dynamic-pointer "sqlite3_column_blob" libsqlite3)
  426. (list '* int)))
  427. (value-bytes
  428. (pointer->procedure
  429. int
  430. (dynamic-pointer "sqlite3_column_bytes" libsqlite3)
  431. (list '* int))))
  432. (lambda (stmt i)
  433. (assert-live-stmt! stmt)
  434. (case (value-type (stmt-pointer stmt) i)
  435. ((1) ; SQLITE_INTEGER
  436. (value-int (stmt-pointer stmt) i))
  437. ((2) ; SQLITE_FLOAT
  438. (value-double (stmt-pointer stmt) i))
  439. ((3) ; SQLITE3_TEXT
  440. (let ((p (value-blob (stmt-pointer stmt) i)))
  441. (if (null-pointer? p)
  442. ""
  443. (utf8->string
  444. (pointer->bytevector p (value-bytes (stmt-pointer stmt) i))))))
  445. ((4) ; SQLITE_BLOB
  446. (let ((p (value-blob (stmt-pointer stmt) i)))
  447. (if (null-pointer? p)
  448. (make-bytevector 0)
  449. (pointer->bytevector p (value-bytes (stmt-pointer stmt) i)))))
  450. ((5) ; SQLITE_NULL
  451. #f)))))
  452. (define (sqlite-column-names stmt)
  453. (let ((v (make-vector (sqlite-column-count stmt))))
  454. (let lp ((i 0))
  455. (if (< i (vector-length v))
  456. (begin
  457. (vector-set! v i (sqlite-column-name stmt i))
  458. (lp (1+ i)))
  459. v))))
  460. (define (sqlite-row stmt)
  461. (let ((v (make-vector (sqlite-column-count stmt))))
  462. (let lp ((i 0))
  463. (if (< i (vector-length v))
  464. (begin
  465. (vector-set! v i (sqlite-column-value stmt i))
  466. (lp (1+ i)))
  467. v))))
  468. (define sqlite-busy-timeout
  469. (let ((f (pointer->procedure
  470. int
  471. (dynamic-func "sqlite3_busy_timeout" libsqlite3)
  472. (list '* int))))
  473. (lambda (db value)
  474. (assert-live-db! db)
  475. (let ((ret (f (db-pointer db) value)))
  476. (when (not (zero? ret))
  477. (check-error db 'sqlite-busy-timeout))))))
  478. (define sqlite-step
  479. (let ((step (pointer->procedure
  480. int
  481. (dynamic-pointer "sqlite3_step" libsqlite3)
  482. (list '*))))
  483. (lambda (stmt)
  484. (assert-live-stmt! stmt)
  485. (let ((ret (step (stmt-pointer stmt))))
  486. (case ret
  487. ((100) ; SQLITE_ROW
  488. (sqlite-row stmt))
  489. ((101) ; SQLITE_DONE
  490. #f)
  491. (else
  492. (check-error (stmt->db stmt))
  493. (error "shouldn't get here")))))))
  494. (define (sqlite-fold kons knil stmt)
  495. (assert-live-stmt! stmt)
  496. (let lp ((seed knil))
  497. (let ((row (sqlite-step stmt)))
  498. (if row
  499. (lp (kons row seed))
  500. seed))))
  501. (define (sqlite-fold-right kons knil stmt)
  502. (assert-live-stmt! stmt)
  503. (let lp ()
  504. (let ((row (sqlite-step stmt)))
  505. (if row
  506. (kons row (lp))
  507. knil))))
  508. (define (sqlite-map proc stmt)
  509. (map proc
  510. (reverse! (sqlite-fold cons '() stmt))))