You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-dev@db.apache.org by Miguel Matos <ra...@gmail.com> on 2007/12/20 19:22:56 UTC

How to create a ContainerHandle from a given LogRecord

Hello!
I've been studying derby's logging system. I want to parse the log files 
on disk extract its LogRecord(s) and write those
to an arbitrary stream to do some post-processing latter on.
I am using LogFactory.openForwardsScan() to traverse the log between the 
desired LogInstant(s).
This works well except for the log records on the group 
Loggable.RAWSTORE (and ContainerOperation instances in particular).
The problem is that when I try to invoke writeExternal on LogRecords of 
that group I get an NPE because
some fields of the Loggable are null (due to being transient and hence 
not saved to disk).
I will try to explain better with a small code snippet:

//<java>
void parseLog(){
        StreamLogScan redoScan;
            try {
            LogInstant a = ...
           LogInstant b = ...
           //go from LogInstant 'a' to 'b'
                redoScan = (StreamLogScan) logFactory.openForwardsScan(a,b);
                LogRecord record;
                while ((record = redoScan.getNextRecord(logIn, null, 0)) 
!= null) {
                           
 writeLog(record.getTransactionId(),record.getLoggable(),redoScan.getInstant());
                }
                return ;
}
                
//write the LogRecord to a stream ...                
void writeLog(TransactionId transactionId,Loggable operation, long 
instant) throws IOException, StandardException {

            DynamicByteArrayOutputStream logOutputBuffer = new 
DynamicByteArrayOutputStream(1024);

            FormatIdOutputStream logicalOut = new 
FormatIdOutputStream(logOutputBuffer);
            ArrayInputStream logIn = new ArrayInputStream();
            LogRecord logRecord = new LogRecord();
            logRecord.setValue(transactionId, operation);

            //ERROR here when logrecord group is Loggable.RAWSTORE
            logicalOut.writeObject(logRecord);  
            
            byte[] data = logOutputBuffer.getByteArray();
            //do something with the data ...
    }
//</java>
Let's focus on the particular case that the LogRecord's Loggable is a 
ContainerOperation.
The line "logicalOut.writeObject(logRecord)" eventually invokes 
ContainerOperation.writeExternal() and because that object
is not correctly instantiated it throws an NPE when trying to access the 
RawContainerHandle containerHdl.
I think that I must create a ContainerOperation object with an adequate 
RawContainerHandle
but I am unable to do it from the information contained _only_ in the 
LogRecord.
I have been playing around with RawStoreFactory and TransactionFactory 
but without any success.
What am I  missing ? Is my reasoning correct ? And if so how can I solve 
this problem?

Thanks for you time.

Miguel