Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Insert abstract metadata into local.sqlite
Matthew Seaman committed 13 years ago
commit 6391db8c4e1f2cc3b7cd9e3f35818f80e80360d1
parent 1a74e40
5 files changed +80 -14
modified libpkg/pkg.c
@@ -1012,7 +1012,8 @@ pkg_list_free(struct pkg *pkg, pkg_list list) {
		pkg->flags &= ~PKG_LOAD_SHLIBS_PROVIDED;
		break;
	case PKG_ABSTRACT_METADATA:
-
		HASH_FREE(pkg->abstract_metadata, pkg_abstract, pkg_abstract_free);
+
		HASH_FREE(pkg->abstract_metadata, pkg_abstract,
+
		    pkg_abstract_free);
		pkg->flags &= ~PKG_LOAD_ABSTRACT_METADATA;
		break;
	}
modified libpkg/pkg_create.c
@@ -83,10 +83,6 @@ pkg_create_from_dir(struct pkg *pkg, const char *root,
		}
	}

-
	/*
-
	 * Register shared libraries used by the package if SHLIBS
-
	 * enabled in conf.  Deletes shlib info if not.
-
	 */
	if (pkg->type == PKG_OLD_FILE) {
		const char *desc, *display, *comment;
		char oldcomment[BUFSIZ];
@@ -101,6 +97,11 @@ pkg_create_from_dir(struct pkg *pkg, const char *root,
		snprintf(oldcomment, sizeof(oldcomment), "%s\n", comment);
		packing_append_buffer(pkg_archive, oldcomment, "+COMMENT", strlen(oldcomment));
	} else {
+
		/*
+
		 * Register shared libraries used by the package if
+
		 * SHLIBS enabled in conf.  Deletes shlib info if not.
+
		 */
+

		pkg_register_shlibs(pkg);

		pkg_emit_manifest(pkg, &m, false, NULL);
modified libpkg/pkgdb.c
@@ -2089,6 +2089,8 @@ typedef enum _sql_prstmt_index {
	SHLIBS1,
	SHLIBS_REQD,
	SHLIBS_PROV,
+
	ABSTRACT1,
+
	ABSTRACT2,
	PRSTMT_LAST,
} sql_prstmt_index;

@@ -2216,6 +2218,20 @@ static sql_prstmt sql_prepared_statements[PRSTMT_LAST] = {
		"VALUES (?1, (SELECT id FROM shlibs WHERE name = ?2))",
		"IT",
	},
+
	[ABSTRACT1] = {
+
		NULL,
+
		"INSERT OR IGNORE INTO abstract(abstract) "
+
		"VALUES (?1)",
+
		"T",
+
	},
+
	[ABSTRACT2] = {
+
		NULL,
+
		"INSERT OR ROLLBACK INTO pkg_abstract(package_id, key_id, value_id) "
+
		"VALUES (?1,"
+
		" (SELECT abstract_id FROM abstract WHERE abstract=?2),"
+
		" (SELECT abstract_id FROM abstract WHERE abstract=?3))",
+
		"ITT",
+
	},
	/* PRSTMT_LAST */
};

@@ -2585,6 +2601,12 @@ pkgdb_register_pkg(struct pkgdb *db, struct pkg *pkg, int complete, int forced)
	if (pkgdb_update_shlibs_provided(pkg, package_id, s) != EPKG_OK)
		goto cleanup;

+
	/*
+
	 * Insert abstract metadata
+
	 */
+
	if (pkgdb_insert_abstract_metadata(pkg, package_id, s) != EPKG_OK)
+
		goto cleanup;
+

	retcode = EPKG_OK;

	cleanup:
@@ -2631,6 +2653,29 @@ pkgdb_update_shlibs_provided(struct pkg *pkg, int64_t package_id, sqlite3 *s)
}

int
+
pkgdb_insert_abstract_metadata(struct pkg *pkg, int64_t package_id, sqlite3 *s)
+
{
+
	struct pkg_abstract	*abstract = NULL;
+

+
	while (pkg_abstract_metadata(pkg, &abstract) == EPKG_OK) {
+
		if (run_prstmt(ABSTRACT1, pkg_abstract_key(abstract))
+
		    != SQLITE_DONE
+
		    ||
+
		    run_prstmt(ABSTRACT1, pkg_abstract_value(abstract))
+
		    != SQLITE_DONE
+
		    ||
+
		    run_prstmt(ABSTRACT2, package_id,
+
			pkg_abstract_key(abstract),
+
			pkg_abstract_value(abstract))
+
		    != SQLITE_DONE) {
+
			ERROR_SQLITE(s);
+
			return (EPKG_FATAL);
+
		}
+
	}
+
	return (EPKG_OK);
+
}
+

+
int
pkgdb_reanalyse_shlibs(struct pkgdb *db, struct pkg *pkg)
{
	sqlite3		*s;
modified libpkg/pkgdb_repo.c
@@ -461,15 +461,16 @@ pkgdb_repo_add_package(struct pkg *pkg, const char *pkg_path,
{
	const char *name, *version, *origin, *comment, *desc;
	const char *arch, *maintainer, *www, *prefix, *sum, *rpath;
-
	int64_t flatsize, pkgsize;
-
	lic_t licenselogic;
-
	int ret;
-
	struct pkg_dep *dep = NULL;
-
	struct pkg_category *category = NULL;
-
	struct pkg_license *license = NULL;
-
	struct pkg_option *option = NULL;
-
	struct pkg_shlib *shlib = NULL;
-
	int64_t package_id;
+
	int64_t			 flatsize, pkgsize;
+
	lic_t			 licenselogic;
+
	int			 ret;
+
	struct pkg_dep		*dep = NULL;
+
	struct pkg_category	*category = NULL;
+
	struct pkg_license	*license = NULL;
+
	struct pkg_option	*option = NULL;
+
	struct pkg_shlib	*shlib = NULL;
+
	struct pkg_abstract	*abstract = NULL;
+
	int64_t			 package_id;

	pkg_get(pkg, PKG_ORIGIN, &origin, PKG_NAME, &name,
			    PKG_VERSION, &version, PKG_COMMENT, &comment,
@@ -584,6 +585,23 @@ try_again:
		}
	}

+
	abstract = NULL;
+
	while (pkg_abstract_metadata(pkg, &abstract) == EPKG_OK) {
+
		const char *abstract_key = pkg_abstract_key(abstract);
+
		const char *abstract_val = pkg_abstract_value(abstract);
+

+
		ret = run_prepared_statement(ABSTRACT1, abstract_key);
+
		if (ret == SQLITE_DONE) 
+
			ret = run_prepared_statement(ABSTRACT1, abstract_val);
+
		if (ret == SQLITE_DONE)
+
			ret = run_prepared_statement(ABSTRACT2, package_id,
+
				  abstract_key, abstract_val);
+
		if (ret != SQLITE_DONE) {
+
			ERROR_SQLITE(sqlite);
+
			return (EPKG_FATAL);
+
		}
+
	}
+

	return (EPKG_OK);
}

modified libpkg/private/pkg.h
@@ -394,6 +394,7 @@ 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);
int pkgdb_update_shlibs_provided(struct pkg *pkg, int64_t package_id, sqlite3 *s);
+
int pkgdb_insert_abstract_metadata(struct pkg *pkg, int64_t package_id, sqlite3 *s);
int pkgdb_register_finale(struct pkgdb *db, int retcode);

int pkg_register_shlibs(struct pkg *pkg);