private void CreateDatabase()
{
JET_DBID blockDbId;
JET_TABLEID globalsTableId;
JET_COLUMNID blockCountColumnId;
JET_COLUMNID flushColumnId;
JET_TABLEID blockIndexTableId;
JET_COLUMNID blockIndexBlockHashColumnId;
JET_COLUMNID blockIndexBlockIndexColumnId;
JET_TABLEID blocksTableId;
JET_COLUMNID blockIndexColumnId;
JET_COLUMNID blockTxIndexColumnId;
JET_COLUMNID blockDepthColumnId;
JET_COLUMNID blockTxHashColumnId;
JET_COLUMNID blockTxBytesColumnId;
using (var jetSession = new Session(this.jetInstance))
{
var createGrbit = CreateDatabaseGrbit.None;
if (EsentVersion.SupportsWindows7Features)
createGrbit |= Windows7Grbits.EnableCreateDbBackgroundMaintenance;
Api.JetCreateDatabase(jetSession, jetDatabase, "", out blockDbId, createGrbit);
var defaultValue = BitConverter.GetBytes(0);
Api.JetCreateTable(jetSession, blockDbId, "Globals", 0, 0, out globalsTableId);
Api.JetAddColumn(jetSession, globalsTableId, "BlockCount", new JET_COLUMNDEF { coltyp = JET_coltyp.Long, grbit = ColumndefGrbit.ColumnEscrowUpdate }, defaultValue, defaultValue.Length, out blockCountColumnId);
Api.JetAddColumn(jetSession, globalsTableId, "Flush", new JET_COLUMNDEF { coltyp = JET_coltyp.Long, grbit = ColumndefGrbit.ColumnEscrowUpdate }, defaultValue, defaultValue.Length, out flushColumnId);
// initialize global data
using (var jetUpdate = jetSession.BeginUpdate(globalsTableId, JET_prep.Insert))
{
Api.SetColumn(jetSession, globalsTableId, blockCountColumnId, 0);
Api.SetColumn(jetSession, globalsTableId, flushColumnId, 0);
jetUpdate.Save();
}
Api.JetCloseTable(jetSession, globalsTableId);
Api.JetCreateTable(jetSession, blockDbId, "BlockIndex", 0, 0, out blockIndexTableId);
Api.JetAddColumn(jetSession, blockIndexTableId, "BlockHash", new JET_COLUMNDEF { coltyp = JET_coltyp.Binary, cbMax = 32, grbit = ColumndefGrbit.ColumnNotNULL | ColumndefGrbit.ColumnFixed }, null, 0, out blockIndexBlockHashColumnId);
Api.JetAddColumn(jetSession, blockIndexTableId, "BlockIndex", new JET_COLUMNDEF { coltyp = JET_coltyp.Long, grbit = ColumndefGrbit.ColumnNotNULL | ColumndefGrbit.ColumnFixed | ColumndefGrbit.ColumnAutoincrement }, null, 0, out blockIndexBlockIndexColumnId);
Api.JetCreateIndex2(jetSession, blockIndexTableId,
new JET_INDEXCREATE[]
{
new JET_INDEXCREATE
{
cbKeyMost = 255,
grbit = CreateIndexGrbit.IndexUnique | CreateIndexGrbit.IndexDisallowNull,
szIndexName = "IX_BlockHash",
szKey = "+BlockHash\0\0",
cbKey = "+BlockHash\0\0".Length
}
}, 1);
Api.JetCloseTable(jetSession, blockIndexTableId);
Api.JetCreateTable(jetSession, blockDbId, "Blocks", 0, 0, out blocksTableId);
Api.JetAddColumn(jetSession, blocksTableId, "BlockIndex", new JET_COLUMNDEF { coltyp = JET_coltyp.Long, grbit = ColumndefGrbit.ColumnNotNULL }, null, 0, out blockIndexColumnId);
Api.JetAddColumn(jetSession, blocksTableId, "TxIndex", new JET_COLUMNDEF { coltyp = JET_coltyp.Long, grbit = ColumndefGrbit.ColumnNotNULL }, null, 0, out blockTxIndexColumnId);
Api.JetAddColumn(jetSession, blocksTableId, "Depth", new JET_COLUMNDEF { coltyp = JET_coltyp.Long, grbit = ColumndefGrbit.ColumnNotNULL }, null, 0, out blockDepthColumnId);
Api.JetAddColumn(jetSession, blocksTableId, "TxHash", new JET_COLUMNDEF { coltyp = JET_coltyp.Binary, cbMax = 32, grbit = ColumndefGrbit.ColumnNotNULL | ColumndefGrbit.ColumnFixed }, null, 0, out blockTxHashColumnId);
Api.JetAddColumn(jetSession, blocksTableId, "TxBytes", new JET_COLUMNDEF { coltyp = JET_coltyp.LongBinary }, null, 0, out blockTxBytesColumnId);
Api.JetCreateIndex2(jetSession, blocksTableId,
new JET_INDEXCREATE[]
{
new JET_INDEXCREATE
{
cbKeyMost = 255,
grbit = CreateIndexGrbit.IndexUnique | CreateIndexGrbit.IndexDisallowNull,
szIndexName = "IX_BlockIndexTxIndex",
szKey = "+BlockIndex\0TxIndex\0\0",
cbKey = "+BlockIndex\0TxIndex\0\0".Length
}
}, 1);
Api.JetCloseTable(jetSession, blocksTableId);
}
}