l4 checked

This commit is contained in:
Ivan I. Ovchinnikov 2023-04-11 19:09:03 +03:00
parent a44039a554
commit bac73b1a85
2 changed files with 62 additions and 12 deletions

View File

@ -13,13 +13,15 @@ is_rss2_feed(Name)->
% Возвращает список элементов
get_feed_items(N) ->
xmerl_xpath:string("//channel/item", N).
xmerl_xpath:string("//item", N).
% пока не проверена (не на чем, а функцию поэлементоно разбирающую список есть ощущение, что я буду писать в одном из следующих пунктов)
get_item_time(Item) ->
[M] = Item, [#xmlText{value=Text}] = xmerl_xpath:string("pubDate/text()", M),
{{Year,Month,Date},{Hour,Min,Sec}} = httpd_util:convert_request_date(Text),
calendar:datetime_to_gregorian_seconds({{Year,Month,Date},{Hour,Min,Sec}}).
PubDateXPath = "//pubDate",
[PubDateNode | _] = xmerl_xpath:string(PubDateXPath, Item),
[PubDate | _] = PubDateNode#xmlElement.content,
DateTime = httpd_util:convert_request_date(PubDate#xmlText.value), % bad_time if wrong
calendar:datetime_to_gregorian_seconds(DateTime).
% @private
% @doc Эта вспомогательная функция просматривает заданный XML элемент
@ -41,11 +43,35 @@ extract_xml(Comment = #xmlComment{}) ->
extract_xml(Other) ->
Other.
compare_feed_items(OldItem, NewItem) ->
[A] = OldItem, [B] = NewItem,
G1 = xmerl_xs:select("guid", A), G2 = xmerl_xs:select("guid", B),
T1 = xmerl_xs:select("title", A), T2 = xmerl_xs:select("title", B),
L1 = xmerl_xs:select("link", A), L2 = xmerl_xs:select("link", B),
((G1 /= []) andalso (G2 /= []) andalso (G1 == G2)) orelse
((T1 /= []) andalso (T2 /= []) andalso (T1 == T2)) orelse
((L1 /= []) andalso (L2 /= []) andalso (L1 == L2)).
compare_feed_items(OldItemRow, NewItemRow) ->
OldItem = extract_xml(OldItemRow),
NewItem = extract_xml(NewItemRow),
case OldItem =:= NewItem of
true -> same;
_ ->
Handler = fun(E, Acc) ->
Acc or is_updated(OldItem, NewItem, E)
end,
Acc = false,
ListXPathAttrs = ["//guid", "//title", "//link"],
case lists:foldl(Handler, Acc, ListXPathAttrs) of
true -> updated;
_ -> different
end
end.
is_updated(OldItem, NewItem, XPathAttr) ->
OldAttrValue = xmerl_xpath:string(XPathAttr, OldItem),
case OldAttrValue of
[] -> false;
_ -> NewAttrValue = xmerl_xpath:string(XPathAttr, NewItem),
case NewAttrValue of
[] -> false ;
_ ->
[OldGUID] = OldAttrValue,
[NewGUID] = NewAttrValue,
OldGUID == NewGUID
end
end.

View File

@ -35,6 +35,10 @@ server(Queue) -> % 2.1 Пока состояние очереди должно
server(Queue)
end.
%% @doc Поиск в листе элемента
search_item(RSSItem, []) ->
{different, RSSItem};
%% @doc Поиск элемента
search_item(RSSItem, Queue) ->
[Head | Tail] = Queue,
@ -64,6 +68,7 @@ get_all(QPid) when is_pid(QPid) ->
QPid ! {get_all, self()},
receive
{QPid, List} ->
io:format("length ~p~n",[length(List)]),
List
after 1000 ->
{error, timeout}
@ -75,6 +80,25 @@ test() ->
{XML, _} = xmerl_scan:file("digg-science-rss2.xml"),
{XMLOTHER, _} = xmerl_scan:file("digg-science-rss1.xml"),
add_feed(PID, XML),
get_all(PID),
add_feed(PID, XMLOTHER),
get_all(PID),
add_feed(PID, XML),
get_all(PID).
%% 12> rss_queue:test().
%% =ERROR REPORT==== 11-Apr-2023::18:53:55.974721 ===
%% Error in process <0.125.0> with exit value:
%% {{badmatch,[]},
%% [{rss_queue,search_item,2,[{file,"rss_queue.erl"},{line,40}]},
%% {rss_queue,push_item,2,[{file,"rss_queue.erl"},{line,16}]},
%% {rss_queue,server,1,[{file,"rss_queue.erl"},{line,31}]}]}
%% дополнительно потребовало написания функции поиска для принимаемого пустого списка с явным возвратом атома дифф
%% 11> rss_queue:test().
%% length 40
%% length 43
%% length 43
%% очевидно, что в результате добавления второго файла добавилось 3 новости, более подробно можно отследить операции, логируя каждое изменение списка (функции добавления фида, поиска и добавления итемов)