Maxim Sokhatsky 10 лет назад
Родитель
Сommit
120d722bff
4 измененных файлов с 28 добавлено и 2 удалено
  1. 1 0
      include/kvs.hrl
  2. 8 0
      include/user.hrl
  3. 18 2
      src/kvs.erl
  4. 1 0
      src/kvs_user.erl

+ 1 - 0
include/kvs.hrl

@@ -8,5 +8,6 @@
 -record(id_seq, {thing, id}).
 -record(container, {?CONTAINER}).
 -record(iterator,  {?ITERATOR(undefined)}).
+-record(interval, {left,right,name}).
 
 -endif.

+ 8 - 0
include/user.hrl

@@ -16,3 +16,11 @@
         status,
         zone,
         type }).
+
+-record(user2, {?ITERATOR(feed, true), % version 2
+        everyting_getting_small,
+        email,
+        username,
+        password,
+        zone,
+        type }).

+ 18 - 2
src/kvs.erl

@@ -60,7 +60,7 @@ add(Record) when is_tuple(Record) ->
     case kvs:get(element(1,Record), Id) of
         {error, not_found} ->
 
-            Type = element(1, Record),
+            Type = table_type(element(1,Record)),
             CName = element(#iterator.container, Record),
             Cid = case element(#iterator.feed_id, Record) of
                 undefined -> element(1,Record);
@@ -214,9 +214,25 @@ put(Record) ->
     DBA=?DBA,
     DBA:put(Record).
 
+table_type(user2) -> user;
+table_type(A) -> A.
+
+range(RecordName,Id) -> Ranges = kvs:config(RecordName), find(Ranges,RecordName,Id).
+
+find([],_,Id) -> [];
+find([Range|T],RecordName,Id) -> 
+     case lookup(Range,Id) of
+          [] -> find(T,RecordName,Id);
+          Name -> Name end.
+
+lookup(#interval{left=Left,right=Right,name=Name},Id) when Id =< Right, Id >= Left -> Name;
+lookup(#interval{},Id) -> [].
+
 get(RecordName, Key) ->
     DBA=?DBA,
-    DBA:get(RecordName, Key).
+    case range(RecordName,Key) of
+         [] -> DBA:get(RecordName, Key);
+         Name ->  DBA:get(Name, Key) end.
 
 get(RecordName, Key, Default) ->
     DBA=?DBA,

+ 1 - 0
src/kvs_user.erl

@@ -8,6 +8,7 @@
 
 metainfo() -> 
     #schema{name=kvs,tables=[
+        #table{name=user2,container=feed,fields=record_info(fields,user2)},
         #table{name=user,container=feed,fields=record_info(fields,user),
                  keys=[facebook_id,googleplus_id,twitter_id,github_id]}
     ]}.