📄 mdbdict.cpp
字号:
//----------------------------------------------------------------------------
// 程序名称: 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 + -