Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Execute db upgrades in a transaction.
jlaffaye committed 14 years ago
commit d3bf8a7a68fcb9a7729eeb891dbb36e7ec0795f0
parent d73b3a3
2 files changed +18 -9
modified libpkg/Makefile
@@ -42,7 +42,7 @@ LDADD+= -L${.CURDIR}/../external/sqlite \
		-lutil \
		-lpthread

-
DEBUG_FLAGS+=  -g -O0 -DDEBUG
+
DEBUG_FLAGS+=  -g -O0
.if defined(PROFILE_BUILD)
DEBUG_FLAGS+=	-pg
.endif
modified libpkg/pkgdb.c
@@ -218,7 +218,8 @@ static int
pkgdb_upgrade(sqlite3 *sdb)
{
	int64_t db_version = -1;
-
	char sql[30];
+
	const char *sql_upgrade;
+
	char sql_version[30];
	int i;

	if (get_pragma(sdb, "PRAGMA user_version;", &db_version) != EPKG_OK)
@@ -235,12 +236,10 @@ pkgdb_upgrade(sqlite3 *sdb)
		db_version++;

		i = 0;
+
		sql_upgrade = NULL;
		while (db_upgrades[i].version != -1) {
			if (db_upgrades[i].version == db_version) {
-
				if (sql_exec(sdb, db_upgrades[i].sql) != EPKG_OK)
-
					return (EPKG_FATAL);
-

-
				i = 0;
+
				sql_upgrade = db_upgrades[i].sql;
				break;
			}
			i++;
@@ -251,15 +250,25 @@ pkgdb_upgrade(sqlite3 *sdb)
		 * maybe because the current version is too old and upgrade support has
		 * been removed.
		 */
-
		if (i != 0) {
+
		if (sql_upgrade == NULL) {
			EMIT_PKG_ERROR("can not upgrade to db version %" PRId64,
						   db_version);
			return (EPKG_FATAL);
		}

-
		snprintf(sql, sizeof(sql), "PRAGMA user_version = %" PRId64 ";", db_version);
-
		if (sql_exec(sdb, sql) != EPKG_OK)
+
		if (sql_exec(sdb, "BEGIN;") != EPKG_OK)
+
			return (EPKG_FATAL);
+

+
		if (sql_exec(sdb, sql_upgrade) != EPKG_OK)
+
					return (EPKG_FATAL);
+

+
		snprintf(sql_version, sizeof(sql_version),
+
					"PRAGMA user_version = %" PRId64 ";", db_version);
+
		if (sql_exec(sdb, sql_version) != EPKG_OK)
			return (EPKG_FATAL);
+

+
		if (sql_exec(sdb, "COMMIT;") != EPKG_OK)
+
			return (EPKG_OK);
	}

	return (EPKG_OK);