summaryrefslogtreecommitdiff
path: root/db-aodbc/aodbc-sql.lisp
diff options
context:
space:
mode:
Diffstat (limited to 'db-aodbc/aodbc-sql.lisp')
-rw-r--r--db-aodbc/aodbc-sql.lisp102
1 files changed, 102 insertions, 0 deletions
diff --git a/db-aodbc/aodbc-sql.lisp b/db-aodbc/aodbc-sql.lisp
new file mode 100644
index 0000000..98f9ec8
--- /dev/null
+++ b/db-aodbc/aodbc-sql.lisp
@@ -0,0 +1,102 @@
+;;;; -*- Mode: LISP; Syntax: ANSI-Common-Lisp; Base: 10 -*-
+;;;; *************************************************************************
+;;;; FILE IDENTIFICATION
+;;;;
+;;;; Name: aodbc-sql.cl
+;;;; Purpose: Low-level interface for CLSQL AODBC backend
+;;;; Programmer: Kevin M. Rosenberg
+;;;; Date Started: Feb 2002
+;;;;
+;;;; This file, part of CLSQL, is Copyright (c) 2002 by Kevin M. Rosenberg
+;;;;
+;;;; CLSQL users are granted the rights to distribute and use this software
+;;;; as governed by the terms of the Lisp Lesser GNU Public License
+;;;; (http://opensource.franz.com/preamble.html), also known as the LLGPL.
+;;;; *************************************************************************
+
+(in-package #:clsql-aodbc)
+
+;; interface foreign library loading routines
+(defmethod clsql-sys:database-type-library-loaded ((database-type (eql :aodbc)))
+ "T if foreign library was able to be loaded successfully. "
+ (when (find-package :dbi) ;; finds Allegro's DBI (AODBC) package
+ t))
+
+(defmethod clsql-sys:database-type-load-foreign ((databae-type (eql :aodbc)))
+ t)
+
+(when (find-package :dbi)
+ (clsql-sys:database-type-load-foreign :aodbc))
+
+
+;; AODBC interface
+
+(defclass aodbc-database (generic-odbc-database)
+ ((aodbc-db-type :accessor database-aodbc-db-type :initform :unknown)))
+
+(defmethod database-name-from-spec (connection-spec
+ (database-type (eql :aodbc)))
+ (check-connection-spec connection-spec database-type (dsn user password))
+ (destructuring-bind (dsn user password) connection-spec
+ (declare (ignore password))
+ (concatenate 'string dsn "/" user)))
+
+(defmethod database-connect (connection-spec (database-type (eql :aodbc)))
+ (check-connection-spec connection-spec database-type (dsn user password))
+ #+aodbc-v2
+ (destructuring-bind (dsn user password) connection-spec
+ (handler-case
+ (make-instance 'aodbc-database
+ :name (database-name-from-spec connection-spec :aodbc)
+ :database-type :aodbc
+ :dbi-package (find-package '#:dbi)
+ :odbc-conn
+ (dbi:connect :user user
+ :password password
+ :data-source-name dsn))
+ (sql-error (e)
+ (error e))
+ (error () ;; Init or Connect failed
+ (error 'sql-connection-error
+ :database-type database-type
+ :connection-spec connection-spec
+ :message "Connection failed")))))
+
+
+(defmethod database-query (query-expression (database aodbc-database)
+ result-types field-names)
+ #+aodbc-v2
+ (handler-case
+ (dbi:sql query-expression
+ :db (clsql-sys::odbc-conn database)
+ :types result-types
+ :column-names field-names)
+ #+ignore
+ (error ()
+ (error 'sql-database-data-error
+ :database database
+ :expression query-expression
+ :message "Query failed"))))
+
+(defmethod database-create (connection-spec (type (eql :aodbc)))
+ (warn "Not implemented."))
+
+(defmethod database-destroy (connection-spec (type (eql :aodbc)))
+ (warn "Not implemented."))
+
+(defmethod database-probe (connection-spec (type (eql :aodbc)))
+ (warn "Not implemented."))
+
+;;; Backend capabilities
+
+(defmethod database-underlying-type ((database aodbc-database))
+ (database-aodbc-db-type database))
+
+(defmethod db-backend-has-create/destroy-db? ((db-type (eql :aodbc)))
+ nil)
+
+(defmethod database-initialize-database-type ((database-type (eql :aodbc)))
+ t)
+
+(when (clsql-sys:database-type-library-loaded :aodbc)
+ (clsql-sys:initialize-database-type :database-type :aodbc))