1
0

db.lisp 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. (in-package #:chatikbot)
  2. (defvar *db-name* "db.sqlite" "SQLite database name")
  3. (defun db-path ()
  4. (merge-pathnames *db-name*
  5. (asdf:component-pathname
  6. (asdf:find-system '#:chatikbot))))
  7. (defmacro with-db ((db) &body body)
  8. `(sqlite:with-open-database (,db (db-path) :busy-timeout 30)
  9. (sqlite:execute-non-query ,db "PRAGMA foreign_keys = ON")
  10. ,@body))
  11. (defun %db-execute (db sql &rest parameters)
  12. (apply #'sqlite:execute-non-query db sql parameters))
  13. (defun %db-select (db sql &rest parameters)
  14. (apply #'sqlite:execute-to-list db sql parameters))
  15. (defun %db-single (db sql &rest parameters)
  16. (apply #'sqlite:execute-single db sql parameters))
  17. (defun db-execute (sql &rest parameters)
  18. (with-db (db)
  19. (apply #'%db-execute db sql parameters)
  20. (sqlite:last-insert-rowid db)))
  21. (defun db-select (sql &rest parameters)
  22. (with-db (db)
  23. (apply #'%db-select db sql parameters)))
  24. (defun db-single (sql &rest parameters)
  25. (with-db (db)
  26. (apply #'%db-single db sql parameters)))
  27. (defmacro db-transaction ((db) &body body)
  28. `(with-db (,db)
  29. (sqlite:with-transaction ,db ,@body)))
  30. (defmacro def-db-init ((db) &body body)
  31. `(add-hook :db-init #'(lambda (,db)
  32. (handler-case (progn ,@body)
  33. (error (e) (log:error e)))
  34. (values))))
  35. (defun db-init ()
  36. (with-db (db)
  37. (%db-execute db "create table if not exists settings (var, val)")
  38. (%db-execute db "create unique index if not exists settings_var_unique on settings (var)")))