diff options
| author | Rasmus | 2017-06-21 13:20:20 +0200 |
|---|---|---|
| committer | Rasmus | 2017-06-22 11:54:18 +0200 |
| commit | 5cecd275820df825c51bf9a27fcc7e35f30ff273 (patch) | |
| tree | b3f72e63953613d565e6d5a35bec97f158eb603c /lisp/org/ob-sql.el | |
| parent | 386a3da920482b8cb3e962fb944d135c8a770e26 (diff) | |
| download | emacs-5cecd275820df825c51bf9a27fcc7e35f30ff273.tar.gz emacs-5cecd275820df825c51bf9a27fcc7e35f30ff273.zip | |
Update Org to v9.0.9
Please see etc/ORG-NEWS for details.
Diffstat (limited to 'lisp/org/ob-sql.el')
| -rw-r--r-- | lisp/org/ob-sql.el | 205 |
1 files changed, 138 insertions, 67 deletions
diff --git a/lisp/org/ob-sql.el b/lisp/org/ob-sql.el index 17775829cba..06477d38469 100644 --- a/lisp/org/ob-sql.el +++ b/lisp/org/ob-sql.el | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | ;;; ob-sql.el --- org-babel functions for sql evaluation | 1 | ;;; ob-sql.el --- Babel Functions for SQL -*- lexical-binding: t; -*- |
| 2 | 2 | ||
| 3 | ;; Copyright (C) 2009-2017 Free Software Foundation, Inc. | 3 | ;; Copyright (C) 2009-2017 Free Software Foundation, Inc. |
| 4 | 4 | ||
| @@ -36,6 +36,7 @@ | |||
| 36 | ;; - engine | 36 | ;; - engine |
| 37 | ;; - cmdline | 37 | ;; - cmdline |
| 38 | ;; - dbhost | 38 | ;; - dbhost |
| 39 | ;; - dbport | ||
| 39 | ;; - dbuser | 40 | ;; - dbuser |
| 40 | ;; - dbpassword | 41 | ;; - dbpassword |
| 41 | ;; - database | 42 | ;; - database |
| @@ -56,11 +57,11 @@ | |||
| 56 | 57 | ||
| 57 | ;;; Code: | 58 | ;;; Code: |
| 58 | (require 'ob) | 59 | (require 'ob) |
| 59 | (eval-when-compile (require 'cl)) | ||
| 60 | 60 | ||
| 61 | (declare-function org-table-import "org-table" (file arg)) | 61 | (declare-function org-table-import "org-table" (file arg)) |
| 62 | (declare-function orgtbl-to-csv "org-table" (table params)) | 62 | (declare-function orgtbl-to-csv "org-table" (table params)) |
| 63 | (declare-function org-table-to-lisp "org-table" (&optional txt)) | 63 | (declare-function org-table-to-lisp "org-table" (&optional txt)) |
| 64 | (declare-function cygwin-convert-file-name-to-windows "cygw32.c" (file &optional absolute-p)) | ||
| 64 | 65 | ||
| 65 | (defvar org-babel-default-header-args:sql '()) | 66 | (defvar org-babel-default-header-args:sql '()) |
| 66 | 67 | ||
| @@ -68,6 +69,7 @@ | |||
| 68 | '((engine . :any) | 69 | '((engine . :any) |
| 69 | (out-file . :any) | 70 | (out-file . :any) |
| 70 | (dbhost . :any) | 71 | (dbhost . :any) |
| 72 | (dbport . :any) | ||
| 71 | (dbuser . :any) | 73 | (dbuser . :any) |
| 72 | (dbpassword . :any) | 74 | (dbpassword . :any) |
| 73 | (database . :any)) | 75 | (database . :any)) |
| @@ -76,98 +78,167 @@ | |||
| 76 | (defun org-babel-expand-body:sql (body params) | 78 | (defun org-babel-expand-body:sql (body params) |
| 77 | "Expand BODY according to the values of PARAMS." | 79 | "Expand BODY according to the values of PARAMS." |
| 78 | (org-babel-sql-expand-vars | 80 | (org-babel-sql-expand-vars |
| 79 | body (mapcar #'cdr (org-babel-get-header params :var)))) | 81 | body (org-babel--get-vars params))) |
| 80 | 82 | ||
| 81 | (defun dbstring-mysql (host user password database) | 83 | (defun org-babel-sql-dbstring-mysql (host port user password database) |
| 82 | "Make MySQL cmd line args for database connection. Pass nil to omit that arg." | 84 | "Make MySQL cmd line args for database connection. Pass nil to omit that arg." |
| 83 | (combine-and-quote-strings | 85 | (combine-and-quote-strings |
| 84 | (remq nil | 86 | (delq nil |
| 85 | (list (when host (concat "-h" host)) | 87 | (list (when host (concat "-h" host)) |
| 88 | (when port (format "-P%d" port)) | ||
| 86 | (when user (concat "-u" user)) | 89 | (when user (concat "-u" user)) |
| 87 | (when password (concat "-p" password)) | 90 | (when password (concat "-p" password)) |
| 88 | (when database (concat "-D" database)))))) | 91 | (when database (concat "-D" database)))))) |
| 89 | 92 | ||
| 93 | (defun org-babel-sql-dbstring-postgresql (host port user database) | ||
| 94 | "Make PostgreSQL command line args for database connection. | ||
| 95 | Pass nil to omit that arg." | ||
| 96 | (combine-and-quote-strings | ||
| 97 | (delq nil | ||
| 98 | (list (when host (concat "-h" host)) | ||
| 99 | (when port (format "-p%d" port)) | ||
| 100 | (when user (concat "-U" user)) | ||
| 101 | (when database (concat "-d" database)))))) | ||
| 102 | |||
| 103 | (defun org-babel-sql-dbstring-oracle (host port user password database) | ||
| 104 | "Make Oracle command line args for database connection." | ||
| 105 | (format "%s/%s@%s:%s/%s" user password host port database)) | ||
| 106 | |||
| 107 | (defun org-babel-sql-dbstring-mssql (host user password database) | ||
| 108 | "Make sqlcmd commmand line args for database connection. | ||
| 109 | `sqlcmd' is the preferred command line tool to access Microsoft | ||
| 110 | SQL Server on Windows and Linux platform." | ||
| 111 | (mapconcat #'identity | ||
| 112 | (delq nil | ||
| 113 | (list (when host (format "-S \"%s\"" host)) | ||
| 114 | (when user (format "-U \"%s\"" user)) | ||
| 115 | (when password (format "-P \"%s\"" password)) | ||
| 116 | (when database (format "-d \"%s\"" database)))) | ||
| 117 | " ")) | ||
| 118 | |||
| 119 | (defun org-babel-sql-convert-standard-filename (file) | ||
| 120 | "Convert FILE to OS standard file name. | ||
| 121 | If in Cygwin environment, uses Cygwin specific function to | ||
| 122 | convert the file name. In a Windows-NT environment, do nothing. | ||
| 123 | Otherwise, use Emacs' standard conversion function." | ||
| 124 | (cond ((fboundp 'cygwin-convert-file-name-to-windows) | ||
| 125 | (format "%S" (cygwin-convert-file-name-to-windows file))) | ||
| 126 | ((string= "windows-nt" system-type) file) | ||
| 127 | (t (format "%S" (convert-standard-filename file))))) | ||
| 128 | |||
| 90 | (defun org-babel-execute:sql (body params) | 129 | (defun org-babel-execute:sql (body params) |
| 91 | "Execute a block of Sql code with Babel. | 130 | "Execute a block of Sql code with Babel. |
| 92 | This function is called by `org-babel-execute-src-block'." | 131 | This function is called by `org-babel-execute-src-block'." |
| 93 | (let* ((result-params (cdr (assoc :result-params params))) | 132 | (let* ((result-params (cdr (assq :result-params params))) |
| 94 | (cmdline (cdr (assoc :cmdline params))) | 133 | (cmdline (cdr (assq :cmdline params))) |
| 95 | (dbhost (cdr (assoc :dbhost params))) | 134 | (dbhost (cdr (assq :dbhost params))) |
| 96 | (dbuser (cdr (assoc :dbuser params))) | 135 | (dbport (cdr (assq :dbport params))) |
| 97 | (dbpassword (cdr (assoc :dbpassword params))) | 136 | (dbuser (cdr (assq :dbuser params))) |
| 98 | (database (cdr (assoc :database params))) | 137 | (dbpassword (cdr (assq :dbpassword params))) |
| 99 | (engine (cdr (assoc :engine params))) | 138 | (database (cdr (assq :database params))) |
| 100 | (colnames-p (not (equal "no" (cdr (assoc :colnames params))))) | 139 | (engine (cdr (assq :engine params))) |
| 140 | (colnames-p (not (equal "no" (cdr (assq :colnames params))))) | ||
| 101 | (in-file (org-babel-temp-file "sql-in-")) | 141 | (in-file (org-babel-temp-file "sql-in-")) |
| 102 | (out-file (or (cdr (assoc :out-file params)) | 142 | (out-file (or (cdr (assq :out-file params)) |
| 103 | (org-babel-temp-file "sql-out-"))) | 143 | (org-babel-temp-file "sql-out-"))) |
| 104 | (header-delim "") | 144 | (header-delim "") |
| 105 | (command (case (intern engine) | 145 | (command (pcase (intern engine) |
| 106 | ('dbi (format "dbish --batch %s < %s | sed '%s' > %s" | 146 | (`dbi (format "dbish --batch %s < %s | sed '%s' > %s" |
| 107 | (or cmdline "") | 147 | (or cmdline "") |
| 108 | (org-babel-process-file-name in-file) | 148 | (org-babel-process-file-name in-file) |
| 109 | "/^+/d;s/^|//;s/(NULL)/ /g;$d" | 149 | "/^+/d;s/^|//;s/(NULL)/ /g;$d" |
| 110 | (org-babel-process-file-name out-file))) | 150 | (org-babel-process-file-name out-file))) |
| 111 | ('monetdb (format "mclient -f tab %s < %s > %s" | 151 | (`monetdb (format "mclient -f tab %s < %s > %s" |
| 112 | (or cmdline "") | 152 | (or cmdline "") |
| 113 | (org-babel-process-file-name in-file) | 153 | (org-babel-process-file-name in-file) |
| 114 | (org-babel-process-file-name out-file))) | 154 | (org-babel-process-file-name out-file))) |
| 115 | ('msosql (format "osql %s -s \"\t\" -i %s -o %s" | 155 | (`mssql (format "sqlcmd %s -s \"\t\" %s -i %s -o %s" |
| 116 | (or cmdline "") | 156 | (or cmdline "") |
| 117 | (org-babel-process-file-name in-file) | 157 | (org-babel-sql-dbstring-mssql |
| 118 | (org-babel-process-file-name out-file))) | 158 | dbhost dbuser dbpassword database) |
| 119 | ('mysql (format "mysql %s %s %s < %s > %s" | 159 | (org-babel-sql-convert-standard-filename |
| 120 | (dbstring-mysql dbhost dbuser dbpassword database) | 160 | (org-babel-process-file-name in-file)) |
| 161 | (org-babel-sql-convert-standard-filename | ||
| 162 | (org-babel-process-file-name out-file)))) | ||
| 163 | (`mysql (format "mysql %s %s %s < %s > %s" | ||
| 164 | (org-babel-sql-dbstring-mysql | ||
| 165 | dbhost dbport dbuser dbpassword database) | ||
| 121 | (if colnames-p "" "-N") | 166 | (if colnames-p "" "-N") |
| 122 | (or cmdline "") | 167 | (or cmdline "") |
| 123 | (org-babel-process-file-name in-file) | 168 | (org-babel-process-file-name in-file) |
| 124 | (org-babel-process-file-name out-file))) | 169 | (org-babel-process-file-name out-file))) |
| 125 | ('postgresql (format | 170 | (`postgresql (format |
| 126 | "psql -A -P footer=off -F \"\t\" -f %s -o %s %s" | 171 | "%spsql --set=\"ON_ERROR_STOP=1\" %s -A -P \ |
| 172 | footer=off -F \"\t\" %s -f %s -o %s %s" | ||
| 173 | (if dbpassword | ||
| 174 | (format "PGPASSWORD=%s " dbpassword) | ||
| 175 | "") | ||
| 176 | (if colnames-p "" "-t") | ||
| 177 | (org-babel-sql-dbstring-postgresql | ||
| 178 | dbhost dbport dbuser database) | ||
| 127 | (org-babel-process-file-name in-file) | 179 | (org-babel-process-file-name in-file) |
| 128 | (org-babel-process-file-name out-file) | 180 | (org-babel-process-file-name out-file) |
| 129 | (or cmdline ""))) | 181 | (or cmdline ""))) |
| 130 | (t (error "No support for the %s SQL engine" engine))))) | 182 | (`oracle (format |
| 183 | "sqlplus -s %s < %s > %s" | ||
| 184 | (org-babel-sql-dbstring-oracle | ||
| 185 | dbhost dbport dbuser dbpassword database) | ||
| 186 | (org-babel-process-file-name in-file) | ||
| 187 | (org-babel-process-file-name out-file))) | ||
| 188 | (_ (error "No support for the %s SQL engine" engine))))) | ||
| 131 | (with-temp-file in-file | 189 | (with-temp-file in-file |
| 132 | (insert | 190 | (insert |
| 133 | (case (intern engine) | 191 | (pcase (intern engine) |
| 134 | ('dbi "/format partbox\n") | 192 | (`dbi "/format partbox\n") |
| 135 | (t "")) | 193 | (`oracle "SET PAGESIZE 50000 |
| 194 | SET NEWPAGE 0 | ||
| 195 | SET TAB OFF | ||
| 196 | SET SPACE 0 | ||
| 197 | SET LINESIZE 9999 | ||
| 198 | SET ECHO OFF | ||
| 199 | SET FEEDBACK OFF | ||
| 200 | SET VERIFY OFF | ||
| 201 | SET HEADING ON | ||
| 202 | SET MARKUP HTML OFF SPOOL OFF | ||
| 203 | SET COLSEP '|' | ||
| 204 | |||
| 205 | ") | ||
| 206 | (`mssql "SET NOCOUNT ON | ||
| 207 | |||
| 208 | ") | ||
| 209 | (_ "")) | ||
| 136 | (org-babel-expand-body:sql body params))) | 210 | (org-babel-expand-body:sql body params))) |
| 137 | (message command) | ||
| 138 | (org-babel-eval command "") | 211 | (org-babel-eval command "") |
| 139 | (org-babel-result-cond result-params | 212 | (org-babel-result-cond result-params |
| 140 | (with-temp-buffer | 213 | (with-temp-buffer |
| 141 | (progn (insert-file-contents-literally out-file) (buffer-string))) | 214 | (progn (insert-file-contents-literally out-file) (buffer-string))) |
| 142 | (with-temp-buffer | 215 | (with-temp-buffer |
| 143 | (cond | 216 | (cond |
| 144 | ((or (eq (intern engine) 'mysql) | 217 | ((memq (intern engine) '(dbi mysql postgresql)) |
| 145 | (eq (intern engine) 'dbi) | 218 | ;; Add header row delimiter after column-names header in first line |
| 146 | (eq (intern engine) 'postgresql)) | 219 | (cond |
| 147 | ;; Add header row delimiter after column-names header in first line | 220 | (colnames-p |
| 148 | (cond | 221 | (with-temp-buffer |
| 149 | (colnames-p | 222 | (insert-file-contents out-file) |
| 150 | (with-temp-buffer | 223 | (goto-char (point-min)) |
| 151 | (insert-file-contents out-file) | 224 | (forward-line 1) |
| 152 | (goto-char (point-min)) | 225 | (insert "-\n") |
| 153 | (forward-line 1) | 226 | (setq header-delim "-") |
| 154 | (insert "-\n") | 227 | (write-file out-file))))) |
| 155 | (setq header-delim "-") | 228 | (t |
| 156 | (write-file out-file))))) | 229 | ;; Need to figure out the delimiter for the header row |
| 157 | (t | 230 | (with-temp-buffer |
| 158 | ;; Need to figure out the delimiter for the header row | 231 | (insert-file-contents out-file) |
| 159 | (with-temp-buffer | 232 | (goto-char (point-min)) |
| 160 | (insert-file-contents out-file) | 233 | (when (re-search-forward "^\\(-+\\)[^-]" nil t) |
| 161 | (goto-char (point-min)) | 234 | (setq header-delim (match-string-no-properties 1))) |
| 162 | (when (re-search-forward "^\\(-+\\)[^-]" nil t) | 235 | (goto-char (point-max)) |
| 163 | (setq header-delim (match-string-no-properties 1))) | 236 | (forward-char -1) |
| 164 | (goto-char (point-max)) | 237 | (while (looking-at "\n") |
| 165 | (forward-char -1) | 238 | (delete-char 1) |
| 166 | (while (looking-at "\n") | 239 | (goto-char (point-max)) |
| 167 | (delete-char 1) | 240 | (forward-char -1)) |
| 168 | (goto-char (point-max)) | 241 | (write-file out-file)))) |
| 169 | (forward-char -1)) | ||
| 170 | (write-file out-file)))) | ||
| 171 | (org-table-import out-file '(16)) | 242 | (org-table-import out-file '(16)) |
| 172 | (org-babel-reassemble-table | 243 | (org-babel-reassemble-table |
| 173 | (mapcar (lambda (x) | 244 | (mapcar (lambda (x) |
| @@ -175,10 +246,10 @@ This function is called by `org-babel-execute-src-block'." | |||
| 175 | 'hline | 246 | 'hline |
| 176 | x)) | 247 | x)) |
| 177 | (org-table-to-lisp)) | 248 | (org-table-to-lisp)) |
| 178 | (org-babel-pick-name (cdr (assoc :colname-names params)) | 249 | (org-babel-pick-name (cdr (assq :colname-names params)) |
| 179 | (cdr (assoc :colnames params))) | 250 | (cdr (assq :colnames params))) |
| 180 | (org-babel-pick-name (cdr (assoc :rowname-names params)) | 251 | (org-babel-pick-name (cdr (assq :rowname-names params)) |
| 181 | (cdr (assoc :rownames params)))))))) | 252 | (cdr (assq :rownames params)))))))) |
| 182 | 253 | ||
| 183 | (defun org-babel-sql-expand-vars (body vars) | 254 | (defun org-babel-sql-expand-vars (body vars) |
| 184 | "Expand the variables held in VARS in BODY." | 255 | "Expand the variables held in VARS in BODY." |
| @@ -201,7 +272,7 @@ This function is called by `org-babel-execute-src-block'." | |||
| 201 | vars) | 272 | vars) |
| 202 | body) | 273 | body) |
| 203 | 274 | ||
| 204 | (defun org-babel-prep-session:sql (session params) | 275 | (defun org-babel-prep-session:sql (_session _params) |
| 205 | "Raise an error because Sql sessions aren't implemented." | 276 | "Raise an error because Sql sessions aren't implemented." |
| 206 | (error "SQL sessions not yet implemented")) | 277 | (error "SQL sessions not yet implemented")) |
| 207 | 278 | ||