]> git.bundesbrandschatzamt.de Git - emacsconfig.git/commitdiff
add sql-complete
authorAndreas Gerler <baronNOSPAMbundesbrandschatzamt.de>
Thu, 11 May 2023 16:23:36 +0000 (18:23 +0200)
committerAndreas Gerler <baronNOSPAMbundesbrandschatzamt.de>
Thu, 11 May 2023 16:23:36 +0000 (18:23 +0200)
Signed-off-by: Andreas Gerler <baronNOSPAMbundesbrandschatzamt.de>
lisp/sql-complete.el [new file with mode: 0644]

diff --git a/lisp/sql-complete.el b/lisp/sql-complete.el
new file mode 100644 (file)
index 0000000..efb2f5d
--- /dev/null
@@ -0,0 +1,105 @@
+;;; sql-complete.el --- provide completion for tables and columns
+
+;; Copyright (C) 2001  Free Software Foundation, Inc.
+
+;; Author: Alex Schroeder <alexNOSPAMgnu.org>
+;; Maintainer: Alex Schroeder <alexNOSPAMgnu.org>
+;; Version: 0.0.1
+;; Keywords: comm languages processes
+
+;; This file is NOT part of GNU Emacs.
+
+;; This is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; This is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;; Trying to provide a framework for completion that will eventually
+;; make it into sql.el.
+
+ 
+
+;;; Code:
+
+(require 'sql)
+
+(defcustom sql-oracle-data-dictionary
+  "select '(\"'||table_name||'\" \"'||column_name||'\")'
+   from user_tab_columns 
+   order by table_name;"
+  "SQL Statement to determine all tables and columns."
+  :group 'SQL
+  :type 'string)
+
+;; backends
+
+(defun sql-data-dictionary (statement)
+  "Return table and columns from the Oracle Data Dictionary using SQL.
+STATEMENT must be a SQL statement that returns the data dictionary
+one column per line.  Each line must look like this:
+
+\(\"table-name\" \"column-name\")
+
+Any lines not looking like this will be skipped to allow for column
+headers and other fancy markup.
+
+This currently depends very much on a good `comint-prompt-regexp'."
+  (when (null sql-buffer)
+    (error "No SQLi buffer available"))
+  (save-excursion
+    ;;(set-buffer sql-buffer)
+    (let (result end)
+      (comint-simple-send sql-buffer statement)
+      (comint-previous-prompt 1)
+      (while (= 0 (forward-line 1))
+       (message "%S" (point))
+       (when (looking-at "^(.*)$")
+         (let* ((entry (car (read-from-string (match-string 0))))
+                (table (car entry))
+                (column (cadr entry))
+                (item (cdr (assoc table result))))
+           (if item
+               (nconc item (list column))
+             (setq result (append (list entry) result))))))
+      result)))
+
+;; framework
+
+(defvar sql-data-dictionary nil
+  "The data dictionary to use for completion.
+Each element of the list has the form
+\(TABLE COLUMN1 COLUMN2 ...)")
+
+(defun sql-oracle-data-dictionary ()
+  (interactive)
+  ;; FIXME No cleanup
+  (setq sql-data-dictionary
+       (sql-data-dictionary sql-oracle-data-dictionary)))
+
+(defun sql-complete ()
+  (interactive)
+  (let ((completions (apply 'append sql-data-dictionary)))
+    (comint-dynamic-simple-complete 
+     (comint-word "A-Za-z_")
+     completions)))
+
+(defun sql-complete-table ()
+  (interactive)
+  (let ((completions (mapcar 'car sql-data-dictionary)))
+    (comint-dynamic-simple-complete 
+     (comint-word "A-Za-z_")
+     completions)))
+
+;;; sql-complete.el ends here