[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