⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mdbtbl.cpp

📁 一个自行开发的内存数据管理的包
💻 CPP
📖 第 1 页 / 共 4 页
字号:
//----------------------------------------------------------------------------
// 程序名称:   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 + -