}
$this->db = new PHPFSPOT_DB($this, $this->cfg->fspot_db);
+ if(!is_writeable($this->cfg->fspot_db)) {
+ print $this->cfg->fspot_db ." is not writeable for user ". $this->getuid() ."\n";
+ exit(1);
+ }
if(!is_writeable(dirname($this->cfg->phpfspot_db))) {
print dirname($this->cfg->phpfspot_db) .": directory is not writeable!";
require_once "phpfspot_tmpl.php";
$this->tmpl = new PHPFSPOT_TMPL($this);
- $this->get_tags();
+ /* check if all necessary indices exist */
+ $this->checkDbIndices();
session_start();
if(isset($this->cfg->show_tags) && !empty($this->cfg->show_tags)) {
$query_str="
SELECT
- DISTINCT t1.id,t1.name
+ DISTINCT t1.id as id, t1.name as name
FROM
photo_tags pt1
INNER JOIN photo_tags
INNER JOIN tags t2
ON t2.id=pt2.tag_id
WHERE
- t2.name IN ('
- ".implode("','",$this->cfg->show_tags)."
- ')
+ t2.name IN ('".implode("','",$this->cfg->show_tags)."')
ORDER BY
t1.sort_priority ASC";
+
$result = $this->db->db_query($query_str);
}
else
*/
public function getAvailableTags()
{
+ $this->get_tags();
+
$output = "";
$result = $this->db->db_query("
*/
public function getSelectedTags()
{
+ $this->get_tags();
+
$output = "";
foreach($this->avail_tags as $tag)
{
/* return a search result */
if(isset($_SESSION['searchfor']) && $_SESSION['searchfor'] != '') {
$query_str = "
- SELECT DISTINCT photo_id
- FROM photo_tags pt
+ SELECT DISTINCT pt1.photo_id
+ FROM photo_tags pt1
+ INNER JOIN photo_tags pt2
+ ON pt1.photo_id=pt2.photo_id
+ INNER JOIN tags t1
+ ON pt1.tag_id=t1.id
INNER JOIN photos p
- ON p.id=pt.photo_id
- INNER JOIN tags t
- ON pt.tag_id=t.id
- WHERE t.name LIKE '%". $_SESSION['searchfor'] ."%'";
+ ON pt1.photo_id=p.id
+ INNER JOIN tags t2
+ ON pt2.tag_id=t2.id
+ WHERE t1.name LIKE '%". $_SESSION['searchfor'] ."%' ";
if(isset($additional_where_cond))
$query_str.= "AND ". $additional_where_cond ." ";
if(isset($this->cfg->show_tags) && !empty($this->cfg->show_tags)) {
- $query_str.= "AND t.name IN ('".implode("','",$this->cfg->show_tags)."')";
+ $query_str.= "AND t2.name IN ('".implode("','",$this->cfg->show_tags)."')";
}
if(isset($order_str))
$selected.= $tag .",";
$selected = substr($selected, 0, strlen($selected)-1);
+ /* photo has to match at least on of the selected tags */
if($_SESSION['tag_condition'] == 'or') {
$query_str = "
- SELECT DISTINCT pt.photo_id
- FROM photo_tags pt
- INNER JOIN photos p
- ON p.id=pt.photo_id
+ SELECT DISTINCT pt1.photo_id
+ FROM photo_tags pt1
+ INNER JOIN photo_tags pt2
+ ON pt1.photo_id=pt2.photo_id
INNER JOIN tags t
- ON pt.tag_id=t.id
- WHERE pt.tag_id IN (". $selected .")
+ ON pt2.tag_id=t.id
+ INNER JOIN photos p
+ ON pt1.photo_id=p.id
+ WHERE pt1.tag_id IN (". $selected .")
";
if(isset($additional_where_cond))
$query_str.= "AND ". $additional_where_cond ." ";
if(isset($order_str))
$query_str.= $order_str;
}
+ /* photo has to match all selected tags */
elseif($_SESSION['tag_condition'] == 'and') {
if(count($_SESSION['selected_tags']) >= 32) {
*/
public function startSearch($searchfor, $sort_order, $from = 0, $to = 0)
{
+ $this->get_tags();
+
$_SESSION['searchfor'] = $searchfor;
$_SESSION['sort_order'] = $sort_order;
if($from != 0)
} // check_readable()
+ /**
+ * check if all needed indices are present
+ *
+ * this function checks, if some needed indices are already
+ * present, or if not, create them on the fly. they are
+ * necessary to speed up some queries like that one look for
+ * all tags, when show_tags is specified in the configuration.
+ */
+ private function checkDbIndices()
+ {
+ $result = $this->db->db_exec("
+ CREATE INDEX IF NOT EXISTS
+ phototag
+ ON
+ photo_tags
+ (photo_id, tag_id)
+ ");
+
+ } // checkDbIndices()
+
}
?>