X-Git-Url: https://git.nubati.net/cgi-bin/gitweb.cgi?p=phpfspot.git;a=blobdiff_plain;f=phpfspot.class.php;h=841da503f46454bb9ac38c458172b9c13d123e44;hp=82722529e89790adf21ad110a5736b76f93c6d90;hb=8de7a22ceac0fab9eb984854758608d7aeb079d3;hpb=33dba06cdcb7b66063bb941aa5f2a985de3fed94 diff --git a/phpfspot.class.php b/phpfspot.class.php index 8272252..841da50 100644 --- a/phpfspot.class.php +++ b/phpfspot.class.php @@ -54,6 +54,10 @@ class PHPFSPOT { } $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!"; @@ -76,7 +80,8 @@ class PHPFSPOT { require_once "phpfspot_tmpl.php"; $this->tmpl = new PHPFSPOT_TMPL($this); - $this->get_tags(); + /* check if all necessary indices exist */ + $this->checkDbIndices(); session_start(); @@ -199,7 +204,7 @@ class PHPFSPOT { 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 @@ -209,11 +214,10 @@ class PHPFSPOT { 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 @@ -473,6 +477,8 @@ class PHPFSPOT { */ public function getAvailableTags() { + $this->get_tags(); + $output = ""; $result = $this->db->db_query(" @@ -542,6 +548,8 @@ class PHPFSPOT { */ public function getSelectedTags() { + $this->get_tags(); + $output = ""; foreach($this->avail_tags as $tag) { @@ -672,19 +680,23 @@ class PHPFSPOT { /* 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)) @@ -704,15 +716,18 @@ class PHPFSPOT { $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 ." "; @@ -724,6 +739,7 @@ class PHPFSPOT { 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) { @@ -1253,6 +1269,8 @@ class PHPFSPOT { $this->_debug("Image [". $idx ."] ". $this->shrink_text($details['name'], 20) ." Thumbnails:"); + $changes = false; + foreach($resolutions as $resolution) { $thumb_sub_path = substr($file_md5, 0, 2); @@ -1268,6 +1286,8 @@ class PHPFSPOT { $this->_debug(" ". $resolution ."px"); if(!$this->create_thumbnail($full_path, $thumb_path, $resolution)) $error = 1; + + $changes = true; } /* if the file hasn't changed there is no need to regen the thumb */ elseif($file_md5 != $this->getMD5($idx) || $force) { @@ -1276,9 +1296,14 @@ class PHPFSPOT { if(!$this->create_thumbnail($full_path, $thumb_path, $resolution)) $error = 1; + $changes = true; } } + if(!$changes) { + $this->_debug(" already exist"); + } + /* set the new/changed MD5 sum for the current photo */ if(!$error) { $this->setMD5($idx, $file_md5); @@ -1345,6 +1370,8 @@ class PHPFSPOT { */ public function startSearch($searchfor, $sort_order, $from = 0, $to = 0) { + $this->get_tags(); + $_SESSION['searchfor'] = $searchfor; $_SESSION['sort_order'] = $sort_order; if($from != 0) @@ -2064,6 +2091,26 @@ class PHPFSPOT { } // 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() + } ?>