Task7/create_log_in_table/process_log.pl

128 lines
3 KiB
Perl
Raw Normal View History

2023-11-08 14:23:03 +03:00
# импорт базовых библиотек
use strict;
use warnings;
use utf8;
use v5.28;
# настройка модулей библиотек
use open qw( :std :encoding(UTF-8) );
# импорт внешних библиотек
use DBI;
# импорт конкрентых модулей внешних библиотек
use Data::Dumper;
# ------------------- Общие параметры ---------------------------
my $dbi_info = 'dbi:Pg:dbname=postgres;host=localhost;port=5432';
my $db_username = 'postgres';
my $db_password = '0000';
my $insert_log_template =
'INSERT INTO log (created,int_id,str,address) values (?,?,?,?)';
my $insert_message_template =
'INSERT INTO message (created,id,int_id,str) values (?,?,?,?)';
my $regex_for_get_id = qr( id=(\S*) ?);
my $regex_get_address_for_log_with_blackhol = qr( \<(.*\@.*)\> );
my $regex_get_address_for_log_without_blackhol = qr( (\S*\@\S*) );
my $file_path = "log/out";
# ------------------- ------------- ---------------------------
sub _get_id {
my $str = shift;
if ( $str =~ /$regex_for_get_id/ ) {
return $1;
}
return;
}
sub _get_address {
my $str = shift;
if ( $str =~ /:blackhole:/ ) {
$str =~ /$regex_get_address_for_log_with_blackhol/;
return $1;
}
else {
$str =~ /$regex_get_address_for_log_without_blackhol/;
return $1;
}
}
sub _parce_row_log {
my $row = shift;
chomp($row);
my @s_row = split( " ", $row );
my $created = join( " ", @s_row[ 0, 1 ] );
my $int_id = $s_row[2];
my $str = join( " ", @s_row[ 2 ... $#s_row ] );
my $flag = $s_row[3];
return $created, $int_id, $str, $flag;
}
sub create_row_in_table_log {
my ( $dbh, $created, $int_id, $str ) = @_;
my $address = _get_address($str);
$dbh->do( $insert_log_template, undef,
( $created, $int_id, $str, $address ) );
return 1;
}
sub create_row_in_table_message {
my ( $dbh, $created, $int_id, $str ) = @_;
my $id = _get_id($str);
if ($id) {
$dbh->do( $insert_message_template, undef,
( $created, $id, $int_id, $str ) );
}
else {
my $address = _get_address($str);
$dbh->do( $insert_log_template, undef,
( $created, $int_id, $str, $address ) );
}
return 1;
}
sub process_log {
my ( $dbh, $path_to_log ) = @_;
open( my $fh, "<:encoding(UTF-8)", $path_to_log )
or die "We can't open file: ", $!;
while ( my $row = <$fh> ) {
my ( $created, $int_id, $str, $flag ) = _parce_row_log($row);
if ( $flag eq "<=" ) {
create_row_in_table_message( $dbh, $created, $int_id, $str );
}
else {
create_row_in_table_log( $dbh, $created, $int_id, $str );
}
}
return 1;
}
my $dbh = DBI->connect( $dbi_info, $db_username, $db_password,
{ postgres_enable_utf8 => 1, RaiseError => 1 } );
print( process_log( $dbh, $file_path ) );
exit(0);