/******************************************************file:vString.cpurpose:python type define for DM char/varchar/binary/varbinary variables in dmPythoninterface:{}history:Date Who RefDoc Memo2015年6月9日 wmm Created*******************************************************/#include "var_pub.h"#include "Error.h"#include "py_Dameng.h"#include "Buffer.h"//-----------------------------------------------------------------------------// Declaration of string variable functions.//-----------------------------------------------------------------------------static int StringVar_Initialize(dm_StringVar*);static int StringVar_SetValue(dm_StringVar*, unsigned, PyObject*);static PyObject *StringVar_GetValue(dm_StringVar*, unsigned);#if PY_MAJOR_VERSION < 3static int StringVar_PostDefine(dm_StringVar*);#endifstatic udint4 StringVar_GetBufferSize(dm_StringVar*);static int StringVar_BindObjectValue(dm_StringVar*, unsigned, dhobj, udint4);//-----------------------------------------------------------------------------// Python type declarations//-----------------------------------------------------------------------------PyTypeObject g_StringType = {PyVarObject_HEAD_INIT(NULL, 0)"dmPython.STRING", // tp_namesizeof(dm_StringVar), // tp_basicsize0, // tp_itemsize0, // tp_dealloc0, // tp_print0, // tp_getattr0, // tp_setattr0, // tp_compare0, // tp_repr0, // tp_as_number0, // tp_as_sequence0, // tp_as_mapping0, // tp_hash0, // tp_call0, // tp_str0, // tp_getattro0, // tp_setattro0, // tp_as_bufferPy_TPFLAGS_DEFAULT, // tp_flags0 // tp_doc};#if PY_MAJOR_VERSION < 3PyTypeObject g_UnicodeStrType = {PyVarObject_HEAD_INIT(NULL, 0)"dmPython.UNICODE_STRING", // tp_namesizeof(dm_StringVar), // tp_basicsize0, // tp_itemsize0, // tp_dealloc0, // tp_print0, // tp_getattr0, // tp_setattr0, // tp_compare0, // tp_repr0, // tp_as_number0, // tp_as_sequence0, // tp_as_mapping0, // tp_hash0, // tp_call0, // tp_str0, // tp_getattro0, // tp_setattro0, // tp_as_bufferPy_TPFLAGS_DEFAULT, // tp_flags0 // tp_doc};#endifPyTypeObject g_FixedCharType = {PyVarObject_HEAD_INIT(NULL, 0)"dmPython.FIXED_STRING", // tp_namesizeof(dm_StringVar), // tp_basicsize0, // tp_itemsize0, // tp_dealloc0, // tp_print0, // tp_getattr0, // tp_setattr0, // tp_compare0, // tp_repr0, // tp_as_number0, // tp_as_sequence0, // tp_as_mapping0, // tp_hash0, // tp_call0, // tp_str0, // tp_getattro0, // tp_setattro0, // tp_as_bufferPy_TPFLAGS_DEFAULT, // tp_flags0 // tp_doc};#if PY_MAJOR_VERSION < 3PyTypeObject g_FixedUnicodeCharType = {PyVarObject_HEAD_INIT(NULL, 0)"dmPython.FIXED_UNICODE_STRING", // tp_namesizeof(dm_StringVar), // tp_basicsize0, // tp_itemsize0, // tp_dealloc0, // tp_print0, // tp_getattr0, // tp_setattr0, // tp_compare0, // tp_repr0, // tp_as_number0, // tp_as_sequence0, // tp_as_mapping0, // tp_hash0, // tp_call0, // tp_str0, // tp_getattro0, // tp_setattro0, // tp_as_bufferPy_TPFLAGS_DEFAULT, // tp_flags0 // tp_doc};#endifPyTypeObject g_BinaryType = {PyVarObject_HEAD_INIT(NULL, 0)"dmPython.BINARY", // tp_namesizeof(dm_StringVar), // tp_basicsize0, // tp_itemsize0, // tp_dealloc0, // tp_print0, // tp_getattr0, // tp_setattr0, // tp_compare0, // tp_repr0, // tp_as_number0, // tp_as_sequence0, // tp_as_mapping0, // tp_hash0, // tp_call0, // tp_str0, // tp_getattro0, // tp_setattro0, // tp_as_bufferPy_TPFLAGS_DEFAULT, // tp_flags0 // tp_doc};PyTypeObject g_FixedBinaryType = {PyVarObject_HEAD_INIT(NULL, 0)"dmPython.FIXED_BINARY", // tp_namesizeof(dm_StringVar), // tp_basicsize0, // tp_itemsize0, // tp_dealloc0, // tp_print0, // tp_getattr0, // tp_setattr0, // tp_compare0, // tp_repr0, // tp_as_number0, // tp_as_sequence0, // tp_as_mapping0, // tp_hash0, // tp_call0, // tp_str0, // tp_getattro0, // tp_setattro0, // tp_as_bufferPy_TPFLAGS_DEFAULT, // tp_flags0 // tp_doc};//-----------------------------------------------------------------------------// variable type declarations//-----------------------------------------------------------------------------dm_VarType vt_String = {(InitializeProc) NULL,(FinalizeProc) NULL,(PreDefineProc) NULL,(PreFetchProc) NULL,(IsNullProc) NULL,(SetValueProc) StringVar_SetValue,(GetValueProc) StringVar_GetValue,(GetBufferSizeProc) StringVar_GetBufferSize,(BindObjectValueProc)StringVar_BindObjectValue,&g_StringType, // Python typeDSQL_C_NCHAR, // c typeMAX_STRING_CHARS, // element length (default)1, // is character data1, // is variable length1, // can be copied1 // can be in array};#if PY_MAJOR_VERSION < 3dm_VarType vt_UnicodeString = {(InitializeProc) NULL,(FinalizeProc) NULL,(PreDefineProc) NULL,(PreFetchProc) NULL,(IsNullProc) NULL,(SetValueProc) StringVar_SetValue,(GetValueProc) StringVar_GetValue,(GetBufferSizeProc) StringVar_GetBufferSize,(BindObjectValueProc)StringVar_BindObjectValue,&g_UnicodeStrType, // Python typeDSQL_C_NCHAR,MAX_STRING_CHARS, // element length (default)1, // is character data1, // is variable length1, // can be copied1 // can be in array};#endifdm_VarType vt_FixedChar = {(InitializeProc) NULL,(FinalizeProc) NULL,(PreDefineProc) NULL,(PreFetchProc) NULL,(IsNullProc) NULL,(SetValueProc) StringVar_SetValue,(GetValueProc) StringVar_GetValue,(GetBufferSizeProc) StringVar_GetBufferSize,(BindObjectValueProc)StringVar_BindObjectValue,&g_FixedCharType, // Python typeDSQL_C_NCHAR, // c type2000, // element length (default)1, // is character data0, // is variable length1, // can be copied1 // can be in array};#if PY_MAJOR_VERSION < 3dm_VarType vt_FixedUnicodeChar = {(InitializeProc) NULL,(FinalizeProc) NULL,(PreDefineProc) NULL,(PreFetchProc) NULL,(IsNullProc) NULL,(SetValueProc) StringVar_SetValue,(GetValueProc) StringVar_GetValue,(GetBufferSizeProc) StringVar_GetBufferSize,(BindObjectValueProc)StringVar_BindObjectValue,&g_FixedUnicodeCharType, // Python typeDSQL_C_NCHAR,2000, // element length (default)1, // is character data0, // is variable length1, // can be copied1 // can be in array};#endif/*static dm_VarType 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 typeSQLT_CHR, // Oracle typeSQLCS_IMPLICIT, // charset form18, // element length (default)1, // is character data0, // is variable length1, // can be copied1 // can be in array};*/dm_VarType vt_Binary = {(InitializeProc) NULL,(FinalizeProc) NULL,(PreDefineProc) NULL,(PreFetchProc) NULL,(IsNullProc) NULL,(SetValueProc) StringVar_SetValue,(GetValueProc) StringVar_GetValue,(GetBufferSizeProc) NULL,(BindObjectValueProc)StringVar_BindObjectValue,&g_BinaryType, // Python typeDSQL_C_BINARY, // c typeMAX_BINARY_BYTES, // element length (default)0, // is character data1, // is variable length1, // can be copied1 // can be in array};dm_VarType vt_FixedBinary = {(InitializeProc) NULL,(FinalizeProc) NULL,(PreDefineProc) NULL,(PreFetchProc) NULL,(IsNullProc) NULL,(SetValueProc) StringVar_SetValue,(GetValueProc) StringVar_GetValue,(GetBufferSizeProc) NULL,(BindObjectValueProc)StringVar_BindObjectValue,&g_FixedBinaryType, // Python typeDSQL_C_BINARY, // c type2000, // element length (default)0, // is character data0, // is variable length1, // can be copied1 // can be in array};//-----------------------------------------------------------------------------// StringVar_Initialize()// Initialize the variable. dmVar_new里面会有alloc//-----------------------------------------------------------------------------/*staticintStringVar_Initialize(dm_StringVar* var // variable to initialize){var->actualLength = (slength*) PyMem_Malloc(var->allocatedElements * sizeof(slength));if (!var->actualLength){PyErr_NoMemory();return -1;}return 0;}*///-----------------------------------------------------------------------------// StringVar_SetValue()// Set the value of the variable.//-----------------------------------------------------------------------------staticintStringVar_SetValue(dm_StringVar* var, // variable to set value forunsigned pos, // array position to setPyObject* value // value to set){dm_Buffer buffer;// populate the buffer and confirm the maximum size is not exceededif (dmBuffer_FromObject(&buffer, value, var->environment->encoding) < 0)return -1;if (var->type->isCharacterData && buffer.numCharacters > MAX_STRING_CHARS){dmBuffer_Clear(&buffer);PyErr_SetString(PyExc_ValueError, "string data too large");return -1;}else if (!var->type->isCharacterData && buffer.size > MAX_BINARY_BYTES){dmBuffer_Clear(&buffer);PyErr_SetString(PyExc_ValueError, "binary data too large");return -1;}// ensure that the buffer is large enoughif (buffer.size > (Py_ssize_t)var->bufferSize){if (dmVar_Resize( (dm_Var*) var, buffer.numCharacters) < 0){dmBuffer_Clear(&buffer);return -1;}}// keep a copy of the stringvar->indicator[pos] = (slength)buffer.size;var->actualLength[pos] = (slength)buffer.size;if (buffer.size){memcpy(var->data + var->bufferSize * pos, buffer.ptr, buffer.size);}dmBuffer_Clear(&buffer);return 0;}//-----------------------------------------------------------------------------// StringVar_GetValue()// Returns the value stored at the given array position.//-----------------------------------------------------------------------------staticPyObject*StringVar_GetValue(dm_StringVar* var, // variable to determine value forunsigned pos // array position){char* data;data = var->data + pos * var->bufferSize;if (var->type == &vt_Binary || var->type == &vt_FixedBinary)return PyBytes_FromStringAndSize(data, var->actualLength[pos]);/* 取到的值按照当前encoding直接返回,不管是否为unicode串 */return dmString_FromEncodedString(data, var->actualLength[pos], var->environment->encoding);}#if PY_MAJOR_VERSION < 3//-----------------------------------------------------------------------------// StringVar_PostDefine()// Set the character set information when values are fetched from this// variable.//-----------------------------------------------------------------------------staticintStringVar_PostDefine(dm_StringVar* var){/*sword status;//DSQL_ATTR_SQL_CHARSETstatus = 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;}#endif//-----------------------------------------------------------------------------// StringVar_GetBufferSize()// Returns the buffer size to use for the variable.//-----------------------------------------------------------------------------static udint4 StringVar_GetBufferSize(dm_StringVar* self) // variable to get buffer size for{if (self->type->isCharacterData)return self->size * self->environment->maxBytesPerCharacter;return self->size;}staticintStringVar_BindObjectValue(dm_StringVar* var,unsigned pos,dhobj hobj,udint4 val_nth){DPIRETURN rt = DSQL_SUCCESS;rt = dpi_set_obj_val(hobj, val_nth, var->type->cType, (dpointer)((sdbyte*)var->data + var->bufferSize * pos), var->indicator[pos]);if (Environment_CheckForError(var->environment, hobj, DSQL_HANDLE_OBJECT, rt,"vCursor_BindObjectValue():dpi_set_obj_val") < 0){return -1;}return 0;}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。