/[BackupPC]/trunk/lib/BackupPC/SearchLib.pm
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /trunk/lib/BackupPC/SearchLib.pm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 31 by dpavlin, Sun Jul 31 16:16:55 2005 UTC revision 86 by dpavlin, Sun Aug 28 12:35:59 2005 UTC
# Line 5  use strict; Line 5  use strict;
5  use BackupPC::CGI::Lib qw(:all);  use BackupPC::CGI::Lib qw(:all);
6  use BackupPC::Attrib qw(:all);  use BackupPC::Attrib qw(:all);
7  use DBI;  use DBI;
8    use DateTime;
9  use vars qw(%In $MyURL);  use vars qw(%In $MyURL);
10    use Time::HiRes qw/time/;
11    
12  my $on_page = 100;  my $on_page = 100;
13  my $pager_pages = 10;  my $pager_pages = 10;
14    
15    my $dsn = $Conf{SearchDSN};
16    my $db_user = $Conf{SearchUser} || '';
17    
18    my $index_path = $Conf{HyperEstraierIndex};
19    if ($index_path) {
20            $index_path = $TopDir . '/' . $index_path;
21            $index_path =~ s#//#/#g;
22    }
23    
24    my $dbh;
25    
26    sub get_dbh {
27            $dbh ||= DBI->connect($dsn, $db_user, "", { RaiseError => 1, AutoCommit => 1 } );
28            return $dbh;
29    }
30    
31  sub getUnits() {  sub getUnits() {
32      my @ret = ();          my @ret;
33      my $tmp;  
34      my $dbh = DBI->connect( "dbi:SQLite:dbname=${TopDir}/$Conf{SearchDB}",          my $dbh = get_dbh();
35          "", "", { RaiseError => 1, AutoCommit => 1 } );          my $sth = $dbh->prepare(qq{
36      my $st =                  SELECT
37        $dbh->prepare(                          shares.id       as id,
38          " SELECT shares.ID AS ID, shares.share AS name FROM shares;");                          hosts.name || ':' || shares.name as share
39      $st->execute();                  FROM shares
40      push (@ret, { 'ID' => '', 'name' => '-'});                  JOIN hosts on hostid = hosts.id
41      while ( $tmp = $st->fetchrow_hashref() ) {                  ORDER BY share
42          push( @ret, { 'ID' => $tmp->{'ID'}, 'name' => $tmp->{'name'} } );          } );
43      }          $sth->execute();
44      $dbh->disconnect();          push @ret, { 'id' => '', 'share' => '-'};       # dummy any
45      return @ret;  
46            while ( my $row = $sth->fetchrow_hashref() ) {
47                    push @ret, $row;
48            }
49            return @ret;
50  }  }
51    
52  sub getWhere($) {  sub epoch_to_iso {
53          my ($param)    = @_;          my $t = shift || return;
54          my @conditions;          my $iso = BackupPC::Lib::timeStamp(undef, $t);
55            $iso =~ s/\s/ /g;
56            return $iso;
57    }
58    
59          sub mk_iso_date($$) {  sub dates_from_form($) {
60            my $param = shift || return;
61    
62            sub mk_epoch_date($$) {
63                  my ($name,$suffix) = @_;                  my ($name,$suffix) = @_;
64    
65                  my $yyyy = $param->{ $name . '_year_' . $suffix} || return;                  my $yyyy = $param->{ $name . '_year_' . $suffix} || return;
# Line 39  sub getWhere($) { Line 67  sub getWhere($) {
67                          ( $suffix eq 'from' ? 1 : 12);                          ( $suffix eq 'from' ? 1 : 12);
68                  my $dd .= $param->{ $name . '_day_' . $suffix} ||                  my $dd .= $param->{ $name . '_day_' . $suffix} ||
69                          ( $suffix eq 'from' ? 1 : 31);                          ( $suffix eq 'from' ? 1 : 31);
70                  return sprintf("%04d-%02d-%02d", $yyyy, $mm, $dd);                  my $dt = new DateTime(
71                            year => $yyyy,
72                            month => $mm,
73                            day => $dd
74                    );
75                    return $dt->epoch || 'NULL';
76          }          }
77    
78          my $backup_from = mk_iso_date('search_backup', 'from');          return (
79          push @conditions, qq{ date(backups.date, 'unixepoch','localtime') >= '$backup_from' } if ($backup_from);                  mk_epoch_date('search_backup', 'from'),
80          my $backup_to = mk_iso_date('search_backup', 'to');                  mk_epoch_date('search_backup', 'to'),
81          push @conditions, qq{ date(backups.date, 'unixepoch','localtime') <= '$backup_to' } if ($backup_to);                  mk_epoch_date('search', 'from'),
82                    mk_epoch_date('search', 'to'),
83            );
84    }
85    
         my $files_from = mk_iso_date('search', 'from');  
         push @conditions, qq{ date(files.date, 'unixepoch','localtime') >= '$files_from' } if ($files_from);  
         my $files_to = mk_iso_date('search', 'to');  
         push @conditions, qq{ date(files.date, 'unixepoch','localtime') <= '$files_to' } if ($files_to);  
86    
87          print STDERR "backup: $backup_from - $backup_to files: $files_from - $files_to cond:",join(" | ",@conditions);  sub getWhere($) {
88                my $param = shift || return;
         push( @conditions, ' backups.hostID = ' . $param->{'search_host'} ) if ($param->{'search_host'});  
89    
90          push (@conditions, " upper(files.name) LIKE upper('%".$param->{'search_filename'}."%')") if ($param->{'search_filename'});          my ($backup_from, $backup_to, $files_from, $files_to) = dates_from_form($param);
91    
92          return (          my @conditions;
93                  join(" and ", @conditions),          push @conditions, qq{ backups.date >= $backup_from } if ($backup_from);
94                  $files_from, $files_to,          push @conditions, qq{ backups.date <= $backup_to } if ($backup_to);
95                  $backup_from, $backup_to          push @conditions, qq{ files.date >= $files_from } if ($files_from);
96          );          push @conditions, qq{ files.date <= $files_to } if ($files_to);
97    
98            print STDERR "backup: $backup_from - $backup_to files: $files_from - $files_to cond:" . join(" | ",@conditions);
99    
100            push( @conditions, ' files.shareid = ' . $param->{'search_share'} ) if ($param->{'search_share'});
101            push (@conditions, " upper(files.path) LIKE upper('%".$param->{'search_filename'}."%')") if ($param->{'search_filename'});
102    
103            return join(" and ", @conditions);
104  }  }
105    
106    
107  sub getFiles($$) {  sub getFiles($$) {
108          my ($where, $offset) = @_;          my ($param, $offset) = @_;
109    
110          my $dbh = DBI->connect( "dbi:SQLite:dbname=${TopDir}/$Conf{SearchDB}",          my $dbh = get_dbh();
                 "", "", { RaiseError => 1, AutoCommit => 1 } );  
111    
112          my $sql_cols = qq{          my $sql_cols = qq{
113                  files.id                        AS fid,                  files.id                        AS fid,
114                  hosts.name                      AS hname,                  hosts.name                      AS hname,
115                  shares.name                     AS sname,                  shares.name                     AS sname,
116                  shares.share                    AS sharename,                  -- shares.share                 AS sharename,
117                  files.backupNum                 AS backupNum,                  files.backupnum                 AS backupnum,
118                  files.name                      AS filename,                  -- files.name                   AS filename,
119                  files.path                      AS filepath,                  files.path                      AS filepath,
120                  shares.share||files.fullpath    AS networkPath,                  files.date                      AS date,
121                  date(files.date, 'unixepoch', 'localtime') AS date,                  files.type                      AS type,
                 files.type                      AS filetype,  
122                  files.size                      AS size,                  files.size                      AS size,
123                  dvds.name                       AS dvd                  -- dvds.name                    AS dvd
124                    null                            AS dvd
125          };          };
126    
127          my $sql_from = qq{          my $sql_from = qq{
128                  FROM files                  FROM files
129                          INNER JOIN shares       ON files.shareID=shares.ID                          INNER JOIN shares       ON files.shareID=shares.ID
130                          INNER JOIN hosts        ON hosts.ID = shares.hostID                          INNER JOIN hosts        ON hosts.ID = shares.hostID
131                          INNER JOIN backups      ON backups.num = files.backupNum and backups.hostID = hosts.ID                          INNER JOIN backups      ON backups.num = files.backupnum and backups.hostID = hosts.ID AND backups.shareID = shares.ID
132                          LEFT  JOIN dvds         ON dvds.ID = files.dvdid          };
133    
134            my $sql_dvd_from = qq{
135                            -- LEFT  JOIN dvds              ON dvds.ID = files.dvdid
136          };          };
137    
138          my $sql_where;          my $sql_where;
139            my $where = getWhere($param);
140          $sql_where = " WHERE ". $where if ($where);          $sql_where = " WHERE ". $where if ($where);
141    
142          my $sql_order = qq{          my $sql_order = qq{
143                  ORDER BY files.id                  ORDER BY files.date
144                          LIMIT $on_page                  LIMIT $on_page
145                          OFFSET ?                  OFFSET ?
146          };          };
147    
148            my $sql_count = qq{ select count(files.id) $sql_from $sql_where };
149            my $sql_results = qq{ select $sql_cols $sql_from $sql_dvd_from $sql_where $sql_order };
150    
151          $offset ||= 0;          $offset ||= 0;
152          $offset = ($offset * $on_page) + 1;          $offset = ($offset * $on_page);
153    
154          my $sth = $dbh->prepare(qq{ select count(files.id) $sql_from $sql_where });          my $sth = $dbh->prepare($sql_count);
155          $sth->execute();          $sth->execute();
   
156          my ($results) = $sth->fetchrow_array();          my ($results) = $sth->fetchrow_array();
157    
158          $sth = $dbh->prepare(qq{ select $sql_cols $sql_from $sql_where $sql_order });          $sth = $dbh->prepare($sql_results);
159          $sth->execute( $offset );          $sth->execute( $offset );
160    
161            if ($sth->rows != $results) {
162                    my $bug = "$0 BUG: [[ $sql_count ]] = $results while [[ $sql_results ]] = " . $sth->rows;
163                    $bug =~ s/\s+/ /gs;
164                    print STDERR "$bug\n";
165            }
166    
167          my @ret;          my @ret;
168                
169          while (my $row = $sth->fetchrow_hashref()) {          while (my $row = $sth->fetchrow_hashref()) {
170                  push(@ret, {                  push @ret, $row;
                         'hname'         => $row->{'hname'},  
                         'sname'         => $row->{'sname'},  
                         'sharename'     => $row->{'sharename'},  
                         'backupno'      => $row->{'backupNum'},  
                         'fname'         => $row->{'filename'},  
                         'fpath'         => $row->{'filepath'},  
                         'networkpath'   => $row->{'networkPath'},  
                         'date'          => $row->{'date'},  
                         'type'          => $row->{'filetype'},  
                         'size'          => $row->{'size'},  
                         'id'            => $row->{'fid'},  
                         'dvd'           => $row->{'dvd'}  
                 });  
171          }          }
172              
173          $sth->finish();          $sth->finish();
         $dbh->disconnect();  
174          return ($results, \@ret);          return ($results, \@ret);
175  }  }
176    
177  sub getBackupsNotBurned()  sub getFilesHyperEstraier($$) {
178    {          my ($param, $offset) = @_;
179        my $dbh = DBI->connect( "dbi:SQLite:dbname=${TopDir}/$Conf{SearchDB}",  
180          "", "", { RaiseError => 1, AutoCommit => 1 } );                die "no index_path?" unless ($index_path);
181        my $sql = q{  
182            SELECT          use HyperEstraier;
183              hosts.ID         AS hostID,  
184              hosts.name       AS host,          # open the database
185              backups.num      AS backupno,          my $db = HyperEstraier::Database->new();
186              backups.type     AS type,          $db->open($index_path, $HyperEstraier::ESTDBREADER);
187              backups.date     AS date  
188            FROM backups, shares, files, hosts          # create a search condition object
189            WHERE          my $cond = HyperEstraier::Condition->new();
190              backups.num    = files.backupNum  AND  
191              shares.ID      = files.shareID    AND                    my $q = $param->{'search_filename'};
192              backups.hostID = shares.hostID    AND          my $shareid = $param->{'search_share'};
193              hosts.ID       = backups.hostID   AND  
194              files.dvdid    IS NULL          if ($q) {
195            GROUP BY                  $q =~ s/(.)/$1 /g;
196              backups.hostID, backups.num  
197        };                  # set the search phrase to the search condition object
198        my $st = $dbh -> prepare( $sql );                  $cond->set_phrase($q);
199        my @ret = ();  
200        $st -> execute();                  my ($backup_from, $backup_to, $files_from, $files_to) = dates_from_form($param);
201    
202        while ( my $row = $st -> fetchrow_hashref() )                  $cond->add_attr("backup_date NUMGE $backup_from") if ($backup_from);
203          {                            $cond->add_attr("backup_date NUMLE $backup_to") if ($backup_to);
204              push(@ret, {  
205                           'host'     => $row->{'host'},                  $cond->add_attr("date NUMGE $files_from") if ($files_from);
206                           'hostid'   => $row->{'hostID'},                  $cond->add_attr("date NUMLE $files_to") if ($files_to);
207                           'backupno' => $row->{'backupno'},  
208                           'type'     => $row->{'type'},                  $cond->add_attr("shareid NUMEQ $shareid") if ($shareid);
209                           'date'     => $row->{'date'}          }
210                         }  
211              );          $offset ||= 0;
212            $offset = ($offset * $on_page);
213    
214    #       $cond->set_max( $offset + $on_page );
215            $cond->set_options( $HyperEstraier::Condition::SURE );
216            $cond->set_order( 'date NUMA' );
217    
218            # get the result of search
219            my $result = $db->search($cond, 0);
220            $result->get(0);
221    
222            my @res;
223            my $hits = $result->size;
224    
225            # for each document in result
226            for my $i ($offset .. $result->size-1) {
227                    my $id = $result->get($i);
228                    my $doc = $db->get_doc($id, 0);
229    
230                    my $row;
231                    foreach my $c (qw/fid hname sname backupnum fiilename filepath date type size/) {
232                            $row->{$c} = $doc->attr($c);
233                    }
234                    push @res, $row;
235            }
236    
237            return ($hits, \@res);
238    }
239    
240    sub getBackupsNotBurned() {
241    
242            my $dbh = get_dbh();
243            my $sql = q{
244            SELECT
245                    backups.hostID          AS hostid,
246                    min(hosts.name)         AS host,
247                    backups.num             AS backupnum,
248                    min(backups.type)       AS type,
249                    min(backups.date)       AS date,
250                    min(backups.size)       AS size
251            FROM files
252                    INNER JOIN shares       ON files.shareID=shares.ID
253                    INNER JOIN hosts        ON hosts.ID = shares.hostID
254                    INNER JOIN backups      ON backups.num = files.backupnum and backups.hostID = hosts.ID AND backups.shareID = shares.ID
255            WHERE
256                    files.dvdid     IS NULL
257            GROUP BY
258                    backups.hostID, backups.num
259            ORDER BY min(backups.date)
260            };
261            my $sth = $dbh->prepare( $sql );
262            my @ret;
263            $sth->execute();
264    
265            while ( my $row = $sth->fetchrow_hashref() ) {
266                    $row->{'age'} = sprintf("%0.1f", ( (time() - $row->{'date'}) / 86400 ) );
267                    $row->{'size'} = sprintf("%0.2f", $row->{'size'} / 1024 / 1024);
268                    push @ret, $row;
269          }          }
270                
271        return @ret;                return @ret;      
272    }  }
273    
274  sub displayBackupsGrid()  sub displayBackupsGrid()
275    {    {
# Line 211  EOF3 Line 303  EOF3
303                $retHTML.= q{<input type="hidden" value="burn" name="action">};                $retHTML.= q{<input type="hidden" value="burn" name="action">};
304                $retHTML .= q{<input type="hidden" value="results" name="search_results">};                $retHTML .= q{<input type="hidden" value="results" name="search_results">};
305          }          }
306          $retHTML .= qq{<table style="fview"><tr>};          $retHTML .= qq{
307                    <table style="fview" border="1" cellspacing="0" cellpadding="3">
308                    <tr class="tableheader">
309            };
310    
311          if ($addForm) {          if ($addForm) {
312              $retHTML .= "<td class=\"tableheader\"><input type=\"checkbox\" name=\"allFiles\" onClick=\"checkAll('allFiles');\"></td>";              $retHTML .= "<td class=\"tableheader\"><input type=\"checkbox\" name=\"allFiles\" onClick=\"checkAll('allFiles');\"></td>";
313          }          }
314          $retHTML .=  qq{<td class="tableheader">Host</td><td class="tableheader">Backup no</td><td class="tableheader">Type</td><td class="tableheader">date</td></tr>};          $retHTML .=  qq{
315                    <td align="center">Host</td>
316                    <td align="center">Backup no</td>
317                    <td align="center">Type</td>
318                    <td align="center">date</td>
319                    <td align="center">age/days</td>
320                    <td align="center">size/MB</td>
321                    </tr>
322            };
323    
324          my @backups = getBackupsNotBurned();          my @backups = getBackupsNotBurned();
325          my $backup;          my $backup;
326    
327          if ($addForm) {          if ($addForm) {
328                  $retHTML .= qq{<tr><td colspan=7 style="tableheader">                  $retHTML .= qq{
329                            <tr><td colspan=7 style="tableheader">
330                          <input type="submit" value="Burn selected backups on medium" name="submitBurner">                          <input type="submit" value="Burn selected backups on medium" name="submitBurner">
331                          </td></tr>};                          </td></tr>
332                    };
333          }          }
334    
335          foreach $backup(@backups) {          foreach $backup(@backups) {
# Line 233  EOF3 Line 338  EOF3
338                            
339                  $retHTML .= "<tr>";                  $retHTML .= "<tr>";
340                  if ($addForm) {                  if ($addForm) {
341                          $retHTML .= qq{<td class="fview"><input type="checkbox" name="fcb} .                          $retHTML .= '<td class="fview"><input type="checkbox" name="fcb' .
342                                  $backup->{'hostid'}."_".$backup->{'backupno'} .                                  $backup->{'hostid'}.'_'.$backup->{'backupnum'} .
343                                  qq{" value="} . $backup->{'hostid'}."_".$backup->{'backupno'} .                                  '" value="' . $backup->{'hostid'}.'_'.$backup->{'backupnum'} .
344                                  qq{"></td>};                                  '"></td>';
345                  }                            }          
346                            
347                  $retHTML .= '<td class="fviewborder">' . $backup->{'host'} . '</td>' .                  $retHTML .= '<td class="fviewborder">' . $backup->{'host'} . '</td>' .
348                          '<td class="fviewborder">' . $backup->{'backupno'} . '</td>' .                          '<td class="fviewborder">' . $backup->{'backupnum'} . '</td>' .
349                          '<td class="fviewborder">' . $backup->{'type'} . '</td>' .                          '<td class="fviewborder">' . $backup->{'type'} . '</td>' .
350                          '<td class="fviewborder">' . $backup->{'date'} . '<td>' .                          '<td class="fviewborder">' . epoch_to_iso( $backup->{'date'} ) . '</td>' .
351                            '<td class="fviewborder">' . $backup->{'age'} . '</td>' .
352                            '<td class="fviewborder">' . $backup->{'size'} . '</td>' .
353                          '</tr>';                          '</tr>';
354          }          }
355    
# Line 255  EOF3 Line 362  EOF3
362          return $retHTML;          return $retHTML;
363  }        }      
364    
365  sub displayGrid($$$$) {  sub displayGrid($) {
366          my ($where, $addForm, $offset, $hilite) = @_;          my ($param) = @_;
367    
368            my $offset = $param->{'offset'};
369            my $hilite = $param->{'search_filename'};
370    
371          my $retHTML = "";          my $retHTML = "";
372    
373          if ($addForm) {          my $start_t = time();
374                  $retHTML .= qq{<form name="forma" method="GET" action="$MyURL">};  
375                  $retHTML.= qq{<input type="hidden" value="search" name="action">};          my ($results, $files);
376                  $retHTML .= qq{<input type="hidden" value="results" name="search_results">};          if ($param->{'use_hest'}) {
377                    ($results, $files) = getFilesHyperEstraier($param, $offset);
378            } else {
379                    ($results, $files) = getFiles($param, $offset);
380          }          }
381    
382          my ($results, $files) = getFiles($where, $offset);          my $dur_t = time() - $start_t;
383            my $dur = sprintf("%0.4fs", $dur_t);
384    
385          my ($from, $to) = (($offset * $on_page) + 1, ($offset * $on_page) + $on_page);          my ($from, $to) = (($offset * $on_page) + 1, ($offset * $on_page) + $on_page);
386    
387            if ($results <= 0) {
388                    $retHTML .= qq{
389                            <p style="color: red;">No results found...</p>
390                    };
391                    return $retHTML;
392            } else {
393                    # DEBUG
394                    #use Data::Dumper;
395                    #$retHTML .= '<pre>' . Dumper($files) . '</pre>';
396            }
397    
398    
399          $retHTML .= qq{          $retHTML .= qq{
400          <br/>Found $results files, showing $from - $to          <div>
401          <table style="fview" width="100%">          Found <b>$results files</b> showing <b>$from - $to</b> (took $dur)
402                  <tr>          </div>
403                  <td class="tableheader">Share</td>          <table style="fview" width="100%" border="0" cellpadding="2" cellspacing="0">
404                  <td class="tableheader">Name</td>                  <tr class="fviewheader">
405                  <td class="tableheader">Type</td>                  <td align="center">Share</td>
406                  <td class="tableheader">#</td>                  <td align="center">Type and Name</td>
407                  <td class="tableheader">Size</td>                  <td align="center">#</td>
408                  <td class="tableheader">Date</td>                  <td align="center">Size</td>
409                  <td class="tableheader">Media</td>                  <td align="center">Date</td>
410                    <td align="center">Media</td>
411                  </tr>                  </tr>
412          };          };
413    
# Line 300  sub displayGrid($$$$) { Line 428  sub displayGrid($$$$) {
428    
429          foreach $file (@{ $files }) {          foreach $file (@{ $files }) {
430                  my $typeStr  = BackupPC::Attrib::fileType2Text(undef, $file->{'type'});                  my $typeStr  = BackupPC::Attrib::fileType2Text(undef, $file->{'type'});
431                  $retHTML .= "<tr>";                  $retHTML .= qq{<tr class="fviewborder">};
432    
433                  foreach my $v ((                  $retHTML .=
434                          $file->{'sharename'},                          qq{<td class="fviewborder" align="right">} . $file->{'hname'} . ':' . $file->{'sname'} . qq{</td>} .
435                          qq{<img src="$Conf{CgiImageDirURL}/icon-$typeStr.gif" align="center">&nbsp;} . hilite_html( $file->{'fpath'}, $hilite ),                          qq{<td class="fviewborder"><img src="$Conf{CgiImageDirURL}/icon-$typeStr.gif" alt="$typeStr" align="middle">&nbsp;} . hilite_html( $file->{'filepath'}, $hilite ) . qq{</td>} .
436                          $typeStr,                          qq{<td class="fviewborder" align="center">} . restore_link( $typeStr, ${EscURI( $file->{'hname'} )}, $file->{'backupnum'}, ${EscURI( $file->{'sname'})}, ${EscURI( $file->{'filepath'} )}, $file->{'backupnum'} ) . qq{</td>} .
437                          restore_link( $typeStr, $file->{'hname'}, $file->{'backupno'}, $file->{'sname'}, $file->{'fpath'}, $file->{'backupno'} ),                          qq{<td class="fviewborder" align="right">} . $file->{'size'} . qq{</td>} .
438                          $file->{'size'},                          qq{<td class="fviewborder">} . epoch_to_iso( $file->{'date'} ) . qq{</td>} .
439                          $file->{'date'},                          qq{<td class="fviewborder">} . $file->{'dvd'} . qq{</td>};
                         $file->{'dvd'}  
                 )) {  
                         $retHTML .= qq{<td class="fviewborder">$v</td>};  
                 }  
440    
441                  $retHTML .= "</tr>";                  $retHTML .= "</tr>";
442          }          }
# Line 327  sub displayGrid($$$$) { Line 451  sub displayGrid($$$$) {
451          my $max_page = int( $results / $on_page );          my $max_page = int( $results / $on_page );
452          my $page = 0;          my $page = 0;
453    
454          my $link_fmt = '<a href = "#" onclick="document.forma.offset.value=%d;document.forma.submit();">%s</a>';          sub page_link($$$) {
455                    my ($param,$page,$display) = @_;
456    
457                    $param->{'offset'} = $page;
458    
459                    my $html = '<a href = "' . $MyURL;
460                    my $del = '?';
461                    foreach my $k (keys %{ $param }) {
462                            if ($param->{$k}) {
463                                    $html .= $del . $k . '=' . ${EscURI( $param->{$k} )};
464                                    $del = '&';
465                            }
466                    }
467                    $html .= '">' . $display . '</a>';
468            }
469    
470          $retHTML .= '<div style="text-align: center;">';          $retHTML .= '<div style="text-align: center;">';
471    
472          if ($offset > 0) {          if ($offset > 0) {
473                  $retHTML .= sprintf($link_fmt, $offset - 1, '&lt;&lt;') . ' ';                  $retHTML .= page_link($param, $offset - 1, '&lt;&lt;') . ' ';
474          }          }
475    
476          while ($page <= $max_page) {          while ($page <= $max_page) {
477                  if ($page == $offset) {                  if ($page == $offset) {
478                          $retHTML .= $del . '<b>' . ($page + 1) . '</b>';                          $retHTML .= $del . '<b>' . ($page + 1) . '</b>';
479                  } else {                  } else {
480                          $retHTML .= $del . sprintf($link_fmt, $page, $page + 1);                          $retHTML .= $del . page_link($param, $page, $page + 1);
481                  }                  }
482    
483                  if ($page < $offset - $pager_pages && $page != 0) {                  if ($page < $offset - $pager_pages && $page != 0) {
# Line 357  sub displayGrid($$$$) { Line 495  sub displayGrid($$$$) {
495          }          }
496    
497          if ($offset < $max_page) {          if ($offset < $max_page) {
498                  $retHTML .= ' ' . sprintf($link_fmt, $offset + 1, '&gt;&gt;');                  $retHTML .= ' ' . page_link($param, $offset + 1, '&gt;&gt;');
499          }          }
500    
501          $retHTML .= "</div>";          $retHTML .= "</div>";
502    
         $retHTML .= "</form>" if ($addForm);  
   
503          return $retHTML;          return $retHTML;
504  }  }
505    

Legend:
Removed from v.31  
changed lines
  Added in v.86

  ViewVC Help
Powered by ViewVC 1.1.26