dict @ 6ed576974dec969ad2745a451a6f680a3cdbcfc4

  1#include <string.h>
  2#include <stdlib.h>
  3#include <stdio.h>
  4
  5#include "data.h"
  6#include "../lib/util.h"
  7
  8const char *insert_into = "INSERT INTO words (LINE) VALUES($VVV);";
  9const char *select_words = "SELECT Id, Line FROM words WHERE line MATCH $VVV LIMIT $NNN;";
 10const char *create_table =  "CREATE VIRTUAL TABLE IF NOT EXISTS words USING fts4 (ID INTEGER PRIMARY KEY AUTOINCREMENT, LINE TEXT NOT NULL);";
 11
 12Data* new_data(const char* con)
 13{
 14    Data* data = (Data*)malloc(sizeof(Data));
 15
 16    int v = sqlite3_open(con, &(data->db));
 17    if (v != SQLITE_OK) {
 18        print_result_code(v);
 19        return NULL;
 20    }
 21
 22    sqlite3_enable_load_extension(data->db, 1);
 23    v = sqlite3_load_extension(data->db, "ext/libsqlite3ext", "sqlite3_spellfix_init",0);
 24    if (v != SQLITE_OK) {
 25        print_result_code(v);
 26        return NULL;
 27    }
 28
 29    return data;
 30}
 31
 32void free_data(Data* data)
 33{
 34    sqlite3_close(data->db);
 35    free(data);
 36}
 37
 38void insert(Data* data, char* line, int len)
 39{
 40    sqlite3_stmt *stmt;
 41    int r = sqlite3_prepare_v2(data->db, insert_into, -1, &stmt, NULL);
 42
 43    if (r != SQLITE_OK) {
 44        printf("Error executing insert: ");
 45        print_result_code(r);
 46        printf("\n");
 47        return;
 48    }
 49
 50    sqlite3_bind_text(stmt, 1, line, len, NULL);
 51
 52    int c = sqlite3_step(stmt);
 53    if (c != SQLITE_DONE) {
 54        printf("Error executing insert: ");
 55        print_result_code(r);
 56        printf("\n");
 57    }
 58
 59    sqlite3_finalize(stmt);
 60}
 61
 62void bootstrap(Data* data)
 63{
 64    sqlite3_stmt *stmt;
 65    int r = sqlite3_prepare_v2(data->db, create_table, -1, &stmt, NULL);
 66
 67    if (r != SQLITE_OK) {
 68        printf("Error preparing bootstrap: ");
 69        print_result_code(r);
 70        printf("\n");
 71        return;
 72    }
 73
 74    int c = sqlite3_step(stmt);
 75    if (c != SQLITE_DONE) {
 76        printf("Error executing bootstrap: ");
 77        print_result_code(r);
 78        printf("\n");
 79    }
 80
 81    sqlite3_finalize(stmt);
 82}
 83
 84LIST* data_select(Data* data, char *sch, int len, int limit)
 85{
 86    sqlite3_stmt *stmt;
 87    int r = sqlite3_prepare_v2(data->db, select_words, -1, &stmt, NULL);
 88
 89    if (r != SQLITE_OK) {
 90        printf("Error executing select: ");
 91        print_result_code(r);
 92        printf("\n");
 93        return NULL;
 94    }
 95
 96    LIST *list = NULL;
 97
 98    sqlite3_bind_text(stmt, 1, sch, len, NULL);
 99    sqlite3_bind_int(stmt, 2, limit);
100
101    int m =  sqlite3_step(stmt);
102    while(m == SQLITE_ROW) {
103        Word *word = (Word*)malloc(sizeof(Word));
104
105        int id = sqlite3_column_int(stmt, 0);
106        const unsigned char *line = sqlite3_column_text(stmt, 1);
107        unsigned char *line2 = malloc(sizeof(char*)+strlen((char*)line));
108        memcpy(line2, line, strlen((char*)line));
109
110        word->Id = id;
111        word->Line = line2;
112        list = list_add(list, word);
113
114        m = sqlite3_step(stmt);
115    }
116
117    sqlite3_finalize(stmt);
118
119    return list;
120}
121
122void print_result_code(int code)
123{
124    printf(sqlite3_errstr(code));
125}