X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/4628bef1eea0f60e846fe6b6591725aa92952de9..37b9099068c10383e959ee366a52a22516846163:/lisp/org/ob-sqlite.el diff --git a/lisp/org/ob-sqlite.el b/lisp/org/ob-sqlite.el index 7d6930abd4..705d7cee72 100644 --- a/lisp/org/ob-sqlite.el +++ b/lisp/org/ob-sqlite.el @@ -1,11 +1,10 @@ ;;; ob-sqlite.el --- org-babel functions for sqlite database interaction -;; Copyright (C) 2010 Free Software Foundation +;; Copyright (C) 2010-2016 Free Software Foundation, Inc. ;; Author: Eric Schulte ;; Keywords: literate programming, reproducible research ;; Homepage: http://orgmode.org -;; Version: 7.01 ;; This file is part of GNU Emacs. @@ -28,22 +27,33 @@ ;;; Code: (require 'ob) -(require 'ob-ref) (declare-function org-fill-template "org" (template alist)) (declare-function org-table-convert-region "org-table" (beg0 end0 &optional separator)) -(declare-function orgtbl-to-csv "org-table" (TABLE PARAMS)) +(declare-function orgtbl-to-csv "org-table" (table params)) +(declare-function org-table-to-lisp "org-table" (&optional txt)) (defvar org-babel-default-header-args:sqlite '()) -(defvar org-babel-header-arg-names:sqlite - '(db header echo bail csv column html line list separator nullvalue) +(defvar org-babel-header-args:sqlite + '((db . :any) + (header . :any) + (echo . :any) + (bail . :any) + (csv . :any) + (column . :any) + (html . :any) + (line . :any) + (list . :any) + (separator . :any) + (nullvalue . :any)) "Sqlite specific header args.") -(defun org-babel-expand-body:sqlite (body params &optional processed-params) +(defun org-babel-expand-body:sqlite (body params) + "Expand BODY according to the values of PARAMS." (org-babel-sqlite-expand-vars - body (or (nth 1 processed-params) (org-babel-ref-variables params)))) + body (mapcar #'cdr (org-babel-get-header params :var)))) (defvar org-babel-sqlite3-command "sqlite3") @@ -51,7 +61,6 @@ "Execute a block of Sqlite code with Babel. This function is called by `org-babel-execute-src-block'." (let ((result-params (split-string (or (cdr (assoc :results params)) ""))) - (vars (org-babel-ref-variables params)) (db (cdr (assoc :db params))) (separator (cdr (assoc :separator params))) (nullvalue (cdr (assoc :nullvalue params))) @@ -61,19 +70,13 @@ This function is called by `org-babel-execute-src-block'." (list :header :echo :bail :column :csv :html :line :list)))) exit-code) - (unless db (error "ob-sqlite: can't evaluate without a database.")) + (unless db (error "ob-sqlite: can't evaluate without a database")) (with-temp-buffer (insert - (shell-command-to-string + (org-babel-eval (org-fill-template - "%cmd -init %body %header %separator %nullvalue %others %csv %db " + "%cmd %header %separator %nullvalue %others %csv %db " (list - (cons "body" ((lambda (sql-file) - (with-temp-file sql-file - (insert (org-babel-expand-body:sqlite - body nil (list nil vars)))) - sql-file) - (make-temp-file "ob-sqlite-sql"))) (cons "cmd" org-babel-sqlite3-command) (cons "header" (if headers-p "-header" "-noheader")) (cons "separator" @@ -90,36 +93,43 @@ This function is called by `org-babel-execute-src-block'." (member :html others) separator) "" "-csv")) - (cons "db " db))))) - (if (or (member "scalar" result-params) - (member "html" result-params) - (member "code" result-params) - (equal (point-min) (point-max))) - (buffer-string) - (org-table-convert-region (point-min) (point-max)) - (org-babel-sqlite-table-or-scalar - (org-babel-sqlite-offset-colnames - (org-table-to-lisp) headers-p)))))) + (cons "db " db))) + ;; body of the code block + (org-babel-expand-body:sqlite body params))) + (org-babel-result-cond result-params + (buffer-string) + (if (equal (point-min) (point-max)) + "" + (org-table-convert-region (point-min) (point-max) + (if (or (member :csv others) + (member :column others) + (member :line others) + (member :list others) + (member :html others) separator) + nil + '(4))) + (org-babel-sqlite-table-or-scalar + (org-babel-sqlite-offset-colnames + (org-table-to-lisp) headers-p))))))) (defun org-babel-sqlite-expand-vars (body vars) "Expand the variables held in VARS in BODY." + ;; FIXME: Redundancy with org-babel-sql-expand-vars! (mapc (lambda (pair) (setq body (replace-regexp-in-string - (format "\$%s" (car pair)) - ((lambda (val) - (if (listp val) - ((lambda (data-file) - (with-temp-file data-file - (insert (orgtbl-to-csv - val '(:fmt (lambda (el) (if (stringp el) - el - (format "%S" el))))))) - data-file) - (make-temp-file "ob-sqlite-data")) - (format "%S" val))) - (cdr pair)) + (format "$%s" (car pair)) + (let ((val (cdr pair))) + (if (listp val) + (let ((data-file (org-babel-temp-file "sqlite-data-"))) + (with-temp-file data-file + (insert (orgtbl-to-csv + val '(:fmt (lambda (el) (if (stringp el) + el + (format "%S" el))))))) + data-file) + (if (stringp val) val (format "%S" val)))) body))) vars) body) @@ -132,7 +142,7 @@ This function is called by `org-babel-execute-src-block'." (mapcar (lambda (row) (if (equal 'hline row) 'hline - (mapcar #'org-babel-read row))) result))) + (mapcar #'org-babel-string-read row))) result))) (defun org-babel-sqlite-offset-colnames (table headers-p) "If HEADERS-P is non-nil then offset the first row as column names." @@ -141,12 +151,12 @@ This function is called by `org-babel-execute-src-block'." table)) (defun org-babel-prep-session:sqlite (session params) - "Raise an error because support for sqlite sessions isn't implemented. + "Raise an error because support for SQLite sessions isn't implemented. Prepare SESSION according to the header arguments specified in PARAMS." - (error "sqlite sessions not yet implemented")) + (error "SQLite sessions not yet implemented")) (provide 'ob-sqlite) -;; arch-tag: 5c03d7f2-0f72-48b8-bbd1-35aafea248ac + ;;; ob-sqlite.el ends here