/******* Opening F-Spot's sqlite database *********/
+ /* Check if database file exists and is readable */
+ if(!file_exists($this->cfg->fspot_db) || !is_readable($this->cfg->fspot_db)) {
+ print "Error: ". $this->cfg->fspot_db ." does not exist or is not readable for user ". $this->getuid() .".\n";
+ exit(1);
+ }
+
/* Check if database file is writeable */
if(!is_writeable($this->cfg->fspot_db)) {
print "Error: ". $this->cfg->fspot_db ." is not writeable for user ". $this->getuid() .".\n";
}
/* Check if database file is writeable */
- if(!is_writeable($this->cfg->phpfspot_db)) {
+ if(file_exists($this->cfg->phpfspot_db) && !is_writeable($this->cfg->phpfspot_db)) {
print "Error: ". $this->cfg->phpfspot_db ." is not writeable for user ". $this->getuid() .".\n";
print "Please fix permissions so phpfspot can create its own sqlite database to store some settings.\n";
exit(1);
require_once "phpfspot_tmpl.php";
$this->tmpl = new PHPFSPOT_TMPL();
+ /* pre-set some template variables */
$this->tmpl->assign('web_path', $this->cfg->web_path);
/* Starting with F-Spot 0.4.2, the rating-feature was available */
$query_str="
SELECT
DISTINCT t1.id as id, t1.name as name
- FROM
+ FROM
photo_tags pt1
INNER JOIN photo_tags
pt2 ON pt1.photo_id=pt2.photo_id
else
{
$result = $this->db->db_query("
- SELECT id,name
+ SELECT id as id,name as name
FROM tags
ORDER BY sort_priority ASC
");
/* ~ F-Spot version 0.3.x */
if($this->dbver < 9) {
$query_str = "
- SELECT p.id, p.name, p.time, p.directory_path, p.description
- FROM photos p
+ SELECT
+ p.id as id,
+ p.name as name,
+ p.time as time,
+ p.directory_path as directory_path,
+ p.description as description
+ FROM
+ photos p
";
}
else {
/* till F-Spot version 0.4.1 */
if($this->dbver < 11) {
$query_str = "
- SELECT p.id, p.uri, p.time, p.description
- FROM photos p
+ SELECT
+ p.id as id,
+ p.uri as uri,
+ p.time as time,
+ p.description as description
+ FROM
+ photos p
+ ";
+ }
+ elseif($this->dbver < 17) {
+ /* rating value got introduced */
+ $query_str = "
+ SELECT
+ p.id as id,
+ p.uri as uri,
+ p.time as time,
+ p.description as description,
+ p.rating as rating
+ FROM
+ photos p
";
}
else {
- /* rating value got introduced */
+ /* path & filename now splited in base_uri & filename */
$query_str = "
- SELECT p.id, p.uri, p.time, p.description, p.rating
- FROM photos p
+ SELECT
+ p.id as id,
+ p.base_uri ||'/'|| p.filename as uri,
+ p.time as time,
+ p.description as description,
+ p.rating as rating
+ FROM
+ photos p
";
}
}
";
}
- if($row = $this->db->db_fetchSingleRow($query_str)) {
-
- /* before F-Spot db version 9 there was no uri column but
- seperated fields for directory_path and name (= filename).
- */
- if($this->dbver < 9) {
- $row['uri'] = "file://". $row['directory_path'] ."/". $row['name'];
- }
+ if(!$row = $this->db->db_fetchSingleRow($query_str))
+ return null;
- /* if version-idx has not yet been set, get the latest photo version */
- if(!isset($version_idx) || !$this->is_valid_version($idx, $version_idx))
- $version_idx = $this->get_latest_version($idx);
+ /* before F-Spot db version 9 there was no uri column but
+ seperated fields for directory_path and name (= filename).
+ */
+ if($this->dbver < 9) {
+ $row['uri'] = "file://". $row['directory_path'] ."/". $row['name'];
+ }
+ /* starting with dbversion >= 17 we need to rawurldecode() uri */
+ elseif($this->dbver >= 17) {
+ $row['uri'] = rawurldecode($row['uri']);
+ }
- /* if an alternative version has been requested */
- if($version_idx > 0) {
+ /* if version-idx has not yet been set, get the latest photo version */
+ if(!isset($version_idx) || !$this->is_valid_version($idx, $version_idx))
+ $version_idx = $this->get_latest_version($idx);
+ /* if an alternative version has been requested. But we
+ support this only for F-Spot database versions from
+ v9.
+ */
+ if($version_idx > 0 && $this->dbver >= 9) {
+ if ($this->dbver < 17) {
/* check for alternative versions */
if($version = $this->db->db_fetchSingleRow("
- SELECT
- version_id, name, uri
- FROM
- photo_versions
- WHERE
- photo_id LIKE '". $idx ."'
- AND
- version_id LIKE '". $version_idx ."'
- ")) {
+ SELECT
+ version_id, name, uri
+ FROM
+ photo_versions
+ WHERE
+ photo_id LIKE '". $idx ."'
+ AND
+ version_id LIKE '". $version_idx ."'")) {
$row['name'] = $version['name'];
$row['uri'] = $version['uri'];
-
}
}
+ else {
+ /* path & filename now splited in base_uri & filename */
+ if($version = $this->db->db_fetchSingleRow("
+ SELECT
+ version_id,
+ name,
+ base_uri || '/'||filename as uri
+ FROM
+ photo_versions
+ WHERE
+ photo_id LIKE '". $idx ."'
+ AND
+ version_id LIKE '". $version_idx ."'")) {
- return $row;
-
+ $row['name'] = $version['name'];
+ $row['uri'] = rawurldecode($version['uri']);
+ }
+ }
}
- return null;
+ return $row;
} // get_photo_details()
* @return string
*/
public function translate_path($path)
- {
- return str_replace($this->cfg->path_replace_from, $this->cfg->path_replace_to, $path);
+ {
+ if($this->cfg->enable_replace_path == true)
+ return str_replace(
+ $this->cfg->path_replace_from,
+ $this->cfg->path_replace_to, $path);
+
+ return $path;
} // translate_path
* @return array
*/
public function getPhotoSelection()
- {
+ {
$matched_photos = Array();
$additional_where_cond = "";
)
";
}
- else {
+ if($this->dbver < 17) {
$additional_where_cond.= "
(
basename(p.uri) LIKE '%". $_SESSION['searchfor_name'] ."%'
)
";
}
+ else {
+ $additional_where_cond.= "
+ (
+ p.filename LIKE '%". $_SESSION['searchfor_name'] ."%'
+ OR
+ p.description LIKE '%". $_SESSION['searchfor_name'] ."%'
+ )
+ ";
+ }
}
/* limit result based on rate-search */
/* return a search result */
if(isset($_SESSION['searchfor_tag']) && $_SESSION['searchfor_tag'] != '') {
$query_str = "
- SELECT DISTINCT pt1.photo_id
- FROM photo_tags pt1
+ SELECT DISTINCT
+ pt1.photo_id as photo_id
+ FROM
+ photo_tags pt1
INNER JOIN photo_tags pt2
ON pt1.photo_id=pt2.photo_id
INNER JOIN tags t
/* photo has to match at least on of the selected tags */
if($_SESSION['tag_condition'] == 'or') {
$query_str = "
- SELECT DISTINCT pt1.photo_id
- FROM photo_tags pt1
+ SELECT DISTINCT
+ pt1.photo_id as photo_id
+ FROM
+ photo_tags pt1
INNER JOIN photo_tags pt2
ON pt1.photo_id=pt2.photo_id
INNER JOIN tags t
*/
$query_str = "
- SELECT DISTINCT pt1.photo_id
- FROM photo_tags pt1
+ SELECT DISTINCT
+ pt1.photo_id as photo_id
+ FROM
+ photo_tags pt1
";
if(isset($this->cfg->show_tags) && !empty($this->cfg->show_tags)) {
/* return all available photos */
$query_str = "
- SELECT DISTINCT p.id
- FROM photos p
+ SELECT DISTINCT
+ p.id as id
+ FROM
+ photos p
LEFT JOIN photo_tags pt
ON p.id=pt.photo_id
LEFT JOIN tags t
}
$thumbs = 0;
- $images[$thumbs] = Array();
- $img_height[$thumbs] = Array();
- $img_width[$thumbs] = Array();
- $img_id[$thumbs] = Array();
- $img_name[$thumbs] = Array();
- $img_fullname[$thumbs] = Array();
- $img_title = Array();
- $img_rating = Array();
for($i = $begin_with; $i < $end_with; $i++) {
- if(isset($photos[$i])) {
+ if(!isset($photos[$i]))
+ continue;
- $images[$thumbs] = $photos[$i];
- $img_id[$thumbs] = $i;
- $img_name[$thumbs] = htmlspecialchars($this->getPhotoName($photos[$i], 15));
- $img_fullname[$thumbs] = htmlspecialchars($this->getPhotoName($photos[$i], 0));
- $img_title[$thumbs] = "Click to view photo ". htmlspecialchars($this->getPhotoName($photos[$i], 0));
- $img_rating[$thumbs] = $this->get_photo_rating($photos[$i]);
+ /* on first run, initalize all used variables */
+ if($thumbs == 0) {
+ $images = Array();
+ $images[$thumbs] = Array();
+ $img_height[$thumbs] = Array();
+ $img_width[$thumbs] = Array();
+ $img_id[$thumbs] = Array();
+ $img_name[$thumbs] = Array();
+ $img_fullname[$thumbs] = Array();
+ $img_title = Array();
+ $img_rating = Array();
+ }
+
+ $images[$thumbs] = $photos[$i];
+ $img_id[$thumbs] = $i;
+ $img_name[$thumbs] = htmlspecialchars($this->getPhotoName($photos[$i], 15));
+ $img_fullname[$thumbs] = htmlspecialchars($this->getPhotoName($photos[$i], 0));
+ $img_title[$thumbs] = "Click to view photo ". htmlspecialchars($this->getPhotoName($photos[$i], 0));
+ $img_rating[$thumbs] = $this->get_photo_rating($photos[$i]);
- $thumb_path = $this->get_thumb_path($this->cfg->thumb_width, $photos[$i], $this->get_latest_version($photos[$i]));
+ /* get local path of the thumbnail image to be displayed */
+ $thumb_path = $this->get_thumb_path($this->cfg->thumb_width, $photos[$i], $this->get_latest_version($photos[$i]));
- if(file_exists($thumb_path)) {
- $info = getimagesize($thumb_path);
+ /* if the image exist and is readable, extract some details */
+ if(file_exists($thumb_path) && is_readable($thumb_path)) {
+ if($info = getimagesize($thumb_path) !== false) {
$img_width[$thumbs] = $info[0];
$img_height[$thumbs] = $info[1];
}
- $thumbs++;
- }
+ }
+ $thumbs++;
}
- // +1 for for smarty's selection iteration
- $thumbs++;
-
if(isset($_SESSION['searchfor_tag']) && $_SESSION['searchfor_tag'] != '')
$this->tmpl->assign('searchfor_tag', $_SESSION['searchfor_tag']);
$this->tmpl->assign('preview_width', $this->cfg->photo_width);
$this->tmpl->assign('thumb_container_width', $this->cfg->thumb_width);
$this->tmpl->assign('thumb_container_height', $this->cfg->thumb_height+20);
- $this->tmpl->assign('images', $images);
- $this->tmpl->assign('img_width', $img_width);
- $this->tmpl->assign('img_height', $img_height);
- $this->tmpl->assign('img_id', $img_id);
- $this->tmpl->assign('img_name', $img_name);
- $this->tmpl->assign('img_fullname', $img_fullname);
- $this->tmpl->assign('img_title', $img_title);
- $this->tmpl->assign('img_rating', $img_rating);
- $this->tmpl->assign('thumbs', $thumbs);
$this->tmpl->assign('selected_tags', $this->getSelectedTags('img'));
+ // +1 for for smarty's selection iteration
+ $this->tmpl->assign('thumbs', $thumbs+1);
+
+ if($thumbs > 0) {
+ $this->tmpl->assign('images', $images);
+ $this->tmpl->assign('img_width', $img_width);
+ $this->tmpl->assign('img_height', $img_height);
+ $this->tmpl->assign('img_id', $img_id);
+ $this->tmpl->assign('img_name', $img_name);
+ $this->tmpl->assign('img_fullname', $img_fullname);
+ $this->tmpl->assign('img_title', $img_title);
+ $this->tmpl->assign('img_rating', $img_rating);
+ }
$result = $this->tmpl->fetch("photo_index.tpl");
case 4: /* bottom, right */
$flip_vert = true; break;
case 5: /* left side, top */
- $rotate = 90; $flip_vert = true; break;
+ $rotate = 270; $flip_vert = true; break;
case 6: /* right side, top */
- $rotate = 90; break;
+ $rotate = 270; break;
case 7: /* left side, bottom */
- $rotate = 270; $flip_vert = true; break;
+ $rotate = 90; $flip_vert = true; break;
case 8: /* right side, bottom */
- $rotate = 270; break;
+ $rotate = 90; break;
}
}
$full_path = $this->translate_path($this->parse_uri($details['uri'], 'fullpath'));
if(!file_exists($full_path)) {
- $this->_error("File ". $full_path ." does not exist\n");
+ $this->_error("File ". $full_path ." does not exist");
return;
}
private function get_photo_tags($idx)
{
$result = $this->db->db_query("
- SELECT t.id, t.name
+ SELECT t.id as id, t.name as name
FROM tags t
INNER JOIN photo_tags pt
ON t.id=pt.tag_id
$missing = true;
}
+ if($this->cfg->db_access == "pdo") {
+ if(array_search("sqlite", PDO::getAvailableDrivers()) === false) {
+ print "PDO SQLite3 driver is missing<br />\n";
+ $missing = true;
+ }
+ }
+
/* Check for HTML_AJAX PEAR package, lent from Horde project */
ini_set('track_errors', 1);
@include_once 'HTML/AJAX/Server.php';
print "PEAR Console_Getopt package is missing<br />\n";
$missing = true;
}
+ @include_once 'Date.php';
+ if(isset($php_errormsg) && preg_match('/Failed opening.*for inclusion/i', $php_errormsg)) {
+ print "PEAR Date package is missing<br />\n";
+ $missing = true;
+ }
@include_once $this->cfg->smarty_path .'/libs/Smarty.class.php';
if(isset($php_errormsg) && preg_match('/Failed opening.*for inclusion/i', $php_errormsg)) {
print "Smarty template engine can not be found in ". $this->cfg->smarty_path ."/libs/Smarty.class.php<br />\n";
switch($this->cfg->logging) {
default:
case 'display':
- print "<img src=\"resources/green_info.png\" alt=\"warning\" />\n";
- print $text ."<br />\n";
+ if(isset($this->fromcmd))
+ print $text ."\n";
+ else {
+ print "<img src=\"resources/green_info.png\" alt=\"warning\" />\n";
+ print $text ."<br />\n";
+ }
break;
case 'errorlog':
error_log($text);
* @param integer $month
* @param integer $day
*/
- public function get_calendar_matrix($year = 0, $month = 0, $day = 0)
+ public function get_calendar_matrix($userdate)
{
- if (!isset($year)) $year = date('Y');
- if (!isset($month)) $month = date('m');
- if (!isset($day)) $day = date('d');
+ if(($userdate = strtotime($userdate)) === false) {
+ $year = date('Y');
+ $month = date('m');
+ $day = date('d');
+ }
+ else {
+ $date = new Date();
+ $date->setDate($userdate);
+
+ $year = $date->getYear();
+ $month = $date->getMonth();
+ $day = $date->getDay();
+ }
+
$rows = 1;
$cols = 1;
$matrix = Array();
require_once CALENDAR_ROOT.'Day.php';
// Build the month
- $month = new Calendar_Month_Weekdays($year,$month);
+ $month_cal = new Calendar_Month_Weekdays($year,$month);
// Create links
- $prevStamp = $month->prevMonth(true);
+ $prevStamp = $month_cal->prevMonth(true);
$prev = "javascript:setMonth(". date('Y',$prevStamp) .", ". date('n',$prevStamp) .", ". date('j',$prevStamp) .");";
- $nextStamp = $month->nextMonth(true);
+ $nextStamp = $month_cal->nextMonth(true);
$next = "javascript:setMonth(". date('Y',$nextStamp) .", ". date('n',$nextStamp) .", ". date('j',$nextStamp) .");";
$selectedDays = array (
new Calendar_Day($year,$month,$day),
- new Calendar_Day($year,12,25),
);
// Build the days in the month
- $month->build($selectedDays);
+ $month_cal->build($selectedDays);
- $this->tmpl->assign('current_month', date('F Y',$month->getTimeStamp()));
+ $this->tmpl->assign('current_month', date('F Y',$month_cal->getTimeStamp()));
$this->tmpl->assign('prev_month', $prev);
$this->tmpl->assign('next_month', $next);
- while ( $day = $month->fetch() ) {
+ while ( $day = $month_cal->fetch() ) {
if(!isset($matrix[$rows]))
$matrix[$rows] = Array();
$string = "";
$dayStamp = $day->thisDay(true);
- $link = "javascript:setCalendarDate(". date('Y',$dayStamp) .", ". date('n',$dayStamp).", ". date('j',$dayStamp) .");";
+ $link = "javascript:setCalendarDate('"
+ . date('Y',$dayStamp)
+ . "-"
+ . date('m',$dayStamp)
+ . "-"
+ . date('d',$dayStamp)
+ ."');";
// isFirst() to find start of week
if ( $day->isFirst() )
$all = Array();
$query_str = "
- SELECT p.id
+ SELECT p.id as id
FROM photos p
";
{
$all = Array();
- $query_str = "
- SELECT p.id
- FROM photos p
- INNER JOIN photo_tags pt
- ON p.id=pt.photo_id
- ";
-
if(isset($this->cfg->show_tags) && !empty($this->cfg->show_tags)) {
$query_str.= "
- INNER JOIN tags t
- ON pt.tag_id=t.id
- ";
+ SELECT
+ DISTINCT pt1.photo_id as id
+ FROM
+ photo_tags pt1
+ INNER JOIN photo_tags
+ pt2 ON pt1.photo_id=pt2.photo_id
+ INNER JOIN tags t1
+ ON t1.id=pt1.tag_id
+ INNER JOIN tags t2
+ ON t2.id=pt2.tag_id
+ WHERE
+ pt1.tag_id LIKE '". $tagidx ."'
+ AND
+ t2.name IN ('".implode("','",$this->cfg->show_tags)."')
+ ORDER BY
+ t1.sort_priority ASC";
+ }
+ else {
+ $query_str = "
+ SELECT
+ p.id as id
+ FROM
+ photos p
+ INNER JOIN photo_tags pt
+ ON p.id=pt.photo_id
+ WHERE
+ pt.tag_id LIKE '". $tagidx ."'";
}
- $query_str.= "
- WHERE
- pt.tag_id LIKE '". $tagidx ."'
- ";
-
- /*if(isset($this->cfg->show_tags) && !empty($this->cfg->show_tags)) {
- $query_str.= "
- AND
- t.name IN ('".implode("','",$this->cfg->show_tags)."')
- ";
- }*/
$result = $this->db->db_query($query_str);
*/
public function parse_uri($uri, $mode)
{
- if(($components = parse_url($uri)) !== false) {
+ if(($components = parse_url($uri)) === false)
+ return $uri;
- switch($mode) {
- case 'filename':
- return basename($components['path']);
- break;
- case 'dirname':
- return dirname($components['path']);
- break;
- case 'fullpath':
- return $components['path'];
- break;
- }
+ switch($mode) {
+ case 'filename':
+ return basename($components['path']);
+ break;
+ case 'dirname':
+ return dirname($components['path']);
+ break;
+ case 'fullpath':
+ return $components['path'];
+ break;
+ default:
+ $this->throwError("unknown mode ". $mode);
+ break;
}
- return $uri;
-
} // parse_uri()
/**
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->enable_replace_path))
+ $this->_error("Please set \$enable_replace_path in phpfspot_cfg");
+
+ if($this->cfg->enable_replace_path == true) {
+ 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->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");
$to_delete = Array();
$result = $this->cfg_db->db_query("
- SELECT img_idx
+ SELECT img_idx as 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
+ SELECT id as id
FROM photos
WHERE id='". $row['img_idx'] ."'")) {
public function get_tag_name($idx)
{
if($result = $this->db->db_fetchSingleRow("
- SELECT name
+ SELECT name as name
FROM tags
WHERE
id LIKE '". $idx ."'")) {
public function get_db_version()
{
if($row = $this->cfg_db->db_fetchSingleRow("
- SELECT meta_value
+ SELECT meta_value as meta_value
FROM
meta
WHERE