getOne($sql); if(!$count || $debug) $all = true; else { $sql = "SELECT MAX(portage_mtime) FROM package;"; $max_portage_mtime = $db->getOne($sql); if(is_null($max_portage_mtime)) $all = true; } if(!$all) { $categories = $tree->getCategories(); $tmp = tempnam('/tmp', 'znurt'); touch($tmp, $max_portage_mtime); $arr = array(); $dir = $tree->getTree(); foreach($categories as $category_name) { $category_dir = $dir."/".$category_name; $exec = "find $category_dir -mindepth 1 -maxdepth 1 -type d -newer $tmp"; $arr = array_merge($arr, shell::cmd($exec)); } unlink($tmp); foreach($arr as $name) { $name = str_replace($dir."/", "", $name); $tmp = explode("/", $name); $arr_update[$tmp[0]][] = $tmp[1]; } } $sql = "SELECT id, name FROM category ORDER BY name;"; $arr_categories = $db->getAssoc($sql); $sql = "SELECT category, package, category_name, package_name FROM view_package;"; $arr = $db->getAll($sql); foreach($arr as $row) { $arr_package_ids[$row['category_name']][$row['package_name']] = $row['package']; } $table = 'package'; foreach($arr_categories as $category_id => $category_name) { $c = new PortageCategory($category_name); $arr_packages = $c->getPackages(); $arr_diff = importDiff('package', $arr_packages, "category = $category_id"); // FIXME Flag to be deleted, execute later // This is dangerous to delete right now because 1) it will take a *long* time, and // 2) you're breaking the whole "snapshot" approach. if(count($arr_diff['delete'])) { foreach($arr_diff['delete'] as $package_name) { $sql = "DELETE FROM $table WHERE name = ".$db->quote($package_name)." AND category = $category_id;"; $db->query($sql); } } if(count($arr_diff['insert'])) { foreach($arr_diff['insert'] as $package_name) { $p = new PortagePackage($category_name, $package_name); $arr_insert = array( 'category' => $category_id, 'name' => $package_name, 'changelog' => $p->changelog, 'portage_mtime' => $p->portage_mtime, 'changelog_mtime' => $p->changelog_mtime, 'metadata_mtime' => $p->metadata_mtime, ); $db->autoExecute($table, $arr_insert, MDB2_AUTOQUERY_INSERT); } } } unset($c); foreach($arr_update as $category_name => $arr_packages) { foreach($arr_packages as $package_name) { $package_id = $arr_package_ids[$category_name][$package_name]; if($package_id) { $p = new PortagePackage($category_name, $package_name); if($p->portage_mtime > $max_portage_mtime || $debug) { if($debug) { shell::msg("Updating $category_name/$package_name id: $package_id"); } $db_package = new DBPackage($package_id); // If the mtime of this directory changed, then a file // somewhere has been added or deleted. Flag the status // to make sure we examine that directory later. if($p->portage_mtime != $db_package->portage_mtime) { $db_package->portage_mtime = $p->portage_mtime; $db_package->status = 1; } if($p->changelog_mtime != $db_package->changelog_mtime) { $db_package->changelog_mtime = $p->changelog_mtime; $db_package->changelog = $p->changelog; } if($p->metadata_mtime != $db_package->metadata_mtime) $db_package->metadata_mtime = $p->metadata_mtime; } } } } ?>