X-Git-Url: http://git.kpe.io/?p=clsql.git;a=blobdiff_plain;f=db-db2%2Fdb2-sql.lisp;h=16aa2165cf3613808749948aa2b7440843f2b237;hp=788d491a76e54ff870fbac0267d11ccb4d566f98;hb=44cd3f817f6f59ffe495db4cf2b9ea4637a57f75;hpb=2f1b6b521b5c68e249428209a7da57f75e55da47 diff --git a/db-db2/db2-sql.lisp b/db-db2/db2-sql.lisp index 788d491..16aa216 100644 --- a/db-db2/db2-sql.lisp +++ b/db-db2/db2-sql.lisp @@ -18,3 +18,55 @@ (defmethod database-initialize-database-type ((database-type (eql :db2))) t) +(defclass db2-database (database) + ((henv :initform nil :allocation :class :initarg :henv :accessor henv) + (hdbc :initform nil :initarg :hdbc :accessor hdbc))) + + +(defmethod database-name-from-spec (connection-spec + (database-type (eql :db2))) + (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 :db2))) + (check-connection-spec connection-spec database-type (dsn user password)) + (destructuring-bind (server user password) connection-spec + (handler-case + (let ((db (make-instance 'db2-database + :name (database-name-from-spec connection-spec :db2) + :database-type :db2))) + (db2-connect db server user password) + db) + (error () ;; Init or Connect failed + (error 'sql-connection-error + :database-type database-type + :connection-spec connection-spec + :message "Connection failed"))))) + + +;; API Functions + +(uffi:def-type handle-type cli-handle) +(uffi:def-type handle-ptr-type (* cli-handle)) + +(defmacro deref-vp (foreign-object) + `(the handle-type (uffi:deref-pointer (the handle-ptr-type ,foreign-object) cli-handle))) + +(defun db2-connect (db server user password) + (let ((henv (uffi:allocate-foreign-object cli-handle)) + (hdbc (uffi:allocate-foreign-object cli-handle))) + (sql-alloc-handle SQL_HANDLE_ENV SQL_NULL_HANDLE henv) + (setf (slot-value db 'henv) henv) + (setf (slot-value db 'hdbc) hdbc) + + (sql-alloc-handle SQL_HANDLE_DBC (deref-vp henv) hdbc) + (uffi:with-cstrings ((native-server server) + (native-user user) + (native-password password)) + (sql-connect (deref-vp hdbc) + native-server SQL_NTS + native-user SQL_NTS + native-password SQL_NTS))) + db)