Download
(defgroup mysql-query nil
"mysql query."
:group 'SQL)
(defcustom mysql-connection-info
'((host . "localhost")
(username . "root")
(password . "root")
(dbname . "mysql")
(port . "3306")
)
"default mysql connection info ."
:group 'mysql-query
:type 'alist)
(defcustom mysql-command "mysql"
"default mysql command ,."
:group 'mysql-query
:type 'string)
(defcustom mysql-command-other-options
'("--column-names" "--unbuffered")
"default mysql connection info ."
:group 'mysql-query)
(defun mysql-query-read-connect-string()
"set hostname dbname username password interactive"
(let ((connection-info (copy-alist mysql-connection-info)))
(setcdr (assoc 'username connection-info)
(read-string (format "username(default:%s):" (cdr (assoc 'username connection-info)))
"" nil (cdr (assoc 'username connection-info))))
(setcdr (assoc 'password connection-info)
(read-passwd "password:" nil ))
(setcdr (assoc 'dbname connection-info)
(read-string (format "dbname(default:%s):" (cdr (assoc 'dbname connection-info)))
"" nil (cdr (assoc 'dbname connection-info))))
(setcdr (assoc 'host connection-info)
(read-string (format "host(default:%s):" (cdr (assoc 'host connection-info)))
"" nil (cdr (assoc 'host connection-info))))
(setcdr (assoc 'port connection-info)
(read-string (format "port(default:%s):" (cdr (assoc 'port connection-info)))
"" nil (cdr (assoc 'port connection-info))))
(setq-default mysql-connection-info connection-info)
connection-info))
(defun mysql-query-create-connection (&optional connection-info)
(interactive (list (mysql-query-read-connect-string)))
connection-info)
(defun mysql-query-connection-alive-p (connection)
connection)
(defun mysql-format-command-args (connection-info)
"Returns a list of all the arguments for the mysql program.
default: mysql -h localhost -u root -proot -s --database=mysql "
(apply 'list "-h" (cdr (assoc 'host connection-info))
"-u" (cdr (assoc 'username connection-info))
(concat "-p" (cdr (assoc 'password connection-info)))
"-P" (cdr (assoc 'port connection-info))
(if (cdr (assoc 'dbname connection-info))
(concat "--database=" (cdr (assoc 'dbname connection-info))) "")
mysql-command-other-options))
(defun mysql-query-parse(raw-result-buf)
"parse the result of mysql -e 'sql' ,the separator char is \t."
(let (result row line-count)
(when raw-result-buf
(with-current-buffer raw-result-buf
(setq line-count (count-lines (point-min) (point-max)))
(goto-char (point-min))
(while (< (line-number-at-pos) line-count)
(setq row (split-string (buffer-substring-no-properties
(point-at-bol) (point-at-eol)) "\t" nil))
(setq result (append result (list row)))
(forward-line))
(unless (string= "" (buffer-substring-no-properties (point-at-bol) (point-at-eol)))
(setq row (split-string (buffer-substring-no-properties
(point-at-bol) (point-at-eol)) "\t" nil))
(setq result (append result (list row)))))
(kill-buffer raw-result-buf))
result))
(defun mysql-query-raw ( sql connection-info )
"Returns a list of all the arguments for the mysql program.
default: mysql -h localhost -u root -proot -s --database=test -e"
(let((result-buf-name (concat " *mysql-query-" (number-to-string (random)) "*"))
(result))
(setq result
(apply 'call-process mysql-command nil result-buf-name nil
(append (mysql-format-command-args connection-info) (list "--batch" "-e" sql))))
(if (= result 0)
result-buf-name nil)))
(defun mysql-query-with-heading (sql &optional connection-info)
"execute query ,using `connection-info' if `connection-info' is nil,
using `mysql-connection-info' instead"
(unless connection-info (setq connection-info (mysql-query-read-connect-string)))
(let* ((raw-result-buf (mysql-query-raw sql connection-info ))
(result (mysql-query-parse raw-result-buf)))
result))
(defun mysql-query (sql &optional connection-info)
(let ((result (mysql-query-with-heading sql connection-info)))
(when (and result (listp result))
(cdr result))))
(provide 'mysql-query)