tvl-depot/sql-strings.el

76 lines
2.4 KiB
EmacsLisp
Raw Normal View History

;;; ~/.doom.d/sql-strings.el -*- lexical-binding: t; -*-
;;; https://www.emacswiki.org/emacs/StringAtPoint
(defun ourcomments-string-or-comment-bounds-1 (what)
(save-restriction
(widen)
(let* ((here (point))
;; Fix-me: when on end-point, how to handle that and which should be last hit point?
(state (parse-partial-sexp (point-min) (1+ here)))
(type (if (nth 3 state)
'string
(if (nth 4 state)
'comment)))
(start (when type (nth 8 state)))
end)
(unless start
(setq state (parse-partial-sexp (point-min) here))
(setq type (if (nth 3 state)
'string
(if (nth 4 state)
'comment)))
(setq start (when type (nth 8 state))))
(unless (or (not what)
(eq what type))
(setq start nil))
(if (not start)
(progn
(goto-char here)
nil)
(setq state (parse-partial-sexp (1+ start) (point-max)
nil nil state 'syntax-table))
(setq end (point))
(goto-char here)
(cons start end)))))
(defun ourcomments-bounds-of-string-at-point ()
"Return bounds of string at point if any."
(ourcomments-string-or-comment-bounds-1 'string))
(put 'string 'bounds-of-thing-at-point 'ourcomments-bounds-of-string-at-point)
(defun -sanitize-sql-string (str)
(->> str
(downcase)
(s-trim)
(replace-regexp-in-string
(rx (or (and string-start (or "\"\"\""
"\""))
(and (or "\"\"\""
"\"")
string-end)))
"")
(s-trim)))
(defun sql-string-p (str)
"Returns 't if STR looks like a string literal for a SQL statement"
(setq str (-sanitize-sql-string str))
(or (s-starts-with? "select" str)))
;;; tests
(require 'ert)
(ert-deftest sanitize-sql-string-test ()
(should (string-equal "select * from foo;"
(-sanitize-sql-string
"\"\"\"SELECT * FROM foo;\n\n\"\"\""))))
(ert-deftest test-sql-string-p ()
(dolist (str '("SELECT * FROM foo;"
"select * from foo;"))
(should (sql-string-p str)))
(dolist (str '("not a QUERY"))
(should-not (sql-string-p str))))