commit 7c47fc3ec32c8859f26e70d907c8ffdee53f24cb
parent ed0c38d7b95518918de5e354a0ed708ce0e52101
Author: Tomas Hlavaty <tom@logand.com>
Date:   Tue,  5 Mar 2013 22:40:49 +0100
more old dbquery.el code
Diffstat:
| M | dbquery.el |  |  | 200 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------- | 
1 file changed, 152 insertions(+), 48 deletions(-)
diff --git a/dbquery.el b/dbquery.el
@@ -1,4 +1,4 @@
-;;; dbquery - Query RDBMS, result as S-expression
+;;; dbquery - Query RDBMS, S-expression output, draw ER diagrams and more.
 ;;; Copyright (C) 2007, 2008, 2009 Tomas Hlavaty
 
 ;;; This program is free software: you can redistribute it and/or modify
@@ -16,10 +16,43 @@
 
 ;;; See http://logand.com/sw/dbquery/index.html for documentation.
 
+(require 'org-table)
+
 (defvar dbquery-dir nil)
+(defvar dbquery-backend nil)
+(defvar dbquery-driver nil)
+
 (defvar dbquery-db-alist nil)
 (defvar dbquery-db-name nil)
 
+(defun dbquery-shell-command (x)
+  (with-temp-buffer
+    (shell-command x (current-buffer))
+    (goto-char (point-min))
+    (read (current-buffer))))
+
+(defun dbquery-pg (host port db user pwd timeout query)
+  (dbquery-shell-command
+   (format "%sdbquery-pg \"hostaddr='%s' port='%s' dbname='%s' user='%s' password='%s' connect_timeout='%s'\" \"%s\""
+           dbquery-dir host port db user pwd timeout query)))
+
+(defun dbquery-mysql (host user pwd db query)
+  (dbquery-shell-command
+   (format "%sdbquery-mysql '%s' '%s' '%s' '%s' \"%s\""
+           dbquery-dir host user pwd db query)))
+
+(defun dbquery-sqlite (db query)
+  (dbquery-shell-command
+   (format "%sdbquery-sqlite '%s' \"%s\"" dbquery-dir db query)))
+
+(defun dbquery-java (sep jar driver cstr user pwd query)
+  (dbquery-shell-command
+   (format "java -cp '%s%s%s' DbQuery %s %s %s %s \"%s\""
+           dbquery-dir sep jar driver cstr user pwd query)))
+
+(defun dbquery (query)
+  (funcall dbquery-driver query))
+
 (defun dbquery-cstr-postgres (alist)
   (format "jdbc:postgresql:%s" (cdr (assoc 'sid alist))))
       
@@ -39,42 +72,28 @@
   (if (member system-type '(ms-dos windows-nt cygwin vax-vms axp-vms)) ";" ":"))
 
 ;;; TODO fix shell escaping " and '
-(defun dbquery (query)
-  (with-temp-buffer
-    (let ((buf (current-buffer))
-          (alist (cdr (assoc dbquery-db-name dbquery-db-alist))))
-      (shell-command (format "java -cp '%s%s%s' DbQuery %s %s %s %s \"%s\""
-                             dbquery-dir
-                             (dbquery-cp-separator)
-                             (cdr (assoc 'jar alist))
-                             (cdr (assoc 'driver alist))
-                             (funcall (cdr (assoc 'cstr alist)) alist)
-                             (cdr (assoc 'username alist))
-                             (cdr (assoc 'password alist))
-                             query)
-                     buf)
-      (when (> (point-max) (point-min))
-        (while (search-forward "\\" nil t)
-          (replace-match "\\\\" nil t))
-        (goto-char (point-min))
-        (read buf)))))
-
-(defmacro with-dbquery (query &rest body)
-  (let ((table (gensym))
-        (header (gensym))
-        (rows (gensym)))
-    `(let ((,table (dbquery ,query)))
-       (when ,table
-         (let ((,header (first ,table))
-               (,rows (rest ,table)))
-           (flet ((columns () ,header)
-                  (column-type (name)
-                    (second (assoc (upcase (format "%s" name)) ,header))))
-             (dolist (row ,rows t)
-               ,@body)))))))
+;; (defun dbquery (query)
+;;   (with-temp-buffer
+;;     (let ((buf (current-buffer))
+;;           (alist (cdr (assoc dbquery-db-name dbquery-db-alist))))
+;;       (shell-command (format "java -cp '%s%s%s' DbQuery %s %s %s %s \"%s\""
+;;                              dbquery-dir
+;;                              (dbquery-cp-separator)
+;;                              (cdr (assoc 'jar alist))
+;;                              (cdr (assoc 'driver alist))
+;;                              (funcall (cdr (assoc 'cstr alist)) alist)
+;;                              (cdr (assoc 'username alist))
+;;                              (cdr (assoc 'password alist))
+;;                              query)
+;;                      buf)
+;;       (when (> (point-max) (point-min))
+;;         (while (search-forward "\\" nil t)
+;;           (replace-match "\\\\" nil t))
+;;         (goto-char (point-min))
+;;         (read buf)))))
 
-(defun dbquery-list-columns-postgres ()
-   (dbquery "
+(defun dbquery-list-columns-pg ()
+  (dbquery "
 select t.tablename, a.attname
   from pg_tables as t, pg_class as c, pg_attribute as a
  where t.tablename !~* 'pg_*'
@@ -84,7 +103,7 @@ select t.tablename, a.attname
    and a.attrelid = c.oid
  order by t.tablename, a.attnum;"))
 
-(defun dbquery-list-edges-postgres ()
+(defun dbquery-list-edges-pg ()
   (dbquery "
 select c1.relname, c2.relname
   from pg_constraint k, pg_class c1, pg_class c2
@@ -93,26 +112,22 @@ select c1.relname, c2.relname
    and k.conrelid = c1.oid
    and k.confrelid = c2.oid;"))
 
-(defun dbquery-list-columns-mysql ()
-  (let* ((alist (cdr (assoc dbquery-db-name dbquery-db-alist)))
-         (sid (cdr (assoc 'sid alist))))
-    (dbquery (format "
+(defun dbquery-list-columns-mysql (sid)
+  (dbquery (format "
 select table_name, column_name
   from information_schema.columns
  where table_schema = '%s'
- order by tname, cname;" sid))))
+ order by tname, cname;" sid)))
 
-(defun dbquery-list-edges-mysql ()
-  (let* ((alist (cdr (assoc dbquery-db-name dbquery-db-alist)))
-         (sid (cdr (assoc 'sid alist))))
-    (dbquery (format "
+(defun dbquery-list-edges-mysql (sid)
+  (dbquery (format "
 select table_name, referenced_table_name
   from information_schema.key_column_usage
  where referenced_table_name is not null
-   and table_schema = '%s';" sid))))
+   and table_schema = '%s';" sid)))
 
 (defun dbquery-list-columns-oracle ()
-   (dbquery "
+  (dbquery "
 select table_name, column_name from user_tab_cols
  order by table_name, column_name;"))
 
@@ -130,6 +145,40 @@ select c1.table_name, c2.table_name
    and c3.position = c2.position
  where c4.constraint_type = 'R';"))
 
+(defun dbquery-list-columns ()
+  (ecase dbquery-backend
+    (mysql (dbquery-list-columns-mysql
+            (cdr (assoc 'sid
+                        (cdr (assoc dbquery-db-name dbquery-db-alist))))))
+    (pg (dbquery-list-columns-pg))
+    (sqlite (dbquery-list-columns-sqlite))
+    (oracle (dbquery-list-columns-oracle))))
+
+(defun dbquery-list-edges ()
+  (ecase dbquery-backend
+    (mysql (dbquery-list-edges-mysql
+            (cdr (assoc 'sid
+                        (cdr (assoc dbquery-db-name dbquery-db-alist))))))
+    (pg (dbquery-list-edges-pg))
+    (sqlite (dbquery-list-edges-sqlite))
+    (oracle (dbquery-list-edges-oracle))))
+
+(defun dbquery-draw-row (x)
+  (insert "| ")
+  (let ((i -1))
+    (dolist (c x)
+      (when (plusp (incf i))
+        (insert " | "))
+      (insert (format "%s" c))))
+  (insert " |\n"))
+
+(defun dbquery-draw-table (x)
+  (insert "|----\n")
+  (dbquery-draw-row (car x))
+  (insert "|----\n")
+  (mapc 'dbquery-draw-row (cddr x))
+  (org-table-align))
+
 (defun dbquery-er-dot-here ()
   (interactive)
   (insert "digraph \"ER\" {
@@ -162,3 +211,58 @@ label=\"" tname "|{" cname))
     (dolist (edge (cdr (funcall edges)))
       (insert "\"" (car edge) "\" -> \"" (cadr edge) "\"\n")))
   (insert "}\n"))
+
+(defun dbquery-save-table (dir table &optional lob-fn)
+  (find-file (concat dir "/" table ".el"))
+  (erase-buffer)
+  (let ((data (dbquery (concat "select * from " table))))
+    ;; move lobs from tmp dir
+    (dolist (lob (loop
+                    for (name type) in (first data)
+                    for n from 0
+                    when (or (equalp type "clob")
+                             (equalp type "blob"))
+                    collect n))
+      (dolist (row (rest data))
+        (let ((old (nth lob row)))
+          (when old
+            (multiple-value-bind (new-full new-saved)
+                (if lob-fn
+                    (funcall lob-fn dir table (first (nth lob (first data)))
+                             row)
+                  (values (concat dir "/" table "/"
+                                  (file-name-nondirectory old))
+                          nil))
+              (when new-full
+                (unless (file-directory-p (file-name-directory new-full))
+                  (make-directory (file-name-directory new-full)))
+                (rename-file old new-full t)
+                (setf (nth lob row) (or new-saved new-full))))))))
+    ;; print table
+    (pprint data (current-buffer)))
+  (save-buffer)
+  (kill-buffer (current-buffer)))
+
+(defmacro with-dbquery (query &rest body)
+  (let ((table (gensym))
+        (header (gensym))
+        (rows (gensym)))
+    `(let ((,table (dbquery ,query)))
+       (when ,table
+         (let ((,header (first ,table))
+               (,rows (rest ,table)))
+           (flet ((columns () ,header)
+                  (column-type (name)
+                    (second (assoc (upcase (format "%s" name)) ,header))))
+             (dolist (row ,rows t)
+               ,@body)))))))
+
+(defun dbquery-save-database (dir &optional lob-fn)
+  (with-dbquery "select table_name from user_tables"
+    (destructuring-bind (table) row
+      (when table
+        (dbquery-save-table dir table lob-fn)))))
+
+(defun dbquery-buffer ()
+  (interactive)
+  (switch-to-buffer "*dbquery*"))