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..742dc04 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 @@ -78,6 +92,18 @@ handle_call({all, Table}, _, Ets) -> handle_call({flatzone, Date, Name}, _, Ets) -> Matches= ets:select(Ets, ezic_flatten:ms(Date, Name)), {reply, Matches, Ets}; +%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}, _, Ets) -> + Result= ets:delete(Ets, Tab), + {reply, Result, Ets}; +handle_call({flatten}, _, Ets) -> + Result= ezic_flatten:flatten(Ets), + {reply, Result, Ets}; handle_call(_, _, Ets) -> {noreply, Ets}. diff --git a/src/ezic_db_ets_admin.erl b/src/ezic_db_ets_admin.erl index 219f800..aecda26 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 + Ets= case db_sane(Filename) of true -> load_tabfile(Filename); false -> create_tables(Filename) end, - {ok, Tabfile}. + {ok, Ets}. % 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,13 +84,14 @@ 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()), + Ets= ets:new(ezic_ets_db, [duplicate_bag]), + ets:insert(Ets, ezic_loader:load()), + ezic_flatten:flatten(Ets), % save to disk - ets:tab2file(Tab, Filename), + ets:tab2file(Ets, Filename), - Tab. + Ets. @@ -105,6 +106,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..112c7e7 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"). @@ -14,20 +15,15 @@ -export([ - flatten/0 + flatten/1 , contains_date/2 , ms/2 ]). -%% debug --export([flatten_all_zones/1]). - - - -flatten() -> - AllZones= ezic_db:get_all(zone), - flatten_all_zones(AllZones), +flatten(Ets) -> + AllZones= ets:lookup(Ets, zone), + flatten_all_zones(Ets, AllZones), done. @@ -79,16 +75,16 @@ ms(Date, Name) -> % recursively processes sets of similar zones until they're all done, % passing zone sets to flatten_zone_set/1 -flatten_all_zones([]) -> +flatten_all_zones(Ets, []) -> done; -flatten_all_zones([Z1|_]= AllZones) -> +flatten_all_zones(Ets, [Z1|_]= AllZones) -> io:format("Flattening zones: ~s~n", [Z1#zone.name]), {CurrentZones, RestZones}= ezic_zone:split_by_name(Z1, AllZones), - Flats= flatten_zone_set(CurrentZones), - ezic_db:insert_all(Flats), + Flats= flatten_zone_set(Ets, CurrentZones), + ets:insert(Ets, Flats), - flatten_all_zones(RestZones). + flatten_all_zones(Ets, RestZones). @@ -113,8 +109,8 @@ contains_date2(FlatZone=#flatzone{wall_from=From, wall_to=To}, {Dt,#tztime{time= %% gathers relevant rules and creates flat periods of the same gmt %% offset (#flatzone). This is a recursive solution, eliminating Zones %% from the list until it's been exhausted -flatten_zone_set(Zones) -> - flatten_zone_set(?MINFLAT, Zones, [], none). +flatten_zone_set(Ets, Zones) -> + flatten_zone_set(Ets, ?MINFLAT, Zones, [], none). % flatten_zone_set(FromTime, Zones, Flats) -> [#flatzone{}] @@ -123,7 +119,7 @@ flatten_zone_set(Zones) -> % Flats= [#flatzone{}] % % assumes a new zone every time it is called -flatten_zone_set(FromTimeStub=#flatzone{utc_from=UTCFrom, dstoffset=DSTOffset} +flatten_zone_set(Ets, FromTimeStub=#flatzone{utc_from=UTCFrom, dstoffset=DSTOffset} , Zones %[Z1=#zone{rule=RuleName, until=UntilTime, gmtoff=Offset} | _RestZones], , Flats , CurrentRule) -> @@ -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(Ets, [{#rule{name=RuleName, _='_'}, [], ['$_']}]), ?debugVal(FromTime), @@ -169,7 +165,7 @@ flatten_zone_set(FromTimeStub=#flatzone{utc_from=UTCFrom, dstoffset=DSTOffset} ?debugMsg("maxyear reached from flatten_zone_set"), FinalFlats; false -> - flatten_zone_set(NextFlat, RestZones, FinalFlats, EndingRule) + flatten_zone_set(Ets, NextFlat, RestZones, FinalFlats, EndingRule) catch exit:Reason -> ?debugMsg("bad year for nextflat:"), 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).