PageRenderTime 44ms CodeModel.GetById 19ms RepoModel.GetById 1ms app.codeStats 0ms

/src/compile.lisp

https://github.com/inracer/sxql
Lisp | 44 lines | 36 code | 8 blank | 0 comment | 0 complexity | 18a9b354cb518e0924b0d0ecff083168 MD5 | raw file
Possible License(s): BSD-3-Clause
  1. (in-package :cl-user)
  2. (defpackage sxql.compile
  3. (:use :cl
  4. :trivial-types
  5. :sxql.sql-type))
  6. (in-package :sxql.compile)
  7. (cl-syntax:use-syntax :annot)
  8. (defgeneric find-compile-function (object))
  9. (defmacro define-compile-struct (structure-name &rest defstruct-options)
  10. (flet ((symbolcat (&rest symbols)
  11. (intern (format nil "~{~A~^-~}" symbols) #.*package*)))
  12. (let ((compiled-name (symbolcat structure-name :compiled)))
  13. `(progn
  14. (defstruct (,compiled-name (:include ,structure-name ,@defstruct-options))
  15. (sql nil :type string)
  16. (bind nil :type proper-list))
  17. (defmethod find-compile-function ((object ,structure-name))
  18. (function ,(symbolcat :make compiled-name)))
  19. (defmethod print-object ((object ,compiled-name) stream)
  20. (format stream "#<SXQL-COMPILED: ~A [~{~A~^, ~}]>"
  21. (,(symbolcat compiled-name :sql) object)
  22. (,(symbolcat compiled-name :bind) object)))
  23. (defmethod yield ((object ,compiled-name))
  24. (values
  25. (,(symbolcat compiled-name :sql) object)
  26. (,(symbolcat compiled-name :bind) object)))))))
  27. (define-compile-struct sql-op (name ""))
  28. (define-compile-struct sql-clause)
  29. (define-compile-struct sql-statement)
  30. @export
  31. (defun sql-compile (object)
  32. (multiple-value-bind (sql bind) (yield object)
  33. (funcall
  34. (find-compile-function object)
  35. :sql sql
  36. :bind bind)))