Пример #1
0
        public async Task <bool> Exists(ColumnCreateDefinition def, ITransaction tran)
        {
            await foreach (RowHolder rh in pageListCollection.Iterate(tran))
            {
                int tableId = rh.GetField <int>(MetadataColumn.TableIdColumnPos);

                if (tableId == def.TableId)
                {
                    PagePointerOffsetPair stringPointer = rh.GetField <PagePointerOffsetPair>(MetadataColumn.ColumnNameColumnPos);

                    if (def.ColumnName == new string(await stringHeap.Fetch(stringPointer, tran)))
                    {
                        return(true);
                    }
                }
            }

            return(false);
        }
Пример #2
0
        public async Task <int> CreateObject(ColumnCreateDefinition def, ITransaction tran)
        {
            if (await this.Exists(def, tran))
            {
                throw new ElementWithSameNameExistsException();
            }

            RowHolder             rh          = new RowHolder(columnDefinitions);
            PagePointerOffsetPair namePointer = await this.stringHeap.Add(def.ColumnName.ToCharArray(), tran);

            rh.SetField <int>(0, def.ColumnId);
            rh.SetField <int>(1, def.TableId);
            rh.SetField <PagePointerOffsetPair>(2, namePointer);
            rh.SetField <int>(3, (int)def.ColumnType.ColumnType);
            rh.SetField <int>(4, def.ColumnType.RepCount);

            await pageListCollection.Add(rh, tran);

            return(def.ColumnId);
        }
Пример #3
0
        public async Task <int> CreateObject(TableCreateDefinition def, ITransaction tran)
        {
            if (await this.Exists(def, tran))
            {
                throw new ElementWithSameNameExistsException();
            }

            if (def.ColumnNames.Length != def.ColumnTypes.Length)
            {
                throw new ArgumentException();
            }

            int id = 1;

            if (!(await pageListCollection.IsEmpty(tran)))
            {
                int maxId = await pageListCollection.Max <int>(rh => rh.GetField <int>(0), startMin : 0, tran);

                id = maxId + 1;
            }

            MixedPage rootPage = await this.pageAllocator.AllocateMixedPage(def.ColumnTypes, PageManagerConstants.NullPageId, PageManagerConstants.NullPageId, tran);

            RowHolder             rh          = new RowHolder(columnDefinitions);
            PagePointerOffsetPair namePointer = await this.stringHeap.Add(def.TableName.ToCharArray(), tran);

            rh.SetField <int>(0, id);
            rh.SetField <PagePointerOffsetPair>(1, namePointer);
            rh.SetField <long>(2, (long)rootPage.PageId());
            await pageListCollection.Add(rh, tran);

            for (int i = 0; i < def.ColumnNames.Length; i++)
            {
                ColumnCreateDefinition ccd = new ColumnCreateDefinition(id, def.ColumnNames[i], def.ColumnTypes[i], i);
                await columnManager.CreateObject(ccd, tran);
            }

            return(id);
        }