/*!
* @file MemTable_trans.c 事务操作
* <br> copyright (C), 1995-2005, Si-Tech Information Technology Ltd
* @author wangjs
* @version 1.0
* @date 2008-07-20
*/
#include "MemTable.h"
/*****************************************************************/
/*!
* @brief 设置等值查找时的条件.
* @param [out] TC 查询树节点游标
* @param [in] key 待查找的值
* @return 无
*/
void Ts_SetEQ(TREE_CURSOR *TC, char *key)
{
TC->tiPos = 0;
TC->tiNum = 0;
TC->curTmi = TC->tmi;
TC->minKey = key;
TC->maxKey = NULL;
TC->optSign = 103; /*DATA_TYPE_EQ*/;
return;
}
/*****************************************************************/
/*!
* @brief 获取一张表的临时变更记录数.
* @param [in] TD 表指针
* @param [in] transBuf 事务指针
* @return 变更记录数
*/
int Ts_GetTabChgCount(TABLE_DATA *TD, TRANS_BUF *transBuf)
{
int i;
for(i=0; i<transBuf->tabNum; i++)
{
if(TD == transBuf->allTab[i]->TD)
return transBuf->allTab[i]->change_count;
}
return 0;
}
/*****************************************************************/
/*!
* @brief 判断一条记录是否在事务缓冲区.
* @param [in] TD 表指针
* @param [in] areaPos 内存块序号
* @param [in] recPos 内存块内部记录号
* @param [in] transBuf 事务指针
* @return 对应的事务记录指针,如果为空,表示不存在
*/
TRANS_REC *Ts_IsInTransBuf(TABLE_DATA *TD, int areaPos, int recPos, TRANS_BUF *transBuf)
{
TRANS_TAB *tmpTrans;
TRANS_REC *tmpTRec;
int tid;
tmpTrans = transBuf->transTab;
while(NULL != tmpTrans)
{
if(TD == tmpTrans->TD)
break;
tmpTrans = tmpTrans->next;
}
if(NULL == tmpTrans)
return NULL;
tid = recPos%TRANS_HASH_NUM;
tmpTRec = tmpTrans->transRec[tid];
/*判断此hash节点是否应该置空 20081025 wangjs修改*/
if( (NULL != tmpTRec) && (-1 == tmpTRec->area_pos) )
{
tmpTrans->transRec[tid] = NULL;
tmpTRec = NULL;
}
while(NULL != tmpTRec)
{
if( (recPos == tmpTRec->rec_pos)&&(areaPos == tmpTRec->area_pos) )
break;
tmpTRec = tmpTRec->next;
}
return tmpTRec;
}
/*****************************************************************/
/*!
* @brief 为一条记录创建索引.
* @param [out] errStr 出错新乡
* @param [in] indexNo 索引序号
* @param [in] TD 表指针
* @param [in] TF 表结构
* @param [in] newP 待插入的记录
* @param [in] areaPos 插入位置(数据块序号)
* @param [in] recPos 插入位置(数据块内记录序号)
* @return 0 成功, <0 失败
*/
int Ts_CreateIndRec(char *errStr, int indexNo, TABLE_DATA *TD, TABLE_DEF *TF,
char *newP, int areaPos, int recPos)
{
INDEX_DEF *IXF = &(TF->index[indexNo]);
if(HASH_INDEX == IXF->index_type)
{
INDEX_RECORD *IR;
if(0 != TP_CreateIndex(errStr, &IR, newP, TD, indexNo, 1, 0)) /*不检测主键*/
return ERRNO_SQL;
IR->area_pos = areaPos;
IR->rec_pos = recPos;
IR->useFlag = 0;
}
else
{
int flag;
TREE_ITEM TI;
TI.area_pos = areaPos;
TI.rec_pos = recPos;
TD->tree[indexNo] = Tree_insert(errStr, TD, TD->tree[indexNo], &TI,
&(TF->column[IXF->field_no[0]]), &flag);
if(NULL == TD->tree[indexNo])
return ERRNO_SQL;
}
return 0;
}
/*****************************************************************/
/*!
* @brief 删除表的一条数据的索引
* @param [in] indexNo 索引序号
* @param [in] TD 表指针
* @param [in] TF 表结构
* @param [in] dataP 要删除的记录
* @param [in] areaPos 内存块序号
* @param [in] recPos 记录序号
* @return 无
*/
void Ts_DeleteInd(int indexNo, TABLE_DATA *TD, TABLE_DEF *TF, char *dataP, int areaPos, int recPos)
{
INDEX_DEF *IXF;
IXF = &(TF->index[indexNo]);
if(HASH_INDEX == IXF->index_type) /*HASH索引*/
{
INDEX_RECORD *tmpIR;
char indexStr[300];
TP_GetIndexStr(indexStr, dataP, IXF, TF->column);
if( TP_GetIndex(&tmpIR, TD->index_p[indexNo], TD->dataArea.dataP, IXF, TF->column, indexStr, TF->data_len) )
{
while(NULL != tmpIR)
{
if( (0 == tmpIR->useFlag) &&
(tmpIR->area_pos == areaPos) &&
(tmpIR->rec_pos == recPos) )
{
tmpIR->useFlag = 1; /*将此索引置为删除*/
break;
}
tmpIR = tmpIR->next;
}
}
}
else /*Tree索引*/
{
int roarFlag, findFlag;
TREE_CURSOR TC;
COLUMN_DEF *CF = &(TF->column[IXF->field_no[0]]);
Ts_SetEQ(&TC, dataP + CF->data_pos);
TD->tree[indexNo] = Tree_remove(TD, TD->tree[indexNo], CF, &TC, &findFlag, &roarFlag, areaPos, recPos);
}
return;
}
/*****************************************************************/
/*!
* @brief 删除表的一条数据的索引,并将数据坐标写入空闲列表.
* @param [in] TD 表指针
* @param [in] TF 表结构
* @param [in] DA 数据区首指针
* @param [in] dataP 要删除的记录
* @param [in] areaPos 内存块序号
* @param [in] recPos 记录序号
* @return 无
*/
void Ts_DeleteP(TABLE_DATA *TD, TABLE_DEF *TF, DATA_AREA *DA, char *dataP, int areaPos, int recPos)
{
int i;
FREE_AREA *ptmpFree;
/*删除索引对应的值*/
for(i=0; i<TF->index_num; i++)
{
Ts_DeleteInd(i, TD, TF, dataP, areaPos, recPos);
}
/*将本记录对应的数据区写到空闲列表*/
if((0 == DA->freeNum)||(MAX_REC_NUM_ONCE <= DA->freeNum)) /*一块空闲区被用完了*/
{
ptmpFree = (FREE_AREA *)P_MyMalloc(sizeof(FREE_AREA)); /*再申请一块*/
memset(ptmpFree, 0, sizeof(FREE_AREA));
ptmpFree->next = DA->pfree;
DA->pfree = ptmpFree;
DA->freeNum = 0;
}
else
ptmpFree = DA->pfree;
ptmpFree->area_pos[DA->freeNum] = areaPos;
ptmpFree->rec_pos[DA->freeNum] = recPos;
DA->freeNum++;
return;
}
/*****************************************************************/
/*!
* @brief 删除旧索引,重建新索引.
* @param [in] upInd 更新的索引序号,每个bit代表一个索引,0~7位。
* @param [in] oldP 旧记录
* @param [in] newP 新记录
* @param [in] opFlag 3位操作标志,0位表示删除、1位表示创建、2位表示是否比较新旧索引
* @param [in] areaPos 内存块序号
* @param [in] recPos 内存块内部记录号
* @param [in] TD 表指针
* @return 更新的索引序号,每个bit代表一个索引,0~7位。
*/
char Ts_DelAndCrtIndex(char upInd, char *oldP, char *newP, const char *opFlag,
int areaPos, int recPos, TABLE_DATA *TD)
{
int i;
char tmpInd, errStr[100], oldIndStr[256], newIndStr[256];
TABLE_DEF *TF;
INDEX_DEF *IXF;
if(0 == upInd)
return 0;
TF = &(TD->table_def);
tmpInd = upInd;
for(i=0; i<TF->index_num; i++)
{
if(1 == ((upInd >> i)&1) )
{
IXF = &(TF->index[i]);
if('1' == opFlag[2]) /*需要做新旧索引比较*/
{
TP_GetIndexStr(oldIndStr, oldP, IXF, TF->column);
TP_GetIndexStr(newIndStr, newP, IXF, TF->column);
if(0 == strcmp(oldIndStr, newIndStr)) /*无需操作*/
{
tmpInd&=~(1<<i); /*第i位置0*/
continue;
}
}
if('1' == opFlag[0]) /*删除旧索引*/
Ts_DeleteInd(i, TD, TF, oldP, areaPos, recPos)
没有合适的资源?快使用搜索试试~ 我知道了~
Oracle数据案例 C语言源码 C语言Oracle案例
共23个文件
c:11个
h:5个
dsw:1个
需积分: 9 10 下载量 144 浏览量
2010-11-27
11:42:12
上传
评论
收藏 75KB RAR 举报
温馨提示
Oracle数据案例 C语言源码 C语言Oracle案例 对于想了解用C做的Oracle的人很有帮助。
资源推荐
资源详情
资源评论
收起资源包目录
Oracle_Exp.rar (23个子文件)
Oracle_Exp
Database.dsw 524B
MyPublic.h 3KB
SYNC_Main.h 4KB
TreeIndex.c 31KB
SYNC_Init.c 25KB
Database.dsp 3KB
SYNC_Main.c 4KB
MemTable_func.c 22KB
MemTable.h 23KB
Debug
vc60.pdb 28KB
vc60.idb 33KB
Database.c 23KB
MemTable_trans.c 39KB
ini_rw.c 15KB
MyPublic.c 26KB
SYNC_Sync.c 30KB
ini_rw.h 1KB
MemTable_user.c 16KB
Database.plg 2KB
MemTable.c 30KB
Database.opt 48KB
Database.h 3KB
Database.ncb 41KB
共 23 条
- 1
资源评论
Sun_Shine0315
- 粉丝: 6
- 资源: 26
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于51单片机的自动浇花设计论文
- 客服机器人需要的数据集,包括order、ware、user,测试集和开发集
- 用0到9生成十位数的所有排列组合(java代码).docx
- 模仿魔慢相机的人脸监测选择ios组件
- STM32F103C8T6模拟IIC控制4针0.96寸OLED显示屏已测
- Chromeextent_paly.zip
- 【2023年全国职业技能大赛“信息安全与评估”赛项】任务4-Linux内存取证WP+靶场环境
- 基于51单片机数字电压表的设计(PCB+原理图+仿真+论文+代码)
- open62541在window10 VS2019编译完成的源码
- 新闻文章自动新闻采集系统-webapps.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功