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); }
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; }