summaryrefslogtreecommitdiff
path: root/src/utils
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils')
-rwxr-xr-xsrc/utils/xb_cfg_check.cpp55
-rwxr-xr-xsrc/utils/xb_dbfutil.cpp75
-rwxr-xr-xsrc/utils/xb_execsql.cpp69
-rwxr-xr-xsrc/utils/xb_import.cpp242
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;
+}
+