utiles_v2017/IaDataTable.cpp

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;
}
//***************************************************************************