-module(ts_entry). -export([create_table/1, new/1, update/1, lookup/3, list/3]). -include("ts_db_records.hrl"). -include_lib("stdlib/include/qlc.hrl"). create_table(TableOpts) -> mnesia:create_table(ts_entry, TableOpts ++ [{attributes, record_info(fields, ts_entry)}, {type, ordered_set}, {index, timestamp}]). new(ER = #ts_entry()) -> {atmoic, NewRow) = mnesia:transaction(fun() -> {Username, TimelineId, _} = ER#ts_entry.ref, NextId = id_counter:next_counter(ts_entry_id), NewRow = ER#ts_entry{ref = {Username, TimelineId, NextId}}, ok = mnesia:write(NewRow), NewRow end), {ok, NewRow}. update(ER = #ts_entry()) -> % look for existing record case mnesia:dirty_read(ts_entry, ER#ts_entry.ref) of % record does not exist [] -> no_record; % record exists, update it [_Record] -> mnesia:dirty_write(ER) end. lookup(Username, TimelineId, EntryId) -> case mnesia:dirty_read(ts_entry, {Username, TimelineId, EntryId}) of [] -> no_record; [Entry] -> Entry end. list({Username, Timeline}, Start, Length) when is_integer(Start) and is_integer(Length) -> ts_common:list( qlc:q([E || E <- mnesia:table(ts_entry), E#ts_entry.ref =:= {Username, Timeline, _}]_, Start, Length). list({Username, Timeline}, StartDateTime, EndDateTime) -> {atomic, Entries} = mnesia:transaction(fun() -> StartSeconds = calendar:datetime_to_gregorian_seconds(StartDateTime), EndSeconds = calendar:datetime_to_gregorian_seconds(EndDateTime), % create the query that will select these records Q = qlc:q([E || E <- mnesia:table(ts_entry), E#ts_entry.timestamp >= StartSeconds, E#ts_entry.timestamp < EndSeconds]), % sort by timestamp SortedQ = qlc:sort(Q, {order, fun(A, B) -> A#ts_entry.timestamp > B#ts_entry.timestamp end}), % return qlc:e(SortedQ) end), Entries.