Exemplo n.º 1
0
        /// <summary>
        /// Получить все ссылки на доски.
        /// </summary>
        /// <param name="query">Запрос.</param>
        /// <returns>Ссылки на доски.</returns>
        protected virtual async Task <IList <ILink> > DoGetBoardLinks(BoardReferenceStoreQuery query)
        {
            CheckModuleReady();
            await WaitForTablesInitialize();

            return(await OpenSession(session =>
            {
                using (new Transaction(session.Session))
                {
                    using (var table = OpenTable(session, OpenTableGrbit.ReadOnly))
                    {
                        var idSet = new HashSet <string>(StringComparer.OrdinalIgnoreCase);
                        if (SelectIndex(table, query))
                        {
                            do
                            {
                                idSet.Add(table.Columns.Id);
                            } while (table.TryMoveNext());
                        }
                        IList <ILink> result = idSet.Select(CreateBoardLink).ToList();
                        return result;
                    }
                }
            }));
        }
Exemplo n.º 2
0
        /// <summary>
        /// Получить количество досок.
        /// </summary>
        /// <param name="query">Запрос.</param>
        /// <returns>Количество досок.</returns>
        protected virtual async Task <int> DoGetCount(BoardReferenceStoreQuery query)
        {
            CheckModuleReady();
            await WaitForTablesInitialize();

            return(await OpenSession(session =>
            {
                var sid = session.Session;
                using (var table = OpenTable(session, OpenTableGrbit.ReadOnly))
                {
                    if (!SelectIndex(table, query))
                    {
                        return 0;
                    }
                    int count;
                    Api.JetIndexRecordCount(sid, table, out count, int.MaxValue);
                    return count;
                }
            }));
        }
Exemplo n.º 3
0
 /// <summary>
 /// Выбрать индекс и включить фильтр в зависимости от запроса.
 /// </summary>
 /// <param name="table">Таблица.</param>
 /// <param name="query">Запрос.</param>
 /// <returns>Результат позиционирования на первой записи индекса.</returns>
 protected virtual bool SelectIndex(BoardReferenceTable table, BoardReferenceStoreQuery query)
 {
     if (query.Category == null && query.IsAdult == null)
     {
         Api.JetSetTableSequential(table.Session, table, SetTableSequentialGrbit.None);
         return(table.TryMoveFirst());
     }
     if (query.Category == null)
     {
         table.Indexes.IsAdultIndex.SetAsCurrentIndex();
         table.Indexes.IsAdultIndex.SetKey(table.Indexes.IsAdultIndex.CreateKey(query.IsAdult.Value));
         return(Api.TrySeek(table.Session, table, SeekGrbit.SeekEQ | SeekGrbit.SetIndexRange));
     }
     if (query.IsAdult == null)
     {
         table.Indexes.CategoryIndex.SetAsCurrentIndex();
         table.Indexes.CategoryIndex.SetKey(table.Indexes.CategoryIndex.CreateKey(query.Category));
         return(Api.TrySeek(table.Session, table.Table, SeekGrbit.SeekEQ | SeekGrbit.SetIndexRange));
     }
     table.Indexes.IsAdultAndCategoryIndex.SetAsCurrentIndex();
     table.Indexes.IsAdultAndCategoryIndex.SetKey(table.Indexes.IsAdultAndCategoryIndex.CreateKey(query.IsAdult.Value, query.Category));
     return(Api.TrySeek(table.Session, table.Table, SeekGrbit.SeekEQ | SeekGrbit.SetIndexRange));
 }
Exemplo n.º 4
0
        /// <summary>
        /// Загрузить ссылки.
        /// </summary>
        /// <param name="start">Начало.</param>
        /// <param name="count">Количество.</param>
        /// <param name="query">Запрос.</param>
        /// <returns>Ссылки.</returns>
        protected virtual async Task <IList <IBoardShortInfo> > DoLoadShortReferences(int start, int count, BoardReferenceStoreQuery query)
        {
            CheckModuleReady();
            if (count < 1)
            {
                IList <IBoardShortInfo> result = new List <IBoardShortInfo>();
                return(result);
            }
            await WaitForTablesInitialize();

            return(await OpenSession(session =>
            {
                var sid = session.Session;
                using (new Transaction(sid))
                {
                    using (var table = OpenTable(session, OpenTableGrbit.ReadOnly))
                    {
                        IList <IBoardShortInfo> result = new List <IBoardShortInfo>();
                        bool isMoved = SelectIndex(table, query);
                        if (isMoved)
                        {
                            if (start > 0)
                            {
                                isMoved = Api.TryMove(table.Session, table, (JET_Move)start, MoveGrbit.None);
                            }
                        }
                        if (isMoved)
                        {
                            int cnt = count;
                            do
                            {
                                cnt--;
                                result.Add(ReadShortInfo(table));
                            } while (table.TryMoveNext() && cnt > 0);
                        }
                        return result;
                    }
                }
            }));
        }
Exemplo n.º 5
0
 /// <summary>
 /// Загрузить ссылки.
 /// </summary>
 /// <param name="start">Начало.</param>
 /// <param name="count">Количество.</param>
 /// <param name="query">Запрос.</param>
 /// <returns>Ссылки.</returns>
 public IAsyncOperation <IList <IBoardShortInfo> > LoadShortReferences(int start, int count, BoardReferenceStoreQuery query)
 {
     return(DoLoadShortReferences(start, count, query).AsAsyncOperation());
 }
Exemplo n.º 6
0
 /// <summary>
 /// Получить все ссылки на доски.
 /// </summary>
 /// <param name="query">Запрос.</param>
 /// <returns>Ссылки на доски.</returns>
 public IAsyncOperation <IList <ILink> > GetBoardLinks(BoardReferenceStoreQuery query)
 {
     return(DoGetBoardLinks(query).AsAsyncOperation());
 }
Exemplo n.º 7
0
 /// <summary>
 /// Получить количество досок.
 /// </summary>
 /// <param name="query">Запрос.</param>
 /// <returns>Количество досок.</returns>
 public IAsyncOperation <int> GetCount(BoardReferenceStoreQuery query)
 {
     return(DoGetCount(query).AsAsyncOperation());
 }