Bacula-users

[Bacula-users] Searching for files

2010-10-27 05:36:26
Subject: [Bacula-users] Searching for files
From: ladolf <bacula-forum AT backupcentral DOT com>
To: bacula-users AT lists.sourceforge DOT net
Date: Wed, 27 Oct 2010 05:30:56 -0400
I managed to create PHP script that searches for file or folder. It is written 
for MySQL database and tested on Bacula 3 with Firefox browser. It supports 
case insensitive search for file or folder, with or without regular expressions 
and possibility to specify date range. Don't set too high number for "Results 
per page". I have about 20 milions filenames in database and search tool works 
fast enough for not too complex search.

To use the sript create folder somewhere in your apache folder (there must be 
access to bacula database from this server), and create empty files config.php, 
index.php, script.js, search.php and style.css.

Here is the code:
-------------------
config.php (don't forget to set the values for your environment)

<?php
&nbsp; &nbsp; //Database data
&nbsp; &nbsp; $DB_HOST = "localhost";
&nbsp; &nbsp; $DB_NAME = "baculdatabasename";
&nbsp; &nbsp; $DB_USER = "baculamysqluser";
&nbsp; &nbsp; $DB_PASS = "baculamysqlpass";
&nbsp; &nbsp; $DB_SET_NAMES = "UTF8";

&nbsp; &nbsp; //Character encoding for WEB page
&nbsp; &nbsp; $WEB_CHARSET = "UTF-8";
&nbsp; &nbsp; 
&nbsp; &nbsp; //Maximum number of seconds for script execution
&nbsp; &nbsp; $TIME_LIMIT_SECONDS = 300;
?>


-------------------
index.php

<?php
&nbsp; &nbsp; include&#40;dirname&#40;__FILE__&#41;."/config.php"&#41;;
&nbsp; &nbsp; 
&nbsp; &nbsp; $today = date&#40;"Y-m-d"&#41;;
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
"http&#58;//www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http&#58;//www.w3.org/1999/xhtml">
<head>
&nbsp; &nbsp; <title>Bacula search tool</title>
&nbsp; &nbsp; <meta http-equiv="Content-Type" content="text/html; charset=<?php 
echo $WEB_CHARSET; ?>" />
&nbsp; &nbsp; <link href="style.css" rel="stylesheet" type="text/css" />
&nbsp; &nbsp; <script type="text/javascript" src="./script.js"></script>
</head>
<body>
&nbsp; &nbsp; <h1>Bacula search tool</h1>
&nbsp; &nbsp; <form method="get" action="<?php echo basename&#40; 
__FILE__&#41;; ?>">
&nbsp; &nbsp; &nbsp; &nbsp; <table cellspacing="0" cellpadding="5" 
id="searchformtable">
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <tr>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <td>Type of 
search&#58;</td>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <td>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <input 
type="radio" name="searchobject" value="folder" checked />Search for folder<br 
/>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <input 
type="radio" name="searchobject" value="file" />Search for file
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </td>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </tr>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <tr>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <td>Search for&#58;</td>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <td>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <input 
type="text" name="searchstr" id="searchstr" size="30" maxlength="255" value="" 
/>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <input 
type="checkbox" id="regexp" /> Regular expression
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </td>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </tr>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <tr>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <td>Date range</td>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <td>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <input 
type="checkbox" id="daterange" />Only search for files that were created 
between selected dates&#58;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <table>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; <tr><td>Start date&#58;</td><td><input type="text" name="startdate" 
id="startdate" size="10" maxlength="10" value="<?php echo $today; ?>" /> 
&#40;e.g. 2010-05-28&#41;</td></tr>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; <tr><td>End date&#58;</td><td><input type="text" name="enddate" 
id="enddate" size="10" maxlength="10" value="<?php echo $today; ?>" /></td></tr>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </table>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </td>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </tr>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <tr><td valign="top">Results per 
page&#58;</td><td><input type="text" name="limit" id="limit" value="20" 
size="5" maxlength="5" /></td></tr>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <tr><td>&nbsp;</td><td><input 
type="button" value="Search" onclick="javascript&#58; 
get_search_results&#40;'<?php echo $WEB_CHARSET; ?>', 0&#41;;" /></td></tr>
&nbsp; &nbsp; &nbsp; &nbsp; </table>
&nbsp; &nbsp; </form>
&nbsp; &nbsp; 
&nbsp; &nbsp; <br />
&nbsp; &nbsp; 
&nbsp; &nbsp; <!-- Here comes previous and next button -->
&nbsp; &nbsp; <div id="prev_next"></div>
&nbsp; &nbsp; 
&nbsp; &nbsp; <!-- Here comes search results -->
&nbsp; &nbsp; <div id="search_results"></div>
</body>
</html>


-------------------
script.js

/**
* Use AJAX to get data
*/
function get_search_results&#40;charset, limitstart&#41; &#123;
&nbsp; &nbsp; //Div for results
&nbsp; &nbsp; var res_div = document.getElementById&#40;"search_results"&#41;;
&nbsp; &nbsp; 
&nbsp; &nbsp; //Are we looking for folder or for a file
&nbsp; &nbsp; if 
&#40;document.getElementsByName&#40;"searchobject"&#41;&#91;0&#93;.checked&#41; 
&#123;
&nbsp; &nbsp; &nbsp; &nbsp; var so = "folder";
&nbsp; &nbsp; &#125; else &#123;
&nbsp; &nbsp; &nbsp; &nbsp; var so = "file";
&nbsp; &nbsp; &#125;
&nbsp; &nbsp; 
&nbsp; &nbsp; //Get number of pages per page
&nbsp; &nbsp; var limit = 
parseInt&#40;document.getElementById&#40;"limit"&#41;.value&#41;;
&nbsp; &nbsp; 
&nbsp; &nbsp; //Get search string
&nbsp; &nbsp; var search_str = 
document.getElementById&#40;"searchstr"&#41;.value;
&nbsp; &nbsp; 
&nbsp; &nbsp; //Is search string regular expression
&nbsp; &nbsp; if &#40;document.getElementById&#40;"regexp"&#41;.checked&#41; 
&#123;
&nbsp; &nbsp; &nbsp; &nbsp; var is_regexp = "1";
&nbsp; &nbsp; &#125; else &#123;
&nbsp; &nbsp; &nbsp; &nbsp; var is_regexp = "0";
&nbsp; &nbsp; &#125;
&nbsp; &nbsp; 
&nbsp; &nbsp; //Search between two dates
&nbsp; &nbsp; if &#40;document.getElementById&#40;"daterange"&#41;.checked&#41; 
&#123;
&nbsp; &nbsp; &nbsp; &nbsp; var start_date = 
document.getElementById&#40;"startdate"&#41;.value;
&nbsp; &nbsp; &nbsp; &nbsp; var end_date = 
document.getElementById&#40;"enddate"&#41;.value;
&nbsp; &nbsp; &nbsp; &nbsp; var use_dates = true;
&nbsp; &nbsp; &#125; else &#123;
&nbsp; &nbsp; &nbsp; &nbsp; var use_dates = false;
&nbsp; &nbsp; &#125;

&nbsp; &nbsp; //Build POST parameters
&nbsp; &nbsp; var params = "searchstr=" + escape&#40;search_str&#41; + 
"&searchobject=" + so + "&start=" + limitstart + "&limit=" + limit;
&nbsp; &nbsp; params += "&isregexp=" + is_regexp;
&nbsp; &nbsp; if &#40;use_dates&#41; &#123;
&nbsp; &nbsp; &nbsp; &nbsp; params += "&startdate=" + 
escape&#40;start_date&#41; + "&enddate=" + escape&#40;end_date&#41;;
&nbsp; &nbsp; &#125;
&nbsp; &nbsp; 
&nbsp; &nbsp; res_div.innerHTML = "Loading ... &#40;Please be patient&#41;";
&nbsp; &nbsp;
&nbsp; &nbsp; //Create AJAX object
&nbsp; &nbsp; if &#40;window.XMLHttpRequest&#41; &#123;
&nbsp; &nbsp; &nbsp; &nbsp; xmlhttp = new XMLHttpRequest&#40;&#41;;
&nbsp; &nbsp; &#125; else &#123;
&nbsp; &nbsp; &nbsp; &nbsp; xmlhttp = new 
ActiveXObject&#40;"Microsoft.XMLHTTP"&#41;;
&nbsp; &nbsp; &#125;

&nbsp; &nbsp; xmlhttp.onreadystatechange = function&#40;&#41; &#123;
&nbsp; &nbsp; &nbsp; &nbsp; if &#40;xmlhttp.readyState == 4 && xmlhttp.status 
== 200&#41; &#123;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //Display search results
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; res_div.innerHTML = 
xmlhttp.responseText;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //Get number of results
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var result_rows = 
document.getElementById&#40;'resulttable'&#41;.getElementsByTagName&#40;"TR"&#41;.length
 - 1;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //Display previous and next button
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; display_prev_next_btn&#40;charset, 
limitstart, limit, result_rows&#41;;
&nbsp; &nbsp; &nbsp; &nbsp; &#125;
&nbsp; &nbsp; &#125;
&nbsp; &nbsp; xmlhttp.open&#40;"POST", "search.php", true&#41;;
&nbsp; &nbsp; xmlhttp.setRequestHeader&#40;"Content-type", 
"application/x-www-form-urlencoded; Charset= " + charset&#41;
&nbsp; &nbsp; xmlhttp.send&#40;params&#41;;
&#125;

/**
* Display previous and next button
*/
function display_prev_next_btn&#40;charset, limitstart, limit, result_rows&#41; 
&#123;
&nbsp; &nbsp; //Div for buttons
&nbsp; &nbsp; var pn_div = document.getElementById&#40;"prev_next"&#41;;
&nbsp; &nbsp; 
&nbsp; &nbsp; 
&nbsp; &nbsp; 
&nbsp; &nbsp; //Display buttons
&nbsp; &nbsp; pn_div.innerHTML = '';
&nbsp; &nbsp; if &#40;limitstart >= 1&#41; &#123; //Previous page
&nbsp; &nbsp; &nbsp; &nbsp; var prev_limitstart = limitstart - limit;
&nbsp; &nbsp; &nbsp; &nbsp; pn_div.innerHTML += '<input type="button" 
value="&lt;" onclick="get_search_results&#40;' + "'" + charset + "'" + ', ' + 
prev_limitstart + ',' + limit + '&#41;" />';
&nbsp; &nbsp; &#125;
&nbsp; &nbsp; pn_div.innerHTML += '&nbsp;';
&nbsp; &nbsp; pn_div.innerHTML += 'Page ' + &#40;&#40;limitstart / limit&#41; + 
1&#41;;
&nbsp; &nbsp; pn_div.innerHTML += '&nbsp;';

&nbsp; &nbsp; if &#40;result_rows == limit&#41; &#123; //Next page
&nbsp; &nbsp; &nbsp; &nbsp; var next_limitstart = limitstart + limit;
&nbsp; &nbsp; &nbsp; &nbsp; pn_div.innerHTML += '<input type="button" 
value="&gt;" onclick="get_search_results&#40;' + "'" + charset + "'" + ', ' + 
next_limitstart + ',' + limit + '&#41;" />';
&nbsp; &nbsp; &#125;
&#125;


-------------------
search.php

<?php

&nbsp; &nbsp; include&#40;dirname&#40;__FILE__&#41;."/config.php"&#41;;

&nbsp; &nbsp; //Set higher time limit than normal
&nbsp; &nbsp; set_time_limit&#40;$TIME_LIMIT_SECONDS&#41;;

&nbsp; &nbsp; if &#40;isset&#40;$_POST&#91;"searchstr"&#93;&#41; && 
$_POST&#91;"searchstr"&#93; != ""&#41; &#123;&nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; $searchstr = $_POST&#91;"searchstr"&#93;;
&nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; if 
&#40;isset&#40;$_POST&#91;"searchobject"&#93;&#41;&#41; &#123; //Search for 
path or search for file must be set
&nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //Get start for limit
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if 
&#40;isset&#40;$_POST&#91;"start"&#93;&#41; && 
is_numeric&#40;$_POST&#91;"start"&#93;&#41;&#41; &#123;&nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $start = 
$_POST&#91;"start"&#93;;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#125; else &#123;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $start = 0;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#125;
&nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //Get limit
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if 
&#40;isset&#40;$_POST&#91;"limit"&#93;&#41; && 
is_numeric&#40;$_POST&#91;"limit"&#93;&#41;&#41; &#123;&nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $limit = 
$_POST&#91;"limit"&#93;;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#125; else &#123;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $limit = 20;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#125;
&nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //Connect to mysql database
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $c = @mysql_connect&#40;$DB_HOST, 
$DB_USER, $DB_PASS&#41; or die &#40;"<br />Error&#58; <b>Cannot connect to 
database</b>&#58; ".mysql_error&#40;&#41;.""&#41;; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @mysql_select_db &#40;$DB_NAME, 
$c&#41; or die&#40;"<br />Error&#58; ".mysql_error&#40;&#41;&#41;;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @mysql_query&#40;"SET NAMES 
&#123;$DB_SET_NAMES&#125;"&#41;;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //Use date range?
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if 
&#40;isset&#40;$_POST&#91;"startdate"&#93;&#41; && 
isset&#40;$_POST&#91;"enddate"&#93;&#41;&#41; &#123;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $startdate = 
$_POST&#91;"startdate"&#93;;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $enddate = 
$_POST&#91;"enddate"&#93;;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $date_qubquery = " AND 
J.StartTime >= '&#123;$startdate&#125; 00&#58;00&#58;00' AND J.EndTime <= 
'&#123;$enddate&#125; 23&#58;59&#58;59'";
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#125;

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //Escape search string
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $searchstr_esc = 
mysql_real_escape_string&#40;$searchstr, $c&#41;;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //If the search string is regular 
expression, use "REXEXP" instead "LIKE"
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if 
&#40;isset&#40;$_POST&#91;"isregexp"&#93;&#41; && 
&#40;$_POST&#91;"isregexp"&#93; == "1"&#41;&#41; &#123;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $comparison = "REGEXP 
'&#123;$searchstr_esc&#125;'";
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#125; else &#123; //not regular 
expression
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $comparison = "LIKE 
'%&#123;$searchstr_esc&#125;%'";
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#125;

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //Build SQL statement
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if 
&#40;$_POST&#91;"searchobject"&#93; == "file"&#41; &#123;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //SELECT By Filename
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $query_string = "
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SELECT 
DISTINCT CONCAT&#40;P.Path, FN.Name&#41;, F.JobId AS JID, J.Name, J.StartTime, 
J.EndTime&nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FROM 
Filename FN, File F, Path P, Job J 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WHERE 
FN.FilenameId=F.FilenameId AND F.PathId=P.PathId&#123;$date_qubquery&#125; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; AND J.JobId=F.JobId AND CONVERT&#40;FN.Name USING 
&#123;$DB_SET_NAMES&#125;&#41; &#123;$comparison&#125; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; LIMIT &#123;$start&#125;,&#123;$limit&#125;";
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#125; else &#123;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //Select By Folder name
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $query_string = "
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SELECT 
DISTINCT P.Path, F.JobId AS JID, J.Name, J.StartTime, J.EndTime&nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FROM Path 
P, File F, Job J 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WHERE 
P.PathId=F.PathId AND J.JobId=F.JobId&#123;$date_qubquery&#125; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; AND CONVERT&#40;P.Path USING &#123;$DB_SET_NAMES&#125;&#41; 
&#123;$comparison&#125; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; LIMIT 
&#123;$start&#125;,&#123;$limit&#125;";
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#125;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //Execute query
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $result = 
@mysql_query&#40;$query_string, $c&#41; or die&#40;"<br />SQL Error&#58; 
".mysql_error&#40;&#41;."<br />QUERY&#58; ".$query&#41;;

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //Display search results
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if 
&#40;mysql_num_rows&#40;$result&#41; > 0&#41; &#123;&nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $DATA_ARR = 
array&#40;&#41;; //Temporary array of data
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $JOB_IDS&nbsp; = 
array&#40;&#41;; //Array of job IDs for current limit
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while &#40;$row = 
mysql_fetch_array&#40;$result&#41;&#41; &#123;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
array_push&#40;$DATA_ARR, $row&#41;;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if 
&#40;is_numeric&#40;$row&#91;"JID"&#93;&#41; && 
!in_array&#40;$row&#91;"JID"&#93;, $JOB_IDS&#41;&#41; &#123;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; array_push&#40;$JOB_IDS, $row&#91;"JID"&#93;&#41;;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#125;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#125;
&nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //Get volume names for 
media used by job ids
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $query = "Select 
DISTINCT JM.JobId, M.VolumeName FROM JobMedia JM LEFT JOIN Media M ON 
M.MediaId=JM.MediaId WHERE JM.JobId IN &#40;".implode&#40;",", 
$JOB_IDS&#41;."&#41;";
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $r2 = 
@mysql_query&#40;$query, $c&#41; or die&#40;"<br />SQL Error&#58; 
".mysql_error&#40;&#41;."<br />QUERY&#58; ".$query&#41;;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $JOBMEDIA = 
array&#40;&#41;;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while 
&#40;list&#40;$jobid, $volname&#41; = mysql_fetch_array&#40;$r2&#41;&#41; &#123;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
$JOBMEDIA&#91;$jobid&#93; = $volname;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#125;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //Display table of data
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; echo "\n\t<table 
cellspacing=\"0\" cellpadding=\"2\" id=\"resulttable\" width=\"100%\">";
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; echo "\n\t\t<tr 
class=\"thead\"><td>Path</td><td>JobID</td><td>Job name</td><td>Job 
time</td><td>Media</td></tr>";
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; foreach &#40;$DATA_ARR 
as $row&#41; &#123;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
list&#40;$path, $jobid, $jobname, $jobstart, $jobend&#41; = $row;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //Mark 
folder/file in green color
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $path = 
preg_replace&#40;"/&#40;&#123;$searchstr&#125;&#41;/iU", "<font 
style=\"color&#58; #090;\">\\1</font>", $path&#41;;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //Get 
media name
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if 
&#40;isset&#40;$JOBMEDIA&#91;$jobid&#93;&#41;&#41; &#123;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; $medianame = $JOBMEDIA&#91;$jobid&#93;;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#125; 
else &#123;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; $medianame = "???";
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#125;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //Display 
result row
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; echo 
"\n\t\t<tr 
class=\"datarow\"><td>&#123;$path&#125;</td><td><b>&#123;$jobid&#125;</b></td><td>&#123;$jobname&#125;</td><td>&#123;$jobstart&#125;<br
 />&#123;$jobend&#125;</td><td>&#123;$medianame&#125;</td></tr>";
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#125;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; echo "\n\t</table>";
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; echo "<br 
/><b>Displaying results &#123;$start&#125; - ".&#40;$start + $limit&#41;."</b>";
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#125; else &#123;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; echo "<br />No records 
has been found!";
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#125;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //Close connection to mysql
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @mysql_close&#40;$c&#41;;
&nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &#125; else &#123;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; echo "<br /><b>Please select 
&quot;Search file&quot; or &quot;Search folder&quot;.</b>";
&nbsp; &nbsp; &nbsp; &nbsp; &#125;
&nbsp; &nbsp; &#125; else &#123;
&nbsp; &nbsp; &nbsp; &nbsp; echo "Search string has not been submitted!";
&nbsp; &nbsp; &#125;

?>


-------------------
style.css

body &#123;
&nbsp; &nbsp; background-color&#58; #ddf;
&nbsp; &nbsp; font-family&#58; Verdana, Helvetica, Tahoma, Arial;
&nbsp; &nbsp; font-size&#58; 10px;
&nbsp; &nbsp; color&#58; #000;
&#125;

input &#123;
&nbsp; &nbsp; border&#58; solid 1px #aaa;
&nbsp; &nbsp; background-color&#58; #feb;
&nbsp; &nbsp; margin-left&#58; 0px;
&#125;

input&#91;type="button"&#93; &#123;
&nbsp; &nbsp; border&#58; solid 2px #aaa;
&nbsp; &nbsp; border-right&#58; solid 2px #777;
&nbsp; &nbsp; border-bottom&#58; solid 2px #777;
&nbsp; &nbsp; background-color&#58; #eee;
&#125;

#searchformtable&nbsp; &#123;
&nbsp; &nbsp; background-color&#58; #ddd;
&nbsp; &nbsp; border&#58; 1px solid #000;
&#125;

#searchformtable td &#123;
&nbsp; &nbsp; vertical-align&#58; top;
&#125;

#resulttable &#123;
&nbsp; &nbsp; border&#58; 1px solid #000;
&#125;

.thead &#123;
&nbsp; &nbsp; background-color&#58; #ffbb1d;
&nbsp; &nbsp; font-weight&#58; bold;
&#125;

.datarow &#123;
&nbsp; &nbsp; background-color&#58; #eee;
&#125;

.datarow td &#123;
&nbsp; &nbsp; border-top&#58; 1px solid #000;
&nbsp; &nbsp; vertical-align&#58; top;
&#125;
[/code]

+----------------------------------------------------------------------
|This was sent by lado.langof AT gmail DOT com via Backup Central.
|Forward SPAM to abuse AT backupcentral DOT com.
+----------------------------------------------------------------------



------------------------------------------------------------------------------
Nokia and AT&T present the 2010 Calling All Innovators-North America contest
Create new apps & games for the Nokia N8 for consumers in  U.S. and Canada
$10 million total in prizes - $4M cash, 500 devices, nearly $6M in marketing
Develop with Nokia Qt SDK, Web Runtime, or Java and Publish to Ovi Store 
http://p.sf.net/sfu/nokia-dev2dev
_______________________________________________
Bacula-users mailing list
Bacula-users AT lists.sourceforge DOT net
https://lists.sourceforge.net/lists/listinfo/bacula-users