12. crateloadraw

Loads a RAW file from a crate into a named table in the monolith dictionary.

It's not called crateraw because it's too close to cratedraw.

<<sqlar_scheme_entries>>=
{"sqlar:crateloadraw", pp_sqlar_crateloadraw, 3, 3, {STR,STR,STR}},
<<sqlar_function_declarations>>=
int sqlar_loadraw_db(sqlite3 *db,
                     const char *filename,
                     sp_ftbl **ft);
<<sqlar_scheme_functions>>=
static cell pp_sqlar_crateloadraw(cell x)
{
    const char *dbkey;
    const char *ftname;
    const char *idstr;
    monolith_d *m;
    int rc;
    sqlite3 *db;
    const char *filename;
    sqlite3_stmt *stmt;
    monolith_dict_entry *dbent;
    monolith_dict_entry *ftent;
    sp_ftbl *ft;
    monolith_dict *dict;
    int count;
    char *ergo;

    m = monolith_data_get();
    dict = monolith_dict_get(m);

    dbkey = string(car(x));
    x = cdr(x);
    ftname = string(car(x));
    x = cdr(x);
    idstr = string(car(x));

    /* get DB from monolith dictionary */

    rc = monolith_dict_find(dict, &dbent, dbkey, strlen(dbkey));

    if (rc != MONOLITH_OK) {
        error("Could not find SQLite database", UNSPECIFIC);
    }

    db = monolith_dict_entry_data(dbent);

    sqlite3_prepare_v2(db,
                       "SELECT value, COUNT(DISTINCT uuid) "
                       "from wikizet "
                       "WHERE uuid LIKE ?1 || \"%\" "
                       "AND value LIKE \"/%\";",
                       -1, &stmt, NULL);

    ergo = NULL;
    if (idstr[0] == 'g') {
        size_t sz;
        /* 'g' is truncated, so N - 1 */
        sz = strlen(idstr) - 1;
        ergo = malloc(sz + 1);
        ergo[sz] = '\0';
        ergo_to_hex(&idstr[1], sz, ergo);

        sqlite3_bind_text(stmt, 1, ergo, -1, NULL);
    } else {
        sqlite3_bind_text(stmt, 1, idstr, -1, NULL);
    }

    rc = sqlite3_step(stmt);

    if (rc != SQLITE_ROW) {
        fprintf(stderr, "cratewav: %s\n", sqlite3_errmsg(db));
        error("error", UNSPECIFIC);
    }

    count = sqlite3_column_int(stmt, 1);

    if (count < 1) {
        fprintf(stderr, "Could not resolve id %s\n", idstr);
        sqlite3_finalize(stmt);
        error("error", UNSPECIFIC);
        return UNSPECIFIC;
    } else if (count > 1) {
        fprintf(stderr, "id pattern %s not unique.\n", idstr);
        sqlite3_finalize(stmt);
        error("error", UNSPECIFIC);
        return UNSPECIFIC;
    }

    /* create new ftable entry */

    rc = monolith_dict_newentry(dict, &ftent,
                                ftname, strlen(ftname));

    if (rc != MONOLITH_OK) {
        error("Unable to create entry", UNSPECIFIC);
    }

    /* load file into ftable */
    filename = (const char *)sqlite3_column_text(stmt, 0);
    rc = sqlar_loadraw_db(db, &filename[1], &ft);

    /* bind ftable */

    monolith_dict_entry_ftbl(ftent, ft);

    if (rc != SP_OK) {
        error("There were SQLar problems", UNSPECIFIC);
        sqlite3_finalize(stmt);
    }

    if (ergo != NULL) free(ergo);

    return UNSPECIFIC;
}



prev | home | next