changeset 109460:597339bd6bef

SQL Mode V2.2 - Added sql-connect and sql-connection-alist
author Michael Mauger <mmaug@yahoo.com>
date Sun, 18 Jul 2010 14:44:32 -0400
parents 301190722b84
children d898f8a84d48
files etc/NEWS lisp/ChangeLog lisp/progmodes/sql.el
diffstat 3 files changed, 327 insertions(+), 95 deletions(-) [+]
line wrap: on
line diff
--- a/etc/NEWS	Sun Jul 18 15:59:40 2010 +0200
+++ b/etc/NEWS	Sun Jul 18 14:44:32 2010 -0400
@@ -42,7 +42,7 @@
 This is only useful if your crt*.o files are in a non-standard location.
 
 ---
-** Emacs can be compiled against Gtk+ 3.0 if you pass --with-x-toolkit=gtk3 
+** Emacs can be compiled against Gtk+ 3.0 if you pass --with-x-toolkit=gtk3
 to configure.  Note that other libraries used by Emacs, RSVG and GConf,
 also depend on Gtk+.  You can disable them with --without-rsvg and
 --without-gconf.
@@ -256,9 +256,9 @@
 
 ** SQL Mode enhancements.
 
-*** Several variables have been marked as safe local variables.
-The variables `sql-product', `sql-user', `sql-server', and
-`sql-database' can now be safely used as local variables.
+*** Several variables have been marked as safe local variables.  The
+variables `sql-product', `sql-user', `sql-server', `sql-database' and
+`sql-port' can now be safely used as local variables.
 
 *** Added ability to login with a port on MySQL.
 The custom variable `sql-port' can be specified for connection to
@@ -269,15 +269,42 @@
 which is a list of the parameters to be prompted for before a
 connection is established.
 
+*** Added `sql-connection-alist' to record login parameter values.
+An alist for recording different username, database and server
+values.  If there are multiple databases that you connect to the
+parameters needed can be stored in this alist.
+
+For example, the following might be set in the user's init.el:
+
+  (setq sql-connection-alist
+        '((dev (sql-product 'sqlite)
+               (sql-database "/home/mmaug/dev.db"))
+          (prd (sql-product 'oracle)
+               (sql-user "mmaug")
+               (sql-database "iprd2a"))))
+
+This defines two connections named "dev" and "prd".
+
+*** Added `sql-connect' to use predefined connections.
+Sets the login parameters based on the values in the
+`sql-connection-alist' and start a SQL interactive session.  Any
+values specified in the connection will not be prompted for.
+
+In the example above, if the user were to invoke M-x sql-connect, they
+would be prompted for the connection.  The user can respond with
+either "dev" or "prd".  The "dev" connection would connect to the
+SQLite database without prompting; the "prd" connection would prompt
+for the users password and then connect to the Oracle database.
+
 *** Added option `sql-send-terminator'.
 When set makes sure that each command sent with `sql-send-*' commands
 are properly terminated and submitted to the SQL processor.
 
 *** Added option `sql-oracle-scan-on'.
 When set commands sent to Oracle's SQL*Plus are scanned for strings
-starting with an ampersand and the user is asked for replacement
-text.  In general, the SQL*Plus option SCAN should be set OFF under
-SQL interactive mode.
+starting with an ampersand and the user is asked for replacement text.
+In general, the SQL*Plus option SCAN should always be set OFF under
+SQL interactive mode and this option used in its place.
 
 *** SQL interactive mode will replace tabs with spaces.
 This prevents the comand interpretter for MySQL and Postgres from
--- a/lisp/ChangeLog	Sun Jul 18 15:59:40 2010 +0200
+++ b/lisp/ChangeLog	Sun Jul 18 14:44:32 2010 -0400
@@ -1,3 +1,34 @@
+2010-07-18  Michael R. Mauger  <mmaug@yahoo.com>
+
+	* progmodes/sql.el: Version 2.2.
+	(sql-product, sql-user, sql-database, sql-server, sql-port): Use
+	defcustom :safe keyword rather than putting safe-local-variable
+	property.
+	(sql-password): Use defcustom :risky keyword rather than putting
+	risky-local-variable property.
+	(sql-oracle-login-params, sql-sqlite-login-params)
+	(sql-solid-login-params, sql-sybase-login-params)
+	(sql-informix-login-params, sql-ingres-login-params)
+	(sql-ms-login-params, sql-postgres-login-params)
+	(sql-interbase-login-params, sql-db2-login-params)
+	(sql-linter-login-params): Add `port' option
+	(sql-get-product-feature): Added NO-INDIRECT parameter.
+	(sql-comint-oracle, sql-comint-sybase)
+	(sql-comint-informix, sql-comint-sqlite, sql-comint-mysql)
+	(sql-comint-solid, sql-comint-ingres, sql-comint-ms)
+	(sql-comint-postgres, sql-comint-interbase, sql-comint-db2)
+	(sql-comint-linter): Renamed sql-connect-* functions to
+	sql-comint-*.
+	(sql-product-alist, sql-mode-menu): Renamed as above and
+	:sqli-connect-func to :sqli-comint-func.
+	(sql-connection): New variable
+	(sql-interactive-mode): Set it.
+	(sql-connection-alist): New variable.
+	(sql-connect): New function.
+	(sql--alt-buffer-part, sql--alt-if-not-empty)
+	(sql-make-alternate-buffer-name): Improved alternative buffer
+	name.
+
 2010-07-17  Thierry Volpiatto  <thierry.volpiatto@gmail.com>
 
 	* image-mode.el (image-bookmark-make-record): Do not set context
--- a/lisp/progmodes/sql.el	Sun Jul 18 15:59:40 2010 +0200
+++ b/lisp/progmodes/sql.el	Sun Jul 18 14:44:32 2010 -0400
@@ -5,7 +5,7 @@
 
 ;; Author: Alex Schroeder <alex@gnu.org>
 ;; Maintainer: Michael Mauger <mmaug@yahoo.com>
-;; Version: 2.1
+;; Version: 2.2
 ;; Keywords: comm languages processes
 ;; URL: http://savannah.gnu.org/cgi-bin/viewcvs/emacs/emacs/lisp/progmodes/sql.el
 ;; URL: http://www.emacswiki.org/cgi-bin/wiki.pl?SqlMode
@@ -156,7 +156,8 @@
 ;;                        (const user)
 ;;                        (const password)
 ;;                        (const server)
-;;                        (const database)))
+;;                        (const database)
+;;                        (const port)))
 ;;       :group 'SQL)
 ;;
 ;;     (sql-set-product-feature 'xyz
@@ -170,7 +171,7 @@
 ;;     (sql-set-product-feature 'xyz
 ;;                              :sqli-options 'my-sql-xyz-options))
 
-;;     (defun my-sql-connect-xyz (product options)
+;;     (defun my-sql-comint-xyz (product options)
 ;;       "Connect ti XyzDB in a comint buffer."
 ;;
 ;;         ;; Do something with `sql-user', `sql-password',
@@ -184,10 +185,10 @@
 ;;               (setq params (append (list "-P" sql-password) params)))
 ;;           (if (not (string= "" sql-user))
 ;;               (setq params (append (list "-U" sql-user) params)))
-;;           (sql-connect product params)))
+;;           (sql-comint product params)))
 ;;
 ;;     (sql-set-product-feature 'xyz
-;;                              :sqli-connect-func 'my-sql-connect-xyz)
+;;                              :sqli-connect-func 'my-sql-comint-xyz)
 
 ;; 6) Define a convienence function to invoke the SQL interpreter.
 
@@ -235,6 +236,7 @@
 (eval-when-compile
   (require 'regexp-opt))
 (require 'custom)
+(require 'assoc)
 (eval-when-compile ;; needed in Emacs 19, 20
   (setq max-specpdl-size 2000))
 
@@ -255,8 +257,8 @@
 (defcustom sql-user ""
   "Default username."
   :type 'string
-  :group 'SQL)
-(put 'sql-user 'safe-local-variable 'stringp)
+  :group 'SQL
+  :safe 'stringp)
 
 (defcustom sql-password ""
   "Default password.
@@ -264,32 +266,36 @@
 Storing your password in a textfile such as ~/.emacs could be dangerous.
 Customizing your password will store it in your ~/.emacs file."
   :type 'string
-  :group 'SQL)
-(put 'sql-password 'risky-local-variable t)
+  :group 'SQL
+  :risky t)
 
 (defcustom sql-database ""
   "Default database."
   :type 'string
-  :group 'SQL)
-(put 'sql-database 'safe-local-variable 'stringp)
+  :group 'SQL
+  :safe 'stringp)
 
 (defcustom sql-server ""
   "Default server or host."
   :type 'string
-  :group 'SQL)
-(put 'sql-server 'safe-local-variable 'stringp)
+  :group 'SQL
+  :safe 'stringp)
 
 (defcustom sql-port nil
   "Default server or host."
+  :version "24.1"
   :type 'number
-  :group 'SQL)
-(put 'sql-port 'safe-local-variable 'numberp)
+  :group 'SQL
+  :safe 'numberp)
 
 ;; SQL Product support
 
 (defvar sql-interactive-product nil
   "Product under `sql-interactive-mode'.")
 
+(defvar sql-connection nil
+  "Connection name if interactive session started by `sql-connect'.")
+
 (defvar sql-product-alist
   '((ansi
      :name "ANSI"
@@ -301,7 +307,7 @@
      :sqli-program sql-db2-program
      :sqli-options sql-db2-options
      :sqli-login sql-db2-login-params
-     :sqli-connect-func sql-connect-db2
+     :sqli-comint-func sql-comint-db2
      :prompt-regexp "^db2 => "
      :prompt-length 7
      :input-filter sql-escape-newlines-filter)
@@ -312,7 +318,7 @@
      :sqli-program sql-informix-program
      :sqli-options sql-informix-options
      :sqli-login sql-informix-login-params
-     :sqli-connect-func sql-connect-informix
+     :sqli-comint-func sql-comint-informix
      :prompt-regexp "^> "
      :prompt-length 2
      :syntax-alist ((?{ . "<") (?} . ">")))
@@ -323,7 +329,7 @@
      :sqli-program sql-ingres-program
      :sqli-options sql-ingres-options
      :sqli-login sql-ingres-login-params
-     :sqli-connect-func sql-connect-ingres
+     :sqli-comint-func sql-comint-ingres
      :prompt-regexp "^\* "
      :prompt-length 2)
 
@@ -333,7 +339,7 @@
      :sqli-program sql-interbase-program
      :sqli-options sql-interbase-options
      :sqli-login sql-interbase-login-params
-     :sqli-connect-func sql-connect-interbase
+     :sqli-comint-func sql-comint-interbase
      :prompt-regexp "^SQL> "
      :prompt-length 5)
 
@@ -343,7 +349,7 @@
      :sqli-program sql-linter-program
      :sqli-options sql-linter-options
      :sqli-login sql-linter-login-params
-     :sqli-connect-func sql-connect-linter
+     :sqli-comint-func sql-comint-linter
      :prompt-regexp "^SQL>"
      :prompt-length 4)
 
@@ -353,7 +359,7 @@
      :sqli-program sql-ms-program
      :sqli-options sql-ms-options
      :sqli-login sql-ms-login-params
-     :sqli-connect-func sql-connect-ms
+     :sqli-comint-func sql-comint-ms
      :prompt-regexp "^[0-9]*>"
      :prompt-length 5
      :syntax-alist ((?@ . "w"))
@@ -366,7 +372,7 @@
      :sqli-program sql-mysql-program
      :sqli-options sql-mysql-options
      :sqli-login sql-mysql-login-params
-     :sqli-connect-func sql-connect-mysql
+     :sqli-comint-func sql-comint-mysql
      :prompt-regexp "^mysql> "
      :prompt-length 6
      :input-filter sql-remove-tabs-filter)
@@ -377,7 +383,7 @@
      :sqli-program sql-oracle-program
      :sqli-options sql-oracle-options
      :sqli-login sql-oracle-login-params
-     :sqli-connect-func sql-connect-oracle
+     :sqli-comint-func sql-comint-oracle
      :prompt-regexp "^SQL> "
      :prompt-length 5
      :syntax-alist ((?$ . "w") (?# . "w"))
@@ -391,7 +397,7 @@
      :sqli-program sql-postgres-program
      :sqli-options sql-postgres-options
      :sqli-login sql-postgres-login-params
-     :sqli-connect-func sql-connect-postgres
+     :sqli-comint-func sql-comint-postgres
      :prompt-regexp "^.*[#>] *"
      :prompt-length 5
      :input-filter sql-remove-tabs-filter
@@ -403,7 +409,7 @@
      :sqli-program sql-solid-program
      :sqli-options sql-solid-options
      :sqli-login sql-solid-login-params
-     :sqli-connect-func sql-connect-solid
+     :sqli-comint-func sql-comint-solid
      :prompt-regexp "^"
      :prompt-length 0)
 
@@ -414,7 +420,7 @@
      :sqli-program sql-sqlite-program
      :sqli-options sql-sqlite-options
      :sqli-login sql-sqlite-login-params
-     :sqli-connect-func sql-connect-sqlite
+     :sqli-comint-func sql-comint-sqlite
      :prompt-regexp "^sqlite> "
      :prompt-length 8)
 
@@ -424,7 +430,7 @@
      :sqli-program sql-sybase-program
      :sqli-options sql-sybase-options
      :sqli-login sql-sybase-login-params
-     :sqli-connect-func sql-connect-sybase
+     :sqli-comint-func sql-comint-sybase
      :prompt-regexp "^SQL> "
      :prompt-length 5
      :syntax-alist ((?@ . "w"))
@@ -463,7 +469,7 @@
                         database and server) needed to connect to
                         the database.
 
- :sqli-connect-func     name of a function which accepts no
+ :sqli-comint-func      name of a function which accepts no
                         parameters that will use the values of
                         `sql-user', `sql-password',
                         `sql-database' and `sql-server' to open a
@@ -508,6 +514,51 @@
   '(:font-lock :sqli-program :sqli-options :sqli-login))
 
 ;;;###autoload
+(defcustom sql-connection-alist nil
+  "An alist of connection parameters for interacting with a SQL
+  product.
+
+Each element of the alist is as follows:
+
+  \(CONNECTION \(SQL-VARIABLE VALUE) ...)
+
+Where CONNECTION is a symbol identifying the connection, SQL-VARIABLE
+is the symbol name of a SQL mode variable, and VALUE is the value to
+be assigned to the variable.
+
+The most common SQL-VARIABLE settings associated with a connection
+are:
+
+  `sql-product'
+  `sql-user'
+  `sql-password'
+  `sql-port'
+  `sql-server'
+  `sql-database'
+
+If a SQL-VARIABLE is part of the connection, it will not be
+prompted for during login."
+
+  :type `(alist :key-type (symbol :tag "Connection")
+                :value-type
+                (set
+                 (group (const :tag "Product"  sql-product)
+                        (choice
+                         ,@(mapcar (lambda (prod-info)
+                                     `(const :tag
+                                             ,(or (plist-get (cdr prod-info) :name)
+                                                  (capitalize (symbol-name (car prod-info))))
+                                             (quote ,(car prod-info))))
+                                   sql-product-alist)))
+                 (group (const :tag "Username" sql-user)     string)
+                 (group (const :tag "Password" sql-password) string)
+                 (group (const :tag "Server"   sql-server)   string)
+                 (group (const :tag "Database" sql-database) string)
+                 (group (const :tag "Port"     sql-port)     integer)))
+  :version "24.1"
+  :group 'SQL)
+
+;;;###autoload
 (defcustom sql-product 'ansi
   "Select the SQL database product used so that buffers can be
 highlighted properly when you open them."
@@ -518,11 +569,8 @@
                                    (capitalize (symbol-name (car prod-info))))
                               ,(car prod-info)))
                     sql-product-alist))
-  :group 'SQL)
-(put 'sql-product 'safe-local-variable 'symbolp)
-
-(defvar sql-interactive-product nil
-  "Product under `sql-interactive-mode'.")
+  :group 'SQL
+  :safe 'symbolp)
 
 ;; misc customization of sql.el behaviour
 
@@ -681,7 +729,8 @@
 		  (const user)
 		  (const password)
 		  (const server)
-		  (const database)))
+		  (const database)
+                  (const port)))
   :version "24.1"
   :group 'SQL)
 
@@ -721,7 +770,8 @@
 		  (const user)
 		  (const password)
 		  (const server)
-		  (const database)))
+		  (const database)
+                  (const port)))
   :version "24.1"
   :group 'SQL)
 
@@ -768,7 +818,8 @@
 		  (const user)
 		  (const password)
 		  (const server)
-		  (const database)))
+		  (const database)
+                  (const port)))
   :version "24.1"
   :group 'SQL)
 
@@ -794,7 +845,8 @@
 		  (const user)
 		  (const password)
 		  (const server)
-		  (const database)))
+		  (const database)
+                  (const port)))
   :version "24.1"
   :group 'SQL)
 
@@ -813,7 +865,8 @@
 		  (const user)
 		  (const password)
 		  (const server)
-		  (const database)))
+		  (const database)
+                  (const port)))
   :version "24.1"
   :group 'SQL)
 
@@ -832,7 +885,8 @@
 		  (const user)
 		  (const password)
 		  (const server)
-		  (const database)))
+		  (const database)
+                  (const port)))
   :version "24.1"
   :group 'SQL)
 
@@ -858,7 +912,8 @@
 		  (const user)
 		  (const password)
 		  (const server)
-		  (const database)))
+		  (const database)
+                  (const port)))
   :version "24.1"
   :group 'SQL)
 
@@ -889,7 +944,8 @@
 		  (const user)
 		  (const password)
 		  (const server)
-		  (const database)))
+		  (const database)
+                  (const port)))
   :version "24.1"
   :group 'SQL)
 
@@ -914,7 +970,8 @@
 		  (const user)
 		  (const password)
 		  (const server)
-		  (const database)))
+		  (const database)
+                  (const port)))
   :version "24.1"
   :group 'SQL)
 
@@ -939,7 +996,8 @@
 		  (const user)
 		  (const password)
 		  (const server)
-		  (const database)))
+		  (const database)
+                  (const port)))
   :version "24.1"
   :group 'SQL)
 
@@ -964,7 +1022,8 @@
 		  (const user)
 		  (const password)
 		  (const server)
-		  (const database)))
+		  (const database)
+                  (const port)))
   :version "24.1"
   :group 'SQL)
 
@@ -1057,7 +1116,7 @@
    ["Send String" sql-send-string (and (buffer-live-p sql-buffer)
 				       (get-buffer-process sql-buffer))]
    ["--" nil nil]
-   ["Start SQLi session" sql-product-interactive (sql-get-product-feature sql-product :sqli-connect-func)]
+   ["Start SQLi session" sql-product-interactive (sql-get-product-feature sql-product :sqli-comint-func)]
    ["Show SQLi buffer" sql-show-sqli-buffer t]
    ["Set SQLi buffer" sql-set-sqli-buffer t]
    ["Pop to SQLi buffer after send"
@@ -2016,13 +2075,17 @@
           (setcdr p (plist-put (cdr p) feature newvalue)))
       (message "`%s' is not a known product; use `sql-add-product' to add it first." product))))
 
-(defun sql-get-product-feature (product feature &optional fallback)
+(defun sql-get-product-feature (product feature &optional fallback not-indirect)
   "Lookup FEATURE associated with a SQL PRODUCT.
 
 If the FEATURE is nil for PRODUCT, and FALLBACK is specified,
 then the FEATURE associated with the FALLBACK product is
 returned.
 
+If the FEATURE is in the list `sql-indirect-features', and the
+NOT-INDIRECT parameter is not set, then the value of the symbol
+stored in the connect alist is returned.
+
 See `sql-product-alist' for a list of products and supported features."
   (let* ((p (assoc product sql-product-alist))
          (v (plist-get (cdr p) feature)))
@@ -2036,6 +2099,7 @@
 
           (if (and
                (member feature sql-indirect-features)
+               (not not-indirect)
                (symbolp v))
               (symbol-value v)
             v))
@@ -2329,6 +2393,7 @@
       (setq sql-database
 	    (read-from-minibuffer "Database: " sql-database nil nil
 				  'sql-database-history))))
+
     (setq what (cdr what))))
 
 (defun sql-find-sqli-buffer ()
@@ -2415,21 +2480,62 @@
 	(message "Buffer %s has no process." (buffer-name sql-buffer))
       (message "Current SQLi buffer is %s." (buffer-name sql-buffer)))))
 
+(defun sql--alt-buffer-part (delim part)
+  (unless (string= "" part)
+    (list delim part)))
+
+(defun sql--alt-if-not-empty (s)
+  (if (string= "" s) nil s))
+
 (defun sql-make-alternate-buffer-name ()
   "Return a string that can be used to rename a SQLi buffer.
 
 This is used to set `sql-alternate-buffer-name' within
-`sql-interactive-mode'."
-  (concat (if (string= "" sql-user)
-	      (if (string= "" (user-login-name))
-		  ()
-		(concat (user-login-name) "/"))
-	    (concat sql-user "/"))
-	  (if (string= "" sql-database)
-	      (if (string= "" sql-server)
-		  (system-name)
-		sql-server)
-	    sql-database)))
+`sql-interactive-mode'.
+
+If the session was started with `sql-connect' then the alternate
+name would be the name of the connection.
+
+Otherwise, it uses the parameters identified by the :sqlilogin
+parameter.
+
+If all else fails, the alternate name would be the user and
+server/database name."
+
+  (or
+   ;; If started by sql-connect, use that
+   (sql--alt-if-not-empty
+    (when sql-connection (symbol-name sql-connection)))
+
+   ;; based on :sqli-login setting
+   (sql--alt-if-not-empty
+    (apply 'concat
+           (cdr
+            (apply 'append nil
+                   (mapcar
+                    (lambda (v)
+                      (cond
+                       ((eq v 'user)     (sql--alt-buffer-part "/" sql-user))
+                       ((eq v 'server)   (sql--alt-buffer-part "@" sql-server))
+                       ((eq v 'database) (sql--alt-buffer-part "@" sql-database))
+                       ((eq v 'port)     (sql--alt-buffer-part ":" sql-port))
+
+                       ((eq v 'password) nil)
+                       (t                nil)))
+                    (sql-get-product-feature sql-product :sqli-login))))))
+
+   ;; Default: username/server format
+   (sql--alt-if-not-empty
+    (concat (if (string= "" sql-user)
+                (if (string= "" (user-login-name))
+                    ()
+                  (concat (user-login-name) "/"))
+              (concat sql-user "/"))
+            (if (string= "" sql-database)
+                (if (string= "" sql-server)
+                    (system-name)
+                  sql-server)
+              sql-database)))))
 
 (defun sql-rename-buffer ()
   "Rename a SQLi buffer."
@@ -2788,6 +2894,8 @@
   (setq abbrev-all-caps 1)
   ;; Exiting the process will call sql-stop.
   (set-process-sentinel (get-buffer-process sql-buffer) 'sql-stop)
+  ;; Save the connection name
+  (make-local-variable 'sql-connection)
   ;; Create a usefull name for renaming this buffer later.
   (make-local-variable 'sql-alternate-buffer-name)
   (setq sql-alternate-buffer-name (sql-make-alternate-buffer-name))
@@ -2854,7 +2962,7 @@
          ((symbolp product) product)    ; Product specified
          (t sql-product)))              ; Default to sql-product
 
-  (when (sql-get-product-feature product :sqli-connect-func)
+  (when (sql-get-product-feature product :sqli-comint-func)
     (if (and sql-buffer
              (buffer-live-p sql-buffer)
 	     (comint-check-proc sql-buffer))
@@ -2882,7 +2990,7 @@
 
 	;; Connect to database.
 	(message "Login...")
-	(funcall (sql-get-product-feature product :sqli-connect-func)
+	(funcall (sql-get-product-feature product :sqli-comint-func)
                  product
                  (sql-get-product-feature product :sqli-options))
 
@@ -2901,16 +3009,82 @@
 	(message "Login...done")
 	(pop-to-buffer sql-buffer)))))
 
-(defun sql-connect (product params)
-  "Set up a comint buffer to connect to the SQL processor.
+(defun sql-comint (product params)
+  "Set up a comint buffer to run the SQL processor.
 
 PRODUCT is the SQL product.  PARAMS is a list of strings which are
 passed as command line arguments."
   (let ((program (sql-get-product-feature product :sqli-program)))
     (set-buffer
-     (if params
-         (apply 'make-comint "SQL" program nil params)
-       (make-comint "SQL" program nil)))))
+     (apply 'make-comint "SQL" program nil params))))
+
+;;;###autoload
+(defun sql-connect (connection)
+  "Connect to an interactive session using CONNECTION settings.
+
+See `sql-connection-alist' to see how to define connections and
+their settings.
+
+The user will not be prompted for any login parameters if a value
+is specified in the connection settings."
+
+  ;; Prompt for the connection from those defined in the alist
+  (interactive
+   (if sql-connection-alist
+       (list
+        (intern
+         (completing-read "Connection: "
+                          (mapcar (lambda (c) (symbol-name (car c)))
+                                  sql-connection-alist)
+                          nil t)))
+     nil))
+
+  ;; Are there connections defined
+  (if sql-connection-alist
+      ;; Was one selected
+      (when connection
+        ;; Get connection settings
+        (let ((connect-set  (aget sql-connection-alist connection)))
+          ;; Settings are defined
+          (if connect-set
+              ;; Set the desired parameters
+              (eval `(let*
+                         (,@connect-set
+                          ;; :sqli-login params variable
+                          (param-var    (sql-get-product-feature sql-product
+                                                                 :sqli-login nil t))
+                          ;; :sqli-login params value
+                          (login-params (sql-get-product-feature sql-product
+                                                                 :sqli-login))
+                          ;; which params are in the connection
+                          (set-params   (mapcar
+                                         (lambda (v)
+                                           (cond
+                                            ((eq (car v) 'sql-user)     'user)
+                                            ((eq (car v) 'sql-password) 'password)
+                                            ((eq (car v) 'sql-server)   'server)
+                                            ((eq (car v) 'sql-database) 'database)
+                                            ((eq (car v) 'sql-port)     'port)
+                                            (t                          (car v))))
+                                         connect-set))
+                          ;; the remaining params (w/o the connection params)
+                          (rem-params   (apply 'append nil
+                                               (mapcar
+                                                (lambda (l)
+                                                  (unless (member l set-params)
+                                                    (list l)))
+                                                login-params)))
+                          ;; Remember the connection
+                          (sql-connection connection))
+
+                       ;; Set the remaining parameters and start the
+                       ;; interactive session
+                       (eval `(let ((,param-var ',rem-params))
+                                (sql-product-interactive sql-product)))))
+            (message "SQL Connection \"%s\" does not exist" connection)
+            nil)))
+    (message "No SQL Connections defined")
+    nil))
 
 ;;;###autoload
 (defun sql-oracle ()
@@ -2939,7 +3113,7 @@
   (interactive)
   (sql-product-interactive 'oracle))
 
-(defun sql-connect-oracle (product options)
+(defun sql-comint-oracle (product options)
   "Create comint buffer and connect to Oracle."
   ;; Produce user/password@database construct.  Password without user
   ;; is meaningless; database without user/password is meaningless,
@@ -2955,7 +3129,7 @@
     (if parameter
 	(setq parameter (nconc (list parameter) options))
       (setq parameter options))
-    (sql-connect product parameter)))
+    (sql-comint product parameter)))
 
 
 
@@ -2986,7 +3160,7 @@
   (interactive)
   (sql-product-interactive 'sybase))
 
-(defun sql-connect-sybase (product options)
+(defun sql-comint-sybase (product options)
   "Create comint buffer and connect to Sybase."
   ;; Put all parameters to the program (if defined) in a list and call
   ;; make-comint.
@@ -2999,7 +3173,7 @@
 	(setq params (append (list "-P" sql-password) params)))
     (if (not (string= "" sql-user))
 	(setq params (append (list "-U" sql-user) params)))
-    (sql-connect product params)))
+    (sql-comint product params)))
 
 
 
@@ -3028,7 +3202,7 @@
   (interactive)
   (sql-product-interactive 'informix))
 
-(defun sql-connect-informix (product options)
+(defun sql-comint-informix (product options)
   "Create comint buffer and connect to Informix."
   ;; username and password are ignored.
   (let ((db (if (string= "" sql-database)
@@ -3036,7 +3210,7 @@
 	      (if (string= "" sql-server)
 		  sql-database
 		(concat sql-database "@" sql-server)))))
-    (sql-connect product (append `(,db "-") options))))
+    (sql-comint product (append `(,db "-") options))))
 
 
 
@@ -3069,7 +3243,7 @@
   (interactive)
   (sql-product-interactive 'sqlite))
 
-(defun sql-connect-sqlite (product options)
+(defun sql-comint-sqlite (product options)
   "Create comint buffer and connect to SQLite."
   ;; Put all parameters to the program (if defined) in a list and call
   ;; make-comint.
@@ -3077,7 +3251,7 @@
     (if (not (string= "" sql-database))
 	(setq params (append (list sql-database) params)))
     (setq params (append options params))
-    (sql-connect product params)))
+    (sql-comint product params)))
 
 
 
@@ -3110,7 +3284,7 @@
   (interactive)
   (sql-product-interactive 'mysql))
 
-(defun sql-connect-mysql (product options)
+(defun sql-comint-mysql (product options)
   "Create comint buffer and connect to MySQL."
   ;; Put all parameters to the program (if defined) in a list and call
   ;; make-comint.
@@ -3126,7 +3300,7 @@
     (if (not (string= "" sql-user))
 	(setq params (append (list (concat "--user=" sql-user)) params)))
     (setq params (append options params))
-    (sql-connect product params)))
+    (sql-comint product params)))
 
 
 
@@ -3156,7 +3330,7 @@
   (interactive)
   (sql-product-interactive 'solid))
 
-(defun sql-connect-solid (product options)
+(defun sql-comint-solid (product options)
   "Create comint buffer and connect to Solid."
   ;; Put all parameters to the program (if defined) in a list and call
   ;; make-comint.
@@ -3167,7 +3341,7 @@
 	(setq params (append (list sql-user sql-password) params)))
     (if (not (string= "" sql-server))
 	(setq params (append (list sql-server) params)))
-    (sql-connect product params)))
+    (sql-comint product params)))
 
 
 
@@ -3196,10 +3370,10 @@
   (interactive)
   (sql-product-interactive 'ingres))
 
-(defun sql-connect-ingres (product options)
+(defun sql-comint-ingres (product options)
   "Create comint buffer and connect to Ingres."
   ;; username and password are ignored.
-  (sql-connect product
+  (sql-comint product
                (append (if (string= "" sql-database)
                            nil
                          (list sql-database))
@@ -3234,7 +3408,7 @@
   (interactive)
   (sql-product-interactive 'ms))
 
-(defun sql-connect-ms (product options)
+(defun sql-comint-ms (product options)
   "Create comint buffer and connect to Microsoft SQL Server."
   ;; Put all parameters to the program (if defined) in a list and call
   ;; make-comint.
@@ -3254,7 +3428,7 @@
 	;; If -P is passed to ISQL as the last argument without a
 	;; password, it's considered null.
 	(setq params (append params (list "-P")))))
-    (sql-connect product params)))
+    (sql-comint product params)))
 
 
 
@@ -3290,7 +3464,7 @@
   (interactive)
   (sql-product-interactive 'postgres))
 
-(defun sql-connect-postgres (product options)
+(defun sql-comint-postgres (product options)
   "Create comint buffer and connect to Postgres."
   ;; username and password are ignored.  Mark Stosberg suggest to add
   ;; the database at the end.  Jason Beegan suggest using --pset and
@@ -3304,7 +3478,7 @@
 	(setq params (append (list "-h" sql-server) params)))
     (if (not (string= "" sql-user))
 	(setq params (append (list "-U" sql-user) params)))
-    (sql-connect product params)))
+    (sql-comint product params)))
 
 
 
@@ -3334,7 +3508,7 @@
   (interactive)
   (sql-product-interactive 'interbase))
 
-(defun sql-connect-interbase (product options)
+(defun sql-comint-interbase (product options)
   "Create comint buffer and connect to Interbase."
   ;; Put all parameters to the program (if defined) in a list and call
   ;; make-comint.
@@ -3345,7 +3519,7 @@
 	(setq params (append (list "-p" sql-password) params)))
     (if (not (string= "" sql-database))
         (setq params (cons sql-database params))) ; add to the front!
-    (sql-connect product params)))
+    (sql-comint product params)))
 
 
 
@@ -3379,11 +3553,11 @@
   (interactive)
   (sql-product-interactive 'db2))
 
-(defun sql-connect-db2 (product options)
+(defun sql-comint-db2 (product options)
   "Create comint buffer and connect to DB2."
   ;; Put all parameters to the program (if defined) in a list and call
   ;; make-comint.
-  (sql-connect product options)
+  (sql-comint product options)
 )
 ;;   ;; Properly escape newlines when DB2 is interactive.
 ;;   (setq comint-input-sender 'sql-escape-newlines-and-send))
@@ -3415,7 +3589,7 @@
   (interactive)
   (sql-product-interactive 'linter))
 
-(defun sql-connect-linter (product options)
+(defun sql-comint-linter (product options)
   "Create comint buffer and connect to Linter."
   ;; Put all parameters to the program (if defined) in a list and call
   ;; make-comint.
@@ -3430,7 +3604,7 @@
     (if (string= "" sql-database)
 	(setenv "LINTER_MBX" nil)
       (setenv "LINTER_MBX" sql-database))
-    (sql-connect product params)
+    (sql-comint product params)
     (setenv "LINTER_MBX" old-mbx)))