diff --git a/src/template/utDBLoad.erl b/src/template/utDBLoad.erl new file mode 100644 index 0000000..d352e99 --- /dev/null +++ b/src/template/utDBLoad.erl @@ -0,0 +1,47 @@ +-module(utDBLoad). + +-export([loadData/1]). + +%%----------------------------------------------------------------- +%% load_data/1 +%% @doc 起服的时候 加载数据 +%% ``` +%% +%% ''' +%% @end +%% ----------------------------------------------------------------- +-spec loadData(non_neg_integer()) -> no_return(). +%% ----------------------------------------------------------------- +% #方式4 仅仅使用 id + ValueList = db:reads_mysql(dbTableName, [], [{key_id, desc}], [Limit]), + NextId = dealValueList(ValueList, Limit, 0, 0), + loadLeft(NextId, Limit). + +loadLeft(0, _Limit) -> + ok; +loadLeft(NextId, Limit) -> + ValueList = db:reads_mysql(dbTableName, [{key_id, "<", NextId}], [{key_id, desc}], [Limit]), + NewNextId = dealValueList(ValueList, Limit, 0, 0), + loadLeft(NewNextId, Limit). + +dealValueList([], Limit, SumCnt, NextId) -> + case SumCnt >= Limit of + true -> + NextId; + _ -> + 0 + end; +dealValueList([OneInfo | AllyList], Limit, SumCnt, _NextId) -> + NewNextId = parseData(OneInfo), + dealValueList(AllyList, Limit, SumCnt + 1, NewNextId). + +parseData(OneInfo) -> + _NewNextId = element(1, OneInfo). diff --git a/src/template/utEtsFold.erl b/src/template/utEtsFold.erl new file mode 100644 index 0000000..5db6a71 --- /dev/null +++ b/src/template/utEtsFold.erl @@ -0,0 +1,91 @@ +-module(utEtsFold). + +%% 请注意,对于表类型ordered_set和由单个 ETS 函数调用(如select/2)完成的遍历(一次调用就返回了全部结果没有Next 迭代器了),不需要 safe_fixtable/ 2 。 + +-export([rank/5, fold/2]). + +rank(TabId, PageInfo, Page, Limit, TotalCnt) -> + %% 遍历所有tab + MS = + case PageInfo == 0 orelse PageInfo of + true -> + ets:fun2ms(fun(T) -> T end); + "" -> + ets:fun2ms(fun(T) -> T end); + _ -> + try binary_to_term(list_to_binary(PageInfo)) of + KeyTerm when KeyTerm == <<"">>; KeyTerm == "" -> + ets:fun2ms(fun(T) -> T end); + KeyTerm -> + ets:fun2ms(fun({K, _V} = T) when K < KeyTerm -> T end) + catch _C:_R -> + ets:fun2ms(fun(T) -> T end) + end + end, + + case ets:select_reverse(TabId, MS, Limit) of + '$end_of_table' -> + {true, {<<"">>, []}}; + {AllyIds, '$end_of_table'} -> + {true, makeRankData(AllyIds)}; + {AllyIds, _NextKey} -> + Length = length(AllyIds), + if + Length < Limit -> + {true, makeRankData(AllyIds)}; + true -> + NewCurCnt = Page * Limit + Length, + case NewCurCnt >= TotalCnt of + true -> + {true, makeRankData(AllyIds)}; + _ -> + {false, makeRankData(AllyIds)} + end + end + end. + +makeRankData(AllyIds) -> + makeRankData(AllyIds, <<"">>, []). + +makeRankData([], LastKey, Acc) -> + case LastKey of + <<"">> -> + {LastKey, lists:reverse(Acc)}; + _ -> + {erlang:term_to_binary(LastKey), lists:reverse(Acc)} + end; +makeRankData([{CurKey, Uuid} | AllyIds], LastKey, Acc) -> + case ets:lookup(ets_pub_rank_info, Uuid) of + [OneData] -> + makeRankData(AllyIds, CurKey, [OneData | Acc]); + _ -> + makeRankData(AllyIds, LastKey, Acc) + end. + + +fold(TabId, Limit) -> + ets:safe_fixtable(TabId, true), + try + case ets:match_object(TabId, '$1', Limit) of + '$end_of_table' -> + ok; + {ValueList, NextKey} -> + matchDoFun(ValueList), + continueNext(NextKey) + end + after + ets:safe_fixtable(TabId, false) + end. + +continueNext(NextKey) -> + case ets:match_object(NextKey) of + '$end_of_table' -> + ok; + {ValueList, NewNextKey} -> + matchDoFun(ValueList), + continueNext(NewNextKey) + end. + +matchDoFun(_ValueList) -> + %% do something + ok. diff --git a/src/template/utMapsFold.erl b/src/template/utMapsFold.erl new file mode 100644 index 0000000..989b327 --- /dev/null +++ b/src/template/utMapsFold.erl @@ -0,0 +1,14 @@ +-module(utMapsFold). + +-export([fold/1]). + +fold(Map) -> + fold(maps:iterator(Map), []). + +fold(Iterator, AccList) -> + case maps:next(Iterator) of + {Key, Value, NextIter} -> + fold(NextIter, [{Key, Value} | AccList]); + none -> + AccList + end.