X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/77ab81d0545e980c57c0a35510ade29a9e43b4cd..ef62b23df5a7007c3d8c74dbca87ba83e9da682e:/lisp/org/ob-sql.el diff --git a/lisp/org/ob-sql.el b/lisp/org/ob-sql.el index 5bb123d631..68bd95af9f 100644 --- a/lisp/org/ob-sql.el +++ b/lisp/org/ob-sql.el @@ -1,11 +1,10 @@ ;;; ob-sql.el --- org-babel functions for sql evaluation -;; Copyright (C) 2009, 2010 Free Software Foundation, Inc. +;; Copyright (C) 2009-2012 Free Software Foundation, Inc. ;; Author: Eric Schulte ;; Keywords: literate programming, reproducible research ;; Homepage: http://orgmode.org -;; Version: 7.4 ;; This file is part of GNU Emacs. @@ -25,6 +24,7 @@ ;;; Commentary: ;; Org-Babel support for evaluating sql source code. +;; (see also ob-sqlite.el) ;; ;; SQL is somewhat unique in that there are many different engines for ;; the evaluation of sql (Mysql, PostgreSQL, etc...), so much of this @@ -40,7 +40,7 @@ ;; - add more useful header arguments (user, passwd, database, etc...) ;; - support for more engines (currently only supports mysql) ;; - what's a reasonable way to drop table data into SQL? -;; +;; ;;; Code: (require 'ob) @@ -51,6 +51,9 @@ (defvar org-babel-default-header-args:sql '()) +(defvar org-babel-header-arg-names:sql + '(engine out-file)) + (defun org-babel-expand-body:sql (body params) "Expand BODY according to the values of PARAMS." (org-babel-sql-expand-vars @@ -65,16 +68,18 @@ This function is called by `org-babel-execute-src-block'." (in-file (org-babel-temp-file "sql-in-")) (out-file (or (cdr (assoc :out-file params)) (org-babel-temp-file "sql-out-"))) + (header-delim "") (command (case (intern engine) ('msosql (format "osql %s -s \"\t\" -i %s -o %s" (or cmdline "") (org-babel-process-file-name in-file) (org-babel-process-file-name out-file))) - ('mysql (format "mysql %s -e \"source %s\" > %s" + ('mysql (format "mysql %s < %s > %s" (or cmdline "") (org-babel-process-file-name in-file) (org-babel-process-file-name out-file))) - ('postgresql (format "psql -A -P footer=off -F \"\t\" -f %s -o %s %s" + ('postgresql (format + "psql -A -P footer=off -F \"\t\" -f %s -o %s %s" (org-babel-process-file-name in-file) (org-babel-process-file-name out-file) (or cmdline ""))) @@ -83,14 +88,38 @@ This function is called by `org-babel-execute-src-block'." (insert (org-babel-expand-body:sql body params))) (message command) (shell-command command) - (with-temp-buffer - (org-table-import out-file '(16)) - (org-babel-reassemble-table - (org-table-to-lisp) - (org-babel-pick-name (cdr (assoc :colname-names params)) - (cdr (assoc :colnames params))) - (org-babel-pick-name (cdr (assoc :rowname-names params)) - (cdr (assoc :rownames params))))))) + (if (or (member "scalar" result-params) + (member "verbatim" result-params) + (member "html" result-params) + (member "code" result-params) + (equal (point-min) (point-max))) + (with-temp-buffer + (progn (insert-file-contents-literally out-file) (buffer-string))) + (with-temp-buffer + ;; need to figure out what the delimiter is for the header row + (with-temp-buffer + (insert-file-contents out-file) + (goto-char (point-min)) + (when (re-search-forward "^\\(-+\\)[^-]" nil t) + (setq header-delim (match-string-no-properties 1))) + (goto-char (point-max)) + (forward-char -1) + (while (looking-at "\n") + (delete-char 1) + (goto-char (point-max)) + (forward-char -1)) + (write-file out-file)) + (org-table-import out-file '(16)) + (org-babel-reassemble-table + (mapcar (lambda (x) + (if (string= (car x) header-delim) + 'hline + x)) + (org-table-to-lisp)) + (org-babel-pick-name (cdr (assoc :colname-names params)) + (cdr (assoc :colnames params))) + (org-babel-pick-name (cdr (assoc :rowname-names params)) + (cdr (assoc :rownames params)))))))) (defun org-babel-sql-expand-vars (body vars) "Expand the variables held in VARS in BODY." @@ -121,6 +150,6 @@ This function is called by `org-babel-execute-src-block'." (provide 'ob-sql) -;; arch-tag: a43ff944-6de1-4566-a83c-626814e3dad2 + ;;; ob-sql.el ends here