_logger.info("Message Contents");
final Database newContentDB = _newMessageStore.getContentDb();
final TupleBinding<MessageContentKey> oldContentKeyTupleBinding = new MessageContentKeyTB_4();
final TupleBinding<MessageContentKey> newContentKeyTupleBinding = new MessageContentKeyTB_5();
final TupleBinding contentTB = new ContentTB();
DatabaseVisitor contentVisitor = new DatabaseVisitor()
{
long _prevMsgId = -1; //Initialise to invalid value
int _bytesSeenSoFar = 0;
public void visit(DatabaseEntry key, DatabaseEntry value) throws DatabaseException
{
_count++;
//determine the msgId of the current entry
MessageContentKey_4 contentKey = (MessageContentKey_4) oldContentKeyTupleBinding.entryToObject(key);
long msgId = contentKey.getMessageId();
// ONLY copy data if message is delivered to existing queue
if (!queueMessages.contains(msgId))
{
return;
}
//if this is a new message, restart the byte offset count.
if(_prevMsgId != msgId)
{
_bytesSeenSoFar = 0;
}
//determine the content size
ByteBuffer content = (ByteBuffer) contentTB.entryToObject(value);
int contentSize = content.limit();
//create the new key: id + previously seen data count
MessageContentKey_5 newKey = new MessageContentKey_5(msgId, _bytesSeenSoFar);
DatabaseEntry newKeyEntry = new DatabaseEntry();
newContentKeyTupleBinding.objectToEntry(newKey, newKeyEntry);
DatabaseEntry newValueEntry = new DatabaseEntry();
contentTB.objectToEntry(content, newValueEntry);
newContentDB.put(null, newKeyEntry, newValueEntry);
_prevMsgId = msgId;
_bytesSeenSoFar += contentSize;