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