+#include <string.h>
/* Add your header comment here */
/* Do not use <sqlite3.h>! */
-#include <sqlite3ext.h>
+#include "sqlite3ext.h"
SQLITE_EXTENSION_INIT1
#include "zpm.h"
static int vercmp(void *not_used, int lena, const void *a,
int lenb, const void *b) {
- /* not sure what the ints are, possibly string lengths */
+ int rv;
+ char *bufa, *bufb;
+
if (not_used != 0) fprintf(stderr, "sqlite vercmp not_used = %p\n",
not_used);
if (lena == 0 && lenb > 0) return 1;
- return zpm_vercmp(a, b);
+ if (lenb == 0 && lena > 0) return -1;
+
+ bufa = sqlite3_malloc(lena+1);
+ bufb = sqlite3_malloc(lenb+1);
+
+ strncpy(bufa, a, lena);
+ strncpy(bufb, b, lenb);
+ bufa[lena] = 0;
+ bufb[lenb] = 0;
+
+ rv = zpm_vercmp(bufa, bufb);
+ sqlite3_free(bufa);
+ sqlite3_free(bufb);
+ return rv;
+}
+
+static void vercmpf(sqlite3_context *ctx, int nargs, sqlite3_value **vals) {
+ int rv;
+ if (nargs == 0) {
+ rv = 0;
+ } else if (nargs == 1) {
+ rv = -1;
+ } else {
+ rv = zpm_vercmp(
+ (const char *)sqlite3_value_text(vals[0]),
+ (const char *)sqlite3_value_text(vals[1])
+ );
+ }
+ sqlite3_result_int(ctx, rv);
}
static int zpm_sqlite_vercmp_init(sqlite3 *db, char **pzErrMsg,
int rc = SQLITE_OK;
SQLITE_EXTENSION_INIT2(pApi);
rc = sqlite3_create_collation(db, "vercmp", SQLITE_UTF8, NULL, vercmp);
+ rc = sqlite3_create_function_v2(db, "vercmp", 2,
+ SQLITE_UTF8|SQLITE_DETERMINISTIC,
+ NULL, vercmpf, NULL, NULL, NULL
+ );
/* Insert here calls to
** sqlite3_create_function_v2(),
** sqlite3_create_collation_v2(),
** sqlite3_vfs_register()
** to register the new features that your extension adds.
*/
+#if 0
if (rc == SQLITE_OK) {
fprintf(stderr, "vercmp collation created\n");
}
+#endif
return rc;
}