Radish alpha
H
HardenedBSD Package Manager
Radicle
Git (anonymous pull)
Log in to clone via SSH
Simple pkg search implementation
Baptiste Daroussin committed 14 years ago
commit ba750eb30cbccbd7975e4c14b023176082efbd76
parent c3e9fae6589cca95f3d1cea6fd3a2f810597da15
6 files changed +178 -2
modified libpkg/pkg.h
@@ -49,6 +49,7 @@ typedef enum {
	MATCH_EREGEX
} match_t;

+

/**
 * The type of package.
 */
@@ -432,6 +433,8 @@ int pkgdb_unregister_pkg(struct pkgdb *pkg, const char *origin);
 */
struct pkgdb_it * pkgdb_query(struct pkgdb *db, const char *pattern,
							  match_t type);
+
struct pkgdb_it * pkgdb_rquery(struct pkgdb *db, const char *pattern,
+
		match_t type, unsigned int field);

/**
 * Query the remote database.
@@ -462,6 +465,11 @@ struct pkgdb_it * pkgdb_query_which(struct pkgdb *db, const char *path);
#define PKG_LOAD_MTREE (1<<7)
#define PKG_LOAD_DIRS (1<<8)

+
#define REPO_SEARCH_NAME 0
+
#define REPO_SEARCH_COMMENT (1<<0)
+
#define REPO_SEARCH_DESCRIPTION (1<<1)
+

+

/**
 * Get the next pkg.
 * @param pkg An allocated struct pkg or a pointer to a NULL pointer. In the
modified libpkg/pkgdb.c
@@ -116,7 +116,6 @@ pkgdb_pkggt(sqlite3_context *ctx, int argc, sqlite3_value **argv)
 * - 6: INSTALL
 * - 7: DEINSTALL
 * - 8: UPGRADE
-
 * 
 */

static int
@@ -1362,7 +1361,6 @@ pkgdb_query_upgrades(struct pkgdb *db)
struct pkgdb_it *
pkgdb_query_downgrades(struct pkgdb *db)
{
-

	sqlite3_stmt *stmt;

	if (db->type != PKGDB_REMOTE) {
@@ -1407,3 +1405,71 @@ pkgdb_query_autoremove(struct pkgdb *db)

	return (pkgdb_it_new(db, stmt, PKG_INSTALLED));
}
+

+
struct pkgdb_it *
+
pkgdb_rquery(struct pkgdb *db, const char *pattern, match_t match, unsigned int field)
+
{
+
	sqlite3_stmt *stmt = NULL;
+
	struct sbuf *sql = sbuf_new_auto();
+

+
	if (db->type != PKGDB_REMOTE) {
+
		pkg_emit_event(PKG_EVENT_INVALID_DB_STATE, /*argc*/1,
+
		    "remote database not attached");
+
		return (NULL);
+
	}
+

+
	if (pattern == NULL) {
+
		ERROR_BAD_ARG("pattern");
+
		return (NULL);
+
	}
+

+
	sbuf_cat(sql, "SELECT p.rowid, p.origin, p.name, p.version, p.comment, "
+
			"p.desc, p.arch, p.osversion, p.maintainer, p.www, p.pkgsize, "
+
			"p.flatsize, p.cksum, p.path FROM remote.packages AS p WHERE ");
+

+
	switch (match) {
+
		case MATCH_ALL:
+
		case MATCH_EXACT:
+
			sbuf_cat(sql, "p.name LIKE ?1 ");
+
			if (field & REPO_SEARCH_COMMENT)
+
				sbuf_cat(sql, "OR p.comment LIKE ?1 ");
+
			else if (field & REPO_SEARCH_DESCRIPTION)
+
				sbuf_cat(sql, "OR p.desc LIKE ?1 ");
+
			break;
+
		case MATCH_GLOB:
+
			sbuf_cat(sql, "p.name GLOB ?1 ");
+
			if (field & REPO_SEARCH_COMMENT)
+
				sbuf_cat(sql, "OR p.comment GLOB ?1 ");
+
			else if (field & REPO_SEARCH_DESCRIPTION)
+
				sbuf_cat(sql, "OR p.desc GLOB ?1 ");
+
			break;
+
		case MATCH_REGEX:
+
			sbuf_cat(sql, "p.name REGEXP ?1 ");
+
			if (field & REPO_SEARCH_COMMENT)
+
				sbuf_cat(sql, "OR p.comment REGEXP ?1 ");
+
			else if (field & REPO_SEARCH_DESCRIPTION)
+
				sbuf_cat(sql, "OR p.desc REGEXP ?1 ");
+
			break;
+
		case MATCH_EREGEX:
+
			sbuf_cat(sql, "EREGEXP(?1, p.name) ");
+
			if (field & REPO_SEARCH_COMMENT)
+
				sbuf_cat(sql, "OR EREGEXP(?1, p.comment) ");
+
			else if (field & REPO_SEARCH_DESCRIPTION)
+
				sbuf_cat(sql, "OR EREGEXP(?1, p.desc) ");
+
			break;
+
	}
+

+
	sbuf_cat(sql, ";");
+
	sbuf_finish(sql);
+

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

+
	sbuf_delete(sql);
+

+
	sqlite3_bind_text(stmt, 1, pattern, -1, SQLITE_TRANSIENT);
+

+
	return (pkgdb_it_new(db, stmt, PKG_REMOTE));
+
}
modified pkg/Makefile
@@ -10,6 +10,7 @@ SRCS= add.c \
		repo.c \
		update.c \
		upgrade.c \
+
		search.c \
		utils.c \
		version.c \
		which.c
modified pkg/main.c
@@ -15,6 +15,7 @@
#include "add.h"
#include "autoremove.h"
#include "version.h"
+
#include "search.h"
#include "update.h"
#include "upgrade.h"
#include "register.h"
@@ -35,6 +36,7 @@ static struct commands {
	{ "delete", exec_delete, usage_delete},
	{ "help", exec_help, usage_help},
	{ "info", exec_info, usage_info},
+
	{ "search", exec_search, usage_search},
	{ "register", exec_register, usage_register},
	{ "repo", exec_repo, usage_repo},
	{ "update", exec_update, usage_update},
added pkg/search.c
@@ -0,0 +1,93 @@
+
#include <stdio.h>
+
#include <stdbool.h>
+
#include <unistd.h>
+
#include <libutil.h>
+
#include <sysexits.h>
+

+
#include <pkg.h>
+

+
#include "search.h"
+

+
void
+
usage_search(void)
+
{
+
	fprintf(stderr, "usage, pkg search [-gxXcd] pattern\n");
+
	fprintf(stderr, "For more information see 'pkg help search'.\n");
+
}
+

+
int
+
exec_search(int argc, char **argv)
+
{
+
	char *pattern;
+
	match_t match = MATCH_EXACT;
+
	int  retcode = 0;
+
	unsigned int field = REPO_SEARCH_NAME;
+
	char size[7];
+
	int ch;
+
	struct pkgdb *db = NULL;
+
	struct pkgdb_it *it = NULL;
+
	struct pkg *pkg = NULL;
+

+
	while ((ch = getopt(argc, argv, "gxXcd")) != -1) {
+
		switch (ch) {
+
			case 'g':
+
				match = MATCH_GLOB;
+
				break;
+
			case 'x':
+
				match = MATCH_REGEX;
+
				break;
+
			case 'X':
+
				match = MATCH_EREGEX;
+
				break;
+
			case 'c':
+
				field |= REPO_SEARCH_COMMENT;
+
				break;
+
			case 'd':
+
				field |= REPO_SEARCH_DESCRIPTION;
+
				break;
+
			default:
+
				usage_search();
+
				return (EX_USAGE);
+
		}
+
	}
+

+
	argc -= optind;
+
	argv += optind;
+

+
	if (argc != 1) {
+
		usage_search();
+
		return (EX_USAGE);
+
	}
+

+
	pattern = argv[0];
+

+
	if (pkgdb_open(&db, PKGDB_REMOTE) != EPKG_OK) {
+
		pkg_error_warn("can not open database");
+
		retcode = EPKG_FATAL;
+
		goto cleanup;
+
	}
+

+
	if ((it = pkgdb_rquery(db, pattern, match, field)) == NULL) {
+
		pkg_error_warn("can not query database");
+
		retcode = EPKG_FATAL;
+
		goto cleanup;
+
	}
+

+
	while (( retcode = pkgdb_it_next(it, &pkg, PKG_LOAD_BASIC)) == EPKG_OK) {
+
		printf("Name: %s\n", pkg_get(pkg, PKG_NAME));
+
		printf("Version: %s\n", pkg_get(pkg, PKG_VERSION));
+
		printf("Origin: %s\n", pkg_get(pkg, PKG_ORIGIN));
+
		printf("Comment: %s\n", pkg_get(pkg, PKG_COMMENT));
+
		printf("\n");
+
	}
+

+
	cleanup:
+
	if (it != NULL)
+
		pkgdb_it_free(it);
+

+
	if (db != NULL)
+
		pkgdb_close(db);
+

+
	return (retcode);
+

+
}
added pkg/search.h
@@ -0,0 +1,6 @@
+
#ifndef _SEARCH_H
+
#define _SEARCH_H
+

+
int exec_search(int, char **);
+
void usage_search(void);
+
#endif