Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Return EPKG_WARN if the annotatation add/modify/delete didn't affect one row. In principle this could flag for an annotation affecting several rows, but the SQL can only affect 0 or 1 rows.
Matthew Seaman committed 13 years ago
commit 84cbe13b54f9c8d65e7bd992d7500fbe726981e9
parent 7dd8462
2 files changed +42 -9
modified libpkg/pkgdb.c
@@ -2239,7 +2239,7 @@ static sql_prstmt sql_prepared_statements[PRSTMT_LAST] = {
	},
	[ANNOTATE_ADD1] = {
		NULL,
-
		"INSERT OR ROLLBACK INTO pkg_annotation(package_id, key_id, value_id) "
+
		"INSERT OR IGNORE INTO pkg_annotation(package_id, key_id, value_id) "
		"VALUES ("
		" (SELECT id FROM packages WHERE name = ?1 AND version = ?2),"
		" (SELECT annotation_id FROM annotation WHERE annotation = ?3),"
@@ -2777,6 +2777,8 @@ int
pkgdb_add_annotation(struct pkgdb *db, const char *pkgname,
    const char *pkgversion, const char *key, const char *value)
{
+
	int	rows_changed;
+

	assert(pkgname != NULL && pkgname[0] != '\0');
	assert(pkgversion != NULL && pkgversion[0] != '\0');
	assert(key != NULL);
@@ -2799,16 +2801,23 @@ pkgdb_add_annotation(struct pkgdb *db, const char *pkgname,
		return (EPKG_FATAL);
	}

+
	/* Expect rows_changed == 1 unless there's already an
+
	   annotation using the given key */
+

+
	rows_changed = sqlite3_changes(db->sqlite);
+

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

-
	return (EPKG_OK);
+
	return (rows_changed == 1 ? EPKG_OK : EPKG_WARN);
}

int
pkgdb_modify_annotation(struct pkgdb *db, const char *pkgname,
    const char *pkgversion, const char *key, const char *value)
{
+
	int rows_changed; 
+

	assert(pkgname != NULL && pkgname[0] != '\0');
	assert(pkgversion != NULL && pkgversion[0] != '\0');
	assert(key != NULL);
@@ -2835,16 +2844,23 @@ pkgdb_modify_annotation(struct pkgdb *db, const char *pkgname,
		return (EPKG_FATAL);
	}

+
	/* Something has gone very wrong if rows_changed != 1 here */
+

+
	rows_changed = sqlite3_changes(db->sqlite);
+

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

-
	return (EPKG_OK);
+
	return (rows_changed == 1 ? EPKG_OK : EPKG_WARN);
}

int
pkgdb_delete_annotation(struct pkgdb *db, const char *pkgname,
    const char *pkgversion, const char *key)
{
+
	int	rows_changed;
+
	bool	result;
+

	assert(pkgname != NULL && pkgname[0] != '\0');
	assert(pkgversion != NULL && pkgversion[0] != '\0');
	assert(key != NULL);
@@ -2855,7 +2871,11 @@ pkgdb_delete_annotation(struct pkgdb *db, const char *pkgname,
	if (pkgdb_transaction_begin(db->sqlite, NULL) != EPKG_OK)
		return (EPKG_FATAL);

-
	if (run_prstmt(ANNOTATE_DEL1, pkgname, pkgversion, key) != SQLITE_DONE
+
	result = (run_prstmt(ANNOTATE_DEL1, pkgname, pkgversion, key) == SQLITE_DONE);
+

+
	rows_changed = sqlite3_changes(db->sqlite);
+

+
	if (!result
	    ||
	    run_prstmt(ANNOTATE_DEL2) != SQLITE_DONE) {
		ERROR_SQLITE(db->sqlite);
@@ -2863,10 +2883,11 @@ pkgdb_delete_annotation(struct pkgdb *db, const char *pkgname,
		return (EPKG_FATAL);
	}

+

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

-
	return (EPKG_OK);
+
	return (rows_changed == 1 ? EPKG_OK : EPKG_WARN);
}


modified pkg/annotate.c
@@ -71,8 +71,13 @@ do_add(struct pkgdb *db, const char *pkgname, const char *pkgversion,
			if (!quiet)
				printf("Annotated %s-%s: %s\n", pkgname,
				     pkgversion, key);
+
		} else if (ret == EPKG_WARN) {
+
			if (!quiet)
+
				warnx("%s-%s: Can't add annotation %s -- "
+
				     "already exists", pkgname, pkgversion,
+
				     key );
		} else
-
			warn("%s-%s: Failed to add annotation %s", pkgname,
+
			warnx("%s-%s: Failed to add annotation %s", pkgname,
			     pkgversion, key);
	}
	return (ret);
@@ -94,7 +99,7 @@ do_modify(struct pkgdb *db, const char *pkgname, const char *pkgversion,
				printf("Modified annotation %s-%s: %s\n",
				       pkgname, pkgversion, key);
		} else
-
			warn("%s-%s: Failed to modify annotation %s", pkgname,
+
			warnx("%s-%s: Failed to modify annotation %s", pkgname,
			     pkgversion, key);
	}
	return (ret);
@@ -113,8 +118,12 @@ do_delete(struct pkgdb *db, const char *pkgname, const char *pkgversion,
			if (!quiet)
				printf("Deleted annotation %s-%s: %s\n",
				       pkgname, pkgversion, key);
+
		} else if (ret == EPKG_WARN) {
+
			if (!quiet)
+
				warnx("%s-%s: Can't delete annotation %s -- "
+
				     "nonexistent", pkgname, pkgversion, key);
		} else
-
			warn("%s-%s: Failed to delete annotation %s", pkgname,
+
			warnx("%s-%s: Failed to delete annotation %s", pkgname,
			     pkgversion, key);
	}
	return (ret);
@@ -274,7 +283,10 @@ exec_annotate(int argc, char **argv)
			break;
		}

-
		if (retcode != EPKG_OK) {
+
		if (retcode == EPKG_WARN)
+
			exitcode = EX_DATAERR;
+

+
		if (retcode != EPKG_OK && retcode != EPKG_WARN) {
			exitcode = EX_IOERR;
			goto cleanup;
		}