summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--modules/exif/helpers/exif.php31
-rw-r--r--modules/exif/helpers/exif_installer.php2
-rw-r--r--modules/exif/helpers/exif_task.php47
-rw-r--r--modules/search/helpers/search.php24
-rw-r--r--modules/search/helpers/search_event.php14
-rw-r--r--modules/search/helpers/search_installer.php9
-rw-r--r--modules/search/helpers/search_task.php56
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));
}
}