Browse Source

more compact containers

Namdak Tonpa 9 years ago
parent
commit
c61c18371d
5 changed files with 24 additions and 19 deletions
  1. 1 1
      include/group.hrl
  2. 2 3
      include/kvs.hrl
  3. 1 1
      include/product.hrl
  4. 2 2
      include/user.hrl
  5. 18 12
      src/kvs.erl

+ 1 - 1
include/group.hrl

@@ -3,7 +3,7 @@
 
 -include("kvs.hrl").
 
--record(group,{?ITERATOR(feed, true),
+-record(group,{?ITERATOR(feed),
         name,
         description,
         scope :: public | private,

+ 2 - 3
include/kvs.hrl

@@ -1,9 +1,8 @@
 -ifndef(KVS_HRL).
 -define(KVS_HRL, true).
 
--define(CONTAINER, id, top, count=0).
--define(ITERATOR(Container, Guard), id, version, container=Container, feed_id, prev, next, feeds=[], guard=Guard, etc).
--define(ITERATOR(Container), ?ITERATOR(Container, false)).
+-define(CONTAINER, id=[], top=[], count=0).
+-define(ITERATOR(Container), id=[], container=Container, feed_id=[], prev=[], next=[], feeds=[]).
 
 -record(id_seq,    {thing, id}).
 -record(container, {?CONTAINER}).

+ 1 - 1
include/product.hrl

@@ -3,7 +3,7 @@
 
 -include("kvs.hrl").
 
--record(product, {?ITERATOR(feed, true),
+-record(product, {?ITERATOR(feed),
         ext_id                 :: term(),    % ext
         vendor_id              :: integer(), % auto
         categories             :: list(integer()), % admin

+ 2 - 2
include/user.hrl

@@ -7,7 +7,7 @@
 -define(USER_EXT, email).
 -endif.
 
--record(user, {?ITERATOR(feed, true), ?USER_EXT,
+-record(user, {?ITERATOR(feed), ?USER_EXT,
         username,
         password,
         display_name,
@@ -23,7 +23,7 @@
         zone,
         type }).
 
--record(user2, {?ITERATOR(feed, true), % version 2
+-record(user2, {?ITERATOR(feed), % version 2
         everyting_getting_small,
         email,
         username,

+ 18 - 12
src/kvs.erl

@@ -1,7 +1,7 @@
 -module(kvs).
 -copyright('Synrc Research Center s.r.o.').
 -compile(export_all).
--include_lib("stdlib/include/qlc.hrl").
+%-include_lib("stdlib/include/qlc.hrl").
 -include("config.hrl").
 -include("metainfo.hrl").
 -include("kvs.hrl").
@@ -82,7 +82,7 @@ create(ContainerName, Id, Driver) ->
     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),
+    Top2 = setelement(#container.top,Top,[]),
     Top3 = setelement(#container.count,Top2,0),
     ok = kvs:put(Top3, Driver),
     Id.
@@ -93,12 +93,13 @@ ensure_link(Record, #kvs{mod=_Store}=Driver) ->
     Type  = rname(element(1,Record)),
     CName = element(#iterator.container, Record),
     Cid   = case element(#iterator.feed_id, Record) of
+                      [] -> rname(element(1,Record));
                undefined -> rname(element(1,Record));
                      Fid -> Fid end,
 
     Container = case kvs:get(CName, Cid, Driver) of
         {ok,Res} -> Res;
-        {error, _} when Cid /= undefined ->
+        {error, _} when Cid /= undefined andalso Cid /= [] ->
                 NC = setelement(#container.id,
                       list_to_tuple([CName|
                             proplists:get_value(CName, kvs:containers())]), Cid),
@@ -111,13 +112,17 @@ ensure_link(Record, #kvs{mod=_Store}=Driver) ->
         _ when element(#container.top,Container) == Id -> {error,just_added};
                   _ ->
                        Top = case element(#container.top, Container) of
-                                   undefined -> undefined;
+                             undefined -> [];
+                                    [] -> [];
                                    Tid -> case kvs:get(Type, Tid, Driver) of
-                                               {error, _} -> undefined;
+                                               {error, _} -> [];
                                                {ok, T}  -> setelement(#iterator.next, T, Id) end end,
 
-                       Prev = case Top of undefined -> undefined; E -> element(#iterator.id, E) end,
-                       Next = undefined,
+                       Prev = case Top of undefined -> [];
+                                          [] -> [];
+                                          E -> element(#iterator.id, E) end,
+
+                       Next = [],
 
                        C1 = setelement(#container.top, Container, Id),
                        C2 = setelement(#container.count, C1,
@@ -134,11 +139,11 @@ ensure_link(Record, #kvs{mod=_Store}=Driver) ->
                        R3 = setelement(#iterator.feed_id, R2, element(#container.id, Container)),
 
                        case {kvs:put(R3, Driver),Top} of            % Iterator
-                            {ok,undefined} -> kvs:put(C2, Driver);  % Container
-                            {ok,Top}       -> kvs:put(C2, Driver),
-                                              kvs:put(Top, Driver);
-                                        __ -> kvs:error(?MODULE,"Error Updating Iterator: ~p~n",
-                                                                [element(#container.id,R3)]) end,
+                            {ok,[]}   -> kvs:put(C2, Driver);  % Container
+                            {ok,Top}  -> kvs:put(C2, Driver),
+                                         kvs:put(Top, Driver);
+                                   __ -> kvs:error(?MODULE,"Error Updating Iterator: ~p~n",
+                                                     [element(#container.id,R3)]) end,
 
                        kvs:info(?MODULE,"Put: ~p~n", [element(#container.id,R3)]),
 
@@ -341,6 +346,7 @@ store(Table,X) -> application:set_env(kvs,Table,X), X.
 rname(Table)   -> list_to_atom(lists:filter(fun(X) -> not lists:member(X,"1234567890") end, atom_to_list(Table))).
 nname(Table)   -> list_to_integer(case lists:filter(fun(X) -> lists:member(X,"1234567890") end, atom_to_list(Table)) of [] -> "1"; E -> E end).
 fold(N)        -> kvs:fold(fun(X,A)->[X|A]end,[],process,N,-1,#iterator.next,#kvs{mod=store_mnesia}).
+top(i)         -> id_seq(conv);
 top(Table)     -> id_seq(Table).
 name(T)        -> list_to_atom(lists:concat([T,omitone(kvs:next_id(lists:concat([T,".tables"]),1))])).
 init(T)        -> store_mnesia:create_table(T#table.name, [{attributes,T#table.fields},{T#table.copy_type, [node()]}]),