📄 tran.cpp
字号:
/*******************************************************************************
名称:事务处理模块
功能:对错误的写文件操作进行事务回卷
程序员:韩冰
版本:1.0
时间:1999-05-13
*******************************************************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <io.h>
#include <dir.h>
#include "def.h"
#include "tran.h"
//构造函数.
Tran::Tran()
{
struct ffblk fblk;
//如果tran.dat存在,则回卷事务.
if(!findfirst("tran.dat" , &fblk , 0))
RollBack();
//插入事务集的数据文件的实际数量。
DBFNumber=0;
//将所有数据文件指针设为空。
for(int i=0;i<64;i++) DBF[i]=NULL;
}
//析构函数.
Tran::~Tran()
{
}
//开始事务
//将各文件长度和状态写入tran.dat文件.
int
Tran::BeginTran()
{
//临时文件指针。
FILE *fHandle;
//事务数据文件名。
strcpy(filename,"tran.dat");
//打开文件,确保文件存在.
if ((fHandle = fopen(filename, "a+b")) == NULL)
{
fclose(fHandle);
return L_ERROR;
}
//写文件.
for(int i=0;i<DBFNumber;i++)
{
fprintf(fHandle,"%64s|%09ld|\r\n", DBF[i]->FileName, DBF[i]->GetFileLen());
}
//关闭文件.
fclose(fHandle);
return L_OK;
}
//事务校验.
int
Tran::Commit()
{
//校验每一个数据文件的长度,正确返回L_ok,并删除事务文件,认为事务
//成功,否则返回L_ERROR。
for(int i=0; i<DBFNumber; i++)
{
if(DBF[i]->Parity() == L_ERROR)
return L_ERROR;
}
//校验成功,删除事务文件.
remove("tran.dat");
return L_OK;
}
//事务回卷.
int
Tran::RollBack()
{
//文件tran.dat.
FILE *fHandle;
//需要作事务处理的各文件.
FILE *fp;
//存取tran.dat中一行.
char buff[80];
char *temp;
//文件名和文件原始长度.
char fname[40];
char fsize[11];
//tran.dat文件记录数
long fl;
//打开文件.
if ((fHandle = fopen("tran.dat", "rb")) == NULL)
{
fclose(fHandle);
return L_ERROR;
}
//获取文件记录数
fl=filelength(fileno(fHandle))/77;
for(int i=0;i<fl;i++)
{
//读tran.dat中一行.
fread(buff,77,1,fHandle);
temp=buff;
//将文件名和文件起始长度取出.
strncpy(fname, temp, 64);
fname[64]=NULL;
temp+=65;
strncpy(fsize, temp, 9);
fsize[9]=NULL;
//打开文件
if ((fp = fopen(Trim(fname), "r+b")) == NULL)
{
fclose(fp);
return L_ERROR;
}
//改变文件尺寸,将文件恢复原尺寸.
if(chsize(fileno(fp),atol(fsize)) != 0)
{
fclose(fp);
return L_ERROR;
}
fclose(fp);
}
//关闭文件.
fclose(fHandle);
remove("tran.dat");
return L_OK;
}
//插入对象.
void
Tran::Insert(DBFile *dbf)
{
DBF[DBFNumber] = dbf;
DBFNumber++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -