Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Add public API for pkgdb transactions.
Vsevolod Stakhov committed 11 years ago
commit 7782333e3331ee5430e4403baafbb075933e6ed8
parent a547d93
7 files changed +62 -32
modified libpkg/libpkg.ver
@@ -191,6 +191,9 @@ global:
	pkgdb_set2;
	pkgdb_set_case_sensitivity;
	pkgdb_stats;
+
	pkgdb_transaction_begin;
+
	pkgdb_transaction_commit;
+
	pkgdb_transaction_rollback;
	pkgdb_upgrade_lock;
	ports_parse_plist;
local:
modified libpkg/pkg.h.in
@@ -835,6 +835,16 @@ int pkgdb_downgrade_lock(struct pkgdb *db, pkgdb_lock_t old_type,
int pkgdb_release_lock(struct pkgdb *db, pkgdb_lock_t type);

/**
+
 * Transaction/savepoint handling.
+
 * @param savepoint -- if NULL or an empty string, use BEGIN, ROLLBACK, COMMIT
+
 * otherwise use SAVEPOINT, ROLLBACK TO, RELEASE.
+
 * @return an error code.
+
 */
+
int pkgdb_transaction_begin(struct pkgdb *db, const char *savepoint);
+
int pkgdb_transaction_commit(struct pkgdb *db, const char *savepoint);
+
int pkgdb_transaction_rollback(struct pkgdb *db, const char *savepoint);
+

+
/**
 * Close and free the struct pkgdb.
 */
void pkgdb_close(struct pkgdb *db);
modified libpkg/pkg_jobs.c
@@ -1815,7 +1815,7 @@ pkg_jobs_handle_install(struct pkg_solved *ps, struct pkg_jobs *j, bool handle_r
#if 0
	if (old != NULL && !ps->already_deleted) {
		if ((retcode = pkg_delete(old, j->db, PKG_DELETE_UPGRADE)) != EPKG_OK) {
-
			pkgdb_transaction_rollback(j->db->sqlite, "upgrade");
+
			pkgdb_transaction_rollback_sqlite(j->db->sqlite, "upgrade");
			goto cleanup;
		}
	}
@@ -1826,7 +1826,7 @@ pkg_jobs_handle_install(struct pkg_solved *ps, struct pkg_jobs *j, bool handle_r
		retcode = pkg_add_from_remote(j->db, target, flags, keys, NULL, new);

	if (retcode != EPKG_OK) {
-
		pkgdb_transaction_rollback(j->db->sqlite, "upgrade");
+
		pkgdb_transaction_rollback_sqlite(j->db->sqlite, "upgrade");
		return (retcode);
	}

@@ -1862,7 +1862,7 @@ pkg_jobs_execute(struct pkg_jobs *j)
	p = NULL;
	pkg_manifest_keys_new(&keys);
	/* Install */
-
	if ((retcode = pkgdb_transaction_begin(j->db->sqlite, "upgrade")) !=
+
	if ((retcode = pkgdb_transaction_begin_sqlite(j->db->sqlite, "upgrade")) !=
	    EPKG_OK)
		return (retcode);

@@ -1913,7 +1913,7 @@ pkg_jobs_execute(struct pkg_jobs *j)
	}

cleanup:
-
	pkgdb_transaction_commit(j->db->sqlite, "upgrade");
+
	pkgdb_transaction_commit_sqlite(j->db->sqlite, "upgrade");
	pkgdb_release_lock(j->db, PKGDB_LOCK_EXCLUSIVE);
	pkg_manifest_keys_free(keys);

modified libpkg/pkgdb.c
@@ -265,22 +265,22 @@ pkgdb_upgrade(struct pkgdb *db)
			return (EPKG_FATAL);
		}

-
		if (pkgdb_transaction_begin(db->sqlite, NULL) != EPKG_OK)
+
		if (pkgdb_transaction_begin_sqlite(db->sqlite, NULL) != EPKG_OK)
			return (EPKG_FATAL);

		if (sql_exec(db->sqlite, sql_upgrade) != EPKG_OK) {
-
			pkgdb_transaction_rollback(db->sqlite, NULL);
+
			pkgdb_transaction_rollback_sqlite(db->sqlite, NULL);
			return (EPKG_FATAL);
		}

		sql_str = "PRAGMA user_version = %" PRId64 ";";
		ret = sql_exec(db->sqlite, sql_str, db_version);
		if (ret != EPKG_OK) {
-
			pkgdb_transaction_rollback(db->sqlite, NULL);
+
			pkgdb_transaction_rollback_sqlite(db->sqlite, NULL);
			return (EPKG_FATAL);
		}

-
		if (pkgdb_transaction_commit(db->sqlite, NULL) != EPKG_OK)
+
		if (pkgdb_transaction_commit_sqlite(db->sqlite, NULL) != EPKG_OK)
			return (EPKG_FATAL);
	}

@@ -1057,7 +1057,7 @@ pkgdb_close(struct pkgdb *db)
	    sqlite3_sleep(BUSY_SLEEP))

int
-
pkgdb_transaction_begin(sqlite3 *sqlite, const char *savepoint)
+
pkgdb_transaction_begin_sqlite(sqlite3 *sqlite, const char *savepoint)
{
	int		 ret;
	sqlite3_stmt	*stmt;
@@ -1096,7 +1096,7 @@ pkgdb_transaction_begin(sqlite3 *sqlite, const char *savepoint)
}

int
-
pkgdb_transaction_commit(sqlite3 *sqlite, const char *savepoint)
+
pkgdb_transaction_commit_sqlite(sqlite3 *sqlite, const char *savepoint)
{
	int		 ret;
	sqlite3_stmt	*stmt;
@@ -1136,7 +1136,7 @@ pkgdb_transaction_commit(sqlite3 *sqlite, const char *savepoint)
}

int
-
pkgdb_transaction_rollback(sqlite3 *sqlite, const char *savepoint)
+
pkgdb_transaction_rollback_sqlite(sqlite3 *sqlite, const char *savepoint)
{
	int		 ret;
	sqlite3_stmt	*stmt;
@@ -1174,7 +1174,24 @@ pkgdb_transaction_rollback(sqlite3 *sqlite, const char *savepoint)
	return (ret == SQLITE_OK || ret == SQLITE_DONE ? EPKG_OK : EPKG_FATAL);
}

-

+
/*
+
 * Public API
+
 */
+
int
+
pkgdb_transaction_begin(struct pkgdb *db, const char *savepoint)
+
{
+
	return (pkgdb_transaction_begin_sqlite(db->sqlite, savepoint));
+
}
+
int
+
pkgdb_transaction_commit(struct pkgdb *db, const char *savepoint)
+
{
+
	return (pkgdb_transaction_commit_sqlite(db->sqlite, savepoint));
+
}
+
int
+
pkgdb_transaction_rollback(struct pkgdb *db, const char *savepoint)
+
{
+
	return (pkgdb_transaction_rollback_sqlite(db->sqlite, savepoint));
+
}


/* By default, MATCH_EXACT and MATCH_REGEX are case sensitive.  This
@@ -1566,7 +1583,7 @@ pkgdb_register_pkg(struct pkgdb *db, struct pkg *pkg, int complete, int forced)

	s = db->sqlite;

-
	if (!complete && pkgdb_transaction_begin(s, NULL) != EPKG_OK)
+
	if (!complete && pkgdb_transaction_begin_sqlite(s, NULL) != EPKG_OK)
		return (EPKG_FATAL);

	/* Prefer new ABI over old one */
@@ -2032,7 +2049,7 @@ pkgdb_add_annotation(struct pkgdb *db, struct pkg *pkg, const char *tag,
	    run_prstmt(ANNOTATE_ADD1, pkg->uid, tag, value)
	    != SQLITE_DONE) {
		ERROR_SQLITE(db->sqlite, SQL(ANNOTATE_ADD1));
-
		pkgdb_transaction_rollback(db->sqlite, NULL);
+
		pkgdb_transaction_rollback_sqlite(db->sqlite, NULL);
		return (EPKG_FATAL);
	}

@@ -2069,7 +2086,7 @@ pkgdb_modify_annotation(struct pkgdb *db, struct pkg *pkg, const char *tag,
	assert(tag != NULL);
	assert(value != NULL);

-
	if (pkgdb_transaction_begin(db->sqlite, NULL) != EPKG_OK)
+
	if (pkgdb_transaction_begin_sqlite(db->sqlite, NULL) != EPKG_OK)
		return (EPKG_FATAL);

	if (run_prstmt(ANNOTATE_DEL1, pkg->uid, tag) != SQLITE_DONE
@@ -2083,7 +2100,7 @@ pkgdb_modify_annotation(struct pkgdb *db, struct pkg *pkg, const char *tag,
	    ||
	    run_prstmt(ANNOTATE_DEL2) != SQLITE_DONE) {
		ERROR_SQLITE(db->sqlite, SQL(ANNOTATE_DEL2));
-
		pkgdb_transaction_rollback(db->sqlite, NULL);
+
		pkgdb_transaction_rollback_sqlite(db->sqlite, NULL);

		return (EPKG_FATAL);
	}
@@ -2092,7 +2109,7 @@ pkgdb_modify_annotation(struct pkgdb *db, struct pkg *pkg, const char *tag,

	rows_changed = sqlite3_changes(db->sqlite);

-
	if (pkgdb_transaction_commit(db->sqlite, NULL) != EPKG_OK)
+
	if (pkgdb_transaction_commit_sqlite(db->sqlite, NULL) != EPKG_OK)
		return (EPKG_FATAL);

	return (rows_changed == 1 ? EPKG_OK : EPKG_WARN);
@@ -2107,7 +2124,7 @@ pkgdb_delete_annotation(struct pkgdb *db, struct pkg *pkg, const char *tag)
	assert(pkg != NULL);
	assert(tag != NULL);

-
	if (pkgdb_transaction_begin(db->sqlite, NULL) != EPKG_OK)
+
	if (pkgdb_transaction_begin_sqlite(db->sqlite, NULL) != EPKG_OK)
		return (EPKG_FATAL);

	result = (run_prstmt(ANNOTATE_DEL1, pkg->uid, tag)
@@ -2119,11 +2136,11 @@ pkgdb_delete_annotation(struct pkgdb *db, struct pkg *pkg, const char *tag)
	    ||
	    run_prstmt(ANNOTATE_DEL2) != SQLITE_DONE) {
		ERROR_SQLITE(db->sqlite, SQL(ANNOTATE_DEL2));
-
		pkgdb_transaction_rollback(db->sqlite, NULL);
+
		pkgdb_transaction_rollback_sqlite(db->sqlite, NULL);
		return (EPKG_FATAL);
	}

-
	if (pkgdb_transaction_commit(db->sqlite, NULL) != EPKG_OK)
+
	if (pkgdb_transaction_commit_sqlite(db->sqlite, NULL) != EPKG_OK)
		return (EPKG_FATAL);

	return (rows_changed == 1 ? EPKG_OK : EPKG_WARN);
@@ -2138,9 +2155,9 @@ pkgdb_register_finale(struct pkgdb *db, int retcode)
	assert(db != NULL);

	if (retcode == EPKG_OK) 
-
		ret = pkgdb_transaction_commit(db->sqlite, NULL);
+
		ret = pkgdb_transaction_commit_sqlite(db->sqlite, NULL);
	else
-
		ret = pkgdb_transaction_rollback(db->sqlite, NULL);
+
		ret = pkgdb_transaction_rollback_sqlite(db->sqlite, NULL);

	return (ret);
}
modified libpkg/private/pkgdb.h
@@ -80,9 +80,9 @@ struct pkgdb_it {
 * otherwise use SAVEPOINT, ROLLBACK TO, RELEASE.
 * @return an error code.
 */
-
int pkgdb_transaction_begin(sqlite3 *sqlite, const char *savepoint);
-
int pkgdb_transaction_commit(sqlite3 *sqlite, const char *savepoint);
-
int pkgdb_transaction_rollback(sqlite3 *sqlite, const char *savepoint);
+
int pkgdb_transaction_begin_sqlite(sqlite3 *sqlite, const char *savepoint);
+
int pkgdb_transaction_commit_sqlite(sqlite3 *sqlite, const char *savepoint);
+
int pkgdb_transaction_rollback_sqlite(sqlite3 *sqlite, const char *savepoint);

struct pkgdb_it *pkgdb_it_new_sqlite(struct pkgdb *db, sqlite3_stmt *s,
	int type, short flags);
modified libpkg/repo/binary/init.c
@@ -132,7 +132,7 @@ pkg_repo_binary_apply_change(struct pkg_repo *repo, sqlite3 *sqlite,
	}

	/* begin transaction */
-
	if ((ret = pkgdb_transaction_begin(sqlite, "SCHEMA")) == EPKG_OK)
+
	if ((ret = pkgdb_transaction_begin_sqlite(sqlite, "SCHEMA")) == EPKG_OK)
		in_trans = true;

	/* apply change */
@@ -155,9 +155,9 @@ pkg_repo_binary_apply_change(struct pkg_repo *repo, sqlite3 *sqlite,
	/* commit or rollback */
	if (in_trans) {
		if (ret != EPKG_OK)
-
			pkgdb_transaction_rollback(sqlite, "SCHEMA");
+
			pkgdb_transaction_rollback_sqlite(sqlite, "SCHEMA");

-
		if (pkgdb_transaction_commit(sqlite, "SCHEMA") != EPKG_OK)
+
		if (pkgdb_transaction_commit_sqlite(sqlite, "SCHEMA") != EPKG_OK)
			ret = EPKG_FATAL;
	}

@@ -505,7 +505,7 @@ pkg_repo_binary_close(struct pkg_repo *repo, bool commit)
		return (retcode);

	if (commit) {
-
		if (pkgdb_transaction_commit(sqlite, NULL) != SQLITE_OK)
+
		if (pkgdb_transaction_commit_sqlite(sqlite, NULL) != SQLITE_OK)
			retcode = EPKG_FATAL;
	}

modified libpkg/repo/binary/update.c
@@ -486,7 +486,7 @@ pkg_repo_binary_update_proceed(const char *name, struct pkg_repo *repo,
	sql_exec(sqlite, "PRAGMA cache_size = 10000;");
	sql_exec(sqlite, "PRAGMA foreign_keys = OFF;");

-
	rc = pkgdb_transaction_begin(sqlite, "REPO");
+
	rc = pkgdb_transaction_begin_sqlite(sqlite, "REPO");
	if (rc != EPKG_OK)
		goto cleanup;

@@ -528,9 +528,9 @@ cleanup:

	if (in_trans) {
		if (rc != EPKG_OK)
-
			pkgdb_transaction_rollback(sqlite, "REPO");
+
			pkgdb_transaction_rollback_sqlite(sqlite, "REPO");

-
		if (pkgdb_transaction_commit(sqlite, "REPO") != EPKG_OK)
+
		if (pkgdb_transaction_commit_sqlite(sqlite, "REPO") != EPKG_OK)
			rc = EPKG_FATAL;
	}