/[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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 26 - (hide annotations)
Fri Jul 29 17:30:25 2005 UTC (18 years, 10 months ago) by dpavlin
File size: 9676 byte(s)
added restore link to search results

1 dpavlin 4 #!/usr/bin/perl
2     package BackupPC::SearchLib;
3    
4     use strict;
5     use BackupPC::CGI::Lib qw(:all);
6     use BackupPC::Attrib qw(:all);
7     use DBI;
8    
9     sub getUnits() {
10     my @ret = ();
11     my $tmp;
12 dpavlin 6 my $dbh = DBI->connect( "dbi:SQLite:dbname=${TopDir}/$Conf{SearchDB}",
13 dpavlin 4 "", "", { RaiseError => 1, AutoCommit => 1 } );
14     my $st =
15     $dbh->prepare(
16     " SELECT shares.ID AS ID, shares.share AS name FROM shares;");
17     $st->execute();
18     push (@ret, { 'ID' => '', 'name' => '-'});
19     while ( $tmp = $st->fetchrow_hashref() ) {
20     push( @ret, { 'ID' => $tmp->{'ID'}, 'name' => $tmp->{'name'} } );
21     }
22     $dbh->disconnect();
23     return @ret;
24     }
25    
26     sub getWhere($) {
27 dpavlin 19 my ($param) = @_;
28     my @conditions;
29 dpavlin 4
30 dpavlin 19 sub mk_iso_date($$) {
31     my ($name,$suffix) = @_;
32 dpavlin 4
33 dpavlin 19 my $yyyy = $param->{ $name . '_year_' . $suffix} || return;
34     my $mm .= $param->{ $name . '_month_' . $suffix} ||
35     ( $suffix eq 'from' ? 1 : 12);
36     my $dd .= $param->{ $name . '_day_' . $suffix} ||
37     ( $suffix eq 'from' ? 1 : 31);
38     return sprintf("%04d-%02d-%02d", $yyyy, $mm, $dd);
39     }
40 dpavlin 4
41 dpavlin 19 my $backup_from = mk_iso_date('search_backup', 'from');
42     push @conditions, qq{ date(backups.date, 'unixepoch','localtime') >= '$backup_from' } if ($backup_from);
43     my $backup_to = mk_iso_date('search_backup', 'to');
44     push @conditions, qq{ date(backups.date, 'unixepoch','localtime') <= '$backup_to' } if ($backup_to);
45 dpavlin 4
46 dpavlin 19 my $files_from = mk_iso_date('search', 'from');
47     push @conditions, qq{ date(files.date, 'unixepoch','localtime') >= '$files_from' } if ($files_from);
48     my $files_to = mk_iso_date('search', 'to');
49     push @conditions, qq{ date(files.date, 'unixepoch','localtime') <= '$files_to' } if ($files_to);
50    
51     print STDERR "backup: $backup_from - $backup_to files: $files_from - $files_to cond:",join(" | ",@conditions);
52 dpavlin 4
53 dpavlin 19 push( @conditions, ' backups.hostID = ' . $param->{'search_host'} ) if ($param->{'search_host'});
54 dpavlin 4
55 dpavlin 26 push (@conditions, " upper(files.name) LIKE upper('%".$param->{'search_filename'}."%')") if ($param->{'search_filename'});
56 dpavlin 19
57     return (
58     join(" and ", @conditions),
59     $files_from, $files_to,
60     $backup_from, $backup_to
61     );
62 dpavlin 4 }
63    
64 dpavlin 19
65 dpavlin 9 sub getFiles($$)
66 dpavlin 4 {
67 dpavlin 9 my ($where, $offset) = @_;
68 dpavlin 4
69 dpavlin 9
70 dpavlin 6 my $dbh = DBI->connect( "dbi:SQLite:dbname=${TopDir}/$Conf{SearchDB}",
71 dpavlin 4 "", "", { RaiseError => 1, AutoCommit => 1 } );
72     my $sql =
73     q{
74 dpavlin 16 SELECT files.id AS fid,
75     hosts.name AS hname,
76     shares.name AS sname,
77     shares.share AS sharename,
78     files.backupNum AS backupNum,
79     files.name AS filename,
80     files.path AS filepath,
81     shares.share||files.fullpath AS networkPath,
82     date(files.date, 'unixepoch', 'localtime') AS date,
83     files.type AS filetype,
84     files.size AS size,
85     dvds.name AS dvd
86     FROM files
87     INNER JOIN shares ON files.shareID=shares.ID
88     INNER JOIN hosts ON hosts.ID = shares.hostID
89 dpavlin 20 INNER JOIN backups ON backups.num = files.backupNum and backups.hostID = hosts.ID
90 dpavlin 16 LEFT JOIN dvds ON dvds.ID = files.dvdid
91 dpavlin 4 };
92    
93     if (defined($where) && $where ne "")
94     {
95     $sql .= " WHERE ". $where;
96     }
97    
98 dpavlin 9 $sql .=
99     q{
100     ORDER BY files.id
101     LIMIT 100
102     OFFSET ? * 100 + 1
103     };
104 dpavlin 4
105 dpavlin 9
106    
107 dpavlin 4 my $st = $dbh->prepare(
108     $sql
109     );
110 dpavlin 9 if (!defined($offset) && $offset ne "")
111     {
112     $st->bind_param(1, $offset);
113     }
114     else
115     {
116     $st->bind_param(1,0);
117     }
118 dpavlin 4 $st->execute;
119    
120     my @ret = ();
121     my $tmp;
122    
123     while ($tmp = $st->fetchrow_hashref())
124     {
125     push(@ret, {
126     'hname' => $tmp->{'hname'},
127     'sname' => $tmp->{'sname'},
128     'sharename' => $tmp->{'sharename'},
129     'backupno' => $tmp->{'backupNum'},
130     'fname' => $tmp->{'filename'},
131     'fpath' => $tmp->{'filepath'},
132     'networkpath' => $tmp->{'networkPath'},
133     'date' => $tmp->{'date'},
134     'type' => $tmp->{'filetype'},
135     'size' => $tmp->{'size'},
136     'id' => $tmp->{'fid'},
137     'dvd' => $tmp->{'dvd'}
138     }
139     );
140    
141     }
142    
143     $st->finish();
144     $dbh->disconnect();
145     return @ret;
146     }
147    
148     sub getBackupsNotBurned()
149     {
150 dpavlin 6 my $dbh = DBI->connect( "dbi:SQLite:dbname=${TopDir}/$Conf{SearchDB}",
151 dpavlin 4 "", "", { RaiseError => 1, AutoCommit => 1 } );
152     my $sql = q{
153     SELECT
154     hosts.ID AS hostID,
155     hosts.name AS host,
156     backups.num AS backupno,
157     backups.type AS type,
158     backups.date AS date
159     FROM backups, shares, files, hosts
160     WHERE
161     backups.num = files.backupNum AND
162     shares.ID = files.shareID AND
163     backups.hostID = shares.hostID AND
164     hosts.ID = backups.hostID AND
165     files.dvdid IS NULL
166     GROUP BY
167     backups.hostID, backups.num
168     };
169     my $st = $dbh -> prepare( $sql );
170     my @ret = ();
171     $st -> execute();
172    
173     while ( my $tmp = $st -> fetchrow_hashref() )
174     {
175     push(@ret, {
176     'host' => $tmp->{'host'},
177     'hostid' => $tmp->{'hostID'},
178     'backupno' => $tmp->{'backupno'},
179     'type' => $tmp->{'type'},
180     'date' => $tmp->{'date'}
181     }
182     );
183     }
184    
185     return @ret;
186     }
187    
188     sub displayBackupsGrid()
189     {
190     my $retHTML = "";
191     my $addForm = 1;
192    
193     if ($addForm)
194     {
195    
196     $retHTML .= <<EOF3;
197     <script language="javascript" type="text/javascript">
198     <!--
199    
200     function checkAll(location)
201     {
202     for (var i=0;i<document.forma.elements.length;i++)
203     {
204     var e = document.forma.elements[i];
205     if ((e.checked || !e.checked) && e.name != \'all\') {
206     if (eval("document.forma."+location+".checked")) {
207     e.checked = true;
208     } else {
209     e.checked = false;
210     }
211     }
212     }
213     }
214     //-->
215     </script>
216     EOF3
217     $retHTML .= q{<form name="forma" method="POST" action="}."$MyURL"."?action=burn\"";
218     $retHTML.= q{<input type="hidden" value="burn" name="action">};
219     $retHTML .= q{<input type="hidden" value="results" name="search_results">};
220     }
221     $retHTML .= "<table style=\"fview\">";
222     $retHTML .= "<tr> ";
223     if ($addForm)
224     {
225     $retHTML .= "<td class=\"tableheader\"><input type=\"checkbox\" name=\"allFiles\" onClick=\"checkAll('allFiles');\"></td>";
226     }
227     $retHTML .= "<td class=\"tableheader\">Host</td> <td class=\"tableheader\">Backup no</td> <td class=\"tableheader\">Type</td> <td class=\"tableheader\">date</td></tr>";
228     my @backups = getBackupsNotBurned();
229     my $backup;
230    
231     if ($addForm)
232     {
233     $retHTML .= "<tr>";
234     $retHTML .= "<td colspan=7 style=\"tableheader\">";
235     $retHTML .= "<input type=\"submit\" value=\"Burn selected backups on medium\" name=\"submitBurner\">";
236     $retHTML .= "</td>";
237     $retHTML .= "</tr>";
238    
239     }
240     foreach $backup(@backups)
241     {
242     my $ftype = "";
243    
244     $retHTML .= "<tr>";
245     if ($addForm)
246     {
247     $retHTML .= "<td class=\"fview\"> <input type=\"checkbox\" name=\"fcb"
248     .$backup->{'hostid'}."_".$backup->{'backupno'}
249     ."\" value=\"".$backup->{'hostid'}."_".$backup->{'backupno'}."\"> </td>";
250     }
251    
252     $retHTML .= "<td class=\"fviewborder\">" . $backup->{'host'} . "</td>";
253     $retHTML .= "<td class=\"fviewborder\">" . $backup->{'backupno'} . "</td>";
254     $retHTML .= "<td class=\"fviewborder\">" . $backup->{'type'} . "</td>";
255     $retHTML .= "<td class=\"fviewborder\">" . $backup->{'date'} . "<td>";
256     $retHTML .= "</tr>";
257     }
258     $retHTML .= "</table>";
259     if ($addForm)
260     {
261     $retHTML .= "</form>";
262     }
263    
264     return $retHTML;
265    
266    
267     }
268    
269 dpavlin 17 sub displayGrid($$$$) {
270     my ($where, $addForm, $offset, $hilite) = @_;
271     my $retHTML = "";
272    
273     if ($addForm) {
274     $retHTML .= qq{<form name="forma" method="POST" action="}.$MyURL.qq{?action=search">};
275     $retHTML.= qq{<input type="hidden" value="search" name="action">};
276     $retHTML .= qq{<input type="hidden" value="results" name="search_results">};
277 dpavlin 4 }
278 dpavlin 17 $retHTML .= qq{
279     <table style="fview" width="100%">
280     <tr>
281 dpavlin 26 <td class="tableheader">Share</td>
282 dpavlin 24 <td class="tableheader">Name</td>
283 dpavlin 17 <td class="tableheader">Type</td>
284 dpavlin 24 <td class="tableheader">#</td>
285     <td class="tableheader">Size</td>
286     <td class="tableheader">Date</td>
287 dpavlin 17 <td class="tableheader">Media</td>
288     </tr>
289     };
290     my @files = getFiles($where, $offset);
291     my $file;
292 dpavlin 4
293 dpavlin 17 sub hilite_html($$) {
294     my ($html, $search) = @_;
295     $html =~ s#($search)#<b>$1</b>#gis;
296     return $html;
297 dpavlin 4 }
298 dpavlin 9
299 dpavlin 26 sub restore_link($$$$$$) {
300     my $type = shift;
301     my $action = 'RestoreFile';
302     $action = 'browse' if (lc($type) eq 'dir');
303     return sprintf(qq{<a href="?action=%s&host=%s&num=%d&share=%s&dir=%s">%s</a>}, $action, @_);
304     }
305    
306 dpavlin 17 foreach $file (@files) {
307 dpavlin 24 my $typeStr = BackupPC::Attrib::fileType2Text(undef, $file->{'type'});
308 dpavlin 17 $retHTML .= "<tr>";
309 dpavlin 9
310 dpavlin 17 foreach my $v ((
311 dpavlin 26 $file->{'sharename'},
312 dpavlin 24 qq{<img src="$Conf{CgiImageDirURL}/icon-$typeStr.gif" align="center">&nbsp;} . hilite_html( $file->{'fpath'}, $hilite ),
313     $typeStr,
314 dpavlin 26 restore_link( $typeStr, $file->{'hname'}, $file->{'backupno'}, $file->{'sname'}, $file->{'fpath'}, $file->{'backupno'} ),
315 dpavlin 17 $file->{'size'},
316     $file->{'date'},
317     $file->{'dvd'}
318     )) {
319     $retHTML .= qq{<td class="fviewborder">$v</td>};
320     }
321 dpavlin 9
322 dpavlin 17 $retHTML .= "</tr>";
323     }
324     $retHTML .= "</table>";
325    
326     # skip pager
327     return $retHTML;
328    
329     $retHTML .= "<INPUT TYPE=\"hidden\" VALUE=\"\" NAME=\"offset\">";
330     for (my $ii = 1; $ii <= $#files; $ii++) {
331     $retHTML .= "<a href = \"#\" onclick=\"document.forma.offset.value=$ii;document.forma.submit();\">$ii</a>";
332     if ($ii < $#files) {
333     $retHTML .= " | ";
334     }
335     }
336    
337     $retHTML .= "</form>" if ($addForm);
338 dpavlin 4
339 dpavlin 17 return $retHTML;
340     }
341 dpavlin 4
342     1;

  ViewVC Help
Powered by ViewVC 1.1.26