;;;; *************************************************************************
(defpackage #:clsql-mysql
- (:use #:common-lisp #:clsql-base #:mysql #:clsql-uffi)
+ (:use #:common-lisp #:clsql-sys #:mysql #:clsql-uffi)
(:export #:mysql-database)
(:documentation "This is the CLSQL interface to MySQL."))
(let ((mysql-ptr (mysql-init (uffi:make-null-pointer 'mysql-mysql)))
(socket nil))
(if (uffi:null-pointer-p mysql-ptr)
- (error 'clsql-connect-error
+ (error 'sql-connection-error
:database-type database-type
:connection-spec connection-spec
- :errno (mysql-errno mysql-ptr)
- :error (mysql-error-string mysql-ptr))
+ :error-id (mysql-errno mysql-ptr)
+ :message (mysql-error-string mysql-ptr))
(uffi:with-cstrings ((host-native host)
(user-native user)
(password-native password)
db-native 0 socket-native 0))
(progn
(setq error-occurred t)
- (error 'clsql-connect-error
+ (error 'sql-connection-error
:database-type database-type
:connection-spec connection-spec
- :errno (mysql-errno mysql-ptr)
- :error (mysql-error-string mysql-ptr)))
+ :error-id (mysql-errno mysql-ptr)
+ :message (mysql-error-string mysql-ptr)))
(make-instance 'mysql-database
:name (database-name-from-spec connection-spec
database-type)
(when field-names
(result-field-names num-fields res-ptr))))
(mysql-free-result res-ptr))
- (error 'clsql-sql-error
+ (error 'sql-database-data-error
:database database
:expression query-expression
- :errno (mysql-errno mysql-ptr)
- :error (mysql-error-string mysql-ptr))))
- (error 'clsql-sql-error
+ :error-id (mysql-errno mysql-ptr)
+ :message (mysql-error-string mysql-ptr))))
+ (error 'sql-database-data-error
:database database
:expression query-expression
- :errno (mysql-errno mysql-ptr)
- :error (mysql-error-string mysql-ptr))))))
+ :error-id (mysql-errno mysql-ptr)
+ :message (mysql-error-string mysql-ptr))))))
(defmethod database-execute-command (sql-expression (database mysql-database))
(uffi:with-cstring (sql-native sql-expression)
(if (zerop (mysql-real-query mysql-ptr sql-native
(length sql-expression)))
t
- (error 'clsql-sql-error
+ (error 'sql-database-data-error
:database database
:expression sql-expression
- :errno (mysql-errno mysql-ptr)
- :error (mysql-error-string mysql-ptr))))))
+ :error-id (mysql-errno mysql-ptr)
+ :message (mysql-error-string mysql-ptr))))))
(defstruct mysql-result-set
(mysql-num-rows res-ptr))
(values result-set
num-fields)))
- (error 'clsql-sql-error
+ (error 'sql-database-data-error
:database database
:expression query-expression
- :errno (mysql-errno mysql-ptr)
- :error (mysql-error-string mysql-ptr))))
- (error 'clsql-sql-error
+ :error-id (mysql-errno mysql-ptr)
+ :message (mysql-error-string mysql-ptr))))
+ (error 'sql-database-data-error
:database database
:expression query-expression
- :errno (mysql-errno mysql-ptr)
- :error (mysql-error-string mysql-ptr))))))
+ :error-id (mysql-errno mysql-ptr)
+ :message (mysql-error-string mysql-ptr))))))
(defmethod database-dump-result-set (result-set (database mysql-database))
(mysql-free-result (mysql-result-set-res-ptr result-set))
(defmethod database-create (connection-spec (type (eql :mysql)))
(destructuring-bind (host name user password) connection-spec
(multiple-value-bind (output status)
- (clsql-base:command-output "mysqladmin create -u~A -p~A -h~A ~A"
+ (clsql-sys:command-output "mysqladmin create -u~A -p~A -h~A ~A"
user password
(if host host "localhost")
name)
(if (or (not (eql 0 status))
(and (search "failed" output) (search "error" output)))
- (error 'clsql-access-error
- :connection-spec connection-spec
- :database-type type
- :error
- (format nil "database-create failed: ~A" output))
- t))))
+ (error 'sql-database-error
+ :message
+ (format nil "mysql database creation failed with connection-spec ~A."
+ connection-spec))
+ t))))
(defmethod database-destroy (connection-spec (type (eql :mysql)))
(destructuring-bind (host name user password) connection-spec
(multiple-value-bind (output status)
- (clsql-base:command-output "mysqladmin drop -f -u~A -p~A -h~A ~A"
+ (clsql-sys:command-output "mysqladmin drop -f -u~A -p~A -h~A ~A"
user password
(if host host "localhost")
name)
(if (or (not (eql 0 status))
(and (search "failed" output) (search "error" output)))
- (error 'clsql-access-error
- :connection-spec connection-spec
- :database-type type
- :error
- (format nil "database-destroy failed: ~A" output))
+ (error 'sql-database-error
+ :message
+ (format nil "mysql database deletion failed with connection-spec ~A."
+ connection-spec))
t))))
(defmethod database-probe (connection-spec (type (eql :mysql)))
(let ((database (database-connect (list host "mysql" user password) type)))
(unwind-protect
(progn
- (setf (slot-value database 'clsql-base::state) :open)
+ (setf (slot-value database 'clsql-sys::state) :open)
(mapcar #'car (database-query "show databases" database :auto nil)))
(progn
(database-disconnect database)
- (setf (slot-value database 'clsql-base::state) :closed))))))
+ (setf (slot-value database 'clsql-sys::state) :closed))))))
;;; Database capabilities
(defmethod db-type-has-boolean-where? ((db-type (eql :mysql)))
nil)
+(defmethod db-type-has-union? ((db-type (eql :mysql)))
+ (not (eql (schar mysql::*mysql-client-info* 0) #\3)))
+
(defmethod db-type-transaction-capable? ((db-type (eql :mysql)) database)
(let ((tuple (car (database-query "SHOW VARIABLES LIKE 'HAVE_INNODB'" database :auto nil))))
(and tuple (string-equal "YES" (second tuple)))))
-(when (clsql-base:database-type-library-loaded :mysql)
- (clsql-base:initialize-database-type :database-type :mysql))
+(defmethod db-type-has-prepared-stmt? ((db-type (eql :mysql)))
+ #+mysql-client-v4.1 t
+ #-mysql-client-v4.1 nil)
+
+(when (clsql-sys:database-type-library-loaded :mysql)
+ (clsql-sys:initialize-database-type :database-type :mysql))