# HG changeset patch # User j.forth # Date 1242741377 -3600 # Node ID 4d06910b6f0fb642dcc295a878cc21855f8102d2 # Parent 725ce7ce77babeade53bf33c80497a59f8b9cc36 New base module for general database functions Ignore-this: 403f22ca6285cba4a23eeddb1d0a806f Currently just provides a slightly more secure way of connecting to a database. darcs-hash:20090519135617-16a00-ce026a38abfb53e5728cd0cbb6c976e403691dde.gz diff -r 725ce7ce77ba -r 4d06910b6f0f amuse-database-admin.asd --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/amuse-database-admin.asd Tue May 19 14:56:17 2009 +0100 @@ -0,0 +1,12 @@ +(asdf:defsystem amuse-database-admin + :name "amuse-database-admin" + :description "Basic admin functions for an AMuSE database." + :depends-on ("clsql-mysql" "amuse") + :components + ((:module base + :components + ((:module database + :components + ((:file "package") + (:file "database-connect" :depends-on ("package")) + )))))) diff -r 725ce7ce77ba -r 4d06910b6f0f amuse-geerdes.asd --- a/amuse-geerdes.asd Mon Jan 05 15:03:55 2009 +0000 +++ b/amuse-geerdes.asd Tue May 19 14:56:17 2009 +0100 @@ -1,6 +1,6 @@ (asdf:defsystem amuse-geerdes :name "amuse-geerdes" - :depends-on ("amuse" "amuse-midi" "clsql") + :depends-on ("amuse" "amuse-midi" "amuse-database-admin") :components ((:module implementations :components diff -r 725ce7ce77ba -r 4d06910b6f0f base/database/database-connect.lisp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/base/database/database-connect.lisp Tue May 19 14:56:17 2009 +0100 @@ -0,0 +1,96 @@ +(cl:in-package #:amuse-database-admin) + +(defparameter *amuse-database* nil) + +(defun connect-to-database (&key (database-name "amuse") username + use-tunnel (make-default t)) + "Well, slightly more secure I guess. Requires that an option file +exists containing connection-spec s-expressions. If no such file +exists a skeleton file can be created by calling +make-db-option-file (the password still needs to be added +manually). The path is ~/.amuse.lisp. + +A better approach might be to use something like: +http://www.cliki.net/trivial-configuration-parser. Or for slime to +prompt the user for the password something +like (swank::eval-in-emacs `(read-passwd \"Password: \")). However, +this presents other security issues. + +If use-tunnel is t, then regardless of the host specified in the +connection-spec, it will be set to localhost. It is assumed that the +tunnel is already set up. + +When make-default is t, the newly created connection is assigned to +*amuse-database*. If make-default is nil, then the connection is +returned and is expected to be handled by the caller. This is useful +for connecting to different databases within individual +implementations (mainly for testing purposes)." + (if (and make-default + *amuse-database* + (clsql-mysql::is-database-open *amuse-database*)) + (error "A default AMuSE database connection already exists: +~S" (clsql:database-name *amuse-database*)) + (let ((connection-spec (%get-connection-spec database-name + username))) + (when use-tunnel + (setf (car connection-spec) "127.0.0.1")) + (let ((connection (%get-database-connection connection-spec))) + (when make-default + (setf *amuse-database* connection)) + connection)))) + +(defun disconnect-from-database (&optional (database-connection + *amuse-database*)) + (clsql:disconnect :database database-connection)) + +(defun make-db-option-file (&key database-name host username (port "3306")) + (with-open-file (stream (%make-db-option-file-pathname) :direction :output) + (sb-ext:run-program "chmod" + (list "600" (namestring + (%make-db-option-file-pathname))) + :search t) + (princ " +;;; Option file containing connection-spec s-expressions for connecting +;;; to a database from within AMuSE. You can have multiple specifications, +;;; but they must be uniquely identifiable by database name or a combination +;;; of database and username. + +;;; You need to fill in the missing
." stream) + (format stream "~2%(~S ~S ~S \"\" ~S)" + (if host host "") + (if database-name database-name "") + (if username username "") + port)) + (warn "You now need to manually edit ~A." + (namestring (%make-db-option-file-pathname)))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; Helper functions + +(defun %get-database-connection (connection-spec) + (clsql:connect connection-spec + :if-exists :old + :database-type :mysql)) + +(defun %get-connection-spec (db-name username) + (let ((option-file (probe-file (%make-db-option-file-pathname)))) + (if option-file + (with-open-file (stream option-file) + (loop for connection-spec = (read stream nil) + while connection-spec + do (destructuring-bind (host db usr pwd prt) + connection-spec + (declare (ignore host pwd prt)) + (when (equal db-name db) + (when (or (null username) + (equal username usr)) + (return connection-spec)))) + finally (error "No connection-spec exists matching +database: ~A and username: ~A" db-name username))) + ;; If file doesn't exist, create it. + (error "~A option file does not exist. +You need to run: amuse-database-admin:make-db-option-file." + (namestring (%make-db-option-file-pathname)))))) + +(defun %make-db-option-file-pathname () + (merge-pathnames (user-homedir-pathname) ".amuse.lisp")) diff -r 725ce7ce77ba -r 4d06910b6f0f base/database/package.lisp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/base/database/package.lisp Tue May 19 14:56:17 2009 +0100 @@ -0,0 +1,7 @@ +(cl:defpackage #:amuse-database-admin + (:use #:common-lisp #:amuse) + (:export #:connect-to-database ; database-connect + #:disconnect-from-database + #:*amuse-database* + #:make-db-option-file + )) diff -r 725ce7ce77ba -r 4d06910b6f0f implementations/geerdes/connect.lisp --- a/implementations/geerdes/connect.lisp Mon Jan 05 15:03:55 2009 +0000 +++ b/implementations/geerdes/connect.lisp Tue May 19 14:56:17 2009 +0100 @@ -4,6 +4,7 @@ ;; plain text... (defun get-amuse-connection () + (warn "This function should be removed, use connect-to-database instead.") (clsql:connect '("vaughan-williams.doc.gold.ac.uk" "amuse" "LispMidi" "clsql") :if-exists :old :database-type :mysql))