query( "DELETE {exif_records}.* FROM {exif_records} " . "LEFT JOIN {items} ON ({exif_records}.`item_id` = {items}.`id`) " . "WHERE {items}.`id` IS NULL"); // Insert missing exif_records $db->query( "INSERT INTO {exif_records}(`item_id`) (" . " SELECT {items}.`id` FROM {items} " . " LEFT JOIN {exif_records} ON ({exif_records}.`item_id` = {items}.`id`) " . " WHERE {exif_records}.`id` IS NULL)"); list ($remaining, $total, $percent) = self::_get_stats(); return array(Task_Definition::factory() ->callback("exif_task::extract_exif") ->name(t("Extract EXIF data")) ->description($remaining ? t("%percent% of your photos need to be scanned for EXIF data", array("percent" => $percent)) : t("EXIF data is up-to-date")) ->severity($remaining ? log::WARNING : log::SUCCESS)); } static function extract_exif($task) { $completed = $task->get("completed", 0); $work = ORM::factory("item") ->join("exif_records", "items.id", "exif_records.item_id") ->where("exif_records.dirty", 1) ->find(); exif::extract($work); $completed++; $task->set("completed", $completed); list ($remaining, $total, $percent) = self::_get_stats(); $task->percent_complete = round(100 * $completed / ($remaining + $completed)); $task->status = t("%done records records updated, index is %percent% up-to-date", array("done" => $completed, "percent" => $percent)); if ($remaining == 0) { $task->done = true; $task->state = "success"; } } private static function _get_stats() { $missing_exif = ORM::factory("exif_record")->where("dirty", 1)->count_all(); $total_items = ORM::factory("item")->count_all(); return array($missing_exif, $total_items, round(100 * (($total_items - $missing_exif) / $total_items))); } }