]> pd.if.org Git - zpackage/commitdiff
fix incorrect sqlite vercmp function
authorNathan Wagner <nw@hydaspes.if.org>
Sun, 16 Dec 2018 16:21:40 +0000 (16:21 +0000)
committerNathan Wagner <nw@hydaspes.if.org>
Sun, 16 Dec 2018 16:21:40 +0000 (16:21 +0000)
sqlite/extensions.c

index a0a2edf3a611abcf0a042a25079cc04cd38889e2..d41505e9d19559151331ec5d66a6a0874a479679 100644 (file)
@@ -1,3 +1,4 @@
+#include <string.h>
 /* Add your header comment here */
 /* Do not use <sqlite3.h>! */
 #include <sqlite3ext.h>
@@ -15,11 +16,41 @@ SQLITE_EXTENSION_INIT1
 
 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, 
@@ -28,6 +59,10 @@ 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(),