#include "dpiImpl.h"
int dpiSodaCollCursor__allocate(dpiSodaDb *db, void *handle,
dpiSodaCollCursor **cursor, dpiError *error)
{
dpiSodaCollCursor *tempCursor;
if (dpiGen__allocate(DPI_HTYPE_SODA_COLL_CURSOR, db->env,
(void**) &tempCursor, error) < 0)
return DPI_FAILURE;
dpiGen__setRefCount(db, error, 1);
tempCursor->db = db;
tempCursor->handle = handle;
*cursor = tempCursor;
return DPI_SUCCESS;
}
static int dpiSodaCollCursor__check(dpiSodaCollCursor *cursor,
const char *fnName, dpiError *error)
{
if (dpiGen__startPublicFn(cursor, DPI_HTYPE_SODA_COLL_CURSOR, fnName,
error) < 0)
return DPI_FAILURE;
if (!cursor->handle)
return dpiError__set(error, "check closed",
DPI_ERR_SODA_CURSOR_CLOSED);
if (!cursor->db->conn->handle || cursor->db->conn->closing)
return dpiError__set(error, "check connection", DPI_ERR_NOT_CONNECTED);
return DPI_SUCCESS;
}
void dpiSodaCollCursor__free(dpiSodaCollCursor *cursor, dpiError *error)
{
if (cursor->handle) {
dpiOci__handleFree(cursor->handle, DPI_OCI_HTYPE_SODA_COLL_CURSOR);
cursor->handle = NULL;
}
if (cursor->db) {
dpiGen__setRefCount(cursor->db, error, -1);
cursor->db = NULL;
}
dpiUtils__freeMemory(cursor);
}
int dpiSodaCollCursor_addRef(dpiSodaCollCursor *cursor)
{
return dpiGen__addRef(cursor, DPI_HTYPE_SODA_COLL_CURSOR, __func__);
}
int dpiSodaCollCursor_close(dpiSodaCollCursor *cursor)
{
dpiError error;
if (dpiSodaCollCursor__check(cursor, __func__, &error) < 0)
return dpiGen__endPublicFn(cursor, DPI_FAILURE, &error);
if (cursor->handle) {
dpiOci__handleFree(cursor->handle, DPI_OCI_HTYPE_SODA_COLL_CURSOR);
cursor->handle = NULL;
}
return dpiGen__endPublicFn(cursor, DPI_SUCCESS, &error);
}
int dpiSodaCollCursor_getNext(dpiSodaCollCursor *cursor, UNUSED uint32_t flags,
dpiSodaColl **coll)
{
dpiError error;
void *handle;
if (dpiSodaCollCursor__check(cursor, __func__, &error) < 0)
return dpiGen__endPublicFn(cursor, DPI_FAILURE, &error);
DPI_CHECK_PTR_NOT_NULL(cursor, coll)
if (dpiOci__sodaCollGetNext(cursor->db->conn, cursor->handle, &handle,
&error) < 0)
return dpiGen__endPublicFn(cursor, DPI_FAILURE, &error);
*coll = NULL;
if (handle) {
if (dpiSodaColl__allocate(cursor->db, handle, coll, &error) < 0) {
dpiOci__handleFree(handle, DPI_OCI_HTYPE_SODA_COLLECTION);
return dpiGen__endPublicFn(cursor, DPI_FAILURE, &error);
}
}
return dpiGen__endPublicFn(cursor, DPI_SUCCESS, &error);
}
int dpiSodaCollCursor_release(dpiSodaCollCursor *cursor)
{
return dpiGen__release(cursor, DPI_HTYPE_SODA_COLL_CURSOR, __func__);
}