使用哈希将代码转换为数组 [英] Converting code using hash to array

查看:72
本文介绍了使用哈希将代码转换为数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我负责提高Perl模块的效率。它接受当前由日期和服务器名称唯一标识的日志条目,并将它们插入我们的mysql数据库中,以便以后处理。

I am charged with making a Perl module more efficient. It takes log entries which are currently uniquely identified by date and server name and inserts them into our mysql database for later processing.

我已经在下面发布了原始文件和我的尝试。我的代码未插入数据库。我确定这是一个简单的数组处理问题,但不确定。

I've posted the original file and my attempt below. My code doesn't insert into the database. I'm sure its a simple array handling problem but not sure.

package UlsaSpectrumAnalyser;

use strict;
use warnings;

use Data::Dumper;
use EnmServiceGroup;
use StatsDB;
use DBI;
use StatsTime;

sub new
{
    my $klass = shift;
    my $self = bless {}, $klass;
    return $self;
}

sub init($$$$)
{
    my ($self,$r_cliArgs,$r_incr,$dbh) = @_;
    $self->{'site'} = $r_cliArgs->{'site'};
    $self->{'siteId'} = $r_cliArgs->{'siteId'};
    $self->{'date'} = $r_cliArgs->{'date'};
    if ( exists $r_incr->{'UlsaSpectrumAnalyser'} )
    {
        $self->{'r_UlsaSpectrumAnalyser'} = $r_incr->{'UlsaSpectrumAnalyser'}->{'r_UlsaSpectrumAnalyser'};
    }
    else
    {
        $self->{'r_UlsaSpectrumAnalyser'} = {};
    }

    my @subscriptions = ();
    $self->{'serverMap'} = {};
    foreach my $service( "pmservice", "saservice" ) {
        my $r_serverMap = enmGetServiceGroupInstances($self->{'site'}, $self->{'date'},$service);
        while ( my ($server,$serverId) = each %{$r_serverMap} ) {
            push ( @subscriptions, {'server' => $server, 'prog' => 'JBOSS'} );
            $self->{'serverMap'}->{$server} = $serverId;
        }
    }
    return \@subscriptions;
}

sub handle($$$$$$$)
{
    my ($self,$timestamp,$host,$program,$severity,$message,$messageSize) = @_;
    if ( $::DEBUG > 9 ) { print "UlsaSpectrumAnalyser::handle got message from $host $program : $message\n"; }

    # Skip any warnings/errors
    if ( $severity ne 'info' ) {
        return;
    }

    my ($time)=$timestamp=~/(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}).*/;
    my ($epochtime) = getDateTimeInMilliSeconds($timestamp);
    if ( $::DEBUG > 3 ) { print "UlsaSpectrumAnalyser::handle got message from $time $host $program : $message\n"; }

    #Sample Log
    #2017-09-08 14:55:36,028 INFO [com.X.Y.itpf.EVENT_LOGGER] (ajp-executor-threads - 18) [administrator, Spectrum Analyzer, DETAILED, #ULSA_COMPONENT_FFT, MeContext=lienb4003, Samples=65510; FileParsingTime(ms)=50; FastFourierTime(ms)=370; PostProcessingTime(ms)=3; #ChartScalingTime(ms)=1; TotalTime(ms)=424]

    if( $message =~ /.*ULSA_COMPONENT_FFT,\s+(\S+),\s+Samples=(\d+);\s+FileParsingTime\S+=(\d+);\s+FastFourierTime\S+=(\d+);\s+PostProcessingTime\S+=(\d+);\s+ChartScalingTime\S+=(\d+);\s+TotalTime\S+=(\d+)]/ ) {

       my $activity = $epochtime . '@@' . $host;  #TODO Handle array instead of hash. Working on separately
       my $serverid = $self->{'serverMap'}->{$host};
       $self->{'r_UlsaSpectrumAnalyser'}->{$activity} = {
               'time'                  => $time,
               'epochtime'             => $epochtime,
               'serverid'              => $serverid,
               'source'                => $1,
               'sample'                => $2,
               'file_parsing_time'     => $3,
               'fast_fourier_time'     => $4,
               'post_processing_time'  => $5,
               'chart_scaling_time'    => $6,
               'total_time'            => $7};
    }

}

sub handleExceeded($$$)
{
    my ($self, $host, $program) = @_;
}

sub done($$$)
{
    my ($self,$dbh,$r_incr) = @_;
    my $tmpDir = '/data/tmp';
    my $date=$self->{'date'};
    if (exists $ENV{'TMP_DIR'})
    {
        $tmpDir = $ENV{'TMP_DIR'};
    }
    my $bcpFileUlsaAnalyserLogs = "$tmpDir/ulsa_spectrum_analyser_logs.bcp";
    open (BCP, "> $bcpFileUlsaAnalyserLogs") or die "Failed to open $bcpFileUlsaAnalyserLogs";

    foreach my $activity (sort keys %{$self->{'r_UlsaSpectrumAnalyser'}}) {

       print BCP $self->{'siteId'} . "\t" .
           $self->{'r_UlsaSpectrumAnalyser'}->{$activity}->{'serverid'} . "\t" .
           $self->{'r_UlsaSpectrumAnalyser'}->{$activity}->{'time'} . "\t" .
           $self->{'r_UlsaSpiUectrumAnalyser'}->{$activity}->{'epochtime'} . "\t" .
           $self->{'r_UlsaSpectrumAnalyser'}->{$activity}->{'source'} . "\t" .
           $self->{'r_UlsaSpectrumAnalyser'}->{$activity}->{'sample'} . "\t" .
           $self->{'r_UlsaSpectrumAnalyser'}->{$activity}->{'file_parsing_time'} . "\t" .
           $self->{'r_UlsaSpectrumAnalyser'}->{$activity}->{'fast_fourier_time'} . "\t" .
           $self->{'r_UlsaSpectrumAnalyser'}->{$activity}->{'post_processing_time'} . "\t" .
           $self->{'r_UlsaSpectrumAnalyser'}->{$activity}->{'chart_scaling_time'} . "\t" .
           $self->{'r_UlsaSpectrumAnalyser'}->{$activity}->{'total_time'} . "\n";
    }
    close BCP;
    dbDo( $dbh, "DELETE FROM enm_ulsa_spectrum_analyser_logs  WHERE siteid = $self->{'siteId'} AND time BETWEEN '$date 00:00:00' AND '$date 23:59:59'" )
    or die "Failed to delete from enm_ulsa_spectrum_analyser_logs" . $dbh->errstr;

    dbDo( $dbh, "LOAD DATA INFILE '$bcpFileUlsaAnalyserLogs' INTO TABLE enm_ulsa_spectrum_analyser_logs" )
    or die "Failed to load new data from '$bcpFileUlsaAnalyserLogs' file to 'enm_ulsa_spectrum_analyser_logs' table" . $dbh->errstr;
    unlink($bcpFileUlsaAnalyserLogs);

    $r_incr->{'UlsaSpectrumAnalyser'} = {
                                 'r_UlsaSpectrumAnalyser' => $self->{'r_UlsaSpectrumAnalyser'}
                                 };
}

1;



我的尝试



My attempt

package UlsaSpectrumAnalyser;

use strict;
use warnings;

use Data::Dumper;
use StatsDB;
use DBI;
use StatsTime;

sub new
{
    my $klass = shift;
    my $self = bless {}, $klass;
    return $self;
}

sub init($$$$)
{
    my ($self,$r_cliArgs,$r_incr,$dbh) = @_;
    $self->{'site'} = $r_cliArgs->{'site'};
    $self->{'siteId'} = $r_cliArgs->{'siteId'};
    $self->{'date'} = $r_cliArgs->{'date'};
    $self->{'r_instrDataEvent'}->{'ulsaStats'} = [];


    my @subscriptions = ();
    $self->{'serverMap'} = {};
    foreach my $service( "pmservice", "saservice" ) {
        my $r_serverMap = enmGetServiceGroupInstances($self->{'site'}, $self->{'date'},$service);
        while ( my ($server,$serverId) = each %{$r_serverMap} ) {
            push ( @subscriptions, {'server' => $server, 'prog' => 'JBOSS'} );
            $self->{'serverMap'}->{$server} = $serverId;
        }
    }
    return \@subscriptions;
}

sub handle($$$$$$$)
{
    my ($self,$timestamp,$host,$program,$severity,$message,$messageSize) = @_;
    if ( $::DEBUG > 9 ) { print "UlsaSpectrumAnalyser::handle got message from $host $program : $message\n"; }

    # Skip any warnings/errors
    if ( $severity ne 'info' ) {
        return;
    }

    my ($time)=$timestamp=~/(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}).*/;
    my ($epochtime) = getDateTimeInMilliSeconds($timestamp);
    if ( $::DEBUG > 3 ) { print "UlsaSpectrumAnalyser::handle got message from $time $host $program : $message\n"; }

    #Sample Log
    #2017-09-08 14:55:36,028 INFO [com.X.y.itpf.EVENT_LOGGER] (ajp-executor-threads - 18) [administrator, Spectrum Analyzer, DETAILED, #ULSA_COMPONENT_FFT, MeContext=lienb4003, Samples=65510; FileParsingTime(ms)=50; FastFourierTime(ms)=370; PostProcessingTime(ms)=3; #ChartScalingTime(ms)=1; TotalTime(ms)=424]

    if( $message =~ /.*ULSA_COMPONENT_FFT,\s+(\S+),\s+Samples=(\d+);\s+FileParsingTime\S+=(\d+);\s+FastFourierTime\S+=(\d+);\s+PostProcessingTime\S+=(\d+);\s+ChartScalingTime\S+=(\d+);\s+TotalTime\S+=(\d+)]/ ) {
        my $serverid = $self->{'r_instrDataEvent'}->{'serverid'};
        my %event = (
            'time'                 => $time,
            'epochtime'            => $epochtime,
            'serverid'             => $serverid,
            'source'               => $1,
            'sample'               => $2,
            'file_parsing_time'    => $3,
            'fast_fourier_time'    => $4,
            'post_processing_time' => $5,
            'chart_scaling_time'   => $6,
            'total_time'           => $7
        );
        push @{$self->{'r_instrDataEvent'}->{'ulsaStats'}}, \%event;
    }
}

sub handleExceeded($$$)
{
    my ($self, $host, $program) = @_;
}

sub done($$$)
{
    my ($self,$dbh,$r_incr) = @_;

    my $bcpFileUlsaAnalyserLogs = getBcpFilename("enm_ulsa_spectrum_analyser_logs ");
    open (BCP, "> $bcpFileUlsaAnalyserLogs") or die "Failed to open $bcpFileUlsaAnalyserLogs";

    foreach my $activity (@{$self->{'r_instrDataEvent'}->{'ulsaStats'}}) {

       print BCP $self->{'siteId'} . "\t" .
           $activity->{'serverid'} . "\t" .
           $activity->{'time'} . "\t" .
           $activity->{'epochtime'} . "\t" .
           $activity->{'source'} . "\t" .
           $activity->{'sample'} . "\t" .
           $activity->{'file_parsing_time'} . "\t" .
           $activity->{'fast_fourier_time'} . "\t" .
           $activity->{'post_processing_time'} . "\t" .
           $activity->{'chart_scaling_time'} . "\t" .
           $activity->{'total_time'} . "\n";
    }
    close BCP;

    dbDo( $dbh, sprintf("DELETE FROM enm_ulsa_spectrum_analyser_logs  WHERE siteid = %d AND time BETWEEN '%s' AND '%s'",
    $self->{'siteId'}, $self->{'r_instrDataEvent'}->{'ulsaStats'}->[0]->{'epochtime'},$self->{'r_instrDataEvent'}->{'ulsaStats'}->[$#{$self->{'r_instrDataEvent'}->{'ulsaStats'}}]->{'epochtime'}))
    or die "Failed to delete from enm_ulsa_spectrum_analyser_logs" . $dbh->errstr;#'

    dbDo( $dbh, "LOAD DATA INFILE '$bcpFileUlsaAnalyserLogs' INTO TABLE enm_ulsa_spectrum_analyser_logs" )
    or die "Failed to load new data from '$bcpFileUlsaAnalyserLogs' file to 'enm_ulsa_spectrum_analyser_logs' table" . $dbh->errstr;
}

1;


推荐答案

我要说的是问题

my $bcpFileUlsaAnalyserLogs = getBcpFilename( "enm_ulsa_spectrum_analyser_logs " )

我怀疑文件名的末尾是否真的有空格!

I doubt if the file name really has a space at the end!

我很惊讶您的 dbDo 或至少您的

I'm surprised that your dbDo or at least your

or die "Failed to load new data ... "

没有发现并报告。我不喜欢将 DBI 代码包装在子例程中,尤其是当我看不到这些子例程时。

didn't catch this and report it. I don't like wrapping DBI code inside subroutines, especially when I can't see those subroutines.

注意还应该使用 placeholders

dbDo( $dbh, sprintf("DELETE FROM enm_ulsa_spectrum_analyser_logs  WHERE siteid = %d AND time BETWEEN '%s' AND '%s'",
$self->{'siteId'}, $self->{'r_instrDataEvent'}->{'ulsaStats'}->[0]->{'epochtime'},$self->{'r_instrDataEvent'}->{'ulsaStats'}->[$#{$self->{'r_instrDataEvent'}->{'ulsaStats'}}]->{'epochtime'}))
or die "Failed to delete from enm_ulsa_spectrum_analyser_logs" . $dbh->errstr;#'

会比

my $sth = $dbh->prepare(<<END_SQL);
DELETE FROM enm_ulsa_spectrum_analyser_logs
WHERE siteid = ? AND time BETWEEN ? AND ?
END_SQL

my $ulsa_stats = $self->{r_instrDataEvent}{ulsaStats};

$sth->execute(
    $self->{siteId},
    $ulsa_stats->[0]{epochtime}, 
    $ulsa_stats->[-1]{epochtime}
) or die "Failed to delete from enm_ulsa_spectrum_analyser_logs: " . $dbh->errstr;

这篇关于使用哈希将代码转换为数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆