#ifndef _FOXPRO_20110811_H_
#define _FOXPRO_20110811_H_

//数据库头
struct FOXPRO_HEAD
{
	BYTE	byFlags;
	BYTE    byYear;
	BYTE    byMonth;
	BYTE    byDay;

	DWORD   dwRecordCount;
	WORD    wRecordAddress;
	WORD    wRecordLength;
	DWORD   dwReserve1;
	DWORD   dwReserve2;
	DWORD   dwReserve3;
	DWORD   dwReserve4;
	DWORD   dwReserve5;
};

//数据库“域”属性
struct FOXPRO_FIELDS
{
	BYTE    strName[10];
	BYTE    byFill;
	BYTE    byStyle;
	DWORD   dwDataAddress;
	BYTE    byLength;
	BYTE    byDotCount;
	WORD    wReserve1;
	BYTE    byFlags;
	BYTE    wsReserve[11];

};

//数据库“类”定义
class CFoxpro
{
private:
	BOOL           m_bNew;
	long           m_lRecordPoint;
	char           m_strFile[256];
	FOXPRO_HEAD    m_FoxproHead;
	FOXPRO_FIELDS  m_FoxproFields;
	FILE*          m_pFile;
	BYTE*          m_pRecordBuf;
	FOXPRO_FIELDS* m_pFoxproFields;
public:
	//
	BOOL Kernel_OpenFoxpro(const char* pStr, BOOL bRepair);

	//建立新的数据库
	BOOL  CreateFoxpro(const char*pStr);
	//打开已存在的数据库
	BOOL  OpenFoxpro(const char*pStr);
	//关闭数据库
	BOOL  CloseFoxpro();
	//增加一域
	BOOL  AddFields(const char* strName,BYTE byStyle,int nLength,int nDot);
	//获得指定列的“域”属性
	FOXPRO_FIELDS*  GetFoxproFields(int nIndex);
public:
	//获得列的数量
	int   GetFieldsCount() {return(m_FoxproHead.wRecordAddress-sizeof(FOXPRO_HEAD))/sizeof(FOXPRO_FIELDS);}
	//获得纪录总数
	long  GetRecordCount() {return(m_FoxproHead.dwRecordCount);}
	//获得纪录地址
	long  GetRecordAddress() {return((DWORD)m_FoxproHead.wRecordAddress);}
	//获得数据库的最后修改日期-“有”
	int   GetMonth()       {return((int)m_FoxproHead.byMonth);}
	//获得数据库的最后修改日期-“日”
	int   GetDay()         {return((int)m_FoxproHead.byDay);}
	//获得数据库的最后修改日期-“年”
	int   GetYear()        {return((int)1900+(DWORD)m_FoxproHead.byYear);}
	//获得纪录的长度
	int   GetRecordLength(){return((int)(DWORD)m_FoxproHead.wRecordLength);}
	//显示数据库调试信息
	void  Debug();
	//Repair Database
	BOOL  RepairFoxpro();
public:
	//修剪指定字符串的前导空格
	static char*  TrimLeft(char  *pStr);
	//修剪指定字符串的后导空格
	static char*  TrimRight(char *pStr);

public:
	//设置串类型“域”的字符串
	BOOL  SetFieldsString(int nIndex, const char* pStr);
	//设置数字类型“域”的数字值
	BOOL  SetFieldsNumber(int nIndex,float fValue);
	//设置日期类型“域”的日期值
	BOOL  SetFieldsDate(int nIndex,int nYear,int nMonth,int nDay);
	//设置逻辑类型“域”的逻辑值
	BOOL  SetFieldsLogic(int nIndex,BOOL bLogic);
	//设置备注类型“域”的备注值
	BOOL  SetFieldsMemo(int nIndex, const char* pStr);

	//获得串类型“域”的字符串
	BOOL  GetFieldsString(int nIndex,char* pStr);
	//获得数字类型“域”的数字值
	float GetFieldsNumber(int nIndex);
	//获得日期类型“域”的日期值
	BOOL  GetFieldsDate(int nIndex,int* pnYear,int* pnMonth,int* pnDay);
	//获得逻辑类型“域”的逻辑值
	BOOL  GetFieldsLogic(int nIndex);
	//获得备注类型“域”的备注值
	BOOL  GetFieldsMemo(int nIndex,char* pStr);

	//定位纪录
	BOOL  Seek(long nIndex,int nMode);	
	//判断数据库是否已经打开
	BOOL  IsOpen();
	//刷新数据库到磁盘
	BOOL  Flush();
	//增加一新纪录
	BOOL  AddNew();
	//准备修改当前纪录
	BOOL  Edit();
	//使当前的更改有效
	BOOL  Update();
	//在当前纪录中插入一条纪录
	BOOL  Insert();
	//删除当前纪录（带上删除标记）
	BOOL  Delete();
	//删除当前纪录
	BOOL  DeleteEx();
	//将带有删除标准的纪录删除
	BOOL  Zap();
public:
	void CoFoxpro();//构造函数调用
	//构造函数
	CFoxpro();
	//构造函数（打开指定的数据库）
	CFoxpro(char* strFile);
	//析构函数
	~CFoxpro();
};



#endif