#include "dpiImpl.h"
int dpiSodaDocCursor__allocate(dpiSodaColl *coll, void *handle,
dpiSodaDocCursor **cursor, dpiError *error)
{
dpiSodaDocCursor *tempCursor;
if (dpiGen__allocate(DPI_HTYPE_SODA_DOC_CURSOR, coll->env,
(void**) &tempCursor, error) < 0)
return DPI_FAILURE;
dpiGen__setRefCount(coll, error, 1);
tempCursor->coll = coll;
tempCursor->handle = handle;
*cursor = tempCursor;
return DPI_SUCCESS;
}
static int dpiSodaDocCursor__check(dpiSodaDocCursor *cursor,
const char *fnName, dpiError *error)
{
if (dpiGen__startPublicFn(cursor, DPI_HTYPE_SODA_DOC_CURSOR, fnName,
error) < 0)
return DPI_FAILURE;
if (!cursor->handle)
return dpiError__set(error, "check closed",
DPI_ERR_SODA_CURSOR_CLOSED);
if (!cursor->coll->db->conn->handle || cursor->coll->db->conn->closing)
return dpiError__set(error, "check connection", DPI_ERR_NOT_CONNECTED);
return DPI_SUCCESS;
}
void dpiSodaDocCursor__free(dpiSodaDocCursor *cursor, dpiError *error)
{
if (cursor->handle) {
dpiOci__handleFree(cursor->handle, DPI_OCI_HTYPE_SODA_DOC_CURSOR);
cursor->handle = NULL;
}
if (cursor->coll) {
dpiGen__setRefCount(cursor->coll, error, -1);
cursor->coll = NULL;
}
dpiUtils__freeMemory(cursor);
}
int dpiSodaDocCursor_addRef(dpiSodaDocCursor *cursor)
{
return dpiGen__addRef(cursor, DPI_HTYPE_SODA_DOC_CURSOR, __func__);
}
int dpiSodaDocCursor_close(dpiSodaDocCursor *cursor)
{
dpiError error;
if (dpiSodaDocCursor__check(cursor, __func__, &error) < 0)
return dpiGen__endPublicFn(cursor, DPI_FAILURE, &error);
if (cursor->handle) {
dpiOci__handleFree(cursor->handle, DPI_OCI_HTYPE_SODA_DOC_CURSOR);
cursor->handle = NULL;
}
return dpiGen__endPublicFn(cursor, DPI_SUCCESS, &error);
}
int dpiSodaDocCursor_getNext(dpiSodaDocCursor *cursor, UNUSED uint32_t flags,
dpiSodaDoc **doc)
{
dpiError error;
void *handle;
if (dpiSodaDocCursor__check(cursor, __func__, &error) < 0)
return dpiGen__endPublicFn(cursor, DPI_FAILURE, &error);
DPI_CHECK_PTR_NOT_NULL(cursor, doc)
if (dpiOci__sodaDocGetNext(cursor, &handle, &error) < 0)
return dpiGen__endPublicFn(cursor, DPI_FAILURE, &error);
*doc = NULL;
if (handle) {
if (dpiSodaDoc__allocate(cursor->coll->db, handle, doc, &error) < 0) {
dpiOci__handleFree(handle, DPI_OCI_HTYPE_SODA_DOCUMENT);
return dpiGen__endPublicFn(cursor, DPI_FAILURE, &error);
}
(*doc)->binaryContent = cursor->coll->binaryContent;
}
return dpiGen__endPublicFn(cursor, DPI_SUCCESS, &error);
}
int dpiSodaDocCursor_release(dpiSodaDocCursor *cursor)
{
return dpiGen__release(cursor, DPI_HTYPE_SODA_DOC_CURSOR, __func__);
}