294 lines
6.5 KiB
C++
294 lines
6.5 KiB
C++
#include "StdAfx.h"
|
|
#include "IaDataTable.h"
|
|
#include "CartoBase.h"
|
|
#include "Fdbf.h"
|
|
//***************************************************************************
|
|
IaDataTable::IaDataTable(void)
|
|
{
|
|
auxnrow=-1;
|
|
auxref =-1;
|
|
auxref = auxc=-1;
|
|
|
|
}
|
|
//***************************************************************************
|
|
IaDataTable::~IaDataTable(void)
|
|
{
|
|
}
|
|
//***************************************************************************
|
|
void* IaDataTable::IaGet( int refEnt )
|
|
{
|
|
return NULL;
|
|
}
|
|
//***************************************************************************
|
|
void IaDataTable::CBSet( CartoBase* cb )
|
|
{
|
|
_cb = cb;
|
|
}
|
|
//***************************************************************************
|
|
void IaDataTable::IaRemove( int refEnt )
|
|
{
|
|
int icol = RefIndex[refEnt];
|
|
if(icol<0)
|
|
return;
|
|
removeRow(RefIndex[refEnt]);
|
|
RefIndex[refEnt]=-1;
|
|
rowIndex[icol] = -1;
|
|
}
|
|
//***************************************************************************
|
|
void IaDataTable::IaRemoveAll()
|
|
{
|
|
RefIndex.clear();
|
|
rowIndex.clear();
|
|
delAll();
|
|
}
|
|
//***************************************************************************
|
|
void IaDataTable::IaAdd( int refEnt )
|
|
{
|
|
if(!addRow(1))
|
|
{
|
|
RefIndex[refEnt] = -1;
|
|
return;
|
|
}
|
|
int iRow=nRow()-1;
|
|
RefIndex[refEnt]=iRow;
|
|
rowIndex[iRow] = refEnt;
|
|
}
|
|
//***************************************************************************
|
|
bool IaDataTable::IaSet( int nrow, int ncolm )
|
|
{
|
|
IaRemoveAll();
|
|
auxnrow = nrow;
|
|
auxcolm =ncolm;
|
|
return true;
|
|
}
|
|
//***************************************************************************
|
|
bool IaDataTable::IaSetColm( int icol, char* name, BYTE type, int size )
|
|
{
|
|
int t;
|
|
switch(type)
|
|
{
|
|
case(DBF_TYPE_DATA_STR):
|
|
t = GdataTable::Tstring;
|
|
break;
|
|
case(DBF_TYPE_DATA_I64):
|
|
t = GdataTable::Tint64;
|
|
break;
|
|
case(DBF_TYPE_DATA_D):
|
|
t = GdataTable::Tdouble;
|
|
break;
|
|
case(DBF_TYPE_DATA_BOOL):
|
|
t = GdataTable::Tbool;
|
|
break;
|
|
case(DBF_TYPE_DATA_BIN):
|
|
t = GdataTable::Tbin;
|
|
break;
|
|
case(DBF_TYPE_DATA_I):
|
|
t = GdataTable::Tint;
|
|
break;
|
|
default:
|
|
return false;
|
|
}
|
|
bool res = addColm(name,t,size);
|
|
if(res && auxcolm>0 && nColm()>= auxcolm)
|
|
{
|
|
res = addMemRow(auxnrow);
|
|
auxnrow =0;
|
|
}
|
|
return res;
|
|
}
|
|
//***************************************************************************
|
|
bool IaDataTable::IaAddVal( int refEnt, int icol, int v )
|
|
{
|
|
int _nrow;
|
|
if(auxnrow>=0)
|
|
_nrow =RefIndex[refEnt];
|
|
else
|
|
_nrow = RefIndex[refEnt];
|
|
int* vv = getI(auxnrow,icol);
|
|
if(vv)
|
|
*vv = v;
|
|
return vv!= NULL;
|
|
}
|
|
//***************************************************************************
|
|
bool IaDataTable::IaAddVal( int refEnt, int icol, double v )
|
|
{
|
|
int _nrow;
|
|
if(auxnrow>=0)
|
|
_nrow =RefIndex[refEnt];
|
|
else
|
|
_nrow = RefIndex[refEnt];
|
|
double* vv = getD(_nrow,icol);
|
|
if(vv)
|
|
*vv = v;
|
|
return vv!= NULL;
|
|
}
|
|
//***************************************************************************
|
|
bool IaDataTable::IaAddVal( int refEnt, int icol, __int64 v )
|
|
{
|
|
int _nrow;
|
|
if(auxnrow>=0)
|
|
_nrow =RefIndex[refEnt];
|
|
else
|
|
_nrow = RefIndex[refEnt];
|
|
__int64* vv = getI64(_nrow,icol);
|
|
if(vv)
|
|
*vv = v;
|
|
return vv!= NULL;
|
|
}
|
|
//***************************************************************************
|
|
bool IaDataTable::IaAddVal( int refEnt, int icol, char* v )
|
|
{
|
|
int _nrow;
|
|
if(auxnrow>=0)
|
|
_nrow =RefIndex[refEnt];
|
|
else
|
|
_nrow = RefIndex[refEnt];
|
|
char* vv = getS(_nrow,icol);
|
|
if(vv)
|
|
strcpy(vv,v);
|
|
return vv!= NULL;
|
|
}
|
|
//***************************************************************************
|
|
bool IaDataTable::IaAddVal( int refEnt, int icol, void* v )
|
|
{
|
|
int _nrow;
|
|
if(auxnrow>=0)
|
|
_nrow =RefIndex[refEnt];
|
|
else
|
|
_nrow = RefIndex[refEnt];
|
|
void* vv = getBin(_nrow,icol);
|
|
if(vv)
|
|
memcpy(vv,v, getSize(icol));
|
|
return vv!= NULL;
|
|
}
|
|
//***************************************************************************
|
|
bool IaDataTable::IaFinRow( int refEnt )
|
|
{
|
|
auxnrow++;
|
|
return true;
|
|
}
|
|
//***************************************************************************
|
|
bool IaDataTable::IaFinR()
|
|
{
|
|
auxnrow=-1;
|
|
return true;
|
|
}
|
|
//***************************************************************************
|
|
bool IaDataTable::IaGetSize(int *ncolm )
|
|
{
|
|
*ncolm =nColm();
|
|
return true;
|
|
}
|
|
//***************************************************************************
|
|
#define MAX_NDECIMALS 10;
|
|
bool IaDataTable::IaGetColm( int icol, char* name, BYTE *type, int *size, int*ndecimal )
|
|
{
|
|
//pilla tipo----------------------
|
|
static BYTE t[GdataTable::Tntip]={0,DBF_TYPE_DATA_BOOL,DBF_TYPE_DATA_I, DBF_TYPE_DATA_D,DBF_TYPE_DATA_I64, DBF_TYPE_DATA_STR, DBF_TYPE_DATA_BIN } ;
|
|
*type = t[getType(icol)];
|
|
*ndecimal = MAX_NDECIMALS;
|
|
//copia segura de nombre------------------
|
|
int i =0;
|
|
char *st =getName(icol);
|
|
for(; i<10; i++)
|
|
{
|
|
if(!st[i])
|
|
break;
|
|
name[i]=st[i];
|
|
}
|
|
name[i]=0;
|
|
*size = getSizeASCII(icol);
|
|
return *size>0;
|
|
}
|
|
//***************************************************************************
|
|
bool IaDataTable::IaGetVal( int refEnt, int icol, int* v )
|
|
{
|
|
int irow;
|
|
if(auxref == refEnt)
|
|
irow = auxc;
|
|
else
|
|
{
|
|
irow = RefIndex[refEnt];
|
|
auxref = refEnt;
|
|
auxc = irow;
|
|
}
|
|
if(irow<0)
|
|
return false;
|
|
*v = *getI(irow,icol);
|
|
return true;
|
|
}
|
|
//***************************************************************************
|
|
bool IaDataTable::IaGetVal( int refEnt, int icol, double* v )
|
|
{
|
|
int irow;
|
|
if(auxref == refEnt)
|
|
irow = auxc;
|
|
else
|
|
{
|
|
irow = RefIndex[refEnt];
|
|
auxref = refEnt;
|
|
auxc = irow;
|
|
}
|
|
if(irow<0)
|
|
return false;
|
|
*v = *getD(irow,icol);
|
|
return true;
|
|
}
|
|
//***************************************************************************
|
|
bool IaDataTable::IaGetVal( int refEnt, int icol, __int64* v )
|
|
{
|
|
int irow;
|
|
if(auxref == refEnt)
|
|
irow = auxc;
|
|
else
|
|
{
|
|
irow = RefIndex[refEnt];
|
|
auxref = refEnt;
|
|
auxc = irow;
|
|
}
|
|
if(irow<0)
|
|
return false;
|
|
*v = *getI64(irow,icol);
|
|
return true;
|
|
}
|
|
//***************************************************************************
|
|
bool IaDataTable::IaGetVal( int refEnt, int icol, char** v )
|
|
{
|
|
int irow;
|
|
if(auxref == refEnt)
|
|
irow = auxc;
|
|
else
|
|
{
|
|
irow = RefIndex[refEnt];
|
|
auxref = refEnt;
|
|
auxc = irow;
|
|
}
|
|
if(irow<0)
|
|
return false;
|
|
*v= getS(irow,icol);
|
|
return true;
|
|
}
|
|
//***************************************************************************
|
|
bool IaDataTable::IaGetVal( int refEnt, int icol, void** v )
|
|
{
|
|
int irow;
|
|
if(auxref == refEnt)
|
|
irow = auxc;
|
|
else
|
|
{
|
|
irow = RefIndex[refEnt];
|
|
auxref = refEnt;
|
|
auxc = irow;
|
|
}
|
|
if(irow<0)
|
|
return false;
|
|
*v= getBin(irow,icol);
|
|
return true;
|
|
}
|
|
//***************************************************************************
|
|
bool IaDataTable::IaFinW()
|
|
{
|
|
auxref = auxc=-1;
|
|
return true;
|
|
}
|
|
//***************************************************************************
|