query( "DELETE FROM {exif_records} " . "WHERE {exif_records}.`item_id` NOT IN " . "(SELECT `id` FROM {items} WHERE {items}.`type` = 'photo')"); list ($remaining, $total, $percent) = exif::stats(); return array(Task_Definition::factory() ->callback("exif_task::update_index") ->name(t("Extract Exif data")) ->description($remaining ? t2("1 photo needs to be scanned", "%count (%percent%) of your photos need to be scanned", $remaining, array("percent" => (100 - $percent))) : t("Exif data is up-to-date")) ->severity($remaining ? log::WARNING : log::SUCCESS)); } static function update_index($task) { try { $completed = $task->get("completed", 0); $start = microtime(true); $message = array(); foreach (ORM::factory("item") ->join("exif_records", "items.id", "exif_records.item_id", "left") ->where("type", "photo") ->open_paren() ->where("exif_records.item_id", null) ->orwhere("exif_records.dirty", 1) ->close_paren() ->find_all() as $item) { if (microtime(true) - $start > 1.5) { break; } $completed++; exif::extract($item); $message[] = t("Updated Exif meta data for '%title'", array("title" => p::purify($item->title))); } $task->log($message); list ($remaining, $total, $percent) = exif::stats(); $task->set("completed", $completed); if ($remaining == 0 || !($remaining + $completed)) { $task->done = true; $task->state = "success"; site_status::clear("exif_index_out_of_date"); $task->percent_complete = 100; } else { $task->percent_complete = round(100 * $completed / ($remaining + $completed)); } $task->status = t2("one record updated, index is %percent% up-to-date", "%count records updated, index is %percent% up-to-date", $completed, array("percent" => $percent)); } catch (Exception $e) { $task->done = true; $task->state = "error"; $task->status = $e->getMessage(); $task->log($e->__toString()); } } }