[pypy-svn] r69658 - in pypy/trunk/pypy/module/oracle: . test

afa at codespeak.net afa at codespeak.net
Thu Nov 26 16:55:22 CET 2009


Author: afa
Date: Thu Nov 26 16:55:22 2009
New Revision: 69658

Modified:
   pypy/trunk/pypy/module/oracle/interp_connect.py
   pypy/trunk/pypy/module/oracle/interp_pool.py
   pypy/trunk/pypy/module/oracle/roci.py
   pypy/trunk/pypy/module/oracle/test/test_connect.py
Log:
Test and fix for proxy connections


Modified: pypy/trunk/pypy/module/oracle/interp_connect.py
==============================================================================
--- pypy/trunk/pypy/module/oracle/interp_connect.py	(original)
+++ pypy/trunk/pypy/module/oracle/interp_connect.py	Thu Nov 26 16:55:22 2009
@@ -22,6 +22,7 @@
         self.autocommit = False
 
         self.sessionHandle = None
+        self.serverHandle = None
 
         self.w_inputTypeHandler = None
         self.w_outputTypeHandler = None
@@ -70,7 +71,7 @@
                 space.call_method(self.w_password, 'split',
                                   space.wrap('@'), space.wrap(1)))
 
-        if pool or w_cclass:
+        if pool or w_cclass is not None:
             self.getConnection(space, pool, w_cclass, purity)
         else:
             self.connect(space, mode, twophase)
@@ -246,7 +247,7 @@
             w_dbname = pool.w_name
             mode = roci.OCI_SESSGET_SPOOL
             if not pool.homogeneous and pool.w_username and self.w_username:
-                proxyCredentials = space.ne(pool.w_username, self.w_username)
+                proxyCredentials = space.is_true(space.ne(pool.w_username, self.w_username))
                 mode |= roci.OCI_SESSGET_CREDPROXY
         else:
             w_dbname = self.w_tnsentry
@@ -257,13 +258,20 @@
         # set up authorization handle, if needed
         if not pool or w_cclass or proxyCredentials:
             # create authorization handle
-            status = roci.OCIHandleAlloc(
-                self.environment.handle,
-                handleptr,
-                roci.HTYPE_AUTHINFO,
-                0, None)
-            self.environment.checkForError(
-                status, "Connection_GetConnection(): allocate handle")
+            handleptr = lltype.malloc(rffi.CArrayPtr(roci.OCIServer).TO,
+                                      1, flavor='raw')
+            try:
+                status = roci.OCIHandleAlloc(
+                    self.environment.handle,
+                    handleptr,
+                    roci.OCI_HTYPE_AUTHINFO,
+                    0, lltype.nullptr(rffi.CArray(roci.dvoidp)))
+                self.environment.checkForError(
+                    status, "Connection_GetConnection(): allocate handle")
+
+                authInfo = handleptr[0]
+            finally:
+                lltype.free(handleptr, flavor='raw')
 
             externalCredentials = True
 
@@ -320,19 +328,21 @@
                 stringBuffer.clear()
 
             # set the purity, if applicable
-            purityptr = lltype.malloc(rffi.CArrayPtr(roci.ub4).TO,
-                                      1, flavor='raw')
-            try:
-                status = roci.OCIAttrSet(
-                    authInfo,
-                    roci.OCI_HTYPE_AUTHINFO,
-                    purityptr, rffi.sizeof(roci.ub4),
-                    roci.OCI_ATTR_PURITY,
-                    self.environment.errorHandle)
-                self.environment.checkForError(
-                    status, "Connection_GetConnection(): set purity")
-            finally:
-                lltype.free(purityptr, flavor='raw')
+            if purity != roci.OCI_ATTR_PURITY_DEFAULT:
+                purityptr = lltype.malloc(rffi.CArrayPtr(roci.ub4).TO,
+                                          1, flavor='raw')
+                purityptr[0] = purity
+                try:
+                    status = roci.OCIAttrSet(
+                        authInfo,
+                        roci.OCI_HTYPE_AUTHINFO,
+                        purityptr, rffi.sizeof(roci.ub4),
+                        roci.OCI_ATTR_PURITY,
+                        self.environment.errorHandle)
+                    self.environment.checkForError(
+                        status, "Connection_GetConnection(): set purity")
+                finally:
+                    lltype.free(purityptr, flavor='raw')
 
         # acquire the new session
         stringBuffer.fill(space, w_dbname)

Modified: pypy/trunk/pypy/module/oracle/interp_pool.py
==============================================================================
--- pypy/trunk/pypy/module/oracle/interp_pool.py	(original)
+++ pypy/trunk/pypy/module/oracle/interp_pool.py	Thu Nov 26 16:55:22 2009
@@ -4,6 +4,7 @@
 from pypy.interpreter.gateway import interp2app
 from pypy.interpreter.typedef import TypeDef, GetSetProperty
 from pypy.interpreter.typedef import interp_attrproperty, interp_attrproperty_w
+from pypy.interpreter.error import OperationError
 from pypy.rpython.lltypesystem import rffi, lltype
 
 Null = NoneNotWrapped
@@ -205,6 +206,7 @@
     min = interp_attrproperty('minSessions', W_SessionPool),
     max = interp_attrproperty('maxSessions', W_SessionPool),
     increment = interp_attrproperty('sessionIncrement', W_SessionPool),
+    homogeneous = interp_attrproperty('homogeneous', W_SessionPool),
     opened = computedProperty(roci.OCI_ATTR_SPOOL_OPEN_COUNT, roci.ub4),
     busy = computedProperty(roci.OCI_ATTR_SPOOL_BUSY_COUNT, roci.ub4),
     timeout = computedProperty(roci.OCI_ATTR_SPOOL_TIMEOUT, roci.ub4),

Modified: pypy/trunk/pypy/module/oracle/roci.py
==============================================================================
--- pypy/trunk/pypy/module/oracle/roci.py	(original)
+++ pypy/trunk/pypy/module/oracle/roci.py	Thu Nov 26 16:55:22 2009
@@ -56,6 +56,7 @@
     OCI_SUCCESS OCI_SUCCESS_WITH_INFO OCI_INVALID_HANDLE OCI_NO_DATA
     OCI_HTYPE_ERROR OCI_HTYPE_SVCCTX OCI_HTYPE_SERVER OCI_HTYPE_SESSION
     OCI_HTYPE_STMT OCI_HTYPE_DESCRIBE OCI_HTYPE_ENV OCI_HTYPE_SPOOL
+    OCI_HTYPE_AUTHINFO
     OCI_DTYPE_PARAM OCI_DTYPE_TIMESTAMP OCI_DTYPE_INTERVAL_DS OCI_DTYPE_LOB
     OCI_CRED_RDBMS OCI_CRED_EXT OCI_SPOOL_ATTRVAL_NOWAIT
     OCI_ATTR_SERVER OCI_ATTR_SESSION OCI_ATTR_USERNAME OCI_ATTR_PASSWORD
@@ -68,7 +69,7 @@
     OCI_ATTR_CHARSET_FORM OCI_ATTR_ENV_CHARSET_ID
     OCI_ATTR_PARSE_ERROR_OFFSET
     OCI_ATTR_SPOOL_OPEN_COUNT OCI_ATTR_SPOOL_BUSY_COUNT OCI_ATTR_SPOOL_TIMEOUT
-    OCI_ATTR_SPOOL_GETMODE
+    OCI_ATTR_SPOOL_GETMODE OCI_ATTR_PURITY
     OCI_NTV_SYNTAX OCI_COMMIT_ON_SUCCESS
     OCI_FETCH_NEXT
     OCI_IND_NULL OCI_IND_NOTNULL
@@ -90,7 +91,7 @@
     OCI_NLS_MAXBUFSZ OCI_NLS_CS_ORA_TO_IANA
     OCI_SPC_STMTCACHE OCI_SPC_HOMOGENEOUS
     OCI_SESSGET_SPOOL OCI_SESSGET_CREDPROXY OCI_SESSGET_STMTCACHE
-    OCI_SESSRLS_DROPSESS
+    OCI_SESSRLS_DROPSESS OCI_ATTR_PURITY_DEFAULT
     '''.split()
 
     for c in constants:

Modified: pypy/trunk/pypy/module/oracle/test/test_connect.py
==============================================================================
--- pypy/trunk/pypy/module/oracle/test/test_connect.py	(original)
+++ pypy/trunk/pypy/module/oracle/test/test_connect.py	Thu Nov 26 16:55:22 2009
@@ -146,3 +146,17 @@
         del c2
         import gc; gc.collect()
         assert pool.busy == 1
+
+    def test_proxy_auth(self):
+        pool = oracle.SessionPool(self.username, self.password,
+                                  self.tnsentry,
+                                  2, 8, 3)
+        assert pool.homogeneous is True
+        raises(oracle.ProgrammingError, pool.acquire, user="proxyuser")
+        pool = oracle.SessionPool(self.username, self.password,
+                                  self.tnsentry,
+                                  2, 8, 3, homogeneous=False)
+        assert pool.homogeneous is False
+        e = raises(oracle.DatabaseError, pool.acquire, user="proxyuser")
+        # ORA-28150: proxy not authorized to connect as client
+        assert e.value[0].code == 28150



More information about the Pypy-commit mailing list