Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Add code to load abstract metadata into struct pkg from database
Matthew Seaman committed 13 years ago
commit 86d656daa5e67c16875b59181339807308ae4d68
parent 99ad53a
2 files changed +68 -24
modified libpkg/pkgdb.c
@@ -151,6 +151,43 @@ load_val(sqlite3 *db, struct pkg *pkg, const char *sql, unsigned flags,
	return (EPKG_OK);
}

+
static int
+
load_key_val(sqlite3 *db, struct pkg *pkg, const char *sql, unsigned flags,
+
	     int (*pkg_addkeyval)(struct pkg *pkg, const char *key, const char *val),
+
	     int list)
+
{
+
	sqlite3_stmt	*stmt;
+
	int		 ret;
+

+
	assert(db != NULL && pkg != NULL);
+

+
	if (pkg->flags & flags)
+
		return (EPKG_OK);
+

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

+
	sqlite3_bind_int64(stmt, 1, pkg->rowid);
+

+
	while ((ret = sqlite3_step(stmt)) == SQLITE_ROW) {
+
		pkg_addkeyval(pkg, sqlite3_column_text(stmt, 0),
+
			      sqlite3_column_text(stmt, 1));
+
	}
+
	sqlite3_finalize(stmt);
+

+
	if (ret != SQLITE_DONE) {
+
		if (list != -1)
+
			pkg_list_free(pkg, list);
+
		ERROR_SQLITE(db);
+
		return (EPKG_FATAL);
+
	}
+

+
	pkg->flags |= flags;
+
	return (EPKG_OK);
+
}
+

static const char *
pkgdb_get_reponame(struct pkgdb *db, const char *repo)
{
@@ -1253,7 +1290,8 @@ static struct load_on_flag {
	{ PKG_LOAD_GROUPS,		pkgdb_load_group },
	{ PKG_LOAD_SHLIBS_REQUIRED,	pkgdb_load_shlib_required },
	{ PKG_LOAD_SHLIBS_PROVIDED,	pkgdb_load_shlib_provided },
-
	{ -1,			NULL }
+
	{ PKG_LOAD_ABSTRACT_METADATA,   pkgdb_load_abstract_metadata },
+
	{ -1,			        NULL }
};

int
@@ -1924,6 +1962,32 @@ pkgdb_load_shlib_provided(struct pkgdb *db, struct pkg *pkg)
}

int
+
pkgdb_load_abstract_metadata(struct pkgdb *db, struct pkg *pkg)
+
{
+
	char		 sql[BUFSIZ];
+
	const char	*reponame = NULL;
+
	const char	*basesql = ""
+
		"SELECT k.abstract AS key, v.abstract AS value"
+
		"  FROM %Q.pkg_abstract p"
+
		"    JOIN %Q.abstract k ON (p.key_id = k.abstract_id)"
+
		"    JOIN %Q.abstract v ON (p.key_id = v.abstract_id)"
+
		"  WHERE p.package_id = ?1"
+
		"  ORDER BY key, value";
+

+
	assert(db != NULL && pkg != NULL);
+

+
	if (pkg->type == PKG_REMOTE) {
+
		assert(db->type == PKGDB_REMOTE);
+
		pkg_get(pkg, PKG_REPONAME, &reponame);
+
		sqlite3_snprintf(sizeof(sql), sql, basesql, reponame, reponame);
+
	} else
+
		sqlite3_snprintf(sizeof(sql), sql, basesql, "main", "main");
+

+
	return (load_key_val(db->sqlite, pkg, sql, PKG_LOAD_ABSTRACT_METADATA,
+
		   pkg_addabstract_metadata, PKG_ABSTRACT_METADATA));
+
}
+

+
int
pkgdb_load_scripts(struct pkgdb *db, struct pkg *pkg)
{
	sqlite3_stmt	*stmt = NULL;
@@ -1964,8 +2028,6 @@ pkgdb_load_scripts(struct pkgdb *db, struct pkg *pkg)
int
pkgdb_load_options(struct pkgdb *db, struct pkg *pkg)
{
-
	sqlite3_stmt	*stmt = NULL;
-
	int		 ret = EPKG_OK;
	const char	*reponame;
	char		 sql[BUFSIZ];
	const char	*basesql = ""
@@ -1986,27 +2048,8 @@ pkgdb_load_options(struct pkgdb *db, struct pkg *pkg)
		sqlite3_snprintf(sizeof(sql), sql, basesql, "main");
	}

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

-
	sqlite3_bind_int64(stmt, 1, pkg->rowid);
-

-
	while ((ret = sqlite3_step(stmt)) == SQLITE_ROW) {
-
		pkg_addoption(pkg, sqlite3_column_text(stmt, 0),
-
		    sqlite3_column_text(stmt, 1));
-
	}
-
	sqlite3_finalize(stmt);
-

-
	if (ret != SQLITE_DONE) {
-
		pkg_list_free(pkg, PKG_OPTIONS);
-
		ERROR_SQLITE(db->sqlite);
-
		return (EPKG_FATAL);
-
	}
-

-
	pkg->flags |= PKG_LOAD_OPTIONS;
-
	return (EPKG_OK);
+
	return (load_key_val(db->sqlite, pkg, sql, PKG_LOAD_OPTIONS,
+
		    pkg_addoption, PKG_OPTIONS));
}

int
modified libpkg/private/pkg.h
@@ -389,6 +389,7 @@ int pkgdb_load_user(struct pkgdb *db, struct pkg *pkg);
int pkgdb_load_group(struct pkgdb *db, struct pkg *pkg);
int pkgdb_load_shlib_required(struct pkgdb *db, struct pkg *pkg);
int pkgdb_load_shlib_provided(struct pkgdb *db, struct pkg *pkg);
+
int pkgdb_load_abstract_metadata(struct pkgdb *db, struct pkg *pkg);

int pkgdb_register_pkg(struct pkgdb *db, struct pkg *pkg, int complete, int forced);
int pkgdb_update_shlibs_required(struct pkg *pkg, int64_t package_id, sqlite3 *s);