diff options
Diffstat (limited to 'src/utils')
-rwxr-xr-x | src/utils/xb_cfg_check.cpp | 55 | ||||
-rwxr-xr-x | src/utils/xb_dbfutil.cpp | 75 | ||||
-rwxr-xr-x | src/utils/xb_execsql.cpp | 69 | ||||
-rwxr-xr-x | src/utils/xb_import.cpp | 242 |
4 files changed, 375 insertions, 66 deletions
diff --git a/src/utils/xb_cfg_check.cpp b/src/utils/xb_cfg_check.cpp index 5489c51..c979bac 100755 --- a/src/utils/xb_cfg_check.cpp +++ b/src/utils/xb_cfg_check.cpp @@ -152,6 +152,13 @@ int main() fprintf( stdout, "XB_MDX_SUPPORT = [OFF]\n" ); #endif + #ifdef XB_TDX_SUPPORT + fprintf( stdout, "XB_TDX_SUPPORT = [ON]\n" ); + #else + fprintf( stdout, "XB_TDX_SUPPORT = [OFF]\n" ); + #endif + + #ifdef XB_SQL_SUPPORT fprintf( stdout, "XB_SQL_SUPPORT = [ON]\n" ); #else @@ -183,6 +190,7 @@ int main() fprintf( stdout, "PROJECT_BINARY_DIR = [%s]\n", PROJECT_BINARY_DIR ); fprintf( stdout, "PROJECT_DATA_DIR = [%s]\n", PROJECT_DATA_DIR ); fprintf( stdout, "PROJECT_LOG_DIR = [%s]\n", PROJECT_LOG_DIR ); + fprintf( stdout, "PROJECT_TEMP_DIR = [%s]\n", PROJECT_TEMP_DIR ); fprintf( stdout, "PROJECT_DFLT_LOGFILE = [%s]\n", PROJECT_DFLT_LOGFILE ); fprintf( stdout, "PROJECT_SOURCE_DIR = [%s]\n", PROJECT_SOURCE_DIR ); fprintf( stdout, "CMAKE_RUNTIME_OUTPUT_DIRECTORY = [%s]\n\n", CMAKE_RUNTIME_OUTPUT_DIRECTORY ); @@ -191,34 +199,33 @@ int main() fprintf( stdout, "BUILD_SHARED_LIBS = [%s]\n", BUILD_SHARED_LIBS ); fprintf( stdout, "EXTRA_LIBS = [%s]\n\n", EXTRA_LIBS ); - fprintf( stdout, "Field sizes:\n" ); - fprintf( stdout, "SIZEOF_VOID_P = [%s]\n", CMAKE_SIZEOF_VOID_P ); - fprintf( stdout, "sizeof(char *) = [%zd]\n", sizeof( char *)); - fprintf( stdout, "sizeof(int) = [%zd]\n", sizeof( int )); - fprintf( stdout, "sizeof(long) = [%zd]\n", sizeof( long )); - fprintf( stdout, "sizeof(char) = [%zd]\n", sizeof( char )); + + fprintf( stdout, "sizeof(char *) = [%d]\n", (xbInt32) sizeof( char *)); + fprintf( stdout, "sizeof(int) = [%d]\n", (xbInt32) sizeof( int )); + fprintf( stdout, "sizeof(long) = [%d]\n", (xbInt32) sizeof( long )); + fprintf( stdout, "sizeof(char) = [%d]\n", (xbInt32) sizeof( char )); #ifdef HAVE_WCHAR_H - fprintf( stdout, "sizeof(wchar_t) = [%zd]\n", sizeof( wchar_t )); + fprintf( stdout, "sizeof(wchar_t) = [%d]\n", (xbInt32) sizeof( wchar_t )); #endif #ifdef HAVE_WINDOWS_H - fprintf( stdout, "sizeof(DWORD) = [%zd]\n", sizeof( DWORD )); - #endif - - fprintf( stdout, "sizeof(double) = [%zd]\n", sizeof( double )); - fprintf( stdout, "sizeof(float) = [%zd]\n", sizeof( float )); - fprintf( stdout, "sizeof(size_t) = [%zd]\n", sizeof( size_t )); - fprintf( stdout, "sizeof(off_t) = [%zd]\n\n", sizeof( off_t )); - - fprintf( stdout, "sizeof(xbBool) = [%zd]\n", sizeof( xbBool )); - fprintf( stdout, "sizeof(xbInt16) = [%zd]\n", sizeof( xbInt16 )); - fprintf( stdout, "sizeof(xbUInt16) = [%zd]\n", sizeof( xbUInt16 )); - fprintf( stdout, "sizeof(xbInt32) = [%zd]\n", sizeof( xbInt32 )); - fprintf( stdout, "sizeof(xbUInt32) = [%zd]\n", sizeof( xbUInt32 )); - fprintf( stdout, "sizeof(xbInt64) = [%zd]\n", sizeof( xbInt64 )); - fprintf( stdout, "sizeof(xbUInt64) = [%zd]\n", sizeof( xbUInt64 )); - fprintf( stdout, "sizeof(xbFloat) = [%zu]\n", sizeof( xbFloat )); - fprintf( stdout, "sizeof(xbDouble) = [%zu]\n", sizeof( xbDouble )); + fprintf( stdout, "sizeof(DWORD) = [%d]\n", (xbInt32) sizeof( DWORD )); + #endif + + fprintf( stdout, "sizeof(double) = [%d]\n", (xbInt32) sizeof( double )); + fprintf( stdout, "sizeof(float) = [%d]\n", (xbInt32) sizeof( float )); + fprintf( stdout, "sizeof(size_t) = [%d]\n", (xbInt32) sizeof( size_t )); + fprintf( stdout, "sizeof(off_t) = [%d]\n\n", (xbInt32) sizeof( off_t )); + + fprintf( stdout, "sizeof(xbBool) = [%d]\n", (xbInt32) sizeof( xbBool )); + fprintf( stdout, "sizeof(xbInt16) = [%d]\n", (xbInt32) sizeof( xbInt16 )); + fprintf( stdout, "sizeof(xbUInt16) = [%d]\n", (xbInt32) sizeof( xbUInt16 )); + fprintf( stdout, "sizeof(xbInt32) = [%d]\n", (xbInt32) sizeof( xbInt32 )); + fprintf( stdout, "sizeof(xbUInt32) = [%d]\n", (xbInt32) sizeof( xbUInt32 )); + fprintf( stdout, "sizeof(xbInt64) = [%d]\n", (xbInt32) sizeof( xbInt64 )); + fprintf( stdout, "sizeof(xbUInt64) = [%d]\n", (xbInt32) sizeof( xbUInt64 )); + fprintf( stdout, "sizeof(xbFloat) = [%d]\n", (xbInt32) sizeof( xbFloat )); + fprintf( stdout, "sizeof(xbDouble) = [%d]\n", (xbInt32) sizeof( xbDouble )); fprintf( stdout, "\nHeader files:\n" ); diff --git a/src/utils/xb_dbfutil.cpp b/src/utils/xb_dbfutil.cpp index e50495e..76988c0 100755 --- a/src/utils/xb_dbfutil.cpp +++ b/src/utils/xb_dbfutil.cpp @@ -90,6 +90,7 @@ class xbUtil{ void UpdateTableAutoCommit(); void DisplayTableInfo(); void RenameTable(); + void DeleteTable(); // 4 - RecordMenu options void GetRecord(); @@ -776,7 +777,7 @@ void xbUtil::LockRecord(){ std::cin.getline( cBuf, 15 ); //iRc = dActiveTable->LockRecord( XB_LOCK, atol( cBuf )); iRc = dActiveTable->LockRecord( XB_LOCK, strtoul( cBuf, NULL, 0 )); - + x->DisplayError( iRc ); } @@ -1453,6 +1454,24 @@ void xbUtil::DisplayTableInfo(){ } /*************************************************************************************/ +void xbUtil::DeleteTable(){ + + if( !dActiveTable ) + dActiveTable = GetTablePtr( " - select table" ); + + if( !dActiveTable ){ + std::cout << "No table selected" << std::endl; + return; + } + + dActiveTable->DeleteTable(); + dActiveTable = NULL; + std::cout << "Table deleted.\n"; + +} + + +/*************************************************************************************/ void xbUtil::RenameTable(){ if( !dActiveTable ) @@ -1510,26 +1529,29 @@ void xbUtil::DisplayActiveTable() const{ if( dActiveTable ){ std::cout << "Active Table = [" << dActiveTable->GetTblAlias().Str() << "] "; xbUInt32 ulRecCnt = 0; - dActiveTable->ReadHeader( 0, 1 ); - dActiveTable->GetRecordCnt( ulRecCnt ); - std::cout << "Total Records = [" << ulRecCnt << "] "; - std::cout << "Current Record = [" << dActiveTable->GetCurRecNo() << "] "; - - if( dActiveTable->GetAutoCommit()) - std::cout << " Auto Commit = [Enabled]"; - else - std::cout << " Auto Commit = [Disabled]"; + xbInt16 iRc; + if(( iRc = dActiveTable->GetRecordCnt( ulRecCnt )) == XB_NO_ERROR ){ + std::cout << "Total Records = [" << ulRecCnt << "] "; + std::cout << "Current Record = [" << dActiveTable->GetCurRecNo() << "] "; - std::cout << std::endl; - #ifdef XB_INDEX_SUPPORT - xbIx *pIx = dActiveTable->GetCurIx(); - if( pIx ){ - void *vpTag = dActiveTable->GetCurTag(); - std::cout << "Active Tag = [" << pIx->GetTagName( vpTag ).Str() << "] Type = [" << dActiveTable->GetCurIxType().Str() << + if( dActiveTable->GetAutoCommit()) + std::cout << " Auto Commit = [Enabled]"; + else + std::cout << " Auto Commit = [Disabled]"; + + std::cout << std::endl; + #ifdef XB_INDEX_SUPPORT + xbIx *pIx = dActiveTable->GetCurIx(); + if( pIx ){ + void *vpTag = dActiveTable->GetCurTag(); + std::cout << "Active Tag = [" << pIx->GetTagName( vpTag ).Str() << "] Type = [" << dActiveTable->GetCurIxType().Str() << "] \tFile Name = [" << pIx->GetFileName().Str() << "] Key = [" << pIx->GetKeyExpression( vpTag ).Str() << "]" << std::endl; + } + #endif // XB_INDEX_SUPPORT + std::cout << std::endl; + } else { + x->DisplayError( iRc ); } - #endif // XB_INDEX_SUPPORT - std::cout << std::endl; } } /*************************************************************************************/ @@ -1716,7 +1738,7 @@ void xbUtil::DisplayTableStats(){ iOptionNo = 1; } if( iOptionNo < 5 ) { - d->ReadHeader( xbTrue, 0 ); + // d->ReadHeader( xbTrue, 0 ); moved to DumpHeader routine d->DumpHeader( iOptionNo ); } else { // DBMS settings @@ -2192,6 +2214,8 @@ void xbUtil::ProcessOption( const xbString &sOption ){ DisplayTableInfo(); else if( sOption == "=3.15" ) RenameTable(); + else if( sOption == "=3.16" ) + DeleteTable(); else if( sOption == "=4" ) RecordMenu(); else if( sOption == "=4.1" ) @@ -2824,7 +2848,7 @@ void xbUtil::FileMenu() std::cout << "13 - Update Table Auto Commit Setting" << std::endl; std::cout << "14 - Display Table Info" << std::endl; std::cout << "15 - Rename Table" << std::endl; - + std::cout << "16 - Delete Table" << std::endl; std::cout << "99 - Exit Menu" << std::endl; option = GetOption(); @@ -2833,7 +2857,7 @@ void xbUtil::FileMenu() case 0: break; case 1: ListFilesInDataDirectory(); break; case 2: UpdateDataDirectory(); break; - case 3: x->DisplayTableList(); break; + case 3: x->DisplayTableList(); break; case 4: Open(); break; case 5: Close(); break; case 6: CloseAllTables(); break; @@ -2845,13 +2869,13 @@ void xbUtil::FileMenu() case 13: UpdateTableAutoCommit(); break; case 14: DisplayTableInfo(); break; case 15: RenameTable(); break; + case 16: DeleteTable(); break; case 99: break; default: std::cout << "Invalid Option" << std::endl; } } } - /************************************************************************/ #ifdef XB_NDXINF_SUPPORT void xbUtil::InfFileMenu() @@ -3391,7 +3415,7 @@ void xbUtil::FindKey(){ default: std::cout << "Unknown key type [" << cKeyType << "]" << std::endl; return; - break; + // break; } char cBuf[128]; @@ -3457,8 +3481,9 @@ void xbUtil::Reindex(){ std::cout << "Tag not selected" << std::endl; return; } - void *vpCurTag = dActiveTable->GetCurTag(); - xbInt16 iRc = pIx->Reindex( &vpCurTag ); + //void *vpCurTag = dActiveTable->GetCurTag(); + //xbInt16 iRc = pIx->Reindex( &vpCurTag ); + xbInt16 iRc = dActiveTable->Reindex( 0 ); x->DisplayError( iRc ); } diff --git a/src/utils/xb_execsql.cpp b/src/utils/xb_execsql.cpp index daa6b6e..3441e91 100755 --- a/src/utils/xb_execsql.cpp +++ b/src/utils/xb_execsql.cpp @@ -15,12 +15,21 @@ Email Contact: */ #include <xbase.h> - using namespace xb; -xbInt16 GetNextSqlCmd( xbFile &f, xbString &sCmd ); -xbInt16 GetNextSqlCmd( xbFile &f, xbString &sCmd ) -{ +void PrintHelp(); +void PrintHelp(){ + std::cout << "Usage: xb_execsql [-h] [-?] [--help] [-v] [--version] -i filename.SQL -q --quiet" << std::endl << std::endl; + std::cout << "This program processes sql commands from input file 'filename.SQL'" << std::endl << std::endl; +} +void PrintVersion(); +void PrintVersion(){ + std::cout << "Xbase64 Version: " << xbase_VERSION_MAJOR << "." << xbase_VERSION_MINOR << "." << xbase_VERSION_PATCH << std::endl; +} + + +xbInt16 GetNextSqlCmd( xbFile &f, xbString &sCmd, xbBool bQuiet ); +xbInt16 GetNextSqlCmd( xbFile &f, xbString &sCmd, xbBool bQuiet ){ sCmd = ""; xbString sLine; xbInt16 iRc = XB_NO_ERROR; @@ -31,6 +40,12 @@ xbInt16 GetNextSqlCmd( xbFile &f, xbString &sCmd ) bDone = xbTrue; } else { + if( !bQuiet ){ + std::cout << sLine; + if( sLine.Pos( 0x0a ) == 0 ) + std::cout << std::endl; + } + // don't need CR/LF chars sLine.ZapChar( 0x0a ); sLine.ZapChar( 0x0d ); @@ -50,23 +65,43 @@ xbInt16 GetNextSqlCmd( xbFile &f, xbString &sCmd ) return iRc; } -int main(int ac,char** av) + +int main(int argc, char* argv[]) { + xbXBase x; + xbSql sql( &x ); + xbFile f( sql.GetXbasePtr() ); + xbInt16 iRc = XB_NO_ERROR; + xbString sFileName = ""; + xbString sSqlLine = ""; + xbString sParm = ""; + xbBool bQuiet = xbFalse; + + x.EnableMsgLogging(); - if (ac <= 1) { - std::cout << "Usage: xb_execsql filename..." << std::endl; + if (argc < 2 || x.GetCmdLineOpt( argc, argv, "-h", sParm ) || + x.GetCmdLineOpt( argc, argv, "-?", sParm ) || + x.GetCmdLineOpt( argc, argv, "--help", sParm )){ + PrintHelp(); return 1; } - xbXBase x; - x.EnableMsgLogging(); - xbSql sql( &x ); - xbFile f( sql.GetXbasePtr() ); - xbInt16 iRc = XB_NO_ERROR; - xbString sFileName; - xbString sSqlLine; + if ( x.GetCmdLineOpt( argc, argv, "-v", sParm ) || + x.GetCmdLineOpt( argc, argv, "--version", sParm )){ + PrintVersion(); + return 1; + } + + if ( x.GetCmdLineOpt( argc, argv, "-q", sParm ) || + x.GetCmdLineOpt( argc, argv, "--quiet", sParm )){ + bQuiet = xbTrue; + } + + if( !x.GetCmdLineOpt( argc, argv, "-i", sFileName ) || sFileName == "" ){ + PrintHelp(); + return 1; + } - sFileName = av[1]; if(( iRc = f.xbFopen( "r", sFileName, XB_SINGLE_USER )) != XB_NO_ERROR ){ xbString sMsg; @@ -77,12 +112,12 @@ int main(int ac,char** av) } while( iRc == XB_NO_ERROR ){ - iRc = GetNextSqlCmd( f, sSqlLine ); + iRc = GetNextSqlCmd( f, sSqlLine, bQuiet ); if( iRc == XB_NO_ERROR ){ sSqlLine.Trim(); - std::cout << "Processing line [" << sSqlLine.Str() << "]\n"; + // std::cout << "Processing line [" << sSqlLine.Str() << "]\n"; iRc = sql.ExecuteNonQuery( sSqlLine ); if( iRc != XB_NO_ERROR ) x.DisplayError( iRc ); diff --git a/src/utils/xb_import.cpp b/src/utils/xb_import.cpp new file mode 100755 index 0000000..272a0d0 --- /dev/null +++ b/src/utils/xb_import.cpp @@ -0,0 +1,242 @@ +/* xb_import.cpp + +XBase64 Software Library + +Copyright (c) 1997,2003,2014,2023 Gary A Kunkel + +The xb64 software library is covered under +the terms of the GPL Version 3, 2007 license. + +Email Contact: + + xb64-devel@lists.sourceforge.net + xb64-users@lists.sourceforge.net + +*/ + +#include <xbase.h> +using namespace xb; + + +struct sFldMap{ + xbUInt32 iRecPos; + xbInt16 iFldNo; + char cFldType; + sFldMap *next; +}; + +void PrintHelp(); +void PrintHelp(){ + std::cout << "Usage: xb_execsql [-h] [-?] [--help] [-v] [--version] -i infilename.txt -d delimeter -t table.DBF -q --quiet" << std::endl << std::endl; + std::cout << "This program imports data from a text file into a specified DBF file/table." << std::endl << std::endl; +} +void PrintVersion(); +void PrintVersion(){ + std::cout << "Xbase64 Version: " << xbase_VERSION_MAJOR << "." << xbase_VERSION_MINOR << "." << xbase_VERSION_PATCH << std::endl; +} + + + +int main(int argc, char* argv[]) +{ + xbXBase x; + xbSql sql( &x ); + xbFile f( sql.GetXbasePtr() ); + xbInt16 iRc = XB_NO_ERROR; + xbString sFileName = ""; + xbString sTableName = ""; + xbString sSqlLine = ""; + xbString sParm = ""; + xbString sMsg; + xbString sLine; + xbString sFld; + xbBool bQuiet = xbFalse; + char cDelimiter = ','; + char cType = ' '; + sFldMap *fmFldList = 0; + sFldMap *fmTemp = 0; + xbInt16 iFldNo = 0; + xbUInt32 ulRecCtr = 0; + xbBool bRecUpdated; + x.EnableMsgLogging(); + + + if (argc < 2 || x.GetCmdLineOpt( argc, argv, "-h", sParm ) || + x.GetCmdLineOpt( argc, argv, "-?", sParm ) || + x.GetCmdLineOpt( argc, argv, "--help", sParm )){ + PrintHelp(); + return 1; + } + + if ( x.GetCmdLineOpt( argc, argv, "-v", sParm ) || + x.GetCmdLineOpt( argc, argv, "--version", sParm )){ + PrintVersion(); + return 1; + } + + if ( x.GetCmdLineOpt( argc, argv, "-q", sParm ) || + x.GetCmdLineOpt( argc, argv, "--quiet", sParm )){ + bQuiet = xbTrue; + } + + if ( x.GetCmdLineOpt( argc, argv, "-d", sParm )){ + if( sParm.Len() > 0 ){ + cDelimiter = sParm[1]; + } + } + + if( !x.GetCmdLineOpt( argc, argv, "-i", sFileName ) || sFileName == "" ){ + PrintHelp(); + return 1; + } + + if( !x.GetCmdLineOpt( argc, argv, "-t", sTableName ) || sTableName == "" ){ + PrintHelp(); + return 1; + } + + xbDbf *MyFile = NULL; + if(( iRc = x.OpenHighestVersion( sTableName.Str(), "", &MyFile )) != XB_NO_ERROR ){ + std::cout << "Could not open table/file RC = " << iRc << " file = " << sTableName.Str() << std::endl; + x.DisplayError( iRc ); + return 1; + } + + if(( iRc = f.xbFopen( "r", sFileName, XB_SINGLE_USER )) != XB_NO_ERROR ){ + sMsg.Sprintf( "Error opening [%s]\n", sFileName.Str() ); + std::cout << sMsg.Str(); + x.DisplayError( iRc ); + return 1; + } + + + if(( iRc = f.xbFgets( 1024, sLine )) != XB_NO_ERROR ){ + sMsg.Sprintf( "Error reading [%s]\n", sFileName.Str() ); + std::cout << sMsg.Str(); + x.DisplayError( iRc ); + return 1; + } + + + // determine how many fields in a record + xbUInt32 lFldCnt = sLine.CountChar( cDelimiter, 1 ); + // std::cout << "in rec = [" << sLine.Str() << "]\n"; + // std::cout << "fld cnt = [" << lFldCnt << "]\n"; + + // do the mapping between field names in source data and field numbers in target table + for( xbUInt32 l = 0; l < (lFldCnt + 1); l++ ){ + + // get the field + sFld.ExtractElement( sLine.Str(), cDelimiter, l+1, 1 ); + sFld.ZapTrailingChar( 0x0a ); // eliminate CRLF + sFld.ZapTrailingChar( 0x0d ); // eliminate CRLF + + + // do the lookup + // std::cout << "processing field [" << l << "] [" << sFld.Str() << "]\n"; + // if found, create an entry in the field list structure + // else if not quiet, display a message + + //iRc = MyFile->GetFieldNo( sFld, &iFldNo ); + + if(( iRc = MyFile->GetFieldNo( sFld, iFldNo )) == XB_NO_ERROR ){ + MyFile->GetFieldType( iFldNo, cType ); + fmTemp = (sFldMap *) calloc( 1, sizeof( sFldMap )); + if( !fmTemp ){ + std::cout << "Memory allocation error\n"; + exit(1); + } else { + fmTemp->iRecPos = l; + fmTemp->iFldNo = iFldNo; + fmTemp->cFldType = cType; + fmTemp->next = fmFldList; + fmFldList = fmTemp; + + } + } else { + if( !bQuiet ){ + std::cout << "Field [" << sFld.Str() << "] not found in target table" << std::endl; + } + } + } + + + while( f.xbFgets( 1024, sLine ) == XB_NO_ERROR ){ + bRecUpdated = xbFalse; + // std::cout << sLine.Str() << "\n"; + + if(( iRc = MyFile->BlankRecord()) != XB_NO_ERROR ){ + sMsg.Sprintf( "MyFile->BlankRecord() error [%d]\n", iRc ); + std::cout << sMsg.Str(); + x.DisplayError( iRc ); + } else { + + fmTemp = fmFldList; + while( fmTemp ){ + + // std::cout << "*** RecPos = " << fmTemp->iRecPos << " FldNo = " << fmTemp->iFldNo << " Type = " << fmTemp->cFldType << "\n"; + + sFld.ExtractElement( sLine.Str(), cDelimiter, fmTemp->iRecPos+1, 1 ); + sFld.ZapTrailingChar( 0x0a ); // eliminate CRLF + sFld.ZapTrailingChar( 0x0d ); // eliminate CRLF + + // remove any matching leading and trailing quotes + if( sFld[1] == '\'' && sFld[sFld.Len()] == '\'' ){ + sFld.ZapTrailingChar( '\'' ); + sFld.ZapLeadingChar ( '\'' ); + //std::cout << "DataNq = " << sFld.Str() << "\n"; + } else if( sFld[1] == '"' && sFld[sFld.Len()] == '"' ){ + sFld.ZapTrailingChar( '"' ); + sFld.ZapLeadingChar ( '"' ); + } + + // std::cout << "Data = " << sFld.Str() << "\n"; + if( sFld.Len() > 0 ){ + bRecUpdated = xbTrue; + if( fmTemp->cFldType == 'C' || fmTemp->cFldType == 'L' || fmTemp->cFldType == 'D' || fmTemp->cFldType == 'N' || fmTemp->cFldType == 'F' ){ + iRc = MyFile->PutField( fmTemp->iFldNo, sFld ); + } else if( fmTemp->cFldType == 'M' ){ + iRc = MyFile->UpdateMemoField( fmTemp->iFldNo, sFld ); + } else { + std::cout << "Field type [" << fmTemp->cFldType << "] not built yet" << std::endl; + } + + if( iRc != XB_NO_ERROR && !bQuiet ){ + std::cout << "Error [" << iRc << "] on field [" << fmTemp->iFldNo << "] on record [" << ulRecCtr << "]" << std::endl; + } + } + fmTemp = fmTemp->next; + } + + if( bRecUpdated ){ + iRc = MyFile->AppendRecord(); + if( iRc != XB_NO_ERROR ){ + if( !bQuiet ){ + std::cout << "Error [" << iRc << "] on appending record [" << ulRecCtr << "]" << std::endl; + } + MyFile->Abort(); + } else { + iRc = MyFile->Commit(); + if( iRc != XB_NO_ERROR ){ + if( !bQuiet ){ + std::cout << "Error [" << iRc << "] on appending record [" << ulRecCtr << "]" << std::endl; + } + MyFile->Abort(); + } + } + } + + } + + ulRecCtr++; + + } + + + + + + f.xbFclose(); + return 0; +} + |