def __init__(self, space, environment, context, retrieveError): self.context = context if retrieveError: if environment.errorHandle: handle = environment.errorHandle handleType = roci.OCI_HTYPE_ERROR else: handle = environment.handle handleType = roci.OCI_HTYPE_ENV codeptr = lltype.malloc(rffi.CArray(roci.sb4), 1, flavor='raw') BUFSIZE = 1024 textbuf, text = rffi.alloc_buffer(BUFSIZE) try: status = roci.OCIErrorGet( handle, 1, lltype.nullptr(roci.oratext.TO), codeptr, textbuf, BUFSIZE, handleType) if status != roci.OCI_SUCCESS: raise OperationError( get(space).w_InternalError, space.wrap("No Oracle error?")) self.code = codeptr[0] self.w_message = config.w_string(space, textbuf) finally: lltype.free(codeptr, flavor='raw') rffi.keep_buffer_alive_until_here(textbuf, text) if config.WITH_UNICODE: # XXX remove double zeros at the end pass
def _get_bind_info(self, space, numElements): # avoid bus errors on 64bit platforms numElements = numElements + (rffi.sizeof(roci.dvoidp) - numElements % rffi.sizeof(roci.dvoidp)) # initialize the buffers bindNames = lltype.malloc(roci.Ptr(roci.oratext).TO, numElements, flavor='raw') bindNameLengths = lltype.malloc(roci.Ptr(roci.ub1).TO, numElements, flavor='raw') indicatorNames = lltype.malloc(roci.Ptr(roci.oratext).TO, numElements, flavor='raw') indicatorNameLengths = lltype.malloc(roci.Ptr(roci.ub1).TO, numElements, flavor='raw') duplicate = lltype.malloc(roci.Ptr(roci.ub1).TO, numElements, flavor='raw') bindHandles = lltype.malloc(roci.Ptr(roci.OCIBind).TO, numElements, flavor='raw') foundElementsPtr = lltype.malloc(roci.Ptr(roci.sb4).TO, 1, flavor='raw') try: status = roci.OCIStmtGetBindInfo( self.handle, self.environment.errorHandle, numElements, 1, foundElementsPtr, bindNames, bindNameLengths, indicatorNames, indicatorNameLengths, duplicate, bindHandles) if status != roci.OCI_NO_DATA: self.environment.checkForError(status, "Cursor_GetBindNames()") # Too few elements allocated foundElements = rffi.cast(lltype.Signed, foundElementsPtr[0]) if foundElements < 0: return -foundElements, None names_w = [] # process the bind information returned for i in range(foundElements): if rffi.cast(lltype.Signed, duplicate[i]): continue names_w.append( w_string(space, bindNames[i], rffi.cast(lltype.Signed, bindNameLengths[i]))) return 0, names_w finally: lltype.free(bindNames, flavor='raw') lltype.free(bindNameLengths, flavor='raw') lltype.free(indicatorNames, flavor='raw') lltype.free(indicatorNameLengths, flavor='raw') lltype.free(duplicate, flavor='raw') lltype.free(bindHandles, flavor='raw') lltype.free(foundElementsPtr, flavor='raw')
def _get_bind_info(self, space, numElements): # avoid bus errors on 64bit platforms numElements = numElements + (rffi.sizeof(roci.dvoidp) - numElements % rffi.sizeof(roci.dvoidp)) # initialize the buffers bindNames = lltype.malloc(roci.Ptr(roci.oratext).TO, numElements, flavor='raw') bindNameLengths = lltype.malloc(roci.Ptr(roci.ub1).TO, numElements, flavor='raw') indicatorNames = lltype.malloc(roci.Ptr(roci.oratext).TO, numElements, flavor='raw') indicatorNameLengths = lltype.malloc(roci.Ptr(roci.ub1).TO, numElements, flavor='raw') duplicate = lltype.malloc(roci.Ptr(roci.ub1).TO, numElements, flavor='raw') bindHandles = lltype.malloc(roci.Ptr(roci.OCIBind).TO, numElements, flavor='raw') foundElementsPtr = lltype.malloc(roci.Ptr(roci.sb4).TO, 1, flavor='raw') try: status = roci.OCIStmtGetBindInfo( self.handle, self.environment.errorHandle, numElements, 1, foundElementsPtr, bindNames, bindNameLengths, indicatorNames, indicatorNameLengths, duplicate, bindHandles) if status != roci.OCI_NO_DATA: self.environment.checkForError( status, "Cursor_GetBindNames()") # Too few elements allocated foundElements = rffi.cast(lltype.Signed, foundElementsPtr[0]) if foundElements < 0: return -foundElements, None names_w = [] # process the bind information returned for i in range(foundElements): if rffi.cast(lltype.Signed, duplicate[i]): continue names_w.append( w_string(space, bindNames[i], rffi.cast(lltype.Signed, bindNameLengths[i]))) return 0, names_w finally: lltype.free(bindNames, flavor='raw') lltype.free(bindNameLengths, flavor='raw') lltype.free(indicatorNames, flavor='raw') lltype.free(indicatorNameLengths, flavor='raw') lltype.free(duplicate, flavor='raw') lltype.free(bindHandles, flavor='raw') lltype.free(foundElementsPtr, flavor='raw')
def convertObject(space, environment, typeCode, value, indicator, var, subtype): # null values returned as None if (rffi.cast(lltype.Signed, rffi.cast(roci.Ptr(roci.OCIInd), indicator)[0]) == rffi.cast(lltype.Signed, roci.OCI_IND_NULL)): return space.w_None if typeCode in (roci.OCI_TYPECODE_CHAR, roci.OCI_TYPECODE_VARCHAR, roci.OCI_TYPECODE_VARCHAR2): strValue = rffi.cast(roci.Ptr(roci.OCIString), value)[0] ptr = roci.OCIStringPtr(environment.handle, strValue) size = roci.OCIStringSize(environment.handle, strValue) return config.w_string(space, ptr, rffi.cast(lltype.Signed, size)) elif typeCode == roci.OCI_TYPECODE_NUMBER: return transform.OracleNumberToPythonFloat( environment, rffi.cast(roci.Ptr(roci.OCINumber), value)) elif typeCode == roci.OCI_TYPECODE_DATE: dateValue = rffi.cast(roci.Ptr(roci.OCIDate), value) return transform.OracleDateToPythonDateTime(environment, dateValue) elif typeCode == roci.OCI_TYPECODE_TIMESTAMP: dateValue = rffi.cast(roci.Ptr(roci.OCIDateTime), value) return transform.OracleTimestampToPythonDate(environment, dateValue) elif typeCode == roci.OCI_TYPECODE_OBJECT: return space.wrap(W_ExternalObject(var, subtype, value, indicator, isIndependent=False)) elif typeCode == roci.OCI_TYPECODE_NAMEDCOLLECTION: return convertCollection(space, environment, value, var, subtype) raise OperationError( get(space).w_NotSupportedError, space.wrap( "ExternalObjectVar_GetAttributeValue(): unhandled data type %d" % ( typeCode,)))
def convertObject(space, environment, typeCode, value, indicator, var, subtype): # null values returned as None if (rffi.cast(lltype.Signed, rffi.cast(roci.Ptr(roci.OCIInd), indicator)[0]) == rffi.cast(lltype.Signed, roci.OCI_IND_NULL)): return space.w_None if typeCode in (roci.OCI_TYPECODE_CHAR, roci.OCI_TYPECODE_VARCHAR, roci.OCI_TYPECODE_VARCHAR2): strValue = rffi.cast(roci.Ptr(roci.OCIString), value)[0] ptr = roci.OCIStringPtr(environment.handle, strValue) size = roci.OCIStringSize(environment.handle, strValue) return config.w_string(space, ptr, size) elif typeCode == roci.OCI_TYPECODE_NUMBER: return transform.OracleNumberToPythonFloat( environment, rffi.cast(roci.Ptr(roci.OCINumber), value)) elif typeCode == roci.OCI_TYPECODE_DATE: dateValue = rffi.cast(roci.Ptr(roci.OCIDate), value) return transform.OracleDateToPythonDateTime(environment, dateValue) elif typeCode == roci.OCI_TYPECODE_TIMESTAMP: dateValue = rffi.cast(roci.Ptr(roci.OCIDateTime), value) return transform.OracleTimestampToPythonDate(environment, dateValue) elif typeCode == roci.OCI_TYPECODE_OBJECT: return space.wrap(W_ExternalObject(var, subtype, value, indicator, isIndependent=False)) elif typeCode == roci.OCI_TYPECODE_NAMEDCOLLECTION: return convertCollection(space, environment, value, var, subtype) raise OperationError( get(space).w_NotSupportedError, space.wrap( "ExternalObjectVar_GetAttributeValue(): unhandled data type %d" % ( typeCode,)))
def descr_new(space, w_subtype, w_user, w_password, w_dsn, min, max, increment, w_connectiontype=Null, threaded=False, getmode=roci.OCI_SPOOL_ATTRVAL_NOWAIT, events=False, homogeneous=True): self = space.allocate_instance(W_SessionPool, w_subtype) W_SessionPool.__init__(self) if w_connectiontype is not None: if not space.is_true(space.issubtype(w_connectiontype, get(space).w_Connection)): raise OperationError( interp_error.get(space).w_ProgrammingError, space.wrap( "connectiontype must be a subclass of Connection")) self.w_connectionType = w_connectiontype else: self.w_connectionType = get(space).w_Connection self.w_username = w_user self.w_password = w_password self.w_tnsentry = w_dsn self.minSessions = min self.maxSessions = max self.sessionIncrement = increment self.homogeneous = homogeneous # set up the environment self.environment = interp_environ.Environment.create( space, threaded, events) # create the session pool handle handleptr = lltype.malloc(rffi.CArrayPtr(roci.OCIServer).TO, 1, flavor='raw') try: status = roci.OCIHandleAlloc( self.environment.handle, handleptr, roci.OCI_HTYPE_SPOOL, 0, lltype.nullptr(rffi.CArray(roci.dvoidp))) self.environment.checkForError( status, "SessionPool_New(): allocate handle") self.handle = handleptr[0] finally: lltype.free(handleptr, flavor='raw') # prepare pool mode poolMode = roci.OCI_SPC_STMTCACHE if self.homogeneous: poolMode |= roci.OCI_SPC_HOMOGENEOUS # create the session pool user_buf = config.StringBuffer() user_buf.fill(space, self.w_username) password_buf = config.StringBuffer() password_buf.fill(space, self.w_password) dsn_buf = config.StringBuffer() dsn_buf.fill(space, self.w_tnsentry) poolnameptr = lltype.malloc(rffi.CArrayPtr(roci.oratext).TO, 1, flavor='raw') poolnamelenptr = lltype.malloc(rffi.CArrayPtr(roci.ub4).TO, 1, flavor='raw') try: status = roci.OCISessionPoolCreate( self.environment.handle, self.environment.errorHandle, self.handle, poolnameptr, poolnamelenptr, dsn_buf.ptr, dsn_buf.size, min, max, increment, user_buf.ptr, user_buf.size, password_buf.ptr, password_buf.size, poolMode) self.environment.checkForError( status, "SessionPool_New(): create pool") self.w_name = config.w_string(space, poolnameptr[0], poolnamelenptr[0]) finally: user_buf.clear() password_buf.clear() dsn_buf.clear() return space.wrap(self)
def descr_new(space, w_subtype, w_user, w_password, w_dsn, min, max, increment, w_connectiontype=Null, threaded=False, getmode=roci.OCI_SPOOL_ATTRVAL_NOWAIT, events=False, homogeneous=True): self = space.allocate_instance(W_SessionPool, w_subtype) W_SessionPool.__init__(self) if w_connectiontype is not None: if not space.is_true( space.issubtype(w_connectiontype, get(space).w_Connection)): raise OperationError( interp_error.get(space).w_ProgrammingError, space.wrap( "connectiontype must be a subclass of Connection")) self.w_connectionType = w_connectiontype else: self.w_connectionType = get(space).w_Connection self.w_username = w_user self.w_password = w_password self.w_tnsentry = w_dsn self.minSessions = min self.maxSessions = max self.sessionIncrement = increment self.homogeneous = homogeneous # set up the environment self.environment = interp_environ.Environment.create( space, threaded, events) # create the session pool handle handleptr = lltype.malloc(rffi.CArrayPtr(roci.OCIServer).TO, 1, flavor='raw') try: status = roci.OCIHandleAlloc( self.environment.handle, handleptr, roci.OCI_HTYPE_SPOOL, 0, lltype.nullptr(rffi.CArray(roci.dvoidp))) self.environment.checkForError( status, "SessionPool_New(): allocate handle") self.handle = handleptr[0] finally: lltype.free(handleptr, flavor='raw') # prepare pool mode poolMode = roci.OCI_SPC_STMTCACHE if self.homogeneous: poolMode |= roci.OCI_SPC_HOMOGENEOUS # create the session pool user_buf = config.StringBuffer() user_buf.fill(space, self.w_username) password_buf = config.StringBuffer() password_buf.fill(space, self.w_password) dsn_buf = config.StringBuffer() dsn_buf.fill(space, self.w_tnsentry) poolnameptr = lltype.malloc(rffi.CArrayPtr(roci.oratext).TO, 1, flavor='raw') poolnamelenptr = lltype.malloc(rffi.CArrayPtr(roci.ub4).TO, 1, flavor='raw') try: status = roci.OCISessionPoolCreate( self.environment.handle, self.environment.errorHandle, self.handle, poolnameptr, poolnamelenptr, dsn_buf.ptr, dsn_buf.size, min, max, increment, user_buf.ptr, user_buf.size, password_buf.ptr, password_buf.size, poolMode) self.environment.checkForError(status, "SessionPool_New(): create pool") self.w_name = config.w_string( space, poolnameptr[0], rffi.cast(lltype.Signed, poolnamelenptr[0])) finally: user_buf.clear() password_buf.clear() dsn_buf.clear() lltype.free(poolnameptr, flavor='raw') lltype.free(poolnamelenptr, flavor='raw') return space.wrap(self)