/// <summary>
        /// Загрузить ссылку на доску.
        /// </summary>
        /// <param name="link">Ссылка.</param>
        /// <returns>Ссылка на доску.</returns>
        protected virtual async Task <IBoardReference> DoLoadReference(ILink link)
        {
            CheckModuleReady();
            if (link == null)
            {
                const IBoardReference result = null;
                return(result);
            }
            await WaitForTablesInitialize();

            return(await OpenSession(session =>
            {
                var sid = session.Session;
                using (new Transaction(sid))
                {
                    using (var table = OpenTable(session, OpenTableGrbit.ReadOnly))
                    {
                        var id = GetId(link);
                        IBoardReference result = null;
                        if (table.Indexes.PrimaryIndex.Find(table.Indexes.PrimaryIndex.CreateKey(id)))
                        {
                            result = ReadFullRow(table);
                        }
                        return result;
                    }
                }
            }));
        }
Beispiel #2
0
 /// <summary>
 /// Привести к контракту.
 /// </summary>
 /// <param name="reference">Ссылка на доску.</param>
 /// <param name="serializationService">Сервис сериализации ссылок.</param>
 /// <returns>Контракт расширенных данных.</returns>
 public static BoardExtendedInfo ToContract(IBoardReference reference, ILinkSerializationService serializationService)
 {
     if (serializationService == null)
     {
         throw new ArgumentNullException(nameof(serializationService));
     }
     if (reference == null)
     {
         return(null);
     }
     return(new BoardExtendedInfo()
     {
         LikesEnabled = reference.LikesEnabled,
         SageEnabled = reference.SageEnabled,
         ThreadTagsEnabled = reference.ThreadTagsEnabled,
         TripCodesEnabled = reference.TripCodesEnabled,
         Icons = reference.Icons?.Select(i => new BoardIconContract()
         {
             Id = i?.Id,
             Name = i?.Name,
             MediaLink = i?.MediaLink != null ? serializationService.Serialize(i.MediaLink) : null,
         })?.ToList(),
         PostingCapabilities = reference.PostingCapabilities?.Select(BoardPostingCapability.ToContract)?.ToList()
     });
 }
 /// <summary>
 /// Обновить ссылку.
 /// </summary>
 /// <param name="reference">Ссылка.</param>
 protected virtual async Task DoUpdateReference(IBoardReference reference)
 {
     if (reference == null)
     {
         throw new ArgumentNullException(nameof(reference));
     }
     CheckModuleReady();
     await WaitForTablesInitialize();
     await OpenSessionAsync(async session =>
     {
         await session.RunInTransaction(() =>
         {
             using (var table = OpenTable(session, OpenTableGrbit.None))
             {
                 DoUpdateOneRow(table, reference, false);
             }
             return(true);
         }, 1.5);
         return(Nothing.Value);
     });
 }
 /// <summary>
 /// Обновить одну строку.
 /// </summary>
 /// <param name="table">Таблица.</param>
 /// <param name="reference">Ссылка.</param>
 /// <param name="alwaysInsert">Всегда вставлять (после очистки таблицы).</param>
 protected virtual void DoUpdateOneRow(BoardReferenceTable table, IBoardReference reference, bool alwaysInsert)
 {
     if (reference == null)
     {
         throw new ArgumentNullException(nameof(reference));
     }
     if (!alwaysInsert)
     {
         var id = GetId(reference);
         if (table.Indexes.PrimaryIndex.Find(table.Indexes.PrimaryIndex.CreateKey(id)))
         {
             UpdateFullRowInfo(table, reference, JET_prep.Replace);
         }
         else
         {
             UpdateFullRowInfo(table, reference, JET_prep.Insert);
         }
     }
     else
     {
         UpdateFullRowInfo(table, reference, JET_prep.Insert);
     }
 }
        /// <summary>
        /// Обновить данные в текущей строке таблицы.
        /// </summary>
        /// <param name="table">Таблица.</param>
        /// <param name="reference">Ссылка на доску.</param>
        /// <param name="prep">Тип обновления.</param>
        protected virtual void UpdateFullRowInfo(BoardReferenceTable table, IBoardReference reference, JET_prep prep)
        {
            var row = new BoardReferenceTable.ViewValues.FullRowView()
            {
                Id           = GetId(reference),
                Category     = reference.Category ?? "",
                Pages        = reference.Pages,
                IsAdult      = reference.IsAdult,
                DefaultName  = reference.DefaultName,
                ShortName    = reference.ShortName,
                DisplayName  = reference.DisplayName,
                ExtendedData = SerializeDataContract(BoardExtendedInfo.ToContract(reference, LinkSerialization)),
                BumpLimit    = reference.BumpLimit
            };

            if (prep == JET_prep.Replace)
            {
                table.Update.UpdateAsFullRowView(ref row);
            }
            else if (prep == JET_prep.Insert)
            {
                table.Insert.InsertAsFullRowView(ref row);
            }
        }
 /// <summary>
 /// Получить идентификатор.
 /// </summary>
 /// <param name="boardReference">Ссылка.</param>
 /// <returns>Идентификатор.</returns>
 protected virtual string GetId(IBoardReference boardReference)
 {
     return(boardReference?.ShortName?.ToLowerInvariant() ?? "");
 }
 /// <summary>
 /// Обновить ссылку.
 /// </summary>
 /// <param name="reference">Ссылка.</param>
 public IAsyncAction UpdateReference(IBoardReference reference)
 {
     return(DoUpdateReference(reference).AsAsyncAction());
 }