Bacula-users

Re: [Bacula-users] Searching for files

2010-10-28 05:05:53
Subject: Re: [Bacula-users] Searching for files
From: Bruno Friedmann <bruno AT ioda-net DOT ch>
To: bacula-users AT lists.sourceforge DOT net
Date: Thu, 28 Oct 2010 11:02:11 +0200
It would be cool to post code as attachement in text utf-8 formatted.

HTML in message is just EVIL :-)


On 10/27/2010 11:30 AM, ladolf wrote:
> 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]


-- 

Bruno Friedmann (irc:tigerfoot)
Ioda-Net Sàrl www.ioda-net.ch
 openSUSE Member
    User www.ioda.net/r/osu
    Blog www.ioda.net/r/blog
  fsfe fellowship www.fsfe.org
GPG KEY : D5C9B751C4653227
vcard : http://it.ioda-net.ch/ioda-net.vcf

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