Radish alpha
H
HardenedBSD Package Manager
Radicle
Git (anonymous pull)
Log in to clone via SSH
Do not use sqlite anymore to compute the autoremove
Baptiste Daroussin committed 13 years ago
commit e84f8ba27ae18608967068caa134937863cafd4f
parent 86ba4cbf052a154745dbca217a71873b1f0716a9
3 files changed +36 -48
modified libpkg/pkg_jobs.c
@@ -142,22 +142,54 @@ jobs_solve_deinstall(struct pkg_jobs *j)
	return( EPKG_OK);
}

+
static bool
+
recursive_autoremove(struct pkg *all, struct pkg_jobs *j)
+
{
+
	struct pkg *p1, *p2, *p3, *p4;
+
	struct pkg_dep *dep;
+
	char *origin;
+

+
	HASH_ITER(hh, all, p1, p2) {
+
		if (HASH_COUNT(p1->rdeps) == 0) {
+
			HASH_DEL(all, p1);
+
			pkg_get(p1, PKG_ORIGIN, &origin);
+
			HASH_ADD_KEYPTR(hh, j->jobs, origin, strlen(origin), p1);
+
			HASH_ITER(hh, all, p3, p4) {
+
				HASH_FIND_STR(p3->rdeps, origin, dep);
+
				if (dep != NULL) {
+
					HASH_DEL(p3->rdeps, dep);
+
					pkg_dep_free(dep);
+
				}
+
			}
+
			return (true);
+
		}
+
	}
+

+
	return (false);
+
}
+

static int
jobs_solve_autoremove(struct pkg_jobs *j)
{
	struct pkg *pkg = NULL;
+
	struct pkg *all = NULL;
	struct pkgdb_it *it;
	char *origin;

-
	if ((it = pkgdb_query_autoremove(j->db)) == NULL)
+
	if ((it = pkgdb_query(j->db, " WHERE automatic=1 ", MATCH_CONDITION)) == NULL)
		return (EPKG_FATAL);

-
	while (pkgdb_it_next(it, &pkg, PKG_LOAD_BASIC) == EPKG_OK) {
+
	while (pkgdb_it_next(it, &pkg, PKG_LOAD_BASIC|PKG_LOAD_RDEPS) == EPKG_OK) {
		pkg_get(pkg, PKG_ORIGIN, &origin);
-
		HASH_ADD_KEYPTR(hh, j->jobs, origin, strlen(origin), pkg);
+
		HASH_ADD_KEYPTR(hh, all, origin, strlen(origin), pkg);
		pkg = NULL;
	}
	pkgdb_it_free(it);
+

+
	while (recursive_autoremove(all, j));
+

+
	HASH_FREE(all, pkg, pkg_free);
+

	j->solved = true;

	return (EPKG_OK);
modified libpkg/pkgdb.c
@@ -1420,8 +1420,7 @@ pkgdb_it_free(struct pkgdb_it *it)
		return;

	if (!sqlite3_db_readonly(it->sqlite, "main")) {
-
		sql_exec(it->sqlite, "DROP TABLE IF EXISTS autoremove; "
-
				"DROP TABLE IF EXISTS delete_job; "
+
		sql_exec(it->sqlite, "DROP TABLE IF EXISTS delete_job; "
				"DROP TABLE IF EXISTS pkgjobs");
	}

@@ -3877,48 +3876,6 @@ pkgdb_query_upgrades(struct pkgdb *db, const char *repo, bool all,
}

struct pkgdb_it *
-
pkgdb_query_autoremove(struct pkgdb *db)
-
{
-
	sqlite3_stmt	*stmt = NULL;
-
	int		 weight = 0;
-

-
	assert(db != NULL);
-

-
	const char	 sql[] = ""
-
		"SELECT id, p.origin, name, version, comment, desc, "
-
		    "message, arch, maintainer, www, prefix, "
-
		    "locked, flatsize "
-
		"FROM packages AS p, autoremove "
-
		"WHERE id = pkgid ORDER BY weight ASC;";
-

-
	sql_exec(db->sqlite, "DROP TABLE IF EXISTS autoremove; "
-
		"CREATE TEMPORARY TABLE IF NOT EXISTS autoremove ("
-
			"origin TEXT UNIQUE NOT NULL, "
-
			"pkgid INTEGER, "
-
			"weight INTEGER )");
-

-
	do {
-
		sql_exec(db->sqlite, ""
-
		    "INSERT OR IGNORE INTO autoremove(origin, pkgid, weight) "
-
		    "SELECT DISTINCT origin, id, %d "
-
		    "FROM packages "
-
		    "WHERE automatic = 1 "
-
			 "AND origin NOT IN (SELECT DISTINCT deps.origin "
-
			 "FROM deps "
-
			 "WHERE deps.origin = packages.origin "
-
			 "AND package_id NOT IN (SELECT pkgid "
-
			 "FROM autoremove));", weight);
-
	} while (sqlite3_changes(db->sqlite) != 0);
-

-
	if (sqlite3_prepare_v2(db->sqlite, sql, -1, &stmt, NULL) != SQLITE_OK) {
-
		ERROR_SQLITE(db->sqlite);
-
		return (NULL);
-
	}
-

-
	return (pkgdb_it_new(db, stmt, PKG_INSTALLED, PKGDB_IT_FLAG_ONCE));
-
}
-

-
struct pkgdb_it *
pkgdb_query_delete(struct pkgdb *db, match_t match, int nbpkgs, char **pkgs,
		   int recursive)
{
modified libpkg/private/pkgdb.h
@@ -66,7 +66,6 @@ int pkgdb_transaction_rollback(sqlite3 *sqlite, const char *savepoint);
struct pkgdb_it *pkgdb_it_new(struct pkgdb *db, sqlite3_stmt *s, int type, short flags);

struct pkgdb_it *pkgdb_query_delete(struct pkgdb *db, match_t type, int nbpkgs, char **pkgs, int recursive);
-
struct pkgdb_it *pkgdb_query_autoremove(struct pkgdb *db);
struct pkgdb_it *pkgdb_query_upgrades(struct pkgdb *db, const char *reponame, bool all, bool pkgversiontest);
struct pkgdb_it *pkgdb_query_installs(struct pkgdb *db, match_t type, int nbpkgs, char **pkgs, const char *reponame, bool force, bool recursive, bool pkgversiontest);
struct pkgdb_it *pkgdb_query_fetch(struct pkgdb *db, match_t type, int nbpkgs, char **pkgs, const char *reponame, unsigned flags);