private int CountDirectParent(IEsentSession session, PostStoreEntityId directParentId) { using (var table = OpenPostsTable(session, OpenTableGrbit.ReadOnly)) { return(CountDirectParent(table, directParentId)); } }
public static async Task <EsentSession> CreateReadOnlySession(IEsentSession parentSession, IDisposeWaiters waiters) { var dispatcher = new SingleThreadDispatcher(); try { return(await dispatcher.QueueAction(() => { var session = new Session(parentSession.Instance); try { Api.JetAttachDatabase(session, parentSession.DatabaseFile, AttachDatabaseGrbit.None); JET_DBID dbid; Api.JetOpenDatabase(session, parentSession.DatabaseFile, string.Empty, out dbid, OpenDatabaseGrbit.None); // ReSharper disable once AccessToDisposedClosure return new EsentSession(parentSession.Instance, session, dbid, parentSession.DatabaseFile, waiters, dispatcher, true); } catch { session.Dispose(); throw; } })); } catch { dispatcher.Dispose(); throw; } }
private IBoardPostEntity LoadBoardEntity(IEsentSession session, ref LoadPostDataContext loadContext, PostStoreLoadMode loadMode) { var entityType = (PostStoreEntityType)loadContext.table.Columns.EntityType; var dl = loadContext.table.Columns.DataLoaded; if (loadMode.EntityLoadMode != PostStoreEntityLoadMode.EntityOnly && loadMode.EntityLoadMode != PostStoreEntityLoadMode.LinkOnly && dl == false) { var loadMode1 = loadMode.Clone(); loadMode1.EntityLoadMode = PostStoreEntityLoadMode.EntityOnly; loadMode = loadMode1; } switch (entityType) { case PostStoreEntityType.Post: case PostStoreEntityType.ThreadPreviewPost: case PostStoreEntityType.CatalogPost: return(LoadPost(session, ref loadContext, loadMode, entityType)); case PostStoreEntityType.Thread: case PostStoreEntityType.Catalog: return(LoadPostCollection(session, ref loadContext, loadMode, entityType)); case PostStoreEntityType.ThreadPreview: return(LoadThreadPreview(session, ref loadContext, loadMode, entityType)); case PostStoreEntityType.BoardPage: return(LoadThreadCollection(session, ref loadContext, loadMode, entityType)); default: return(null); } }
// ReSharper enable InconsistentNaming private LoadPostDataContext CreateLoadContext(IEsentSession session, bool openMedia, bool openQuotes) { var r = new LoadPostDataContext(); try { r.table = OpenPostsTable(session, OpenTableGrbit.ReadOnly); if (openMedia) { r.mediaTable = OpenMediaFilesTable(session, OpenTableGrbit.ReadOnly); r.mediaTable.Indexes.SequencesIndex.SetAsCurrentIndex(); } if (openQuotes) { r.quotesTable = OpenPostsTable(session, OpenTableGrbit.ReadOnly); r.quotesTable.Indexes.QuotedPostsIndex.SetAsCurrentIndex(); } } catch { r.Dispose(); throw; } return(r); }
private async Task DisposeAsync(IEsentSession session) { if (session is EsentSession s) { await s.DisposeInternal(); } }
private IBoardPostStoreAccessInfo LoadAccessInfo(IEsentSession session, PostsTable table) { var bareEntity = LoadBareEntity(table, null); DateTime?lastAccessUtc = null; Guid? lastAcessEntry = null; if (bareEntity.StoreId != null) { (lastAcessEntry, lastAccessUtc) = GetLastAccess(session, bareEntity.StoreId.Value); } DateTimeOffset?lastAccess = FromUtcToOffset(lastAccessUtc); var flags = table.Columns.Flags.Values.Where(g => g?.Value != null).ToHashSet(g => g?.Value ?? Guid.Empty); return(new PostStoreAccessInfo() { LogEntryId = lastAcessEntry, Etag = table.Columns.Etag, Entity = bareEntity, AccessTime = lastAccess, IsArchived = flags.Any(f => f == PostCollectionFlags.IsArchived), IsFavorite = flags.Any(f => f == PostCollectionFlags.IsFavorite), LastPost = bareEntity.EntityType == PostStoreEntityType.Thread ? LoadLastPostOnServer(table) : null, LastLoadedPost = bareEntity.EntityType == PostStoreEntityType.Thread && bareEntity.StoreId != null?LoadThreadLastLoadedPost(session, bareEntity.StoreId.Value) : null, NumberOfLoadedPosts = bareEntity.EntityType == PostStoreEntityType.Thread && bareEntity.StoreId != null?CountDirectParent(session, bareEntity.StoreId.Value) : 0, NumberOfPosts = bareEntity.EntityType == PostStoreEntityType.Thread ? table.Columns.NumberOfPostsOnServer : null, NumberOfReadPosts = bareEntity.EntityType == PostStoreEntityType.Thread ? table.Columns.NumberOfReadPosts : null, LastDownload = FromUtcToOffset(table.Columns.LoadedTime), LastUpdate = bareEntity.EntityType == PostStoreEntityType.Thread ? FromUtcToOffset(table.Columns.LastServerUpdate) : null }); }
private IBoardPostEntity LoadPost(IEsentSession session, ref LoadPostDataContext loadContext, bool getPostCount, PostStoreEntityType?entityType) { BasicEntityInfo bi = default(BasicEntityInfo); PostModelStorePost r = IsOriginalPageSequence(entityType) ? new PostModelStorePostWithSequence() : new PostModelStorePost(); SetPostData(session, ref loadContext, getPostCount, r, ref bi); return(r); }
private IBoardPostEntity LoadPostLight(IEsentSession session, PostsTable table, bool getPostCount, PostStoreEntityType?entityType) { BasicEntityInfo bi = default(BasicEntityInfo); PostModelStorePostLight r = IsOriginalPageSequence(entityType) ? new PostModelStorePostLightWithSequence() : new PostModelStorePostLight(); SetPostLightData(session, table, getPostCount, r, ref bi); return(r); }
private void SetPostData(IEsentSession session, ref LoadPostDataContext loadContext, PostsTable.ViewValues.PostFullLoadView v, bool getPostCount, PostModelStorePost data, ref BasicEntityInfo bi) { SetPostLightData(session, v, getPostCount, data, ref bi); var posterName = v.PosterName; var otherData = DeserializeDataContract <PostOtherData>(v.OtherDataBinary); otherData?.FillPostData(data, LinkSerialization, posterName); data.Comment = ObjectSerializationService.Deserialize(v.Document) as IPostDocument; data.LoadedTime = FromUtcToOffset(v.LoadedTime) ?? DateTimeOffset.MinValue; data.MediaFiles = LoadPostMedia(loadContext.mediaTable ?? throw new InvalidOperationException("Таблица медиафайлов не открыта"), ref bi, false); data.Quotes = LoadQuotesForPost(loadContext.quotesTable ?? throw new InvalidOperationException("Таблица цитат не открыта"), false, ref bi); }
private ILink LoadThreadLastLoadedPost(IEsentSession session, PostStoreEntityId directParentId) { using (var table = OpenPostsTable(session, OpenTableGrbit.ReadOnly)) { table.Indexes.InThreadPostLinkIndex.SetAsCurrentIndex(); Api.MakeKey(table.Session, table, directParentId.Id, MakeKeyGrbit.NewKey | MakeKeyGrbit.FullColumnEndLimit); if (Api.TrySeek(table.Session, table, SeekGrbit.SeekLE)) { var links = LoadEntityLinks(table, GenericPostStoreEntityType.Post); return(links.link); } } return(null); }
private async ValueTask <PostStoreEntityId[]> DoQueryByFlags(IEsentSession session, PostStoreEntityType type, PostStoreEntityId?parentId, IList <Guid> havingFlags) { return(await session.Run(() => { var found = new List <HashSet <int> >(); if (havingFlags != null && havingFlags.Count > 0) { using (var table = OpenPostsTable(session, OpenTableGrbit.ReadOnly)) { foreach (var flag in havingFlags) { if (parentId != null) { var index = table.Indexes.DirectParentFlagsIndex; index.SetAsCurrentIndex(); found.Add(index.EnumerateAsRetrieveIdFromIndexView(index.CreateKey(parentId.Value.Id, flag)).Select(id => id.Id).ToHashSet()); } else { var index = table.Indexes.TypeFlagsIndex; index.SetAsCurrentIndex(); found.Add(index.EnumerateAsRetrieveIdFromIndexView(index.CreateKey((byte)type, flag)).Select(id => id.Id).ToHashSet()); } } } } if (found.Count == 0) { goto CancelLabel; } var r = found[0]; foreach (var f in found.Skip(1)) { r.IntersectWith(f); } return r.Select(id => new PostStoreEntityId() { Id = id }).ToArray(); CancelLabel: return new PostStoreEntityId[0]; })); }
protected async Task <IList <PostStoreEntityId> > DoDeleteEntitiesList(IEsentSession session, IEnumerable <PostStoreEntityId> toDelete) { var result = new List <PostStoreEntityId>(); async Task Delete(PostStoreEntityId[] toDeletePart) { await session.RunInTransaction(() => { using (var table = OpenPostsTable(session, OpenTableGrbit.None)) { using (var accTable = OpenAccessLogTable(session, OpenTableGrbit.None)) { using (var mediaTable = OpenMediaFilesTable(session, OpenTableGrbit.None)) { foreach (var id in toDeletePart) { if (table.Indexes.PrimaryIndex.Find(table.Indexes.PrimaryIndex.CreateKey(id.Id))) { table.DeleteCurrentRow(); result.Add(id); } accTable.Indexes.EntityIdIndex.SetAsCurrentIndex(); foreach (var _ in accTable.Indexes.EntityIdIndex.Enumerate(accTable.Indexes.EntityIdIndex.CreateKey(id.Id))) { accTable.DeleteCurrentRow(); } mediaTable.Indexes.EntityReferencesIndex.SetAsCurrentIndex(); foreach (var _ in mediaTable.Indexes.EntityReferencesIndex.Enumerate(mediaTable.Indexes.EntityReferencesIndex.CreateKey(id.Id))) { mediaTable.DeleteCurrentRow(); } } } } } return(true); }, 1); } var split = toDelete.SplitSet(20).Select(s => s.ToArray()); foreach (var part in split) { await Delete(part); } return(result); }
private void SetPostLightData(IEsentSession session, PostsTable.ViewValues.PostLightLoadView v, bool getPostCount, PostModelStorePostLight data, ref BasicEntityInfo bi) { SetBareEntityData(v, data, ref bi); data.BoardSpecificDate = v.BoardSpecificDate; data.Counter = getPostCount && bi.parentEntityId != null?GetPostCounterNumber(session, bi.parentEntityId.Value, bi.sequenceId) ?? 0 : 0; data.Date = FromUtcToOffset(v.Date) ?? DateTimeOffset.MinValue; data.Flags = v.Flags.Where(g => g?.Value != null).Select(g => g.Value.Value).Distinct().ToList(); data.TagsSet = v.ThreadTags .Where(t => !string.IsNullOrEmpty(t?.Value)) .Select(t => t.Value) .Distinct() .OrderBy(t => t, StringComparer.CurrentCulture) .ToArray(); data.LLikes = v.Likes; data.LDislikes = v.Dislikes; }
private IBoardPostEntity LoadThreadCollection(IEsentSession session, ref LoadPostDataContext loadContext, PostStoreLoadMode loadMode, PostStoreEntityType entityType) { switch (loadMode.EntityLoadMode) { case PostStoreEntityLoadMode.LinkOnly: return(LoadLinkOnly(loadContext.table)); case PostStoreEntityLoadMode.EntityOnly: return(LoadBareEntity(loadContext.table, entityType)); case PostStoreEntityLoadMode.Light: case PostStoreEntityLoadMode.Full: return(LoadThreadCollection(loadContext.table)); default: return(null); } }
private (Guid?lastAccessEnty, DateTime?lastAccessUtc) GetLastAccess(IEsentSession session, PostStoreEntityId id) { DateTime?lastAccessUtc = null; Guid? lastAcessEntry = null; using (var accTable = OpenAccessLogTable(session, OpenTableGrbit.ReadOnly)) { var index = accTable.Indexes.EntityIdAndAccessTimeIndex; index.SetAsCurrentIndex(); Api.MakeKey(accTable.Session, accTable, id.Id, MakeKeyGrbit.NewKey | MakeKeyGrbit.FullColumnEndLimit); if (Api.TrySeek(accTable.Session, accTable, SeekGrbit.SeekLE)) { var v = accTable.Views.AccessTimeAndId.Fetch(); lastAccessUtc = v.AccessTime; lastAcessEntry = v.Id; } } return(lastAcessEntry, lastAccessUtc); }
private IBoardPostEntity LoadPost(IEsentSession session, ref LoadPostDataContext loadContext, PostStoreLoadMode loadMode, PostStoreEntityType entityType) { switch (loadMode.EntityLoadMode) { case PostStoreEntityLoadMode.LinkOnly: return(LoadLinkOnly(loadContext.table)); case PostStoreEntityLoadMode.EntityOnly: return(LoadBareEntity(loadContext.table, entityType)); case PostStoreEntityLoadMode.Light: return(LoadPostLight(session, loadContext.table, loadMode.RetrieveCounterNumber, entityType)); case PostStoreEntityLoadMode.Full: return(LoadPost(session, ref loadContext, loadMode.RetrieveCounterNumber, entityType)); default: return(null); } }
private List <(PostStoreEntityId id, int counter)> EnumEntityChildren(IEsentSession session, PostStoreEntityId entityId) { var children = new List <(PostStoreEntityId id, int counter)>(); int counter = 0; using (var table = OpenPostsTable(session, OpenTableGrbit.ReadOnly)) { var index = table.Indexes.InThreadPostLinkIndex; index.SetAsCurrentIndex(); foreach (var id in index.EnumerateAsRetrieveIdFromIndexView(index.CreateKey(entityId.Id))) { var id1 = new PostStoreEntityId() { Id = id.Id }; counter++; children.Add((id1, counter)); } } return(children); }
/// <summary> /// Конструктор. Должен вызываться из потока сессии. /// </summary> /// <param name="globalErrorHandler">Обработчик глобальных ошибок.</param> /// <param name="session">Сессия.</param> /// <param name="blobId">Идентификатор блоба.</param> public BlocksBlobStream(IGlobalErrorHandler globalErrorHandler, IEsentSession session, BlobId blobId) : base(globalErrorHandler) { _session = session ?? throw new ArgumentNullException(nameof(session)); var sid = _session.Session; try { _usage = _session.UseSession(); _transaction = new Transaction(session.Session); try { var tbl = session.OpenTable(BlobTableInfo.BlobsTableName, OpenTableGrbit.ReadOnly); _table = new BlobsTable(tbl.Session, tbl); try { Api.MakeKey(sid, _table, blobId.Id, MakeKeyGrbit.NewKey); if (!Api.TrySeek(sid, _table, SeekGrbit.SeekEQ)) { throw new BlobNotFoundException(blobId); } _inlinedStream = new ColumnStream(sid, _table, _table.GetColumnid(BlobsTable.Column.Data)); Length = _inlinedStream.Length; } catch { _table.Dispose(); } } catch { _transaction.Dispose(); throw; } } catch { _usage.Dispose(); throw; } }
private int?GetPostCounterNumber(IEsentSession session, PostStoreEntityId directParentId, int sequenceNumber) { using (var table = OpenPostsTable(session, OpenTableGrbit.ReadOnly)) { var index = table.Indexes.InThreadPostLinkIndex; index.SetAsCurrentIndex(); int cnt = 0; foreach (var v in index.EnumerateAsSequenceNumberView(index.CreateKey(directParentId.Id))) { cnt++; if (v.SequenceNumber == sequenceNumber) { return(cnt); } if (v.SequenceNumber > sequenceNumber) { return(null); } } return(null); } }
private ValueTask <Nothing> EnsureTableversion(IEsentSession session) { return(session.RunInTransaction(() => { var sid = session.Session; var dbid = session.Database; JET_TABLEID tvid; if (Api.TryOpenTable(sid, dbid, TableVersionTable, OpenTableGrbit.ReadOnly, out tvid)) { Api.JetCloseTable(sid, tvid); return false; } Api.JetCreateTable(sid, dbid, TableVersionTable, 1, 100, out tvid); try { JET_COLUMNID colid, colval; Api.JetAddColumn(sid, tvid, TableVersionIdColumn, new JET_COLUMNDEF() { coltyp = JET_coltyp.Text, cbMax = 125, grbit = ColumndefGrbit.ColumnNotNULL, cp = JET_CP.Unicode }, null, 0, out colid); Api.JetAddColumn(sid, tvid, TableVersionVersionColumn, new JET_COLUMNDEF() { coltyp = JET_coltyp.Long, grbit = ColumndefGrbit.ColumnNotNULL }, null, 0, out colval); var indexDef = $"+{TableVersionIdColumn}\0\0"; Api.JetCreateIndex(sid, tvid, TableVersionPkIndex, CreateIndexGrbit.IndexPrimary | CreateIndexGrbit.IndexUnique, indexDef, indexDef.Length, 100); return true; } finally { Api.JetCloseTable(sid, tvid); } })); }
private AccessLogTable OpenAccessLogTable(IEsentSession session, OpenTableGrbit grbit) { var r = session.OpenTable(AccessLogTableName, grbit); return(new AccessLogTable(r.Session, r.Table)); }
private MediaFilesTable OpenMediaFilesTable(IEsentSession session, OpenTableGrbit grbit) { var r = session.OpenTable(MediaFilesTableName, grbit); return(new MediaFilesTable(r.Session, r.Table)); }
/// <summary> /// Инициализировать основную таблицу. /// </summary> /// <param name="session">Сессия.</param> /// <param name="tableid">Идентификатор таблицы.</param> protected virtual void InitializeMediaFilesTable(IEsentSession session, JET_TABLEID tableid) { MediaFilesTable.CreateColumnsAndIndexes(session.Session, tableid); }
private PostsTable OpenPostsTable(IEsentSession session, OpenTableGrbit grbit) { var r = session.OpenTable(TableName, grbit); return(new PostsTable(r.Session, r.Table)); }
public EsentTransaction(IEsentSession session, Transaction transaction) { Session = session; Transaction = transaction; }
/// <summary> /// Инициализировать основную таблицу. /// </summary> /// <param name="session">Сессия.</param> /// <param name="tableid">Идентификатор таблицы.</param> protected virtual void InitializeAccessLogTable(IEsentSession session, JET_TABLEID tableid) { AccessLogTable.CreateColumnsAndIndexes(session.Session, tableid); }
/// <summary> /// Инициализировать таблицу. /// </summary> /// <param name="session">Сессия.</param> /// <param name="tableid">Идентификатор таблицы.</param> protected virtual void InitializeTable(IEsentSession session, JET_TABLEID tableid) { BoardReferenceTable.CreateColumnsAndIndexes(session.Session, tableid); }
protected BoardReferenceTable OpenTable(IEsentSession session, OpenTableGrbit grbit) { var table = session.OpenTable(TableName, grbit); return(new BoardReferenceTable(table.Session, table)); }
private ReferencesTable OpenReferencesTable(IEsentSession session, OpenTableGrbit grbit) { var r = session.OpenTable(ReferencesTableName, grbit); return(new ReferencesTable(r.Session, r.Table)); }
private BlobsTable OpenBlobsTable(IEsentSession session, OpenTableGrbit grbit) { var r = session.OpenTable(BlobsTableName, grbit); return(new BlobsTable(r.Session, r.Table)); }
private void InitializeReferencesTable(IEsentSession session, JET_TABLEID tableid) { ReferencesTable.CreateColumnsAndIndexes(session.Session, tableid); }