Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Factorize some code in sqlite statement preparation
Baptiste Daroussin committed 5 years ago
commit 3e8b322043c73ffdb72fc1975907bf558b67876e
parent b8d1835
4 files changed +46 -77
modified libpkg/pkgdb.c
@@ -101,9 +101,23 @@ static void prstmt_finalize(struct pkgdb *db);
static int pkgdb_insert_scripts(struct pkg *pkg, int64_t package_id, sqlite3 *s);
static int pkgdb_insert_lua_scripts(struct pkg *pkg, int64_t package_id, sqlite3 *s);

-

extern int sqlite3_shell(int, char**);

+
struct sqlite3_stmt *
+
prepare_sql(sqlite3 *s, const char *sql)
+
{
+
	int ret;
+
	sqlite3_stmt *stmt;
+

+
	ret = sqlite3_prepare_v2(s, sql, strlen(sql), &stmt,
+
	    NULL);
+
	if (ret != SQLITE_OK) {
+
		ERROR_SQLITE(s, sql);
+
		return (NULL);
+
	}
+
	return (stmt);
+
}
+

void
pkgdb_regex(sqlite3_context *ctx, int argc, sqlite3_value **argv)
{
@@ -1650,21 +1664,17 @@ prstmt_initialize(struct pkgdb *db)
{
	sql_prstmt_index	 i;
	sqlite3			*sqlite;
-
	int			 ret;

	assert(db != NULL);

	if (!db->prstmt_initialized) {
		sqlite = db->sqlite;

-
		for (i = 0; i < PRSTMT_LAST; i++)
-
		{
+
		for (i = 0; i < PRSTMT_LAST; i++) {
			pkg_debug(4, "Pkgdb: preparing statement '%s'", SQL(i));
-
			ret = sqlite3_prepare_v2(sqlite, SQL(i), -1, &STMT(i), NULL);
-
			if (ret != SQLITE_OK) {
-
				ERROR_SQLITE(sqlite, SQL(i));
+
			STMT(i) = prepare_sql(sqlite, SQL(i));
+
			if (STMT(i) == NULL)
				return (EPKG_FATAL);
-
			}
		}
		db->prstmt_initialized = true;
	}
@@ -2222,12 +2232,9 @@ pkgdb_reanalyse_shlibs(struct pkgdb *db, struct pkg *pkg)
		for (i = 0; i < 2; i++) {
			/* Clean out old shlibs first */
			pkg_debug(4, "Pkgdb: running '%s'", sql[i]);
-
			if (sqlite3_prepare_v2(db->sqlite, sql[i], -1,
-
					       &stmt_del, NULL)
-
			    != SQLITE_OK) {
-
				ERROR_SQLITE(db->sqlite, sql[i]);
+
			stmt_del = prepare_sql(db->sqlite, sql[i]);
+
			if (stmt_del == NULL)
				return (EPKG_FATAL);
-
			}

			sqlite3_bind_int64(stmt_del, 1, package_id);

@@ -2434,11 +2441,9 @@ pkgdb_unregister_pkg(struct pkgdb *db, int64_t id)
	assert(db != NULL);

	pkg_debug(4, "Pkgdb: running '%s'", sql);
-
	if (sqlite3_prepare_v2(db->sqlite, sql, -1, &stmt_del, NULL)
-
	    != SQLITE_OK){
-
		ERROR_SQLITE(db->sqlite, sql);
+
	stmt_del = prepare_sql(db->sqlite, sql);
+
	if (stmt_del == NULL)
		return (EPKG_FATAL);
-
	}

	sqlite3_bind_int64(stmt_del, 1, id);

@@ -2628,11 +2633,9 @@ pkgdb_vset(struct pkgdb *db, int64_t id, va_list ap)

	while ((attr = va_arg(ap, int)) > 0) {
		pkg_debug(4, "Pkgdb: running '%s'", sql[attr]);
-
		if (sqlite3_prepare_v2(db->sqlite, sql[attr], -1, &stmt, NULL)
-
		    != SQLITE_OK) {
-
			ERROR_SQLITE(db->sqlite, sql[attr]);
+
		stmt = prepare_sql(db->sqlite, sql[attr]);
+
		if (stmt == NULL)
			return (EPKG_FATAL);
-
		}

		switch (attr) {
		case PKG_SET_FLATSIZE:
@@ -2704,14 +2707,11 @@ pkgdb_file_set_cksum(struct pkgdb *db, struct pkg_file *file,
	sqlite3_stmt	*stmt = NULL;
	const char	 sql_file_update[] = ""
		"UPDATE files SET sha256 = ?1 WHERE path = ?2";
-
	int		 ret;

	pkg_debug(4, "Pkgdb: running '%s'", sql_file_update);
-
	ret = sqlite3_prepare_v2(db->sqlite, sql_file_update, -1, &stmt, NULL);
-
	if (ret != SQLITE_OK) {
-
		ERROR_SQLITE(db->sqlite, sql_file_update);
+
	stmt = prepare_sql(db->sqlite, sql_file_update);
+
	if (stmt == NULL)
		return (EPKG_FATAL);
-
	}
	sqlite3_bind_text(stmt, 1, sum, -1, SQLITE_STATIC);
	sqlite3_bind_text(stmt, 2, file->path, -1, SQLITE_STATIC);

@@ -2775,13 +2775,10 @@ pkgdb_write_lock_pid(struct pkgdb *db)
	const char lock_pid_sql[] = ""
			"INSERT INTO pkg_lock_pid VALUES (?1);";
	sqlite3_stmt	*stmt = NULL;
-
	int ret;

-
	ret = sqlite3_prepare_v2(db->sqlite, lock_pid_sql, -1, &stmt, NULL);
-
	if (ret != SQLITE_OK) {
-
		ERROR_SQLITE(db->sqlite, lock_pid_sql);
+
	stmt = prepare_sql(db->sqlite, lock_pid_sql);
+
	if (stmt == NULL)
		return (EPKG_FATAL);
-
	}
	sqlite3_bind_int64(stmt, 1, (int64_t)getpid());

	if (sqlite3_step(stmt) != SQLITE_DONE) {
@@ -2800,13 +2797,10 @@ pkgdb_remove_lock_pid(struct pkgdb *db, int64_t pid)
	const char lock_pid_sql[] = ""
			"DELETE FROM pkg_lock_pid WHERE pid = ?1;";
	sqlite3_stmt	*stmt = NULL;
-
	int ret;

-
	ret = sqlite3_prepare_v2(db->sqlite, lock_pid_sql, -1, &stmt, NULL);
-
	if (ret != SQLITE_OK) {
-
		ERROR_SQLITE(db->sqlite, lock_pid_sql);
+
	stmt = prepare_sql(db->sqlite, lock_pid_sql);
+
	if (stmt == NULL)
		return (EPKG_FATAL);
-
	}
	sqlite3_bind_int64(stmt, 1, pid);

	if (sqlite3_step(stmt) != SQLITE_DONE) {
@@ -2823,16 +2817,13 @@ static int
pkgdb_check_lock_pid(struct pkgdb *db)
{
	sqlite3_stmt	*stmt = NULL;
-
	int ret, found = 0;
+
	int found = 0;
	int64_t pid, lpid;
	const char query[] = "SELECT pid FROM pkg_lock_pid;";

-
	ret = sqlite3_prepare_v2(db->sqlite, query, -1,
-
			&stmt, NULL);
-
	if (ret != SQLITE_OK) {
-
		ERROR_SQLITE(db->sqlite, query);
+
	stmt = prepare_sql(db->sqlite, query);
+
	if (stmt == NULL)
		return (EPKG_FATAL);
-
	}

	lpid = getpid();

@@ -3089,7 +3080,6 @@ pkgdb_stats(struct pkgdb *db, pkg_stats_t type)
	sqlite3_stmt	*stmt = NULL;
	int64_t		 stats = 0;
	const char *sql = NULL;
-
	int		 ret;
	struct _pkg_repo_list_item *rit;

	assert(db != NULL);
@@ -3121,11 +3111,9 @@ pkgdb_stats(struct pkgdb *db, pkg_stats_t type)
	}

	pkg_debug(4, "Pkgdb: running '%s'", sql);
-
	ret = sqlite3_prepare_v2(db->sqlite, sql, -1, &stmt, NULL);
-
	if (ret != SQLITE_OK) {
-
		ERROR_SQLITE(db->sqlite, sql);
+
	stmt = prepare_sql(db->sqlite, sql);
+
	if (stmt == NULL)
		return (-1);
-
	}

	while (sqlite3_step(stmt) != SQLITE_DONE) {
		stats = sqlite3_column_int64(stmt, 0);
@@ -3229,10 +3217,9 @@ pkgdb_is_dir_used(struct pkgdb *db, struct pkg *p, const char *dir, int64_t *res
		"WHERE directory_id = directories.id AND directories.path = ?1 "
		"AND package_id != ?2;";

-
	if (sqlite3_prepare_v2(db->sqlite, sql, -1, &stmt, NULL) != SQLITE_OK) {
-
		ERROR_SQLITE(db->sqlite, sql);
+
	stmt = prepare_sql(db->sqlite, sql);
+
	if (stmt == NULL)
		return (EPKG_FATAL);
-
	}

	sqlite3_bind_text(stmt, 1, dir, -1, SQLITE_TRANSIENT);
	sqlite3_bind_int64(stmt, 2, p->id);
modified libpkg/private/pkgdb.h
@@ -182,5 +182,6 @@ int pkgdb_update_config_file_content(struct pkg *pkg, sqlite3 *s);
void pkgdb_syscall_overload(void);
void pkgdb_nfs_corruption(sqlite3 *s);
bool pkgdb_file_exists(struct pkgdb *db, const char *path);
+
struct sqlite3_stmt *prepare_sql(sqlite3 *s, const char *sql);

#endif
modified libpkg/repo/binary/query.c
@@ -95,21 +95,6 @@ pkg_repo_binary_it_reset(struct pkg_repo_it *it)
	pkgdb_it_reset(it->data);
}

-
static struct sqlite3_stmt *
-
prepare_sql(sqlite3 *s, const char *sql)
-
{
-
	int ret;
-
	sqlite3_stmt *stmt;
-

-
	ret = sqlite3_prepare_v2(s, sql, strlen(sql), &stmt,
-
	    NULL);
-
	if (ret != SQLITE_OK) {
-
		ERROR_SQLITE(s, sql);
-
		return (NULL);
-
	}
-
	return (stmt);
-
}
-

struct pkg_repo_it *
pkg_repo_binary_query(struct pkg_repo *repo, const char *pattern, match_t match)
{
modified libpkg/repo/binary/update.c
@@ -295,10 +295,9 @@ pkg_repo_binary_register_conflicts(const char *origin, char **conflicts,
	int64_t origin_id, conflict_id;

	pkg_debug(4, "pkgdb_repo_register_conflicts: running '%s'", select_id_sql);
-
	if (sqlite3_prepare_v2(sqlite, select_id_sql, -1, &stmt, NULL) != SQLITE_OK) {
-
		ERROR_SQLITE(sqlite, select_id_sql);
+
	stmt = prepare_sql(sqlite, select_id_sql);
+
	if (stmt == NULL)
		return (EPKG_FATAL);
-
	}

	sqlite3_bind_text(stmt, 1, origin, -1, SQLITE_TRANSIENT);
	ret = sqlite3_step(stmt);
@@ -313,10 +312,9 @@ pkg_repo_binary_register_conflicts(const char *origin, char **conflicts,
	sqlite3_finalize(stmt);

	pkg_debug(4, "pkgdb_repo_register_conflicts: running '%s'", clean_conflicts_sql);
-
	if (sqlite3_prepare_v2(sqlite, clean_conflicts_sql, -1, &stmt, NULL) != SQLITE_OK) {
-
		ERROR_SQLITE(sqlite, clean_conflicts_sql);
+
	stmt = prepare_sql(sqlite, clean_conflicts_sql);
+
	if (stmt == NULL)
		return (EPKG_FATAL);
-
	}

	sqlite3_bind_int64(stmt, 1, origin_id);
	/* Ignore cleanup result */
@@ -327,10 +325,9 @@ pkg_repo_binary_register_conflicts(const char *origin, char **conflicts,
	for (i = 0; i < conflicts_num; i ++) {
		/* Select a conflict */
		pkg_debug(4, "pkgdb_repo_register_conflicts: running '%s'", select_id_sql);
-
		if (sqlite3_prepare_v2(sqlite, select_id_sql, -1, &stmt, NULL) != SQLITE_OK) {
-
			ERROR_SQLITE(sqlite, select_id_sql);
+
		stmt = prepare_sql(sqlite, select_id_sql);
+
		if (stmt == NULL)
			return (EPKG_FATAL);
-
		}

		sqlite3_bind_text(stmt, 1, conflicts[i], -1, SQLITE_TRANSIENT);
		ret = sqlite3_step(stmt);
@@ -347,10 +344,9 @@ pkg_repo_binary_register_conflicts(const char *origin, char **conflicts,

		/* Insert a pair */
		pkg_debug(4, "pkgdb_repo_register_conflicts: running '%s'", insert_conflict_sql);
-
		if (sqlite3_prepare_v2(sqlite, insert_conflict_sql, -1, &stmt, NULL) != SQLITE_OK) {
-
			ERROR_SQLITE(sqlite, insert_conflict_sql);
+
		stmt = prepare_sql(sqlite, insert_conflict_sql);
+
		if (stmt == NULL)
			return (EPKG_FATAL);
-
		}

		sqlite3_bind_int64(stmt, 1, origin_id);
		sqlite3_bind_int64(stmt, 2, conflict_id);