|
15 | 15 | #include "sqlite3.h" |
16 | 16 | #endif |
17 | 17 |
|
| 18 | +#include <stdlib.h> |
18 | 19 | #include <string.h> |
19 | 20 | #include <stdio.h> |
20 | 21 | #include <float.h> |
@@ -266,10 +267,12 @@ static void vMemorySearchUpdateAccess(sqlite3 *db, vMemorySearchCursor *c) { |
266 | 267 | if (rc != SQLITE_OK) return; |
267 | 268 |
|
268 | 269 | sqlite3_int64 now = (sqlite3_int64)time(NULL); |
| 270 | + char hash_hex[17]; |
269 | 271 |
|
270 | 272 | for (int i = 0; i < c->count; i++) { |
| 273 | + snprintf(hash_hex, sizeof(hash_hex), "%016llx", (unsigned long long)(uint64_t)c->hash[i]); |
271 | 274 | sqlite3_bind_int64(vm, 1, now); |
272 | | - sqlite3_bind_int64(vm, 2, c->hash[i]); |
| 275 | + sqlite3_bind_text(vm, 2, hash_hex, -1, SQLITE_STATIC); |
273 | 276 | sqlite3_step(vm); |
274 | 277 | sqlite3_reset(vm); |
275 | 278 | } |
@@ -346,8 +349,9 @@ static int dbmem_fts_search (sqlite3 *db, vMemorySearchCursor *c, const char *in |
346 | 349 | if (rank < rank_min) rank_min = rank; |
347 | 350 | if (rank > rank_max) rank_max = rank; |
348 | 351 |
|
| 352 | + const char *hash_text = (const char *)sqlite3_column_text(vm, 1); |
349 | 353 | c->fts.rank[count] = rank; |
350 | | - c->fts.hash[count] = sqlite3_column_int64(vm, 1); |
| 354 | + c->fts.hash[count] = (sqlite3_int64)(uint64_t)strtoull(hash_text ? hash_text : "0", NULL, 16); |
351 | 355 | c->fts.seq[count] = sqlite3_column_int64(vm, 2); |
352 | 356 | c->fts.count++; |
353 | 357 |
|
@@ -408,8 +412,9 @@ static int dbmem_semantic_search (sqlite3 *db, vMemorySearchCursor *c, float *em |
408 | 412 | else if (rc != SQLITE_ROW) break; |
409 | 413 |
|
410 | 414 | // SQLITE_ROW |
| 415 | + const char *hash_text = (const char *)sqlite3_column_text(vm, 1); |
411 | 416 | c->semantic.rank[count] = sqlite3_column_double(vm, 0); |
412 | | - c->semantic.hash[count] = sqlite3_column_int64(vm, 1); |
| 417 | + c->semantic.hash[count] = (sqlite3_int64)(uint64_t)strtoull(hash_text ? hash_text : "0", NULL, 16); |
413 | 418 | c->semantic.seq[count] = sqlite3_column_int64(vm, 2); |
414 | 419 | c->semantic.count++; |
415 | 420 |
|
@@ -528,25 +533,28 @@ static int vMemorySearchCursorColumn (sqlite3_vtab_cursor *cur, sqlite3_context |
528 | 533 | vMemorySearchCursor *c = (vMemorySearchCursor *)cur; |
529 | 534 | sqlite3 *db = ((vMemorySearchTable *)cur->pVtab)->db; |
530 | 535 |
|
| 536 | + char hash_hex[17]; |
| 537 | + snprintf(hash_hex, sizeof(hash_hex), "%016llx", (unsigned long long)(uint64_t)c->hash[c->index]); |
| 538 | + |
531 | 539 | switch (iCol) { |
532 | 540 | case SEARCH_COLUMN_HASH: |
533 | | - sqlite3_result_int64(context, c->hash[c->index]); |
| 541 | + sqlite3_result_text(context, hash_hex, 16, SQLITE_TRANSIENT); |
534 | 542 | break; |
535 | | - |
| 543 | + |
536 | 544 | case SEARCH_COLUMN_SEQ: |
537 | 545 | sqlite3_result_int64(context, c->seq[c->index]); |
538 | 546 | break; |
539 | | - |
| 547 | + |
540 | 548 | case SEARCH_COLUMN_RANKING: |
541 | 549 | sqlite3_result_double(context, c->rank[c->index]); |
542 | 550 | break; |
543 | | - |
| 551 | + |
544 | 552 | case SEARCH_COLUMN_PATH: |
545 | 553 | case SEARCH_COLUMN_SNIPPET:{ |
546 | 554 | const char *sql = (iCol == SEARCH_COLUMN_PATH) ? path_sql : snippet_sql; |
547 | 555 | sqlite3_stmt *vm = NULL; |
548 | 556 | if (sqlite3_prepare_v2(db, sql, -1, &vm, NULL) == SQLITE_OK) { |
549 | | - sqlite3_bind_int64(vm, 1, c->hash[c->index]); |
| 557 | + sqlite3_bind_text(vm, 1, hash_hex, -1, SQLITE_STATIC); |
550 | 558 | if (iCol == SEARCH_COLUMN_SNIPPET) sqlite3_bind_int64(vm, 2, c->seq[c->index]); |
551 | 559 | if (sqlite3_step(vm) == SQLITE_ROW) sqlite3_result_value(context, sqlite3_column_value(vm, 0)); |
552 | 560 | } |
|
0 commit comments