📄 ljfiledb.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 + -