?? 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 + -