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_record]`(`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))); } }