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); }
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); }
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); }