📄 dbf.h
字号:
#ifndef __YB_DEFINE_DBF_H__
#define __YB_DEFINE_DBF_H__
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <time.h>
#include <string.h>
#ifdef WIN32
#include <sys\stat.h>
#include <sys\types.h>
#include <sys\locking.h>
#include <share.h>
#include <dos.h>
#include <io.h>
#define snprintf _snprintf
#else
#include <sys/stat.h>
#include <unistd.h>
#include "xntoy.h"
#define O_BINARY 0
#endif
//*************************************************************
// DBF读写类库跨平台版本,在windows、linux、Sco下编译通过。
// 修改:袁斌
// oldworm@21cn.com
// http://yb.nos.com.cn/index.html
// 时间:2000年4月11日
// bug report: 内部->yb@compagis.com
// 外部->oldworm@21cn.com
//
// 主要修改内容:
// 一、速度方面的修改。
// 1、将原先通过多个sprintf、sscanf等写一条记录的方式改为
// 通过调用xntoy系列函数取代,速度提高不少。
// 2、将原先采用单链表方式组织的字段结构改成hash链表方式,
// 查找字段基本上为常数级别O(1),速度有一定提高。
//
// 二、安全性方面的修改。
// 1、使用snprintf取代以前的sprintf。
// 2、使用xntoy系列函数保证缓冲区不越界。
//
// 三、移植性方面的修改。
// 1、将全部_???函数换成???函数。
// 2、将全部_???参数换成???参数。
// 3、针对Linux下面没有的几个函数在xntoy里面作了实现。
//
// 四、其它修改内容。
// 1、将函数位置进行了调整,相同功能部分放在了一起。
// 2、将函数名称进行了调整,基本上采用ODBC一致的名称。
// 3、将有副作用的Append函数和读字段值函数进行了调整。
// 4、对相关数据结构进行了调整。
// 5、对一次读写多条记录的函数及相关内容全部删除。
//*************************************************************
#define max(a,b) ((a<b) ? b : a)
#define min(a,b) ((a<b) ? a : b)
#pragma comment(exestr, "yb/oldworm cross platform dbf class 2000/04/11 ")
char * formatstr(char *s);
char * Trim(char *str);
typedef long BOOL;
typedef unsigned short ushort;
typedef unsigned int uint;
typedef unsigned char uchar;
typedef unsigned long ulong;
enum
{
MAX_FIELDS = 256
};
enum
{
FALSE = 0,
TRUE = 1
};
enum
{
RDONLY = 0x01, // 只读流览
RDWR = 0x02 // 可读写流览
};
enum
{
EQUAL = 1,
GREATER = 2,
GREATER_OR_EQUAL= 3,
LESS = 4,
LESS_OR_EQUAL = 5
};
struct _dosdate_t
{
uint year;
uint month;
uint day;
};
typedef struct
{
uchar dbf_id; // dbf_id=03, memo field does not exist
// dbf_id=83, memo field exists( foxbase )
// dbf_id=F5, memo field exists ( foxpro )
char last_update[3]; // year,month,date of the file last_update
long last_rec; // serial number of the last record
ushort data_offset; // the start address of the data item
ushort rec_size; // the record size = all fields size + 1
char filler[20]; // unused
} DBF_HEAD;
typedef struct
{
char field_name[11];
char field_type;
char dummy[4]; // unused
union
{
ushort wlen; // when the field type is not numeric
struct
{
uchar len;
uchar dec;
}N; // when the field type is numeric
} linfo;
char filler[14]; // unused
}FIELD_REC;
typedef struct FIELD_LIST
{
FIELD_REC field_rec; //字段内容
char *cname; //该字段对应的中文名称
int m_start; //
}FIELD_LIST;
typedef struct FIELD_HASHNODE FIELD_HASHNODE;
struct FIELD_HASHNODE
{
ushort index;
FIELD_HASHNODE *next;
};
typedef struct
{
int handle; //Dbf文件句柄
char * file_name; //
long curr_rec; //当前记录
DBF_HEAD dbf_head; //文件头部
FIELD_LIST * field_list[MAX_FIELDS];
FIELD_HASHNODE *field_hashnode[MAX_FIELDS];
ushort field_num; //字段数目
char *record_buf; //记录缓冲
}DBF_HANDLE;
typedef class Dbf DBF;
typedef class Dbf DBFFILE;
class Dbf
{
public :
DBF_HANDLE * dbf_handle;
Dbf();
~Dbf();
public:
/**************************************************************************
功 能: 打开一数据文件
传入参数: filename ---- 文件名
fptFilename ---- 备注文件名, 缺省为库文件+FPT后缀
返 回: TRUE -- 成功 FALSE -- 失败
***************************************************************************/
BOOL Open(const char * filename,char openway=RDWR );
//关闭数据库文件。
void Close(void );
// 根据指定字段列表创建DBF库
BOOL Create(const char * filename, FIELD_REC * field );
// 删除DBF库中的全部记录,仅保留字段和数据库头部。
BOOL Zap( void );
public:
////////////////////////////////////////////////////////////////////////
//field function
static void AddField(FIELD_REC &field_rec,const char *fieldname,
char fieldtype,ushort len,uchar dec=0);
void SetFieldCName( char * field_name , char * fieldChName ) ;
BOOL GetFieldName(char *sa[], int item_size, int item_num); //取全部字段名称列表。
FIELD_LIST * look_field(const char *field_name);
////////////////////////////////////////////////////////////////////////
//cursor function
BOOL Move( long rec_num ); // 把当前记录指针移到指定记录号, 并读取内容
BOOL MoveFirst( void ); // 把当前记录指针移到第一条记录, 并读取内容
BOOL MoveNext( long rec_num = 1L ) ; // 把当前记录指针移到下一条记录,并读取记录内容
BOOL MoveLast( void );
//record function
long RecNo() ; // 返回当前记录号
long GetRecordCount( ); // 返回当前记录数
long ReadRecordCount( void ) ; // 重读文件,获取当前记录数
void ClearRecBuf( void ) ; // 清记录内存缓冲
char *RecordBuf( void ); // 返回当前记录缓冲指针
//Lock Function
void SetLock ( void ){ lock = 1; };
void SetUnLock( void ){ lock = 0; };
////////////////////////////////////////////////////////////////////////
BOOL Append(const char *id_fname=NULL); // 追加记录
BOOL Update(long rec_num = 0L); //用当前记录缓冲内容修改指定记录, 0表示修改当前记录
BOOL AppendBlank(void); //追加一条空记录
BOOL Delete(long rec_num =0) ; //设置删除标志。rec_num = 0 表示当前记录。
BOOL IsDelete( void ); //判断当前记录是否有删除标记
char *FileName( void ) //返回当前数据库名
{
if( dbf_handle != NULL )
return (dbf_handle->file_name) ;
else
return "\0" ;
}
BOOL IsOpen()
{//测试是否 DBF FILE 已经正常打开。
return ( dbf_handle!=NULL && dbf_handle->handle!=-1 );
}
public:
////////////////////////////////////////////////////////////////////////
//以下函数取指定字段的值
char * GetFieldValue (const char *field_name, char *fieldvalue, int size,
BOOL bFormat=TRUE,char * field_type=NULL);
BOOL GetFieldValue(const char *field_name, long &value);
BOOL GetFieldValue(const char *field_name, int &value);
BOOL GetFieldValue(const char *field_name, short &value);
BOOL GetFieldValue(const char *field_name, float &value);
BOOL GetFieldValue(const char *field_name, double &value);
////////////////////////////////////////////////////////////////////////
// 修改指定字段的内容
BOOL SetFieldValue(const char * field_name , const char * field_value );
BOOL SetFieldValue(const char * field_name , long field_value );
BOOL SetFieldValue(const char * field_name , int field_value );
BOOL SetFieldValue(const char * field_name , short field_value );
BOOL SetFieldValue(const char * field_name , float field_value );
BOOL SetFieldValue(const char * field_name , double field_value );
private:
inline BOOL insert_field_hashnode(FIELD_HASHNODE *pnode);
inline BOOL _SetFieldValue(FIELD_LIST *flist_ptr , const char * field_value);
inline BOOL _Update(long rec_num = 0L, int size=0);
inline void _SetDosDate(DBF_HEAD *phead);
inline short FieldLen( FIELD_LIST * flist_ptr ) ;
int read_dbfhead( void );
BOOL lock_dbf_rec( long rec, long RecNum );
BOOL unlock_dbf_rec( long rec, long RecNum );
BOOL lock_dbf_file( void );
BOOL unlock_dbf_file( void );
BOOL lock_dbf_head( void );
BOOL unlock_dbf_head( void );
BOOL LockFile( long offset, long rec_size );
BOOL UnlockFile( long offset, long rec_size );
private:
int open_way; //文件打开方式
char lock ; // 读写是否加锁 ( 0 - 不加 , 1 - 加 )
};
#endif //__YB_DEFINE_DBF_H__
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -