X-Git-Url: http://git.kpe.io/?p=clsql.git;a=blobdiff_plain;f=sql%2Fgeneric-odbc.lisp;h=706e4cf87c1d61588b57bd34727a9ac6fd46be8b;hp=d64db208b1b3a62b190b4773624ab67cd8adb12b;hb=0b35694f3659e5ee739ea72ce74d798c3f0ddb73;hpb=f103c1a5416d2f22820d66020e4f9c18c766d894 diff --git a/sql/generic-odbc.lisp b/sql/generic-odbc.lisp index d64db20..706e4cf 100644 --- a/sql/generic-odbc.lisp +++ b/sql/generic-odbc.lisp @@ -20,7 +20,8 @@ (close-query-fn :reader close-query-fn) (fetch-row :reader fetch-row-fn) (list-all-database-tables-fn :reader list-all-database-tables-fn) - (list-all-table-columns-fn :reader list-all-table-columns-fn)) + (list-all-table-columns-fn :reader list-all-table-columns-fn) + (odbc-db-type :accessor database-odbc-db-type :initarg :odbc-db-type )) (:documentation "Encapsulate same behavior across odbc and aodbc backends.")) (defmethod initialize-instance :after ((db generic-odbc-database) @@ -44,32 +45,6 @@ (slot-value db 'list-all-table-columns-fn) (intern (symbol-name '#:list-all-table-columns) pkg)))) -;;; Object methods - -(defmethod read-sql-value (val (type (eql 'boolean)) - (database generic-odbc-database) - (db-type (eql :postgresql))) - (if (string= "0" val) nil t)) - -(defmethod read-sql-value (val (type (eql 'generalized-boolean)) - (database generic-odbc-database) - (db-type (eql :postgresql))) - (if (string= "0" val) nil t)) - -(defmethod read-sql-value (val (type (eql 'boolean)) database - (db-type (eql :mssql))) - (declare (ignore database)) - (etypecase val - (string (if (string= "0" val) nil t)) - (integer (if (zerop val) nil t)))) - -(defmethod read-sql-value (val (type (eql 'generalized-boolean)) database - (db-type (eql :mssql))) - (declare (ignore database)) - (etypecase val - (string (if (string= "0" val) nil t)) - (integer (if (zerop val) nil t)))) - ;;; Type methods (defmethod database-get-type-specifier ((type symbol) args database @@ -272,3 +247,17 @@ on schema since that's what tends to be exposed. Some DBs like mssql (when size (parse-integer size)) (when precision (parse-integer precision)) (when scale (parse-integer scale)))))))) + +(defmethod database-last-auto-increment-id + ((database generic-odbc-database) table column) + (case (database-underlying-type database) + (:mssql + (first (clsql:query "SELECT SCOPE_IDENTITY()" + :flatp t + :database database + :result-types '(:int)))) + (t (if (next-method-p) + (call-next-method))))) + +(defmethod clsql-sys:db-type-has-auto-increment? ((db-underlying-type (eql :mssql))) + t)