% 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)
[]->
[];
[_ 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)
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
"IPad"->
True;
_->
% IO: Format ("~ P ,~ P ,~ P ~ N ",[? File ,? Line, playtype]),
False
End.