dadlllogging

DLL Usage description

Library: dadlllogging:

This library contains the following groups of functions:

Functions that operate on the logtables (daxch008 and daxch009). The logtable is used to keep track of the progress of the import and export program. During a full exchange or an exchange based on indicators the completion of each batchline should be logged. During an exchange based on audit each transaction should be logged.

functions to retrieve info from the logtable also appear in this DLL, so all 'logic' about the logtable is concentrated in this library.

Functions that operate on the log file. The logfile is used to record errors that occur during an import run. several types of errors can be logged:

1..Errors due to badly formatted strings, etc: exchange errors. 2. Errors due to database errors. 3. Record rejection due to conditions. 4. Stop.processing becomes true before the end of a run (due to a stop condition). 5. A batchline is not executed due to an execute condition.

General remark: Whenever there is an optional parameter called company, it is possible to specify in which company should be searched for the answer, if the parameter is not provided during an actual call, the current company will be taken.

DLL Prototypes

function extern close.log.1s.transaction( )


function extern close.log.file( ) 

pre   : true 

post  : the logfile has been closed (if it was open) 


function extern flush.log.file( )
                
pre   : true 

post  : the logfile has been flushed (if it was open) 


function extern long get.ascii.file.settings.of.exchange.run( 
                domain daxch.txch xch.type,
                domain daxch.cxch xch.scheme, 
                domain daxch.cbat batch, 
                domain daxch.long run,
                domain daxch.pint try, 
                ref domain daxch.yesno compressed.files, 
                ref domain daxch.yesno control, 
                ref domain daxch.sepa separator, 
                ref domain daxch.sepa enclosing.char ) 

pre   : true 

post  : If return then compressed.files, control and separator, and enclosing.char are filled 
        with the values read from the log table (batch level). 

return: Whether the log file contains an entry for the specified xch.type, xch.scheme, 
        run and try. 


function extern long get.batch.lines.of.exchange.run( 
                domain daxch.txch xch.type, 
                domain daxch.cxch xch.scheme, 
                domain daxch.cbat batch, 
                domain daxch.long run, 
                domain daxch.pint try, 
                ref domain daxch.batl batl(), 
                ref domain daxch.path file() fixed ) 

pre   : true 

post  : If n > 0 then for all n <= return value: batl(n) = export
        batch line of xch.scheme/batch read from the log table; file(n) = the 
        name (including path name) of the file created when running batl(n) of
        xch.scheme/batch in run/try. Current record of daxch009 (log table, batch 
        line level) may have been changed. 

return: The number of batch lines of the regular export run/try of the batch specified 
        by xch.scheme/batch. (0 if no batch lines found.) 


function extern string get.highest.transno.completed( 
                domain daxch.txch xch.type, 
                const domain daxch.cxch xch.scheme, 
                long run.num, 
                long try.num,  
                const domain daxch.cbat batch, 
                [ long company ] ) 

pre   : true 

return: the highest transaction number completed found in the logtable for the run 
        as specified with the parameters. If no log record can be found for these 
        parameters 0 will be returned. 


function extern get.latest.batch.completed( 
                domain daxch.txch xch.type, 
                const domain daxch.cxch xch.scheme, 
                long run.num, 
                long try.num, 
                ref domain daxch.pint seqn, 
                ref domain daxch.cbat batch, 
                [ long company ] ) 

pre   : true 

post  : seqn and batch will contain the latest batch as has been completed
        for the given try. (these values are needed for a continuation). If not found:
        seqn = 0 and batch = "" 
 
desc  : A completed batch has an end date > 0
                

function extern long get.latest.batl.completed( 
                domain daxch.txch xch.type,
                const domain daxch.cxch xch.scheme, 
                long run.num, 
                long try.num, 
                const domain daxch.cbat batch, 
                [ long company ] ) 

pre   : true 

return: the batchline with the highest batchline sequence number found in the 
        logtable for the run as specified with the parameters. If no log record can 
        be found for these parameters 0 will be returned. 


function extern long get.next.run.num( 
                const domain daxch.cxch xch.scheme, 
                domain daxch.txch xch.type ) 

return: (max. run number found for this exchange scheme and type) + 1, if combination does not
        exist in logtable: 1 


function extern long get.next.try.num( 
                const domain daxch.cxch xch.scheme, 
                domain daxch.txch xch.type, 
                long run.num ) 

return: (maximum try number found for this run) + 1, if run number does not appear in
        logfile for this combination: 1 


function extern get.original.ttbl.and.casf( 
                ref string ttbl(), 
                ref string casf() ) 

pre   : record of daxch009 is filled 

post  : ttbl and casf are filled with the TRITON Table and ASCII file belonging to this
        logged batchline. 

desc  : Due to the parent exchange scheme concept this is not trivial to find out. 
        Moreover the link may have been removed making it unable to find the originally 
        linked table and ascii file. If they cannot be found, will both arguments be 
        emptied. 

state : record of daxch021 or daxch031 may be changed. 


function extern long get.previous.run.interval( 
                const domain daxch.cxch xch.scheme, 
                domain daxch.txch xch.type, 
                long run.num, 
                ref domain daxch.utc date.f, 
                ref domain daxch.utc date.t ) 

pre   : true 

return: whether the given run has been logged as being 'based on audit' 

state : it is assumed that all records that satisfy the where condition contain 
        the same audit interval: the export program assures this fields of daxch008 are changed 

post  : ret => the date and time variables contain the audit interval belonging to the
        given xch-scheme, -type and run. 


function extern long is.one.without.previous.run.interval( 
                const domain daxch.cxch xch.scheme.f,
                const domain daxch.cxch xch.scheme.t, 
                domain daxch.txch xch.type ) 

return: whether there exists an exchange scheme in the given range that is based on
        audit AND that in its previous run has not been exported based on audit. 

desc  : if no info can be found about the previous run 'true' will be returned. the
        field daxch008.cntl is used to determine whether there is interval information
        in the logdata 


function extern log.1s.transaction( 
                domain daxch.txch xch.type,
                const domain daxch.cxch xch.scheme, 
                const domain daxch.cbat batch, 
                long run.num, 
                long try.num, 
                long tran.id1, 
                long tran.id2, 
                long first ) 

pre   : if first transaction within a second then first = true. open.log.1s.transaction
        has been called successfully (i.e. returning true). 

post  : the transaction id (consisting of two longs) has been written to the log file. 

desc  : purpose of this function is to write transactions that are within one second to a log
        file. 


function extern log.batchline( 
                domain daxch.batl batchline, 
                long no.read,
                long no.prcd, 
                long no.erej, 
                long no.crej, 
                long no.skip, 
                domain daxch.path asciifile, 
                domain daxch.path sourcefile ) 

pre   : log.start.batch has been called for the batch this batchline belongs to 
        while log.end.batch has not been called yet. 

post  : finishing of batchline has been logged in the logtables. In daxch008 the 
        'latest completed batchline' will be updated while in daxch009 the
        statistics will be inserted. On EDUPL in daxch009 the record will be ignored.
                
state : No commit will be given and no new retry point will be set. 

desc  : It is expected (but not checked) that: no.read = no.prcd + no.erej + no.crej +
        no.skip 


function extern log.end.batch( ) 

pre   : log.start.batch has been called before 

post  : the end of the batch logged via log.start.batch has been logged
                
state : No new retry point will be set. A commit will be given. 


function extern log.error( 
                domain daxch.batl batl, 
                long error.type, 
                const string data.line(),
                ... ) 

pre   : * the logfile must have been opened by a prior call to open.log.file() 
        * error.type in {e_cond, e_dberr, e_xcherr, e_stop} 
        * 1 additional string argument (condition code) expected if error.type 
          in {e_cond, e_stop} 
        * 1 additional string argument (message code) expected if error.type =
          e_xcherr 
        * 1 additional long argument (errno) expected if error.type = e_dberr
        * Note that casf does not have to be stripped 

post  : 1 line added to the logfile |#err.desc.o 
        * consisting of: batl, error.type, error.code, data.line 
        * consisting of: batl, error.type, error.code, |#err.desc.n error.message,
          data.line |#err.desc.n  
        * in the same format as data.line (separator, encl.char, fixed length: 
          should have been passed by a prior call to open.log.file()). 
        * error.code is the additional argument (condition name, message code or 
          error number). 


function extern log.multiline( long fp ) 

pre   : * the logfile must have been opened by a prior call to open.log.file() 
        * fp is a fileponter to a file open for reading (the ascii file) 
        * the line just before the internal filepointer has just been logged to the logfile 

post  : The multiline texts following the line that has been logged are also appended to 
        the logfile. No reprocess control data will be added to the multiline text
        lines written to the logfile. 

state : The internal filepointer for file fp now points to the first non-multiline text line. 


function extern log.set.sbus.batch( ) 

pre   : log.start.batch has been called before 

post  : the field daxch008.sbus is updated with subscription.used setting state: 
        No retry.point is set and no commit is given 


function extern log.start.batch(
                domain daxch.txch xch.type, 
                const domain daxch.cxch xch.scheme, 
                long run.num,
                long try.num, 
                const domain daxch.cbat batch, 
                domain daxch.redo redo, 
                domain daxch.cntl cntl, 
                long processing.company, 
                long startup.company, 
                const string comb.sepa(), 
                domain daxch.sepa ench, 
                domain daxch.link link, 
                domain daxch.long srun, 
                domain daxch.pint stry, 
                domain daxch.yesno compressed, 
                [ domain daxch.date adat.f ], 
                [ domain daxch.time atim.f ], 
                [ domain daxch.date adat.t ], 
                [ domain daxch.time atim.t ] ) 

pre   : if atim.f and atim.t are passed as parameter they should be in hhmmss 
        format. If cntl = audit then the optional parameters are expected to be 
        filled with the audit interval. 

post  : start of batch has been logged, ie the fixed data and the start date and time. 
        Note that this fixed data is used in subsequent calls to: 
        - log.transaction() 
        - log.batchline() 
        - log.end.batch() 
        The logging will be done in company <startup.company>. 

state : No commit will be given and no new retry point will be set. 


function extern log.transaction( const string trans.num() )

pre   : log.start.batch has been called before for the batch this transaction belongs
        to while log.end.batch has not been called yet. 

post  : the finishing of the transaction has been logged in the logtable (daxch008), 
        for example the field 'highest completed transaction number' is updated. 

state : No commit will be given and no new retry point will be set. 


function extern long open.log.1s.transaction( 
                domain daxch.txch xch.type, 
                const domain daxch.cxch xch.scheme, 
                const domain daxch.cbat batch, 
                long run.num, 
                long try.num ) 

pre   : true. 

return: true if the log file could be created and opened. 

post  : if
                
return: a file has been created; the name of this file is the same as of the
        log file, but with an extension ".tran". if the file could be created and
        opened 

note  : after calling this function and function log.1s.transaction(), 
        function close.log.1s.transaction() must be called. 


function extern long open.log.file( 
                domain daxch.txch xch.type, 
                const domain daxch.cxch xch.scheme,
                const domain daxch.cbat batch, 
                long run.num, 
                long try.num, 
                string separator(1),
                string enclosing.char(1), 
                [ long company ] ) 

pre   : xch.scheme should exist
                
return: whether the logfile could be opened 

post  : the logfile where errors should be logged has been opened. If necessary the path, 
        where the logfile is located, will be created. 

desc  : After opening the file errors can be logged using subsequent calls to log.error. 
        The file should be closed by a call to close.log.file. The name of the logfile is 
        as follows: 
        * regular import: <daxch001.epth>/<xch.scheme>.<run.num>.i/log.<batch>.<run.num>.<try.num>
        * non-regular import: <daxch001.epth>/<xch.scheme>/log.<batch>.<run.num>.<try.num>
        * regular export: <daxch001.epth>/<xch.scheme>.<run.num>.e/exp.<batch>.<run.num>.<try.num> 
        * non-regular export: <daxch001.epth>/<xch.scheme>/exp.<batch>.<run.num>.<try.num>
          Where table daxch001 of company <company> is taken, or if not present, the current company. 


function extern long try.to.get.previous.run.interval(
                const domain daxch.cxch xch.scheme.f, 
                const domain daxch.cxch xch.scheme.t,
                domain daxch.txch xch.type, 
                domain daxch.long run.num, 
                ref domain daxch.utc date.f, 
                ref domain daxch.utc date.t ) 

return: Whether all xch-schemes had the same interval begin and end date and time 
        for the given run number. 

post  : ret = true => interval will be filled with the found interval. 
        ret = false => interval is undefined desc : Only exchange schemes that are based on audit and
        that also already were for run number run.num are taken into account. 


function extern long try.to.get.run.number( 
                const domain daxch.cxch xch.scheme.f, 
                const domain daxch.cxch xch.scheme.t, 
                domain daxch.txch xch.type, 
                ref long next.run.num ) 

return: whether the highest used runnumber for the given xch-type is the same for 
        all xch schemes. 

post  : ret = true => next.run.num = the found number + 1 
        ret = false => next.run.num is undefined.