EsentStorage.NameTable.cs 2.4 KB
Newer Older
S
Sam Harwell 已提交
1
// Copyright (c) Microsoft.  All Rights Reserved.  Licensed under the Apache License, Version 2.0.  See License.txt in the project root for license information.
2 3 4

using Microsoft.Isam.Esent.Interop;

5
namespace Microsoft.CodeAnalysis.Esent
6 7 8 9 10 11 12 13 14 15
{
    internal partial class EsentStorage
    {
        private class NameTable : AbstractTable
        {
            private const string TableName = "NameTable";

            private const string IdColumnName = "Id";

            private const string NameIndexName = "NameIndex";
16
            private const string NameColumnName = "Name";
17 18 19 20 21 22

            private JET_COLUMNID _idColumnId;
            private JET_COLUMNID _nameColumnId;

            public override void Create(JET_SESID sessionId, JET_DBID databaseId)
            {
23 24
                var idColumnCreate = CreateAutoIncrementIdColumn(IdColumnName);
                var nameColumnCreate = CreateTextColumn(NameColumnName);
25 26 27

                var columns = new JET_COLUMNCREATE[] { idColumnCreate, nameColumnCreate };

28 29
                var primaryIndexKey = CreateIndexKey(IdColumnName);
                var nameIndexKey = CreateIndexKey(NameColumnName);
30 31 32

                var indexes = new JET_INDEXCREATE[]
                {
33 34
                    CreatePrimaryIndex(primaryIndexKey),
                    CreateUniqueTextIndex(NameIndexName, nameIndexKey)
35 36
                };

37
                var tableCreate = CreateTable(TableName, columns, indexes);
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62

                Api.JetCreateTableColumnIndex3(sessionId, databaseId, tableCreate);

                _idColumnId = idColumnCreate.columnid;
                _nameColumnId = nameColumnCreate.columnid;

                Api.JetCloseTable(sessionId, tableCreate.tableid);
            }

            public override void Initialize(JET_SESID sessionId, JET_DBID databaseId)
            {
                using (var table = new Table(sessionId, databaseId, TableName, OpenTableGrbit.ReadOnly))
                {
                    _idColumnId = Api.GetTableColumnid(sessionId, table, IdColumnName);
                    _nameColumnId = Api.GetTableColumnid(sessionId, table, NameColumnName);
                }
            }

            public override AbstractTableAccessor GetTableAccessor(OpenSession openSession)
            {
                return new StringNameTableAccessor(openSession, TableName, NameIndexName, _idColumnId, _nameColumnId);
            }
        }
    }
}