📄 mdbtbl.cpp
字号:
//----------------------------------------------------------------------------
// 程序名称: Table.cpp
// 程序说明: CTable类实现
// 程序作者: 陈立峰
// 程序版本: 1.0
// 开始日期: 2005-06-09
//----------------------------------------------------------------------------
#include <iostream>
#include "MdbTbl.h"
using namespace std;
/*
//----------------------------------------------------------------------------
// 函数原型: CWorkFlow::CWorkFlow(int nBucketNum)
// 函数功能: CWorkFlow 构造函数
// 传入参数: 无
// 传出参数: 无
// 函数返回: 无
// 注意事项: 无
//----------------------------------------------------------------------------
CRecordIter &CRecordIter::operator ++()
{
if(m_psRecordNode == NULL)
{
throwException(USAGE_ERROR,"CRecordIter::operator ++ Error,CTableIter touch Bottom,Can not ++\n");
}
m_psRecordNode = m_psRecordNode->m_psNext;
return *this;
}
*/
//----------------------------------------------------------------------------
// 函数原型: CWorkFlow::CWorkFlow(int nBucketNum)
// 函数功能: CWorkFlow 构造函数
// 传入参数: 无
// 传出参数: 无
// 函数返回: 无
// 注意事项: 无
//----------------------------------------------------------------------------
CMdbTbl::CMdbTbl(MALLOC *pcAlloc,CMdbDict *pcDbDict,CDbTableMeta *psTableMeta):m_pcAlloc(pcAlloc),m_pcDbDict(pcDbDict),m_psTableMeta(psTableMeta)
{
}
//----------------------------------------------------------------------------
// 函数原型: CWorkFlow::CWorkFlow(int nBucketNum)
// 函数功能: CWorkFlow 构造函数
// 传入参数: 无
// 传出参数: 无
// 函数返回: 无
// 注意事项: 无
//----------------------------------------------------------------------------
CRecordNode *CMdbTbl::createRecord()
{
void *ptr;
if((ptr = m_pcAlloc->malloc(sizeof(CRecordNode))) == NULL)
{
throwException(MDB_EC_NORMAL,MDB_ET_MEM_ALLOC_ERROR,"CMdbTbl::newRecord Error,Can not Alloc Memory for CRecordNode,Tbl:%s\n",m_psTableMeta->m_szTblName);
}
// CRecordNode *psRecordNode = reinterpret_cast<CRecordNode *>(ptr);
CRecordNode *psRecordNode = new (ptr) CRecordNode; /**< add by mol */
if((ptr = m_pcAlloc->malloc(m_psTableMeta->m_nRecLen)) == NULL)
// if((ptr = reinterpret_cast<void*>(m_pcAlloc->malloc(m_psTableMeta->m_nRecLen))) == NULL) /**< add by mol */
{
throwException(MDB_EC_NORMAL,MDB_ET_MEM_ALLOC_ERROR,"CMdbTbl::newRecord Error,Can not Alloc Memory for new Record,Tbl:%s\n",m_psTableMeta->m_szTblName);
}
memset((char *)ptr,0,m_psTableMeta->m_nRecLen);
// cerr << "psRecordNode:" << (void *)psRecordNode << endl;
// cerr << "ptr:" << (void *)ptr << endl;
// void*base_addr = 0;
// ACE_BASED_POINTER_REPOSITORY::instance ()->find (ptr,
// base_addr);
// cerr << "base_addr: " << (void*)base_addr << endl;
psRecordNode->m_psData = ptr;
// void*base_addr1 = 0;
// ACE_BASED_POINTER_REPOSITORY::instance ()->find (psRecordNode->m_psData,
// base_addr1);
// cerr << "base_addr1: " << (void*)base_addr1 << endl;
// cerr << "psdata:" << (void *)(psRecordNode->m_psData) << endl;
// cerr << "psdata's address:" << (void *)(psRecordNode->m_psData.addr()) << endl;
psRecordNode->m_psPrev = reinterpret_cast<CRecordNode *>(NULL);
CRecordNode *psNext = reinterpret_cast<CRecordNode *>((m_psTableMeta->m_psTblEntry).addr());
psRecordNode->m_psNext = psNext;
if(psNext)
{
psNext->m_psPrev = psRecordNode;
}
m_psTableMeta->m_psTblEntry = reinterpret_cast<void *>(psRecordNode);
return psRecordNode;
}
//----------------------------------------------------------------------------
// 函数原型: CWorkFlow::CWorkFlow(int nBucketNum)
// 函数功能: CWorkFlow 构造函数
// 传入参数: 无
// 传出参数: 无
// 函数返回: 无
// 注意事项: 无
//----------------------------------------------------------------------------
void CMdbTbl::setFieldValByName(CRecordNode *pRec,const char *szFieldName,int nFieldType,const void *pVal)
{
CDbColumnMeta *psColumnMeta;
if((psColumnMeta = m_pcDbDict->findColumMeta(m_psTableMeta,szFieldName)) == NULL)
{
throwException(MDB_EC_NORMAL,MDB_ET_INVALID_COL_NAME,"CMdbTbl::setFieldValByName Error,Can not Find ColumnMeta,Tbl:%s,Col:%s\n",m_psTableMeta->m_szTblName,szFieldName);
}
void *pData = pRec->m_psData;
//cerr << "pData1:" << (void *)pData << endl;
//cerr << "psColumnMeta:" << (void *)psColumnMeta << endl;
//cerr << "psColumnMeta->m_nOffset:" << psColumnMeta->m_nOffset << endl;
pData = (char *)pData + psColumnMeta->m_nOffset;
//cerr << "pData2:" << (void *)pData << endl;
if(!setFieldVal(pData,psColumnMeta,nFieldType,pVal))
{
throwException(MDB_EC_NORMAL,MDB_ET_INVALID_COL_VAL,"CMdbTbl::setFieldValByName Error,setFieldVal Failed,Tbl:%s,Col:%s\n,ColType:%d",m_psTableMeta->m_szTblName,szFieldName,nFieldType);
}
}
//----------------------------------------------------------------------------
// 函数原型: CWorkFlow::CWorkFlow(int nBucketNum)
// 函数功能: CWorkFlow 构造函数
// 传入参数: 无
// 传出参数: 无
// 函数返回: 无
// 注意事项: 无
//----------------------------------------------------------------------------
bool CMdbTbl::setFieldVal(void *pData,CDbColumnMeta *psDbColumnMeta,int nFieldType,const void *pVal)
{
if(psDbColumnMeta->m_nInternalType == CIT_INT64)
{
long long nTmp;
if(nFieldType == FT_INT8)
{
nTmp = *((char *)pVal);
memcpy((char *)pData,(char *)&nTmp,sizeof(nTmp));
return true;
}
else if(nFieldType == FT_UINT8)
{
nTmp = *((unsigned char *)pVal);
memcpy((char *)pData,(char *)&nTmp,sizeof(nTmp));
return true;
}
else if(nFieldType == FT_INT16)
{
nTmp = *((short *)pVal);
memcpy((char *)pData,(char *)&nTmp,sizeof(nTmp));
return true;
}
else if(nFieldType == FT_UINT16)
{
nTmp = *((unsigned short *)pVal);
memcpy((char *)pData,(char *)&nTmp,sizeof(nTmp));
return true;
}
else if(nFieldType == FT_INT32)
{
nTmp = *((int *)pVal);
memcpy((char *)pData,(char *)&nTmp,sizeof(nTmp));
return true;
}
else if(nFieldType == FT_UINT32)
{
nTmp = *((unsigned int *)pVal);
memcpy((char *)pData,(char *)&nTmp,sizeof(nTmp));
return true;
}
else if((nFieldType == FT_INT64) && (*(long long *)pVal <= 999999999999999999LL) && (*(long long *)pVal >= -999999999999999999LL))
{
memcpy((char *)pData,(char *)pVal,sizeof(long long)); //直拷
return true;
}
else if((nFieldType == FT_UINT64) && (*(unsigned long long *)pVal <= 999999999999999999LL) )
{
nTmp = (long long)(*((unsigned long long *)pVal));
memcpy((char *)pData,(char *)&nTmp,sizeof(nTmp));
return true;
}
else
{
return false;
}
}
else if(psDbColumnMeta->m_nInternalType == CIT_INT32)
{
int nTmp;
if(nFieldType == FT_INT8)
{
nTmp = *((char *)pVal);
memcpy((char *)pData,(char *)&nTmp,sizeof(nTmp));
return true;
}
else if(nFieldType == FT_UINT8)
{
nTmp = *((unsigned char *)pVal);
memcpy((char *)pData,(char *)&nTmp,sizeof(nTmp));
return true;
}
else if(nFieldType == FT_INT16)
{
nTmp = *((short *)pVal);
memcpy((char *)pData,(char *)&nTmp,sizeof(nTmp));
return true;
}
else if(nFieldType == FT_UINT16)
{
nTmp = *((unsigned short *)pVal);
memcpy((char *)pData,(char *)&nTmp,sizeof(nTmp));
return true;
}
else if(nFieldType == FT_INT32 && (*(int *)pVal <= 999999999) && (*(int *)pVal >= -999999999))
{
memcpy((char *)pData,(char *)pVal,sizeof(int));
return true;
}
else if(nFieldType == FT_UINT32 && (*(int *)pVal <= 999999999))
{
nTmp = (int)(*((unsigned int *)pVal));
memcpy((char *)pData,(char *)&nTmp,sizeof(nTmp));
return true;
}
else if(nFieldType == FT_INT64 && (*(long long *)pVal <= 999999999LL) && (*(long long *)pVal >= -999999999LL))
{
nTmp = (int)(*(long long *)pVal);
memcpy((char *)pData,(char *)&nTmp,sizeof(nTmp));
return true;
}
else if(nFieldType == FT_UINT64 && (*(unsigned long long *)pVal <= 999999999LL))
{
nTmp = (int)(*((unsigned long long *)pVal));
memcpy((char *)pData,(char *)&nTmp,sizeof(nTmp));
return true;
}
else
{
return false;
}
}
else if(psDbColumnMeta->m_nInternalType == CIT_INT16)
{
short nTmp;
if(nFieldType == FT_INT8)
{
nTmp = *((char *)pVal);
memcpy((char *)pData,(char *)&nTmp,sizeof(nTmp));
return true;
}
else if(nFieldType == FT_UINT8)
{
nTmp = *((unsigned char *)pVal);
memcpy((char *)pData,(char *)&nTmp,sizeof(nTmp));
return true;
}
else if(nFieldType == FT_INT16 && (*(short *)pVal <= 9999) && (*(short *)pVal >= -9999))
{
memcpy((char *)pData,(char *)pVal,sizeof(short));
return true;
}
else if(nFieldType == FT_UINT16 && (*(short *)pVal <= 9999))
{
nTmp = (short)(*((unsigned short *)pVal));
memcpy((char *)pData,(char *)&nTmp,sizeof(nTmp));
return true;
}
else if(nFieldType == FT_INT32 && (*(int *)pVal <= 9999) && (*(int *)pVal >= -9999))
{
nTmp = (short)(*((int *)pVal));
memcpy((char *)pData,(char *)&nTmp,sizeof(nTmp));
return true;
}
else if(nFieldType == FT_UINT32 && (*(int *)pVal <= 9999))
{
nTmp = (short)(*((unsigned int *)pVal));
memcpy((char *)pData,(char *)&nTmp,sizeof(nTmp));
return true;
}
else if(nFieldType == FT_INT64 && (*(long long *)pVal <= 9999LL) && (*(long long *)pVal >= -9999LL))
{
nTmp = (short)(*(long long *)pVal);
memcpy((char *)pData,(char *)&nTmp,sizeof(nTmp));
return true;
}
else if(nFieldType == FT_UINT64 && (*(unsigned long long *)pVal <= 9999))
{
nTmp = (short)(*((unsigned long long *)pVal));
memcpy((char *)pData,(char *)&nTmp,sizeof(nTmp));
return true;
}
else
{
return false;
}
}
else if(psDbColumnMeta->m_nInternalType == CIT_INT8)
{
char nTmp;
if(nFieldType == FT_INT8 && (*(char *)pVal <= 99) && (*(char *)pVal >= -99))
{
memcpy((char *)pData,(char *)pVal,sizeof(char));
return true;
}
else if(nFieldType == FT_UINT8 && (*(char *)pVal <= 99))
{
nTmp = (char)(*((unsigned char *)pVal));
memcpy((char *)pData,(char *)&nTmp,sizeof(nTmp));
return true;
}
else if(nFieldType == FT_INT16 && (*(short *)pVal <= 99) && (*(short *)pVal >= -99))
{
nTmp = (char)(*((short *)pVal));
memcpy((char *)pData,(char *)&nTmp,sizeof(nTmp));
return true;
}
else if(nFieldType == FT_UINT16 && (*(short *)pVal <= 99))
{
nTmp = (char)(*((unsigned short *)pVal));
memcpy((char *)pData,(char *)&nTmp,sizeof(nTmp));
return true;
}
else if(nFieldType == FT_INT32 && (*(int *)pVal <= 99) && (*(int *)pVal >= -99))
{
nTmp = (char)(*((int *)pVal));
memcpy((char *)pData,(char *)&nTmp,sizeof(nTmp));
return true;
}
else if(nFieldType == FT_UINT32 && (*(int *)pVal <= 99))
{
nTmp = (char)(*((unsigned int *)pVal));
memcpy((char *)pData,(char *)&nTmp,sizeof(nTmp));
return true;
}
else if(nFieldType == FT_INT64 && (*(long long *)pVal <= 99LL) && (*(long long *)pVal >= -99LL))
{
nTmp = (char)(*(long long *)pVal);
memcpy((char *)pData,(char *)&nTmp,sizeof(nTmp));
return true;
}
else if(nFieldType == FT_UINT64 && (*(unsigned long long *)pVal <= 99))
{
nTmp = (char)(*((unsigned long long *)pVal));
memcpy((char *)pData,(char *)&nTmp,sizeof(nTmp));
return true;
}
else
{
return false;
}
}
else if(psDbColumnMeta->m_nInternalType == CIT_CHARARRAY)
{
if(nFieldType == FT_STRING && (int)(strlen((char *)pVal)) < psDbColumnMeta->m_nColLen)
{
char *pHead = (char *)pData;
strcpy(pHead,(char *)pVal);
//char *pRemain = pHead + strlen((char *)pVal);
//memset(pRemain,0,psDbColumnMeta->m_nColTypeLen-strlen((char *)pVal));
//pHead[psDbColumnMeta->m_nColTypeLen] = 0;
return true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -