Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Use binary search in populate_pkg.
Vsevolod Stakhov committed 13 years ago
commit c7af51b6000f6f014a480129e0919950b6dc915c
parent a2b971f
1 file changed +50 -38
modified libpkg/pkgdb.c
@@ -79,36 +79,39 @@ static void prstmt_finalize(struct pkgdb *db);

extern int sqlite3_shell(int, char**);

+
/*
+
 * Keep entries sorted by name!
+
 */
static struct column_mapping {
	const char * const name;
	pkg_attr type;
} columns[] = {
-
	{ "origin",	PKG_ORIGIN },
-
	{ "name",	PKG_NAME },
-
	{ "version",	PKG_VERSION },
-
	{ "comment",	PKG_COMMENT },
-
	{ "desc",	PKG_DESC },
-
	{ "message",	PKG_MESSAGE },
	{ "arch",	PKG_ARCH },
-
	{ "maintainer",	PKG_MAINTAINER },
-
	{ "www",	PKG_WWW },
-
	{ "prefix",	PKG_PREFIX },
+
	{ "automatic",	PKG_AUTOMATIC },
	{ "cksum",	PKG_CKSUM },
-
	{ "repopath",	PKG_REPOPATH },
+
	{ "comment",	PKG_COMMENT },
	{ "dbname",	PKG_REPONAME },
-
	{ "newversion",	PKG_NEWVERSION },
+
	{ "desc",	PKG_DESC },
	{ "flatsize",	PKG_FLATSIZE },
-
	{ "newflatsize", PKG_NEW_FLATSIZE },
-
	{ "pkgsize",	PKG_NEW_PKGSIZE },
+
	{ "id",		PKG_ROWID },
+
	{ "infos",	PKG_INFOS },
	{ "licenselogic", PKG_LICENSE_LOGIC },
-
	{ "automatic",	PKG_AUTOMATIC },
	{ "locked",	PKG_LOCKED },
-
	{ "time",	PKG_TIME },
-
	{ "infos",	PKG_INFOS },
-
	{ "rowid",	PKG_ROWID },
-
	{ "id",		PKG_ROWID },
+
	{ "maintainer",	PKG_MAINTAINER },
	{ "manifestdigest",	PKG_DIGEST },
+
	{ "message",	PKG_MESSAGE },
+
	{ "name",	PKG_NAME },
+
	{ "newflatsize", PKG_NEW_FLATSIZE },
+
	{ "newversion",	PKG_NEWVERSION },
+
	{ "origin",	PKG_ORIGIN },
+
	{ "pkgsize",	PKG_NEW_PKGSIZE },
+
	{ "prefix",	PKG_PREFIX },
+
	{ "repopath",	PKG_REPOPATH },
+
	{ "rowid",	PKG_ROWID },
+
	{ "time",	PKG_TIME },
+
	{ "version",	PKG_VERSION },
	{ "weight",	-1 },
+
	{ "www",	PKG_WWW },
	{ NULL,		-1 }
};

@@ -186,41 +189,50 @@ pkgdb_get_reponame(struct pkgdb *db, const char *repo)
	return (reponame);
}

+
static int
+
compare_column_func(const void *pkey, const void *pcolumn)
+
{
+
	const char *key = (const char*)pkey;
+
	const struct column_mapping *column =
+
			(const struct column_mapping*)pcolumn;
+

+
	return strcmp(key, column->name);
+
}
+

static void
populate_pkg(sqlite3_stmt *stmt, struct pkg *pkg) {
-
	int		 i, icol = 0;
+
	int		 icol = 0;
	const char	*colname;

	assert(stmt != NULL);

	for (icol = 0; icol < sqlite3_column_count(stmt); icol++) {
		colname = sqlite3_column_name(stmt, icol);
+
		struct column_mapping *column;
		switch (sqlite3_column_type(stmt, icol)) {
		case SQLITE_TEXT:
-
			for (i = 0; columns[i].name != NULL; i++) {
-
				if (!strcmp(columns[i].name, colname)) {
-
					pkg_set(pkg, columns[i].type,
-
					    sqlite3_column_text(stmt,
-
					    icol));
-
					break;
-
				}
-
			}
-
			if (columns[i].name == NULL)
+
			column = bsearch(colname, columns,
+
					sizeof(columns) / sizeof(columns[0]) - 1,
+
					sizeof(columns[0]), compare_column_func);
+
			if (column == NULL)
				pkg_emit_error("Unknown column %s",
				    colname);
+
			else
+
				pkg_set(pkg, column->type,
+
						sqlite3_column_text(stmt,
+
						icol));
			break;
		case SQLITE_INTEGER:
-
			for (i = 0; columns[i].name != NULL; i++) {
-
				if (!strcmp(columns[i].name, colname)) {
-
					pkg_set(pkg, columns[i].type,
-
					    sqlite3_column_int64(stmt,
-
					    icol));
-
					break;
-
				}
-
			}
-
			if (columns[i].name == NULL)
+
			column = bsearch(colname, columns,
+
					sizeof(columns) / sizeof(columns[0]) - 1,
+
					sizeof(columns[0]), compare_column_func);
+
			if (column == NULL)
				pkg_emit_error("Unknown column %s",
-
				    colname);
+
						colname);
+
			else
+
				pkg_set(pkg, column->type,
+
						sqlite3_column_int64(stmt,
+
						icol));
			break;
		case SQLITE_BLOB:
		case SQLITE_FLOAT: