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

📄 dbf.h

📁 读写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 + -