aboutsummaryrefslogtreecommitdiffstats
path: root/lisp/org/ob-sql.el
diff options
context:
space:
mode:
authorRasmus2017-06-21 13:20:20 +0200
committerRasmus2017-06-22 11:54:18 +0200
commit5cecd275820df825c51bf9a27fcc7e35f30ff273 (patch)
treeb3f72e63953613d565e6d5a35bec97f158eb603c /lisp/org/ob-sql.el
parent386a3da920482b8cb3e962fb944d135c8a770e26 (diff)
downloademacs-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.el205
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.
95Pass 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
110SQL 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.
121If in Cygwin environment, uses Cygwin specific function to
122convert the file name. In a Windows-NT environment, do nothing.
123Otherwise, 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.
92This function is called by `org-babel-execute-src-block'." 131This 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 \
172footer=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
194SET NEWPAGE 0
195SET TAB OFF
196SET SPACE 0
197SET LINESIZE 9999
198SET ECHO OFF
199SET FEEDBACK OFF
200SET VERIFY OFF
201SET HEADING ON
202SET MARKUP HTML OFF SPOOL OFF
203SET 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