ASNMTAP

 view release on metacpan or  search on metacpan

lib/ASNMTAP/Asnmtap/Applications.pm  view on Meta::CPAN


sub DBI_connect {
  my ($database, $server, $port, $user, $passwd, $alarm, $DBI_error_trap, $DBI_error_trap_Arguments, $logger, $debug, $boolean_debug_all) = @_;

  $$logger->info(" IN: DBI_connect: port: $port - alarm: $alarm") if ( defined $$logger and $$logger->is_info() );

  # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

  sub _DBI_handle_error {
    my ($error, $dbh) = @_;

    no warnings;
    print "     _DBI_handle_error: $error\n";
    $$logger->error("     _DBI_handle_error: $error");
    use warnings;
  }

  # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

  my ($rv, $dbh, $alarmMessage) = 1;

  unless ( $alarm ) {
    $$logger->info("     DBI_connect: NO SIGNAL") if ( defined $$logger and $$logger->is_info() );

    if ( $boolean_debug_all ) {
      $dbh = DBIx::Log4perl->connect("dbi:mysql:$database:$server:$port", "$user", "$passwd", { RaiseError => 0, PrintError => 1, ShowErrorStatement => 1 } ) or $rv = $DBI_error_trap->(@{$DBI_error_trap_Arguments}, $logger, $debug);
      $dbh->dbix_l4p_getattr('dbix_l4p_logger'); # $$logger = $dbh->dbix_l4p_getattr('dbix_l4p_logger');
    } else {
      $dbh = DBI->connect("dbi:mysql:$database:$server:$port", "$user", "$passwd", { RaiseError => 1, PrintError => 0, ShowErrorStatement => 1 } ) or $rv = $DBI_error_trap->(@{$DBI_error_trap_Arguments}, $logger, $debug);
    }
  } else {
    $$logger->info("     DBI_connect: SIGNAL") if ( defined $$logger and $$logger->is_info() );

    use POSIX ':signal_h';
    my $DBI_CONNECT_ALARM_OFF = 0;
    my $_mask      = POSIX::SigAction->new ( SIGALRM ); # list of signals to mask in the handler
    my $_actionNew = POSIX::SigAction->new ( sub { $DBI_CONNECT_ALARM_OFF = $alarm; die "DBI_CONNECT_ALARM_OFF = $alarm\n"; }, $_mask );
    my $_actionOld = POSIX::SigAction->new ();
    sigaction ( SIGALRM, $_actionNew, $_actionOld );

    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    eval {
      $DBI_CONNECT_ALARM_OFF = 1;
      alarm($alarm);

      if ( $boolean_debug_all ) {
        $dbh = DBIx::Log4perl->connect("dbi:mysql:$database:$server:$port", "$user", "$passwd", { RaiseError => 0, PrintError => 1, ShowErrorStatement => 1 } ) or $rv = $DBI_error_trap->(@{$DBI_error_trap_Arguments}, $logger, $debug);
        $dbh->dbix_l4p_getattr('dbix_l4p_logger'); # $$logger = $dbh->dbix_l4p_getattr('dbix_l4p_logger');
      } else {
        $dbh = DBI->connect("dbi:mysql:$database:$server:$port", "$user", "$passwd", { RaiseError => 1, PrintError => 0, ShowErrorStatement => 1 } ) or $rv = $DBI_error_trap->(@{$DBI_error_trap_Arguments}, $logger, $debug);
      }

      alarm(0);
      $DBI_CONNECT_ALARM_OFF = 0;
    };

    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    alarm(0);
    sigaction( SIGALRM, $_actionOld ); # restore original signal handler

    if ( $DBI_CONNECT_ALARM_OFF ) {
      $dbh = undef;
      $rv = $DBI_error_trap->(@{$DBI_error_trap_Arguments}, $logger, $debug);
      $alarmMessage = "DBI_CONNECT_ALARM_OFF = $DBI_CONNECT_ALARM_OFF";
      $$logger->debug("     DBI_CONNECT_ALARM_OFF: Connection to '$database' timed out") if ( defined $$logger and $$logger->is_debug() );
    }
  }

  # set up error handling
  $dbh->{HandleError} = sub { _DBI_handle_error(@_) } if ( defined $dbh and $rv );

  $$logger->info('OUT: DBI_connect') if ( defined $$logger and $$logger->is_info() );
  return ($dbh, $rv, $alarmMessage);
}

# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

sub DBI_do {
  my ($rv, $dbh, $statement, $alarm, $DBI_error_trap, $DBI_error_trap_Arguments, $logger, $debug) = @_;

  $$logger->info(" IN: DBI_do: rv: $rv - alarm: $alarm") if ( defined $$logger and $$logger->is_info() );
  my ($affected, $alarmMessage) = (0);

  if ( $rv ) {
    unless ( $alarm ) {
      $$logger->info("     DBI_do: NO SIGNAL") if ( defined $$logger and $$logger->is_info() );
      $affected = $$dbh->do($statement) or $rv = $DBI_error_trap->(@{$DBI_error_trap_Arguments}, $logger, $debug);
    } else {
      $$logger->info("     DBI_do: SIGNAL") if ( defined $$logger and $$logger->is_info() );

      use POSIX ':signal_h';
      my $DBI_DO_ALARM_OFF = 0;
      my $_mask      = POSIX::SigAction->new ( SIGALRM ); # list of signals to mask in the handler
      my $_actionNew = POSIX::SigAction->new ( sub { $DBI_DO_ALARM_OFF = $alarm; die "DBI_DO_ALARM_OFF = $alarm\n"; }, $_mask );
      my $_actionOld = POSIX::SigAction->new ();
      sigaction ( SIGALRM, $_actionNew, $_actionOld );

      # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

      eval {
        $DBI_DO_ALARM_OFF = 1;
        alarm($alarm);
        $affected = $$dbh->do($statement) or $rv = $DBI_error_trap->(@{$DBI_error_trap_Arguments}, $logger, $debug);
        alarm(0);
        $DBI_DO_ALARM_OFF = 0;
      };

      # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

      alarm(0);
      sigaction( SIGALRM, $_actionOld ); # restore original signal handler

      if ( $DBI_DO_ALARM_OFF ) {
        $rv = $DBI_error_trap->(@{$DBI_error_trap_Arguments}, $logger, $debug);
        $alarmMessage = "DBI_DO_ALARM_OFF = $DBI_DO_ALARM_OFF";
        $$logger->debug("     DBI_DO_ALARM_OFF: dbh->do timed out") if ( defined $$logger and $$logger->is_debug() );
      }
    }
  }

  $$logger->info("OUT: DBI_do") if ( defined $$logger and $$logger->is_info() );
  return ( $rv, $alarmMessage, $affected );
}

# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

sub DBI_execute {
  my ($rv, $sth, $alarm, $DBI_error_trap, $DBI_error_trap_Arguments, $logger, $debug) = @_;

  $$logger->info(" IN: DBI_execute: rv: $rv - alarm: $alarm") if ( defined $$logger and $$logger->is_info() );
  my $alarmMessage;

  if ( $rv ) {
    unless ( $alarm ) {
      $$logger->info("     DBI_execute: NO SIGNAL") if ( defined $$logger and $$logger->is_info() );
      $$sth->execute() or $rv = $DBI_error_trap->(@{$DBI_error_trap_Arguments}, $logger, $debug);
    } else {
      $$logger->info("     DBI_execute: SIGNAL") if ( defined $$logger and $$logger->is_info() );

      use POSIX ':signal_h';
      my $DBI_EXECUTE_ALARM_OFF = 0;
      my $_mask      = POSIX::SigAction->new ( SIGALRM ); # list of signals to mask in the handler
      my $_actionNew = POSIX::SigAction->new ( sub { $DBI_EXECUTE_ALARM_OFF = $alarm; die "DBI_EXECUTE_ALARM_OFF = $alarm\n"; }, $_mask );
      my $_actionOld = POSIX::SigAction->new ();
      sigaction ( SIGALRM, $_actionNew, $_actionOld );

      # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

      eval {
        $DBI_EXECUTE_ALARM_OFF = 1;
        alarm($alarm);
        $$sth->execute() or $rv = $DBI_error_trap->(@{$DBI_error_trap_Arguments}, $logger, $debug);
        alarm(0);
        $DBI_EXECUTE_ALARM_OFF = 0;
      };

      # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

      alarm(0);
      sigaction( SIGALRM, $_actionOld ); # restore original signal handler

      if ( $DBI_EXECUTE_ALARM_OFF ) {
        $rv = $DBI_error_trap->(@{$DBI_error_trap_Arguments}, $logger, $debug);
        $alarmMessage = "DBI_EXECUTE_ALARM_OFF = $DBI_EXECUTE_ALARM_OFF";
        $$logger->debug("     DBI_EXECUTE_ALARM_OFF: sth->execute timed out") if ( defined $$logger and $$logger->is_debug() );
      }
    }
  }

  $$logger->info("OUT: DBI_execute") if ( defined $$logger and $$logger->is_info() );
  return ( $rv, $alarmMessage );
}

# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

sub DBI_error_trap {
  my ($EMAILREPORT, $error_message, $logger, $debug) = @_;

  use Scalar::Util qw(openhandle);
  my $error = "  > DBI Error:\n" .$error_message. "\nERROR: $DBI::err ($DBI::errstr)\n";
  if ( ! $debug and defined $EMAILREPORT and openhandle($EMAILREPORT) ) { print $EMAILREPORT $error; } else { print $error; }
  $$logger->info("DBI Error:" .$error_message. "ERROR: $DBI::err ($DBI::errstr)") if ( defined $$logger and $$logger->is_info() );
  return 0;
}

# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =

sub LOG_init_log4perl {
  my ($item, $config, $boolean_debug_all) = @_;

  my $logger;

  if ( $boolean_debug_all ) {
    eval {
      use Log::Log4perl qw(get_logger);
      use DBIx::Log4perl;

      if ( -e "$APPLICATIONPATH/log4perl.cnf" ) {
        Log::Log4perl->init_and_watch("$APPLICATIONPATH/log4perl.cnf", 'HUP');
      } else {
        my $log4perl_cnf;

        if ( defined $config ) {
          $log4perl_cnf = $config;
        } else {
          $log4perl_cnf = qq(
            log4perl.logger                       = TRACE, LOGFILE, LOGSCREEN

            log4perl.appender.LOGFILE             = Log::Log4perl::Appender::File
            log4perl.appender.LOGFILE.filename    = $LOGPATH/root.log
            log4perl.appender.LOGFILE.mode        = append
            log4perl.appender.LOGFILE.Threshold   = ERROR
            log4perl.appender.LOGFILE.layout      = PatternLayout
            log4perl.appender.LOGFILE.layout.ConversionPattern = [%d] %F %L %c - %m%n

            log4perl.appender.LOGSCREEN           = Log::Log4perl::Appender::Screen
            log4perl.appender.LOGSCREEN.stderr    = 0
            log4perl.appender.LOGSCREEN.layout    = PatternLayout
            log4perl.appender.LOGSCREEN.layout.ConversionPattern = [%d] %F %L %c - %m%n



( run in 0.508 second using v1.01-cache-2.11-cpan-39bf76dae61 )