r9457: Reworked CLSQL file structure.
[clsql.git] / db-oracle / oracle-sql.lisp
index aedff1bab29dc4cb5889f0f75cdb634f0f3e4dca..f71b7f772836820ea7cb0b30938de3792e3a22e3 100644 (file)
@@ -51,8 +51,8 @@ likely that we'll have to worry about the CMUCL limit."))
 (eval-when (:compile-toplevel :load-toplevel :execute)
   (defconstant SQLT-NUMBER 2)
   (defconstant SQLT-INT 3)
-  (defconstant SQLT-STR 5)
   (defconstant SQLT-FLT 4)
+  (defconstant SQLT-STR 5)
   (defconstant SQLT-DATE 12))
 
 ;;; Note that despite the suggestive class name (and the way that the
@@ -105,7 +105,7 @@ output format.  In order to extract date strings from output buffers
 holding multiple date strings in fixed-width fields, we need to know
 the length of that format.")
    (server-version 
-    :type string
+    :type (or null string)
     :initarg :server-version
     :reader server-version
     :documentation
@@ -117,7 +117,7 @@ the length of that format.")
     :documentation
     "The major version number of the Oracle server, should be 8, 9, or 10")
    (client-version 
-    :type string
+    :type (or null string)
     :initarg :client-version
     :reader client-version
     :documentation
@@ -146,9 +146,12 @@ the length of that format.")
                   (uffi:ensure-char-storable (code-char 0)))
 
              (setf (uffi:deref-pointer errcode :long) 0)
-             (oci-error-get (deref-vp errhp) 1
-                           (uffi:make-null-pointer :unsigned-char)
-                           errcode errbuf +errbuf-len+ +oci-htype-error+)
+            (uffi:with-cstring (sqlstate nil)
+              (oci-error-get (deref-vp errhp) 1
+                             sqlstate
+                             errcode
+                             (uffi:char-array-to-pointer errbuf)
+                             +errbuf-len+ +oci-htype-error+))
              (let ((subcode (uffi:deref-pointer errcode :long)))
                (unless (and nulls-ok (= subcode +null-value-returned+))
                  (error 'sql-database-error
@@ -208,10 +211,10 @@ the length of that format.")
 ;; In order to map the "same string" property above onto Lisp equality,
 ;; we drop trailing spaces in all cases:
 
-(uffi:def-type string-array (:array :unsigned-char))
+(uffi:def-type string-pointer (* :unsigned-char))
 
 (defun deref-oci-string (arrayptr string-index size)
-;;  (declare (type string-array arrayptr))
+  (declare (type string-pointer arrayptr))
   (declare (type (mod #.+n-buf-rows+) string-index))
   (declare (type (and unsigned-byte fixnum) size))
   (let* ((raw (uffi:convert-from-foreign-string 
@@ -654,9 +657,10 @@ the length of that format.")
                             (deref-vp errhp))
               (let ((*scale (uffi:deref-pointer scale :byte))
                     (*precision (uffi:deref-pointer precision :byte)))
-                ;;(format t "scale=~d, precision=~d~%" *scale *precision)
+                
+                ;; (format t "scale=~d, precision=~d~%" *scale *precision)
                 (cond
-                 ((or (zerop *scale)
+                 ((or (and (zerop *scale) (not (zerop *precision)))
                       (and (minusp *scale) (< *precision 10)))
                   (setf buffer (acquire-foreign-resource :int +n-buf-rows+)
                         sizeof 4                       ;; sizeof(int)
@@ -907,18 +911,14 @@ the length of that format.")
          (push row reversed-result))))))
 
 
-(defmethod database-create-sequence
-  (sequence-name (database oracle-database))
+(defmethod database-create-sequence (sequence-name (database oracle-database))
   (execute-command
-   (concatenate 'string "CREATE SEQUENCE "
-               (sql-escape sequence-name))
+   (concatenate 'string "CREATE SEQUENCE " (sql-escape sequence-name))
    :database database))
 
-(defmethod database-drop-sequence
-  (sequence-name (database oracle-database))
+(defmethod database-drop-sequence (sequence-name (database oracle-database))
   (execute-command
-   (concatenate 'string "DROP SEQUENCE "
-               (sql-escape sequence-name))
+   (concatenate 'string "DROP SEQUENCE " (sql-escape sequence-name))
    :database database))
 
 (defmethod database-sequence-next (sequence-name (database oracle-database))
@@ -930,7 +930,8 @@ the length of that format.")
                 )
     database :auto nil)))
 
-(defmethod database-set-sequence-position (name position database)
+;; FIXME: use lock
+(defmethod database-set-sequence-position (name position (database oracle-database))
   (let* ((next (database-sequence-next name database))
         (incr (- position next)))
     (database-execute-command
@@ -1022,7 +1023,8 @@ the length of that format.")
       list)))
 
 (defmethod clsql-sys:database-start-transaction ((database oracle-database))
-  (call-next-method))
+  (call-next-method)
+  )
 
 ;;(with-slots (svchp errhp) database
 ;;    (osucc (oci-trans-start (uffi:deref-pointer svchp)