Files
mars-flaim/xflaim/util/diffbackups.cpp
ahodgkinson 12a621dc04 Changed license to LGPL.
git-svn-id: https://svn.code.sf.net/p/flaim/code/trunk@1010 0109f412-320b-0410-ab79-c3e0c5ffbbe6
2007-01-23 11:22:22 +00:00

321 lines
7.0 KiB
C++

//------------------------------------------------------------------------------
// Desc: Check differences between backups
// Tabs: 3
//
// Copyright (c) 2003-2007 Novell, Inc. All Rights Reserved.
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; version 2.1
// of the License.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Library Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, contact Novell, Inc.
//
// To contact Novell about this file by physical or electronic mail,
// you may find current contact information at www.novell.com.
//
// $Id$
//------------------------------------------------------------------------------
#include "dart_backup.h"
#include "ftx.h"
#include "flmarg.h"
FLMBOOL gv_bShutdown = FALSE;
FSTATIC FLMBOOL gv_bRunning = FALSE;
FSTATIC FTX_INFO * gv_pFtxInfo = NULL;
FSTATIC FTX_WINDOW * gv_pMainWindow = NULL;
FINLINE FLMBOOL breakCallback(
void * pvData)
{
F_UNREFERENCED_PARM( pvData);
return FALSE;
}
FSTATIC RCODE utilMain( FLMUINT uiArgc, char ** ppszArgv);
#ifdef FLM_NLM
// Prototypes
FSTATIC void utilCleanup( void);
// End prototypes
/****************************************************************************
Desc: This routine shuts down all threads in the NLM.
****************************************************************************/
FSTATIC void utilCleanup(
void
)
{
gv_bShutdown = TRUE;
while( gv_bRunning)
{
f_yieldCPU();
}
}
#endif
#ifdef FLM_NLM
FLMBOOL gv_bSynchronized = FALSE;
#endif
#ifdef FLM_WATCOM_NLM
#define main nlm_main
#endif
/********************************************************************
Desc: main
*********************************************************************/
#if defined( FLM_UNIX) || defined( FLM_NLM)
int main(
int iArgC,
char ** ppucArgV
)
#else
int __cdecl main(
int iArgC,
char ** ppucArgV
)
#endif
{
RCODE rc = NE_XFLM_OK;
int iResCode = 0;
gv_bShutdown = FALSE;
gv_bRunning = TRUE;
#ifdef FLM_NLM
/* Setup the routine to be called when the NLM exits itself */
atexit( utilCleanup);
#endif
if ( RC_BAD( rc = dbSystem.init()))
{
goto Exit;
}
//main code which varies from util to util goes here
rc = utilMain( iArgC, ppucArgV);
Exit:
dbSystem.exit();
#ifdef FLM_NLM
if (!gv_bSynchronized)
{
SynchronizeStart();
gv_bSynchronized = TRUE;
}
gv_bRunning = FALSE;
#endif
if ( iResCode == 0)
{
iResCode = (int)rc;
}
return( iResCode);
}
/****************************************************************************
NOTE: UTILITY-SPECIFIC CODE STARTS HERE
****************************************************************************/
/****************************************************************************
Name: utilMain
Desc: the 'main'-type method which varies per utility
****************************************************************************/
FSTATIC RCODE utilMain( FLMUINT uiArgc, char ** ppszArgv)
{
RCODE rc = NE_XFLM_OK;
FlmArgSet * pArgSet = NULL;
FLMBOOL bPrintedUsage;
FLMBOOL bBatchMode = FALSE;
FLMUINT uiScreenRows;
char szBackupRoot[128];
char szRflRoot[128];
char szDestDib1[16];
char szDestDib2[16];
FLMUINT uiSet1 = 0;
FLMUINT uiSet2 = 0;
FLMUINT64 ui64LastTrans = 0;
F_RandomGenerator randomGen;
randomGen.randomSetSeed( 123);
//initialize the windowing
TEST_RC( rc = utilInitWindow( "ezutil", &uiScreenRows,
&gv_pFtxInfo, &gv_pMainWindow, &gv_bShutdown));
if ( (pArgSet = new FlmArgSet(
"diff backups test", //description of utility
utilOutputLine, gv_pMainWindow, //output callback and data
utilPressAnyKey, gv_pMainWindow, //pager callback and data
uiScreenRows)) //rows per screen
== NULL)
{
rc = RC_SET( NE_XFLM_MEM);
goto Exit;
}
TEST_RC( rc = pArgSet->addArg(
"root", "root directory where backups are",
TRUE, FLMARG_OPTION, FLMARG_CONTENT_STRING));
TEST_RC( rc = pArgSet->addArg(
"rflroot", "root directory where rfl backups are",
TRUE, FLMARG_OPTION, FLMARG_CONTENT_STRING));
TEST_RC( rc = pArgSet->addArg(
"firstDb", "name of first database",
FALSE, FLMARG_OPTION, FLMARG_CONTENT_STRING));
TEST_RC( rc = pArgSet->addArg(
"secondDb", "name of second database",
FALSE, FLMARG_OPTION, FLMARG_CONTENT_STRING));
#ifdef FLM_LINUX
TEST_RC( rc = pArgSet->addArg(
"trans", "last trans to replay",
FALSE, FLMARG_OPTION, FLMARG_CONTENT_UNSIGNED_INT_64, (FLMUINT64)0, 0xFFFFFFFFFFFFFFFFLL));
#else
TEST_RC( rc = pArgSet->addArg(
"trans", "last trans to replay",
FALSE, FLMARG_OPTION, FLMARG_CONTENT_UNSIGNED_INT_64, (FLMUINT64)0, 0xFFFFFFFFFFFFFFFF));
#endif
//options
#ifdef FLM_NLM
TEST_RC( rc = pArgSet->addArg(
"waitToSync", "wait to sync on Netware",
TRUE, FLMARG_OPTION, FLMARG_CONTENT_NONE));
#endif
//required args
TEST_RC( rc = pArgSet->addArg(
"firstSet", "first backup set number",
FALSE, FLMARG_REQUIRED_ARG, FLMARG_CONTENT_UNSIGNED_INT,
0, 0xFFFFFFFF));
TEST_RC( rc = pArgSet->addArg(
"secondSet", "second backup set number",
FALSE, FLMARG_REQUIRED_ARG, FLMARG_CONTENT_UNSIGNED_INT,
0, 0xFFFFFFFF));
//feed in the true command line
TEST_RC( rc = pArgSet->parseCommandLine( uiArgc, ppszArgv, &bPrintedUsage));
#ifdef FLM_NLM
if (!gv_bSynchronized && !(pArgSet->argIsPresent( "waitToSync")))
{
SynchronizeStart();
gv_bSynchronized = TRUE;
}
#endif
if( pArgSet->argIsPresent("root"))
{
f_strcpy( szBackupRoot, pArgSet->getString("root"));
}
else
{
f_strcpy( szBackupRoot, "hcbstage\\backups");
}
if( pArgSet->argIsPresent("rflroot"))
{
f_strcpy( szRflRoot, pArgSet->getString("rflroot"));
}
else
{
f_strcpy( szRflRoot, "hcbstage\\rfls");
}
if( pArgSet->argIsPresent("firstDb"))
{
f_strcpy( szDestDib1, pArgSet->getString("firstDb"));
}
else
{
f_strcpy( szDestDib1, "db1.db");
}
if( pArgSet->argIsPresent("secondDb"))
{
f_strcpy( szDestDib2, pArgSet->getString("secondDb"));
}
else
{
f_strcpy( szDestDib2, "db2.db");
}
if ( pArgSet->argIsPresent("firstSet"))
{
uiSet1 = pArgSet->getUINT( "firstSet");
}
else
{
flmAssert(0);
}
if ( pArgSet->argIsPresent("secondSet"))
{
uiSet2 = pArgSet->getUINT( "secondSet");
}
else
{
flmAssert(0);
}
if( pArgSet->argIsPresent("trans"))
{
ui64LastTrans = pArgSet->getUINT64( "trans");
}
if ( RC_BAD( rc = utilDiffBackupSets(
szBackupRoot,
szRflRoot,
szDestDib1,
szDestDib2,
&randomGen,
utilOutputLine,
gv_pMainWindow,
breakCallback,
gv_pMainWindow,
uiSet1,
uiSet2,
ui64LastTrans)))
{
goto Exit;
}
Exit:
if ( !bBatchMode)
{
utilPressAnyKey( "press any key to exit...", gv_pMainWindow);
}
if ( pArgSet)
{
pArgSet->Release();
}
utilShutdownWindow( gv_pFtxInfo);
return rc;
}