📄 dbf.cpp
字号:
<tr><td>XB_EOF</td><td>At end of file</td></tr> <tr><td>XB_NOT_OPEN</td><td>File is not open</td></tr> <tr><td>XB_INVALID_RECORD</td><td>Invalid record number</td></tr> <tr><td>XB_SEEK_ERROR</td><td>Error seeking file</td></tr> <tr><td>XB_WRITE_ERROR</td><td>Error writing to file</td></tr> </table> \endhtmlonly \latexonly \\ \\ \begin{tabular}{|l|l|} \hline \textbf{Return Code} & \textbf{Description} \\ \hline \hline XB\_NO\_ERROR & No error \\ \hline XB\_LOCK\_FAILED & Couldn't lock file \\ \hline XB\_EOF & At end of file \\ \hline XB\_NOT\_OPEN & File is not open \\ \hline XB\_INVALID\_RECORD & Invalid record number \\ \hline XB\_SEEK\_ERROR & Error seeking file \\ \hline XB\_WRITE\_ERROR & Error writing to file \\ \hline \end{tabular} \endlatexonly*/xbShort xbDbf::GetLastRecord( void ){ xbShort rc = 0; if( NoOfRecs == 0 ) xb_error(XB_INVALID_RECORD);#ifndef XB_LOCKING_ON if( DbfStatus == XB_UPDATED /*&& AutoUpdate*/ ) /* update previous rec if necessary */ if(( rc = PutRecord( CurRec )) != 0 ) return rc;#endif rc = GetRecord( NoOfRecs );#ifdef XB_REAL_DELETE if(!rc && RealDelete && RecordDeleted()) rc = GetPrevRecord();#endif return rc;}/************************************************************************///! Get the next physical record in the data file/*! Attempts to retrieve the next physical record from the data file into the record buffer. \returns One of the following: \htmlonly <p> <table border=2><tr><th>Return Code</th><th>Description</th></tr> <tr><td>XB_NO_ERROR</td><td>No error</td></tr> <tr><td>XB_LOCK_FAILED</td><td>Couldn't lock file</td></tr> <tr><td>XB_EOF</td><td>At end of file</td></tr> <tr><td>XB_NOT_OPEN</td><td>File is not open</td></tr> <tr><td>XB_INVALID_RECORD</td><td>Invalid record number</td></tr> <tr><td>XB_SEEK_ERROR</td><td>Error seeking file</td></tr> <tr><td>XB_WRITE_ERROR</td><td>Error writing to file</td></tr> </table> \endhtmlonly \latexonly \\ \\ \begin{tabular}{|l|l|} \hline \textbf{Return Code} & \textbf{Description} \\ \hline \hline XB\_NO\_ERROR & No error \\ \hline XB\_LOCK\_FAILED & Couldn't lock file \\ \hline XB\_EOF & At end of file \\ \hline XB\_NOT\_OPEN & File is not open \\ \hline XB\_INVALID\_RECORD & Invalid record number \\ \hline XB\_SEEK\_ERROR & Error seeking file \\ \hline XB\_WRITE\_ERROR & Error writing to file \\ \hline \end{tabular} \endlatexonly*/xbShort xbDbf::GetNextRecord( void ){ xbShort rc = 0; if( NoOfRecs == 0 ) { xb_error(XB_INVALID_RECORD); } else if( CurRec >= NoOfRecs ) { xb_eof_error; }#ifndef XB_LOCKING_ON if( DbfStatus == XB_UPDATED /*&& AutoUpdate*/ ) /* update previous rec if necessary */ if(( rc = PutRecord( CurRec )) != 0 ) return rc;#endif rc = GetRecord( ++CurRec );#ifdef XB_REAL_DELETE while(!rc && RealDelete && RecordDeleted()) rc = GetRecord(++CurRec);#endif return rc;}/************************************************************************///! Get the previous physical record in the data file/*! Attempts to retrieve the previous physical record from the data file into the record buffer. \returns One of the following: \htmlonly <p> <table border=2><tr><th>Return Code</th><th>Description</th></tr> <tr><td>XB_NO_ERROR</td><td>No error</td></tr> <tr><td>XB_LOCK_FAILED</td><td>Couldn't lock file</td></tr> <tr><td>XB_BOF</td><td>At beginning of file</td></tr> <tr><td>XB_NOT_OPEN</td><td>File is not open</td></tr> <tr><td>XB_INVALID_RECORD</td><td>Invalid record number</td></tr> <tr><td>XB_SEEK_ERROR</td><td>Error seeking file</td></tr> <tr><td>XB_WRITE_ERROR</td><td>Error writing to file</td></tr> </table> \endhtmlonly \latexonly \\ \\ \begin{tabular}{|l|l|} \hline \textbf{Return Code} & \textbf{Description} \\ \hline \hline XB\_NO\_ERROR & No error \\ \hline XB\_LOCK\_FAILED & Couldn't lock file \\ \hline XB\_BOF & At beginning of file \\ \hline XB\_NOT\_OPEN & File is not open \\ \hline XB\_INVALID\_RECORD & Invalid record number \\ \hline XB\_SEEK\_ERROR & Error seeking file \\ \hline XB\_WRITE\_ERROR & Error writing to file \\ \hline \end{tabular} \endlatexonly*/xbShort xbDbf::GetPrevRecord( void ){ xbShort rc = 0; if( NoOfRecs == 0 ) { xb_error(XB_INVALID_RECORD); } else if( CurRec <= 1L ) { xb_eof_error; }#if XB_LOCKING_ON if( DbfStatus == XB_UPDATED /*&& AutoUpdate*/ ) /* update previous rec if necessary */ if(( rc = PutRecord( CurRec )) != 0 ) return rc;#endif rc = GetRecord( --CurRec );#ifdef XB_REAL_DELETE while(!rc && RealDelete && RecordDeleted()) rc = GetRecord(--CurRec);#endif return rc;}/************************************************************************///! Dump record/*! Dump the contents of the specified record to stdout. \param RecNo Record number of record to be dumped. \returns An error code (same as GetRecord()).*/xbShort xbDbf::DumpRecord( xbULong RecNo ){ int i; char buf[1024]; if( RecNo == 0 || RecNo > NoOfRecs ) xb_error(XB_INVALID_RECORD); i = GetRecord( RecNo ); if( i != XB_NO_ERROR ) return i; cout << "\nREC NUMBER " << RecNo << "\n"; if( RecordDeleted() ) cout << "\nRecord deleted...\n"; for( i = 0; i < NoOfFields; i++ ) { GetField( i, buf ); cout << SchemaPtr[i].FieldName << " = '" << buf << "'\n"; } cout << "\n"; return XB_NO_ERROR;}/************************************************************************///! Write the current record buffer to the current record in the data file./*! Attempts to write the contents of the record buffer to the current record in the data file. Updates any open indexes. \sa PutRecord(xbULong RecNo) \returns One of the following: \htmlonly <p> <table border=2><tr><th>Return Code</th><th>Description</th></tr> <tr><td>XB_NO_ERROR</td><td>No error</td></tr> <tr><td>XB_LOCK_FAILED</td><td>Couldn't lock file</td></tr> <tr><td>XB_NOT_OPEN</td><td>File is not open</td></tr> <tr><td>XB_INVALID_RECORD</td><td>Invalid record number</td></tr> <tr><td>XB_SEEK_ERROR</td><td>Error seeking file</td></tr> <tr><td>XB_WRITE_ERROR</td><td>Error writing to file</td></tr> </table> \endhtmlonly \latexonly \\ \\ \begin{tabular}{|l|l|} \hline \textbf{Return Code} & \textbf{Description} \\ \hline \hline XB\_NO\_ERROR & No error \\ \hline XB\_LOCK\_FAILED & Couldn't lock file \\ \hline XB\_NOT\_OPEN & File is not open \\ \hline XB\_INVALID\_RECORD & Invalid record number \\ \hline XB\_SEEK\_ERROR & Error seeking file \\ \hline XB\_WRITE\_ERROR & Error writing to file \\ \hline \end{tabular} \endlatexonly*/xbShort xbDbf::PutRecord(void) { return PutRecord(CurRec);}//! Write the current record buffer to the specified record in the data file./*! Attempts to write the contents of the record buffer to the record specified by RecNo. Updates any open indexes. \param RecNo Record number to which data should be written \returns One of the following: \htmlonly <p> <table border=2><tr><th>Return Code</th><th>Description</th></tr> <tr><td>XB_NO_ERROR</td><td>No error</td></tr> <tr><td>XB_LOCK_FAILED</td><td>Couldn't lock file</td></tr> <tr><td>XB_NOT_OPEN</td><td>File is not open</td></tr> <tr><td>XB_INVALID_RECORD</td><td>Invalid record number</td></tr> <tr><td>XB_SEEK_ERROR</td><td>Error seeking file</td></tr> <tr><td>XB_WRITE_ERROR</td><td>Error writing to file</td></tr> </table> \endhtmlonly \latexonly \\ \\ \begin{tabular}{|l|l|} \hline \textbf{Return Code} & \textbf{Description} \\ \hline \hline XB\_NO\_ERROR & No error \\ \hline XB\_LOCK\_FAILED & Couldn't lock file \\ \hline XB\_NOT\_OPEN & File is not open \\ \hline XB\_INVALID\_RECORD & Invalid record number \\ \hline XB\_SEEK\_ERROR & Error seeking file \\ \hline XB\_WRITE\_ERROR & Error writing to file \\ \hline \end{tabular} \endlatexonly*/xbShort xbDbf::PutRecord(xbULong RecNo) { xbShort rc;//fprintf(stderr, "PutRecord Start\n");#if defined(XB_INDEX_ANY) xbIxList *i;#endif if( DbfStatus == XB_CLOSED ) xb_error(XB_NOT_OPEN);/* lock the database */#ifdef XB_LOCKING_ON if( AutoLock ) { if(( rc = LockDatabase( F_SETLKW, F_WRLCK, RecNo )) != XB_NO_ERROR ) {fprintf(stderr, "%s", DatabaseName.getData());perror("failed record lock"); return rc; } if(( rc = LockDatabase( F_SETLKW, F_WRLCK, 0L )) != XB_NO_ERROR ) {fprintf(stderr, "%s", DatabaseName.getData());perror("failed file lock"); LockDatabase( F_SETLK, F_UNLCK, RecNo ); return rc; } if((rc = ReadHeader(1)) != XB_NO_ERROR) { if(AutoLock) { LockDatabase( F_SETLK, F_UNLCK, RecNo ); LockDatabase( F_SETLK, F_UNLCK, 0L ); } return rc; } }#endif if( RecNo > NoOfRecs || RecNo == 0L ) xb_error(XB_INVALID_RECORD);/* lock the indexes */#if defined(XB_INDEX_ANY)#ifdef XB_LOCKING_ON i = NdxList; while( i && AutoLock ) { if(( rc = i->index->LockIndex( F_SETLKW, F_WRLCK )) != XB_NO_ERROR ) {fprintf(stderr, "%s", DatabaseName.getData());perror("failed index lock"); return rc; } i = i->NextIx; }#endif /* XB_LOCKING_ON */#endif#if defined(XB_INDEX_ANY) /* for any unique indexes that were updated, verify no unique keys exist */ i = NdxList; while( i ) { if( i->index->UniqueIndex() ) { if(( i->KeyUpdated = i->index->KeyWasChanged()) == 1 ) if( i->index->FindKey() == XB_FOUND ) xb_error(XB_KEY_NOT_UNIQUE); } i = i->NextIx; }#endif#if defined(XB_INDEX_ANY) /* loop through deleting old index keys and adding new index keys */ i = NdxList; while( i ) { if( !i->index->UniqueIndex() ) i->KeyUpdated = i->index->KeyWasChanged(); if( i->KeyUpdated ) { i->index->CreateKey( 1, 0 ); /* load key buf w/ old values */ if((rc = i->index->DeleteKey( CurRec )) != XB_NO_ERROR) {#ifdef XB_LOCKING_ON if( AutoLock ) { LockDatabase( F_SETLK, F_UNLCK, RecNo ); LockDatabase( F_SETLK, F_UNLCK, 0L ); }#if defined(XB_INDEX_ANY) i = NdxList; while( i && AutoLock ) { i->index->LockIndex( F_SETLK, F_UNLCK ); i = i->NextIx; }#endif /* XB_INDEX_ANY */#endif /* XB_LOCKING_ON */ return rc; } i->index->CreateKey( 0, 0 ); if(( rc = i->index->AddKey(CurRec)) != XB_NO_ERROR ) {#ifdef XB_LOCKING_ON if( AutoLock ) { LockDatabase( F_SETLK, F_UNLCK, RecNo ); LockDatabase( F_SETLK, F_UNLCK, 0L ); }#if defined(XB_INDEX_ANY) i = NdxList; while( i && AutoLock ) { i->index->LockIndex( F_SETLK, F_UNLCK ); i = i->NextIx; }#endif /* XB_INDEX_ANY */#endif /* XB_LOCKING_ON */ return rc; } i->index->TouchIndex(); } i = i->NextIx; }#endif /* XB_INDEX_ANY */ if( fseek( fp, (long) HeaderLen+((RecNo-1L)*RecordLen),0 )) xb_error(XB_SEEK_ERROR); if( fwrite( RecBuf, RecordLen, 1, fp ) != 1 ) xb_error(XB_WRITE_ERROR);#ifdef XB_LOCKING_ON if( AutoLock ) { rc = LockDatabase( F_SETLK, F_UNLCK, RecNo ); if(rc) {fprintf(stderr, "%s", DatabaseName.getData());perror("failed record unlock"); } rc = LockDatabase( F_SETLK, F_UNLCK, 0L ); if(rc) {fprintf(stderr, "%s", DatabaseName.getData());perror("failed file unlock"); } }#if defined(XB_INDEX_ANY) i = NdxList; while( i && AutoLock ) { i->index->LockIndex( F_SETLK, F_UNLCK ); i = i->NextIx; }#endif /* XB_INDEX_ANY */#endif /* XB_LOCKING_ON *///fprintf(stderr, "PutRecord End\n"); CurRec = RecNo; DbfStatus = XB_OPEN; return XB_NO_ERROR;}/************************************************************************///! Delete the current record/*! Marks the current record as deleted or if "real" deletes are turned on (xbDbf::RealDeleteOn()) will delete the record and add it to the free record list. Normal dBase behavior is to simply mark the record as deleted; the record will actually be deleted when the the DBF file "packed" (xbDbf::PackDatabase()). If "real" deletes are not on, a record may be undeleted using xbDbf::UndeleteRecord(). \returns One of the following: \htmlonly <p> <table border=2><tr><th>Return Code</th><th>Description</th></tr> <tr><td>XB_NO_ERROR</td><td>No error</td></tr> <tr><td>XB_INVALID_RECORD</td><td>Invalid record number</td></tr> </table> \endhtmlonly \latexonly \\ \\ \begin{tabular}{|l|l|} \hline \textbf{Return Code} & \textbf{Description} \\ \hline \hline XB\_NO\_ERROR & No error \\ \hline XB\_INVALID\_RECORD & Invalid record number \\ \hline \end{tabular} \endlatexonly*/xbShort xbDbf::DeleteRecord( void ){ xbULong newCurRec = 0; xbShort rc = XB_NO_ERROR;#if defined(XB_INDEX_ANY) xbIxList *i;#endif if(!RecBuf) xb_error(XB_INVALID_RECORD); if(CurRec < 1 || CurRec > NoOfRecs) xb_error(XB_INVALID_RECORD);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -