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

📄 tran.cpp

📁 金融pos机前台源码
💻 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 + -