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

📄 ljfiledb.h

📁 小型文件数据库 一个文件对应一个表 最大只支持65535条记录(可以修改宏) 定长记录 一级索引 支持多关键字索引 不支持sql语句
💻 H
字号:
#ifndef __LJFILEDBH
#define __LJFILEDBH

#include <string>
#include <vector>
#include <stdarg.h>
#include <stdio.h>
#include <map>

using namespace std;

namespace filedbns{

#define int_8	char
#define int_16  short
#define int_32	int
#define THEADSIZE		3		//表头大小
#define TFIELDSZ		36		//字段记录长度
#define MAXRECORDCOUNT 1000		//最大记录数
#define TKEYFIELD		0x01
#define FIELDNAMESZ		32		//字段名长度

class CHead;
class CFieldSet;
class CIndexTable;
class CRecordSet;
class CFileDB;

enum{
	ST_CREA,
	ST_OPEN,
	ST_CLOS,
};

enum{
	ER_NOERROR			= 0,	//正常,无异常
	ER_ERROR			= -1,	//普通错误
	ER_FILEOPENER		= -2,	//文件不能被打开,可能的原因是文件不存在或有同名的文件存在
	ER_FILESEEKER		= -3,	//文件定位错误,可能的原因是文件越界
	ER_FILEWRITEER		= -4,	//写文件失败
	ER_EMPTYTABLE		= -5,	//打开一张空表,可能的原因为表中没有一个字段
	ER_DBNOTOPEN		= -6,	//数据库未打开
	ER_KEYCONFICT		= -7,	//主键重复,可能的原因是表中已经存在该记录
	ER_NONKEYINDEX		= -8,	//非主键索引,可能的原因是查询的条件中使用了非索引字段
	ER_NORECORD			= -9,	//记录不存在,查询无记录
	ER_DBOPENED			= -10,	//数据库已经打开
	ER_FIELDISNOTEXIST	= -11,	//不存在的字段
};

enum{
	FT_STR				= 0,	//字符串字段类型
	FT_INT4				= 1,	//4字节整形字段类型
};

enum{
	FT_NOR				= 0,	//普通字段
	FT_KEY				= 1,	//主键字段
};

typedef struct{
	char	fn[FIELDNAMESZ];	//字段名
	char*	val;				//字段值
	int_32	oper;				//运算符
}TWHERE;

typedef vector<TWHERE> TWHEREEXPRESS;	//条件表达式

typedef struct _thead{	
	int_8	_fc;	//field count;
	int_16	_rc;	//record count;
}THEAD;

class CHead:public THEAD{
	friend class CFileDB;
	CFileDB* db;
	void attch(THEAD& head);
	CHead();
	void Free();
public:
	void write();
	void read();
};

typedef struct{
	int_8	_no;				//字段序号
	char	_fn[FIELDNAMESZ];	//字段名
	int_8	_fsz;				//字段长度
	int_8	_ft;				//字段类型
	int_8   _key;				//是否主键  	int_8   _key:1;	//是否主键
}TField;

class CFieldSet{
	friend class CFileDB;
	friend class CRecordSet;
	CFileDB* db;
	vector<TField> _fields;		//字段列表
	int_8	_ct;				//表元数据记录数
	int_32	_bp;				//表元数据区开始位置
	int_32 Write(TField& field);
	void Load();
	void Free();
public:
	CFieldSet();
	TField& operator[](int i);
	int_8	Count(){ return _ct; }
	TField* Fnd(string fn);

	//Add方法添加一个字段,注意该方法必须在create数据库之后,open数据库之前操作,否则会操作失败.
	//fn	字段名
	//fsz	字段长度
	//ft	字段类型(0:字符串;1-4字节int)
	//key	是否为主键(true:主键;false:非主键)
	//返回值:成功返回新字段的指针,失败返回NULL.
	TField* Add(char* fn,int_8 fsz,int_8 ft,bool key);
};

typedef struct{
	int_16	_no;			//记录号
	vector<char*> _values;	//值表
	char* operator[](int i){
		return _values[i];
	}
}TRecord;

class CRecordSet{
	friend class CFileDB;
	friend class CFieldSet;
	vector<TRecord> _records;
	int_16 _act;			//总记录数
	int_32 _bp;				//记录区开始位置
	int_16 _rdsz1;			//一条记录大小(定长记录)
	int_32 Write(TRecord& record);
	CFileDB* db;
	void Free();
	void FreeRecords();
	void Serialize(char* buf,TRecord& record);
	void Structuralize(char* buf,TRecord& record);
	int_16 CacKeyv(char* keyv,TWHEREEXPRESS whereExpress);
public:
	CRecordSet();
	TRecord& operator[](int i);
	int_16 AllCount(){return _act;}
	int_16 Count(){	return _records.size();	}
	TRecord* Insert(char* val,...);//该方法存在内存泄露,待清理
	int_16 Select(TWHEREEXPRESS whereExpress);
	int_16 Delete(TWHEREEXPRESS whereExpress);
	int_16 Update(TWHEREEXPRESS whereExpress,TWHEREEXPRESS valSet);
	int_16 Select();
};

typedef struct _index{
	int_32 _sz;
	char* _val;
	bool operator==(const _index& index) const{
		return memcmp(_val,index._val,_sz) == 0 ;
	}
	bool operator>(const _index& index) const{
		return memcmp(_val,index._val,_sz) > 0 ;
	}
	bool operator<(const _index& index) const{
		return memcmp(_val,index._val,_sz) < 0 ;
	}
}INDEX;

class CIndexTable{
	friend class	CFileDB;
	friend class	CFieldSet;
	friend class	CRecordSet;
	int_32				_bp;		//索引表区域开始位置
	map<INDEX,int_16>	_usedit;	//占用块索引
	vector<int_16>		_unusedit;	//空闲块索引
	int_32				_idsz1;		//一条索引大小,包含了索引标志位(1字节)
	CFileDB*			db;
	void Load();
	void Free();
public:
	CIndexTable();
	int GetFrontAvBlock();				//取空闲块表的第一个空闲块
	void AllocBlock(int i,char* keyv);	//占用一个空闲块
	void ResetBlock(char* keyv);		//释放一个占用块
	void SetBlock(char* okey,char* nkey);	//修改索引块
	int_16 Find(char* key);				//查找
};

class CFileDB{
	friend class CHead;
	friend class CFieldSet;
	friend class CRecordSet;
	friend class CIndexTable;
	int_32			_stat;			//数据库状态
	FILE*			file;
	int_32			_err;			//错误代码
	char*			fn;				//文件名
public:
		
	CHead		Head;
	CFieldSet	FieldSet;
	CRecordSet	RecordSet;
	CIndexTable	IndexTable;

	CFileDB();
	~CFileDB();

	//库相关函数
	int_32 Create(char* fn);
	int_32 Open();
	int_32 Open(char* fn);
	void   Clos();
	int_32 Commit(); 

	//状态相关函数
	int_32 Stat() { return _stat;}
	int_32 Erro() { return _err; }
};

}
#endif

⌨️ 快捷键说明

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