Namdak Tonpa 10 years ago
parent
commit
fefc2d77ea
2 changed files with 60 additions and 59 deletions
  1. 59 58
      src/kvs.erl
  2. 1 1
      src/store_mnesia.erl

+ 59 - 58
src/kvs.erl

@@ -48,7 +48,7 @@ containers() ->
 create(ContainerName) -> create(ContainerName, kvs:next_id(atom_to_list(ContainerName), 1)).
 
 create(ContainerName, Id) ->
-    wf:info("kvs:create: ~p",[ContainerName]),
+    kvs:info(?MODULE,"Create: ~p",[ContainerName]),
     Instance = list_to_tuple([ContainerName|proplists:get_value(ContainerName, kvs:containers())]),
     Top = setelement(#container.id,Instance,Id),
     Top2 = setelement(#container.top,Top,undefined),
@@ -56,72 +56,73 @@ create(ContainerName, Id) ->
     ok = kvs:put(Top3),
     Id.
 
-add(Record) when is_tuple(Record) ->
-
-    Id = element(#iterator.id, Record),
-
-    kvs:get(element(1,Record), Id),
-
-    case kvs:get(element(1,Record), Id) of
-        {error, not_found} ->
-
-            Type = table_type(element(1,Record)),
-            CName = element(#iterator.container, Record),
-            Cid = table_type(case element(#iterator.feed_id, Record) of
-                undefined -> element(1,Record);
-                Fid -> Fid end),
-
-            Container = case kvs:get(CName, Cid) of
-                {ok,C} -> C;
-                {error, not_found} when Cid /= undefined ->
-
-                    NC = setelement(#container.id,
-                            list_to_tuple([CName|proplists:get_value(CName, kvs:containers())]), Cid),
-                    NC1 = setelement(#container.entries_count, NC, 0),
-
-                    kvs:put(NC1),
-                    NC1;
-
-                _ -> error end,
-
-            if  Container == error -> {error, no_container};
-                true ->
-
-                    Next = undefined,
-                    Prev = case element(#container.top, Container) of
-                        undefined -> undefined;
-                        Tid ->
-                            case kvs:get(Type, Tid) of
-                            {error, not_found} -> undefined;
-                            {ok, Top} ->
-                                NewTop = setelement(#iterator.next, Top, Id),
-                                kvs:put(NewTop),
-                                element(#iterator.id, NewTop) end end,
-
-                    C1 = setelement(#container.top, Container, Id),
-                    C2 = setelement(#container.entries_count, C1,
-                            element(#container.entries_count, Container)+1),
-
-                    kvs:put(C2),
-
-                    R  = setelement(#iterator.feeds, Record,
+ensure_link(Record) ->
+
+    Id    = element(2,Record),
+    Type  = table_type(element(1,Record)),
+    CName = element(#iterator.container, Record),
+    Cid   = table_type(case element(#iterator.feed_id, Record) of
+               undefined -> element(1,Record);
+                     Fid -> Fid end),
+
+    Container = case kvs:get(CName, Cid) of
+        {ok,C} -> C;
+        {error, not_found} when Cid /= undefined ->
+                NC = setelement(#container.id,
+                      list_to_tuple([CName|
+                            proplists:get_value(CName, kvs:containers())]), Cid),
+                NC1 = setelement(#container.entries_count, NC, 0),
+                kvs:put(NC1),
+                NC1;
+        _ -> error end,
+
+    case Container of
+              error -> {error, no_container};
+                  _ -> Next = undefined,
+                       Prev = case element(#container.top, Container) of
+                                   undefined -> undefined;
+                                   Tid -> case kvs:get(Type, Tid) of
+                                              {error, not_found} -> undefined;
+                                                       {ok, Top} ->
+                                        NewTop = setelement(#iterator.next, Top, Id),
+                                        kvs:put(NewTop),
+                                        element(#iterator.id, NewTop) end end,
+
+                       C1 = setelement(#container.top, Container, Id),
+                       C2 = setelement(#container.entries_count, C1,
+                                element(#container.entries_count, Container)+1),
+
+                       kvs:put(C2), % Container
+
+                       R  = setelement(#iterator.feeds, Record,
                             [ case F1 of
                                 {FN, Fd} -> {FN, Fd};
                                 _-> {F1, kvs:create(CName,{F1,element(#iterator.id,Record)})}
                               end || F1 <- element(#iterator.feeds, Record)]),
 
-                    R1 = setelement(#iterator.next,    R,  Next),
-                    R2 = setelement(#iterator.prev,    R1, Prev),
-                    R3 = setelement(#iterator.feed_id, R2, element(#container.id, Container)),
+                       R1 = setelement(#iterator.next,    R,  Next),
+                       R2 = setelement(#iterator.prev,    R1, Prev),
+                       R3 = setelement(#iterator.feed_id, R2, element(#container.id, Container)),
 
-                    kvs:put(R3),
+                       kvs:put(R3), % Iterator
 
-                    kvs:info(?MODULE,"[kvs] put: ~p~n", [element(#container.id,R3)]),
+                       kvs:info(?MODULE,"Put: ~p~n", [element(#container.id,R3)]),
 
                     {ok, R3}
-            end;
-        {aborted, Reason} -> kvs:info(?MODULE,"[kvs] aborted: ~p~n", [Reason]), {aborted, Reason};
-        {ok, _} -> kvs:info(?MODULE,"[kvs] entry exist while put: ~p~n", [Id]), {error, exist} end.
+            end.
+
+link(Record) ->
+    Id = element(#iterator.id, Record),
+    case kvs:get(element(1,Record), Id) of
+              {ok, Exists} -> ensure_link(Exists);
+        {error, not_found} -> {error, not_found} end.
+
+add(Record) when is_tuple(Record) ->
+    Id = element(#iterator.id, Record),
+    case kvs:get(element(1,Record), Id) of
+        {error, not_found} -> ensure_link(Record);
+         {aborted, Reason} -> {aborted, Reason};
+                   {ok, _} -> {error, exist} end.
 
 remove(RecordName, RecordId) ->
     case kvs:get(RecordName, RecordId) of

+ 1 - 1
src/store_mnesia.erl

@@ -7,7 +7,7 @@
 
 start()    -> mnesia:start().
 stop()     -> mnesia:stop().
-destroy()  -> [mnesia:delete_table(list_to_atom(T))||{_,T}<-kvs:dir()], mnesia:delete_schema([node()]), ok.
+destroy()  -> [mnesia:delete_table(T)||{_,T}<-kvs:dir()], mnesia:delete_schema([node()]), ok.
 version()  -> {version,"KVS MNESIA"}.
 dir()      -> [{table,T}||T<-mnesia:system_info(local_tables)].
 join()     -> mnesia:change_table_copy_type(schema, node(), disc_copies), initialize().