コード例 #1
0
ファイル: cfacdbu.c プロジェクト: fnevgeny/cfac
int main(int argc, char *const *argv)
{
    cfacdb_t *cdb;
    cfacdbu_t cdu;
    cfacdb_stats_t stats;
    unsigned int i, nsessions;
    
    memset(&cdu, 0, sizeof(cdu));
    cdu.nele_min = 0;
    cdu.nele_max = 100;
    
    if (parse_args(&cdu, argc, argv) != CFACDB_SUCCESS) {
        exit(1);
    }
    
    cdb = cfacdb_open(cdu.db_fname, CFACDB_TEMP_DEFAULT);
    if (!cdb) {
        exit(1);
    }

    if (cdu.cache_fname) {
        if (cfacdb_attach_cache(cdb, cdu.cache_fname) != CFACDB_SUCCESS) {
            fprintf(stderr,
                "Failed attaching cache \"%s\" to DB \"%s\"\n",
                cdu.cache_fname, cdu.db_fname);
        }
    }
    
    nsessions = cfacdb_get_nsessions(cdb);
    if (cdu.print_info) {
        printf("%s: %d session%s\n",
            cdu.db_fname, nsessions, nsessions == 1 ? "":"s");
    }

    if (nsessions == 0) {
        cfacdb_close(cdb);
        exit(0);
    }
    
    cdu.sids = malloc(nsessions*sizeof(unsigned long));

    cfacdb_sessions(cdb, sessions_sink, &cdu);
    
    /* choose the latest session by default */
    if (cdu.sid == 0) {
        cdu.sid = cdu.sids[nsessions - 1];
    }

    /* override sid array if user wants a specific session */
    if (cdu.sid >= 0) {
        nsessions = 1;
        cdu.sids[0] = cdu.sid;
    }
    
    for (i = 0; i < nsessions; i++) {
        unsigned long sid = cdu.sids[i];
        
        if (cfacdb_init(cdb, sid, cdu.nele_min, cdu.nele_max)
            != CFACDB_SUCCESS) {
            fprintf(stderr, "Initialization of session ID %lu failed\n", sid);
            exit(1);
        }

        if (cdu.print_info) {
            if (cfacdb_get_stats(cdb, &stats) != CFACDB_SUCCESS) {
                fprintf(stderr,
                    "Failed getting statistics of DB \"%s\"\n", cdu.db_fname);
                cfacdb_close(cdb);
                exit(1);
            }

            printf("Stats of session ID %ld with nele = %d ... %d:\n",
                sid, cdu.nele_min, cdu.nele_max);
            printf("\tLevels: %lu, RT: %lu, AI: %lu, CE: %lu, CI: %lu, RR: %lu\n",
                stats.ndim, stats.rtdim, stats.aidim, stats.cedim, stats.cidim,
                stats.pidim);
        }

        if (cdu.cache_fname && cdu.T > 0.0) {
            cfacdb_crates(cdb, cdu.T, crates_sink, NULL);
        }
    }

    free(cdu.sids);
    
    cfacdb_close(cdb);
    
    exit(0);
}
コード例 #2
0
ファイル: cfacdb.c プロジェクト: mbelkhir/cfac
cfacdb_t *cfacdb_open(const char *fname, cfacdb_temp_t temp_store)
{
    cfacdb_t *cdb = NULL;
    
    const char *sql;
    char *errmsg;
    int rc;
    
    unsigned int i, ns;
    
    const char **schemas[2];

    cdb = malloc(sizeof(cfacdb_t));
    if (!cdb) {
        return NULL;
    }
    memset(cdb, 0, sizeof(cfacdb_t));   

    rc = sqlite3_open_v2(fname, &cdb->db, SQLITE_OPEN_READONLY, NULL);
    if (rc) {
        fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(cdb->db));
        cfacdb_close(cdb);
        return NULL;
    }

    /* Set temporal storage */
    switch (temp_store) {
    case CFACDB_TEMP_FILE:
        sql = "PRAGMA temp_store = FILE";
        break;
    case CFACDB_TEMP_MEMORY:
        sql = "PRAGMA temp_store = MEMORY";
        break;
    default:
        sql = "PRAGMA temp_store = DEFAULT";
        break;
    }
    
    rc = sqlite3_exec(cdb->db, sql, NULL, NULL, &errmsg);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "SQL error: %s\n", errmsg);
        sqlite3_free(errmsg);
        cfacdb_close(cdb);
        return NULL;
    }

    /* verify the version/format is compatible */
    sql = "SELECT value FROM cfacdb WHERE property = 'format'";
    
    rc = sqlite3_exec(cdb->db, sql, format_cb, &cdb->db_format, &errmsg);
    if (rc != SQLITE_OK) {
        /* assume the first version, without the cfacdb table */
        cdb->db_format = 1;
    }
    
    if (cdb->db_format < 1 || cdb->db_format > 3) {
        fprintf(stderr, "Unsupported database format %d\n", cdb->db_format);
        cfacdb_close(cdb);
        return NULL;
    }

    schemas[0] = cfac_schema;
    if (cdb->db_format == 1) {
        schemas[1] = cfac_schema_v1;
    } else {
        schemas[1] = cfac_schema_v2;
    }
    
    /* create temporary views etc */
    for (ns = 0; ns < 2; ns++) {
        const char **schema = schemas[ns];
        i = 0;
        while ((sql = schema[i])) {
            rc = sqlite3_exec(cdb->db, sql, NULL, NULL, &errmsg);
            if (rc != SQLITE_OK) {
                fprintf(stderr, "SQL error: %s\n", errmsg);
                sqlite3_free(errmsg);
                cfacdb_close(cdb);
                return NULL;
            }
            i++;
        }
    }

    sql = "SELECT COUNT(sid) FROM sessions";
    rc = sqlite3_exec(cdb->db, sql, session_cb, cdb, &errmsg);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "SQL error: %s\n", errmsg);
        sqlite3_free(errmsg);
        cfacdb_close(cdb);
        return NULL;
    }
    
    if (!cdb->nsessions) {
        fprintf(stderr, "%s contains no valid data\n", fname);
        cfacdb_close(cdb);
        return NULL;
    }
    
    return cdb;
}