+ /**
+ * returns the number of photos which are tagged with $tag_id
+ * @param integer $tag_id
+ * @return integer
+ */
+ public function get_num_photos($tag_id)
+ {
+ if($result = $this->db->db_fetchSingleRow("
+ SELECT count(*) as number
+ FROM photo_tags
+ WHERE
+ tag_id LIKE '". $tag_id ."'")) {
+
+ return $result['number'];
+
+ }
+
+ return 0;
+
+ } // get_num_photos()
+
+ /**
+ * check file exists and is readable
+ *
+ * returns true, if everything is ok, otherwise false
+ * if $silent is not set, this function will output and
+ * error message
+ * @param string $file
+ * @param boolean $silent
+ * @retrun boolean
+ */
+ private function check_readable($file, $silent = null)
+ {
+ if(!file_exists($file)) {
+ if(!isset($silent))
+ print "File \"". $file ."\" does not exist.\n";
+ return false;
+ }
+
+ if(!is_readable($file)) {
+ if(!isset($silent))
+ print "File \"". $file ."\" is not reachable for user ". $this->getuid() ."\n";
+ return false;
+ }
+
+ return true;
+
+ } // 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()
+
+ /**
+ * retrive F-Spot database version
+ *
+ * this function will return the F-Spot database version number
+ * It is stored within the sqlite3 database in the table meta
+ * @return string|null
+ */
+ public function getFspotDBVersion()
+ {
+ if($result = $this->db->db_fetchSingleRow("
+ SELECT data as version
+ FROM meta
+ WHERE
+ name LIKE 'F-Spot Database Version'
+ "))
+ return $result['version'];
+
+ return null;
+
+ } // getFspotDBVersion()
+
+ /**
+ * parse the provided URI and will returned the requested chunk
+ * @param string $uri
+ * @param string $mode
+ * @return string
+ */
+ public function parse_uri($uri, $mode)
+ {
+ if(($components = parse_url($uri)) !== false) {
+
+ switch($mode) {
+ case 'filename':
+ return basename($components['path']);
+ break;
+ case 'dirname':
+ return dirname($components['path']);
+ break;
+ case 'fullpath':
+ return $components['path'];
+ break;
+ }
+ }
+
+ return $uri;
+
+ } // parse_uri()
+
+ /**
+ * validate config options
+ *
+ * this function checks if all necessary configuration options are
+ * specified and set.
+ * @return boolean
+ */
+ private function check_config_options()
+ {
+ if(!isset($this->cfg->page_title) || $this->cfg->page_title == "")
+ $this->_error("Please set \$page_title in phpfspot_cfg");
+
+ if(!isset($this->cfg->base_path) || $this->cfg->base_path == "")
+ $this->_error("Please set \$base_path in phpfspot_cfg");
+
+ if(!isset($this->cfg->web_path) || $this->cfg->web_path == "")
+ $this->_error("Please set \$web_path in phpfspot_cfg");
+
+ if(!isset($this->cfg->thumb_path) || $this->cfg->thumb_path == "")
+ $this->_error("Please set \$thumb_path in phpfspot_cfg");
+
+ if(!isset($this->cfg->smarty_path) || $this->cfg->smarty_path == "")
+ $this->_error("Please set \$smarty_path in phpfspot_cfg");
+
+ if(!isset($this->cfg->fspot_db) || $this->cfg->fspot_db == "")
+ $this->_error("Please set \$fspot_db in phpfspot_cfg");
+
+ if(!isset($this->cfg->db_access) || $this->cfg->db_access == "")
+ $this->_error("Please set \$db_access in phpfspot_cfg");
+
+ if(!isset($this->cfg->phpfspot_db) || $this->cfg->phpfspot_db == "")
+ $this->_error("Please set \$phpfspot_db in phpfspot_cfg");
+
+ if(!isset($this->cfg->thumb_width) || $this->cfg->thumb_width == "")
+ $this->_error("Please set \$thumb_width in phpfspot_cfg");
+
+ if(!isset($this->cfg->thumb_height) || $this->cfg->thumb_height == "")
+ $this->_error("Please set \$thumb_height in phpfspot_cfg");
+
+ if(!isset($this->cfg->photo_width) || $this->cfg->photo_width == "")
+ $this->_error("Please set \$photo_width in phpfspot_cfg");
+
+ if(!isset($this->cfg->mini_width) || $this->cfg->mini_width == "")
+ $this->_error("Please set \$mini_width in phpfspot_cfg");
+
+ if(!isset($this->cfg->thumbs_per_page))
+ $this->_error("Please set \$thumbs_per_page in phpfspot_cfg");
+
+ if(!isset($this->cfg->path_replace_from) || $this->cfg->path_replace_from == "")
+ $this->_error("Please set \$path_replace_from in phpfspot_cfg");
+
+ if(!isset($this->cfg->path_replace_to) || $this->cfg->path_replace_to == "")
+ $this->_error("Please set \$path_replace_to in phpfspot_cfg");
+
+ if(!isset($this->cfg->hide_tags))
+ $this->_error("Please set \$hide_tags in phpfspot_cfg");
+
+ if(!isset($this->cfg->theme_name))
+ $this->_error("Please set \$theme_name in phpfspot_cfg");
+
+ if(!isset($this->cfg->logging))
+ $this->_error("Please set \$logging in phpfspot_cfg");
+
+ if(isset($this->cfg->logging) && $this->cfg->logging == 'logfile') {
+
+ if(!isset($this->cfg->log_file))
+ $this->_error("Please set \$log_file because you set logging = log_file in phpfspot_cfg");
+
+ if(!is_writeable($this->cfg->log_file))
+ $this->_error("The specified \$log_file ". $log_file ." is not writeable!");
+
+ }
+
+ /* check for pending slash on web_path */
+ if(!preg_match("/\/$/", $this->cfg->web_path))
+ $this->cfg->web_path.= "/";
+
+ return $this->runtime_error;
+
+ } // check_config_options()
+
+ /**
+ * cleanup phpfspot own database
+ *
+ * When photos are getting delete from F-Spot, there will remain
+ * remain some residues in phpfspot own database. This function
+ * will try to wipe them out.
+ */
+ public function cleanup_phpfspot_db()
+ {
+ $to_delete = Array();
+
+ $result = $this->cfg_db->db_query("
+ SELECT img_idx
+ FROM images
+ ORDER BY img_idx ASC
+ ");
+
+ while($row = $this->cfg_db->db_fetch_object($result)) {
+ if(!$this->db->db_fetchSingleRow("
+ SELECT id
+ FROM photos
+ WHERE id='". $row['img_idx'] ."'")) {
+
+ array_push($to_delete, $row['img_idx'], ',');
+ }
+ }
+
+ print count($to_delete) ." unnecessary objects will be removed from phpfspot's database.\n";
+
+ $this->cfg_db->db_exec("
+ DELETE FROM images
+ WHERE img_idx IN (". implode($to_delete) .")
+ ");
+
+ } // cleanup_phpfspot_db()
+
+ /**
+ * return first image of the page, the $current photo
+ * lies in.
+ *
+ * this function is used to find out the first photo of the
+ * current page, in which the $current photo lies. this is
+ * used to display the correct photo, when calling showPhotoIndex()
+ * from showImage()
+ * @param integer $current
+ * @param integer $max
+ * @return integer
+ */
+ private function getCurrentPage($current, $max)
+ {
+ if(isset($this->cfg->thumbs_per_page) && !empty($this->cfg->thumbs_per_page)) {
+ for($page_start = 0; $page_start <= $max; $page_start+=$this->cfg->thumbs_per_page) {
+ if($current >= $page_start && $current < ($page_start+$this->cfg->thumbs_per_page))
+ return $page_start;
+ }
+ }
+ return 0;
+
+ } // getCurrentPage()
+
+} // class PHPFSPOT