Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Lock the entire db in pkg_jobs.
Julien Laffaye committed 14 years ago
commit fda1cbe99cfab22ba11a86a796886a78fe1d6120
parent 7fe7d74
3 files changed +38 -9
modified libpkg/pkg_jobs.c
@@ -49,6 +49,9 @@ pkg_jobs_new(struct pkg_jobs **j, pkg_jobs_t t, struct pkgdb *db)
	assert(db != NULL);
	assert(t != PKG_JOBS_INSTALL || db->type == PKGDB_REMOTE);

+
	if (pkgdb_lock(db) != EPKG_OK)
+
		return (EPKG_FATAL);
+

	if((*j = calloc(1, sizeof(struct pkg_jobs))) == NULL) {
		pkg_emit_errno("calloc", "pkg_jobs");
		return (EPKG_FATAL);
@@ -69,6 +72,8 @@ pkg_jobs_free(struct pkg_jobs *j)
	if (j == NULL)
		return;

+
	pkgdb_unlock(j->db);
+

	while (!STAILQ_EMPTY(&j->jobs)) {
		p = STAILQ_FIRST(&j->jobs);
		STAILQ_REMOVE_HEAD(&j->jobs, next);
@@ -295,15 +300,24 @@ pkg_jobs_deinstall(struct pkg_jobs *j, int force)
int
pkg_jobs_apply(struct pkg_jobs *j, int force)
{
-
	if (j->type == PKG_JOBS_INSTALL)
-
		return (pkg_jobs_install(j, force));
-
	if (j->type == PKG_JOBS_DEINSTALL)
-
		return (pkg_jobs_deinstall(j, force));
-
	if (j->type == PKG_JOBS_FETCH)
-
		return (pkg_jobs_fetch(j));
-

-
	pkg_emit_error("bad jobs argument");
-
	return (EPKG_FATAL);
+
	int rc;
+

+
	switch (j->type) {
+
		case PKG_JOBS_INSTALL:
+
			rc = pkg_jobs_install(j, force);
+
			break;
+
		case PKG_JOBS_DEINSTALL:
+
			rc = pkg_jobs_deinstall(j, force);
+
			break;
+
		case PKG_JOBS_FETCH:
+
			rc = pkg_jobs_fetch(j);
+
			break;
+
		default:
+
			rc = EPKG_FATAL;
+
			pkg_emit_error("bad jobs argument");
+
	}
+

+
	return (rc);
}

static int
modified libpkg/pkgdb.c
@@ -3208,3 +3208,15 @@ pkgshell_open(const char **reponame)
	snprintf(localpath, sizeof(localpath), "%s/local.sqlite", dbdir);
	*reponame = strdup(localpath);
}
+

+
int
+
pkgdb_lock(struct pkgdb *db)
+
{
+
	return sql_exec(db->sqlite, "PRAGMA main.locking_mode=EXCLUSIVE;BEGIN IMMEDIATE;COMMIT;");
+
}
+

+
int
+
pkgdb_unlock(struct pkgdb *db)
+
{
+
	return sql_exec(db->sqlite, "PRAGMA main.locking_mode=NORMAL;BEGIN IMMEDIATE;COMMIT;");
+
}
modified libpkg/private/pkgdb.h
@@ -43,5 +43,8 @@ struct pkgdb_it {
	int type;
};

+
int pkgdb_lock(struct pkgdb *db);
+
int pkgdb_unlock(struct pkgdb *db);
+

void pkgshell_open(const char **r);
#endif