Bugfixing, compile-error-sqhashung.
This commit is contained in:
		@@ -201,13 +201,24 @@ do_logout(YArg) ->
 | 
				
			|||||||
    {status, 200}.
 | 
					    {status, 200}.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
get_user_summary(YArg, Username) ->
 | 
					get_user_summary(YArg, Username) ->
 | 
				
			||||||
 | 
					    % find user record
 | 
				
			||||||
    case ts_user:lookup(Username) of
 | 
					    case ts_user:lookup(Username) of
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        % no user record, barf
 | 
				
			||||||
        no_record -> make_json_404(YArg);
 | 
					        no_record -> make_json_404(YArg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        % found user record, let us build the return
 | 
				
			||||||
        User ->
 | 
					        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),
 | 
					            EJSONUser = ts_json:record_to_ejson(User, UserExtData),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            % get the user's timelins
 | 
				
			||||||
            Timelines = ts_timeline:list(Username, 0, 100),
 | 
					            Timelines = ts_timeline:list(Username, 0, 100),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            % get each timeline's extended data and convert to EJSON
 | 
				
			||||||
            EJSONTimelines = {array,
 | 
					            EJSONTimelines = {array,
 | 
				
			||||||
                lists:map(
 | 
					                lists:map(
 | 
				
			||||||
                    fun(Timeline) ->
 | 
					                    fun(Timeline) ->
 | 
				
			||||||
@@ -216,17 +227,22 @@ get_user_summary(YArg, Username) ->
 | 
				
			|||||||
                    end,
 | 
					                    end,
 | 
				
			||||||
                    Timelines)},
 | 
					                    Timelines)},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            % convert to JSON
 | 
				
			||||||
            JSONResp = json:encode({struct,
 | 
					            JSONResp = json:encode({struct,
 | 
				
			||||||
               [{user, EJSONUser},
 | 
					               [{user, EJSONUser},
 | 
				
			||||||
                {timelines, EJSONTimelines}
 | 
					                {timelines, EJSONTimelines}
 | 
				
			||||||
            ]}),
 | 
					            ]}),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            % write response out
 | 
				
			||||||
            {content, "application/json", JSONResp}
 | 
					            {content, "application/json", JSONResp}
 | 
				
			||||||
    end.
 | 
					    end.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
get_user(YArg, Username) ->
 | 
					get_user(YArg, Username) ->
 | 
				
			||||||
 | 
					    % find the user record
 | 
				
			||||||
    case ts_user:lookup(Username) of
 | 
					    case ts_user:lookup(Username) of
 | 
				
			||||||
 | 
					        % no such user, barf
 | 
				
			||||||
        no_record -> make_json_404(YArg);
 | 
					        no_record -> make_json_404(YArg);
 | 
				
			||||||
 | 
					        % found, return a 200 with the record
 | 
				
			||||||
        User -> make_json_200(YArg, User)
 | 
					        User -> make_json_200(YArg, User)
 | 
				
			||||||
    end.
 | 
					    end.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -250,7 +266,7 @@ list_timelines(YArg, Username) ->
 | 
				
			|||||||
    % list the timelines from the database
 | 
					    % list the timelines from the database
 | 
				
			||||||
    Timelines = ts_timeline:list(Username, Start, Length),
 | 
					    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(
 | 
					    EJSONTimelines = {array, lists:map(
 | 
				
			||||||
        fun (Timeline) ->
 | 
					        fun (Timeline) ->
 | 
				
			||||||
            ts_json:record_to_ejson(Timeline, 
 | 
					            ts_json:record_to_ejson(Timeline, 
 | 
				
			||||||
@@ -258,7 +274,7 @@ list_timelines(YArg, Username) ->
 | 
				
			|||||||
        end,
 | 
					        end,
 | 
				
			||||||
        Timelines)},
 | 
					        Timelines)},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    % create resposne
 | 
					    % convert to JSON and create resposne
 | 
				
			||||||
    JSONResponse = json:encode(EJSONTimelines),
 | 
					    JSONResponse = json:encode(EJSONTimelines),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    % return response
 | 
					    % return response
 | 
				
			||||||
@@ -282,12 +298,16 @@ put_timeline(YArg, Username, TimelineId) ->
 | 
				
			|||||||
    {TR, ExtData} =
 | 
					    {TR, ExtData} =
 | 
				
			||||||
        try ts_json:ejson_to_record_strict(
 | 
					        try ts_json:ejson_to_record_strict(
 | 
				
			||||||
            #ts_timeline{ref={Username, TimelineId}}, EJSON)
 | 
					            #ts_timeline{ref={Username, TimelineId}}, EJSON)
 | 
				
			||||||
 | 
					        % we can not parse it, tell the user
 | 
				
			||||||
        catch throw:{InputError, _StackTrace} ->
 | 
					        catch throw:{InputError, _StackTrace} ->
 | 
				
			||||||
            error_logger:error_report("Bad input: ~p", [InputError]),
 | 
					            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,
 | 
					        end,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ts_timeline:write(TR),
 | 
					    % write the changes.
 | 
				
			||||||
 | 
					    ts_timeline:write(TR, ExtData),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    % return a 200
 | 
				
			||||||
    make_json_200(YArg, TR).
 | 
					    make_json_200(YArg, TR).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
delete_timeline(_YArg, _Username, _TimelineId) -> {status, 405}.
 | 
					delete_timeline(_YArg, _Username, _TimelineId) -> {status, 405}.
 | 
				
			||||||
@@ -335,7 +355,7 @@ list_entries(YArg, Username, TimelineId) ->
 | 
				
			|||||||
            EJSONEntries = {array, lists:map(
 | 
					            EJSONEntries = {array, lists:map(
 | 
				
			||||||
                fun (Entry) ->
 | 
					                fun (Entry) ->
 | 
				
			||||||
                    ts_json:record_to_ejson(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,
 | 
					                end,
 | 
				
			||||||
                Entries)},
 | 
					                Entries)},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -371,7 +391,7 @@ list_entries(YArg, Username, TimelineId) ->
 | 
				
			|||||||
            EJSONEntries = {array, lists:map(
 | 
					            EJSONEntries = {array, lists:map(
 | 
				
			||||||
                fun (Entry) ->
 | 
					                fun (Entry) ->
 | 
				
			||||||
                    ts_json:record_to_ejson(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,
 | 
					                end,
 | 
				
			||||||
                Entries)},
 | 
					                Entries)},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -41,7 +41,7 @@ update(Record, ExtData) when is_list(ExtData) ->
 | 
				
			|||||||
        case do_update(Record) of
 | 
					        case do_update(Record) of
 | 
				
			||||||
            {error, Err} -> mnesia:abort({"Cannot update record.", Err});
 | 
					            {error, Err} -> mnesia:abort({"Cannot update record.", Err});
 | 
				
			||||||
            UpdatedRecord -> case do_set_ext_data(Record, ExtData) of
 | 
					            UpdatedRecord -> case do_set_ext_data(Record, ExtData) of
 | 
				
			||||||
                of -> UpdatedRecord;
 | 
					                ok -> UpdatedRecord;
 | 
				
			||||||
                Error -> mnesia:abort({"Cannot update record.", Error})
 | 
					                Error -> mnesia:abort({"Cannot update record.", Error})
 | 
				
			||||||
            end
 | 
					            end
 | 
				
			||||||
        end
 | 
					        end
 | 
				
			||||||
@@ -105,7 +105,7 @@ do_set_ext_data(Record, ExtData) when is_list(ExtData) ->
 | 
				
			|||||||
        fun({Key, Val}) ->
 | 
					        fun({Key, Val}) ->
 | 
				
			||||||
            {atomic, ok} = ts_ext_data:set_property(Ref, Key, Val)
 | 
					            {atomic, ok} = ts_ext_data:set_property(Ref, Key, Val)
 | 
				
			||||||
        end,
 | 
					        end,
 | 
				
			||||||
        ExtData)
 | 
					        ExtData),
 | 
				
			||||||
    ok.
 | 
					    ok.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
% This is somewhat ridiculous.
 | 
					% This is somewhat ridiculous.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,7 +22,7 @@ set_property(Ref=#ts_timeline{}, entry_exclusions, ExclusionList) ->
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
set_property(Ref, Key, Value) ->
 | 
					set_property(Ref, Key, Value) ->
 | 
				
			||||||
    throw(io_lib:format("Property '~s' not available for a ~s record.",
 | 
					    throw(io_lib:format("Property '~s' not available for a ~s record.",
 | 
				
			||||||
        [Key, element(1, Ref)]).
 | 
					        [Key, element(1, Ref)])).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
get_property(Ref, PropKey) ->
 | 
					get_property(Ref, PropKey) ->
 | 
				
			||||||
    {atomic, Result} = mnesia:transaction(fun() ->
 | 
					    {atomic, Result} = mnesia:transaction(fun() ->
 | 
				
			||||||
@@ -42,6 +42,6 @@ get_properties(Ref) ->
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
do_set_property(Ref, PropKey, Val) ->
 | 
					do_set_property(Ref, PropKey, Val) ->
 | 
				
			||||||
    {atomic, Result} = mnesia:transaction(fun() ->
 | 
					    {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),
 | 
					    end),
 | 
				
			||||||
    Result.
 | 
					    Result.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,11 +1,11 @@
 | 
				
			|||||||
-module(ts_json).
 | 
					-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/2, ejson_to_record/3,
 | 
				
			||||||
         ejson_to_record_strict/2, ejson_to_record_strict/3]).
 | 
					         ejson_to_record_strict/2, ejson_to_record_strict/3]).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-include("ts_db_records.hrl").
 | 
					-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:
 | 
					% User JSON record required structure:
 | 
				
			||||||
% {"id":        "john_doe",
 | 
					% {"id":        "john_doe",
 | 
				
			||||||
@@ -110,12 +110,12 @@ ejson_to_record_strict(Empty, Ref, EJSON) ->
 | 
				
			|||||||
construct_record(Timeline=#ts_timeline{}, [{Key, Val}|Fields], ExtData) ->
 | 
					construct_record(Timeline=#ts_timeline{}, [{Key, Val}|Fields], ExtData) ->
 | 
				
			||||||
    case Key of
 | 
					    case Key of
 | 
				
			||||||
        created -> construct_record(
 | 
					        created -> construct_record(
 | 
				
			||||||
                Timeline#ts_timeline{created = decode_datetime(Value)},
 | 
					                Timeline#ts_timeline{created = decode_datetime(Val)},
 | 
				
			||||||
                Fields, ExtData);
 | 
					                Fields, ExtData);
 | 
				
			||||||
        description -> construct_record(Timeline#ts_timeline{desc = Value},
 | 
					        description -> construct_record(Timeline#ts_timeline{desc = Val},
 | 
				
			||||||
                Fields, ExtData);
 | 
					                Fields, ExtData);
 | 
				
			||||||
        Other -> 
 | 
					        _Other -> 
 | 
				
			||||||
            ExtDataProp = ejson_to_ext_data({Key, Value}),
 | 
					            ExtDataProp = ejson_to_ext_data({Key, Val}),
 | 
				
			||||||
            construct_record(Timeline, Fields, [ExtDataProp|ExtData])
 | 
					            construct_record(Timeline, Fields, [ExtDataProp|ExtData])
 | 
				
			||||||
    end;
 | 
					    end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -126,8 +126,8 @@ construct_record(Entry=#ts_entry{}, [{Key, Value}|Fields], ExtData) ->
 | 
				
			|||||||
                decode_datetime(Value))},
 | 
					                decode_datetime(Value))},
 | 
				
			||||||
            Fields, ExtData);
 | 
					            Fields, ExtData);
 | 
				
			||||||
        mark -> construct_record(Entry#ts_entry{mark=Value}, Fields, ExtData);
 | 
					        mark -> construct_record(Entry#ts_entry{mark=Value}, Fields, ExtData);
 | 
				
			||||||
        notes -> construct_record(Entry#ts_entry{notes=Vale}, Fields, ExtData);
 | 
					        notes -> construct_record(Entry#ts_entry{notes=Value}, Fields, ExtData);
 | 
				
			||||||
        Other ->
 | 
					        _Other ->
 | 
				
			||||||
            ExtDataProp = ejson_to_ext_data({Key, Value}),
 | 
					            ExtDataProp = ejson_to_ext_data({Key, Value}),
 | 
				
			||||||
            construct_record(Entry, Fields, [ExtDataProp|ExtData])
 | 
					            construct_record(Entry, Fields, [ExtDataProp|ExtData])
 | 
				
			||||||
    end;
 | 
					    end;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,6 @@
 | 
				
			|||||||
-module(ts_timeline).
 | 
					-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("ts_db_records.hrl").
 | 
				
			||||||
-include_lib("stdlib/include/qlc.hrl").
 | 
					-include_lib("stdlib/include/qlc.hrl").
 | 
				
			||||||
@@ -21,6 +22,13 @@ update(TR = #ts_timeline{}, ExtData) when is_list(ExtData) ->
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
write(TR = #ts_timeline{}) -> mnesia:dirty_write(TR).
 | 
					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) ->
 | 
					lookup(Username, TimelineId) ->
 | 
				
			||||||
    case mnesia:dirty_read(ts_timeline, {Username, TimelineId}) of
 | 
					    case mnesia:dirty_read(ts_timeline, {Username, TimelineId}) of
 | 
				
			||||||
        [] -> no_record;
 | 
					        [] -> no_record;
 | 
				
			||||||
@@ -29,5 +37,5 @@ lookup(Username, TimelineId) ->
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
list(Username, Start, Length) -> 
 | 
					list(Username, Start, Length) -> 
 | 
				
			||||||
    MatchHead = #ts_timeline{ref = {Username, '_'}, _='_'},
 | 
					    MatchHead = #ts_timeline{ref = {Username, '_'}, _='_'},
 | 
				
			||||||
    mnesia:dirty_select(ts_timeline, [{MatchHead, [], ['$_']}]),
 | 
					    Timelines = mnesia:dirty_select(ts_timeline, [{MatchHead, [], ['$_']}]),
 | 
				
			||||||
    lists:sublist(Timelines, Start + 1, Length).
 | 
					    lists:sublist(Timelines, Start + 1, Length).
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -35,7 +35,7 @@ update(UR = #ts_user{}) ->
 | 
				
			|||||||
update(UR = #ts_user{}, ExtData) ->
 | 
					update(UR = #ts_user{}, ExtData) ->
 | 
				
			||||||
    {atomic, Result} = mnesia:transaction(fun() ->
 | 
					    {atomic, Result} = mnesia:transaction(fun() ->
 | 
				
			||||||
        UpdatedUser = do_update(UR),
 | 
					        UpdatedUser = do_update(UR),
 | 
				
			||||||
        ts_common:do_set_ext_data(UR, ExtData) 
 | 
					        ts_common:do_set_ext_data(UR, ExtData),
 | 
				
			||||||
        UpdatedUser end),
 | 
					        UpdatedUser end),
 | 
				
			||||||
    Result.
 | 
					    Result.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user