маленький вопрос perl --> mysql

Discussion in 'Linux, Freebsd, *nix' started by diakon2, 23 Apr 2010.

  1. diakon2

    diakon2 Elder - Старейшина

    Joined:
    5 Jul 2008
    Messages:
    66
    Likes Received:
    2
    Reputations:
    0
    народ, не могу разобраться с парсеров в mysql (((
    есть лог фаил(входящие\исходящие звонки с атски), из него при помощи парсера создается массив, далее в другом скрипте из массива инфа попадает в переменные, потом в ячейки мускуля, одна из переменных никак не хочет лезть в мускуль...

    вот что в мускуле
    mysql> select * from calls;
    +---------------------+-----------+------------+------+------+-------------+----------+-------+
    | timeofcall | forwarded | internally | co | way | number | duration | cost |
    +---------------------+-----------+------------+------+------+-------------+----------+-------+
    | 0000-00-00 00:00:00 | 0 | 301 | 2 | 1 | 623 | 17 | 0.000 |
    | 0000-00-00 00:00:00 | 1 | 305 | 1 | 1 | 0 | 155 | 0.000 |
    | 0000-00-00 00:00:00 | 0 | 624 | 1 | 1 | 624 | 0 | 0.000 |
    | 0000-00-00 00:00:00 | 0 | 624 | 1 | 1 | 624 | 0 | 0.000 |
    | 0000-00-00 00:00:00 | 0 | 152 | 1 | 1 | 624 | 22 | 0.000 |
    | 0000-00-00 00:00:00 | 0 | 114 | 2 | 1 | 622 | 24 | 0.000 |
    | 0000-00-00 00:00:00 | 0 | 301 | 1 | 1 | 624 | 226 | 0.000 |
    | 0000-00-00 00:00:00 | 0 | 114 | 1 | 1 | 622 | 8 | 0.000 |
    | 0000-00-00 00:00:00 | 0 | 301 | 20 | 2 | 3320213 | 0 | 0.000 |

    все верно кроме 0000-00-00 00:00:00

    лог фаил
    ---- Site Name : BEREGKI ---------------------------------------------------------------
    NO STA CO TIME START DIALED ACT CNT COST ACCOUNT CODE
    ---- ----- --- -------- -------------- ------------------- --- ----- ----------- ------------
    3609 233 002 00:00:07 04/14/10 16:13 I625 RING 00:09
    3608 111 001 00:02:36 04/14/10 16:12 I625 RING 00:02
    3610 111 001 00:01:12 04/14/10 16:16 I625 RING 00:02
    3611 114 001 00:00:11 04/14/10 16:23 I622 RING 00:08
    3612 111 025 00:00:40 04/14/10 16:23 O3320213 ** 0 0
    3613 111 001 00:01:02 04/14/10 16:25 I625 RING 00:01
    3614 114 001 00:00:11 04/14/10 16:33 I622 RING 00:06
    3615 111 024 00:01:25 04/14/10 16:35 O3320289 ** 0 0

    парсер


    sub parsecurcalls() {
    while ($str=<PBX_DATA>)
    {
    $stringNumber++;
    if ($str =~ /(\d{4}) (.{5}) (\d{3}) (\d{2}:\d{2}:\d{2}) (\d{2}\/\d{2}\/\d{2}) (\d{2}:\d{2}) (.{20}) (.{2}) (.{5}) (.{11}) (.{12})/){
    unitecurcalls();
    }else{
    #print("$stringNumber\n");
    if ($vars{debug} =~ /yes/i){
    if ($str !~ /^$/){
    print $str;
    };
    };
    };
    };
    };

    sub unitecurcalls() {
    my $no=$1;
    my $sta=$2;
    my $co=$3;
    my $call_duration=$4;
    my $date=$5;
    my $time=$6;
    my $dialed_number=$7;
    my $act=$8;
    my $cnt=$9;
    my $cost=$10;
    my $account_code=$11;


    $co=int($co);
    $forwarded=0;

    if ($dialed_number=~/(\d+)/)
    {
    $number=$1;
    }
    else {
    $number=0;
    }

    if($dialed_number =~ /^[IG]/){
    $way='1';
    $forwarded=0;
    }
    elsif($dialed_number =~ /^O/){
    $way='2';
    $forwarded=0;
    }
    elsif($dialed_number =~ /^T/){
    $way='2';
    $forwarded=1;
    }
    elsif($dialed_number =~ /^t/){
    $way='1';
    $forwarded=1;
    }

    if ($date=~(/(\d{2})\/(\d{2})\/(\d{2})/)) {
    $Month=$2;
    $Day=$1;
    $Year=$3+2000;
    $timeofcall = "$Year-$Month-$Day $time:00";
    }

    if ($call_duration=~(/(\d{2}):(\d{2}):(\d{2})/)) {
    $duration = (($1*60*60)+($2*60)+$3);
    }


    if ($TimeOfCall ne ""){
    $callsCount++;
    }

    my $internally=int($sta);
    #print("$timeofcall, $forwarded, $internally, $co, $way, $number, $duration\n");
    WriteRecord($timeofcall, $forwarded, $internally, $co, $way, $number, $duration);
    };

    1;






    процедура записи в мускуль
    sub WriteRecord{
    my ($time_of_call, $fwd, $int, $co, $way, $number, $duration) = @_ ;
    ##$time_of_call="2010-02-03 10:10:10";
    my $query = "INSERT INTO calls ( timeofcall, forwarded, internally, co, way, number, duration ) VALUES (?, ?, ?, ?, ?, ?, ?)";
    my $sth = $dbh->prepare($query);
    $sth->execute($time_of_call, $fwd, $int, $co, $way, $number, $duration);
    if($sth->err){ # try to reconnect and send the query again
    $ERRORMESSAGE="\nError on sth->execute: ".$sth->errstr().", reconnecting\n";
    echoerrors();
    if(connecttodb()){
    my $sth = $dbh->prepare($query);
    $sth->execute($time_of_call, $fwd, $int, $co, $way, $number, $duration);
    if(!$sth->err) { # success
    return 0;
    }
    }

    если сделать так $time_of_call="2010-02-03 10:10:10"; то в мускуль все нормально пишется, ну в смысле чтото отличное от нулей ) в принципе руководству нужна статистика по дням , а когда именно - утром днем или вечером совершался звонок не принципиально, и я думаю на худой конец можно своять скрипт который будет останавливать atslog менять дату в этой строке, сохранять фаил и запускать atslog, вариант изощренный но других пока не вижу.

    у кого есть какие нибуть идеи ?