Browse Source

add entries_count. guard entry addition

Andrii Zadorozhnii 11 years ago
parent
commit
b13bb5d25a
2 changed files with 21 additions and 27 deletions
  1. 2 1
      include/feeds.hrl
  2. 19 26
      src/kvs_feed.erl

+ 2 - 1
include/feeds.hrl

@@ -1,7 +1,8 @@
 -record(feed, {
         id,
         top,
-        aclver}).
+        aclver,
+        entries_count=0}).
 
 -record(iterator, {
         id,

+ 19 - 26
src/kvs_feed.erl

@@ -18,35 +18,28 @@ create() ->
     FId.
 
 add_entry(E=#entry{}) ->
-  case kvs:get(feed, E#entry.feed_id) of
-    {error, not_found} -> error_logger:info_msg("Add entry failed, no feed ~p", [E#entry.feed_id]);
-    {ok, Feed} ->
-      Next = undefined,
-      Prev = case Feed#feed.top of undefined -> undefined;
-        X -> case kvs:get(entry, X) of {error,_} -> undefined;
-          {ok, Top} -> Edited = Top#entry{next=E#entry.id}, kvs:put(Edited), Top#entry.id end end,
-      kvs:put(#feed{id=E#entry.feed_id, top=E#entry.id}),
-
-      Entry  = E#entry{next = Next, prev = Prev},
-      kvs:put(Entry),
-      error_logger:info_msg("PUT entry: ~p", [Entry#entry.id]),
-      {ok, Entry}
-  end.
+  case kvs:get(entry, E#entry.id) of {ok, _} -> error_logger:info_msg("Add entry ~p failed. Already exist!", [E#entry.id]);
+    {error, not_found}-> case kvs:get(feed, E#entry.feed_id) of
+      {error, not_found} -> error_logger:info_msg("Add entry failed, no feed ~p", [E#entry.feed_id]);
+      {ok, Feed} ->
+        Next = undefined,
+        Prev = case Feed#feed.top of undefined -> undefined;
+          X -> case kvs:get(entry, X) of {error,_} -> undefined;
+            {ok, Top} -> Edited = Top#entry{next=E#entry.id}, kvs:put(Edited), Top#entry.id end end,
+
+        kvs:put(#feed{id=E#entry.feed_id, top=E#entry.id, entries_count=Feed#feed.entries_count+1}),
+
+        Entry  = E#entry{next = Next, prev = Prev},
+        kvs:put(Entry),
+        error_logger:info_msg("PUT entry: ~p", [Entry#entry.id]),
+        {ok, Entry} end end.
 
 entry_traversal(undefined, _) -> [];
 entry_traversal(_, 0) -> [];
 entry_traversal(Next, Count)->
-    case kvs:get(entry, Next) of
-        {error, _} -> [];
-        {ok, R} ->
-            Prev = element(#entry.prev, R),
-            Count1 = case Count of 
-                C when is_integer(C) -> case R#entry.type of
-                    {_, system} -> C; % temporal entries are entries too, but they shouldn't be counted
-                    {_, system_note} -> C;
-                    _ -> C - 1 end;
-                _-> Count end,
-            [R | entry_traversal(Prev, Count1)] end.
+  case kvs:get(entry, Next) of {error, _} -> [];
+    {ok, R} -> error_logger:info_msg("Prev -> ~p", [R#entry.prev]),
+      [R | entry_traversal(R#entry.prev, Count-1)] end.
 
 entries({_, FeedId}, undefined, PageAmount) ->
     case kvs:get(feed, FeedId) of
@@ -115,7 +108,7 @@ remove_entry(FeedId, EId) ->
         {ok, #entry{prev = Prev, next = Next}}->
             case kvs:get(entry, Next) of {ok, NE} -> kvs:put(NE#entry{prev = Prev});  _ -> ok end,
             case kvs:get(entry, Prev) of {ok, PE} -> kvs:put(PE#entry{next = Next});  _ -> ok end,
-            case TopId of {EId, FeedId} -> kvs:put(Feed#feed{top = Prev}); _ -> ok end;
+            case TopId of {EId, FeedId} -> kvs:put(Feed#feed{top = Prev, entries_count=Feed#feed.entries_count-1}); _ -> ok end;
         {error, _} -> error_logger:info_msg("Not found"), ok
     end,
     kvs:delete(entry, {EId, FeedId}).