00001
00002
00003
00004 #include <string.h>
00005
00006 #include <ALL.H>
00007 #include <ODB.H>
00008
00009
00014
00015 dbf_buf = NULL;
00016 rec_buf = NULL;
00017
00018 last_read_recno = -1;
00019
00020 if( dbFileName )
00021 open( dbFileName, bufferAll );
00022 }
00023
00024
00025
00026
00027
00028 Database::~Database() {
00029 Database::close();
00030 }
00031
00032
00033
00034
00045
00046 close();
00047
00048 file_open(fileName);
00049 file_read( &dbf_header, sizeof(DbfHeader) );
00050
00051
00052
00053 if( bufferAll ) {
00054 dbf_buf = mem_add( dbf_header.rec_size * dbf_header.last_rec );
00055
00056 file_seek( 1 + dbf_header.data_offset );
00057 file_read( dbf_buf, dbf_header.rec_size*dbf_header.last_rec );
00058 file_close();
00059
00060 dbf_buf_allocated = 1;
00061 }
00062 else
00063 rec_buf = mem_add( dbf_header.rec_size );
00064
00065 cur_recno = 1;
00066 }
00067
00068
00069
00070
00076
00077 close();
00078
00079
00080
00081 memcpy( &dbf_header, dataPtr, sizeof(DbfHeader) );
00082
00083 dbf_buf = dataPtr + 1 + dbf_header.data_offset;
00084
00085 dbf_buf_allocated = 0;
00086
00087 cur_recno = 1;
00088 }
00089
00090
00091
00092
00102
00103 if( recNo <= 0 )
00104 recNo = cur_recno;
00105
00106 if( recNo < 1 || recNo > dbf_header.last_rec )
00107 return NULL;
00108
00109 if( dbf_buf ) {
00110 return dbf_buf + dbf_header.rec_size * (recNo-1);
00111 }
00112 else {
00113 if( recNo == last_read_recno )
00114 return rec_buf;
00115
00116 file_seek( 1+dbf_header.data_offset + dbf_header.rec_size * (recNo-1) );
00117 file_read( rec_buf, dbf_header.rec_size );
00118
00119 last_read_recno = recNo;
00120
00121 return rec_buf;
00122 }
00123 }
00124
00125
00126
00127
00131
00132 if( rec_buf ) {
00133 mem_del(rec_buf);
00134 rec_buf = NULL;
00135 }
00136
00137 if( dbf_buf && dbf_buf_allocated ) {
00138 mem_del( dbf_buf );
00139 dbf_buf = NULL;
00140 }
00141 }
00142
00143