%% Author: Administrator
%% Created: 2011-12-12
%% Description: TODO: Add description to ipad_deal
-module(ipad_deal).
%%
%% Include files
%%
%%
%% Exported Functions
%%
-export([init/2, work_start/0]).
%%
%% API Functions
%%
init(Log_Path, Process_Num) ->
Process_List = create_process_loop(Process_Num),
Wild_File_Name = " impression_log*.gz",
Full_Wild_File_Name = filename:join([Log_Path, Wild_File_Name]),
Search_File_List = case filelib:wildcard(Full_Wild_File_Name) of
[] ->
[];
[_H|_T] = File_Name_List ->
File_Name_List;
_ ->
[]
end,
dispatcher_work(Process_List, Search_File_List).
%lists:foreach(fun deal_file/1, Search_File_List).
create_process_loop(Process_Num) ->
[ {erlang:spawn(?MODULE, work_start, []), idle} || _X <- lists:seq(0, Process_Num - 1) ].
dispatcher_work([], []) ->
io:format("All Files done!!!~n");
dispatcher_work([{Pid, idle} | T], []) ->
Pid ! {self(), stop},
dispatcher_work(T ++ [{Pid, working}], []);
dispatcher_work([{Pid, idle} | T], [File_Name | File_List]) ->
Pid ! {self(), File_Name},
dispatcher_work(T ++ [{Pid, working}], File_List);
dispatcher_work([{_Pid, working} | _T] = Process_List, File_List) ->
receive
{Work_Pid, idle} ->
Remain_Process_List = lists:keydelete(Work_Pid, 1, Process_List),
dispatcher_work([{Work_Pid, idle} | Remain_Process_List], File_List);
{Work_Pid, stop} ->
io:format("stop ~p~n", [Work_Pid]),
dispatcher_work( lists:keydelete(Work_Pid, 1, Process_List), File_List)
end.
work_start() ->
receive
{From, stop} ->
From ! {self(), stop},
erlang:exit(normal);
{From, File_Name} ->
deal_file(File_Name),
From ! {self(), idle}
end,
work_start().
deal_file(GFile_Name) ->
%io:format("~p,~p~n", [self(), GFile_Name]),
DFile_Name = filename:join(filename:dirname(GFile_Name), filename:basename(GFile_Name, ".gz")),
{ok, Src_Data} = file:read_file(GFile_Name),
Dest = zlib:gunzip(Src_Data),
L = re:split(Dest, "[;\n]"),
{ok, FD} = file:open(DFile_Name, [write, append]),
parse_data(L, FD).
%%
%% Local Functions
%%
parse_data([_H], FD) ->
file:close(FD);
parse_data([], FD) ->
file:close(FD);
parse_data([_H1, H2|T], FD) when H2 =:= <<" valid">> ->
parse_data(T, FD);
parse_data([H1, H2|T], FD) when H2 =:= <<" unvalid">> ->
case check_play_type(H1) of
true ->
S = <<H1/bits, <<" ;valid">>/bits>>,
file:write(FD, S);
_ ->
ok
end,
parse_data(T, FD);
parse_data([_H1, _H2|T], FD) ->
parse_data(T, FD).
check_play_type(Input_Data) ->
{_, {_, _, _, _, _, _, _, {playerinfo, _, _, PlayType}}, _, _, _, _} = cupidlog_pb:decode_impression(base64:decode(Input_Data)),
case PlayType of
"ipad" ->
true;
_ ->
%io:format(" ~p,~p, ~p~n", [?FILE, ?LINE, PlayType]),
false
end.
%% Created: 2011-12-12
%% Description: TODO: Add description to ipad_deal
-module(ipad_deal).
%%
%% Include files
%%
%%
%% Exported Functions
%%
-export([init/2, work_start/0]).
%%
%% API Functions
%%
init(Log_Path, Process_Num) ->
Process_List = create_process_loop(Process_Num),
Wild_File_Name = " impression_log*.gz",
Full_Wild_File_Name = filename:join([Log_Path, Wild_File_Name]),
Search_File_List = case filelib:wildcard(Full_Wild_File_Name) of
[] ->
[];
[_H|_T] = File_Name_List ->
File_Name_List;
_ ->
[]
end,
dispatcher_work(Process_List, Search_File_List).
%lists:foreach(fun deal_file/1, Search_File_List).
create_process_loop(Process_Num) ->
[ {erlang:spawn(?MODULE, work_start, []), idle} || _X <- lists:seq(0, Process_Num - 1) ].
dispatcher_work([], []) ->
io:format("All Files done!!!~n");
dispatcher_work([{Pid, idle} | T], []) ->
Pid ! {self(), stop},
dispatcher_work(T ++ [{Pid, working}], []);
dispatcher_work([{Pid, idle} | T], [File_Name | File_List]) ->
Pid ! {self(), File_Name},
dispatcher_work(T ++ [{Pid, working}], File_List);
dispatcher_work([{_Pid, working} | _T] = Process_List, File_List) ->
receive
{Work_Pid, idle} ->
Remain_Process_List = lists:keydelete(Work_Pid, 1, Process_List),
dispatcher_work([{Work_Pid, idle} | Remain_Process_List], File_List);
{Work_Pid, stop} ->
io:format("stop ~p~n", [Work_Pid]),
dispatcher_work( lists:keydelete(Work_Pid, 1, Process_List), File_List)
end.
work_start() ->
receive
{From, stop} ->
From ! {self(), stop},
erlang:exit(normal);
{From, File_Name} ->
deal_file(File_Name),
From ! {self(), idle}
end,
work_start().
deal_file(GFile_Name) ->
%io:format("~p,~p~n", [self(), GFile_Name]),
DFile_Name = filename:join(filename:dirname(GFile_Name), filename:basename(GFile_Name, ".gz")),
{ok, Src_Data} = file:read_file(GFile_Name),
Dest = zlib:gunzip(Src_Data),
L = re:split(Dest, "[;\n]"),
{ok, FD} = file:open(DFile_Name, [write, append]),
parse_data(L, FD).
%%
%% Local Functions
%%
parse_data([_H], FD) ->
file:close(FD);
parse_data([], FD) ->
file:close(FD);
parse_data([_H1, H2|T], FD) when H2 =:= <<" valid">> ->
parse_data(T, FD);
parse_data([H1, H2|T], FD) when H2 =:= <<" unvalid">> ->
case check_play_type(H1) of
true ->
S = <<H1/bits, <<" ;valid">>/bits>>,
file:write(FD, S);
_ ->
ok
end,
parse_data(T, FD);
parse_data([_H1, _H2|T], FD) ->
parse_data(T, FD).
check_play_type(Input_Data) ->
{_, {_, _, _, _, _, _, _, {playerinfo, _, _, PlayType}}, _, _, _, _} = cupidlog_pb:decode_impression(base64:decode(Input_Data)),
case PlayType of
"ipad" ->
true;
_ ->
%io:format(" ~p,~p, ~p~n", [?FILE, ?LINE, PlayType]),
false
end.