| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 |
- //-----------------------------------------------------------------------------
- // TimestampVar.c
- // Defines the routines for handling timestamp variables.
- //-----------------------------------------------------------------------------
- //-----------------------------------------------------------------------------
- // Timestamp type
- //-----------------------------------------------------------------------------
- typedef struct {
- Variable_HEAD
- OCIDateTime **data;
- } udt_TimestampVar;
- //-----------------------------------------------------------------------------
- // Declaration of date/time variable functions.
- //-----------------------------------------------------------------------------
- static int TimestampVar_Initialize(udt_TimestampVar*, udt_Cursor*);
- static void TimestampVar_Finalize(udt_TimestampVar*);
- static int TimestampVar_SetValue(udt_TimestampVar*, unsigned, PyObject*);
- static PyObject *TimestampVar_GetValue(udt_TimestampVar*, unsigned);
- //-----------------------------------------------------------------------------
- // Python type declarations
- //-----------------------------------------------------------------------------
- static PyTypeObject g_TimestampVarType = {
- PyVarObject_HEAD_INIT(NULL, 0)
- "cx_Oracle.TIMESTAMP", // tp_name
- sizeof(udt_TimestampVar), // 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_Timestamp = {
- (InitializeProc) TimestampVar_Initialize,
- (FinalizeProc) TimestampVar_Finalize,
- (PreDefineProc) NULL,
- (PostDefineProc) NULL,
- (PreFetchProc) NULL,
- (IsNullProc) NULL,
- (SetValueProc) TimestampVar_SetValue,
- (GetValueProc) TimestampVar_GetValue,
- (GetBufferSizeProc) NULL,
- &g_TimestampVarType, // Python type
- SQLT_TIMESTAMP, // Oracle type
- SQLCS_IMPLICIT, // charset form
- sizeof(OCIDateTime*), // element length (default)
- 0, // is character data
- 0, // is variable length
- 1, // can be copied
- 1 // can be in array
- };
- //-----------------------------------------------------------------------------
- // TimestampVar_Initialize()
- // Initialize the variable.
- //-----------------------------------------------------------------------------
- static int TimestampVar_Initialize(
- udt_TimestampVar *var, // variable to initialize
- udt_Cursor *cursor) // cursor variable associated with
- {
- sword status;
- ub4 i;
- // initialize the LOB locators
- for (i = 0; i < var->allocatedElements; i++) {
- status = OCIDescriptorAlloc(var->environment->handle,
- (dvoid**) &var->data[i], OCI_DTYPE_TIMESTAMP, 0, 0);
- if (Environment_CheckForError(var->environment, status,
- "TimestampVar_Initialize()") < 0)
- return -1;
- }
- return 0;
- }
- //-----------------------------------------------------------------------------
- // TimestampVar_Finalize()
- // Prepare for variable destruction.
- //-----------------------------------------------------------------------------
- static void TimestampVar_Finalize(
- udt_TimestampVar *var) // variable to free
- {
- ub4 i;
- for (i = 0; i < var->allocatedElements; i++) {
- if (var->data[i])
- OCIDescriptorFree(var->data[i], OCI_DTYPE_TIMESTAMP);
- }
- }
- //-----------------------------------------------------------------------------
- // TimestampVar_SetValue()
- // Set the value of the variable.
- //-----------------------------------------------------------------------------
- static int TimestampVar_SetValue(
- udt_TimestampVar *var, // variable to set value for
- unsigned pos, // array position to set
- PyObject *value) // value to set
- {
- sword status;
- uword valid;
- // make sure a timestamp is being bound
- if (!PyDateTime_Check(value)) {
- PyErr_SetString(PyExc_TypeError, "expecting timestamp data");
- return -1;
- }
- // store a copy of the value
- status = OCIDateTimeConstruct(var->environment->handle,
- var->environment->errorHandle, var->data[pos],
- (sb2) PyDateTime_GET_YEAR(value),
- PyDateTime_GET_MONTH(value),
- PyDateTime_GET_DAY(value),
- PyDateTime_DATE_GET_HOUR(value),
- PyDateTime_DATE_GET_MINUTE(value),
- PyDateTime_DATE_GET_SECOND(value),
- PyDateTime_DATE_GET_MICROSECOND(value) * 1000, NULL, 0);
- if (Environment_CheckForError(var->environment, status,
- "TimestampVar_SetValue(): create structure") < 0)
- return -1;
- status = OCIDateTimeCheck(var->environment->handle,
- var->environment->errorHandle, var->data[pos], &valid);
- if (Environment_CheckForError(var->environment, status,
- "TimestampVar_SetValue()") < 0)
- return -1;
- if (valid != 0) {
- PyErr_SetString(g_DataErrorException, "invalid date");
- return -1;
- }
- return 0;
- }
- //-----------------------------------------------------------------------------
- // TimestampVar_GetValue()
- // Returns the value stored at the given array position.
- //-----------------------------------------------------------------------------
- static PyObject *TimestampVar_GetValue(
- udt_TimestampVar *var, // variable to determine value for
- unsigned pos) // array position
- {
- return OracleTimestampToPythonDate(var->environment, var->data[pos]);
- }
|