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

📄 database.c

📁 一个微型的数据库系统
💻 C
📖 第 1 页 / 共 3 页
字号:
		default:
			return _DB_ELSE_ERROR;					// 其它类型时表示出错
		}
	}
	*pRecord=DB_REC_NORMAL;							// 结尾加上有效记录标记
	return _DB_CORRECT;
}

// 增加一条记录,OK
int db_addRecord(int databaseID, unsigned long recordID,void *buffer)
{
	int hFile;
	int len;
	int num;
	unsigned char *pDelete;

	if(!buffer)
	{
		gDatabase[databaseID].error=_DB_ELSE_ERROR;
		return _DB_ELSE_ERROR;			// 数据错误
	}
	
	if( (unsigned int)databaseID>=_DB_DBD_MAX )
	{
		gDatabase[databaseID].error=_DB_ID_ERROR;
        return _DB_ID_ERROR;			// ID号错误
	}

	hFile=gDatabase[databaseID].hFile;
	if( hFile<0)
	{
		gDatabase[databaseID].error=_DB_ID_ERROR;
        return _DB_ID_ERROR;			// ID号错误
	}
    
    if( fs_lseek(hFile,0,SEEK_END)<0 )	// 定位到文件结尾
	{
		gDatabase[databaseID].error=_FS_ERROR;
		return _FS_ERROR;				// 定位文件指针出错
	}

	if(_db_encodeRecord(databaseID,buffer)!=_DB_CORRECT )		// 编码一条记录
	{
		gDatabase[databaseID].error=_DB_ELSE_ERROR;
		return _DB_ELSE_ERROR;			// 记录编码错误
	}
    
	len=gDatabase[databaseID].recordSize;
    if( fs_write(hFile,gDatabase[databaseID].pRecord,len)!=len )
	{
		gDatabase[databaseID].error=_FS_ERROR;
		return _FS_ERROR;				// 保存记录错误
	}

	gDatabase[databaseID].curRecord=gDatabase[databaseID].recordNum;	// 当前记录指向新记录
	gDatabase[databaseID].curPosition=gDatabase[databaseID].recordTotal;

	num=gDatabase[databaseID].recordTotal;
	gDatabase[databaseID].recordNum++;		// 有效记录加1
	gDatabase[databaseID].recordTotal++;	// 物理记录加1

	pDelete=gDatabase[databaseID].pDelete;
	if( num%8 )
		pDelete[num/8]|=(0x80>>(num%8));
	else
		pDelete[num/8]=0x80;

	gDatabase[databaseID].error=_DB_CORRECT;

//	fs_flush(gDatabase[databaseID].hFile);
//	fs_flush(gDatabase[databaseID].hmem);
	fs_flushAll();               // by zhangxp

    return _DB_CORRECT;
}

// 将第n条有效记录设置为当前记录,在调用本函数前后必须进出关键代码段保护,OK
int _db_recSet(int databaseID,int nth, int type)
{
	int n,count;
	register int j,i;
	unsigned char *pDelete,delFlag;

	if(nth>=gDatabase[databaseID].recordNum || nth<0)
		return _DB_NOT_FOUND;

	if(type==_DB_END)
		nth=gDatabase[databaseID].recordNum-nth-1;

	pDelete=gDatabase[databaseID].pDelete;
	n=(gDatabase[databaseID].recordTotal+7)/8;
	count=0;

	for(i=0;i<n;i++)
	{
		delFlag=pDelete[i];
		if(delFlag==0xff)
		{
			count+=8;
			if(count>=nth)
			{
				gDatabase[databaseID].curPosition=(i+1)*8-(count-nth);
				gDatabase[databaseID].curRecord=nth;		// 保存当前记录号
				return _DB_CORRECT;
			}
		}
		else
		{
			for(j=0;j<8;j++)
			{
				if( delFlag&0x80 )		// 记录有效
				{
					if( count==nth )
					{
						gDatabase[databaseID].curPosition=i*8+j;	// 保存当前记录的物理记录号
						gDatabase[databaseID].curRecord=nth;		// 保存当前记录号
						return _DB_CORRECT;
					}
					count++;
				}
				delFlag<<=1;
			}
		}
	}
	return _DB_NOT_FOUND;
}

// 将当前记录读进缓冲区中,OK
int _db_recRead(int databaseID)
{
	int hFile;
	int size;

	hFile=gDatabase[databaseID].hFile;
	size=gDatabase[databaseID].recordSize;

	// 文件指针定位到当前记录
	if( fs_lseek(hFile,gDatabase[databaseID].offset+size*gDatabase[databaseID].curPosition,SEEK_SET)<0 )
		return _FS_ERROR;

	// 将记录内容读进缓冲区
	if( fs_read(hFile,gDatabase[databaseID].pRecord,size)!=size )
		return _FS_ERROR;

	return _DB_CORRECT;
}

// 将缓冲区中的数据写进当前记录,OK
int _db_recWrite(int databaseID)
{
	int hFile;
	int size;

	hFile=gDatabase[databaseID].hFile;
	size=gDatabase[databaseID].recordSize;

	// 文件指针定位到当前记录
	if( fs_lseek(hFile,gDatabase[databaseID].offset+size*gDatabase[databaseID].curPosition,SEEK_SET)<0 )
		return _FS_ERROR;

	// 将缓冲区内容写进记录
	if( fs_write(hFile,gDatabase[databaseID].pRecord,size)!=size )
		return _FS_ERROR;

	//fs_flush(gDatabase[databaseID].hFile);
	//fs_flush(gDatabase[databaseID].hmem);
	fs_flushAll();     // by zhangxp

	return _DB_CORRECT;
}

// 将当前记录置上删除标记,OK
int _db_recDelete(int databaseID)
{
	int hFile;
	int size, len;
	unsigned char ch;
	int pos;
	TRecordHead  recordHead;

	hFile=gDatabase[databaseID].hFile;
	size=gDatabase[databaseID].recordSize;
    
/*
	// 文件指针定位到当前记录
	if( fs_lseek(hFile,gDatabase[databaseID].offset+size*gDatabase[databaseID].curPosition+size-1,
		SEEK_SET)<0 )
		return _FS_ERROR;

	// 将删除标记写进记录
	ch=DB_REC_DELETE;
*/
                                 
// by zhangxp 2003/07/02
//////////////////////////////////

	if( fs_lseek(hFile,gDatabase[databaseID].offset+size*gDatabase[databaseID].curPosition,SEEK_SET)<0 )
		return _FS_ERROR;
                             
	len = sizeof(TRecordHead);
	// 将记录头读进缓冲区
	if( fs_read(hFile, &recordHead, len)!=len )
		return _FS_ERROR;

	// 文件指针定位到当前记录
	if( fs_lseek(hFile,gDatabase[databaseID].offset+size*gDatabase[databaseID].curPosition+size-1,
		SEEK_SET)<0 )
		return _FS_ERROR;

	// 将删除标记写进记录
	if(recordHead.SyncAttr==SYNCATTR_NEW || recordHead.SyncAttr==SYNCATTR_DEL)
		ch=DB_REC_REMOVE;
	else
		ch=DB_REC_DELETE;

/////////////////////////////////

	if( fs_write(hFile,&ch,1)!=1 )
		return _FS_ERROR;
	//fs_flush(hFile);

	pos=gDatabase[databaseID].curPosition;
	gDatabase[databaseID].pDelete[pos/8]&=~(0x80>>pos%8);

	fs_flushAll();          // by zhangxp

	return _DB_CORRECT;
}

// 读出第n条记录,OK
int db_readNthRecord(int databaseID, unsigned long recordID, void *buffer,int nth, int type)
{
	int curRecord,curPosition;
	int result;

	if( (unsigned int)databaseID>=_DB_DBD_MAX )
        return _DB_ID_ERROR;			// ID号错误

	if( gDatabase[databaseID].hFile<0 )
        return _DB_ID_ERROR;			// ID号错误
	
	curRecord=gDatabase[databaseID].curRecord;		// 保存当前记录信息
	curPosition=gDatabase[databaseID].curPosition;
	
	dbEnterWCS();
	result=_db_recSet(databaseID,nth,type);			// 将第n条记录设置为当前记录
	dbExitWCS();
	if( result!=_DB_CORRECT )
	{
		gDatabase[databaseID].curRecord=curRecord;	// 恢复当前记录信息
		gDatabase[databaseID].curPosition=curPosition;
		gDatabase[databaseID].error=result;
		return result;
	}

	result=_db_recRead(databaseID);					// 读出当前记录
	if( result!=_DB_CORRECT )
	{
		gDatabase[databaseID].curRecord=curRecord;	// 恢复当前记录信息
		gDatabase[databaseID].curPosition=curPosition;
		gDatabase[databaseID].error=result;
		return result;
	}

	result=_db_decodeRecord(databaseID,buffer);		// 解码当前记录    
	if( result!=_DB_CORRECT )
	{
		gDatabase[databaseID].curRecord=curRecord;	// 恢复当前记录信息
		gDatabase[databaseID].curPosition=curPosition;
		gDatabase[databaseID].error=result;
		return result;
	}

	gDatabase[databaseID].error=_DB_CORRECT;		// 操作成功
	return _DB_CORRECT;
}

// 写入第n条记录,OK
int db_writeNthRecord(int databaseID, unsigned long recordID, void * buffer,int nth, int type)
{
	int curRecord,curPosition;
	int result;

	if( (unsigned int)databaseID>=_DB_DBD_MAX )
        return _DB_ID_ERROR;			// ID号错误

	if( gDatabase[databaseID].hFile<0 )
        return _DB_ID_ERROR;			// ID号错误
	
	curRecord=gDatabase[databaseID].curRecord;		// 保存当前记录信息
	curPosition=gDatabase[databaseID].curPosition;
	
	dbEnterWCS();
	result=_db_recSet(databaseID,nth,type);			// 将第n条记录设置为当前记录
	dbExitWCS();
	if( result!=_DB_CORRECT )
	{
		gDatabase[databaseID].curRecord=curRecord;	// 恢复当前记录信息
		gDatabase[databaseID].curPosition=curPosition;
		gDatabase[databaseID].error=result;
		return result;
	}

	result=_db_encodeRecord(databaseID,buffer);	// 编码当前记录    
	if( result!=_DB_CORRECT )
	{
		gDatabase[databaseID].curRecord=curRecord;	// 恢复当前记录信息
		gDatabase[databaseID].curPosition=curPosition;
		gDatabase[databaseID].error=result;
		return result;
	}

	result=_db_recWrite(databaseID);				// 写入当前记录
	if( result!=_DB_CORRECT )
	{
		gDatabase[databaseID].curRecord=curRecord;	// 恢复当前记录信息
		gDatabase[databaseID].curPosition=curPosition;
		gDatabase[databaseID].error=result;
		return result;
	}

	gDatabase[databaseID].error=_DB_CORRECT;		// 操作成功
	return _DB_CORRECT;
}

// 删除第n条记录,OK
int db_deleteNthRecord(int databaseID, unsigned long recordID,	int nth, int type)
{
	int result;
	int curRecord,curPosition;
	
	if( (unsigned int)databaseID>=_DB_DBD_MAX )
        return _DB_ID_ERROR;						// ID号错误

	if( gDatabase[databaseID].hFile<0 )
        return _DB_ID_ERROR;						// ID号错误
	
	curRecord=gDatabase[databaseID].curRecord;		// 保存当前记录信息
	curPosition=gDatabase[databaseID].curPosition;

	dbEnterWCS();
	result=_db_recSet(databaseID,nth,type);			// 将第n条记录设置为当前记录
	dbExitWCS();
	if( result!=_DB_CORRECT)
	{
		gDatabase[databaseID].curRecord=curRecord;	// 恢复当前记录信息
		gDatabase[databaseID].curPosition=curPosition;
		gDatabase[databaseID].error=result;
		return result;
	}

	// 写删除标记
	result=_db_recDelete(databaseID);
	if( result!=_DB_CORRECT )						// 写入删除标记
	{
		gDatabase[databaseID].curRecord=curRecord;	// 恢复当前记录信息
		gDatabase[databaseID].curPosition=curPosition;
		gDatabase[databaseID].error=_FS_ERROR;
		return _FS_ERROR;
	}

	gDatabase[databaseID].curRecord=-1;				// 失去当前记录
	gDatabase[databaseID].curPosition=-1;
	gDatabase[databaseID].recordNum--;
	gDatabase[databaseID].error=_DB_CORRECT;		// 操作成功
	return _DB_CORRECT;
}

// 获取最后一次操作的错误代码,OK
int db_getLastError(int databaseID,int *errorCode)
{
	if( (unsigned int)databaseID>=_DB_DBD_MAX )
        return _DB_ID_ERROR;						// ID号错误

	if( gDatabase[databaseID].hFile<0 )
        return _DB_ID_ERROR;						// ID号错误

	*errorCode=gDatabase[databaseID].error;
	return _DB_CORRECT;
}

// 获取有效记录数,OK
int db_getRecordNumber(int databaseID,int *num)
{
	if( (unsigned int)databaseID>=_DB_DBD_MAX )
        return _DB_ID_ERROR;						// ID号错误

	if( gDatabase[databaseID].hFile<0 )
        return _DB_ID_ERROR;						// ID号错误

	*num=gDatabase[databaseID].recordNum;
	return _DB_CORRECT;
}

// 获取记录总数,OK
int db_getRecordTotal(int databaseID,int *num)
{
	if( (unsigned int)databaseID>=_DB_DBD_MAX )
        return _DB_ID_ERROR;						// ID号错误

	if( gDatabase[databaseID].hFile<0 )
        return _DB_ID_ERROR;						// ID号错误

	*num=gDatabase[databaseID].recordTotal;
	return _DB_CORRECT;
}

// 指针移到第一条记录,OK
int db_recFirst(int databaseID)
{
	int curRecord,curPosition;
	int result;

	if( (unsigned int)databaseID>=_DB_DBD_MAX )
        return _DB_ID_ERROR;			// ID号错误

	if( gDatabase[databaseID].hFile<0 )
        return _DB_ID_ERROR;			// ID号错误
	
	curRecord=gDatabase[databaseID].curRecord;		// 保存当前记录信息
	curPosition=gDatabase[databaseID].curPosition;
	
	dbEnterWCS();
	result=_db_recSet(databaseID,0,_DB_SET);		// 将第一条记录设置为当前记录
	dbExitWCS();
	if( result!=_DB_CORRECT )
	{
		gDatabase[databaseID].curRecord=curRecord;	// 恢复当前记录信息
		gDatabase[databaseID].curPosition=curPosition;
		gDatabase[databaseID].error=result;
		return result;
	}

	gDatabase[databaseID].error=_DB_CORRECT;
	return _DB_CORRECT;
}

// 指针移到最后一条记录,OK
int db_recLast(int databaseID)
{
	int curRecord,curPosition;
	int result;

	if( (unsigned int)databaseID>=_DB_DBD_MAX )
        return _DB_ID_ERROR;			// ID号错误

	if( gDatabase[databaseID].hFile<0 )
        return _DB_ID_ERROR;			// ID号错误
	
	curRecord=gDatabase[databaseID].curRecord;		// 保存当前记录信息
	curPosition=gDatabase[databaseID].curPosition;
	
	dbEnterWCS();
	result=_db_recSet(databaseID,0,_DB_END);		// 将最后一条记录设置为当前记录
	dbExitWCS();
	if( result!=_DB_CORRECT )
	{
		gDatabase[databaseID].curRecord=curRecord;	// 恢复当前记录信息
		gDatabase[databaseID].curPosition=curPosition;
		gDatabase[databaseID].error=result;
		return result;
	}

	gDatabase[databaseID].error=_DB_CORRECT;
	return _DB_CORRECT;
}

// 指针移到下一条记录,OK
int db_recNext(int databaseID)
{
	int curRecord,curPosition;
	int result;

	if( (unsigned int)databaseID>=_DB_DBD_MAX )
        return _DB_ID_ERROR;			// ID号错误

	if( gDatabase[databaseID].hFile<0 )
        return _DB_ID_ERROR;			// ID号错误
	
	curRecord=gDatabase[databaseID].curRecord;		// 保存当前记录信息
	curPosition=gDatabase[databaseID].curPosition;

	if( curRecord==-1 )					// 不存在当前记录
	{
		gDatabase[databaseID].error=_REC_NO_ERROR;
		return _REC_NO_ERROR;
	}

	dbEnterWCS();
	result=_db_recSet(databaseID,curRecord+1,_DB_SET);
	dbExitWCS();
	if( result!=_DB_CORRECT)
	{
		gDatabase[databaseID].curRecord=curRecord;	// 恢复当前记录信息
		gDatabase[databaseID].curPosition=curPosition;
		gDatabase[databaseID].error=result;
		return result;
	}

	gDatabase[databaseID].error=_DB_CORRECT;
	return _DB_CORRECT;
}

// 指针移到前一条记录,OK
int db_recPrev(int databaseID)
{
	int curRecord,curPosition;
	int result;

	if( (unsigned int)databaseID>=_DB_DBD_MAX )
        return _DB_ID_ERROR;			// ID号错误

	if( gDatabase[databaseID].hFile<0 )
        return _DB_ID_ERROR;			// ID号错误
	
	curRecord=gDatabase[databaseID].curRecord;		// 保存当前记录信息
	curPosition=gDatabase[databaseID].curPosition;

⌨️ 快捷键说明

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