package POEDaemon::EasyDBI::EventLog; use strict; use warnings FATAL => 'all'; no warnings 'redefine'; use POE; use POEDaemon; sub states { return $_[0], [qw( edbi_eventlog edbi_eventlog_result )]; } sub edbi_eventlog { my ($kernel, $args) = @_[KERNEL, ARG0]; unless (ref $args eq 'HASH' && ref $args->{event_args} eq 'HASH') { log_enabled && logline "error: event_direction = %s, event_args = %s", dumper_oneline($args->{event_direction}), dumper_oneline($args->{event_args}); return; } delete $args->{event_args}->{_stopwatch}; delete $args->{event_args}->{_start_time}; my (@columns, @values, @placeholders); foreach my $arg (qw(event_direction)) { push @columns, $arg; push @values, '?'; push @placeholders, $args->{$arg}; } foreach my $arg (keys %{$args->{event_args}}) { unless (defined $arg && $arg =~ /^\w+$/) { log_enabled && logline "invalid arg %s", dumper_oneline $arg; next; } my $value = $args->{event_args}->{$arg}; push @columns, $arg; push @values, $arg eq 'time' ? "TIMESTAMP WITH TIME ZONE 'EPOCH' + ? * INTERVAL '1 SECOND'" : '?'; push @placeholders, $value; } my $sql = sprintf "INSERT INTO events (%s) VALUES (%s)", join(', ', @columns), join(', ', @values); log_enabled && cfg->{log_sql_queries} && logline "sql = %s, placeholders = %s", dumper_oneline($sql), dumper_oneline(\@placeholders); $kernel->post(edbi => insert => { sql => $sql, placeholders => \@placeholders, event => 'edbi_eventlog_result', }); } sub edbi_eventlog_result { my $args = $_[ARG0]; if ($args->{error}) { log_enabled && logline "error: '%s'", $args->{error}; return; } } 1;