--- trunk/bin/irc-logger.pl 2007/09/29 13:13:41 67 +++ trunk/bin/irc-logger.pl 2007/09/29 14:11:55 68 @@ -76,6 +76,7 @@ use URI::Escape; use Data::Dump qw/dump/; use DateTime::Format::ISO8601; +use Carp qw/confess/; my $use_twitter = 1; eval { require Net::Twitter; }; @@ -88,6 +89,10 @@ 'log:s' => \$log_path, ); +$SIG{__DIE__} = sub { + confess "fatal error"; +}; + open(STDOUT, '>', $log_path) || warn "can't redirect log to $log_path: $!"; sub _log { @@ -230,14 +235,16 @@ sub get_from_log { my $args = {@_}; - $args->{fmt} ||= { - date => '[%s] ', - time => '{%s} ', - time_channel => '{%s %s} ', - nick => '%s: ', - me_nick => '***%s ', - message => '%s', - }; + if ( ! $args->{fmt} ) { + $args->{fmt} = { + date => '[%s] ', + time => '{%s} ', + time_channel => '{%s %s} ', + nick => '%s: ', + me_nick => '***%s ', + message => '%s', + }; + } my $sql_message = qq{ select @@ -261,39 +268,48 @@ my $sql = $context ? $sql_context : $sql_message; sub check_date { - my $date = shift; - $date = eval { DateTime::Format::ISO8601->parse_datetime( $args->{date} )->ymd; }; + my $date = shift || return; + my $new_date = eval { DateTime::Format::ISO8601->parse_datetime( $date )->ymd; }; if ( $@ ) { - warn "invalid date ", $args->{date}, $/; - $date = DateTime->now->ymd; + warn "invalid date $date\n"; + $new_date = DateTime->now->ymd; } - return $date; + return $new_date; } - $sql .= " where message ilike ? or nick ilike ? " if ($args->{search}); - $sql .= " where id in (" . join(",", @{ $tags->{ $args->{tag} } }) . ") " if ($args->{tag} && $tags->{ $args->{tag} }); - if ($args->{date}) { - $sql .= " where date(time) = ? "; - $args->{date} = check_date( $args->{date} ); - } - $sql .= " order by log.time desc"; - $sql .= " limit " . $args->{limit} if ($args->{limit}); + my @where; + my @args; - my $sth = $dbh->prepare( $sql ); if (my $search = $args->{search}) { $search =~ s/^\s+//; $search =~ s/\s+$//; - $sth->execute( ( '%' . $search . '%' ) x 2 ); - _log "search for '$search' returned ", $sth->rows, " results ", $context || ''; - } elsif (my $tag = $args->{tag}) { - $sth->execute(); - _log "tag '$tag' returned ", $sth->rows, " results ", $context || ''; - } elsif (my $date = $args->{date}) { - $sth->execute( check_date($date) ); - _log "found ", $sth->rows, " messages for date $date ", $context || ''; - } else { - $sth->execute(); + push @where, 'message ilike ? or nick ilike ?'; + push @args, ( ( '%' . $search . '%' ) x 2 ); + _log "search for '$search'"; + } + + if ($args->{tag} && $tags->{ $args->{tag} }) { + push @where, 'id in (' . join(',', @{ $tags->{ $args->{tag} } }) . ')'; + _log "search for tags $args->{tag}"; } + + if (my $date = $args->{date} ) { + $date = check_date( $date ); + push @where, 'date(time) = ?'; + push @args, $date; + _log "search for date $date"; + } + + $sql .= " where " . join(" and ", @where) if @where; + + $sql .= " order by log.time desc"; + $sql .= " limit " . $args->{limit} if ($args->{limit}); + + #warn "### sql: $sql ", dump( @args ); + + my $sth = $dbh->prepare( $sql ); + $sth->execute( @args ); + my $last_row = { date => '', time => '', @@ -954,10 +970,10 @@ } else { $html .= join("

", get_from_log( - limit => $q->param('last') || $q->param('date') ? undef : 100, + limit => ( $q->param('last') || $q->param('date') ) ? undef : 100, search => $search || undef, tag => $q->param('tag') || undef, - date => check_date( $q->param('date') ), + date => $q->param('date') || undef, fmt => { date => sub { my $date = shift || return;