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

📄 mdbtbl.cpp

📁 一个自行开发的内存数据管理的包
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		else if(nSrcFieldType == FT_UINT32)
		{
			*(long long*)pDstFieldVal = (long long)(*(unsigned int *)pSrcFieldVal);
		}
		else if(nSrcFieldType == FT_INT32)
		{
			*(long long*)pDstFieldVal = (long long)(*(int *)pSrcFieldVal);
		}
		else if(nSrcFieldType == FT_UINT64  && *(unsigned long long *)pSrcFieldVal <= 9223372036854775807LL)
		{
			*(long long*)pDstFieldVal = (long long)(*(unsigned long long  *)pSrcFieldVal);
		}
		else if(nSrcFieldType == FT_INT64)
		{
			*(long long*)pDstFieldVal = *(long long  *)pSrcFieldVal;
		}
	}
	else if(nSrcFieldType == FT_STRING && nDstFieldType == FT_STRING)
	{
		*(char **)pDstFieldVal =  *(char **)pSrcFieldVal;
	}
	else
	{
		return false;
	}
	return true;
	
}
//----------------------------------------------------------------------------
// 函数原型: CWorkFlow::CWorkFlow(int nBucketNum)
// 函数功能: CWorkFlow    构造函数
// 传入参数: 无
// 传出参数: 无
// 函数返回: 无
// 注意事项: 无
//---------------------------------------------------------------------------- 	  
void  CMdbTbl::getAutoFieldValByName(CRecordNode *pRec,const char *szFieldName,int &nFieldType,void *pVal)
{
	CDbColumnMeta *psColumnMeta;
	if((psColumnMeta = m_pcDbDict->findColumMeta(m_psTableMeta,szFieldName)) == NULL)
	{
		throwException(MDB_EC_NORMAL,MDB_ET_INVALID_COL_NAME,"CMdbTbl::getAutoFieldValByName Error,Can not Find ColumnMeta,Tbl:%s,Col:%s\n",m_psTableMeta->m_szTblName,szFieldName);
	}
	void *pData = pRec->m_psData;
	pData = (char *)pData + psColumnMeta->m_nOffset;
	getFieldVal(pData,psColumnMeta,nFieldType,pVal);
}



//----------------------------------------------------------------------------
// 函数原型: CWorkFlow::CWorkFlow(int nBucketNum)
// 函数功能: CWorkFlow    构造函数
// 传入参数: 无
// 传出参数: 无
// 函数返回: 无
// 注意事项: 无
//---------------------------------------------------------------------------- 
void CMdbTbl::getFieldVal(void *pData,CDbColumnMeta *psDbColumnMeta,int &nFieldType,void *pVal)
{
	if(psDbColumnMeta->m_nInternalType == CIT_INT64)
	{
		nFieldType = FT_INT64;
		memcpy((char *)pVal,(char *)pData,sizeof(long long));
	}
	else if(psDbColumnMeta->m_nInternalType == CIT_INT32)
	{
		nFieldType = FT_INT32;
		memcpy((char *)pVal,(char *)pData,sizeof(int));
	}
	else if(psDbColumnMeta->m_nInternalType == CIT_INT16)
	{
		nFieldType = FT_INT16;
		memcpy((char *)pVal,(char *)pData,sizeof(short));
	}
	else if(psDbColumnMeta->m_nInternalType == CIT_INT8)
	{
		nFieldType = FT_INT8;
		memcpy((char *)pVal,(char *)pData,sizeof(char));
	}
	else if(psDbColumnMeta->m_nInternalType == CIT_CHARARRAY)
	{
		nFieldType = FT_STRING;
		//memcpy((char *)pVal,(char *)pData,sizeof(char *));
		*((char **)pVal) = (char*)pData;
	}
	else if(psDbColumnMeta->m_nInternalType == CIT_STRING)
	{
		nFieldType = FT_STRING;
		long nTmp;
		memcpy((char *)&nTmp,(char *)pData,sizeof(long));
		if(nTmp)
		{
			char * ptr = (char *)pData + nTmp;
			*((char **)pVal) = ptr;
		}
		else
		{
			*((char **)pVal) =  (char *)NULL;
		}
	}
}

/*
//----------------------------------------------------------------------------
// 函数原型: CWorkFlow::CWorkFlow(int nBucketNum)
// 函数功能: CWorkFlow    构造函数
// 传入参数: 无
// 传出参数: 无
// 函数返回: 无
// 注意事项: 无
//---------------------------------------------------------------------------- 	
void  CMdbTbl::getAutoFieldRefByName(CRecordNode *pRec,const char *szFieldName,int &nFieldType,CFieldRef &sRef)
{
	CDbColumnMeta *psColumnMeta;
	if((psColumnMeta = m_pcDbDict->findColumMeta(m_psTableMeta,szFieldName)) == NULL)
	{
		throwException(META_COL_ERROR,"CMdbTbl::getFieldRefByName Error,Can not Find ColumnMeta\n");
	}
	void *pData = pRec->m_psData;
	pData = (char *)pData + psColumnMeta->m_nOffset;
	sRef.m_psColumnMeta = psColumnMeta;
	sRef.m_pField = pData;
	
	getFieldType(psColumnMeta,nFieldType);
}
*/

/*
//----------------------------------------------------------------------------
// 函数原型: CWorkFlow::CWorkFlow(int nBucketNum)
// 函数功能: CWorkFlow    构造函数
// 传入参数: 无
// 传出参数: 无
// 函数返回: 无
// 注意事项: 无
//---------------------------------------------------------------------------- 		
void  CMdbTbl::getFieldType(CDbColumnMeta *psDbColumnMeta,int &nFieldType)
{
	if(psDbColumnMeta->m_nInternalType == CIT_INT64)
	{
		nFieldType = FT_INT64;
	}
	else if(psDbColumnMeta->m_nInternalType == CIT_INT32)
	{
		nFieldType = FT_INT32;
	}
	else if(psDbColumnMeta->m_nInternalType == CIT_INT16)
	{
		nFieldType = FT_INT16;
	}
	else if(psDbColumnMeta->m_nInternalType == CIT_INT8)
	{
		nFieldType = FT_INT8;
	}
	else if(psDbColumnMeta->m_nInternalType == CIT_CHARARRAY)
	{
		nFieldType = FT_STRING;
	}
	else if(psDbColumnMeta->m_nInternalType == CIT_STRING)
	{
		nFieldType = FT_STRING;
	}
}
*/

//----------------------------------------------------------------------------
// 函数原型: CWorkFlow::CWorkFlow(int nBucketNum)
// 函数功能: CWorkFlow    构造函数
// 传入参数: 无
// 传出参数: 无
// 函数返回: 无
// 注意事项: 无
//---------------------------------------------------------------------------- 
void  CMdbTbl::setFieldValByIndex(CRecordNode *pRec,int nFieldIndex,int nFieldType,const void *pVal)
{
	CDbColumnMeta *psColumnMeta;
	if(nFieldIndex >= m_pcDbDict->getColumnCnt(m_psTableMeta))
	{
		throwException(MDB_EC_NORMAL,MDB_ET_INVALID_COL_INDEX,"CMdbTbl::setFieldValByIndex Error,Can not Find ColumnMeta,Tbl:%s,ColIndex:%d\n",m_psTableMeta->m_szTblName,nFieldIndex);
	}
	psColumnMeta = m_pcDbDict->getColumnMeta(m_psTableMeta,nFieldIndex);
	void *pData = pRec->m_psData;
	pData = (char *)pData + psColumnMeta->m_nOffset;
	if(!setFieldVal(pData,psColumnMeta,nFieldType,pVal))
	{
		throwException(MDB_EC_NORMAL,MDB_ET_INVALID_COL_VAL,"CMdbTbl::setFieldValByIndex Error,setFieldVal Failed,Tbl:%s,ColIndex:%d\n,ColType:%d",m_psTableMeta->m_szTblName,nFieldIndex,nFieldType);
	}
}

//----------------------------------------------------------------------------
// 函数原型: CWorkFlow::CWorkFlow(int nBucketNum)
// 函数功能: CWorkFlow    构造函数
// 传入参数: 无
// 传出参数: 无
// 函数返回: 无
// 注意事项: 无
//---------------------------------------------------------------------------- 	  
void  CMdbTbl::getFieldValByIndex(CRecordNode *pRec,int nFieldIndex,int nFieldType,void *pVal)
{
	CDbColumnMeta *psColumnMeta;
	if(nFieldIndex >= m_pcDbDict->getColumnCnt(m_psTableMeta))
	{
		throwException(MDB_EC_NORMAL,MDB_ET_INVALID_COL_INDEX,"CMdbTbl::getFieldValByIndex Error,Can not Find ColumnMeta,Tbl:%s,ColIndex:%d\n",m_psTableMeta->m_szTblName,nFieldIndex);
	}
	psColumnMeta = m_pcDbDict->getColumnMeta(m_psTableMeta,nFieldIndex);
	void *pData = pRec->m_psData;
	pData = (char *)pData + psColumnMeta->m_nOffset;
	int nSrcFieldType;
	UVal uVal;
	getFieldVal(pData,psColumnMeta,nSrcFieldType,&uVal);
	if(castVal(nSrcFieldType,&uVal,nFieldType,pVal) == false)
	{
		throwException(MDB_EC_NORMAL,MDB_ET_INVALID_FIELD_TYPE,"CMdbTbl::getFieldValByIndex Error,InCompatiable FieldType,Tbl:%s,ColIndex:%d\n,FieldType:%d\n",m_psTableMeta->m_szTblName,nFieldIndex,nFieldType);
	}
}

//----------------------------------------------------------------------------
// 函数原型: CWorkFlow::CWorkFlow(int nBucketNum)
// 函数功能: CWorkFlow    构造函数
// 传入参数: 无
// 传出参数: 无
// 函数返回: 无
// 注意事项: 无
//---------------------------------------------------------------------------- 	  
void  CMdbTbl::getAutoFieldValByIndex(CRecordNode *pRec,int nFieldIndex,int &nFieldType,void *pVal)
{
	CDbColumnMeta *psColumnMeta;
	if(nFieldIndex >= m_pcDbDict->getColumnCnt(m_psTableMeta))
	{
		throwException(MDB_EC_NORMAL,MDB_ET_INVALID_COL_INDEX,"CMdbTbl::getAutoFieldValByIndex Error,Can not Find ColumnMeta,Tbl:%s,ColIndex:%d\n",m_psTableMeta->m_szTblName,nFieldIndex);
	}
	psColumnMeta = m_pcDbDict->getColumnMeta(m_psTableMeta,nFieldIndex);
	void *pData = pRec->m_psData;
	pData = (char *)pData + psColumnMeta->m_nOffset;
	getFieldVal(pData,psColumnMeta,nFieldType,pVal);
}

/*
//----------------------------------------------------------------------------
// 函数原型: CWorkFlow::CWorkFlow(int nBucketNum)
// 函数功能: CWorkFlow    构造函数
// 传入参数: 无
// 传出参数: 无
// 函数返回: 无
// 注意事项: 无
//---------------------------------------------------------------------------- 	
void  CMdbTbl::getAutoFieldRefByIndex(CRecordNode *pRec,int nFieldIndex,int &nFieldType,CFieldRef &sRef)
{
	CDbColumnMeta *psColumnMeta;
	if(nFieldIndex >= m_pcDbDict->getColumnCnt(m_psTableMeta))
	{
		throwException(META_COL_ERROR,"CMdbTbl::setFieldValByIndex Error,Index Larger than Max Col Count\n");
	}
	psColumnMeta = m_pcDbDict->getColumnMeta(m_psTableMeta,nFieldIndex);
	void *pData = pRec->m_psData;
	pData = (char *)pData + psColumnMeta->m_nOffset;
	sRef.m_psColumnMeta = psColumnMeta;
	sRef.m_pField = pData;
	
	getFieldType(psColumnMeta,nFieldType);
}	
*/

/*
//----------------------------------------------------------------------------
// 函数原型: CWorkFlow::CWorkFlow(int nBucketNum)
// 函数功能: CWorkFlow    构造函数
// 传入参数: 无
// 传出参数: 无
// 函数返回: 无
// 注意事项: 无
//---------------------------------------------------------------------------- 		
void  CMdbTbl::setFieldValByRef(CFieldRef &sRef,int nFieldType,const void *pVal)
{
	
	if(!setFieldVal(sRef.m_pField,sRef.m_psColumnMeta,nFieldType,pVal))
	{
		throwException(ARG_ERROR,"CMdbTbl::setFieldValByRef Error,setFieldVal Failed\n");
	}
}		
*/
		
//----------------------------------------------------------------------------
// 函数原型: CWorkFlow::CWorkFlow(int nBucketNum)
// 函数功能: CWorkFlow    构造函数
// 传入参数: 无
// 传出参数: 无
// 函数返回: 无
// 注意事项: 无
//---------------------------------------------------------------------------- 
void CMdbTbl::removeRecord(CRecordNode *pRec)
{
	if((CRecordNode *)(pRec->m_psPrev) == NULL)
	{
		m_psTableMeta->m_psTblEntry = reinterpret_cast<void *>((pRec->m_psNext).addr());
		if( (CRecordNode *)(pRec->m_psNext) != NULL)
		{
			(pRec->m_psNext)->m_psPrev = NULL;
		}
	}
	else
	{
		(pRec->m_psPrev)->m_psNext = pRec->m_psNext;
		if( (CRecordNode *)(pRec->m_psNext) != NULL)
		{
			(pRec->m_psNext)->m_psPrev = pRec->m_psPrev;
		}
	}
	
	
	int nColCnt = m_pcDbDict->getColumnCnt(m_psTableMeta);
	for(int i=0;i<nColCnt;i++)
	{
		CDbColumnMeta *psColumnMeta = m_pcDbDict->getColumnMeta(m_psTableMeta,i);
		if(psColumnMeta->m_nInternalType == CIT_STRING)
		{
			int nFieldType;
			char *pSzCol;
			getAutoFieldValByMeta(pRec,psColumnMeta,nFieldType,(void *)(&pSzCol));
			if(pSzCol)
			{
				//cerr << "free found" << endl;
				m_pcAlloc->free((void *)pSzCol);	
			}
		}
	}
	//cerr << "free found" << endl;
//	m_pcAlloc->free((void *)pRec->m_psData);
	m_pcAlloc->free(pRec->m_psData.addr());		/**< add by mol */
	m_pcAlloc->free((void *)pRec);
} 

//----------------------------------------------------------------------------
// 函数原型: CWorkFlow::CWorkFlow(int nBucketNum)
// 函数功能: CWorkFlow    构造函数
// 传入参数: 无
// 传出参数: 无
// 函数返回: 无
// 注意事项: 无
//---------------------------------------------------------------------------- 
void CMdbTbl::truncate()
{
	CRecordNode *psRecordNode = reinterpret_cast<CRecordNode *>((m_psTableMeta->m_psTblEntry).addr());
	while(psRecordNode)
	{
		CRecordNode *psNextRecordNode = psRecordNode->m_psNext;
		//m_pcAlloc->free((void *)psRecordNode);
		removeRecord(psRecordNode);
		psRecordNode = psNextRecordNode;
	}
	m_psTableMeta->m_psTblEntry = reinterpret_cast<void *>(NULL);
} 

//----------------------------------------------------------------------------
// 函数原型: CWorkFlow::CWorkFlow(int nBucketNum)
// 函数功能: CWorkFlow    构造函数
// 传入参数: 无
// 传出参数: 无

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -