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) -> get_feed_items(N) ->
xmerl_xpath:string("//channel/item", N). xmerl_xpath:string("//item", N).
% пока не проверена (не на чем, а функцию поэлементоно разбирающую список есть ощущение, что я буду писать в одном из следующих пунктов) % пока не проверена (не на чем, а функцию поэлементоно разбирающую список есть ощущение, что я буду писать в одном из следующих пунктов)
get_item_time(Item) -> get_item_time(Item) ->
[M] = Item, [#xmlText{value=Text}] = xmerl_xpath:string("pubDate/text()", M), PubDateXPath = "//pubDate",
{{Year,Month,Date},{Hour,Min,Sec}} = httpd_util:convert_request_date(Text), [PubDateNode | _] = xmerl_xpath:string(PubDateXPath, Item),
calendar:datetime_to_gregorian_seconds({{Year,Month,Date},{Hour,Min,Sec}}). [PubDate | _] = PubDateNode#xmlElement.content,
DateTime = httpd_util:convert_request_date(PubDate#xmlText.value), % bad_time if wrong
calendar:datetime_to_gregorian_seconds(DateTime).
% @private % @private
% @doc Эта вспомогательная функция просматривает заданный XML элемент % @doc Эта вспомогательная функция просматривает заданный XML элемент
@ -41,11 +43,35 @@ extract_xml(Comment = #xmlComment{}) ->
extract_xml(Other) -> extract_xml(Other) ->
Other. Other.
compare_feed_items(OldItem, NewItem) -> compare_feed_items(OldItemRow, NewItemRow) ->
[A] = OldItem, [B] = NewItem, OldItem = extract_xml(OldItemRow),
G1 = xmerl_xs:select("guid", A), G2 = xmerl_xs:select("guid", B), NewItem = extract_xml(NewItemRow),
T1 = xmerl_xs:select("title", A), T2 = xmerl_xs:select("title", B),
L1 = xmerl_xs:select("link", A), L2 = xmerl_xs:select("link", B), case OldItem =:= NewItem of
((G1 /= []) andalso (G2 /= []) andalso (G1 == G2)) orelse true -> same;
((T1 /= []) andalso (T2 /= []) andalso (T1 == T2)) orelse _ ->
((L1 /= []) andalso (L2 /= []) andalso (L1 == L2)). 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) server(Queue)
end. end.
%% @doc Поиск в листе элемента
search_item(RSSItem, []) ->
{different, RSSItem};
%% @doc Поиск элемента %% @doc Поиск элемента
search_item(RSSItem, Queue) -> search_item(RSSItem, Queue) ->
[Head | Tail] = Queue, [Head | Tail] = Queue,
@ -64,6 +68,7 @@ get_all(QPid) when is_pid(QPid) ->
QPid ! {get_all, self()}, QPid ! {get_all, self()},
receive receive
{QPid, List} -> {QPid, List} ->
io:format("length ~p~n",[length(List)]),
List List
after 1000 -> after 1000 ->
{error, timeout} {error, timeout}
@ -75,6 +80,25 @@ test() ->
{XML, _} = xmerl_scan:file("digg-science-rss2.xml"), {XML, _} = xmerl_scan:file("digg-science-rss2.xml"),
{XMLOTHER, _} = xmerl_scan:file("digg-science-rss1.xml"), {XMLOTHER, _} = xmerl_scan:file("digg-science-rss1.xml"),
add_feed(PID, XML), add_feed(PID, XML),
get_all(PID),
add_feed(PID, XMLOTHER), add_feed(PID, XMLOTHER),
get_all(PID),
add_feed(PID, XML), add_feed(PID, XML),
get_all(PID). 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 новости, более подробно можно отследить операции, логируя каждое изменение списка (функции добавления фида, поиска и добавления итемов)