Files
ezic/src/ezic_db_ets_admin.erl
lsowen 9d0df77b29 Now using named ets tables.
More closely mirrors the design of the mnesia backed version.
2012-11-07 14:06:27 -05:00

138 lines
2.9 KiB
Erlang

-module(ezic_db_ets_admin).
-include("include/ezic.hrl").
-include_lib("eunit/include/eunit.hrl").
-define(TABS, [rule, zone, leap, flatzone]).
-define(DB_FILENAME, "db.e2f").
-define(DETS_OPTS, []).
-define(ETS_OPTS, [named_table]).
-export([
init/0
, wipe/0
, insert_all/1
, wipe/1
]).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% ADMIN API
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
% Entire DB
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
%% if dets tables exist,
%% load stored tables
%% else
%% create all ets tables as named tables
%% load data
init() ->
{ok, DbDir}= application:get_env(db_dir),
Filename= filename:join(DbDir, ?DB_FILENAME),
case db_sane(Filename) of
true -> load_tabfile(Filename);
false -> create_tables(Filename)
end,
{ok, []}.
% erases all data
wipe() ->
not_done.
% inserts all records into the appropriate db
insert_all(Record) ->
not_done.
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
% Single Table
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
% erases date for one table
wipe(Tab) ->
ezic_db_ets:wipe(Tab).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% PRIVATE
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% -> true if table exists
db_sane(Filename) ->
%% @todo ensure data is present for each record type.
case ets:tabfile_info(Filename) of
{ok, _} -> true;
{error, _} -> false
end.
%% creates the dets table and populates it.
create_tables(Filename) ->
{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(Ets, Filename),
ets:delete(Ets),
ok.
%% loads or creates the dets table.
load_tabfile(Filename) ->
{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.
%% takes a populated dets table and converts it to an ets table.
ets_from_dets(Dets) ->
Ets= ets:new(tzdb, ?ETS_OPTS),
dets:to_ets(Dets, Ets).