def new_from_scratch(threaded, events, encoding, nencoding): mode = oci.OCI_OBJECT if threaded: mode |= oci.OCI_THREADED #TODO: if EVENTS_SUPPORTED: # if events: # mode |= ociap.OCI_EVENTS argtypes = oci.OCIEnvNlsCreate.argtypes handle = oci.POINTER(oci.OCIEnv)() status = oci.OCIEnvNlsCreate(byref(handle), mode, argtypes[2](), argtypes[3](), argtypes[4](), argtypes[5](), 0, None, 0, 0) if not handle or (status != oci.OCI_SUCCESS and status != oci.OCI_SUCCESS_WITH_INFO): raise InterfaceError("Unable to acquire Oracle environment handle") env = Environment(handle) c_maxBytesPerCharacter = oci.sb4() status = oci.OCINlsNumericInfoGet(handle, env.error_handle, byref(c_maxBytesPerCharacter), oci.OCI_NLS_CHARSET_MAXBYTESZ) env.check_for_error(status, "Environment_New(): get max bytes per character") env.maxBytesPerCharacter = c_maxBytesPerCharacter.value env.maxStringBytes = MAX_STRING_CHARS * env.maxBytesPerCharacter # acquire whether character set is fixed width c_fixedWidth = oci.sb4() status = oci.OCINlsNumericInfoGet(handle, env.error_handle, byref(c_fixedWidth), oci.OCI_NLS_CHARSET_FIXEDWIDTH) env.check_for_error( status, "Environment_New(): determine if charset fixed width") env.fixedWidth = c_fixedWidth.value # determine encodings to use for Unicode values env.encoding = env.get_characterset_name(oci.OCI_ATTR_ENV_CHARSET_ID, encoding) env.nencoding = env.get_characterset_name(oci.OCI_ATTR_ENV_NCHARSET_ID, nencoding) # fill buffers for number formats env.numberToStringFormatBuffer = Environment.set_buffer( "TM9", env.encoding) env.numberFromStringFormatBuffer = Environment.set_buffer( "999999999999999999999999999999999999999999999999999999999999999", env.encoding) env.nlsNumericCharactersBuffer = Environment.set_buffer( "NLS_NUMERIC_CHARACTERS='.,'", env.encoding) return env
def oracle_interval_to_python_delta(environment, value): days = oci.sb4() hours = oci.sb4() minutes = oci.sb4() seconds = oci.sb4() fseconds = oci.sb4() status = oci.OCIIntervalGetDaySecond(environment.handle, environment.error_handle, byref(days), byref(hours), byref(minutes), byref(seconds), byref(fseconds), value) environment.check_for_error(status, "OracleIntervalToPythonDelta()") seconds = hours.value * 3600 + minutes.value * 60 + seconds.value return timedelta(days=days.value, seconds=seconds, microseconds=fseconds.value/1000)
def new_from_scratch(threaded, events, encoding, nencoding): mode = oci.OCI_OBJECT if threaded: mode |= oci.OCI_THREADED #TODO: if EVENTS_SUPPORTED: # if events: # mode |= ociap.OCI_EVENTS argtypes = oci.OCIEnvNlsCreate.argtypes handle = oci.POINTER(oci.OCIEnv)() status = oci.OCIEnvNlsCreate(byref(handle), mode, argtypes[2](), argtypes[3](), argtypes[4](), argtypes[5](), 0, None, 0, 0) if not handle or (status != oci.OCI_SUCCESS and status != oci.OCI_SUCCESS_WITH_INFO): raise InterfaceError("Unable to acquire Oracle environment handle") env = Environment(handle) c_maxBytesPerCharacter = oci.sb4() status = oci.OCINlsNumericInfoGet(handle, env.error_handle, byref(c_maxBytesPerCharacter), oci.OCI_NLS_CHARSET_MAXBYTESZ) env.check_for_error(status, "Environment_New(): get max bytes per character") env.maxBytesPerCharacter = c_maxBytesPerCharacter.value env.maxStringBytes = MAX_STRING_CHARS * env.maxBytesPerCharacter # acquire whether character set is fixed width c_fixedWidth = oci.sb4() status = oci.OCINlsNumericInfoGet(handle, env.error_handle, byref(c_fixedWidth), oci.OCI_NLS_CHARSET_FIXEDWIDTH) env.check_for_error(status, "Environment_New(): determine if charset fixed width") env.fixedWidth = c_fixedWidth.value # determine encodings to use for Unicode values env.encoding = env.get_characterset_name(oci.OCI_ATTR_ENV_CHARSET_ID, encoding) env.nencoding = env.get_characterset_name(oci.OCI_ATTR_ENV_NCHARSET_ID, nencoding) # fill buffers for number formats env.numberToStringFormatBuffer = Environment.set_buffer("TM9", env.encoding) env.numberFromStringFormatBuffer = Environment.set_buffer("999999999999999999999999999999999999999999999999999999999999999", env.encoding) env.nlsNumericCharactersBuffer = Environment.set_buffer("NLS_NUMERIC_CHARACTERS='.,'", env.encoding) return env
def oracle_interval_to_python_delta(environment, value): days = oci.sb4() hours = oci.sb4() minutes = oci.sb4() seconds = oci.sb4() fseconds = oci.sb4() status = oci.OCIIntervalGetDaySecond( environment.handle, environment.error_handle, byref(days), byref(hours), byref(minutes), byref(seconds), byref(fseconds), value, ) environment.check_for_error(status, "OracleIntervalToPythonDelta()") seconds = hours.value * 3600 + minutes.value * 60 + seconds.value return timedelta(days=days.value, seconds=seconds, microseconds=fseconds.value / 1000)
def __init__(self, environment, context, retrieve_error): self.context = context if retrieve_error: if environment.error_handle: handle = environment.error_handle handle_type = oci.OCI_HTYPE_ERROR else: handle = environment.handle handle_type = oci.OCI_HTYPE_ENV error_text = ctypes.create_string_buffer(4096) error_text_as_ub1_pointer = ctypes.cast(error_text, oci.POINTER(oci.ub1)) c_code = oci.sb4() argtypes = oci.OCIErrorGet.argtypes status = oci.OCIErrorGet(handle, 1, argtypes[2](), byref(c_code), error_text_as_ub1_pointer, len(error_text), handle_type) self.code = c_code.value if status != oci.OCI_SUCCESS: raise InternalError("No Oracle error?") if not python3_or_better(): self.message = error_text.value else: self.message = error_text.decode(environment.encoding)