From e105d1c4963b50edb966b2a3049bbe02ecdfabff Mon Sep 17 00:00:00 2001 From: "Kevin M. Rosenberg" Date: Tue, 15 Nov 2005 02:44:14 +0000 Subject: [PATCH] r10836: 14 Nov 2005 Kevin Rosenberg * Version 3.4.4 [ Requires UFFI 1.5.7+] * db-oracle/oracle-{api,sql}.lisp: Patch from James Biel to fix lifetime of foreign strings for Oracle calls --- ChangeLog | 7 ++- db-oracle/oracle-api.lisp | 8 +-- db-oracle/oracle-sql.lisp | 114 +++++++++++++++++--------------------- debian/changelog | 6 ++ 4 files changed, 68 insertions(+), 67 deletions(-) diff --git a/ChangeLog b/ChangeLog index c011dca..3b83773 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,8 +1,13 @@ +14 Nov 2005 Kevin Rosenberg + * Version 3.4.4 [ Requires UFFI 1.5.7+] + * db-oracle/oracle-{api,sql}.lisp: Patch from James Biel + to fix lifetime of foreign strings for Oracle calls + 13 Nov 2005 Kevin Rosenberg * Version 3.4.3 * db-oracle/oracle-{api,sql}.lisp: Patch from James Biel to improve performance - + 12 Nov 2005 Kevin Rosenberg * Version 3.4.2 * clsql-uffi.asd: Patch from James Biel improving loading diff --git a/db-oracle/oracle-api.lisp b/db-oracle/oracle-api.lisp index 454011f..377c3f3 100644 --- a/db-oracle/oracle-api.lisp +++ b/db-oracle/oracle-api.lisp @@ -132,11 +132,11 @@ (envhp :pointer-void) ; env (errhp :pointer-void) ; err (svchpp (* :pointer-void)) ; svc - (username :cstring) ; username + (username (* :unsigned-char)) ; username (uname-len ub4) ; - (passwd :cstring) ; passwd + (passwd (* :unsigned-char)) ; passwd (password-len ub4) ; - (dsn :cstring) ; datasource + (dsn (* :unsigned-char)) ; datasource (dsn-len ub4)) ; (def-oci-routine ("OCILogoff" oci-logoff) @@ -159,7 +159,7 @@ :int (stmtp :pointer-void) (errhp :pointer-void) - (stmt :cstring) + (stmt (* :unsigned-char)) (stmt_len ub4) (language ub4) (mode ub4)) diff --git a/db-oracle/oracle-sql.lisp b/db-oracle/oracle-sql.lisp index b18bad7..6a6aa3f 100644 --- a/db-oracle/oracle-sql.lisp +++ b/db-oracle/oracle-sql.lisp @@ -498,46 +498,47 @@ the length of that format.") (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-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) - (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-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 @@ -795,6 +796,7 @@ the length of that format.") (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+ @@ -803,27 +805,12 @@ the length of that format.") +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) @@ -834,13 +821,16 @@ the length of that format.") :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 diff --git a/debian/changelog b/debian/changelog index 22a5573..29a55fb 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +cl-sql (3.4.4-1) unstable; urgency=low + + * New upstream + + -- Kevin M. Rosenberg Mon, 14 Nov 2005 19:41:24 -0700 + cl-sql (3.4.3-1) unstable; urgency=low * New upstream -- 2.34.1