Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Do not use sqlite anymore to compute the autoremove
Baptiste Daroussin committed 13 years ago
commit e84f8ba27ae18608967068caa134937863cafd4f
parent 86ba4cb
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);