185 lines
7.1 KiB
C
185 lines
7.1 KiB
C
//-----------------------------------------------------------------------------
|
|
// Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// cxoSodaDocCursor.c
|
|
// Defines the routines for handling SODA document cursors. These cursors
|
|
// permit iterating over the documents that match the criteria that was
|
|
// specified by the user.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
#include "cxoModule.h"
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Declaration of functions
|
|
//-----------------------------------------------------------------------------
|
|
static void cxoSodaDocCursor_free(cxoSodaDocCursor*);
|
|
static PyObject *cxoSodaDocCursor_repr(cxoSodaDocCursor*);
|
|
static PyObject *cxoSodaDocCursor_getIter(cxoSodaDocCursor*);
|
|
static PyObject *cxoSodaDocCursor_getNext(cxoSodaDocCursor*);
|
|
static PyObject *cxoSodaDocCursor_close(cxoSodaDocCursor*, PyObject*);
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// declaration of methods
|
|
//-----------------------------------------------------------------------------
|
|
static PyMethodDef cxoMethods[] = {
|
|
{ "close", (PyCFunction) cxoSodaDocCursor_close, METH_NOARGS },
|
|
{ NULL }
|
|
};
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Python type declarations
|
|
//-----------------------------------------------------------------------------
|
|
PyTypeObject cxoPyTypeSodaDocCursor = {
|
|
PyVarObject_HEAD_INIT(NULL, 0)
|
|
"cx_Oracle.SodaDocCursor", // tp_name
|
|
sizeof(cxoSodaDocCursor), // tp_basicsize
|
|
0, // tp_itemsize
|
|
(destructor) cxoSodaDocCursor_free, // tp_dealloc
|
|
0, // tp_print
|
|
0, // tp_getattr
|
|
0, // tp_setattr
|
|
0, // tp_compare
|
|
(reprfunc) cxoSodaDocCursor_repr, // 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
|
|
0, // tp_traverse
|
|
0, // tp_clear
|
|
0, // tp_richcompare
|
|
0, // tp_weaklistoffset
|
|
(getiterfunc) cxoSodaDocCursor_getIter, // tp_iter
|
|
(iternextfunc) cxoSodaDocCursor_getNext, // tp_iternext
|
|
cxoMethods, // tp_methods
|
|
0, // tp_members
|
|
0, // tp_getset
|
|
0, // tp_base
|
|
0, // tp_dict
|
|
0, // tp_descr_get
|
|
0, // tp_descr_set
|
|
0, // tp_dictoffset
|
|
0, // tp_init
|
|
0, // tp_alloc
|
|
0, // tp_new
|
|
0, // tp_free
|
|
0, // tp_is_gc
|
|
0 // tp_bases
|
|
};
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// cxoSodaDocCursor_new()
|
|
// Create a new SODA document cursor.
|
|
//-----------------------------------------------------------------------------
|
|
cxoSodaDocCursor *cxoSodaDocCursor_new(cxoSodaDatabase *db,
|
|
dpiSodaDocCursor *handle)
|
|
{
|
|
cxoSodaDocCursor *cursor;
|
|
|
|
cursor = (cxoSodaDocCursor*)
|
|
cxoPyTypeSodaDocCursor.tp_alloc(&cxoPyTypeSodaDocCursor, 0);
|
|
if (!cursor) {
|
|
dpiSodaDocCursor_release(handle);
|
|
return NULL;
|
|
}
|
|
Py_INCREF(db);
|
|
cursor->db = db;
|
|
cursor->handle = handle;
|
|
return cursor;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// cxoSodaDocCursor_free()
|
|
// Free the memory associated with a SODA document cursor.
|
|
//-----------------------------------------------------------------------------
|
|
static void cxoSodaDocCursor_free(cxoSodaDocCursor *cursor)
|
|
{
|
|
if (cursor->handle) {
|
|
dpiSodaDocCursor_release(cursor->handle);
|
|
cursor->handle = NULL;
|
|
}
|
|
Py_CLEAR(cursor->db);
|
|
Py_TYPE(cursor)->tp_free((PyObject*) cursor);
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// cxoSodaDocCursor_repr()
|
|
// Return a string representation of a SODA document cursor.
|
|
//-----------------------------------------------------------------------------
|
|
static PyObject *cxoSodaDocCursor_repr(cxoSodaDocCursor *cursor)
|
|
{
|
|
PyObject *module, *name, *result;
|
|
|
|
if (cxoUtils_getModuleAndName(Py_TYPE(cursor), &module, &name) < 0)
|
|
return NULL;
|
|
result = cxoUtils_formatString("<%s.%s>", PyTuple_Pack(2, module, name));
|
|
Py_DECREF(module);
|
|
Py_DECREF(name);
|
|
return result;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// cxoSodaDocCursor_close()
|
|
// Create a SODA collection and return it.
|
|
//-----------------------------------------------------------------------------
|
|
static PyObject *cxoSodaDocCursor_close(cxoSodaDocCursor *cursor,
|
|
PyObject *args)
|
|
{
|
|
if (dpiSodaDocCursor_close(cursor->handle) < 0)
|
|
return cxoError_raiseAndReturnNull();
|
|
Py_RETURN_NONE;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// cxoSodaDocCursor_getIter()
|
|
// Return a reference to the cursor which supports the iterator protocol.
|
|
//-----------------------------------------------------------------------------
|
|
static PyObject *cxoSodaDocCursor_getIter(cxoSodaDocCursor *cursor)
|
|
{
|
|
Py_INCREF(cursor);
|
|
return (PyObject*) cursor;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// cxoSodaDocCursor_getNext()
|
|
// Return the next document from the cursor.
|
|
//-----------------------------------------------------------------------------
|
|
static PyObject *cxoSodaDocCursor_getNext(cxoSodaDocCursor *cursor)
|
|
{
|
|
dpiSodaDoc *handle;
|
|
cxoSodaDoc *doc;
|
|
uint32_t flags;
|
|
int status;
|
|
|
|
if (cxoConnection_getSodaFlags(cursor->db->connection, &flags) < 0)
|
|
return NULL;
|
|
Py_BEGIN_ALLOW_THREADS
|
|
status = dpiSodaDocCursor_getNext(cursor->handle, flags, &handle);
|
|
Py_END_ALLOW_THREADS
|
|
if (status < 0)
|
|
return cxoError_raiseAndReturnNull();
|
|
if (!handle)
|
|
return NULL;
|
|
doc = cxoSodaDoc_new(cursor->db, handle);
|
|
if (!doc)
|
|
return NULL;
|
|
return (PyObject*) doc;
|
|
}
|
|
|