private void OpenCursor(string jetDatabase, Instance jetInstance,
out Session jetSession,
out JET_DBID chainStateDbId,
out JET_TABLEID globalsTableId,
out JET_COLUMNID chainTipColumnId,
out JET_COLUMNID unspentTxCountColumnId,
out JET_COLUMNID unspentOutputCountColumnId,
out JET_COLUMNID totalTxCountColumnId,
out JET_COLUMNID totalInputCountColumnId,
out JET_COLUMNID totalOutputCountColumnId,
out JET_TABLEID flushTableId,
out JET_COLUMNID flushColumnId,
out JET_TABLEID headersTableId,
out JET_COLUMNID headerBlockHashColumnId,
out JET_COLUMNID headerBytesColumnId,
out JET_TABLEID unspentTxTableId,
out JET_COLUMNID txHashColumnId,
out JET_COLUMNID blockIndexColumnId,
out JET_COLUMNID txIndexColumnId,
out JET_COLUMNID txVersionColumnId,
out JET_COLUMNID isCoinbaseColumnId,
out JET_COLUMNID outputStatesColumnId,
out JET_TABLEID unspentTxOutputTableId,
out JET_COLUMNID txOutputKeyColumnId,
out JET_COLUMNID txOutputBytesColumnId,
out JET_TABLEID spentTxTableId,
out JET_COLUMNID spentSpentBlockIndexColumnId,
out JET_COLUMNID spentDataColumnId,
out JET_TABLEID unmintedTxTableId,
out JET_COLUMNID unmintedBlockHashColumnId,
out JET_COLUMNID unmintedDataColumnId)
{
var success = false;
jetSession = new Session(jetInstance);
try
{
Api.JetOpenDatabase(jetSession, jetDatabase, "", out chainStateDbId, OpenDatabaseGrbit.None);
Api.JetOpenTable(jetSession, chainStateDbId, "Globals", null, 0, OpenTableGrbit.None, out globalsTableId);
chainTipColumnId = Api.GetTableColumnid(jetSession, globalsTableId, "ChainTip");
unspentTxCountColumnId = Api.GetTableColumnid(jetSession, globalsTableId, "UnspentTxCount");
unspentOutputCountColumnId = Api.GetTableColumnid(jetSession, globalsTableId, "UnspentOutputCount");
totalTxCountColumnId = Api.GetTableColumnid(jetSession, globalsTableId, "TotalTxCount");
totalInputCountColumnId = Api.GetTableColumnid(jetSession, globalsTableId, "TotalInputCount");
totalOutputCountColumnId = Api.GetTableColumnid(jetSession, globalsTableId, "TotalOutputCount");
if (!Api.TryMoveFirst(jetSession, globalsTableId))
throw new InvalidOperationException();
Api.JetOpenTable(jetSession, chainStateDbId, "Flush", null, 0, OpenTableGrbit.None, out flushTableId);
flushColumnId = Api.GetTableColumnid(jetSession, flushTableId, "Flush");
if (!Api.TryMoveFirst(jetSession, flushTableId))
throw new InvalidOperationException();
Api.JetOpenTable(jetSession, chainStateDbId, "Headers", null, 0, OpenTableGrbit.None, out headersTableId);
headerBlockHashColumnId = Api.GetTableColumnid(jetSession, headersTableId, "BlockHash");
headerBytesColumnId = Api.GetTableColumnid(jetSession, headersTableId, "HeaderBytes");
Api.JetOpenTable(jetSession, chainStateDbId, "UnspentTx", null, 0, OpenTableGrbit.None, out unspentTxTableId);
txHashColumnId = Api.GetTableColumnid(jetSession, unspentTxTableId, "TxHash");
blockIndexColumnId = Api.GetTableColumnid(jetSession, unspentTxTableId, "BlockIndex");
txIndexColumnId = Api.GetTableColumnid(jetSession, unspentTxTableId, "TxIndex");
txVersionColumnId = Api.GetTableColumnid(jetSession, unspentTxTableId, "TxVersion");
isCoinbaseColumnId = Api.GetTableColumnid(jetSession, unspentTxTableId, "IsCoinbase");
outputStatesColumnId = Api.GetTableColumnid(jetSession, unspentTxTableId, "OutputStates");
Api.JetOpenTable(jetSession, chainStateDbId, "UnspentTxOutput", null, 0, OpenTableGrbit.None, out unspentTxOutputTableId);
txOutputKeyColumnId = Api.GetTableColumnid(jetSession, unspentTxOutputTableId, "TxOutputKey");
txOutputBytesColumnId = Api.GetTableColumnid(jetSession, unspentTxOutputTableId, "TxOutputBytes");
Api.JetOpenTable(jetSession, chainStateDbId, "SpentTx", null, 0, OpenTableGrbit.None, out spentTxTableId);
spentSpentBlockIndexColumnId = Api.GetTableColumnid(jetSession, spentTxTableId, "SpentBlockIndex");
spentDataColumnId = Api.GetTableColumnid(jetSession, spentTxTableId, "SpentData");
Api.JetOpenTable(jetSession, chainStateDbId, "UnmintedTx", null, 0, OpenTableGrbit.None, out unmintedTxTableId);
unmintedBlockHashColumnId = Api.GetTableColumnid(jetSession, unmintedTxTableId, "BlockHash");
unmintedDataColumnId = Api.GetTableColumnid(jetSession, unmintedTxTableId, "UnmintedData");
success = true;
}
finally
{
if (!success)
jetSession.Dispose();
}
}