/[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 19 - (hide annotations)
Mon Jul 11 14:32:40 2005 UTC (18 years, 10 months ago) by dpavlin
File size: 9253 byte(s)
display limits in search, easier to understand filter generator (and correct
one -- doesn't require users to enter dates as 01 01 2001)

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

  ViewVC Help
Powered by ViewVC 1.1.26