

#include "sqliterk_column.h"
#include "sqliterk_os.h"

struct sqliterk_column {
    int64_t rowid;
    sqliterk_values *values;
    sqliterk_values *overflowPages;
};

int sqliterkColumnAlloc(sqliterk_column **column)
{
    if (!column) {
        return SQLITERK_MISUSE;
    }
    int rc = SQLITERK_OK;
    sqliterk_column *theColumn = sqliterkOSMalloc(sizeof(sqliterk_column));
    if (!theColumn) {
        rc = SQLITERK_NOMEM;
        goto sqliterkColumnAlloc_Failed;
    }
    rc = sqliterkValuesAlloc(&theColumn->values);
    if (rc != SQLITERK_OK) {
        goto sqliterkColumnAlloc_Failed;
    }
    rc = sqliterkValuesAlloc(&theColumn->overflowPages);
    if (rc != SQLITERK_OK) {
        goto sqliterkColumnAlloc_Failed;
    }
    *column = theColumn;
    return SQLITERK_OK;

sqliterkColumnAlloc_Failed:
    if (theColumn) {
        sqliterkColumnFree(theColumn);
    }
    *column = NULL;
    return rc;
}

int sqliterkColumnFree(sqliterk_column *column)
{
    if (!column) {
        return SQLITERK_MISUSE;
    }
    if (column->overflowPages) {
        sqliterkValuesFree(column->overflowPages);
    }
    if (column->values) {
        sqliterkValuesFree(column->values);
    }
    sqliterkOSFree(column);
    return SQLITERK_OK;
}

sqliterk_values *sqliterkColumnGetValues(sqliterk_column *column)
{
    if (!column) {
        return NULL;
    }
    return column->values;
}

void sqliterkColumnSetRowId(sqliterk_column *column, int64_t rowid)
{
    if (column) {
        column->rowid = rowid;
    }
}

int64_t sqliterkColumnGetRowId(sqliterk_column *column)
{
    if (!column) {
        return 0;
    }
    return column->rowid;
}

sqliterk_values *sqliterkColumnGetOverflowPages(sqliterk_column *column)
{
    if (!column) {
        return NULL;
    }
    return column->overflowPages;
}

int sqliterkColumnClear(sqliterk_column *column)
{
    if (!column) {
        return SQLITERK_MISUSE;
    }
    column->rowid = 0;
    sqliterkValuesClear(column->overflowPages);
    sqliterkValuesClear(column->values);
    return SQLITERK_OK;
}