75 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			EmacsLisp
		
	
	
	
	
	
			
		
		
	
	
			75 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			EmacsLisp
		
	
	
	
	
	
| ;;; ~/.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))))
 |