Merge pull request #5 from lsowen/ets_work
Continue work on migrating for mnesia backed to ets backed
This commit is contained in:
10
src/ezic.erl
10
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}.
|
||||
|
||||
|
||||
@@ -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}.
|
||||
|
||||
|
||||
%%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
@@ -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).
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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).
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user