|
/****************************************************************************
|
|
* This file is part of the project AqFinance.
|
|
* AqDataBase (c) by 2015 Martin Preuss, all rights reserved.
|
|
*
|
|
* The license for this file can be found in the file COPYING which you
|
|
* should have received along with this file.
|
|
****************************************************************************/
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
# include <config.h>
|
|
#endif
|
|
|
|
|
|
#include "table_p.h"
|
|
|
|
#include <gwenhywfar/memory.h>
|
|
#include <gwenhywfar/debug.h>
|
|
|
|
#include <endian.h>
|
|
|
|
|
|
|
|
|
|
|
|
GWEN_LIST_FUNCTIONS(AQDB_DBFILE_TABLE, AQDB_DbFile_Table)
|
|
|
|
|
|
|
|
AQDB_DBFILE_TABLE *AQDB_DbFile_Table_new() {
|
|
AQDB_DBFILE_TABLE *dbt;
|
|
|
|
GWEN_NEW_OBJECT(AQDB_DBFILE_TABLE, dbt);
|
|
GWEN_LIST_INIT(AQDB_DBFILE_TABLE, dbt);
|
|
|
|
dbt->tableListColumns=AQFS_Table_List_new();
|
|
dbt->tableListObjects=AQFS_Table_List_new();
|
|
|
|
dbt->columnList=AQDB_Column_List_new();
|
|
|
|
return dbt;
|
|
}
|
|
|
|
|
|
|
|
void AQDB_DbFile_Table_free(AQDB_DBFILE_TABLE *dbt) {
|
|
if (dbt) {
|
|
GWEN_LIST_FINI(AQDB_DBFILE_TABLE, dbt);
|
|
free(dbt->name);
|
|
AQFS_Table_List_free(dbt->tableListColumns);
|
|
AQFS_Table_List_free(dbt->tableListObjects);
|
|
AQFS_Table_List_free(dbt->savedTableListObjects);
|
|
|
|
AQDB_Column_List_free(dbt->columnList);
|
|
|
|
GWEN_FREE_OBJECT(dbt);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
int AQDB_DbFile_Table_ReadFromBuffer(AQDB_DBFILE_TABLE *dbt, const uint8_t *buffer, uint64_t len) {
|
|
if (len<AQDB_DBFILE_TABLE_SIZE) {
|
|
DBG_ERROR(AQFS_LOGDOMAIN, "Buffer too small for valid table data (%d < %d)",
|
|
(int) len, (int) AQDB_DBFILE_TABLE_SIZE);
|
|
return GWEN_ERROR_BAD_DATA;
|
|
}
|
|
|
|
dbt->offsetColumnTable=le64toh(*((uint64_t*)(buffer+AQDB_DBFILE_TABLE_OFFS_COLUMN_TABLE)));
|
|
dbt->offsetObjectTable=le64toh(*((uint64_t*)(buffer+AQDB_DBFILE_TABLE_OFFS_OBJECT_TABLE)));
|
|
free(dbt->name);
|
|
dbt->name=strndup((const char*)(buffer+AQDB_DBFILE_TABLE_OFFS_NAME), AQDB_DBFILE_TABLE_SIZE_NAME-1);
|
|
|
|
AQFS_Table_List_Clear(dbt->tableListColumns);
|
|
AQFS_Table_List_Clear(dbt->tableListObjects);
|
|
AQDB_Column_List_Clear(dbt->columnList);
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
AQDB_DBFILE_TABLE *AQDB_DbFile_Table_fromBuffer(const uint8_t *buffer, uint64_t len) {
|
|
AQDB_DBFILE_TABLE *dbt;
|
|
int rv;
|
|
|
|
dbt=AQDB_DbFile_Table_new();
|
|
rv=AQDB_DbFile_Table_ReadFromBuffer(dbt, buffer, len);
|
|
if (rv<0) {
|
|
AQDB_DbFile_Table_free(dbt);
|
|
return NULL;
|
|
}
|
|
|
|
return dbt;
|
|
}
|
|
|
|
|
|
|
|
int64_t AQDB_DbFile_Table_toBuffer(const AQDB_DBFILE_TABLE *dbt, uint8_t *buffer, uint64_t len) {
|
|
if (len<AQDB_DBFILE_TABLE_SIZE) {
|
|
DBG_ERROR(AQFS_LOGDOMAIN, "Buffer too small for valid table data (%d < %d)",
|
|
(int) len, (int) AQDB_DBFILE_TABLE_SIZE);
|
|
return GWEN_ERROR_BAD_DATA;
|
|
}
|
|
memset(buffer, 0, AQDB_DBFILE_TABLE_SIZE);
|
|
|
|
*((uint64_t*)(buffer+AQDB_DBFILE_TABLE_OFFS_COLUMN_TABLE))=htole64(dbt->offsetColumnTable);
|
|
*((uint64_t*)(buffer+AQDB_DBFILE_TABLE_OFFS_OBJECT_TABLE))=htole64(dbt->offsetObjectTable);
|
|
if (dbt->name)
|
|
strncpy((char*)(buffer+AQDB_DBFILE_TABLE_OFFS_NAME), dbt->name, AQDB_DBFILE_TABLE_SIZE_NAME-1);
|
|
buffer[AQDB_DBFILE_TABLE_OFFS_NAME+AQDB_DBFILE_TABLE_SIZE_NAME-1]=0;
|
|
|
|
return AQDB_DBFILE_TABLE_SIZE;
|
|
}
|
|
|
|
|
|
|
|
const char *AQDB_DbFile_Table_GetName(const AQDB_DBFILE_TABLE *dbt) {
|
|
assert(dbt);
|
|
return dbt->name;
|
|
}
|
|
|
|
|
|
|
|
void AQDB_DbFile_Table_SetName(AQDB_DBFILE_TABLE *dbt, const char *s) {
|
|
assert(dbt);
|
|
free(dbt->name);
|
|
if (s) dbt->name=strdup(s);
|
|
else dbt->name=NULL;
|
|
}
|
|
|
|
|
|
|
|
uint64_t AQDB_DbFile_Table_GetOffsetColumnTable(const AQDB_DBFILE_TABLE *dbt) {
|
|
assert(dbt);
|
|
return dbt->offsetColumnTable;
|
|
}
|
|
|
|
|
|
|
|
void AQDB_DbFile_Table_SetOffsetColumnTable(AQDB_DBFILE_TABLE *dbt, uint64_t i) {
|
|
assert(dbt);
|
|
dbt->offsetColumnTable=i;
|
|
}
|
|
|
|
|
|
|
|
uint64_t AQDB_DbFile_Table_GetOffsetObjectTable(const AQDB_DBFILE_TABLE *dbt) {
|
|
assert(dbt);
|
|
return dbt->offsetObjectTable;
|
|
}
|
|
|
|
|
|
|
|
void AQDB_DbFile_Table_SetOffsetObjectTable(AQDB_DBFILE_TABLE *dbt, uint64_t i) {
|
|
assert(dbt);
|
|
dbt->offsetObjectTable=i;
|
|
}
|
|
|
|
|
|
|
|
AQFS_TABLE_LIST *AQDB_DbFile_Table_GetTableListColumns(const AQDB_DBFILE_TABLE *dbt) {
|
|
assert(dbt);
|
|
return dbt->tableListColumns;
|
|
}
|
|
|
|
|
|
|
|
void AQDB_DbFile_Table_SetTableListColumns(AQDB_DBFILE_TABLE *dbt, AQFS_TABLE_LIST *ftl) {
|
|
assert(dbt);
|
|
if (ftl!=dbt->tableListColumns)
|
|
AQFS_Table_List_free(dbt->tableListColumns);
|
|
dbt->tableListColumns=ftl;
|
|
}
|
|
|
|
|
|
|
|
AQFS_TABLE_LIST *AQDB_DbFile_Table_GetTableListObjects(const AQDB_DBFILE_TABLE *dbt) {
|
|
assert(dbt);
|
|
return dbt->tableListObjects;
|
|
}
|
|
|
|
|
|
|
|
void AQDB_DbFile_Table_SetTableListObjects(AQDB_DBFILE_TABLE *dbt, AQFS_TABLE_LIST *ftl) {
|
|
assert(dbt);
|
|
if (ftl!=dbt->tableListObjects)
|
|
AQFS_Table_List_free(dbt->tableListObjects);
|
|
dbt->tableListObjects=ftl;
|
|
}
|
|
|
|
|
|
|
|
AQFS_TABLE_LIST *AQDB_DbFile_Table_GetSavedTableListObjects(const AQDB_DBFILE_TABLE *dbt) {
|
|
assert(dbt);
|
|
return dbt->savedTableListObjects;
|
|
}
|
|
|
|
|
|
|
|
void AQDB_DbFile_Table_SetSavedTableListObjects(AQDB_DBFILE_TABLE *dbt, AQFS_TABLE_LIST *ftl) {
|
|
assert(dbt);
|
|
if (ftl!=dbt->savedTableListObjects)
|
|
AQFS_Table_List_free(dbt->savedTableListObjects);
|
|
dbt->savedTableListObjects=ftl;
|
|
}
|
|
|
|
|
|
|
|
AQDB_ID AQDB_DbFile_Table_GetTableId(const AQDB_DBFILE_TABLE *dbt) {
|
|
assert(dbt);
|
|
return dbt->tableId;
|
|
}
|
|
|
|
|
|
|
|
void AQDB_DbFile_Table_SetTableId(AQDB_DBFILE_TABLE *dbt, AQDB_ID i) {
|
|
assert(dbt);
|
|
dbt->tableId=i;
|
|
}
|
|
|
|
|
|
|
|
uint32_t AQDB_DbFile_Table_GetOpenFlags(const AQDB_DBFILE_TABLE *dbt) {
|
|
assert(dbt);
|
|
return dbt->openFlags;
|
|
}
|
|
|
|
|
|
|
|
void AQDB_DbFile_Table_SetOpenFlags(AQDB_DBFILE_TABLE *dbt, uint32_t i) {
|
|
assert(dbt);
|
|
dbt->openFlags=i;
|
|
}
|
|
|
|
|
|
|
|
void AQDB_DbFile_Table_AddOpenFlags(AQDB_DBFILE_TABLE *dbt, uint32_t i) {
|
|
assert(dbt);
|
|
dbt->openFlags|=i;
|
|
}
|
|
|
|
|
|
|
|
void AQDB_DbFile_Table_SubOpenFlags(AQDB_DBFILE_TABLE *dbt, uint32_t i) {
|
|
assert(dbt);
|
|
dbt->openFlags&=~i;
|
|
}
|
|
|
|
|
|
|
|
uint32_t AQDB_DbFile_Table_GetFlags(const AQDB_DBFILE_TABLE *dbt) {
|
|
assert(dbt);
|
|
return dbt->flags;
|
|
}
|
|
|
|
|
|
|
|
void AQDB_DbFile_Table_SetFlags(AQDB_DBFILE_TABLE *dbt, uint32_t i) {
|
|
assert(dbt);
|
|
dbt->flags=i;
|
|
}
|
|
|
|
|
|
|
|
void AQDB_DbFile_Table_AddFlags(AQDB_DBFILE_TABLE *dbt, uint32_t i) {
|
|
assert(dbt);
|
|
dbt->flags|=i;
|
|
}
|
|
|
|
|
|
|
|
void AQDB_DbFile_Table_SubFlags(AQDB_DBFILE_TABLE *dbt, uint32_t i) {
|
|
assert(dbt);
|
|
dbt->flags&=~i;
|
|
}
|
|
|
|
|
|
|
|
AQDB_COLUMN_LIST *AQDB_DbFile_Table_GetColumnList(const AQDB_DBFILE_TABLE *dbt) {
|
|
assert(dbt);
|
|
return dbt->columnList;
|
|
}
|
|
|
|
|
|
|
|
void AQDB_DbFile_Table_SetColumnList(AQDB_DBFILE_TABLE *dbt, AQDB_COLUMN_LIST *cl) {
|
|
assert(dbt);
|
|
if (cl!=dbt->columnList)
|
|
AQDB_Column_List_free(dbt->columnList);
|
|
dbt->columnList=cl;
|
|
}
|
|
|
|
|
|
|
|
int AQDB_DbFile_Table_GetColumnCount(const AQDB_DBFILE_TABLE *dbt) {
|
|
assert(dbt);
|
|
if (dbt->columnList)
|
|
return AQDB_Column_List_GetCount(dbt->columnList);
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
|