| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423 |
- //-----------------------------------------------------------------------------
- // StringVar.c
- // Defines the routines specific to the string type.
- //-----------------------------------------------------------------------------
- //-----------------------------------------------------------------------------
- // String type
- //-----------------------------------------------------------------------------
- typedef struct {
- Variable_HEAD
- char *data;
- } udt_StringVar;
- //-----------------------------------------------------------------------------
- // Declaration of string variable functions.
- //-----------------------------------------------------------------------------
- static int StringVar_Initialize(udt_StringVar*, udt_Cursor*);
- static int StringVar_SetValue(udt_StringVar*, unsigned, PyObject*);
- static PyObject *StringVar_GetValue(udt_StringVar*, unsigned);
- static int StringVar_PostDefine(udt_StringVar*);
- static ub4 StringVar_GetBufferSize(udt_StringVar*);
- //-----------------------------------------------------------------------------
- // Python type declarations
- //-----------------------------------------------------------------------------
- static PyTypeObject g_StringVarType = {
- PyVarObject_HEAD_INIT(NULL, 0)
- "cx_Oracle.STRING", // tp_name
- sizeof(udt_StringVar), // tp_basicsize
- 0, // tp_itemsize
- 0, // tp_dealloc
- 0, // tp_print
- 0, // tp_getattr
- 0, // tp_setattr
- 0, // tp_compare
- 0, // tp_repr
- 0, // tp_as_number
- 0, // tp_as_sequence
- 0, // tp_as_mapping
- 0, // tp_hash
- 0, // tp_call
- 0, // tp_str
- 0, // tp_getattro
- 0, // tp_setattro
- 0, // tp_as_buffer
- Py_TPFLAGS_DEFAULT, // tp_flags
- 0 // tp_doc
- };
- static PyTypeObject g_NCharVarType = {
- PyVarObject_HEAD_INIT(NULL, 0)
- "cx_Oracle.NCHAR", // tp_name
- sizeof(udt_StringVar), // tp_basicsize
- 0, // tp_itemsize
- 0, // tp_dealloc
- 0, // tp_print
- 0, // tp_getattr
- 0, // tp_setattr
- 0, // tp_compare
- 0, // tp_repr
- 0, // tp_as_number
- 0, // tp_as_sequence
- 0, // tp_as_mapping
- 0, // tp_hash
- 0, // tp_call
- 0, // tp_str
- 0, // tp_getattro
- 0, // tp_setattro
- 0, // tp_as_buffer
- Py_TPFLAGS_DEFAULT, // tp_flags
- 0 // tp_doc
- };
- static PyTypeObject g_FixedCharVarType = {
- PyVarObject_HEAD_INIT(NULL, 0)
- "cx_Oracle.FIXED_CHAR", // tp_name
- sizeof(udt_StringVar), // tp_basicsize
- 0, // tp_itemsize
- 0, // tp_dealloc
- 0, // tp_print
- 0, // tp_getattr
- 0, // tp_setattr
- 0, // tp_compare
- 0, // tp_repr
- 0, // tp_as_number
- 0, // tp_as_sequence
- 0, // tp_as_mapping
- 0, // tp_hash
- 0, // tp_call
- 0, // tp_str
- 0, // tp_getattro
- 0, // tp_setattro
- 0, // tp_as_buffer
- Py_TPFLAGS_DEFAULT, // tp_flags
- 0 // tp_doc
- };
- static PyTypeObject g_FixedNCharVarType = {
- PyVarObject_HEAD_INIT(NULL, 0)
- "cx_Oracle.FIXED_NCHAR", // tp_name
- sizeof(udt_StringVar), // tp_basicsize
- 0, // tp_itemsize
- 0, // tp_dealloc
- 0, // tp_print
- 0, // tp_getattr
- 0, // tp_setattr
- 0, // tp_compare
- 0, // tp_repr
- 0, // tp_as_number
- 0, // tp_as_sequence
- 0, // tp_as_mapping
- 0, // tp_hash
- 0, // tp_call
- 0, // tp_str
- 0, // tp_getattro
- 0, // tp_setattro
- 0, // tp_as_buffer
- Py_TPFLAGS_DEFAULT, // tp_flags
- 0 // tp_doc
- };
- static PyTypeObject g_RowidVarType = {
- PyVarObject_HEAD_INIT(NULL, 0)
- "cx_Oracle.ROWID", // tp_name
- sizeof(udt_StringVar), // tp_basicsize
- 0, // tp_itemsize
- 0, // tp_dealloc
- 0, // tp_print
- 0, // tp_getattr
- 0, // tp_setattr
- 0, // tp_compare
- 0, // tp_repr
- 0, // tp_as_number
- 0, // tp_as_sequence
- 0, // tp_as_mapping
- 0, // tp_hash
- 0, // tp_call
- 0, // tp_str
- 0, // tp_getattro
- 0, // tp_setattro
- 0, // tp_as_buffer
- Py_TPFLAGS_DEFAULT, // tp_flags
- 0 // tp_doc
- };
- static PyTypeObject g_BinaryVarType = {
- PyVarObject_HEAD_INIT(NULL, 0)
- "cx_Oracle.BINARY", // tp_name
- sizeof(udt_StringVar), // tp_basicsize
- 0, // tp_itemsize
- 0, // tp_dealloc
- 0, // tp_print
- 0, // tp_getattr
- 0, // tp_setattr
- 0, // tp_compare
- 0, // tp_repr
- 0, // tp_as_number
- 0, // tp_as_sequence
- 0, // tp_as_mapping
- 0, // tp_hash
- 0, // tp_call
- 0, // tp_str
- 0, // tp_getattro
- 0, // tp_setattro
- 0, // tp_as_buffer
- Py_TPFLAGS_DEFAULT, // tp_flags
- 0 // tp_doc
- };
- //-----------------------------------------------------------------------------
- // variable type declarations
- //-----------------------------------------------------------------------------
- static udt_VariableType vt_String = {
- (InitializeProc) StringVar_Initialize,
- (FinalizeProc) NULL,
- (PreDefineProc) NULL,
- (PostDefineProc) NULL,
- (PreFetchProc) NULL,
- (IsNullProc) NULL,
- (SetValueProc) StringVar_SetValue,
- (GetValueProc) StringVar_GetValue,
- (GetBufferSizeProc) StringVar_GetBufferSize,
- &g_StringVarType, // Python type
- SQLT_CHR, // Oracle type
- SQLCS_IMPLICIT, // charset form
- 4000, // element length (default)
- 1, // is character data
- 1, // is variable length
- 1, // can be copied
- 1 // can be in array
- };
- static udt_VariableType vt_NationalCharString = {
- (InitializeProc) StringVar_Initialize,
- (FinalizeProc) NULL,
- (PreDefineProc) NULL,
- (PostDefineProc) StringVar_PostDefine,
- (PreFetchProc) NULL,
- (IsNullProc) NULL,
- (SetValueProc) StringVar_SetValue,
- (GetValueProc) StringVar_GetValue,
- (GetBufferSizeProc) StringVar_GetBufferSize,
- &g_NCharVarType, // Python type
- SQLT_CHR, // Oracle type
- SQLCS_NCHAR, // charset form
- 4000, // element length (default)
- 1, // is character data
- 1, // is variable length
- 1, // can be copied
- 1 // can be in array
- };
- static udt_VariableType vt_FixedChar = {
- (InitializeProc) StringVar_Initialize,
- (FinalizeProc) NULL,
- (PreDefineProc) NULL,
- (PostDefineProc) NULL,
- (PreFetchProc) NULL,
- (IsNullProc) NULL,
- (SetValueProc) StringVar_SetValue,
- (GetValueProc) StringVar_GetValue,
- (GetBufferSizeProc) StringVar_GetBufferSize,
- &g_FixedCharVarType, // Python type
- SQLT_AFC, // Oracle type
- SQLCS_IMPLICIT, // charset form
- 2000, // element length (default)
- 1, // is character data
- 1, // is variable length
- 1, // can be copied
- 1 // can be in array
- };
- static udt_VariableType vt_FixedNationalChar = {
- (InitializeProc) StringVar_Initialize,
- (FinalizeProc) NULL,
- (PreDefineProc) NULL,
- (PostDefineProc) StringVar_PostDefine,
- (PreFetchProc) NULL,
- (IsNullProc) NULL,
- (SetValueProc) StringVar_SetValue,
- (GetValueProc) StringVar_GetValue,
- (GetBufferSizeProc) StringVar_GetBufferSize,
- &g_FixedNCharVarType, // Python type
- SQLT_AFC, // Oracle type
- SQLCS_NCHAR, // charset form
- 2000, // element length (default)
- 1, // is character data
- 1, // is variable length
- 1, // can be copied
- 1 // can be in array
- };
- static udt_VariableType vt_Rowid = {
- (InitializeProc) StringVar_Initialize,
- (FinalizeProc) NULL,
- (PreDefineProc) NULL,
- (PostDefineProc) NULL,
- (PreFetchProc) NULL,
- (IsNullProc) NULL,
- (SetValueProc) StringVar_SetValue,
- (GetValueProc) StringVar_GetValue,
- (GetBufferSizeProc) StringVar_GetBufferSize,
- &g_RowidVarType, // Python type
- SQLT_CHR, // Oracle type
- SQLCS_IMPLICIT, // charset form
- 18, // element length (default)
- 1, // is character data
- 0, // is variable length
- 1, // can be copied
- 1 // can be in array
- };
- static udt_VariableType vt_Binary = {
- (InitializeProc) StringVar_Initialize,
- (FinalizeProc) NULL,
- (PreDefineProc) NULL,
- (PostDefineProc) NULL,
- (PreFetchProc) NULL,
- (IsNullProc) NULL,
- (SetValueProc) StringVar_SetValue,
- (GetValueProc) StringVar_GetValue,
- (GetBufferSizeProc) NULL,
- &g_BinaryVarType, // Python type
- SQLT_BIN, // Oracle type
- SQLCS_IMPLICIT, // charset form
- 4000, // element length (default)
- 0, // is character data
- 1, // is variable length
- 1, // can be copied
- 1 // can be in array
- };
- //-----------------------------------------------------------------------------
- // StringVar_Initialize()
- // Initialize the variable.
- //-----------------------------------------------------------------------------
- static int StringVar_Initialize(
- udt_StringVar *var, // variable to initialize
- udt_Cursor *cursor) // cursor to use
- {
- ub4 i;
- var->actualLength = (ACTUAL_LENGTH_TYPE *)
- PyMem_Malloc(var->allocatedElements * sizeof(ACTUAL_LENGTH_TYPE));
- if (!var->actualLength) {
- PyErr_NoMemory();
- return -1;
- }
- for (i = 0; i < var->allocatedElements; i++)
- var->actualLength[i] = 0;
- return 0;
- }
- //-----------------------------------------------------------------------------
- // StringVar_SetValue()
- // Set the value of the variable.
- //-----------------------------------------------------------------------------
- static int StringVar_SetValue(
- udt_StringVar *var, // variable to set value for
- unsigned pos, // array position to set
- PyObject *value) // value to set
- {
- udt_Buffer buffer;
- char *encoding;
- // determine which encoding should be used
- if (var->type->charsetForm == SQLCS_NCHAR)
- encoding = var->environment->nencoding;
- else encoding = var->environment->encoding;
- // populate the buffer and confirm the maximum size is not exceeded
- if (cxBuffer_FromObject(&buffer, value, encoding) < 0)
- return -1;
- // ensure that the buffer is large enough
- if (buffer.size > var->bufferSize) {
- if (Variable_Resize( (udt_Variable*) var, buffer.numCharacters) < 0) {
- cxBuffer_Clear(&buffer);
- return -1;
- }
- }
- // keep a copy of the string
- var->actualLength[pos] = (ACTUAL_LENGTH_TYPE) buffer.size;
- if (buffer.size)
- memcpy(var->data + var->bufferSize * pos, buffer.ptr, buffer.size);
- cxBuffer_Clear(&buffer);
- return 0;
- }
- //-----------------------------------------------------------------------------
- // StringVar_GetValue()
- // Returns the value stored at the given array position.
- //-----------------------------------------------------------------------------
- static PyObject *StringVar_GetValue(
- udt_StringVar *var, // variable to determine value for
- unsigned pos) // array position
- {
- char *data;
- data = var->data + pos * var->bufferSize;
- if (var->type == &vt_Binary)
- return PyBytes_FromStringAndSize(data, var->actualLength[pos]);
- if (var->type == &vt_FixedNationalChar
- || var->type == &vt_NationalCharString)
- return PyUnicode_Decode(data, var->actualLength[pos],
- var->environment->nencoding, NULL);
- return cxString_FromEncodedString(data, var->actualLength[pos],
- var->environment->encoding);
- }
- //-----------------------------------------------------------------------------
- // StringVar_PostDefine()
- // Set the character set information when values are fetched from this
- // variable.
- //-----------------------------------------------------------------------------
- static int StringVar_PostDefine(
- udt_StringVar *var) // variable to initialize
- {
- sword status;
- status = OCIAttrSet(var->defineHandle, OCI_HTYPE_DEFINE,
- &var->type->charsetForm, 0, OCI_ATTR_CHARSET_FORM,
- var->environment->errorHandle);
- if (Environment_CheckForError(var->environment, status,
- "StringVar_PostDefine(): setting charset form") < 0)
- return -1;
- return 0;
- }
- //-----------------------------------------------------------------------------
- // StringVar_GetBufferSize()
- // Returns the buffer size to use for the variable.
- //-----------------------------------------------------------------------------
- static ub4 StringVar_GetBufferSize(
- udt_StringVar* self) // variable to get buffer size for
- {
- if (self->type->isCharacterData)
- return self->size * self->environment->maxBytesPerCharacter;
- return self->size;
- }
|