# HG changeset patch # User Gerd Moellmann # Date 987760994 0 # Node ID 9781f3a3c955b0b7d3a5f38d69b2dd050c7fa2b1 # Parent 33067598c22c9d9755cb07449ed7d99596c262a7 (sql-escape-newlines-and-send): New function. (sql-db2): Set comint-input-sender to sql-escape-newlines-and-send. (sql-db2-program): New option. (sql-db2-options): New option. (sql-db2): New function. (sql-mode-menu): Added highlighting entries. (sql-highlight-oracle-keywords): New function. (sql-highlight-postgres-keywords): New function. (sql-highlight-ansi-keywords): New function. (sql-help): Doc change. diff -r 33067598c22c -r 9781f3a3c955 lisp/progmodes/sql.el --- a/lisp/progmodes/sql.el Thu Apr 19 22:55:19 2001 +0000 +++ b/lisp/progmodes/sql.el Fri Apr 20 10:03:14 2001 +0000 @@ -4,7 +4,7 @@ ;; Author: Alex Schroeder ;; Maintainer: Alex Schroeder -;; Version: 1.5.0 +;; Version: 1.6.1 ;; Keywords: comm languages processes ;; This file is part of GNU Emacs. @@ -381,6 +381,23 @@ :version "20.8" :group 'SQL) +;; Customization for DB2 + +(defcustom sql-db2-program "db2" + "*Command to start db2 by IBM. + +Starts `sql-interactive-mode' after doing some setup. + +The program can also specify a TCP connection. See `make-comint'." + :type 'file + :group 'SQL) + +(defcustom sql-db2-options nil + "*List of additional options for `sql-db2-program'." + :type '(repeat string) + :version "20.8" + :group 'SQL) + ;;; Variables which do not need customization @@ -468,7 +485,11 @@ ["Pop to SQLi buffer after send" sql-toggle-pop-to-buffer-after-send-region :style toggle - :selected sql-pop-to-buffer-after-send-region])) + :selected sql-pop-to-buffer-after-send-region] + ("Highlighting" + ["ANSI SQL keywords" sql-highlight-ansi-keywords t] + ["Oracle keywords" sql-highlight-oracle-keywords t] + ["Postgres keywords" sql-highlight-postgres-keywords t]))) ;; easy menu for sql-interactive-mode. @@ -697,6 +718,31 @@ +;;; Functions to switch highlighting + +(defun sql-highlight-oracle-keywords () + "Highlight Oracle keywords. +Basically, this just sets `font-lock-keywords' appropriately." + (interactive) + (setq font-lock-keywords sql-mode-oracle-font-lock-keywords) + (font-lock-fontify-buffer)) + +(defun sql-highlight-postgres-keywords () + "Highlight Postgres keywords. +Basically, this just sets `font-lock-keywords' appropriately." + (interactive) + (setq font-lock-keywords sql-mode-postgres-font-lock-keywords) + (font-lock-fontify-buffer)) + +(defun sql-highlight-ansi-keywords () + "Highlight ANSI SQL keywords. +Basically, this just sets `font-lock-keywords' appropriately." + (interactive) + (setq font-lock-keywords sql-mode-ansi-font-lock-keywords) + (font-lock-fontify-buffer)) + + + ;;; Compatibility functions (if (not (fboundp 'comint-line-beginning-position)) @@ -758,6 +804,7 @@ Sybase: \\[sql-sybase] Ingres: \\[sql-ingres] Microsoft: \\[sql-ms] + Interbase: \\[sql-interbase] But we urge you to choose a free implementation instead of these. @@ -979,6 +1026,24 @@ (comint-send-string proc string) (comint-send-string proc "\n")) +;; Using DB2 interactively, newlines must be escaped with " \". +;; The space before the backslash is relevant. +(defun sql-escape-newlines-and-send (proc string) + "Send to PROC input STRING, escaping newlines if necessary. +Every newline in STRING will be preceded with a space and a backslash." + (let ((result "") (start 0) mb me) + (while (string-match "\n" string start) + (setq mb (match-beginning 0) + me (match-end 0)) + (if (and (> mb 1) + (string-equal " \\" (substring string (- mb 2) mb))) + (setq result (concat result (substring string start me))) + (setq result (concat result (substring string start mb) " \\\n"))) + (setq start me)) + (setq result (concat result (substring string start))) + (comint-send-string proc result) + (comint-send-string proc "\n"))) + ;;; Sending the region to the SQLi buffer. @@ -1275,7 +1340,9 @@ ;; calling sql-interactive-mode. (setq sql-mode-font-lock-keywords sql-mode-oracle-font-lock-keywords) (sql-interactive-mode) - ;; If running on NT, make sure we do placeholder replacement ourselves. + ;; If running on NT, make sure we do placeholder replacement + ;; ourselves. This must come after sql-interactive-mode because all + ;; local variables will be killed, there. (if (eq window-system 'w32) (setq comint-input-sender 'sql-query-placeholders-and-send)) (message "Login...done") @@ -1677,6 +1744,56 @@ (message "Login...done") (pop-to-buffer sql-buffer))) + + +;;;###autoload +(defun sql-db2 () + "Run db2 by IBM as an inferior process. + +If buffer `*SQL*' exists but no process is running, make a new process. +If buffer exists and a process is running, just switch to buffer +`*SQL*'. + +Interpreter used comes from variable `sql-db2-program'. There is not +automatic login. + +The buffer is put in sql-interactive-mode, giving commands for sending +input. See `sql-interactive-mode'. + +If you use \\[sql-accumulate-and-indent] to send multiline commands to db2, +newlines will be escaped if necessary. If you don't want that, use + +set `comint-input-sender' back to `comint-simple-send'. +comint-input-sender's value is +comint-simple-send + + +To specify a coding system for converting non-ASCII characters +in the input and output to the process, use \\[universal-coding-system-argument] +before \\[sql-db2]. You can also specify this with \\[set-buffer-process-coding-system] +in the SQL buffer, after you start the process. +The default comes from `process-coding-system-alist' and +`default-process-coding-system'. + +\(Type \\[describe-mode] in the SQL buffer for a list of commands.)" + (interactive) + (if (comint-check-proc "*SQL*") + (pop-to-buffer "*SQL*") + (message "Login...") + ;; Put all parameters to the program (if defined) in a list and call + ;; make-comint. + (set-buffer (apply 'make-comint "SQL" sql-db2-program + nil sql-db2-options)) + (setq sql-prompt-regexp "^db2 => ") + (setq sql-prompt-length 7) + (setq sql-buffer (current-buffer)) + (sql-interactive-mode) + ;; Escape newlines. This must come after sql-interactive-mode + ;; because all local variables will be killed, there. + (setq comint-input-sender 'sql-escape-newlines-and-send) + (message "Login...done") + (pop-to-buffer sql-buffer))) + (provide 'sql) ;;; sql.el ends here