diff options
author | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2022-12-07 13:17:14 +0100 |
---|---|---|
committer | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2022-12-07 13:17:14 +0100 |
commit | 4875a3dd9b183dcd2256e2abfc4ccf7484c233b4 (patch) | |
tree | 0abbea881ded030851014ffdd60fbf71fead8f65 /src/tests/xb_test_lock.cpp | |
parent | daf17154bf13139d9375f48525d19d6aaba08155 (diff) |
New upstream version 4.0.2upstream/4.0.2
Diffstat (limited to 'src/tests/xb_test_lock.cpp')
-rwxr-xr-x | src/tests/xb_test_lock.cpp | 874 |
1 files changed, 874 insertions, 0 deletions
diff --git a/src/tests/xb_test_lock.cpp b/src/tests/xb_test_lock.cpp new file mode 100755 index 0000000..7e9865b --- /dev/null +++ b/src/tests/xb_test_lock.cpp @@ -0,0 +1,874 @@ +/* xb_test_lock.cpp + +XBase64 Software Library + +Copyright (c) 1997,2003,2014,2022 Gary A Kunkel + +The xb64 software library is covered under the terms of the GPL Version 3, 2007 license. + +Email Contact: + + XDB-devel@lists.sourceforge.net + XDB-users@lists.sourceforge.net + +*/ + +// This program tests the locking functions of xbase +// usage: xb_test_lock QUITE|NORMAL|VERBOSE + + +#include "xbase.h" + +using namespace xb; + +#include "tstfuncs.cpp" + +/****************************************************************/ +int main( int argCnt, char **av ) +{ + xbInt16 iRc = 0; + xbInt16 iRc2; + xbInt16 po = 1; /* print option */ + /* 0 - QUIET */ + /* 1 - NORMAL */ + /* 2 - VERBOSE */ + + xbInt16 iErrorStop = 0; + xbString sLockFile = "locktest.txt"; + xbString sLockCmd; + xbString sResult; + + xbXBase x; + xbDbf * MyFile; + + if( argCnt > 1 ) { + if( av[1][0] == 'Q' ) + po = 0; + else if( av[1][0] == 'V' ) + po = 2; + } + + xbSchema MyRecord[] = + { + { "LOCKTEST", XB_CHAR_FLD, 5, 0 }, + #ifdef XB_MEMO_SUPPORT + { "MEMOTEST", XB_MEMO_FLD, 10, 0 }, + #endif + { "",0,0,0 } + }; + + + #ifdef XB_LOGGING_SUPPORT + x.EnableMsgLogging(); + if( po > 0 ){ + std::cout << "Logfile is [" << x.GetLogFqFileName().Str() << "]" << std::endl; + } + xbString sMsg; + sMsg.Sprintf( "Program [%s] initializing...", av[0] ); + x.WriteLogMessage( sMsg ); + #endif + + x.SetDataDirectory( PROJECT_DATA_DIR ); + x.EnableMsgLogging(); + InitTime(); + #ifdef XB_DBF4_SUPPORT + MyFile = new xbDbf4( &x ); /* version 4 dbf file */ + #else + MyFile = new xbDbf3( &x ); /* version 3 dbf file */ + #endif + + iRc2 = MyFile->CreateTable( "LockTest.DBF", "LockTest", MyRecord, XB_OVERLAY, XB_MULTI_USER ); + iRc += TestMethod( po, "CreateTable()", iRc2, XB_NO_ERROR ); + iRc += TestMethod( po, "PutField()", MyFile->PutField( "LOCKTEST", "TEST" ), XB_NO_ERROR ); + iRc += TestMethod( po, "AppendRecord()", MyFile->AppendRecord(), XB_NO_ERROR ); + iRc += TestMethod( po, "Close()", MyFile->Close(), XB_NO_ERROR ); + MyFile->Close(); + + //unlink( sLockFile ); + remove( sLockFile ); + + #if defined (HAVE_FORK_F) + pid_t pid; + if(( pid = fork()) < 0 ){ + std::cout << "fork error\n"; + exit(1); + } + + if( pid == 0 ){ + // child task + xbDbf * MyFileChld; + xbInt16 iRcChld = 0; + xbBool bTblOpenChld = xbFalse; + xbInt32 iChildLoop = 0; + xbBool bDone = xbFalse; + xbString sLastLockCmd; + + #ifdef XB_DBF4_SUPPORT + MyFileChld = new xbDbf4( &x ); /* version 4 dbf file */ + #else + MyFileChld = new xbDbf3( &x ); /* version 3 dbf file */ + #endif + + x.xbSleep( 250 ); + + while( !bDone ){ + iRc2 = GetCmd( x, sLockFile, sLockCmd, 'C', po ); + + if( sLockCmd == sLastLockCmd ) + iChildLoop++; + else + sLastLockCmd = sLockCmd; + + #ifdef XB_LOGGING_SUPPORT + if( sLockCmd != "OK" && sLockCmd != "FAIL" ){ + sMsg.Sprintf( "Program [%s] Child task retrieved command=[%s] RC=[%d]", av[0], sLockCmd.Str(), iRc2 ); + x.WriteLogMessage( sMsg ); + } + #endif + + if( iRc2 == 0 ){ + + if( sLockCmd == "OK" || sLockCmd == "FAIL" ) + x.xbSleep( 250 ); + + else if( sLockCmd == "EXIT" ){ + bDone = xbTrue; + + } else if( sLockCmd == "START" && bTblOpenChld ){ + // came back before the parent task could process the result + x.xbSleep( 250 ); + + } else { + + if( sLockCmd == "START" ){ + // begin the process + iRcChld = MyFileChld->Open( "LockTest.DBF" ); + if( iRcChld != XB_NO_ERROR ){ + sResult = "FAIL"; + } else { + sResult = "OK"; + bTblOpenChld = xbTrue; + } + + } else if( sLockCmd == "TL" ){ + // table lock + if(( iRcChld = MyFileChld->LockTable( XB_LOCK )) != XB_NO_ERROR ) + sResult = "FAIL"; + else + sResult = "OK"; + + } else if( sLockCmd == "TU" ){ + // table unlock + if(( iRcChld = MyFileChld->LockTable( XB_UNLOCK )) != XB_NO_ERROR ) + sResult = "FAIL"; + else + sResult = "OK"; + + } else if( sLockCmd == "RL" ){ + // record lock + if(( iRcChld = MyFileChld->LockRecord( XB_LOCK, 1 )) != XB_NO_ERROR ) + sResult = "FAIL"; + else + sResult = "OK"; + + } else if( sLockCmd == "RU" ){ + // record unlock + if(( iRcChld = MyFileChld->LockRecord( XB_UNLOCK, 1 )) != XB_NO_ERROR ) + sResult = "FAIL"; + else + sResult = "OK"; + + } else if( sLockCmd == "ML" ){ + // memo lock + #ifdef XB_MEMO_SUPPORT + if(( iRcChld = MyFileChld->LockMemo( XB_LOCK )) != XB_NO_ERROR ) + sResult = "FAIL"; + else + sResult = "OK"; + #else + sLockCmd = "OK"; + #endif + + } else if( sLockCmd == "MU" ){ + // memo unlock + #ifdef XB_MEMO_SUPPORT + if(( iRcChld = MyFileChld->LockMemo( XB_UNLOCK )) != XB_NO_ERROR ) + sResult = "FAIL"; + else + sResult = "OK"; + #else + sLockCmd = "OK"; + #endif + } + + #ifdef XB_LOGGING_SUPPORT + sMsg.Sprintf( "Program [%s] Child task [%s] Result [%s] RC = [%d]", av[0], sLockCmd.Str(), sResult.Str(), iRcChld ); + x.WriteLogMessage( sMsg ); + #endif + SetCmd( x, sLockFile, sResult, 'C', po ); + if( sResult == "FAIL" ){ + bDone = xbTrue; + MyFileChld->Close(); + delete MyFileChld; + } + } + + } else { + iRc = iRc2; + bDone = xbTrue; + } + //std::cout << "clc [" << iChildLoop++ << "][" << bDone << "][" << sLockCmd.Str() << "]\n"; + x.xbSleep( 250 ); + if( iChildLoop > 15 ) + bDone = xbTrue; + } + MyFileChld->Close(); + delete MyFile; + delete MyFileChld; + + if( po > 0 ) + std::cout << "Exiting child\n"; + + #ifdef XB_LOGGING_SUPPORT + sMsg.Sprintf( "Program [%s] Child task terminating", av[0] ); + x.WriteLogMessage( sMsg ); + #endif + + + } else { + + // parent logic + xbInt16 iLoopCtr = 0; + + try{ + + // start + + #ifdef XB_LOGGING_SUPPORT + sMsg.Sprintf( "Program [%s] Parent task issuing START command", av[0] ); + x.WriteLogMessage( sMsg ); + #endif + + sLockCmd = "START"; + SetCmd( x, sLockFile, sLockCmd, 'P', po ); + sResult = ""; + + GetCmd( x, sLockFile, sResult, 'P', po ); + while( sResult != "OK" && sResult != "FAIL" && iLoopCtr < 30 ){ + GetCmd( x, sLockFile, sResult, 'P', po ); + x.xbSleep( 250 ); + iLoopCtr++; + } + + #ifdef XB_LOGGING_SUPPORT + sMsg.Sprintf( "Program [%s] Parent task retrieved result [%s]", av[0], sResult.Str() ); + x.WriteLogMessage( sMsg ); + #endif + + if( sResult != "OK" ){ + iErrorStop = 10; + iRc2 = -1; + throw iRc2; + } + + // table lock + #ifdef XB_LOGGING_SUPPORT + sMsg.Sprintf( "Program [%s] Parent task issuing TL command", av[0] ); + x.WriteLogMessage( sMsg ); + #endif + + sLockCmd = "TL"; + SetCmd( x, sLockFile, sLockCmd, 'P', po ); + sResult = ""; + + GetCmd( x, sLockFile, sResult, 'P', po ); + while( sResult != "OK" && sResult != "FAIL" && iLoopCtr < 30 ){ + GetCmd( x, sLockFile, sResult, 'P', po ); + x.xbSleep( 250 ); + iLoopCtr++; + } + + #ifdef XB_LOGGING_SUPPORT + sMsg.Sprintf( "Program [%s] Parent task retrieved result [%s]", av[0], sResult.Str() ); + x.WriteLogMessage( sMsg ); + #endif + + if( sResult != "OK" ){ + iErrorStop = 20; + iRc2 = -1; + throw iRc2; + } + + // attempt to lock table, should fail + if(( iRc2 = MyFile->Open( "LockTest.DBF" )) != XB_NO_ERROR ){ + iErrorStop = 30; + throw iRc2; + } + + if(( iRc2 = MyFile->LockTable( XB_LOCK )) == XB_NO_ERROR ){ + iErrorStop = 40; + throw iRc2; + } + + if( po > 0 ) + std::cout << "[PASS] LockTable Test 1\n"; + + // table unlock + #ifdef XB_LOGGING_SUPPORT + sMsg.Sprintf( "Program [%s] Parent task issuing TU command", av[0] ); + x.WriteLogMessage( sMsg ); + #endif + + sLockCmd = "TU"; + SetCmd( x, sLockFile, sLockCmd, 'P', po ); + sResult = ""; + + GetCmd( x, sLockFile, sResult, 'P', po ); + while( sResult != "OK" && sResult != "FAIL" && iLoopCtr < 30 ){ + GetCmd( x, sLockFile, sResult, 'P', po ); + x.xbSleep( 250 ); + iLoopCtr++; + } + + #ifdef XB_LOGGING_SUPPORT + sMsg.Sprintf( "Program [%s] Parent task retrieved result [%s]", av[0], sResult.Str() ); + x.WriteLogMessage( sMsg ); + #endif + + if( sResult != "OK" ){ + iErrorStop = 50; + iRc2 = -1; + throw iRc2; + } + + if(( iRc2 = MyFile->LockTable( XB_LOCK )) != XB_NO_ERROR ){ + iErrorStop = 60; + throw iRc2; + } + if( po > 0 ) + std::cout << "[PASS] LockTable Test 2\n"; + + if(( iRc2 = MyFile->LockTable( XB_UNLOCK )) != XB_NO_ERROR ){ + iErrorStop = 70; + throw iRc2; + } + + /* record lock */ + #ifdef XB_LOGGING_SUPPORT + sMsg.Sprintf( "Program [%s] Parent task issuing RL command", av[0] ); + x.WriteLogMessage( sMsg ); + #endif + + sLockCmd = "RL"; + SetCmd( x, sLockFile, sLockCmd, 'P', po ); + sResult = ""; + + GetCmd( x, sLockFile, sResult, 'P', po ); + while( sResult != "OK" && sResult != "FAIL" && iLoopCtr < 30 ){ + GetCmd( x, sLockFile, sResult, 'P', po ); + x.xbSleep( 250 ); + iLoopCtr++; + } + + #ifdef XB_LOGGING_SUPPORT + sMsg.Sprintf( "Program [%s] Parent task retrieved result [%s]", av[0], sResult.Str() ); + x.WriteLogMessage( sMsg ); + #endif + + if( sResult != "OK" ){ + iErrorStop = 80; + iRc2 = -1; + throw iRc2; + } + + if(( iRc2 = MyFile->LockRecord( XB_LOCK, 1 )) == XB_NO_ERROR ){ + iErrorStop = 90; + throw iRc2; + } + if( po > 0 ) + std::cout << "[PASS] LockRecord Test 1\n"; + + /* record unlock */ + #ifdef XB_LOGGING_SUPPORT + sMsg.Sprintf( "Program [%s] Parent task issuing RU command", av[0] ); + x.WriteLogMessage( sMsg ); + #endif + + sLockCmd = "RU"; + SetCmd( x, sLockFile, sLockCmd, 'P', po ); + sResult = ""; + + GetCmd( x, sLockFile, sResult, 'P', po ); + while( sResult != "OK" && sResult != "FAIL" && iLoopCtr < 30 ){ + GetCmd( x, sLockFile, sResult, 'P', po ); + x.xbSleep( 250 ); + iLoopCtr++; + } + + #ifdef XB_LOGGING_SUPPORT + sMsg.Sprintf( "Program [%s] Parent task retrieved result [%s]", av[0], sResult.Str() ); + x.WriteLogMessage( sMsg ); + #endif + + if( sResult != "OK" ){ + iErrorStop = 100; + iRc2 = -1; + throw iRc2; + } + + if(( iRc2 = MyFile->LockRecord( XB_LOCK, 1 )) != XB_NO_ERROR ){ + iErrorStop = 110; + throw iRc2; + } + + std::cout << "[PASS] LockRecord Test 2\n"; + if(( iRc2 = MyFile->LockRecord( XB_UNLOCK, 1 )) != XB_NO_ERROR ){ + iErrorStop = 120; + throw iRc2; + } + + + /* memo lock */ + #ifdef XB_MEMO_SUPPORT + #ifdef XB_LOGGING_SUPPORT + sMsg.Sprintf( "Program [%s] Parent task issuing ML command", av[0] ); + x.WriteLogMessage( sMsg ); + #endif + + sLockCmd = "ML"; + SetCmd( x, sLockFile, sLockCmd, 'P', po ); + sResult = ""; + + GetCmd( x, sLockFile, sResult, 'P', po ); + while( sResult != "OK" && sResult != "FAIL" && iLoopCtr < 30 ){ + GetCmd( x, sLockFile, sResult, 'P', po ); + x.xbSleep( 250 ); + iLoopCtr++; + } + + #ifdef XB_LOGGING_SUPPORT + sMsg.Sprintf( "Program [%s] Parent task retrieved result [%s]", av[0], sResult.Str() ); + x.WriteLogMessage( sMsg ); + #endif + + if( sResult != "OK" ){ + iErrorStop = 130; + iRc2 = -1; + throw iRc2; + } + + if(( iRc2 = MyFile->LockMemo( XB_LOCK )) == XB_NO_ERROR ){ + iErrorStop = 140; + throw iRc2; + } + if( po > 0 ) + std::cout << "[PASS] LockMemo Test 1\n"; + + /* memo unlock */ + #ifdef XB_LOGGING_SUPPORT + sMsg.Sprintf( "Program [%s] Parent task issuing MU command", av[0] ); + x.WriteLogMessage( sMsg ); + #endif + + sLockCmd = "MU"; + SetCmd( x, sLockFile, sLockCmd, 'P', po ); + sResult = ""; + + GetCmd( x, sLockFile, sResult, 'P', po ); + while( sResult != "OK" && sResult != "FAIL" && iLoopCtr < 30 ){ + GetCmd( x, sLockFile, sResult, 'P', po ); + x.xbSleep( 250 ); + iLoopCtr++; + } + + #ifdef XB_LOGGING_SUPPORT + sMsg.Sprintf( "Program [%s] Parent task retrieved result [%s]", av[0], sResult.Str() ); + x.WriteLogMessage( sMsg ); + #endif + + if( sResult != "OK" ){ + iErrorStop = 150; + iRc2 = -1; + throw iRc2; + } + + if(( iRc2 = MyFile->LockMemo( XB_LOCK )) != XB_NO_ERROR ){ + iErrorStop = 160; + throw iRc2; + } + + std::cout << "[PASS] LockMemo Test 2\n"; + if(( iRc2 = MyFile->LockMemo( XB_UNLOCK )) != XB_NO_ERROR ){ + iErrorStop = 170; + throw iRc2; + } + #endif + + // exit + sLockCmd = "EXIT"; + SetCmd( x, sLockFile, sLockCmd, 'P', po ); + + } catch (xbInt16 iRc3 ){ + iRc = iRc3; + if( po > 0 ) + std::cout << "Parent lock task exiting on failure [" << sLockCmd.Str() << "][" << iErrorStop << "]\n"; + + + #ifdef XB_LOGGING_SUPPORT + sMsg.Sprintf( "Program [%s] Parent task terminating with errors [%s][%d][%d][%d]...", av[0], sLockCmd.Str(), iErrorStop, iLoopCtr, iRc3 ); + x.WriteLogMessage( sMsg ); + #endif + + } + + #ifdef XB_LOGGING_SUPPORT + sMsg.Sprintf( "Program [%s] Parent task terminating", av[0] ); + x.WriteLogMessage( sMsg ); + #endif + + if( po > 0 ) + std::cout << "Exiting parent\n"; + + sLockCmd = "EXIT"; + SetCmd( x, sLockFile, sLockCmd, 'P', po ); + MyFile->Close(); + delete MyFile; + } + #elif defined (HAVE_CREATEPROCESSW_F) + + STARTUPINFO si; + PROCESS_INFORMATION pi; + ZeroMemory( &si, sizeof( si )); + si.cb = sizeof( si ); + ZeroMemory( &pi, sizeof( pi )); + + xbString strCmdLine = "xb_test_lock2"; + if( argCnt > 1 ){ + strCmdLine += " "; + strCmdLine += av[1]; + } + + char sCmdLineBuf[25]; + memset( sCmdLineBuf, 0x00, 25 ); + for( xbUInt32 i = 0; i < strCmdLine.Len(); i++ ) + sCmdLineBuf[i] = strCmdLine[i+1]; + + if( !CreateProcess( NULL, sCmdLineBuf, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi )){ + sMsg.Sprintf( "Program [%s] error in CreateProcess call. Processing aborted" ); + #ifdef XB_LOGGING_SUPPORT + x.WriteLogMessage( sMsg ); + #endif + std::cout << sMsg.Str() << "\n"; + iRc -=1; + } else { + + xbInt16 iLoopCtr = 0; + + try{ + #ifdef XB_LOGGING_SUPPORT + sMsg.Sprintf( "Program [%s] Parent task issuing START command", av[0] ); + x.WriteLogMessage( sMsg ); + #endif + + + sLockCmd = "START"; + SetCmd( x, sLockFile, sLockCmd, 'P', po ); + sResult = ""; + + GetCmd( x, sLockFile, sResult, 'P', po ); + while( sResult != "OK" && sResult != "FAIL" && iLoopCtr < 10 ){ + GetCmd( x, sLockFile, sResult, 'P', po ); + x.xbSleep( 250 ); + iLoopCtr++; + } + + #ifdef XB_LOGGING_SUPPORT + sMsg.Sprintf( "Program [%s] Parent task retrieved result [%s]", av[0], sResult.Str() ); + x.WriteLogMessage( sMsg ); + #endif + + // table lock + #ifdef XB_LOGGING_SUPPORT + sMsg.Sprintf( "Program [%s] Parent task issuing TL command", av[0] ); + x.WriteLogMessage( sMsg ); + #endif + + sLockCmd = "TL"; + SetCmd( x, sLockFile, sLockCmd, 'P', po ); + sResult = ""; + + GetCmd( x, sLockFile, sResult, 'P', po ); + while( sResult != "OK" && sResult != "FAIL" && iLoopCtr < 10 ){ + GetCmd( x, sLockFile, sResult, 'P', po ); + x.xbSleep( 250 ); + iLoopCtr++; + } + + #ifdef XB_LOGGING_SUPPORT + sMsg.Sprintf( "Program [%s] Parent task retrieved result [%s]", av[0], sResult.Str() ); + x.WriteLogMessage( sMsg ); + #endif + + if( sResult != "OK" ){ + iErrorStop = 200; + iRc2 = -1; + throw iRc2; + } + + // attempt to lock table, should fail + if(( iRc2 = MyFile->Open( "LockTest.DBF" )) != XB_NO_ERROR ){ + iErrorStop = 210; + throw iRc2; + } + + if(( iRc2 = MyFile->LockTable( XB_LOCK )) == XB_NO_ERROR ){ + iErrorStop = 220; + throw iRc2; + } + + if( po > 0 ){ + std::cout << "[PASS] LockTable Test 1\n"; + + #ifdef XB_LOGGING_SUPPORT + sMsg.Sprintf( "Program [%s] Parent task LockTable Test 1 Success.", av[0] ); + x.WriteLogMessage( sMsg ); + #endif + } + + // table unlock + #ifdef XB_LOGGING_SUPPORT + sMsg.Sprintf( "Program [%s] Parent task issuing TU command", av[0] ); + x.WriteLogMessage( sMsg ); + #endif + + sLockCmd = "TU"; + SetCmd( x, sLockFile, sLockCmd, 'P', po ); + sResult = ""; + + GetCmd( x, sLockFile, sResult, 'P', po ); + while( sResult != "OK" && sResult != "FAIL" && iLoopCtr < 10 ){ + GetCmd( x, sLockFile, sResult, 'P', po ); + x.xbSleep( 250 ); + iLoopCtr++; + } + + #ifdef XB_LOGGING_SUPPORT + sMsg.Sprintf( "Program [%s] Parent task retrieved result [%s]", av[0], sResult.Str() ); + x.WriteLogMessage( sMsg ); + #endif + + if( sResult != "OK" ){ + iErrorStop = 230; + iRc2 = -1; + throw iRc2; + } + + if(( iRc2 = MyFile->LockTable( XB_LOCK )) != XB_NO_ERROR ){ + iErrorStop = 240; + throw iRc2; + } + if( po > 0 ){ + std::cout << "[PASS] LockTable Test 2\n"; + #ifdef XB_LOGGING_SUPPORT + sMsg.Sprintf( "Program [%s] Parent task LockTable Test 1 Success.", av[0] ); + x.WriteLogMessage( sMsg ); + #endif + } + + if(( iRc2 = MyFile->LockTable( XB_UNLOCK )) != XB_NO_ERROR ){ + iErrorStop = 250; + throw iRc2; + } + + /* record lock */ + #ifdef XB_LOGGING_SUPPORT + sMsg.Sprintf( "Program [%s] Parent task issuing RL command", av[0] ); + x.WriteLogMessage( sMsg ); + #endif + + sLockCmd = "RL"; + SetCmd( x, sLockFile, sLockCmd, 'P', po ); + sResult = ""; + + GetCmd( x, sLockFile, sResult, 'P', po ); + while( sResult != "OK" && sResult != "FAIL" && iLoopCtr < 10 ){ + GetCmd( x, sLockFile, sResult, 'P', po ); + x.xbSleep( 250 ); + iLoopCtr++; + } + + #ifdef XB_LOGGING_SUPPORT + sMsg.Sprintf( "Program [%s] Parent task retrieved result [%s]", av[0], sResult.Str() ); + x.WriteLogMessage( sMsg ); + #endif + + if( sResult != "OK" ){ + iErrorStop = 260; + iRc2 = -1; + throw iRc2; + } + + if(( iRc2 = MyFile->LockRecord( XB_LOCK, 1 )) == XB_NO_ERROR ){ + iErrorStop = 270; + throw iRc2; + } + if( po > 0 ) + std::cout << "[PASS] LockRecord Test 1\n"; + + /* record unlock */ + #ifdef XB_LOGGING_SUPPORT + sMsg.Sprintf( "Program [%s] Parent task issuing RU command", av[0] ); + x.WriteLogMessage( sMsg ); + #endif + + sLockCmd = "RU"; + SetCmd( x, sLockFile, sLockCmd, 'P', po ); + sResult = ""; + + GetCmd( x, sLockFile, sResult, 'P', po ); + while( sResult != "OK" && sResult != "FAIL" && iLoopCtr < 10 ){ + GetCmd( x, sLockFile, sResult, 'P', po ); + x.xbSleep( 250 ); + iLoopCtr++; + } + + #ifdef XB_LOGGING_SUPPORT + sMsg.Sprintf( "Program [%s] Parent task retrieved result [%s]", av[0], sResult.Str() ); + x.WriteLogMessage( sMsg ); + #endif + + if( sResult != "OK" ){ + iErrorStop = 280; + iRc2 = -1; + throw iRc2; + } + + if(( iRc2 = MyFile->LockRecord( XB_LOCK, 1 )) != XB_NO_ERROR ){ + iErrorStop = 290; + throw iRc2; + } + + std::cout << "[PASS] LockRecord Test 2\n"; + if(( iRc2 = MyFile->LockRecord( XB_UNLOCK, 1 )) != XB_NO_ERROR ){ + iErrorStop = 300; + throw iRc2; + } + + + /* memo lock */ + #ifdef XB_MEMO_SUPPORT + #ifdef XB_LOGGING_SUPPORT + sMsg.Sprintf( "Program [%s] Parent task issuing ML command", av[0] ); + x.WriteLogMessage( sMsg ); + #endif + + sLockCmd = "ML"; + SetCmd( x, sLockFile, sLockCmd, 'P', po ); + sResult = ""; + + GetCmd( x, sLockFile, sResult, 'P', po ); + while( sResult != "OK" && sResult != "FAIL" && iLoopCtr < 10 ){ + GetCmd( x, sLockFile, sResult, 'P', po ); + x.xbSleep( 250 ); + iLoopCtr++; + } + + #ifdef XB_LOGGING_SUPPORT + sMsg.Sprintf( "Program [%s] Parent task retrieved result [%s]", av[0], sResult.Str() ); + x.WriteLogMessage( sMsg ); + #endif + + if( sResult != "OK" ){ + iErrorStop = 310; + iRc2 = -1; + throw iRc2; + } + + if(( iRc2 = MyFile->LockMemo( XB_LOCK )) == XB_NO_ERROR ){ + iErrorStop = 320; + throw iRc2; + } + if( po > 0 ) + std::cout << "[PASS] LockMemo Test 1\n"; + + /* memo unlock */ + #ifdef XB_LOGGING_SUPPORT + sMsg.Sprintf( "Program [%s] Parent task issuing MU command", av[0] ); + x.WriteLogMessage( sMsg ); + #endif + + sLockCmd = "MU"; + SetCmd( x, sLockFile, sLockCmd, 'P', po ); + sResult = ""; + + GetCmd( x, sLockFile, sResult, 'P', po ); + while( sResult != "OK" && sResult != "FAIL" && iLoopCtr < 10 ){ + GetCmd( x, sLockFile, sResult, 'P', po ); + x.xbSleep( 250 ); + iLoopCtr++; + } + + #ifdef XB_LOGGING_SUPPORT + sMsg.Sprintf( "Program [%s] Parent task retrieved result [%s]", av[0], sResult.Str() ); + x.WriteLogMessage( sMsg ); + #endif + + if( sResult != "OK" ){ + iErrorStop = 330; + iRc2 = -1; + throw iRc2; + } + + if(( iRc2 = MyFile->LockMemo( XB_LOCK )) != XB_NO_ERROR ){ + iErrorStop = 340; + throw iRc2; + } + + std::cout << "[PASS] LockMemo Test 2\n"; + if(( iRc2 = MyFile->LockMemo( XB_UNLOCK )) != XB_NO_ERROR ){ + iErrorStop = 350; + throw iRc2; + } + #endif + + // exit + sLockCmd = "EXIT"; + SetCmd( x, sLockFile, sLockCmd, 'P', po ); + + } catch (xbInt16 iRc3 ){ + if( po > 0 ) + std::cout << "Parent lock task exiting on failure [" << sLockCmd.Str() << "][" << iErrorStop << "]\n"; + + #ifdef XB_LOGGING_SUPPORT + sMsg.Sprintf( "Program [%s] Parent task terminating with errors [%s][%d][%d][%d]...", av[0], sLockCmd.Str(), iErrorStop, iLoopCtr, iRc3 ); + x.WriteLogMessage( sMsg ); + #endif + + sLockCmd = "EXIT"; + SetCmd( x, sLockFile, sLockCmd, 'P', po ); + MyFile->Close(); + delete MyFile; + } + } + + #else + iRc--; + sMsg.Sprintf( "Program [%s] not executed. Library does not support 'fork' or 'CreateProcess' function call", av[0] ); + #ifdef XB_LOGGING_SUPPORT + x.WriteLogMessage( sMsg ); + #endif + if( po > 0 ) + std::cout << sMsg.Str() << "\n"; + #endif + + if( po > 0 || iRc < 0 ) + fprintf( stdout, "[%s] Total Errors = %d\n", av[0], iRc * -1 ); + + #ifdef XB_LOGGING_SUPPORT + sMsg.Sprintf( "Program [%s] terminating with [%d] errors...", av[0], iRc * -1 ); + x.WriteLogMessage( sMsg ); + #endif + + return iRc; +} + |