;;;; -*- Mode: LISP; Syntax: Common-Lisp; Base: 10; Pkg: umlisp -*- ;; SQL/UMLS database Layer over database backend ;; Copyright (c) 2001 Kevin M. Rosenberg, M.D. ;; $Id: sql.lisp,v 1.1 2002/10/05 20:17:14 kevin Exp $ (in-package :umlisp) (declaim (optimize (speed 1) (safety 3))) (defvar *umls-sql-dsn* "KUMLS2002AC") (defun umls-sql-dsn () *umls-sql-dsn*) (defun umls-sql-dsn! (dbname) (sql-disconnect-pooled) (setq *umls-sql-dsn* dbname)) (defvar *umls-sql-user* "webumls") (defun umls-sql-user () *umls-sql-user*) (defun umls-sql-user! (u) (sql-disconnect-pooled) (setq *umls-sql-user* u)) (defvar *umls-sql-passwd* "webumls") (defun umls-sql-passwd () *umls-sql-passwd*) (defun umls-sql-passwd! (p) (sql-disconnect-pooled) (setq *umls-sql-passwd* p)) (defvar *umls-sql-host* "localhost") (defun umls-sql-host () *umls-sql-host*) (defun umls-sql-host! (h) (sql-disconnect-pooled) (setq *umls-sql-host* h)) (defvar *umls-sql-type* :mysql) (defun umls-sql-type () *umls-sql-type*) (defun umls-sql-type! (h) (sql-disconnect-pooled) (setq *umls-sql-type* h)) (defun sql-connect () "Connect to UMLS database, automatically used pooled connections" (clsql:connect `(,(umls-sql-host) ,(umls-sql-dsn) ,(umls-sql-user) ,(umls-sql-passwd)) :database-type *umls-sql-type* :pool t)) (defun sql-disconnect (conn) "Disconnect from UMLS database, but put connection back into pool" (clsql:disconnect :database conn)) (defun sql-disconnect-pooled () (clsql:disconnect-pooled)) (defmacro with-sql-connection ((conn) &body body) `(let ((,conn (sql-connect))) (unwind-protect (progn ,@body) (when ,conn (clsql:disconnect :database ,conn))))) (defun sql (stmt conn) (if (string-equal "SELECT" (subseq stmt 0 6)) (sql-query stmt conn) (sql-execute stmt conn))) (defun sql-query (cmd conn &key (types :auto)) (clsql:query cmd :database conn :types types)) (defun sql-execute (cmd conn) (clsql:execute-command cmd :database conn)) (defun umls-sql (stmt) (check-type stmt string) (with-sql-connection (conn) (sql stmt conn))) ;;; Pool of open connections (defmacro with-mutex-sql ((conn) &body body) `(let ((,conn (sql-connect))) (unwind-protect (progn ,@body) (when ,conn (sql-disconnect ,conn))))) (defun mutex-sql-execute (cmd) (with-mutex-sql (conn) (sql-execute cmd conn))) (defun mutex-sql-query (cmd &key (types :auto)) (with-mutex-sql (conn) (sql-query cmd conn :types types)))