@echo off :: VORTEX Database Backup CMD Library Version 2.0.01 :: 09 June 2003 :: WINDOWS NT/2000 Edition :: justin.f.mercier@boeing.com ::::::::::::::::::::::::::::::::::: :: SCRIPT FUNCTION CALL RECEPTOR :: ::::::::::::::::::::::::::::::::::: :: Preamble - Check to see if a procedure was called, if not exit nicely. :: Executes the specified specified in argument 1, shifts the args, and calls the function. @set RET= if {%1}=={} ( echo Script Library ^(%0^) Version %LIBVERSION% echo Called with no arguments, no procedure to run! pause goto :EOF ) :: Parse called procedure from args and shift arguments set _PROC=%1 shift /0 goto %_PROC% ::::::::::::::::::::::::::::::::::::::: :: END SCRIPT FUNCTION CALL RECEPTOR :: ::::::::::::::::::::::::::::::::::::::: ******************************************************************* :::::::::::::::::::::::::::::::::: :: CALL FUNCTION - setDateStamp :: :::::::::::::::::::::::::::::::::: :: called to set a generic datetime stamp :setDateStamp :: Grab date and time and set respective vars FOR /f "tokens=2-4 delims=/ " %%a in ('DATE/T') do SET sdate=%%c-%%a-%%b FOR /f "tokens=1-2 delims=: " %%a in ('TIME/T') do SET stime=%%a%%b if {%stime%} LEQ {999} set stime=0%stime% set datetime=%sdate%-%stime% goto :EOF :::::::::::::::::::::::::::::::::::::: :: END CALL FUNCTION - setDateStamp :: :::::::::::::::::::::::::::::::::::::: ******************************************************************* ::::::::::::::::::::::::::::::: :: CALL FUNCTION - RUNBACKUP :: ::::::::::::::::::::::::::::::: :: Setup the backup. :runbackup echo ********SYBASE Backup Utility-%datetime%******** echo. echo Todays date is %date%. echo Sybase will be backed up to: echo Master: %MASTERDUMPFILE%. echo %DBNAME%: %DUMPFILE%. echo. pause cls echo Backing up database...please wait call :backupEngine >%TEMPLOG% 2>&1 goto :EOF ::::::::::::::::::::::::::::::::::::: :: SUBCALL FUNCTION - BACKUPENGINE :: ::::::::::::::::::::::::::::::::::::: :: Create and run the sybase script. Otherwise return code 1. :backupEngine @echo off :: check for dump dir and create as needed if NOT EXIST %BKUPDRIVE%\%sdate% MKDIR %BKUPDRIVE%\%sdate% :: Create sql script echo dump database master to '%BKUPDRIVE%\%sdate%\%MDUMPFILE%' > %SQLSCRIPT% echo dump database %DBNAME% to '%BKUPDRIVE%\%sdate%\%DUMPFILE%' >> %SQLSCRIPT% echo go >> %SQLSCRIPT% :: Log the sql syntax echo --ISQL Command is: echo isql -U %DBUSER% -P %DBKEY% -S %DBSERVER% -D %DBNAME% -i %SQLSCRIPT% echo --SQL Script Contains (%SQLSCRIPT%): type %SQLSCRIPT% :: Run the sql script isql -U %DBUSER% -P %DBKEY% -S %DBSERVER% -D %DBNAME% -i %SQLSCRIPT% || set RET=1 if {%RET%} EQU {1} ( %trace% error running sql script... set RET=%RET%& goto :EOF ) del %SQLSCRIPT% echo. goto :EOF ::::::::::::::::::::::::::::::::::::::::: :: END SUBCALL FUNCTION - BACKUPENGINE :: ::::::::::::::::::::::::::::::::::::::::: ******************************************************************* ::::::::::::::::::::::::::: :: CALL FUNCTION readINI :: ::::::::::::::::::::::::::: :readINI :: Read the configuration from the accompanying INI file and pass through FOR. :: All vars are processed and sent to the Variable Resolver to qualify all variables in values. :: For instance, LOG=%TEMP%\logfile.txt will be resolved to C:\TEMP\logfile.txt. if not defined %INIFILE% ( %TRACE% ini file not defined.... attempting to default to backupini.ini. set INIFILE=backupini.ini ) if not exist "%INIFILE%" ( echo Required INI file ^(%INIFILE%^) could not be found.%OUTPUTDIRECT% echo The script will exit. set RET=1&set STAGE1=ERROR& goto :EOF ) :: parse the INI, ignoring fields that begin with a colon, and using the equals sign as the the field delimiter for /f "eol=: tokens=1,2 delims==" %%a in (%INIFILE%) do set %%a=%%b& call :resolveVar %%a goto :EOF ::::::::::::::::::::::::::::::: :: END CALL FUNCTION readINI :: ::::::::::::::::::::::::::::::: ******************************************************************* :::::::::::::::::::::::::::::: :: CALL FUNCTION resolveVar :: :::::::::::::::::::::::::::::: :: takes a variable name passed as argument 1 and expands any variables in it value :: thus if VAR1=%TEMP% it would be expanded to VAR1=C:\TEMP :resolveVar setlocal if {%1}=={} ( %TRACE% %0: No var passed to resolve. endlocal & goto :EOF ) if not defined %1 ( %TRACE% %0: Received %1 but no value passed to resolve endlocal & goto :EOF ) set varname=%1 set varToResolve=%%%1%% set count=0 :loop if {%count%} EQU {100} ( echo %0 could not recurse %varname%, reached 100 loops %OUTPUTDIRECT% endlocal & goto :EOF ) set IsVarRecursed=%varToResolve% %TRACE% Processing %1 with value %IsVarRecursed%. for /f "tokens=*" %%I in ('echo %varToResolve%') do set varToResolve=%%I %TRACE% %1 recursed as %varToResolve%. if "%varToResolve%" NEQ "%IsVarRecursed%" ( set /a count+=1 goto :loop ) ELSE ( %TRACE% %1 processed as %varToResolve%. endlocal & set %varname%=%varToResolve%& goto :EOF ) :: Should have exitted via a loop branch, but this is put here to avoid inadvertant bleed over into next function. echo reached end of %0..... endlocal & goto :EOF :::::::::::::::::::::::::::::::::: :: END CALL FUNCTION resolveVar :: :::::::::::::::::::::::::::::::::: ******************************************************************* ::::::::::::::::::::::::::::: :: CALL FUNCTION LOGOUTPUT :: ::::::::::::::::::::::::::::: :logoutput echo. type %TEMPLOG% echo %datetime%: Sybase Backup Log of %DBSERVER% >> %FINALLOG% type %TEMPLOG% >> %FINALLOG% del %TEMPLOG% echo. echo Sybase Dump Complete. Logfile saved as %FINALLOG%. goto :EOF ::::::::::::::::::::::::::::::::: :: END CALL FUNCTION LOGOUTPUT :: ::::::::::::::::::::::::::::::::: ******************************************************************* :: we should not be here, as we would have exitted through a lib path, but just in case endlocal & goto :EOF