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

📄 dbf.cpp

📁 一个通讯管理机的源代码。比较好用。推荐
💻 CPP
📖 第 1 页 / 共 5 页
字号:
        <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 + -