move forward on the transition to ets over mnesia

This commit is contained in:
lsowen
2012-11-02 22:50:17 -04:00
parent fe2c490734
commit e8385d7d86
5 changed files with 58 additions and 37 deletions

View File

@@ -36,7 +36,7 @@ localtime(TzName) ->
utc_to_local(UTCDatetime, TzName) -> utc_to_local(UTCDatetime, TzName) ->
NormalDatetime= ezic_date:normalize(UTCDatetime, u), 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(
ezic_date:add_offset( ezic_date:add_offset(
@@ -47,7 +47,7 @@ utc_to_local(UTCDatetime, TzName) ->
local_to_utc(LocalDatetime, TzName) -> local_to_utc(LocalDatetime, TzName) ->
NormalDatetime= ezic_date:normalize(LocalDatetime, w), 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(
ezic_date:add_offset( ezic_date:add_offset(
@@ -94,8 +94,8 @@ zf() ->
reflatten() -> reflatten() ->
ezic_db:wipe(flatzone), ezic_db_ets:wipe(flatzone),
ezic_flatten:flatten(). ezic_db_ets:flatten().
@@ -116,7 +116,7 @@ test() ->
current_as_of_utc(UTCDatetime, TzName) -> current_as_of_utc(UTCDatetime, TzName) ->
CZone= ezic_zone:current_as_of_utc(UTCDatetime, TzName), CZone= ezic_zone:current_as_of_utc(UTCDatetime, TzName),
RuleName= CZone#zone.rule, RuleName= CZone#zone.rule,
Rules= ezic_db:rules(RuleName), Rules= ezic_db_ets:rules(RuleName),
CRule= ezic_rule:current_as_of_utc(UTCDatetime, Rules), CRule= ezic_rule:current_as_of_utc(UTCDatetime, Rules),
{ok, CZone, CRule}. {ok, CZone, CRule}.

View File

@@ -10,6 +10,9 @@
, rules/1 , rules/1
, flatzone/2 , flatzone/2
, all/1 , all/1
%, insert_all/1
, wipe/1
, flatten/0
]). ]).
@@ -37,18 +40,29 @@ rules(TzName) ->
gen_server:call(?MODULE, {rules, TzName}). gen_server:call(?MODULE, {rules, TzName}).
flatzone(Date, TzName) -> flatzone(Date, TzName) ->
gen_server:call(?MODULE, {flatzone, Date, TzName}). gen_server:call(?MODULE, {flatzone, Date, TzName}).
all(Tab) -> all(Tab) ->
gen_server:call(?MODULE, {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 %% GEN_SERVER
@@ -78,6 +92,18 @@ handle_call({all, Table}, _, Ets) ->
handle_call({flatzone, Date, Name}, _, Ets) -> handle_call({flatzone, Date, Name}, _, Ets) ->
Matches= ets:select(Ets, ezic_flatten:ms(Date, Name)), Matches= ets:select(Ets, ezic_flatten:ms(Date, Name)),
{reply, Matches, Ets}; {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) -> handle_call(_, _, Ets) ->
{noreply, Ets}. {noreply, Ets}.

View File

@@ -37,11 +37,11 @@
init() -> init() ->
{ok, DbDir}= application:get_env(db_dir), {ok, DbDir}= application:get_env(db_dir),
Filename= filename:join(DbDir, ?DB_FILENAME), Filename= filename:join(DbDir, ?DB_FILENAME),
Tabfile= case db_sane(Filename) of Ets= case db_sane(Filename) of
true -> load_tabfile(Filename); true -> load_tabfile(Filename);
false -> create_tables(Filename) false -> create_tables(Filename)
end, end,
{ok, Tabfile}. {ok, Ets}.
% erases all data % erases all data
@@ -61,7 +61,7 @@ insert_all(Record) ->
% erases date for one table % erases date for one table
wipe(Tab) -> wipe(Tab) ->
not_done. ezic_db_ets:wipe(Tab).
@@ -84,13 +84,14 @@ db_sane(Filename) ->
%% creates the dets table and populates it. %% creates the dets table and populates it.
create_tables(Filename) -> create_tables(Filename) ->
Tab= ets:new(ezic_ets_db, [duplicate_bag]), Ets= ets:new(ezic_ets_db, [duplicate_bag]),
ets:insert(Tab, ezic_loader:load()), ets:insert(Ets, ezic_loader:load()),
ezic_flatten:flatten(Ets),
% save to disk % 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_from_dets(Dets) ->
Ets= ets:new(tzdb, ?ETS_OPTS), Ets= ets:new(tzdb, ?ETS_OPTS),
dets:to_ets(Dets, Ets). dets:to_ets(Dets, Ets).

View File

@@ -1,5 +1,6 @@
-module(ezic_flatten). -module(ezic_flatten).
-include("include/ezic.hrl"). -include("include/ezic.hrl").
-define(NODEBUG, true).
-include_lib("eunit/include/eunit.hrl"). -include_lib("eunit/include/eunit.hrl").
@@ -14,20 +15,15 @@
-export([ -export([
flatten/0 flatten/1
, contains_date/2 , contains_date/2
, ms/2 , ms/2
]). ]).
%% debug flatten(Ets) ->
-export([flatten_all_zones/1]). AllZones= ets:lookup(Ets, zone),
flatten_all_zones(Ets, AllZones),
flatten() ->
AllZones= ezic_db:get_all(zone),
flatten_all_zones(AllZones),
done. done.
@@ -79,16 +75,16 @@ ms(Date, Name) ->
% recursively processes sets of similar zones until they're all done, % recursively processes sets of similar zones until they're all done,
% passing zone sets to flatten_zone_set/1 % passing zone sets to flatten_zone_set/1
flatten_all_zones([]) -> flatten_all_zones(Ets, []) ->
done; done;
flatten_all_zones([Z1|_]= AllZones) -> flatten_all_zones(Ets, [Z1|_]= AllZones) ->
io:format("Flattening zones: ~s~n", [Z1#zone.name]), io:format("Flattening zones: ~s~n", [Z1#zone.name]),
{CurrentZones, RestZones}= ezic_zone:split_by_name(Z1, AllZones), {CurrentZones, RestZones}= ezic_zone:split_by_name(Z1, AllZones),
Flats= flatten_zone_set(CurrentZones), Flats= flatten_zone_set(Ets, CurrentZones),
ezic_db:insert_all(Flats), 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 %% gathers relevant rules and creates flat periods of the same gmt
%% offset (#flatzone). This is a recursive solution, eliminating Zones %% offset (#flatzone). This is a recursive solution, eliminating Zones
%% from the list until it's been exhausted %% from the list until it's been exhausted
flatten_zone_set(Zones) -> flatten_zone_set(Ets, Zones) ->
flatten_zone_set(?MINFLAT, Zones, [], none). flatten_zone_set(Ets, ?MINFLAT, Zones, [], none).
% flatten_zone_set(FromTime, Zones, Flats) -> [#flatzone{}] % flatten_zone_set(FromTime, Zones, Flats) -> [#flatzone{}]
@@ -123,7 +119,7 @@ flatten_zone_set(Zones) ->
% Flats= [#flatzone{}] % Flats= [#flatzone{}]
% %
% assumes a new zone every time it is called % 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], , Zones %[Z1=#zone{rule=RuleName, until=UntilTime, gmtoff=Offset} | _RestZones],
, Flats , Flats
, CurrentRule) -> , CurrentRule) ->
@@ -145,7 +141,7 @@ flatten_zone_set(FromTimeStub=#flatzone{utc_from=UTCFrom, dstoffset=DSTOffset}
%% we gather all rules that _may_ apply %% we gather all rules that _may_ apply
Rules= ezic_db:rules(RuleName), Rules= ets:select(Ets, [{#rule{name=RuleName, _='_'}, [], ['$_']}]),
?debugVal(FromTime), ?debugVal(FromTime),
@@ -169,7 +165,7 @@ flatten_zone_set(FromTimeStub=#flatzone{utc_from=UTCFrom, dstoffset=DSTOffset}
?debugMsg("maxyear reached from flatten_zone_set"), ?debugMsg("maxyear reached from flatten_zone_set"),
FinalFlats; FinalFlats;
false -> false ->
flatten_zone_set(NextFlat, RestZones, FinalFlats, EndingRule) flatten_zone_set(Ets, NextFlat, RestZones, FinalFlats, EndingRule)
catch catch
exit:Reason -> exit:Reason ->
?debugMsg("bad year for nextflat:"), ?debugMsg("bad year for nextflat:"),

View File

@@ -1,5 +1,6 @@
-module(ezic_zone). -module(ezic_zone).
-include("include/ezic.hrl"). -include("include/ezic.hrl").
-define(NODEBUG, true).
-include_lib("eunit/include/eunit.hrl"). -include_lib("eunit/include/eunit.hrl").
-export([ -export([
@@ -41,7 +42,7 @@ current(TzName) ->
current_as_of_utc(erlang:universaltime(), TzName). current_as_of_utc(erlang:universaltime(), TzName).
current_as_of_utc(UTCDatetime, TzName) -> current_as_of_utc(UTCDatetime, TzName) ->
Zones= ezic_db:zones(TzName), Zones= ezic_db_ets:zones(TzName),
get_zone_utc(UTCDatetime, Zones). get_zone_utc(UTCDatetime, Zones).