~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to plugin/query_log/tests/check-query-log-attribute.pl

  • Committer: Mark Atwood
  • Date: 2011-08-01 05:22:14 UTC
  • mfrom: (1919.3.53 drizzle_pbms)
  • Revision ID: me@mark.atwood.name-20110801052214-3wdsx3xgld6b5v4f
mergeĀ lp:~barry-leslie/drizzle/drizzle_pbms

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#!/usr/bin/env perl
2
 
 
3
 
use strict;
4
 
use warnings;
5
 
use English qw(-no_match_vars);
6
 
 
7
 
my ($file, $attrib, $cmp, $val, $val2) = @ARGV;
8
 
if ( !$file || !$attrib ) {
9
 
   warn "Usage: check-query-log-values.pl FILE ATTRIBUTE [CMP VALUE [VALUE]]\n";
10
 
   exit 1;
11
 
}
12
 
 
13
 
# Slurp the file.  There should be only 1 event.
14
 
open my $fh, "<", $file or die "Cannot open $file: $OS_ERROR";
15
 
my $event_text = '';
16
 
{
17
 
   local $INPUT_RECORD_SEPARATOR = "\n#\n";
18
 
   while ( defined(my $event = <$fh>) ) {
19
 
      $event_text = $event;
20
 
   }
21
 
}
22
 
close $fh;
23
 
my @event_lines = split /\n/, $event_text;
24
 
 
25
 
my $event = parse_event(@event_lines);
26
 
 
27
 
my @attribs = split /,/, $attrib;
28
 
my @vals    = split /,/, $val if $val;
29
 
my @vals2   = split /,/, $val2 if $val2;
30
 
 
31
 
if ( $val ) {
32
 
   die "The number of ATTRIBUTEs and VALUEs does not match"
33
 
      if $#attribs != $#vals;
34
 
}
35
 
 
36
 
print "Checking attributes and values of query $event->{arg}\n";
37
 
 
38
 
for my $i (0..$#attribs) {
39
 
   my $attrib = lc $attribs[$i];
40
 
   my $val    = $vals[$i];
41
 
   my $val2   = $vals2[$i];
42
 
 
43
 
   if ( $attrib eq 'all' ) {
44
 
      dump_event($event);
45
 
   }
46
 
   else {
47
 
      die "A CMP argument is required if ATTRIBUTE is not ALL"
48
 
         unless $cmp;
49
 
      die "A VALUE argument is required if ATTRIBUTE is not ALL"
50
 
         unless defined $val;
51
 
 
52
 
      print "ERROR: attribute $attrib does not exist.\n"
53
 
         unless exists $event->{$attrib};
54
 
 
55
 
      $cmp = lc $cmp;
56
 
 
57
 
      my $ok = 0;
58
 
      my $event_val = $event->{$attrib};
59
 
      if ( $cmp eq '=' || $cmp eq 'equals' ) {
60
 
         $ok = 1 if defined $event_val && $event_val eq $val;
61
 
      }
62
 
      elsif ( $cmp eq 'matches' ) {
63
 
         $ok = 1 if defined $event_val && $event_val =~ m/$val/;
64
 
      }
65
 
      elsif ( $cmp eq 'between' ) {
66
 
         die "I need a second VALUE argument if CMP is BETWEEN"
67
 
            unless $val2;
68
 
         $ok = 1 if defined $event_val
69
 
            && $val <= $event_val && $event_val <= $val2;
70
 
      }
71
 
      else {
72
 
         die "Unknown CMP: $cmp";
73
 
      }
74
 
 
75
 
      if ( $ok ) {
76
 
         # Don't print the matches pattern becaues it's probably some
77
 
         # variable value like a timestamp.
78
 
         print "$attrib value $cmp "
79
 
            . ($cmp eq 'matches' ? "" : "$val ")
80
 
            . ($cmp eq 'between' ? "and $val2 " : "")
81
 
            . "OK\n";
82
 
      }
83
 
      else {
84
 
         print "$attrib value $event_val does not '$cmp' $val"
85
 
            . ($cmp eq 'between' ? " and $val2" : "") . "\n"
86
 
            . "Event dump:\n";
87
 
         dump_event($event);
88
 
      }
89
 
   }
90
 
}
91
 
 
92
 
sub parse_event {
93
 
   my (@event_lines) = @_;
94
 
   die "I need a event_lines argument" unless @event_lines;
95
 
 
96
 
   my $rs = pop @event_lines;
97
 
   if ( $rs ne "#" ) {
98
 
      print "ERROR: Event does not end with the # record separator.\n";
99
 
   }
100
 
 
101
 
   my @props;
102
 
   my $arg = '';
103
 
   my $lineno = 1;
104
 
   foreach my $line ( @event_lines ) { 
105
 
      next if $line =~ m/^$/;
106
 
      if ( $lineno == 1 ) { # timestamp
107
 
         push @props, 'ts', $line =~ m/^# (\S+)/;
108
 
      }
109
 
      elsif ( $lineno >= 2 && $lineno <= 4 ) { # ints, floats and bools
110
 
         push @props, $line =~ m/([a-z_]+)=(\S+)/g;
111
 
      }
112
 
      elsif ( $lineno == 5 ) { # strings
113
 
         push @props, $line =~ m/([a-z_]+)="([^"]*)"/;
114
 
      }
115
 
      else { # query
116
 
         $arg .= $line;
117
 
      }
118
 
      $lineno++;
119
 
   }
120
 
 
121
 
   chomp $arg;
122
 
   push @props, 'arg', $arg;
123
 
 
124
 
   my $event = { @props };
125
 
 
126
 
   return $event;
127
 
}
128
 
 
129
 
sub dump_event {
130
 
   my ($event) = @_;
131
 
   foreach my $attrib ( sort keys %$event ) {
132
 
      print "$attrib=$event->{$attrib}\n";
133
 
   }
134
 
}