From 658091e9470b5218ef8fbaa7d6ba9d4573c09630 Mon Sep 17 00:00:00 2001 From: Jonathan Bernard Date: Wed, 15 Jun 2011 00:54:58 -0500 Subject: [PATCH] Bugfixing, compile-error-sqhashung. --- src/ts_api.erl | 34 +++++++++++++++++++++++++++------- src/ts_common.erl | 4 ++-- src/ts_ext_data.erl | 4 ++-- src/ts_json.erl | 16 ++++++++-------- src/ts_timeline.erl | 12 ++++++++++-- src/ts_user.erl | 2 +- 6 files changed, 50 insertions(+), 22 deletions(-) diff --git a/src/ts_api.erl b/src/ts_api.erl index fff4c59..122f015 100644 --- a/src/ts_api.erl +++ b/src/ts_api.erl @@ -201,13 +201,24 @@ do_logout(YArg) -> {status, 200}. get_user_summary(YArg, Username) -> + % find user record case ts_user:lookup(Username) of + + % no user record, barf no_record -> make_json_404(YArg); + + % found user record, let us build the return User -> - UserExtData - ts_ext_data:get_properties(Username), + + % get user extended data properties + UserExtData = ts_ext_data:get_properties(Username), + % convert to intermediate JSON form EJSONUser = ts_json:record_to_ejson(User, UserExtData), + % get the user's timelins Timelines = ts_timeline:list(Username, 0, 100), + + % get each timeline's extended data and convert to EJSON EJSONTimelines = {array, lists:map( fun(Timeline) -> @@ -216,17 +227,22 @@ get_user_summary(YArg, Username) -> end, Timelines)}, + % convert to JSON JSONResp = json:encode({struct, [{user, EJSONUser}, {timelines, EJSONTimelines} ]}), + % write response out {content, "application/json", JSONResp} end. get_user(YArg, Username) -> + % find the user record case ts_user:lookup(Username) of + % no such user, barf no_record -> make_json_404(YArg); + % found, return a 200 with the record User -> make_json_200(YArg, User) end. @@ -250,7 +266,7 @@ list_timelines(YArg, Username) -> % list the timelines from the database Timelines = ts_timeline:list(Username, Start, Length), - % convert them all to their EJSON form + % convert them all to their EJSON form, adding in extended data for each EJSONTimelines = {array, lists:map( fun (Timeline) -> ts_json:record_to_ejson(Timeline, @@ -258,7 +274,7 @@ list_timelines(YArg, Username) -> end, Timelines)}, - % create resposne + % convert to JSON and create resposne JSONResponse = json:encode(EJSONTimelines), % return response @@ -282,12 +298,16 @@ put_timeline(YArg, Username, TimelineId) -> {TR, ExtData} = try ts_json:ejson_to_record_strict( #ts_timeline{ref={Username, TimelineId}}, EJSON) + % we can not parse it, tell the user catch throw:{InputError, _StackTrace} -> error_logger:error_report("Bad input: ~p", [InputError]), - throw(make_json_400(YArg, {request_error, InputError)) + throw(make_json_400(YArg, {request_error, InputError})) end, - ts_timeline:write(TR), + % write the changes. + ts_timeline:write(TR, ExtData), + + % return a 200 make_json_200(YArg, TR). delete_timeline(_YArg, _Username, _TimelineId) -> {status, 405}. @@ -335,7 +355,7 @@ list_entries(YArg, Username, TimelineId) -> EJSONEntries = {array, lists:map( fun (Entry) -> ts_json:record_to_ejson(Entry, - ts_ext_data:get_properties(Entry#ts_entry.ref)), + ts_ext_data:get_properties(Entry#ts_entry.ref)) end, Entries)}, @@ -371,7 +391,7 @@ list_entries(YArg, Username, TimelineId) -> EJSONEntries = {array, lists:map( fun (Entry) -> ts_json:record_to_ejson(Entry, - ts_ext_data:get_properties(Entry#ts_entry.ref)), + ts_ext_data:get_properties(Entry#ts_entry.ref)) end, Entries)}, diff --git a/src/ts_common.erl b/src/ts_common.erl index c39f40c..9feee2a 100644 --- a/src/ts_common.erl +++ b/src/ts_common.erl @@ -41,7 +41,7 @@ update(Record, ExtData) when is_list(ExtData) -> case do_update(Record) of {error, Err} -> mnesia:abort({"Cannot update record.", Err}); UpdatedRecord -> case do_set_ext_data(Record, ExtData) of - of -> UpdatedRecord; + ok -> UpdatedRecord; Error -> mnesia:abort({"Cannot update record.", Error}) end end @@ -105,7 +105,7 @@ do_set_ext_data(Record, ExtData) when is_list(ExtData) -> fun({Key, Val}) -> {atomic, ok} = ts_ext_data:set_property(Ref, Key, Val) end, - ExtData) + ExtData), ok. % This is somewhat ridiculous. diff --git a/src/ts_ext_data.erl b/src/ts_ext_data.erl index 384a3b8..c6406ef 100644 --- a/src/ts_ext_data.erl +++ b/src/ts_ext_data.erl @@ -22,7 +22,7 @@ set_property(Ref=#ts_timeline{}, entry_exclusions, ExclusionList) -> set_property(Ref, Key, Value) -> throw(io_lib:format("Property '~s' not available for a ~s record.", - [Key, element(1, Ref)]). + [Key, element(1, Ref)])). get_property(Ref, PropKey) -> {atomic, Result} = mnesia:transaction(fun() -> @@ -42,6 +42,6 @@ get_properties(Ref) -> do_set_property(Ref, PropKey, Val) -> {atomic, Result} = mnesia:transaction(fun() -> - mnesia:write(#ts_ext_data{ref = {Ref, PropKey}, value = Val}). + mnesia:write(#ts_ext_data{ref = {Ref, PropKey}, value = Val}) end), Result. diff --git a/src/ts_json.erl b/src/ts_json.erl index e6184ff..e310e74 100644 --- a/src/ts_json.erl +++ b/src/ts_json.erl @@ -1,11 +1,11 @@ -module(ts_json). --export([encode_record/1, record_to_ejson/2, +-export([encode_record/2, record_to_ejson/2, ejson_to_record/2, ejson_to_record/3, ejson_to_record_strict/2, ejson_to_record_strict/3]). -include("ts_db_records.hrl"). -encode_record(Record) -> lists:flatten(json:encode(record_to_ejson(Record))). +encode_record(Record, ExtData) -> lists:flatten(json:encode(record_to_ejson(Record, ExtData))). % User JSON record required structure: % {"id": "john_doe", @@ -110,12 +110,12 @@ ejson_to_record_strict(Empty, Ref, EJSON) -> construct_record(Timeline=#ts_timeline{}, [{Key, Val}|Fields], ExtData) -> case Key of created -> construct_record( - Timeline#ts_timeline{created = decode_datetime(Value)}, + Timeline#ts_timeline{created = decode_datetime(Val)}, Fields, ExtData); - description -> construct_record(Timeline#ts_timeline{desc = Value}, + description -> construct_record(Timeline#ts_timeline{desc = Val}, Fields, ExtData); - Other -> - ExtDataProp = ejson_to_ext_data({Key, Value}), + _Other -> + ExtDataProp = ejson_to_ext_data({Key, Val}), construct_record(Timeline, Fields, [ExtDataProp|ExtData]) end; @@ -126,8 +126,8 @@ construct_record(Entry=#ts_entry{}, [{Key, Value}|Fields], ExtData) -> decode_datetime(Value))}, Fields, ExtData); mark -> construct_record(Entry#ts_entry{mark=Value}, Fields, ExtData); - notes -> construct_record(Entry#ts_entry{notes=Vale}, Fields, ExtData); - Other -> + notes -> construct_record(Entry#ts_entry{notes=Value}, Fields, ExtData); + _Other -> ExtDataProp = ejson_to_ext_data({Key, Value}), construct_record(Entry, Fields, [ExtDataProp|ExtData]) end; diff --git a/src/ts_timeline.erl b/src/ts_timeline.erl index e91066e..fb9f04b 100644 --- a/src/ts_timeline.erl +++ b/src/ts_timeline.erl @@ -1,5 +1,6 @@ -module(ts_timeline). --export([create_table/1, new/1, new/2, update/1, update/2, write/1, lookup/2, list/3]). +-export([create_table/1, new/1, new/2, update/1, update/2, write/1, write/2, + lookup/2, list/3]). -include("ts_db_records.hrl"). -include_lib("stdlib/include/qlc.hrl"). @@ -20,6 +21,13 @@ update(TR = #ts_timeline{}, ExtData) when is_list(ExtData) -> ts_common:update(TR, ExtData). write(TR = #ts_timeline{}) -> mnesia:dirty_write(TR). + +write(TR = #ts_timeline{}, ExtData) -> + {atomic, Result} = mnesia:transaction(fun() -> + ok = mnesia:write(TR), + ok = ts_common:do_set_ext_data(TR, ExtData) + end), + Result. lookup(Username, TimelineId) -> case mnesia:dirty_read(ts_timeline, {Username, TimelineId}) of @@ -29,5 +37,5 @@ lookup(Username, TimelineId) -> list(Username, Start, Length) -> MatchHead = #ts_timeline{ref = {Username, '_'}, _='_'}, - mnesia:dirty_select(ts_timeline, [{MatchHead, [], ['$_']}]), + Timelines = mnesia:dirty_select(ts_timeline, [{MatchHead, [], ['$_']}]), lists:sublist(Timelines, Start + 1, Length). diff --git a/src/ts_user.erl b/src/ts_user.erl index 2596908..e8242b6 100644 --- a/src/ts_user.erl +++ b/src/ts_user.erl @@ -35,7 +35,7 @@ update(UR = #ts_user{}) -> update(UR = #ts_user{}, ExtData) -> {atomic, Result} = mnesia:transaction(fun() -> UpdatedUser = do_update(UR), - ts_common:do_set_ext_data(UR, ExtData) + ts_common:do_set_ext_data(UR, ExtData), UpdatedUser end), Result.