static void add_fulltext(DB_txn *const txn, uint64_t const metaFileID, strarg_t const str, size_t const len) { if(0 == len) return; assert(str); int rc; sqlite3_tokenizer_module const *fts = NULL; sqlite3_tokenizer *tokenizer = NULL; fts_get(&fts, &tokenizer); sqlite3_tokenizer_cursor *tcur = NULL; rc = fts->xOpen(tokenizer, str, len, &tcur); assert(SQLITE_OK == rc); DB_cursor *cursor = NULL; rc = db_cursor_open(txn, &cursor); assert(rc >= 0); for(;;) { strarg_t token; int tlen; int tpos; // TODO int ignored1, ignored2; rc = fts->xNext(tcur, &token, &tlen, &ignored1, &ignored2, &tpos); if(SQLITE_OK != rc) break; assert('\0' == token[tlen]); // Assumption DB_val token_val[1]; SLNTermMetaFileIDAndPositionKeyPack(token_val, txn, token, metaFileID, 0); // TODO: Record tpos. Requires changes to SLNFulltextFilter so that each document only gets returned once, no matter how many times the token appears within it. DB_val null = { 0, NULL }; rc = db_cursor_put(cursor, token_val, &null, DB_NOOVERWRITE_FAST); assert(rc >= 0 || DB_KEYEXIST == rc); } db_cursor_close(cursor); cursor = NULL; fts->xClose(tcur); tcur = NULL; }
int db_put(DB_txn *const txn, DB_val *const key, DB_val *const data, unsigned const flags) { DB_cursor *cursor; int rc = db_txn_cursor(txn, &cursor); if(rc < 0) return rc; return db_cursor_put(cursor, key, data, flags); }