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

📄 mdbdict.cpp

📁 一个自行开发的内存数据管理的包
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//----------------------------------------------------------------------------
// 程序名称:   DbDict.cpp
// 程序说明:   CDbDict类实现
// 程序作者:   陈立峰
// 程序版本:   1.0
// 开始日期:   2005-06-09
//----------------------------------------------------------------------------
#include "MdbDict.h"
#include <iostream>
#include <strings.h>

using namespace std;

//----------------------------------------------------------------------------
// 函数原型: CWorkFlow::CWorkFlow(int nBucketNum)
// 函数功能: CWorkFlow    构造函数
// 传入参数: 无
// 传出参数: 无
// 函数返回: 无
// 注意事项: 无
//---------------------------------------------------------------------------- 
CDbTableMeta *CMdbDict::findTableMeta(const char *szTblName)
{
	for(CDbTableMeta *psTableMeta = (CDbTableMeta *)*m_ppsTableMeta;psTableMeta != NULL;psTableMeta = psTableMeta->m_psNext)
	{
		if(strcasecmp(psTableMeta->m_szTblName,szTblName) == 0)
		{
			return psTableMeta;
		}
	}
	return NULL;
}

//----------------------------------------------------------------------------
// 函数原型: CWorkFlow::CWorkFlow(int nBucketNum)
// 函数功能: CWorkFlow    构造函数
// 传入参数: 无
// 传出参数: 无
// 函数返回: 无
// 注意事项: 无
//---------------------------------------------------------------------------- 
CDbTableMeta *CMdbDict::getTableMeta(const char *szTblName)
{
	CDbTableMeta *psTableMeta = findTableMeta(szTblName);
	if(!psTableMeta)
	{
		throwException(MDB_EC_NORMAL,MDB_ET_TBL_MISSING,"CMdbDict::getTableMeta Error,Table %s Not Exist\n",szTblName);
	}
	return psTableMeta;
}

//----------------------------------------------------------------------------
// 函数原型: CWorkFlow::CWorkFlow(int nBucketNum)
// 函数功能: CWorkFlow    构造函数
// 传入参数: 无
// 传出参数: 无
// 函数返回: 无
// 注意事项: 无
//---------------------------------------------------------------------------- 
CDbTableMeta  *CMdbDict::enumTableMeta(CDbTableMeta  *psPrevTblMeta)
{
	if(!psPrevTblMeta)
	{
		return *m_ppsTableMeta;
	}
	else
	{
		return psPrevTblMeta->m_psNext;
	}
}		
		
//----------------------------------------------------------------------------
// 函数原型: CWorkFlow::CWorkFlow(int nBucketNum)
// 函数功能: CWorkFlow    构造函数
// 传入参数: 无
// 传出参数: 无
// 函数返回: 无
// 注意事项: 无
//---------------------------------------------------------------------------- 
CDbColumnMeta *CMdbDict::findColumMeta(CDbTableMeta *psDbTableMeta,const char *szColName)
{
	
	for(int i=0;i<psDbTableMeta->m_nColCnt;i++)
	{
		CDbColumnMeta *psDbColumnMeta = psDbTableMeta->m_psColumns;
		if(strcasecmp(psDbColumnMeta[i].m_szColName,szColName) == 0)
		{
			return &(psDbColumnMeta[i]);
		}
	}
	return NULL;
}

//----------------------------------------------------------------------------
// 函数原型: CWorkFlow::CWorkFlow(int nBucketNum)
// 函数功能: CWorkFlow    构造函数
// 传入参数: 无
// 传出参数: 无
// 函数返回: 无
// 注意事项: 无
//---------------------------------------------------------------------------- 	
CDbTableMeta  *CMdbDict::insertTableMeta(SCreateTblPara *psCreateTblPara,SCreateIdxesPara *psCreateIdxesPara)
{
	if(findTableMeta(psCreateTblPara->m_szTblName) != NULL)
	{
		throwException(MDB_EC_NORMAL,MDB_ET_TBL_DUP,"CMdbDict::insertTableMeta Error,Table %s has been Exist\n",psCreateTblPara->m_szTblName);
	}
	
	if(psCreateTblPara->m_nColCnt == 0)
	{
		throwException(MDB_EC_NORMAL,MDB_ET_ZERO_COL_CNT,"CMdbDict::insertTableMeta Error,Table %s Column Count is zero\n",psCreateTblPara->m_szTblName);
	}
	
	void *ptr;
	if((ptr = m_pcAlloc->malloc(sizeof(CDbColumnMeta)*(psCreateTblPara->m_nColCnt))) == NULL)
	{
	  	throwException(MDB_EC_NORMAL,MDB_ET_MEM_ALLOC_ERROR,"CMdbDict::insertTableMeta Error,Can not Alloc Memory for CDbColumnMeta,Table:%s\n",psCreateTblPara->m_szTblName);
	}

	CDbColumnMeta *psColMetas = reinterpret_cast<CDbColumnMeta *>(ptr);
	char* tmp = reinterpret_cast<char*>(ptr);
	for (int i=0; i<psCreateTblPara->m_nColCnt; i++)
	{
		CDbColumnMeta *psColMetasTmp = new (tmp) CDbColumnMeta;
		tmp += sizeof(CDbColumnMeta);
	}
//	CDbColumnMeta *psColMetas = new (ptr) CDbColumnMeta[psCreateTblPara->m_nColCnt];
	
	int nTotalSize = 0;
	for(int i=0;i<psCreateTblPara->m_nColCnt;i++)
	{
		if(strlen((psCreateTblPara->m_psCreateColPara)[i].m_szColName) >= TBL_META_MAX_COL_NAME_LEN)
		{
			throwException(MDB_EC_NORMAL,MDB_ET_COL_NAME_TOO_LONG,"CMdbDict::insertTableMeta Error,Column Name is Too Long,Tbl:%s,Col:%s\n",psCreateTblPara->m_szTblName,(psCreateTblPara->m_psCreateColPara)[i].m_szColName);
		}
		strcpy(psColMetas[i].m_szColName,(psCreateTblPara->m_psCreateColPara)[i].m_szColName);
		psColMetas[i].m_nColType = (psCreateTblPara->m_psCreateColPara)[i].m_nColType;
		psColMetas[i].m_nColTypeLen = (psCreateTblPara->m_psCreateColPara)[i].m_nColTypeLen;
		calcInterPresent(psColMetas[i].m_nInternalType,psColMetas[i].m_nColLen,psCreateTblPara->m_szTblName,psColMetas[i].m_szColName,psColMetas[i].m_nColType,psColMetas[i].m_nColTypeLen);
		nTotalSize += psColMetas[i].m_nColLen;
		if(i==0)
		{
			psColMetas[i].m_nOffset = 0;
		}
		else
		{
			psColMetas[i].m_nOffset = psColMetas[i-1].m_nOffset + psColMetas[i-1].m_nColLen; 
		}
	}
	
	void *ptr2;
	if((ptr2 = m_pcAlloc->malloc(sizeof(CDbTableMeta))) == NULL)
	{
	  	throwException(MDB_EC_NORMAL,MDB_ET_MEM_ALLOC_ERROR,"CMdbDict::insertTableMeta Error,Can not Alloc Memory forCDbColumnMeta,Table:%s\n",psCreateTblPara->m_szTblName);
	}

//	CDbTableMeta *psTblMeta = reinterpret_cast<CDbTableMeta *>(ptr2);
	CDbTableMeta *psTblMeta = new (ptr2) CDbTableMeta();

	if(strlen(psCreateTblPara->m_szTblName) >= TBL_META_MAX_TABLE_NAME_LEN)
	{
		throwException(MDB_EC_NORMAL,MDB_ET_TBL_NAME_TOO_LONG,"CMdbDict::insertTableMeta Error,Table Name is Too Long,Tbl:%s\n",psCreateTblPara->m_szTblName);
	}
	strcpy(psTblMeta->m_szTblName,psCreateTblPara->m_szTblName);

	psTblMeta->m_nRecLen = nTotalSize;

	psTblMeta->m_nColCnt = psCreateTblPara->m_nColCnt;

	psTblMeta->m_psColumns = psColMetas;

	psTblMeta->m_nOwnerPid = -1;
	psTblMeta->m_psSharePids = (CProcNode *)NULL;
	psTblMeta->m_psTblEntry = (void *)NULL;
	for (int i=0; i<TBL_META_MAX_SHARE_PROCESS; i++)
		psTblMeta->m_bShareProcMark[i] = false;

	if(psCreateIdxesPara && psCreateIdxesPara->m_nIdxCnt != 0)
	{
		void *ptr3;
		if((ptr3 = m_pcAlloc->malloc(sizeof(CDbIndexMeta)*(psCreateIdxesPara->m_nIdxCnt))) == NULL)
		{
	  		throwException(MDB_EC_NORMAL,MDB_ET_MEM_ALLOC_ERROR,"CMdbDict::insertTableMeta Error,Can not Alloc Memory for CDbIndexMeta,Tbl:%s\n",psCreateTblPara->m_szTblName);
		}
		CDbIndexMeta *psIdxMetas = reinterpret_cast<CDbIndexMeta *>(ptr3);
		char* tmp = reinterpret_cast<char*>(ptr3);
		for (int i=0; i<psCreateIdxesPara->m_nIdxCnt; i++)
		{
			CDbIndexMeta *psIdxMetasTmp = new (tmp) CDbIndexMeta;
			tmp += sizeof(CDbIndexMeta);
		}
//		CDbIndexMeta *psIdxMetas = new (ptr3) CDbIndexMeta [psCreateIdxesPara->m_nIdxCnt];
	
		for(int i=0;i<psCreateIdxesPara->m_nIdxCnt;i++)
		{
			if(strlen((psCreateIdxesPara->m_psCreateIdxParea)[i].m_szIdxName) >= TBL_META_MAX_INDEX_NAME_LEN)
			{
				throwException(MDB_EC_NORMAL,MDB_ET_IDX_NAME_TOO_LONG,"CMdbDict::insertTableMeta Error,Index Name is Too Long,Tbl:%s,Idx:%s\n",psCreateTblPara->m_szTblName,(psCreateIdxesPara->m_psCreateIdxParea)[i].m_szIdxName);
			}
			strcpy(psIdxMetas[i].m_szIndexName,(psCreateIdxesPara->m_psCreateIdxParea)[i].m_szIdxName);
			psIdxMetas[i].m_nIdxType = (psCreateIdxesPara->m_psCreateIdxParea)[i].m_nIdxType;
			psIdxMetas[i].m_nColCnt = (psCreateIdxesPara->m_psCreateIdxParea)[i].m_nColCnt;
			
			void *ptr4;
			if((ptr4 = m_pcAlloc->malloc(sizeof(ACE_Based_Pointer<CDbColumnMeta>)*psIdxMetas[i].m_nColCnt)) == NULL)
			{
		  		throwException(MDB_EC_NORMAL,MDB_ET_MEM_ALLOC_ERROR,"CMdbDict::insertTableMeta Error,Can not Alloc Memory for CDbIndexMeta,Tbl:%s\n",psCreateTblPara->m_szTblName);
			}
//			ACE_Based_Pointer<CDbColumnMeta> *ppsColumnMeta = reinterpret_cast<ACE_Based_Pointer<CDbColumnMeta> *>(ptr4);
			char* tmp = reinterpret_cast<char*>(ptr4);
			ACE_Based_Pointer<CDbColumnMeta> *ppsColumnMeta = reinterpret_cast<ACE_Based_Pointer<CDbColumnMeta> *>(ptr4);
			for (int i=0; i<psIdxMetas[i].m_nColCnt; i++)
			{
				ACE_Based_Pointer<CDbColumnMeta> *ppsColumnMetaTmp = new (tmp) ACE_Based_Pointer<CDbColumnMeta>;
				tmp += sizeof(ACE_Based_Pointer<CDbColumnMeta>);
			}
//			ACE_Based_Pointer<CDbColumnMeta> *ppsColumnMeta = new (ptr4) ACE_Based_Pointer<CDbColumnMeta> [psIdxMetas[i].m_nColCnt];

			for(int j=0;j<psIdxMetas[i].m_nColCnt;j++)
			{
				CDbColumnMeta * psColumnMeta = findColumMeta(psTblMeta,(psCreateIdxesPara->m_psCreateIdxParea)[i].m_szColNames[j]);
				if(!psColumnMeta)
				{
					throwException(MDB_EC_NORMAL,MDB_ET_IDX_INVALID_COL_NAME,"CMdbDict::insertTableMeta Error,Invalid Index Column Name,Tbl:%s,Idx:%s,Col:%s\n",psCreateTblPara->m_szTblName,(psCreateIdxesPara->m_psCreateIdxParea)[i].m_szIdxName,(psCreateIdxesPara->m_psCreateIdxParea)[i].m_szColNames[j]);
				}
				ppsColumnMeta[j] = psColumnMeta;
			}
			psIdxMetas[i].m_ppsColumns = ppsColumnMeta;
			psIdxMetas[i].m_psIndexEntry = (void *)NULL;
			
		}
		psTblMeta->m_nIdxCnt = psCreateIdxesPara->m_nIdxCnt;
		psTblMeta->m_psIndexs = psIdxMetas;
	}
	else
	{
		//cerr << "index count = 0" << endl;
		psTblMeta->m_nIdxCnt = 0;
		psTblMeta->m_psIndexs = (CDbIndexMeta *)NULL;
	}
	psTblMeta->m_psNext = (CDbTableMeta *)(*m_ppsTableMeta);
	*m_ppsTableMeta = psTblMeta;
	return psTblMeta;
}

//----------------------------------------------------------------------------
// 函数原型: CWorkFlow::CWorkFlow(int nBucketNum)

⌨️ 快捷键说明

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