/[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 6 by dpavlin, Thu Jun 23 09:47:59 2005 UTC revision 31 by dpavlin, Sun Jul 31 16:16:55 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 vars qw(%In $MyURL);
9    
10    my $on_page = 100;
11    my $pager_pages = 10;
12    
13  sub getUnits() {  sub getUnits() {
14      my @ret = ();      my @ret = ();
# Line 25  sub getUnits() { Line 28  sub getUnits() {
28  }  }
29    
30  sub getWhere($) {  sub getWhere($) {
31      my ($param)    = @_;          my ($param)    = @_;
32      my $retSQL     = "";          my @conditions;
     my @conditions = ();  
     my $cond;  
33    
34                sub mk_iso_date($$) {
35                      my ($name,$suffix) = @_;
       
     if ( defined( $param->{'search_backup_day_from'} ) && $param->{'search_backup_day_from'} ne "") {  
         push( @conditions,  
             ' strftime("%d", datetime(backups.date, "unixepoch","localtime")) >= "'  
               . $param->{'search_backup_day_from'} ."\"");  
     }  
     if ( defined( $param->{'search_backup_day_to'} ) && $param->{'search_backup_day_to'} ne "") {  
         push( @conditions,  
             ' strftime("%d", datetime(backups.date, "unixepoch","localtime")) <= "'  
               . $param->{'search_backup_day_from'}  ."\"");  
     }  
     if ( defined( $param->{'search_backup_month_from'} ) && $param->{'search_backup_month_from'} ne "") {  
         push( @conditions,  
             ' strftime("%m", datetime(backups.date, "unixepoch","localtime")) >= "'  
               . $param->{'search_backup_month_from'}  ."\"");  
     }  
     if ( defined( $param->{'search_backup_month_to'} ) && $param->{'search_backup_month_to'} ne "") {  
         push( @conditions,  
             ' strftime("%m", datetime(backups.date, "unixepoch","localtime")) <= "'  
               . $param->{'search_backup_month_to'}  ."\"");  
     }  
     if ( defined( $param->{'search_backup_year_from'} ) && $param->{'search_backup_year_from'} ne "") {  
         push( @conditions,  
             ' strftime("%Y", datetime(backups.date, "unixepoch","localtime")) >= "'  
               . $param->{'search_backup_year_from'}  ."\"");  
     }  
     if ( defined( $param->{'search_backup_year_to'} ) && $param->{'search_backup_year_to'} ne "") {  
         push( @conditions,  
             ' strftime("%Y", datetime(backups.date, "unixepoch","localtime")) <= "'  
               . $param->{'search_backup_year_to'}  ."\"");  
     }  
   
     if ( defined( $param->{'search_day_from'} )   && $param->{'search_day_from'} ne "" ) {  
         push( @conditions,  
             ' strftime("%d", datetime(files.date, "unixepoch","localtime")) >= "'  
               . $param->{'search_day_from'}  ."\"");  
     }  
     if ( defined( $param->{'search_month_from'} ) && $param->{'search_month_from'} ne "") {  
         push( @conditions,  
             ' strftime("%m", datetime(files.date, "unixepoch","localtime")) >= "'  
               . $param->{'search_month_from'}  ."\"");  
     }  
     if ( defined( $param->{'search_year_from'} ) && $param->{'search_year_from'} ne "") {  
         push( @conditions,  
             ' strftime("%Y", datetime(files.date, "unixepoch","localtime")) >= "'  
               . $param->{'search_year_from'}  ."\"");  
     }  
     if ( defined( $param->{'search_day_to'} )   && $param->{'search_day_to'} ne "" ) {  
         push( @conditions,  
             ' strftime("%d", datetime(files.date, "unixepoch","localtime")) <= "'  
               . $param->{'search_day_to'}  ."\"");  
     }  
     if ( defined( $param->{'search_month_to'} ) && $param->{'search_month_to'} ne "" ) {  
         push( @conditions,  
             ' strftime("%m", datetime(files.date, "unixepoch","localtime")) <= "'  
               . $param->{'search_month_to'} ."\"" );  
     }  
     if ( defined( $param->{'search_year_to'} )&& $param->{'search_year_to'} ne "" )  {  
         push( @conditions,  
             ' strftime("%Y", datetime(files.date, "unixepoch","localtime")) <= "'  
               . $param->{'search_year_to'} ."\"");  
     }  
36    
37      if ( defined( $param->{'search_host'} ) && $param->{'search_host'} ne "") {                  my $yyyy = $param->{ $name . '_year_' . $suffix} || return;
38        push( @conditions, ' backups.hostID = ' . $param->{'search_host'} );                  my $mm .= $param->{ $name . '_month_' . $suffix} ||
39      }                          ( $suffix eq 'from' ? 1 : 12);
40                    my $dd .= $param->{ $name . '_day_' . $suffix} ||
41                            ( $suffix eq 'from' ? 1 : 31);
42                    return sprintf("%04d-%02d-%02d", $yyyy, $mm, $dd);
43            }
44    
45            my $backup_from = mk_iso_date('search_backup', 'from');
46            push @conditions, qq{ date(backups.date, 'unixepoch','localtime') >= '$backup_from' } if ($backup_from);
47            my $backup_to = mk_iso_date('search_backup', 'to');
48            push @conditions, qq{ date(backups.date, 'unixepoch','localtime') <= '$backup_to' } if ($backup_to);
49    
50            my $files_from = mk_iso_date('search', 'from');
51            push @conditions, qq{ date(files.date, 'unixepoch','localtime') >= '$files_from' } if ($files_from);
52            my $files_to = mk_iso_date('search', 'to');
53            push @conditions, qq{ date(files.date, 'unixepoch','localtime') <= '$files_to' } if ($files_to);
54    
55      if ( defined ($param->{'search_filename'}) && $param->{'search_filename'} ne "") {          print STDERR "backup: $backup_from - $backup_to files: $files_from - $files_to cond:",join(" | ",@conditions);
         push (@conditions, " files.name LIKE '".$param->{'search_filename'}."%'");  
         }  
56            
57      $retSQL = "";          push( @conditions, ' backups.hostID = ' . $param->{'search_host'} ) if ($param->{'search_host'});
     foreach $cond(@conditions)  
       {  
           if ($retSQL ne "")  
             {  
                 $retSQL .= " AND ";  
             }  
           $retSQL .= $cond;  
       }        
58    
59                push (@conditions, " upper(files.name) LIKE upper('%".$param->{'search_filename'}."%')") if ($param->{'search_filename'});
60      return $retSQL;  
61            return (
62                    join(" and ", @conditions),
63                    $files_from, $files_to,
64                    $backup_from, $backup_to
65            );
66  }  }
67    
 sub getFiles($)  
   {  
       my ($where) = @_;  
         
       my $dbh = DBI->connect( "dbi:SQLite:dbname=${TopDir}/$Conf{SearchDB}",  
         "", "", { RaiseError => 1, AutoCommit => 1 } );  
       my $sql =            
         q{    
               SELECT files.id                       AS fid,  
                      hosts.name                     AS hname,  
                      shares.name                    AS sname,  
                      shares.share                   AS sharename,  
                      backups.num                    AS backupNum,  
                      files.name                     AS filename,  
                      files.path                     AS filepath,  
                      shares.share||files.fullpath AS networkPath,  
                      date(files.date, 'unixepoch', 'localtime') AS date,  
                      files.type                     AS filetype,  
                      files.size                     AS size,  
                      dvds.name                      AS dvd  
                   FROM  
                      files  
                         INNER JOIN shares  ON files.shareID=shares.ID  
                         INNER JOIN hosts   ON hosts.ID = shares.hostID  
                         INNER JOIN backups ON backups.hostID = hosts.ID  
                         LEFT  JOIN dvds    ON dvds.ID = files.dvdid  
                       
           };  
   
       if (defined($where) && $where ne "")  
         {  
             $sql .= " WHERE ". $where;        
         }  
68    
69          sub getFiles($$) {
70        my $st = $dbh->prepare(          my ($where, $offset) = @_;
           $sql  
           );      
71    
72        $st->execute;          my $dbh = DBI->connect( "dbi:SQLite:dbname=${TopDir}/$Conf{SearchDB}",
73                          "", "", { RaiseError => 1, AutoCommit => 1 } );
74        my @ret = ();  
75        my $tmp;          my $sql_cols = qq{
76                    files.id                        AS fid,
77                    hosts.name                      AS hname,
78                    shares.name                     AS sname,
79                    shares.share                    AS sharename,
80                    files.backupNum                 AS backupNum,
81                    files.name                      AS filename,
82                    files.path                      AS filepath,
83                    shares.share||files.fullpath    AS networkPath,
84                    date(files.date, 'unixepoch', 'localtime') AS date,
85                    files.type                      AS filetype,
86                    files.size                      AS size,
87                    dvds.name                       AS dvd
88            };
89    
90            my $sql_from = qq{
91                    FROM files
92                            INNER JOIN shares       ON files.shareID=shares.ID
93                            INNER JOIN hosts        ON hosts.ID = shares.hostID
94                            INNER JOIN backups      ON backups.num = files.backupNum and backups.hostID = hosts.ID
95                            LEFT  JOIN dvds         ON dvds.ID = files.dvdid
96            };
97    
98            my $sql_where;
99            $sql_where = " WHERE ". $where if ($where);
100    
101            my $sql_order = qq{
102                    ORDER BY files.id
103                            LIMIT $on_page
104                            OFFSET ?
105            };
106    
107            $offset ||= 0;
108            $offset = ($offset * $on_page) + 1;
109    
110            my $sth = $dbh->prepare(qq{ select count(files.id) $sql_from $sql_where });
111            $sth->execute();
112    
113            my ($results) = $sth->fetchrow_array();
114    
115            $sth = $dbh->prepare(qq{ select $sql_cols $sql_from $sql_where $sql_order });
116            $sth->execute( $offset );
117    
118            my @ret;
119                
120        while ($tmp = $st->fetchrow_hashref())          while (my $row = $sth->fetchrow_hashref()) {
121          {                  push(@ret, {
122              push(@ret, {                          'hname'         => $row->{'hname'},
123                             'hname'       => $tmp->{'hname'},                          'sname'         => $row->{'sname'},
124                             'sname'       => $tmp->{'sname'},                          'sharename'     => $row->{'sharename'},
125                             'sharename'   => $tmp->{'sharename'},                          'backupno'      => $row->{'backupNum'},
126                             'backupno'    => $tmp->{'backupNum'},                          'fname'         => $row->{'filename'},
127                             'fname'       => $tmp->{'filename'},                          'fpath'         => $row->{'filepath'},
128                             'fpath'       => $tmp->{'filepath'},                          'networkpath'   => $row->{'networkPath'},
129                             'networkpath' => $tmp->{'networkPath'},                          'date'          => $row->{'date'},
130                             'date'        => $tmp->{'date'},                          'type'          => $row->{'filetype'},
131                             'type'        => $tmp->{'filetype'},                          'size'          => $row->{'size'},
132                             'size'        => $tmp->{'size'},                          'id'            => $row->{'fid'},
133                             'id'          => $tmp->{'fid'},                          'dvd'           => $row->{'dvd'}
134                             'dvd'         => $tmp->{'dvd'}                  });
                        }  
             );  
                                   
135          }          }
136                
137        $st->finish();          $sth->finish();
138        $dbh->disconnect();          $dbh->disconnect();
139        return @ret;          return ($results, \@ret);
140    }  }
141    
142  sub getBackupsNotBurned()  sub getBackupsNotBurned()
143    {    {
# Line 211  sub getBackupsNotBurned() Line 164  sub getBackupsNotBurned()
164        my @ret = ();        my @ret = ();
165        $st -> execute();        $st -> execute();
166    
167        while ( my $tmp = $st -> fetchrow_hashref() )        while ( my $row = $st -> fetchrow_hashref() )
168          {                    {          
169              push(@ret, {              push(@ret, {
170                           'host'     => $tmp->{'host'},                           'host'     => $row->{'host'},
171                           'hostid'   => $tmp->{'hostID'},                           'hostid'   => $row->{'hostID'},
172                           'backupno' => $tmp->{'backupno'},                           'backupno' => $row->{'backupno'},
173                           'type'     => $tmp->{'type'},                           'type'     => $row->{'type'},
174                           'date'     => $tmp->{'date'}                           'date'     => $row->{'date'}
175                         }                         }
176              );              );
177          }          }
# Line 231  sub displayBackupsGrid() Line 184  sub displayBackupsGrid()
184        my $retHTML = "";        my $retHTML = "";
185        my $addForm = 1;        my $addForm = 1;
186                
187        if ($addForm)        if ($addForm) {
         {  
188    
189              $retHTML .= <<EOF3;              $retHTML .= <<EOF3;
190  <script language="javascript" type="text/javascript">  <script language="javascript" type="text/javascript">
# Line 255  sub displayBackupsGrid() Line 207  sub displayBackupsGrid()
207  //-->  //-->
208  </script>        </script>      
209  EOF3  EOF3
210                $retHTML .= q{<form name="forma" method="POST" action="}."$MyURL"."?action=burn\"";                $retHTML .= q{<form name="forma" method="GET" action="}."$MyURL"."?action=burn\"";
211                $retHTML.= q{<input type="hidden" value="burn" name="action">};                $retHTML.= q{<input type="hidden" value="burn" name="action">};
212                $retHTML .= q{<input type="hidden" value="results" name="search_results">};                $retHTML .= q{<input type="hidden" value="results" name="search_results">};
213          }          }
214        $retHTML .= "<table style=\"fview\">";          $retHTML .= qq{<table style="fview"><tr>};
215        $retHTML .= "<tr> ";  
216        if ($addForm)          if ($addForm) {
         {  
217              $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>";
218          }          }
219        $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{<td class="tableheader">Host</td><td class="tableheader">Backup no</td><td class="tableheader">Type</td><td class="tableheader">date</td></tr>};
220        my @backups = getBackupsNotBurned();  
221        my $backup;          my @backups = getBackupsNotBurned();
222            my $backup;
223        if ($addForm)  
224          {          if ($addForm) {
225              $retHTML .= "<tr>";                  $retHTML .= qq{<tr><td colspan=7 style="tableheader">
226              $retHTML .= "<td colspan=7 style=\"tableheader\">";                          <input type="submit" value="Burn selected backups on medium" name="submitBurner">
227              $retHTML .= "<input type=\"submit\" value=\"Burn selected backups on medium\" name=\"submitBurner\">";                          </td></tr>};
             $retHTML .= "</td>";  
             $retHTML .= "</tr>";  
               
228          }          }
229        foreach $backup(@backups)  
230          {          foreach $backup(@backups) {
231              my $ftype = "";  
232                    my $ftype = "";
233                            
234              $retHTML .= "<tr>";                  $retHTML .= "<tr>";
235              if ($addForm)                  if ($addForm) {
236                {                          $retHTML .= qq{<td class="fview"><input type="checkbox" name="fcb} .
237                    $retHTML .= "<td class=\"fview\"> <input type=\"checkbox\" name=\"fcb"                                  $backup->{'hostid'}."_".$backup->{'backupno'} .
238                      .$backup->{'hostid'}."_".$backup->{'backupno'}                                  qq{" value="} . $backup->{'hostid'}."_".$backup->{'backupno'} .
239                    ."\" value=\"".$backup->{'hostid'}."_".$backup->{'backupno'}."\"> </td>";                                  qq{"></td>};
240                }                      }          
241                            
242              $retHTML .= "<td class=\"fviewborder\">" . $backup->{'host'} . "</td>";                  $retHTML .= '<td class="fviewborder">' . $backup->{'host'} . '</td>' .
243              $retHTML .= "<td class=\"fviewborder\">" . $backup->{'backupno'} . "</td>";                          '<td class="fviewborder">' . $backup->{'backupno'} . '</td>' .
244              $retHTML .= "<td class=\"fviewborder\">" . $backup->{'type'} . "</td>";                          '<td class="fviewborder">' . $backup->{'type'} . '</td>' .
245              $retHTML .= "<td class=\"fviewborder\">" . $backup->{'date'} . "<td>";                          '<td class="fviewborder">' . $backup->{'date'} . '<td>' .
246              $retHTML .= "</tr>";                          '</tr>';
247          }          }
       $retHTML .= "</table>";  
       if ($addForm)  
        {  
            $retHTML .= "</form>";  
        }  
         
       return $retHTML;  
     
     
   }        
248    
249  sub displayGrid($$)          $retHTML .= "</table>";
250    {  
251        my ($where, $addForm) = @_;          if ($addForm) {
252        my $retHTML = "";                  $retHTML .= "</form>";
253            }
254                
255        if ($addForm)          return $retHTML;
256          {  }      
       $retHTML .= <<EOF3;  
 <script language="javascript" type="text/javascript">  
 <!--  
257    
258      function checkAll(location)  sub displayGrid($$$$) {
259      {          my ($where, $addForm, $offset, $hilite) = @_;
260        for (var i=0;i<document.forma.elements.length;i++)          my $retHTML = "";
261        {  
262          var e = document.forma.elements[i];          if ($addForm) {
263          if ((e.checked || !e.checked) && e.name != \'all\') {                  $retHTML .= qq{<form name="forma" method="GET" action="$MyURL">};
264              if (eval("document.forma."+location+".checked")) {                  $retHTML.= qq{<input type="hidden" value="search" name="action">};
265                  e.checked = true;                  $retHTML .= qq{<input type="hidden" value="results" name="search_results">};
266              } else {          }
                 e.checked = false;  
             }  
         }  
       }  
     }  
267    
268            my ($results, $files) = getFiles($where, $offset);
269    
270  //-->          my ($from, $to) = (($offset * $on_page) + 1, ($offset * $on_page) + $on_page);
271  </script>        
272  EOF3          $retHTML .= qq{
273                $retHTML .= q{<form name="forma" method="POST" action="}."$MyURL"."?action=burn\"";          <br/>Found $results files, showing $from - $to
274                $retHTML.= q{<input type="hidden" value="burn" name="action">};          <table style="fview" width="100%">
275                $retHTML .= q{<input type="hidden" value="results" name="search_results">};                  <tr>
276                    <td class="tableheader">Share</td>
277                    <td class="tableheader">Name</td>
278                    <td class="tableheader">Type</td>
279                    <td class="tableheader">#</td>
280                    <td class="tableheader">Size</td>
281                    <td class="tableheader">Date</td>
282                    <td class="tableheader">Media</td>
283                    </tr>
284            };
285    
286            my $file;
287    
288            sub hilite_html($$) {
289                    my ($html, $search) = @_;
290                    $html =~ s#($search)#<b>$1</b>#gis;
291                    return $html;
292          }          }
293        $retHTML .= "<table style=\"fview\">";  
294        $retHTML .= "<tr> ";          sub restore_link($$$$$$) {
295        if ($addForm)                  my $type = shift;
296          {                  my $action = 'RestoreFile';
297              $retHTML .= "<td class=\"tableheader\"><input type=\"checkbox\" name=\"allFiles\" onClick=\"checkAll('allFiles');\"></td>";                  $action = 'browse' if (lc($type) eq 'dir');
298                    return sprintf(qq{<a href="?action=%s&host=%s&num=%d&share=%s&dir=%s">%s</a>}, $action, @_);
299          }          }
300        $retHTML .=  "<td class=\"tableheader\">Host</td> <td class=\"tableheader\">Name</td> <td class=\"tableheader\">Type</td> <td class=\"tableheader\">backup no.</td> <td class=\"tableheader\">size</td> <td class=\"tableheader\">date</td>  <td class=\"tableheader\">Media</td></tr>";  
301        my @files = getFiles($where);          foreach $file (@{ $files }) {
302        my $file;                  my $typeStr  = BackupPC::Attrib::fileType2Text(undef, $file->{'type'});
303                    $retHTML .= "<tr>";
304        if ($addForm)  
305          {                  foreach my $v ((
306              $retHTML .= "<tr>";                          $file->{'sharename'},
307              $retHTML .= "<td colspan=7 style=\"tableheader\">";                          qq{<img src="$Conf{CgiImageDirURL}/icon-$typeStr.gif" align="center">&nbsp;} . hilite_html( $file->{'fpath'}, $hilite ),
308              $retHTML .= "<input type=\"submit\" value=\"Burn selected files on medium\" name=\"submitBurner\">";                          $typeStr,
309              $retHTML .= "</td>";                          restore_link( $typeStr, $file->{'hname'}, $file->{'backupno'}, $file->{'sname'}, $file->{'fpath'}, $file->{'backupno'} ),
310              $retHTML .= "</tr>";                          $file->{'size'},
311                                        $file->{'date'},
312                            $file->{'dvd'}
313                    )) {
314                            $retHTML .= qq{<td class="fviewborder">$v</td>};
315                    }
316    
317                    $retHTML .= "</tr>";
318          }          }
319        foreach $file(@files)          $retHTML .= "</table>";
320          {  
321              my $ftype = "";          # all variables which has to be transfered
322                        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/) {
323              if ($file->{'type'} == BPC_FTYPE_DIR)                  $retHTML .= qq{<INPUT TYPE="hidden" NAME="$n" VALUE="$In{$n}">\n};
324                {          }
325                    $ftype = "dir";  
326                }          my $del = '';
327              else          my $max_page = int( $results / $on_page );
328                {          my $page = 0;
329                    $ftype = "file";  
330                }          my $link_fmt = '<a href = "#" onclick="document.forma.offset.value=%d;document.forma.submit();">%s</a>';
331              $retHTML .= "<tr>";  
332              if ($addForm)          $retHTML .= '<div style="text-align: center;">';
333                {  
334                    $retHTML .= "<td class=\"fview\"> <input type=\"checkbox\" name=\"fcb"          if ($offset > 0) {
335                      .$file->{'id'}                  $retHTML .= sprintf($link_fmt, $offset - 1, '&lt;&lt;') . ' ';
336                    ."\" value=\"".$file->{'id'}."\"> </td>";          }
337                }      
338                        while ($page <= $max_page) {
339              $retHTML .= "<td class=\"fviewborder\">" . $file->{'hname'} ."</td>";                  if ($page == $offset) {
340              $retHTML .= "<td class=\"fviewborder\">" . $file->{'fname'} . "</td>";                          $retHTML .= $del . '<b>' . ($page + 1) . '</b>';
341              $retHTML .= "<td class=\"fviewborder\">" . $ftype . "</td>";                  } else {
342              $retHTML .= "<td class=\"fviewborder\">" . $file->{'backupno'} . "</td>";                          $retHTML .= $del . sprintf($link_fmt, $page, $page + 1);
343              $retHTML .= "<td class=\"fviewborder\">" . $file->{'size'} . "</td>";                  }
344              $retHTML .= "<td class=\"fviewborder\">" . $file->{'date'} . "</td>";  
345              $retHTML .= "<td class=\"fviewborder\">" . $file->{'dvd'} . "</td>";                  if ($page < $offset - $pager_pages && $page != 0) {
346              $retHTML .= "</tr>";                          $retHTML .= " ... ";
347          }                          $page = $offset - $pager_pages;
348        $retHTML .= "</table>";                          $del = '';
349        if ($addForm)                  } elsif ($page > $offset + $pager_pages && $page != $max_page) {
350         {                          $retHTML .= " ... ";
351             $retHTML .= "</form>";                          $page = $max_page;
352         }                          $del = '';
353                          } else {
354        return $retHTML;                          $del = ' | ';
355    }                          $page++;
356                    }
357            }
358    
359            if ($offset < $max_page) {
360                    $retHTML .= ' ' . sprintf($link_fmt, $offset + 1, '&gt;&gt;');
361            }
362    
363            $retHTML .= "</div>";
364    
365            $retHTML .= "</form>" if ($addForm);
366    
367            return $retHTML;
368    }
369    
370  1;  1;

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

  ViewVC Help
Powered by ViewVC 1.1.26