diff --git a/src/ezic.erl b/src/ezic.erl index b2390f6..6a4f12c 100644 --- a/src/ezic.erl +++ b/src/ezic.erl @@ -36,7 +36,7 @@ localtime(TzName) -> utc_to_local(UTCDatetime, TzName) -> NormalDatetime= ezic_date:normalize(UTCDatetime, u), - #flatzone{offset=Offset, dstoffset=DSTOffset}= ezic_db:flatzone(NormalDatetime, TzName), + #flatzone{offset=Offset, dstoffset=DSTOffset}= ezic_db_ets:flatzone(NormalDatetime, TzName), ezic_date:add_offset( ezic_date:add_offset( @@ -47,7 +47,7 @@ utc_to_local(UTCDatetime, TzName) -> local_to_utc(LocalDatetime, TzName) -> NormalDatetime= ezic_date:normalize(LocalDatetime, w), - #flatzone{offset=Offset, dstoffset=DSTOffset}= ezic_db:flatzone(NormalDatetime, TzName), + #flatzone{offset=Offset, dstoffset=DSTOffset}= ezic_db_ets:flatzone(NormalDatetime, TzName), ezic_date:add_offset( ezic_date:add_offset( @@ -94,8 +94,8 @@ zf() -> reflatten() -> - ezic_db:wipe(flatzone), - ezic_flatten:flatten(). + ezic_db_ets:wipe(flatzone), + ezic_db_ets:flatten(). @@ -116,7 +116,7 @@ test() -> current_as_of_utc(UTCDatetime, TzName) -> CZone= ezic_zone:current_as_of_utc(UTCDatetime, TzName), RuleName= CZone#zone.rule, - Rules= ezic_db:rules(RuleName), + Rules= ezic_db_ets:rules(RuleName), CRule= ezic_rule:current_as_of_utc(UTCDatetime, Rules), {ok, CZone, CRule}. diff --git a/src/ezic_db_ets.erl b/src/ezic_db_ets.erl index af9d85c..dd1d32c 100644 --- a/src/ezic_db_ets.erl +++ b/src/ezic_db_ets.erl @@ -10,6 +10,9 @@ , rules/1 , flatzone/2 , all/1 + %, insert_all/1 + , wipe/1 + , flatten/0 ]). @@ -37,18 +40,29 @@ rules(TzName) -> gen_server:call(?MODULE, {rules, TzName}). - flatzone(Date, TzName) -> gen_server:call(?MODULE, {flatzone, Date, TzName}). - all(Tab) -> gen_server:call(?MODULE, {all, Tab}). +%insert_all(Records) -> +% gen_server:call(?MODULE, {insert_all, Records}). +%wipe() -> +% gen_server:call(?MODULE, {wipe}). + + +wipe(Tab) -> + gen_server:call(?MODULE, {wipe, Tab}). + + +flatten() -> + gen_server:call(?MODULE, {flatten}). + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% GEN_SERVER @@ -66,20 +80,42 @@ init(_) -> %%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -handle_call({zones, Name}, _, Ets) -> - Matches= ets:select(Ets, [{#zone{name=Name, _='_'}, [], ['$_']}]), - {reply, Matches, Ets}; -handle_call({rules, Name}, _, Ets) -> - Matches= ets:select(Ets, [{#rule{name=Name, _='_'}, [], ['$_']}]), - {reply, Matches, Ets}; -handle_call({all, Table}, _, Ets) -> - Matches= ets:lookup(Ets, Table), - {reply, Matches, Ets}; -handle_call({flatzone, Date, Name}, _, Ets) -> - Matches= ets:select(Ets, ezic_flatten:ms(Date, Name)), - {reply, Matches, Ets}; -handle_call(_, _, Ets) -> - {noreply, Ets}. +handle_call({zones, Name}, _, State) -> + Matches= ets:select(zone, [{#zone{name=Name, _='_'}, [], ['$_']}]), + {reply, Matches, State}; +handle_call({rules, Name}, _, State) -> + Matches= ets:select(rule, [{#rule{name=Name, _='_'}, [], ['$_']}]), + {reply, Matches, State}; +handle_call({all, Tab}, _, State) -> + Matches= ets:lookup(Tab, Tab), + {reply, Matches, State}; +handle_call({flatzone, Date, Name}, _, State) -> + FlatZones= ets:select(flatzone, ezic_flatten:ms(Date, Name)), + Result= case length(FlatZones) of + 1 -> + hd(FlatZones); + 2 -> + erlang:error(ambiguous_zone, FlatZones); + 0 -> + erlang:error(no_zone); + _ -> + erlang:error(should_not_happen, {FlatZones, Date, Name}) + end, + {reply, Result, State}; +%handle_call({insert_all, Records}, _, Ets) -> +% Result= ets:insert(Ets, Records), +% {reply, Result, Ets}; +%handle_call({wipe}, _, Ets) -> +% Result= ets:delete(Ets), +% {reply, Result, Ets}; +handle_call({wipe, Tab}, _, State) -> + Result= ets:delete(Tab, Tab), + {reply, Result, State}; +handle_call({flatten}, _, State) -> + Result= ezic_flatten:flatten(), + {reply, Result, State}; +handle_call(_, _, State) -> + {noreply, State}. %%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/src/ezic_db_ets_admin.erl b/src/ezic_db_ets_admin.erl index 219f800..163ef2c 100644 --- a/src/ezic_db_ets_admin.erl +++ b/src/ezic_db_ets_admin.erl @@ -37,11 +37,11 @@ init() -> {ok, DbDir}= application:get_env(db_dir), Filename= filename:join(DbDir, ?DB_FILENAME), - Tabfile= case db_sane(Filename) of + case db_sane(Filename) of true -> load_tabfile(Filename); false -> create_tables(Filename) end, - {ok, Tabfile}. + {ok, []}. % erases all data @@ -61,7 +61,7 @@ insert_all(Record) -> % erases date for one table wipe(Tab) -> - not_done. + ezic_db_ets:wipe(Tab). @@ -84,20 +84,50 @@ db_sane(Filename) -> %% creates the dets table and populates it. create_tables(Filename) -> - Tab= ets:new(ezic_ets_db, [duplicate_bag]), - ets:insert(Tab, ezic_loader:load()), + {ok, Zones, Rules, _, _} = ezic_record:separate(ezic_loader:load()), + + ets:new(zone, [duplicate_bag, named_table]), + ets:insert(zone, Zones), + + ets:new(rule, [duplicate_bag, named_table]), + ets:insert(rule, Rules), + + ets:new(flatzone, [duplicate_bag, named_table]), + ezic_flatten:flatten(), + + % combine into one ets + Ets= ets:new(ezic_db_ets, [duplicate_bag]), + ets:insert(Ets, ets:lookup(zone, zone)), + ets:insert(Ets, ets:lookup(rule, rule)), + ets:insert(Ets, ets:lookup(flatzone, flatzone)), % save to disk - ets:tab2file(Tab, Filename), + ets:tab2file(Ets, Filename), - Tab. + ets:delete(Ets), + + ok. %% loads or creates the dets table. load_tabfile(Filename) -> - {ok, Name}= ets:file2tab(Filename), - Name. + {ok, Ets}= ets:file2tab(Filename), + + Zones= ets:lookup(Ets, zone), + ets:new(zone, [duplicate_bag, named_table]), + ets:insert(zone, Zones), + + Rules= ets:lookup(Ets, rule), + ets:new(rule, [duplicate_bag, named_table]), + ets:insert(rule, Rules), + + FlatZones= ets:lookup(Ets, flatzone), + ets:new(flatzone, [duplicate_bag, named_table]), + ets:insert(flatzone, FlatZones), + + ets:delete(Ets), + ok. @@ -105,6 +135,3 @@ load_tabfile(Filename) -> ets_from_dets(Dets) -> Ets= ets:new(tzdb, ?ETS_OPTS), dets:to_ets(Dets, Ets). - - - diff --git a/src/ezic_flatten.erl b/src/ezic_flatten.erl index 4ef4cc0..c94cb38 100644 --- a/src/ezic_flatten.erl +++ b/src/ezic_flatten.erl @@ -1,5 +1,6 @@ -module(ezic_flatten). -include("include/ezic.hrl"). +-define(NODEBUG, true). -include_lib("eunit/include/eunit.hrl"). @@ -20,13 +21,8 @@ ]). -%% debug --export([flatten_all_zones/1]). - - - flatten() -> - AllZones= ezic_db:get_all(zone), + AllZones= ets:lookup(zone, zone), flatten_all_zones(AllZones), done. @@ -86,7 +82,7 @@ flatten_all_zones([Z1|_]= AllZones) -> {CurrentZones, RestZones}= ezic_zone:split_by_name(Z1, AllZones), Flats= flatten_zone_set(CurrentZones), - ezic_db:insert_all(Flats), + ets:insert(flatzone, Flats), flatten_all_zones(RestZones). @@ -145,7 +141,7 @@ flatten_zone_set(FromTimeStub=#flatzone{utc_from=UTCFrom, dstoffset=DSTOffset} %% we gather all rules that _may_ apply - Rules= ezic_db:rules(RuleName), + Rules= ets:select(rule, [{#rule{name=RuleName, _='_'}, [], ['$_']}]), ?debugVal(FromTime), diff --git a/src/ezic_zone.erl b/src/ezic_zone.erl index b2a93ce..df61374 100644 --- a/src/ezic_zone.erl +++ b/src/ezic_zone.erl @@ -1,5 +1,6 @@ -module(ezic_zone). -include("include/ezic.hrl"). +-define(NODEBUG, true). -include_lib("eunit/include/eunit.hrl"). -export([ @@ -41,7 +42,7 @@ current(TzName) -> current_as_of_utc(erlang:universaltime(), TzName). current_as_of_utc(UTCDatetime, TzName) -> - Zones= ezic_db:zones(TzName), + Zones= ezic_db_ets:zones(TzName), get_zone_utc(UTCDatetime, Zones).