Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Fix pkg-stat.
Vsevolod Stakhov committed 11 years ago
commit 312bd3c245c623064515ced3992a1c71b3a6c2f1
parent 39bc9d1
5 files changed +72 -50
modified libpkg/pkgdb.c
@@ -3056,6 +3056,7 @@ pkgdb_stats(struct pkgdb *db, pkg_stats_t type)
	int64_t		 stats = 0;
	struct sbuf	*sql = NULL;
	int		 ret;
+
	struct _pkg_repo_list_item *rit;

	assert(db != NULL);

@@ -3068,61 +3069,23 @@ pkgdb_stats(struct pkgdb *db, pkg_stats_t type)
	case PKG_STATS_LOCAL_SIZE:
		sbuf_printf(sql, "SELECT SUM(flatsize) FROM main.packages;");
		break;
-
	/* TODO: broken now */
-
#if 0
	case PKG_STATS_REMOTE_UNIQUE:
-
		sbuf_printf(sql, "SELECT COUNT(c) FROM ");
-

-
		/* open parentheses for the compound statement */
-
		sbuf_printf(sql, "(");
-

-
		/* execute on all databases */
-
		pkgdb_sql_all_attached(db->sqlite, sql,
-
		    "SELECT name || '~' || origin AS c FROM '%1$s'.packages", " UNION ");
-

-
		/* close parentheses for the compound statement */
-
		sbuf_printf(sql, ");");
-
		break;
	case PKG_STATS_REMOTE_COUNT:
-
		sbuf_printf(sql, "SELECT COUNT(c) FROM ");
-

-
		/* open parentheses for the compound statement */
-
		sbuf_printf(sql, "(");
-

-
		/* execute on all databases */
-
		pkgdb_sql_all_attached(db->sqlite, sql,
-
		    "SELECT  name || '~' || origin AS c FROM '%1$s'.packages", " UNION ALL ");
-

-
		/* close parentheses for the compound statement */
-
		sbuf_printf(sql, ");");
-
		break;
	case PKG_STATS_REMOTE_SIZE:
-
		sbuf_printf(sql, "SELECT SUM(s) FROM ");
-

-
		/* open parentheses for the compound statement */
-
		sbuf_printf(sql, "(");
+
		LL_FOREACH(db->repos, rit) {
+
			struct pkg_repo *repo = rit->repo;

-
		/* execute on all databases */
-
		pkgdb_sql_all_attached(db->sqlite, sql,
-
		    "SELECT flatsize AS s FROM '%1$s'.packages", " UNION ALL ");
-

-
		/* close parentheses for the compound statement */
-
		sbuf_printf(sql, ");");
+
			if (repo->ops->stat != NULL)
+
				stats += repo->ops->stat(repo, type);
+
		}
+
		goto remote;
		break;
	case PKG_STATS_REMOTE_REPOS:
-
		sbuf_printf(sql, "SELECT COUNT(c) FROM ");
-

-
		/* open parentheses for the compound statement */
-
		sbuf_printf(sql, "(");
-

-
		/* execute on all databases */
-
		pkgdb_sql_all_attached(db->sqlite, sql,
-
		    "SELECT '%1$s' AS c", " UNION ALL ");
-

-
		/* close parentheses for the compound statement */
-
		sbuf_printf(sql, ");");
+
		LL_FOREACH(db->repos, rit) {
+
			stats ++;
+
		}
+
		goto remote;
		break;
-
#endif
	}

	sbuf_finish(sql);
@@ -3138,9 +3101,11 @@ pkgdb_stats(struct pkgdb *db, pkg_stats_t type)
		stats = sqlite3_column_int64(stmt, 0);
	}

-
	sbuf_free(sql);
	sqlite3_finalize(stmt);

+
remote:
+
	sbuf_free(sql);
+

	return (stats);
}

modified libpkg/private/pkg.h
@@ -377,6 +377,8 @@ struct pkg_repo_ops {
	struct pkg_repo_it * (*search)(struct pkg_repo *, const char *, match_t,
					pkgdb_field field, pkgdb_field sort);

+
	int64_t (*stat)(struct pkg_repo *, pkg_stats_t type);
+

	int (*ensure_loaded)(struct pkg_repo *repo, struct pkg *pkg, unsigned flags);

	/* Fetch package from repo */
modified libpkg/repo/binary/binary.c
@@ -37,5 +37,6 @@ struct pkg_repo_ops pkg_repo_binary_ops = {
	.search = pkg_repo_binary_search,
	.fetch_pkg = pkg_repo_binary_fetch,
	.get_cached_name = pkg_repo_binary_get_cached_name,
-
	.ensure_loaded = pkg_repo_binary_ensure_loaded
+
	.ensure_loaded = pkg_repo_binary_ensure_loaded,
+
	.stat = pkg_repo_binary_stat
};
modified libpkg/repo/binary/binary.h
@@ -50,6 +50,7 @@ struct pkg_repo_it *pkg_repo_binary_search(struct pkg_repo *repo,
    pkgdb_field field, pkgdb_field sort);
int pkg_repo_binary_ensure_loaded(struct pkg_repo *repo,
	struct pkg *pkg, unsigned flags);
+
int64_t pkg_repo_binary_stat(struct pkg_repo *repo, pkg_stats_t type);

int pkg_repo_binary_fetch(struct pkg_repo *repo, struct pkg *pkg);
void pkg_repo_binary_get_cached_name(struct pkg_repo *repo, struct pkg *pkg,
modified libpkg/repo/binary/query.c
@@ -385,3 +385,56 @@ pkg_repo_binary_ensure_loaded(struct pkg_repo *repo,

	return (pkgdb_ensure_loaded_sqlite(sqlite, pkg, flags));
}
+

+

+
int64_t
+
pkg_repo_binary_stat(struct pkg_repo *repo, pkg_stats_t type)
+
{
+
	sqlite3 *sqlite = PRIV_GET(repo);
+
	sqlite3_stmt	*stmt = NULL;
+
	int64_t		 stats = 0;
+
	struct sbuf	*sql = NULL;
+
	int		 ret;
+

+
	sql = sbuf_new_auto();
+

+
	switch(type) {
+
	case PKG_STATS_LOCAL_COUNT:
+
		goto out;
+
		break;
+
	case PKG_STATS_LOCAL_SIZE:
+
		goto out;
+
		break;
+
	case PKG_STATS_REMOTE_UNIQUE:
+
		sbuf_printf(sql, "SELECT COUNT(id) FROM main.packages;");
+
		break;
+
	case PKG_STATS_REMOTE_COUNT:
+
		sbuf_printf(sql, "SELECT COUNT(id) FROM main.packages;");
+
		break;
+
	case PKG_STATS_REMOTE_SIZE:
+
		sbuf_printf(sql, "SELECT SUM(flatsize) FROM main.packages;");
+
		break;
+
	case PKG_STATS_REMOTE_REPOS:
+
		goto out;
+
		break;
+
	}
+

+
	sbuf_finish(sql);
+
	pkg_debug(4, "binary_repo: running '%s'", sbuf_data(sql));
+
	ret = sqlite3_prepare_v2(sqlite, sbuf_data(sql), -1, &stmt, NULL);
+
	if (ret != SQLITE_OK) {
+
		ERROR_SQLITE(sqlite, sbuf_data(sql));
+
		goto out;
+
	}
+

+
	while (sqlite3_step(stmt) != SQLITE_DONE) {
+
		stats = sqlite3_column_int64(stmt, 0);
+
	}
+

+
out:
+
	sbuf_free(sql);
+
	if (stmt != NULL)
+
		sqlite3_finalize(stmt);
+

+
	return (stats);
+
}