diff options
-rw-r--r-- | modules/exif/helpers/exif.php | 31 | ||||
-rw-r--r-- | modules/exif/helpers/exif_installer.php | 2 | ||||
-rw-r--r-- | modules/exif/helpers/exif_task.php | 47 | ||||
-rw-r--r-- | modules/search/helpers/search.php | 24 | ||||
-rw-r--r-- | modules/search/helpers/search_event.php | 14 | ||||
-rw-r--r-- | modules/search/helpers/search_installer.php | 9 | ||||
-rw-r--r-- | modules/search/helpers/search_task.php | 56 |
7 files changed, 95 insertions, 88 deletions
diff --git a/modules/exif/helpers/exif.php b/modules/exif/helpers/exif.php index ab5dff71..c488bbd4 100644 --- a/modules/exif/helpers/exif.php +++ b/modules/exif/helpers/exif.php @@ -133,4 +133,35 @@ class exif_Core { } return self::$exif_keys; } + + static function stats() { + $missing_exif = Database::instance() + ->select("items.id") + ->from("items") + ->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() + ->get() + ->count(); + + $total_items = ORM::factory("item")->where("type", "photo")->count_all(); + if (!$total_items) { + return array(0, 0, 0); + } + return array($missing_exif, $total_items, + round(100 * (($total_items - $missing_exif) / $total_items))); + } + + static function check_index() { + list ($remaining) = exif::stats(); + if ($remaining) { + site_status::warning( + t('Your EXIF index needs to be updated. <a href="%url" class="gDialogLink">Fix this now</a>', + array("url" => url::site("admin/maintenance/start/exif_task::update_index?csrf=__CSRF__"))), + "exif_index_out_of_date"); + } + } } diff --git a/modules/exif/helpers/exif_installer.php b/modules/exif/helpers/exif_installer.php index 3088cdbb..5f37996a 100644 --- a/modules/exif/helpers/exif_installer.php +++ b/modules/exif/helpers/exif_installer.php @@ -33,12 +33,14 @@ class exif_installer { KEY(`item_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); module::set_version("exif", 1); + exif::check_index(); } } static function uninstall() { $db = Database::instance(); $db->query("DROP TABLE IF EXISTS {exif_records};"); + site_status::clear("exif_index_out_of_date"); module::delete("exif"); } } diff --git a/modules/exif/helpers/exif_task.php b/modules/exif/helpers/exif_task.php index 620d0791..375503e3 100644 --- a/modules/exif/helpers/exif_task.php +++ b/modules/exif/helpers/exif_task.php @@ -25,9 +25,9 @@ class exif_task_Core { "WHERE {exif_records}.`item_id` NOT IN " . "(SELECT `id` FROM {items} WHERE {items}.`type` = 'photo')"); - list ($remaining, $total, $percent) = self::_get_stats(); + list ($remaining, $total, $percent) = exif::stats(); return array(Task_Definition::factory() - ->callback("exif_task::extract_exif") + ->callback("exif_task::update_index") ->name(t("Extract EXIF data")) ->description($remaining ? t2("1 photo needs to be scanned", @@ -37,7 +37,7 @@ class exif_task_Core { ->severity($remaining ? log::WARNING : log::SUCCESS)); } - static function extract_exif($task) { + static function update_index($task) { $completed = $task->get("completed", 0); $start = microtime(true); @@ -57,41 +57,18 @@ class exif_task_Core { exif::extract($item); } - list ($remaining, $total, $percent) = self::_get_stats(); - if ($remaining + $completed) { - $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)); - } else { - $task->percent_complete = 100; - } - + list ($remaining, $total, $percent) = exif::stats(); $task->set("completed", $completed); - if ($remaining == 0) { + 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)); } - } - - private static function _get_stats() { - $missing_exif = Database::instance() - ->select("items.id") - ->from("items") - ->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() - ->get() - ->count(); - - $total_items = ORM::factory("item")->where("type", "photo")->count_all(); - if (!$total_items) { - return array(0, 0, 0); - } - return array($missing_exif, $total_items, - round(100 * (($total_items - $missing_exif) / $total_items))); + $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)); } } diff --git a/modules/search/helpers/search.php b/modules/search/helpers/search.php index 2842afbd..2c7be123 100644 --- a/modules/search/helpers/search.php +++ b/modules/search/helpers/search.php @@ -51,7 +51,8 @@ class search_Core { } static function check_index() { - if ($count = ORM::factory("search_record")->where("dirty", 1)->count_all()) { + list ($remaining) = search::stats(); + if ($remaining) { site_status::warning( t('Your search index needs to be updated. <a href="%url" class="gDialogLink">Fix this now</a>', array("url" => url::site("admin/maintenance/start/search_task::update_index?csrf=__CSRF__"))), @@ -59,8 +60,13 @@ class search_Core { } } - static function update_record($record) { + static function update($item) { $data = array(); + $record = ORM::factory("search_record")->where("item_id", $item->id)->find(); + if (!$record->loaded) { + $record->item_id = $item->id; + } + foreach (module::installed() as $module_name => $module_info) { $class_name = "{$module_name}_search"; if (method_exists($class_name, "item_index_data")) { @@ -71,4 +77,18 @@ class search_Core { $record->dirty = 0; $record->save(); } + + static function stats() { + $remaining = Database::instance() + ->select("items.id") + ->from("items") + ->join("search_records", "items.id", "search_records.item_id", "left") + ->where("search_records.item_id", null) + ->orwhere("search_records.dirty", 1) + ->get() + ->count(); + $total = ORM::factory("item")->count_all(); + $percent = round(100 * ($total - $remaining) / $total); + return array($remaining, $total, $percent); + } } diff --git a/modules/search/helpers/search_event.php b/modules/search/helpers/search_event.php index 50a968e7..b9657395 100644 --- a/modules/search/helpers/search_event.php +++ b/modules/search/helpers/search_event.php @@ -19,16 +19,11 @@ */ class search_event_Core { static function item_created($item) { - $record = ORM::factory("search_record"); - $record->item_id = $item->id; - search::update_record($record); + search::update($item); } static function item_updated($old_item, $new_item) { - $record = ORM::factory("search_record") - ->where("item_id", $new_item->id) - ->find(); - search::update_record($record); + search::update($new_item); } static function item_before_delete($item) { @@ -38,10 +33,7 @@ class search_event_Core { } static function item_related_update($item) { - $record = ORM::factory("search_record") - ->where("item_id", $item->id) - ->find(); - search::update_record($record); + search::update($item); } static function item_related_update_batch($sql) { diff --git a/modules/search/helpers/search_installer.php b/modules/search/helpers/search_installer.php index fe5a7359..a3d0f79e 100644 --- a/modules/search/helpers/search_installer.php +++ b/modules/search/helpers/search_installer.php @@ -35,14 +35,7 @@ class search_installer { // populate the index with dirty records $db->query("INSERT INTO {search_records} (`item_id`) SELECT `id` FROM {items}"); module::set_version("search", 1); - - if (ORM::factory("search_record")->count_all() < 10) { - foreach (ORM::factory("search_record")->where("dirty", 1)->find_all() as $record) { - search::update_record($record); - } - } else { - search::check_index(); - } + search::check_index(); } } diff --git a/modules/search/helpers/search_task.php b/modules/search/helpers/search_task.php index e3884d53..876661e4 100644 --- a/modules/search/helpers/search_task.php +++ b/modules/search/helpers/search_task.php @@ -25,21 +25,16 @@ class search_task_Core { "WHERE {search_records}.`item_id` NOT IN " . "(SELECT `id` FROM {items})"); - // Insert missing search_records - Database::instance()->query( - "INSERT INTO {search_records}(`item_id`) (" . - " SELECT {items}.`id` FROM {items} " . - " LEFT JOIN {search_records} ON ({search_records}.`item_id` = {items}.`id`) " . - " WHERE {search_records}.`id` IS NULL)"); - - list ($remaining, $total, $percent) = self::_get_stats(); + list ($remaining, $total, $percent) = search::stats(); return array(Task_Definition::factory() ->callback("search_task::update_index") ->name(t("Update Search Index")) - ->description($remaining ? - t("Search index is %percent% up-to-date", - array("percent" => $percent)) - : t("Search index is up to date")) + ->description( + $remaining + ? t2("1 photo or album needs to be scanned", + "%count (%percent%) of your photos and albums need to be scanned", + $remaining, array("percent" => (100 - $percent))) + : t("Search data is up-to-date")) ->severity($remaining ? log::WARNING : log::SUCCESS)); } @@ -47,34 +42,31 @@ class search_task_Core { $completed = $task->get("completed", 0); $start = microtime(true); - while (!$task->done && microtime(true) - $start < 1) { - foreach (ORM::factory("search_record")->where("dirty", 1)->limit(5)->find_all() as $record) { - search::update_record($record); - $completed++; + foreach (ORM::factory("item") + ->join("search_records", "items.id", "search_records.item_id", "left") + ->where("search_records.item_id", null) + ->orwhere("search_records.dirty", 1) + ->find_all() as $item) { + if (microtime(true) - $start > 1.5) { + break; } - list ($remaining, $total, $percent) = self::_get_stats(); - if ($remaining + $completed) { - $task->percent_complete = round(100 * $completed / ($remaining + $completed)); - $task->status = t("%done records updated, index is %percent% up-to-date", - array("done" => $completed, "percent" => $percent)); - } else { - $task->percent_complete = 100; - } + search::update($item); + $completed++; } + list ($remaining, $total, $percent) = search::stats(); $task->set("completed", $completed); - if ($remaining == 0) { + if ($remaining == 0 || !($remaining + $completed)) { $task->done = true; $task->state = "success"; site_status::clear("search_index_out_of_date"); + $task->percent_complete = 100; + } else { + $task->percent_complete = round(100 * $completed / ($remaining + $completed)); } - } - - private static function _get_stats() { - $remaining = ORM::factory("search_record")->where("dirty", 1)->count_all(); - $total = ORM::factory("search_record")->count_all(); - $percent = round(100 * ($total - $remaining) / $total); - return array($remaining, $total, $percent); + $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)); } } |