Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Add PKGGT and PKGLT keyword to sqlite to that we can query directly with version comparison
Baptiste Daroussin committed 15 years ago
commit 15fc803a57fe0b63fb52b51728d41ea71388da26
parent 6fabac8
2 files changed +36 -0
modified libpkg/pkg.h
@@ -148,6 +148,10 @@ typedef enum {
	EPKG_NOT_NAME
} pkg_error_t;

+
#define PKG_LT -1
+
#define PKG_EQ 0
+
#define PKG_GT 1
+

/**
 * Allocate a new pkg.
 * Allocated pkg must be deallocated by pkg_free().
modified libpkg/pkgdb.c
@@ -23,6 +23,8 @@
static struct pkgdb_it * pkgdb_it_new(struct pkgdb *, sqlite3_stmt *);
static void pkgdb_regex(sqlite3_context *, int, sqlite3_value **, int);
static void pkgdb_regex_basic(sqlite3_context *, int, sqlite3_value **);
+
static void pkgdb_pkglt(sqlite3_context *, int, sqlite3_value **);
+
static void pkgdb_pkggt(sqlite3_context *, int, sqlite3_value **);
static void pkgdb_regex_extended(sqlite3_context *, int, sqlite3_value **);
static void pkgdb_regex_delete(void *);
static int get_pragma(sqlite3 *, const char *, int64_t *);
@@ -73,6 +75,32 @@ pkgdb_regex_basic(sqlite3_context *ctx, int argc, sqlite3_value **argv)
}

static void
+
pkgdb_pkgcmp(sqlite3_context *ctx, int argc, sqlite3_value **argv, int sign)
+
{
+
	const unsigned char *version1 = NULL;
+
	const unsigned char *version2 = NULL;
+
	if (argc != 2 || (version1 = sqlite3_value_text(argv[0])) == NULL
+
			|| (version2 = sqlite3_value_text(argv[1])) == NULL) {
+
		sqlite3_result_error(ctx, "Invalid comparison\n", -1);
+
		return;
+
	}
+

+
	sqlite3_result_int(ctx, (pkg_version_cmp(version1, version2) == sign));
+
}
+

+
static void
+
pkgdb_pkglt(sqlite3_context *ctx, int argc, sqlite3_value **argv)
+
{
+
	pkgdb_pkgcmp(ctx, argc, argv, PKG_LT);
+
}
+

+
static void
+
pkgdb_pkggt(sqlite3_context *ctx, int argc, sqlite3_value **argv)
+
{
+
	pkgdb_pkgcmp(ctx, argc, argv, PKG_GT);
+
}
+

+
static void
pkgdb_regex_extended(sqlite3_context *ctx, int argc, sqlite3_value **argv)
{
	pkgdb_regex(ctx, argc, argv, REG_EXTENDED);
@@ -226,6 +254,10 @@ pkgdb_open(struct pkgdb **db)
							pkgdb_regex_basic, NULL, NULL);
	sqlite3_create_function((*db)->sqlite, "eregexp", 2, SQLITE_ANY, NULL,
							pkgdb_regex_extended, NULL, NULL);
+
	sqlite3_create_function((*db)->sqlite, "pkglt", 2, SQLITE_ANY, NULL,
+
			pkgdb_pkglt, NULL, NULL);
+
	sqlite3_create_function((*db)->sqlite, "pkggt", 2, SQLITE_ANY, NULL,
+
			pkgdb_pkggt, NULL, NULL);

	/* 
	 * allow forign key option which will allow to have clean support for