public void ReverseAllFrom(Guid transactionId)
{
Api.JetSetCurrentIndex(session, txs, "by_tx_id");
Api.MakeKey(session, txs, transactionId.ToByteArray(), MakeKeyGrbit.NewKey);
if (Api.TrySeek(session, txs, SeekGrbit.SeekEQ) == false)
return;
Api.MakeKey(session, txs, transactionId.ToByteArray(), MakeKeyGrbit.NewKey);
try
{
Api.JetSetIndexRange(session, txs, SetIndexRangeGrbit.RangeUpperLimit | SetIndexRangeGrbit.RangeInclusive);
}
catch (EsentErrorException e)
{
if (e.Error != JET_err.NoCurrentRecord)
throw;
return;
}
do
{
var bytes = Api.RetrieveColumn(session, txs, ColumnsInformation.TxsColumns["bookmark_data"]);
var size = Api.RetrieveColumnAsInt32(session, txs, ColumnsInformation.TxsColumns["bookmark_size"]).Value;
var oldStatus = (MessageStatus)Api.RetrieveColumnAsInt32(session, txs, ColumnsInformation.TxsColumns["value_to_restore"]).Value;
var queue = Api.RetrieveColumnAsString(session, txs, ColumnsInformation.TxsColumns["queue"]);
var subqueue = Api.RetrieveColumnAsString(session, txs, ColumnsInformation.TxsColumns["subqueue"]);
var bookmark = new MessageBookmark
{
QueueName = queue,
Bookmark = bytes,
Size = size
};
var actions = GetQueue(queue);
var newStatus = actions.GetMessageStatus(bookmark);
switch (newStatus)
{
case MessageStatus.SubqueueChanged:
actions.SetMessageStatus(bookmark, MessageStatus.ReadyToDeliver, subqueue);
break;
case MessageStatus.EnqueueWait:
actions.Delete(bookmark);
break;
default:
actions.SetMessageStatus(bookmark, oldStatus);
break;
}
} while (Api.TryMoveNext(session, txs));
}