(defmacro deref-vp (foreign-object)
`(the vp-type (uffi:deref-pointer (the vpp-type ,foreign-object) :pointer-void)))
-(defvar +unsigned-char-null-pointer+
+(uffi:def-pointer-var +unsigned-char-null-pointer+
(uffi:make-null-pointer :unsigned-char))
-(defvar +unsigned-short-null-pointer+
+(uffi:def-pointer-var +unsigned-short-null-pointer+
(uffi:make-null-pointer :unsigned-short))
-(defvar +unsigned-int-null-pointer+
+(uffi:def-pointer-var +unsigned-int-null-pointer+
(uffi:make-null-pointer :unsigned-int))
;; constants - from OCI?
(date-format
:initarg :date-format
:reader date-format
- :initform "YYYY-MM-DD HH24:MI:SS\"+00\"")
+ :initform "YYYY-MM-DD HH24:MI:SS\".0\"")
(date-format-length
:type number
:documentation
(cond
(database
(with-slots (errhp) database
- (uffi:with-foreign-objects ((errcode 'sb4)
- (errbuf '(:array :unsigned-char #.+errbuf-len+)))
+ (let ((errcode (uffi:allocate-foreign-object 'sb4))
+ (errbuf (uffi:allocate-foreign-string #.+errbuf-len+)))
;; ensure errbuf empty string
(setf (uffi:deref-array errbuf '(:array :unsigned-char) 0)
(uffi:ensure-char-storable (code-char 0)))
+errbuf-len+ +oci-htype-error+))
(let ((subcode (uffi:deref-pointer errcode 'sb4))
(errstr (uffi:convert-from-foreign-string errbuf)))
+ (uffi:free-foreign-object errcode)
+ (uffi:free-foreign-object errbuf)
(unless (and nulls-ok (= subcode +null-value-returned+))
(error 'sql-database-error
:database database
(defun sql-stmt-exec (sql-stmt-string db result-types field-names)
(with-slots (envhp svchp errhp) db
- (let ((stmthp (uffi:allocate-foreign-object :pointer-void))
- select-p)
-
- (uffi:with-foreign-object (stmttype :unsigned-short)
- (unwind-protect
- (progn
- (oci-handle-alloc (deref-vp envhp)
- stmthp
- +oci-htype-stmt+ 0 +null-void-pointer-pointer+)
- (oci-stmt-prepare (deref-vp stmthp)
- (deref-vp errhp)
- (uffi:convert-to-cstring sql-stmt-string)
- (length sql-stmt-string)
- +oci-ntv-syntax+ +oci-default+ :database db)
- (oci-attr-get (deref-vp stmthp)
- +oci-htype-stmt+
- stmttype
- +unsigned-int-null-pointer+
- +oci-attr-stmt-type+
- (deref-vp errhp)
- :database db)
-
- (setq select-p (= (uffi:deref-pointer stmttype :unsigned-short) 1))
- (let ((iters (if select-p 0 1)))
-
- (oci-stmt-execute (deref-vp svchp)
- (deref-vp stmthp)
- (deref-vp errhp)
- iters 0 +null-void-pointer+ +null-void-pointer+ +oci-default+
- :database db)))
- ;; free resources unless a query
- (unless select-p
- (oci-handle-free (deref-vp stmthp) +oci-htype-stmt+)
- (uffi:free-foreign-object stmthp))))
-
- (cond
- (select-p
- (make-query-cursor db stmthp result-types field-names))
- (t
- nil)))))
+ (uffi:with-foreign-strings ((c-stmt-string sql-stmt-string))
+ (let ((stmthp (uffi:allocate-foreign-object :pointer-void))
+ select-p)
+
+ (uffi:with-foreign-object (stmttype :unsigned-short)
+ (unwind-protect
+ (progn
+ (oci-handle-alloc (deref-vp envhp)
+ stmthp
+ +oci-htype-stmt+ 0 +null-void-pointer-pointer+)
+ (oci-stmt-prepare (deref-vp stmthp)
+ (deref-vp errhp)
+ c-stmt-string
+ (length sql-stmt-string)
+ +oci-ntv-syntax+ +oci-default+ :database db)
+ (oci-attr-get (deref-vp stmthp)
+ +oci-htype-stmt+
+ stmttype
+ +unsigned-int-null-pointer+
+ +oci-attr-stmt-type+
+ (deref-vp errhp)
+ :database db)
+
+ (setq select-p (= (uffi:deref-pointer stmttype :unsigned-short) 1))
+ (let ((iters (if select-p 0 1)))
+
+ (oci-stmt-execute (deref-vp svchp)
+ (deref-vp stmthp)
+ (deref-vp errhp)
+ iters 0 +null-void-pointer+ +null-void-pointer+ +oci-default+
+ :database db)))
+ ;; free resources unless a query
+ (unless select-p
+ (oci-handle-free (deref-vp stmthp) +oci-htype-stmt+)
+ (uffi:free-foreign-object stmthp))))
+
+ (cond
+ (select-p
+ (make-query-cursor db stmthp result-types field-names))
+ (t
+ nil))))))
;; Return a QUERY-CURSOR representing the table returned from the OCI
(colname '(* :unsigned-char))
(colnamelen 'ub4)
(colsize 'ub2)
- (colsizesize 'ub4)
(defnp ':pointer-void))
(let ((buffer nil)
(sizeof nil))
(oci-env-create envhp +oci-default+ +null-void-pointer+
+null-void-pointer+ +null-void-pointer+
+null-void-pointer+ 0 +null-void-pointer-pointer+)
+
#+oci7
(progn
(oci-initialize +oci-object+ +null-void-pointer+ +null-void-pointer+
+oci-htype-env+ 0
+null-void-pointer-pointer+)) ;no testing return
(oci-env-init envhp +oci-default+ 0 +null-void-pointer-pointer+))
+
(oci-handle-alloc (deref-vp envhp) errhp
+oci-htype-error+ 0 +null-void-pointer-pointer+)
(oci-handle-alloc (deref-vp envhp) srvhp
+oci-htype-server+ 0 +null-void-pointer-pointer+)
- #+ignore ;; not used since CLSQL uses the OCILogon function instead
- (uffi:with-cstring (dblink nil)
- (oci-server-attach (deref-vp srvhp)
- (deref-vp errhp)
- dblink
- 0 +oci-default+))
-
- (oci-handle-alloc (deref-vp envhp) svchp
- +oci-htype-svcctx+ 0 +null-void-pointer-pointer+)
- (oci-attr-set (deref-vp svchp)
- +oci-htype-svcctx+
- (deref-vp srvhp) 0 +oci-attr-server+
- (deref-vp errhp))
- ;; oci-handle-alloc((dvoid *)encvhp, (dvoid **)&stmthp, OCI_HTYPE_STMT, 0, 0);
- ;;#+nil
-
(let ((db (make-instance 'oracle-database
:name (database-name-from-spec connection-spec
database-type)
:svchp svchp
:dsn data-source-name
:user user)))
- (oci-logon (deref-vp envhp)
- (deref-vp errhp)
- svchp
- (uffi:convert-to-cstring user) (length user)
- (uffi:convert-to-cstring password) (length password)
- (uffi:convert-to-cstring data-source-name) (length data-source-name)
- :database db)
+ (uffi:with-foreign-strings ((c-user user)
+ (c-password password)
+ (c-data-source-name data-source-name))
+ (oci-logon (deref-vp envhp)
+ (deref-vp errhp)
+ svchp
+ c-user (length user)
+ c-password (length password)
+ c-data-source-name (length data-source-name)
+ :database db))
;; :date-format-length (1+ (length date-format)))))
(setf (slot-value db 'clsql-sys::state) :open)
(database-execute-command