示例#1
0
 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);
        }
示例#10
0
 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);
 }
示例#11
0
        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];
            }));
        }
示例#12
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);
        }
示例#13
0
        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;
        }
示例#14
0
        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);
            }
        }
示例#15
0
        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);
        }
示例#16
0
        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);
            }
        }
示例#17
0
        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);
        }
示例#18
0
        /// <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;
            }
        }
示例#19
0
 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);
     }
 }
示例#20
0
 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);
         }
     }));
 }
示例#21
0
        private AccessLogTable OpenAccessLogTable(IEsentSession session, OpenTableGrbit grbit)
        {
            var r = session.OpenTable(AccessLogTableName, grbit);

            return(new AccessLogTable(r.Session, r.Table));
        }
示例#22
0
        private MediaFilesTable OpenMediaFilesTable(IEsentSession session, OpenTableGrbit grbit)
        {
            var r = session.OpenTable(MediaFilesTableName, grbit);

            return(new MediaFilesTable(r.Session, r.Table));
        }
示例#23
0
 /// <summary>
 /// Инициализировать основную таблицу.
 /// </summary>
 /// <param name="session">Сессия.</param>
 /// <param name="tableid">Идентификатор таблицы.</param>
 protected virtual void InitializeMediaFilesTable(IEsentSession session, JET_TABLEID tableid)
 {
     MediaFilesTable.CreateColumnsAndIndexes(session.Session, tableid);
 }
示例#24
0
        private PostsTable OpenPostsTable(IEsentSession session, OpenTableGrbit grbit)
        {
            var r = session.OpenTable(TableName, grbit);

            return(new PostsTable(r.Session, r.Table));
        }
示例#25
0
 public EsentTransaction(IEsentSession session, Transaction transaction)
 {
     Session = session;
     Transaction = transaction;
 }
示例#26
0
 /// <summary>
 /// Инициализировать основную таблицу.
 /// </summary>
 /// <param name="session">Сессия.</param>
 /// <param name="tableid">Идентификатор таблицы.</param>
 protected virtual void InitializeAccessLogTable(IEsentSession session, JET_TABLEID tableid)
 {
     AccessLogTable.CreateColumnsAndIndexes(session.Session, tableid);
 }
示例#27
0
 /// <summary>
 /// Инициализировать таблицу.
 /// </summary>
 /// <param name="session">Сессия.</param>
 /// <param name="tableid">Идентификатор таблицы.</param>
 protected virtual void InitializeTable(IEsentSession session, JET_TABLEID tableid)
 {
     BoardReferenceTable.CreateColumnsAndIndexes(session.Session, tableid);
 }
示例#28
0
        protected BoardReferenceTable OpenTable(IEsentSession session, OpenTableGrbit grbit)
        {
            var table = session.OpenTable(TableName, grbit);

            return(new BoardReferenceTable(table.Session, table));
        }
示例#29
0
        private ReferencesTable OpenReferencesTable(IEsentSession session, OpenTableGrbit grbit)
        {
            var r = session.OpenTable(ReferencesTableName, grbit);

            return(new ReferencesTable(r.Session, r.Table));
        }
示例#30
0
        private BlobsTable OpenBlobsTable(IEsentSession session, OpenTableGrbit grbit)
        {
            var r = session.OpenTable(BlobsTableName, grbit);

            return(new BlobsTable(r.Session, r.Table));
        }
示例#31
0
 private void InitializeReferencesTable(IEsentSession session, JET_TABLEID tableid)
 {
     ReferencesTable.CreateColumnsAndIndexes(session.Session, tableid);
 }