#include /* Add your header comment here */ /* Do not use ! */ #include "sqlite3ext.h" SQLITE_EXTENSION_INIT1 #include "zpm.h" /* Insert your extension code here */ /* TODO: Change the entry point name so that "extension" is replaced by ** text derived from the shared library filename as follows: Copy every ** ASCII alphabetic character from the filename after the last "/" through ** the next following ".", converting each character to lowercase, and ** discarding the first three characters if they are "lib". */ static int vercmp(void *not_used, int lena, const void *a, int lenb, const void *b) { 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; 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, const sqlite3_api_routines *pApi ) { 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_create_module_v2(), and/or ** 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; } void zpm_setup_extensions(void) { sqlite3_auto_extension( (void (*)(void))zpm_sqlite_vercmp_init); return; }