Projekt

Allgemein

Profil

Herunterladen (6,52 KB) Statistiken
| Zweig: | Markierung: | Revision:
/****************************************************************************
* 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;
}




(16-16/18)