/[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 24 by dpavlin, Mon Jul 11 16:48:33 2005 UTC revision 83 by dpavlin, Sun Aug 28 10:14:48 2005 UTC
# Line 4  package BackupPC::SearchLib; Line 4  package BackupPC::SearchLib;
4  use strict;  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);
 use Data::Dumper;  
7  use DBI;  use DBI;
8    use DateTime;
9    use vars qw(%In $MyURL);
10    use Time::HiRes qw/time/;
11    
12    my $on_page = 100;
13    my $pager_pages = 10;
14    
15    my $dsn = $Conf{SearchDSN};
16    my $db_user = $Conf{SearchUser} || '';
17    
18  sub getUnits() {  sub getUnits() {
19      my @ret = ();          my @ret;
20      my $tmp;  
21      my $dbh = DBI->connect( "dbi:SQLite:dbname=${TopDir}/$Conf{SearchDB}",          my $dbh = DBI->connect($dsn, $db_user, "", { RaiseError => 1, AutoCommit => 1 } );
22          "", "", { RaiseError => 1, AutoCommit => 1 } );          my $sth = $dbh->prepare(qq{ SELECT id, share FROM shares ORDER BY share} );
23      my $st =          $sth->execute();
24        $dbh->prepare(          push @ret, { 'id' => '', 'share' => '-'};       # dummy any
25          " SELECT shares.ID AS ID, shares.share AS name FROM shares;");  
26      $st->execute();          while ( my $row = $sth->fetchrow_hashref() ) {
27      push (@ret, { 'ID' => '', 'name' => '-'});                  push @ret, $row;
28      while ( $tmp = $st->fetchrow_hashref() ) {          }
29          push( @ret, { 'ID' => $tmp->{'ID'}, 'name' => $tmp->{'name'} } );          $dbh->disconnect();
30      }          return @ret;
     $dbh->disconnect();  
     return @ret;  
31  }  }
32    
33  sub getWhere($) {  sub epoch_to_iso {
34          my ($param)    = @_;          my $t = shift || return;
35          my @conditions;          my $iso = BackupPC::Lib::timeStamp($t);
36            $iso =~ s/\s/ /g;
37            return $iso;
38    }
39    
40    sub dates_from_form($) {
41            my $param = shift || return;
42    
43          sub mk_iso_date($$) {          sub mk_epoch_date($$) {
44                  my ($name,$suffix) = @_;                  my ($name,$suffix) = @_;
45    
46                  my $yyyy = $param->{ $name . '_year_' . $suffix} || return;                  my $yyyy = $param->{ $name . '_year_' . $suffix} || return;
# Line 36  sub getWhere($) { Line 48  sub getWhere($) {
48                          ( $suffix eq 'from' ? 1 : 12);                          ( $suffix eq 'from' ? 1 : 12);
49                  my $dd .= $param->{ $name . '_day_' . $suffix} ||                  my $dd .= $param->{ $name . '_day_' . $suffix} ||
50                          ( $suffix eq 'from' ? 1 : 31);                          ( $suffix eq 'from' ? 1 : 31);
51                  return sprintf("%04d-%02d-%02d", $yyyy, $mm, $dd);                  my $dt = new DateTime(
52                            year => $yyyy,
53                            month => $mm,
54                            day => $dd
55                    );
56                    return $dt->epoch || 'NULL';
57          }          }
58    
59          my $backup_from = mk_iso_date('search_backup', 'from');          return (
60          push @conditions, qq{ date(backups.date, 'unixepoch','localtime') >= '$backup_from' } if ($backup_from);                  mk_epoch_date('search_backup', 'from'),
61          my $backup_to = mk_iso_date('search_backup', 'to');                  mk_epoch_date('search_backup', 'to'),
62          push @conditions, qq{ date(backups.date, 'unixepoch','localtime') <= '$backup_to' } if ($backup_to);                  mk_epoch_date('search', 'from'),
63                    mk_epoch_date('search', 'to'),
64            );
65    }
66    
67    
68          my $files_from = mk_iso_date('search', 'from');  sub getWhere($) {
69          push @conditions, qq{ date(files.date, 'unixepoch','localtime') >= '$files_from' } if ($files_from);          my $param = shift || return;
         my $files_to = mk_iso_date('search', 'to');  
         push @conditions, qq{ date(files.date, 'unixepoch','localtime') <= '$files_to' } if ($files_to);  
70    
71          print STDERR "backup: $backup_from - $backup_to files: $files_from - $files_to cond:",join(" | ",@conditions);          my ($backup_from, $backup_to, $files_from, $files_to) = dates_from_form($param);
       
         push( @conditions, ' backups.hostID = ' . $param->{'search_host'} ) if ($param->{'search_host'});  
72    
73          push (@conditions, " files.name LIKE '".$param->{'search_filename'}."%'") if ($param->{'search_filename'});          my @conditions;
74            push @conditions, qq{ backups.date >= $backup_from } if ($backup_from);
75            push @conditions, qq{ backups.date <= $backup_to } if ($backup_to);
76            push @conditions, qq{ files.date >= $files_from } if ($files_from);
77            push @conditions, qq{ files.date <= $files_to } if ($files_to);
78    
79          return (          print STDERR "backup: $backup_from - $backup_to files: $files_from - $files_to cond:" . join(" | ",@conditions);
80                  join(" and ", @conditions),  
81                  $files_from, $files_to,          push( @conditions, ' files.shareid = ' . $param->{'search_share'} ) if ($param->{'search_share'});
82                  $backup_from, $backup_to          push (@conditions, " upper(files.path) LIKE upper('%".$param->{'search_filename'}."%')") if ($param->{'search_filename'});
83          );  
84            return join(" and ", @conditions);
85  }  }
86    
87    
88  sub getFiles($$)  sub getFiles($$) {
89    {          my ($param, $offset) = @_;
90        my ($where, $offset) = @_;  
91                  my $dbh = DBI->connect($dsn, $db_user, "", { RaiseError => 1, AutoCommit => 1 } );
92          
93        my $dbh = DBI->connect( "dbi:SQLite:dbname=${TopDir}/$Conf{SearchDB}",          my $sql_cols = qq{
94          "", "", { RaiseError => 1, AutoCommit => 1 } );                  files.id                        AS fid,
95        my $sql =                            hosts.name                      AS hname,
96          q{                    shares.name                     AS sname,
97                  SELECT  files.id                        AS fid,                  shares.share                    AS sharename,
98                          hosts.name                      AS hname,                  files.backupNum                 AS backupNum,
99                          shares.name                     AS sname,                  files.name                      AS filename,
100                          shares.share                    AS sharename,                  files.path                      AS filepath,
101                          files.backupNum                 AS backupNum,                  files.date                      AS date,
102                          files.name                      AS filename,                  files.type                      AS filetype,
103                          files.path                      AS filepath,                  files.size                      AS size,
104                          shares.share||files.fullpath    AS networkPath,                  -- dvds.name                    AS dvd
105                          date(files.date, 'unixepoch', 'localtime') AS date,                  null                            AS dvd
106                          files.type                      AS filetype,          };
107                          files.size                      AS size,  
108                          dvds.name                       AS dvd          my $sql_from = qq{
109                  FROM files                  FROM files
110                          INNER JOIN shares       ON files.shareID=shares.ID                          INNER JOIN shares       ON files.shareID=shares.ID
111                          INNER JOIN hosts        ON hosts.ID = shares.hostID                          INNER JOIN hosts        ON hosts.ID = shares.hostID
112                          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
113                          LEFT  JOIN dvds         ON dvds.ID = files.dvdid          };
           };  
   
       if (defined($where) && $where ne "")  
         {  
             $sql .= " WHERE ". $where;        
         }  
114    
115        $sql .=          my $sql_dvd_from = qq{
116          q{                                    -- LEFT  JOIN dvds              ON dvds.ID = files.dvdid
             ORDER BY files.id  
               LIMIT 100  
               OFFSET ? * 100 + 1  
117          };          };
         
         
         
       my $st = $dbh->prepare(  
           $sql  
           );      
       if (!defined($offset) && $offset ne "")  
       {  
         $st->bind_param(1, $offset);  
       }  
       else  
       {  
         $st->bind_param(1,0);  
       }  
       $st->execute;  
         
       my @ret = ();  
       my $tmp;  
         
       while ($tmp = $st->fetchrow_hashref())  
         {  
             push(@ret, {  
                            'hname'       => $tmp->{'hname'},  
                            'sname'       => $tmp->{'sname'},  
                            'sharename'   => $tmp->{'sharename'},  
                            'backupno'    => $tmp->{'backupNum'},  
                            'fname'       => $tmp->{'filename'},  
                            'fpath'       => $tmp->{'filepath'},  
                            'networkpath' => $tmp->{'networkPath'},  
                            'date'        => $tmp->{'date'},  
                            'type'        => $tmp->{'filetype'},  
                            'size'        => $tmp->{'size'},  
                            'id'          => $tmp->{'fid'},  
                            'dvd'         => $tmp->{'dvd'}  
                        }  
             );  
                                   
         }  
         
       $st->finish();  
       $dbh->disconnect();  
       return @ret;  
   }  
118    
119  sub getBackupsNotBurned()          my $sql_where;
120    {          my $where = getWhere($param);
121        my $dbh = DBI->connect( "dbi:SQLite:dbname=${TopDir}/$Conf{SearchDB}",          $sql_where = " WHERE ". $where if ($where);
122          "", "", { RaiseError => 1, AutoCommit => 1 } );        
123        my $sql = q{          my $sql_order = qq{
124            SELECT                  ORDER BY files.date
125              hosts.ID         AS hostID,                  LIMIT $on_page
126              hosts.name       AS host,                  OFFSET ?
127              backups.num      AS backupno,          };
128              backups.type     AS type,  
129              backups.date     AS date          my $sql_count = qq{ select count(files.id) $sql_from $sql_where };
130            FROM backups, shares, files, hosts          my $sql_results = qq{ select $sql_cols $sql_from $sql_dvd_from $sql_where $sql_order };
131            WHERE  
132              backups.num    = files.backupNum  AND          $offset ||= 0;
133              shares.ID      = files.shareID    AND                    $offset = ($offset * $on_page);
134              backups.hostID = shares.hostID    AND  
135              hosts.ID       = backups.hostID   AND          my $sth = $dbh->prepare($sql_count);
136              files.dvdid    IS NULL          $sth->execute();
137            GROUP BY          my ($results) = $sth->fetchrow_array();
138              backups.hostID, backups.num  
139        };          $sth = $dbh->prepare($sql_results);
140        my $st = $dbh -> prepare( $sql );          $sth->execute( $offset );
141        my @ret = ();  
142        $st -> execute();          if ($sth->rows != $results) {
143                    my $bug = "$0 BUG: [[ $sql_count ]] = $results while [[ $sql_results ]] = " . $sth->rows;
144        while ( my $tmp = $st -> fetchrow_hashref() )                  $bug =~ s/\s+/ /gs;
145          {                            print STDERR "$bug\n";
146              push(@ret, {          }
147                           'host'     => $tmp->{'host'},  
148                           'hostid'   => $tmp->{'hostID'},          my @ret;
149                           'backupno' => $tmp->{'backupno'},        
150                           'type'     => $tmp->{'type'},          while (my $row = $sth->fetchrow_hashref()) {
151                           'date'     => $tmp->{'date'}                  push(@ret, {
152                         }                          'hname'         => $row->{'hname'},
153              );                          'sname'         => $row->{'sname'},
154                            'sharename'     => $row->{'sharename'},
155                            'backupno'      => $row->{'backupnum'},
156                            'fname'         => $row->{'filename'},
157                            'fpath'         => $row->{'filepath'},
158                            'networkpath'   => $row->{'networkpath'},
159                            'date'          => $row->{'date'},
160                            'type'          => $row->{'filetype'},
161                            'size'          => $row->{'size'},
162                            'id'            => $row->{'fid'},
163                            'dvd'           => $row->{'dvd'}
164                    });
165            }
166        
167            $sth->finish();
168            $dbh->disconnect();
169            return ($results, \@ret);
170    }
171    
172    sub getBackupsNotBurned() {
173    
174            my $dbh = DBI->connect($dsn, $db_user, "", { RaiseError => 1, AutoCommit => 1 } );
175            my $sql = q{
176            SELECT
177                    backups.hostID          AS hostid,
178                    min(hosts.name)         AS host,
179                    backups.num             AS backupno,
180                    min(backups.type)       AS type,
181                    min(backups.date)       AS date,
182                    min(backups.size)       AS size
183            FROM files
184                    INNER JOIN shares       ON files.shareID=shares.ID
185                    INNER JOIN hosts        ON hosts.ID = shares.hostID
186                    INNER JOIN backups      ON backups.num = files.backupNum and backups.hostID = hosts.ID AND backups.shareID = shares.ID
187            WHERE
188                    files.dvdid     IS NULL
189            GROUP BY
190                    backups.hostID, backups.num
191            ORDER BY min(backups.date)
192            };
193            my $sth = $dbh->prepare( $sql );
194            my @ret;
195            $sth->execute();
196    
197            while ( my $row = $sth->fetchrow_hashref() ) {
198                    $row->{'age'} = sprintf("%0.1f", ( (time() - $row->{'date'}) / 86400 ) );
199                    $row->{'size'} = sprintf("%0.2f", $row->{'size'} / 1024 / 1024);
200                    push @ret, $row;
201          }          }
202                
203        return @ret;                return @ret;      
204    }  }
205    
206  sub displayBackupsGrid()  sub displayBackupsGrid()
207    {    {
208        my $retHTML = "";        my $retHTML = "";
209        my $addForm = 1;        my $addForm = 1;
210                
211        if ($addForm)        if ($addForm) {
         {  
212    
213              $retHTML .= <<EOF3;              $retHTML .= <<EOF3;
214  <script language="javascript" type="text/javascript">  <script language="javascript" type="text/javascript">
# Line 215  sub displayBackupsGrid() Line 231  sub displayBackupsGrid()
231  //-->  //-->
232  </script>        </script>      
233  EOF3  EOF3
234                $retHTML .= q{<form name="forma" method="POST" action="}."$MyURL"."?action=burn\"";                $retHTML .= q{<form name="forma" method="GET" action="}."$MyURL"."?action=burn\"";
235                $retHTML.= q{<input type="hidden" value="burn" name="action">};                $retHTML.= q{<input type="hidden" value="burn" name="action">};
236                $retHTML .= q{<input type="hidden" value="results" name="search_results">};                $retHTML .= q{<input type="hidden" value="results" name="search_results">};
237          }          }
238        $retHTML .= "<table style=\"fview\">";          $retHTML .= qq{
239        $retHTML .= "<tr> ";                  <table style="fview" border="1" cellspacing="0" cellpadding="3">
240        if ($addForm)                  <tr class="tableheader">
241          {          };
242    
243            if ($addForm) {
244              $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>";
245          }          }
246        $retHTML .=  "<td class=\"tableheader\">Host</td> <td class=\"tableheader\">Backup no</td> <td class=\"tableheader\">Type</td> <td class=\"tableheader\">date</td></tr>";          $retHTML .=  qq{
247        my @backups = getBackupsNotBurned();                  <td align="center">Host</td>
248        my $backup;                  <td align="center">Backup no</td>
249                    <td align="center">Type</td>
250        if ($addForm)                  <td align="center">date</td>
251          {                  <td align="center">age/days</td>
252              $retHTML .= "<tr>";                  <td align="center">size/MB</td>
253              $retHTML .= "<td colspan=7 style=\"tableheader\">";                  </tr>
254              $retHTML .= "<input type=\"submit\" value=\"Burn selected backups on medium\" name=\"submitBurner\">";          };
255              $retHTML .= "</td>";  
256              $retHTML .= "</tr>";          my @backups = getBackupsNotBurned();
257                        my $backup;
258    
259            if ($addForm) {
260                    $retHTML .= qq{
261                            <tr><td colspan=7 style="tableheader">
262                            <input type="submit" value="Burn selected backups on medium" name="submitBurner">
263                            </td></tr>
264                    };
265          }          }
266        foreach $backup(@backups)  
267          {          foreach $backup(@backups) {
268              my $ftype = "";  
269                    my $ftype = "";
270                            
271              $retHTML .= "<tr>";                  $retHTML .= "<tr>";
272              if ($addForm)                  if ($addForm) {
273                {                          $retHTML .= '<td class="fview"><input type="checkbox" name="fcb' .
274                    $retHTML .= "<td class=\"fview\"> <input type=\"checkbox\" name=\"fcb"                                  $backup->{'hostid'}.'_'.$backup->{'backupno'} .
275                      .$backup->{'hostid'}."_".$backup->{'backupno'}                                  '" value="' . $backup->{'hostid'}.'_'.$backup->{'backupno'} .
276                    ."\" value=\"".$backup->{'hostid'}."_".$backup->{'backupno'}."\"> </td>";                                  '"></td>';
277                }                      }          
278                            
279              $retHTML .= "<td class=\"fviewborder\">" . $backup->{'host'} . "</td>";                  $retHTML .= '<td class="fviewborder">' . $backup->{'host'} . '</td>' .
280              $retHTML .= "<td class=\"fviewborder\">" . $backup->{'backupno'} . "</td>";                          '<td class="fviewborder">' . $backup->{'backupno'} . '</td>' .
281              $retHTML .= "<td class=\"fviewborder\">" . $backup->{'type'} . "</td>";                          '<td class="fviewborder">' . $backup->{'type'} . '</td>' .
282              $retHTML .= "<td class=\"fviewborder\">" . $backup->{'date'} . "<td>";                          '<td class="fviewborder">' . epoch_to_iso( $backup->{'date'} ) . '</td>' .
283              $retHTML .= "</tr>";                          '<td class="fviewborder">' . $backup->{'age'} . '</td>' .
284          }                          '<td class="fviewborder">' . $backup->{'size'} . '</td>' .
285        $retHTML .= "</table>";                          '</tr>';
286        if ($addForm)          }
287         {  
288             $retHTML .= "</form>";          $retHTML .= "</table>";
289         }  
290            if ($addForm) {
291                    $retHTML .= "</form>";
292            }
293                
294        return $retHTML;          return $retHTML;
295      }      
296      
297    }        sub displayGrid($$) {
298            my ($param, $addForm) = @_;
299    
300            my $offset = $param->{'offset'};
301            my $hilite = $param->{'search_filename'};
302    
 sub displayGrid($$$$) {  
         my ($where, $addForm, $offset, $hilite) = @_;  
303          my $retHTML = "";          my $retHTML = "";
304    
305            my $start_t = time();
306    
307            my ($results, $files) = getFiles($param, $offset);
308    
309            my $dur_t = time() - $start_t;
310            my $dur = sprintf("%0.4fs", $dur_t);
311    
312            my ($from, $to) = (($offset * $on_page) + 1, ($offset * $on_page) + $on_page);
313    
314            if ($results <= 0) {
315                    $retHTML .= qq{
316                            <p style="color: red;">No results found...</p>
317                    };
318                    return $retHTML;
319            } else {
320                    # DEBUG
321                    #use Data::Dumper;
322                    #$retHTML .= '<pre>' . Dumper($files) . '</pre>';
323            }
324    
325    
326          if ($addForm) {          if ($addForm) {
327                  $retHTML .= qq{<form name="forma" method="POST" action="}.$MyURL.qq{?action=search">};                  $retHTML .= qq{<form name="forma" method="GET" action="$MyURL">};
328                  $retHTML.= qq{<input type="hidden" value="search" name="action">};                  $retHTML.= qq{<input type="hidden" value="search" name="action">};
329                  $retHTML .= qq{<input type="hidden" value="results" name="search_results">};                  $retHTML .= qq{<input type="hidden" value="results" name="search_results">};
330          }          }
331    
332    
333          $retHTML .= qq{          $retHTML .= qq{
334          <table style="fview" width="100%">          <div>
335                  <tr>          Found <b>$results files</b> showing <b>$from - $to</b> (took $dur)
336                  <td class="tableheader">Host</td>          </div>
337                  <td class="tableheader">Name</td>          <table style="fview" width="100%" border="0" cellpadding="2" cellspacing="0">
338                  <td class="tableheader">Type</td>                  <tr class="fviewheader">
339                  <td class="tableheader">#</td>                  <td align="center">Share</td>
340                  <td class="tableheader">Size</td>                  <td align="center">Type and Name</td>
341                  <td class="tableheader">Date</td>                  <td align="center">#</td>
342                  <td class="tableheader">Media</td>                  <td align="center">Size</td>
343                    <td align="center">Date</td>
344                    <td align="center">Media</td>
345                  </tr>                  </tr>
346          };          };
347          my @files = getFiles($where, $offset);  
348          my $file;          my $file;
349    
350          sub hilite_html($$) {          sub hilite_html($$) {
# Line 297  sub displayGrid($$$$) { Line 353  sub displayGrid($$$$) {
353                  return $html;                  return $html;
354          }          }
355    
356          foreach $file (@files) {          sub restore_link($$$$$$) {
357                    my $type = shift;
358                    my $action = 'RestoreFile';
359                    $action = 'browse' if (lc($type) eq 'dir');
360                    return sprintf(qq{<a href="?action=%s&host=%s&num=%d&share=%s&dir=%s">%s</a>}, $action, @_);
361            }
362    
363            foreach $file (@{ $files }) {
364                  my $typeStr  = BackupPC::Attrib::fileType2Text(undef, $file->{'type'});                  my $typeStr  = BackupPC::Attrib::fileType2Text(undef, $file->{'type'});
365                  $retHTML .= "<tr>";                  $retHTML .= qq{<tr class="fviewborder">};
366    
367                  foreach my $v ((                  $retHTML .=
368                          $file->{'hname'},                          qq{<td class="fviewborder" align="right">} . $file->{'sharename'} . qq{</td>} .
369                          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->{'fpath'}, $hilite ) . qq{</td>} .
370                          $typeStr,                          qq{<td class="fviewborder" align="center">} . restore_link( $typeStr, ${EscURI( $file->{'hname'} )}, $file->{'backupno'}, ${EscURI( $file->{'sname'})}, ${EscURI( $file->{'fpath'} )}, $file->{'backupno'} ) . qq{</td>} .
371                          $file->{'backupno'},                          qq{<td class="fviewborder" align="right">} . $file->{'size'} . qq{</td>} .
372                          $file->{'size'},                          qq{<td class="fviewborder">} . epoch_to_iso( $file->{'date'} ) . qq{</td>} .
373                          $file->{'date'},                          qq{<td class="fviewborder">} . $file->{'dvd'} . qq{</td>};
                         $file->{'dvd'}  
                 )) {  
                         $retHTML .= qq{<td class="fviewborder">$v</td>};  
                 }  
374    
375                  $retHTML .= "</tr>";                  $retHTML .= "</tr>";
376          }          }
377          $retHTML .= "</table>";          $retHTML .= "</table>";
378    
379          # skip pager          # all variables which has to be transfered
380          return $retHTML;          foreach my $n (qw/search_day_from search_month_from search_year_from search_day_to search_month_to search_year_to search_backup_day_from search_backup_month_from search_backup_year_from search_backup_day_to search_backup_month_to search_backup_year_to search_filename offset/) {
381                    $retHTML .= qq{<INPUT TYPE="hidden" NAME="$n" VALUE="$In{$n}">\n};
382            }
383    
384          $retHTML .= "<INPUT TYPE=\"hidden\" VALUE=\"\" NAME=\"offset\">";          my $del = '';
385          for (my $ii = 1; $ii <= $#files; $ii++) {          my $max_page = int( $results / $on_page );
386                  $retHTML .= "<a href = \"#\" onclick=\"document.forma.offset.value=$ii;document.forma.submit();\">$ii</a>";          my $page = 0;
387                  if ($ii < $#files) {  
388                          $retHTML .= " | ";          my $link_fmt = '<a href = "#" onclick="document.forma.offset.value=%d;document.forma.submit();">%s</a>';
389    
390            $retHTML .= '<div style="text-align: center;">';
391    
392            if ($offset > 0) {
393                    $retHTML .= sprintf($link_fmt, $offset - 1, '&lt;&lt;') . ' ';
394            }
395    
396            while ($page <= $max_page) {
397                    if ($page == $offset) {
398                            $retHTML .= $del . '<b>' . ($page + 1) . '</b>';
399                    } else {
400                            $retHTML .= $del . sprintf($link_fmt, $page, $page + 1);
401                    }
402    
403                    if ($page < $offset - $pager_pages && $page != 0) {
404                            $retHTML .= " ... ";
405                            $page = $offset - $pager_pages;
406                            $del = '';
407                    } elsif ($page > $offset + $pager_pages && $page != $max_page) {
408                            $retHTML .= " ... ";
409                            $page = $max_page;
410                            $del = '';
411                    } else {
412                            $del = ' | ';
413                            $page++;
414                  }                  }
415          }          }
416    
417            if ($offset < $max_page) {
418                    $retHTML .= ' ' . sprintf($link_fmt, $offset + 1, '&gt;&gt;');
419            }
420    
421            $retHTML .= "</div>";
422    
423          $retHTML .= "</form>" if ($addForm);          $retHTML .= "</form>" if ($addForm);
424          
425          return $retHTML;          return $retHTML;
426  }  }
427    

Legend:
Removed from v.24  
changed lines
  Added in v.83

  ViewVC Help
Powered by ViewVC 1.1.26