po/src/bulk.update.php

496 lines
18 KiB
PHP

<?php
// Copyright (C) 2002-2006 Balint Kis (balint@k-i-s.net)
// Copyright (C) 2005-2013 Solomon Peachy (pizza@shaftnet.org)
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 3 of the License, or
// (at your option) any later version.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
include_once "include/config.php";
include_once "include/tools.php";
include_once "include/mime.php";
include_once "include/common.php";
include_once "include/site.php";
include_once "include/import.php";
$database = site_prolog(PO_USER_TYPE_USER);
$select_folder = pg_escape_string($database, $_REQUEST['select_folder']);
$select_album = pg_escape_string($database, $_REQUEST['select_album']);
$type = isset($_REQUEST['type']) ? $_REQUEST['type'] : FALSE;
$selection = pg_escape_string($database, isset($_REQUEST['selection']) ? $_REQUEST['selection'] : "");
$to_update = isset($_REQUEST['to_update']) ? $_REQUEST['to_update'] : array();
$recursive = isset($_REQUEST['recursive']);
$set_generate_images = $_REQUEST['set_generate_images'];
$compress_pages = false; /* Explicitly disable it here */
set_time_limit(0); /* Explicitly disable timeouts here */
if (!sizeof($to_update) && ($set_generate_images != 't')) {
site_push_error($strings['errors_invalid_options']);
header("Location: my.tools.php?selector=".$tools_data['bulkupdate']['idx']);
site_epilog($database);
exit();
}
$update_photo_sql = "";
$update_photo_tech_sql = "";
$set_keyword = array();
$clear_keyword = array();
$set_equipment = array();
$clear_equipment = array();
foreach ($to_update as $field) {
switch ($field) {
case 'set_title':
$set_title = pg_escape_string($database, $_REQUEST['title']);
$update_photo_sql .= " title = '$set_title', ";
break;
case 'set_author':
$set_author = pg_escape_string($database, $_REQUEST['author']);
$update_photo_sql .= " author = '$set_author', ";
break;
case 'set_headline':
$set_headline = pg_escape_string($database, $_REQUEST['headline']);
$update_photo_sql .= " headline = '$set_headline', ";
break;
case 'set_caption_writer':
$set_caption_writer = pg_escape_string($database, $_REQUEST['caption_writer']);
$update_photo_sql .= " caption_writer = '$set_caption_writer', ";
break;
case 'set_caption':
$set_caption = pg_escape_string($database, $_REQUEST['caption']);
$update_photo_sql .= " caption = '$set_caption', ";
break;
case 'set_category':
$set_category = pg_escape_string($database, $_REQUEST['category']);
$update_photo_sql .= " category = '$set_category', ";
break;
case 'set_supplemental_category':
$set_supplemental_category = pg_escape_string($database, $_REQUEST['supplemental_category']);
$update_photo_sql .= " supplemental_category = '$set_supplemental_category', ";
break;
case 'set_credit':
$set_credit = pg_escape_string($database, $_REQUEST['credit']);
$update_photo_sql .= " credit = '$set_credit', ";
break;
case 'set_copyright':
$set_copyright = pg_escape_string($database, $_REQUEST['copyright']);
$update_photo_sql .= " copyright_statement = '$set_copyright', ";
break;
case 'set_web_statement':
$set_web_statement = pg_escape_string($database, $_REQUEST['web_statement']);
$update_photo_sql .= " web_statement = '$set_web_statement', ";
break;
case 'set_instructions':
$set_instructions = pg_escape_string($database, $_REQUEST['instructions']);
$update_photo_sql .= " instructions = '$set_instructions', ";
break;
case 'set_source':
$set_source = pg_escape_string($database, $_REQUEST['source']);
$update_photo_sql .= " source = '$set_source', ";
break;
case 'set_transmission_reference':
$set_transmission_reference = pg_escape_string($database, $_REQUEST['transmission_reference']);
$update_photo_sql .= " transmission_reference = '$set_transmission_reference', ";
break;
case 'set_date_of_exposure':
$set_date_of_exposure = check_date_validity($_REQUEST['exposure_timestamp']);
$update_photo_sql .= " date_of_exposure = $set_date_of_exposure, ";
break;
case 'set_location':
$set_location = pg_escape_string($database, $_REQUEST['location']);
$update_photo_sql .= " location = $set_location, ";
break;
case 'set_access_rights':
$set_access_rights = pg_escape_string($database, $_REQUEST['access_rights']);
$update_photo_sql .= " access_rights = $set_access_rights, ";
break;
case 'set_hide_original':
$set_hide_original = pg_escape_string($database, $_REQUEST['hide_original']);
$update_photo_sql .= " hide_original = '$set_hide_original', ";
break;
case 'set_store_url':
$set_store_url = pg_escape_string($database, $_REQUEST['store_url']);
$update_photo_sql .= " store_url = '$set_store_url', ";
break;
case 'set_remark':
$set_remark = pg_escape_string($database, $_REQUEST['remark']);
$update_photo_sql .= " comments = '$set_remark', ";
break;
case 'set_camera':
$set_camera = pg_escape_string($database, $_REQUEST['camera']);
$update_photo_tech_sql .= " camera = $set_camera, ";
break;
case 'set_camera_metering':
$set_camera_metering = pg_escape_string($database, $_REQUEST['camera_metering']);
$update_photo_tech_sql .= " camera_metering = $set_camera_metering, ";
break;
case 'set_camera_program':
$set_camera_program = pg_escape_string($database, $_REQUEST['camera_program']);
$update_photo_tech_sql .= " camera_program = $set_camera_program, ";
break;
case 'set_focal_length':
$set_focal_length = pg_escape_string($database, $_REQUEST['focal_length']);
$update_photo_tech_sql .= " focal_length = '$set_focal_length', ";
break;
case 'set_film':
$set_film = pg_escape_string($database, $_REQUEST['film']);
$update_photo_tech_sql .= " film = $set_film, ";
break;
case 'set_iso_override':
$set_iso_override = pg_escape_string($database, $_REQUEST['iso_override']);
$update_photo_tech_sql .= " iso_override = $set_iso_override, ";
break;
case 'set_aperture':
$set_aperture = pg_escape_string($database, $_REQUEST['aperture']);
$update_photo_tech_sql .= " aperture = '$set_aperture', ";
break;
case 'set_shutter':
$set_shutter = pg_escape_string($database, $_REQUEST['shutter']);
$update_photo_tech_sql .= " shutter = $set_shutter, ";
break;
case 'set_exp_comp':
$set_exp_comp = pg_escape_string($database, $_REQUEST['exp_comp']);
$update_photo_tech_sql .= " exposure_comp = $set_exp_comp, ";
break;
case 'set_exp_diff':
$set_exp_diff = pg_escape_string($database, $_REQUEST['exp_diff']);
$update_photo_tech_sql .= " ev_difference = $set_exp_diff, ";
break;
case 'set_flash_mode':
$set_flash_mode = pg_escape_string($database, $_REQUEST['flash_mode']);
$update_photo_tech_sql .= " flash_mode = $set_flash_mode, ";
break;
case 'set_flash_comp':
$set_flash_comp = pg_escape_string($database, $_REQUEST['flash_comp']);
$update_photo_tech_sql .= " flash_comp = $set_flash_comp, ";
break;
case 'set_scan_params':
$param = pg_escape_string($database, $_REQUEST['scan_resolution']);
$update_photo_tech_sql .= " scan_resolution = $param, ";
$param = pg_escape_string($database, $_REQUEST['scan_bitdepth']);
$update_photo_tech_sql .= " scan_bitdepth = $param, ";
$param = pg_escape_string($database, $_REQUEST['scan_multiscan']);
$update_photo_tech_sql .= " scan_multiscan = $param, ";
break;
case 'set_geo_location':
$pos = pg_escape_string($database, parse_latitude($_REQUEST['latitude']));
if ($pos == "") $pos = "null";
$update_photo_tech_sql .= " latitude = $pos, ";
$pos = pg_escape_string($database, parse_latitude($_REQUEST['longitude']));
if ($pos == "") $pos = "null";
$update_photo_tech_sql .= " longitude = $pos, ";
$pos = pg_escape_string($database, $_REQUEST['altitude']);
if ($pos == "") $pos = "null";
$update_photo_tech_sql .= " altitude = $pos, ";
$pos = pg_escape_string($database, $_REQUEST['direction']);
if ($pos == "") $pos = "null";
$update_photo_tech_sql .= " direction = $pos, ";
break;
case 'add_equipment':
$set_equipment = $_REQUEST['add_equipment'];
break;
case 'delete_equipment':
$clear_equipment = $_REQUEST['delete_equipment'];
break;
case 'set_keyword':
$set_keyword = $_REQUEST['set_keywords'];
break;
case 'clear_keyword':
$clear_keyword = $_REQUEST['clear_keywords'];
break;
default:
# XXXX we should never get here!
break;
}
}
switch ($type) {
case 'folder':
if ($select_folder == "all") {
$sql_selector = " p.users = $po_user[id] ";
} else {
if ($recursive) {
$sql_selector = " p.folder in (select * from folder_and_subfolders($select_folder))";
} else {
$sql_selector = " p.folder = $select_folder ";
}
}
break;
case 'album':
if ($recursive) {
$sql_selector = " a.album in (select * from album_and_subalbums($select_album)) ";
} else {
$sql_selector = " a.album = $select_album ";
}
$sql_selector = " p.identifier in( select photo from album_content a where $sql_selector) ";
break;
case 'spool':
$sql_selector = " p.identifier in( select photo from album_content where album = $po_user[spool_album])";
break;
case 'list':
$sql_selector = " p.identifier in( $selection )";
break;
default:
site_push_error($strings['errors_invalid_operation']);
header("Location: my.tools.php?selector=".$tools_data['bulkupdate']['idx']);
site_epilog($database);
exit();
break;
}
/* Start the main page output here */
site_header($strings['generic_bulk_update']);
site_navigator(10);
site_navigator_status(emit_a(generate_link('user', ''), $strings['generic_users'])." : ".$strings['generic_bulk_update'], "");
print "&nbsp;<br/>";
theme_display_navigator_box_top($tools_data['bulkupdate']['idx'], $tools_data, "100%");
/* Ensure users only update files they own */
if ($po_user['type'] != PO_USER_TYPE_ADMIN) {
$sql_selector = " p.users = $po_user[id] AND $sql_selector ";
}
$num_of_updates = pg_fetch_row(pg_query($database, "
select count(identifier) from photo p
where $sql_selector"));
$result = pg_query($database, "begin");
if ($result && $update_photo_sql != "") {
$update_photo_sql = substr($update_photo_sql, 0, strlen($update_photo_sql) - 2);
// print "<li>$update_photo_sql</li>";
// print "<li>$sql_selector</li>";
$result = pg_query($database, "
update photo set
$update_photo_sql where identifier in (select identifier from photo p
where $sql_selector)");
}
if ($result && $update_photo_tech_sql != "") {
$update_photo_tech_sql = substr($update_photo_tech_sql, 0, strlen($update_photo_tech_sql) - 2);
$query = "update photo_tech set
$update_photo_tech_sql
where photo in (select identifier from photo p where $sql_selector)";
// print "<li><pre>$query</pre></li>";
$result = pg_query($database,$query);
}
if ($result && $clear_equipment) {
foreach ($clear_equipment as $equip) {
$parts = explode(":", $equip);
$parts[0] = pg_escape_string($database, $parts[0]);
$parts[1] = pg_escape_string($database, $parts[1]);
$result = pg_query($database, "delete from photo_equipment where photo in (select p.identifier from photo p where $sql_selector) and equipment = $parts[0]");
}
}
if ($result && $set_equipment) {
foreach ($set_equipment as $equip) {
$parts = explode(":", $equip);
$parts[0] = pg_escape_string($database, $parts[0]);
$parts[1] = pg_escape_string($database, $parts[1]);
$result = pg_query($database, "insert into photo_equipment (photo, equipment, type) select p.identifier, $parts[0], $parts[1] from photo p where $sql_selector and not exists(select e.photo from photo_equipment e where e.photo = p.identifier and e.equipment = $parts[0])");
}
}
/* Deal with keywords */
if ($result) {
foreach ($set_keyword as $keyword) {
$keyword = strtolower(trim($keyword));
$keyword = trim($keyword);
if ($keyword == "") continue;
$keyword = pg_escape_string($database, $keyword);
$result = pg_query($database, "insert into photo_keywords (photo, keyword)
select p.identifier, '$keyword' from photo p where $sql_selector and not exists (select k.photo from photo_keywords k where k.photo = p.identifier and k.keyword = '$keyword')");
}
}
if ($result) {
foreach ($clear_keyword as $keyword) {
$keyword = strtolower(trim($keyword));
$keyword = trim($keyword);
if ($keyword == "") continue;
$keyword = pg_escape_string($database, $keyword);
$query = "delete from photo_keywords where keyword = '$keyword' and photo in (select p.identifier from photo p where $sql_selector)";
$result = pg_query($database, $query);
}
}
if ($result) {
pg_query($database, "commit");
print "<p align=\"left\">".$strings['tools_num_photos_updated'].": $num_of_updates[0]</p>";
} else {
pg_query($database, "rollback");
// print "<pre>$query</pre>";
print err_str($strings['errors_db_insert_failed']);
}
/* Clear the keywords from the cache */
if ($result && $memcache && (count($clear_keyword) || count($set_keyword))) {
$res = pg_query("select p.identifier from photo p where $sql_selector");
for ($i = 0 ; $i < pg_num_rows($res) ; $i++) {
$row = pg_fetch_row($res);
po_log("memcache: delete photo_keywords.$row[0]", PEAR_LOG_DEBUG);
$memcache->delete("photo_keywords.$row[0]");
}
}
if ($result && $set_generate_images == 't') {
print "<div align=\"left\"><ul>";
$counter = 0;
$query = "
select get_image_path(v.identifier, 0) as original_path,
title, p.identifier as photo, colorspace,
orientation, v.identifier as version
from photo p, photo_version v
where p.identifier = v.photo
and $sql_selector
order by p.identifier";
$photo = pg_query($database, $query);
// print "<pre>$query</pre>";
$num_of_photos = pg_num_rows($photo);
for ($counter = 0; $counter < $num_of_photos; $counter++) {
$photo_data = pg_fetch_assoc($photo, $counter);
if (($current_volume = get_current_volume($database, FALSE)) == FALSE) {
print err_str($strings['errors_failed_volume']);
break;
}
$output = "";
$old_files = array();
$res = pg_query($database, "select identifier, path from files where version = $photo_data[version] and size != 0");
for ($i = 0 ; $i < pg_num_rows($res) ; $i++) {
$row = pg_fetch_row($res);
$old_files[$row[0]] = $row[1];
}
$cleanup_files = array();
pg_query($database, "begin");
$camera_profile = pg_fetch_row(pg_query($database, "
select raw_icc_profile
from photo_tech, camera, camera_type
where photo_tech.photo = $photo_data[photo]
and photo_tech.camera = camera.identifier
and camera.type = camera_type.identifier"));
$orientation = orientation_to_xform($database, $photo_data['orientation']);
$original_name = $image_repository_path ."/". $photo_data['original_path'];
$original_file_type = strtolower(substr($original_name, strrpos($original_name, ".") + 1));
$multi_page_parameter = $mime_type[$original_file_type]['page'];
$decoder = $mime_type[$original_file_type]['decoder'];
print "<li>".$strings['tools_regenerating_images']. emit_a(generate_link('photo', $photo_data['photo'], array('ver'=>$photo_data['version'])), "# $photo_data[photo]:$photo_data[version]");
print "<ul>";
$index = 0;
$image_data = array();
$image_data['po_options'] = $po_options;
$image_data['po_user'] = $po_user;
$image_data['jpgfromraw'] = FALSE;
$image_data['file'][$index]['orientation_xform'] = $orientation;
$image_data['file'][$index]['colorspace'] = $photo_data['colorspace'];
// XXX preserve comments on new files!
/* RAW Decode */
if ($result) {
$real_orig_name = $original_name;
$temporary_ppm_file = import_decode($original_name, $decoder, $camera_profile[0], $image_data, $index, $output);
if ($temporary_ppm_file) {
$original_name = $temporary_ppm_file;
}
}
/* Generate scaled images */
if ($result) {
$result = import_generate_all_scaled($original_name, $multi_page_parameter, $original_name, $database, $photo_data['version'], '', '', $current_volume, $photo_data['photo'], $cleanup_files, $real_orig_name, $image_data, $index, $output);
}
if ($temporary_ppm_file) {
unlink($temporary_ppm_file);
}
// XXX -- Kick the date_changed fields via the DB trigger
if ($result) {
$result = pg_query($database, "update photo_version set date_changed = now() where identifier = $photo_data[version] ");
}
/* Delete the old files! */
if ($result) {
foreach ($old_files as $file => $path) {
$retval = pg_query($database, "delete from files where identifier = $file");
}
}
if ($result) {
$err = error_reporting(0);
foreach ($old_files as $file => $path) {
unlink("$image_repository_path/$path");
}
error_reporting($err);
}
print $output;
print "</ul></li>";
if ($result) {
pg_query($database, "commit");
} else {
pg_query($database, "rollback");
$err = error_reporting(0);
foreach ($cleanup_files as $file) {
unlink($file);
}
error_reporting($err);
break;
}
}
print "</ul></div>";
}
print $thm_elem['button.back.2'];
theme_display_navigator_box_bottom("100%");
site_footer($database);
site_epilog($database);
?>