void verify_db(dbfile_t *proot){ if(proot->head.magic != MAGIC){ close_dbfile(proot->vfp); close_db(proot); exit(1); } }
sqlquery::en_filereadstatus sqlquery::open_dbfile(tStr dbfn) { if (dbfn.empty()) return sqlfileOPENERROR; smartFILE fp; // Does the file exist? if (check_fileExists(dbfn.c_str()) == false) { return sqlfileOPENERROR; } // Try to open the file for reading fp = fopen(dbfn.c_str(), "r"); if (fp == NULL) { return sqlfileOPENERROR; } fp.close_file(); int rc = sqlite3_open_v2(dbfn.c_str(), &m_db, SQLITE_OPEN_READONLY, NULL); if ((rc != SQLITE_OK)||(m_db == NULL)) { close_dbfile(); return sqlfileOPENERROR; } tempstmt stmt; sqlite3_exec(m_db, /*"PRAGMA synchronous = OFF;" "PRAGMA journal_mode = OFF;" "PRAGMA locking_mode = EXCLUSIVE;" "PRAGMA automatic_index = FALSE;"*/ "PRAGMA cache_size = 20000;", NULL, 0, NULL); tStr majorver = read_configtbl("DB_MAJOR_VER", stmt.get()); tStr minorver = read_configtbl("DB_MINOR_VER", stmt.get()); if ((majorver.empty())||(minorver.empty())) { return sqlfileNOTCORRECTDB; } if (majorver.compare(tStr("0")) != 0) return sqlfileINCORRECTVER; if (minorver.compare(tStr("1")) != 0) return sqlfileINCORRECTVER; m_basepath = read_configtbl("DB_BASE_PATH", stmt.get()); if (m_basepath.empty()) { return sqlfileNOTCORRECTDB; } rc = sqlite3_prepare_v2(m_db, SQL_AUTOCOMPLETE, strlen(SQL_AUTOCOMPLETE), &(m_autocompstmt.m_stmt), NULL); if (rc != SQLITE_OK) { return sqlfileNOTCORRECTDB; } return sqlfileOK; }
int main(int argc, char *argv[]){ char buffer[64]; char *c; #if DEBUG printf("[DEBUG MODE]\n"); printf("Compile: %s %s\n", __DATE__, __TIME__); #endif printf("Version: %d.%d.%d\n", VER_REL, VER_MAJOR, VER_MINOR); printf("Database> "); dbfile_t *mdb = open_dbfile(get_input(buffer, 32, TRUE)); commit_db(mdb); for(;;){ printf("valca> "); c = get_input(buffer, 64, TRUE); if(!strcmp("quit", c)||!strcmp("exit", c)||!strcmp("\\q", c)){ break; } if(!strcmp("help", c)){ printf("COMMANDS:\n"); printf("COMMIT Commit file to disk\n"); printf("COUNT Show row count\n"); printf("TRUNCATE Delete all keys\n"); printf("UPDATE Update key value\n"); printf("INSERT Insert key\n"); printf("DELETE \\\n"); printf(" COLUMN Delete column\n"); printf(" ROW Delete row\n"); printf("ALTER \\\n"); printf(" NAME Change column name\n"); printf(" LEFT Shift column left\n"); printf(" RIGHT Shift column right\n"); printf("SELECT Select value from\n"); printf("ADD \\\n"); printf(" COLUMN Add column\n"); printf("SHOW \\\n"); printf(" COLUMNS Show all columns\n"); printf(" TREE Show storage tree\n"); printf(" STATUS Show database info\n"); printf(" TABLE Show dataset as table\n"); printf("FREE \\\n"); printf(" COLUMNS Columns freelist\n"); printf(" NODE Node freelist\n"); printf(" DATAFIELDS Payload freelist\n"); printf("EXIT Quit the shell\n"); } if(!strcmp("commit", c)){ commit_db(mdb); } if(!strcmp("count", c)){ printf("Total rows: %d\n", mdb->k_cnt); } if(!strcmp("truncate", c)){ truncate_root(mdb); } if(!strcmp("update", c)){ char tmp[32]; printf(">psid: "); c = get_input(tmp, 32, FALSE); int key = atoi(tmp); char tmpcolname[32]; printf(">column: "); c = get_input(tmpcolname, 32, FALSE); int idx = get_column_idx(mdb, tmpcolname); printf(">value: "); c = get_input(tmp, 32, FALSE); change(mdb, key, (void*)tmp, idx); } if(!strcmp("insert", c)){ if(!mdb->c_cnt){ printf("Cannot insert without column\n"); }else{ char tmp[32]; printf(">psid[%d]: ", mdb->seq_cnt); c = get_input(tmp, 32, FALSE); int key; if(!strlen(tmp)){ key = mdb->seq_cnt++; }else{ key = atoi(tmp); } column_t col; read_column(mdb, mdb->data.c_root, &col); printf(">%s<%s(%d)>: ", col.name, get_datatype_name(col.d_type), col.maxsize); c = get_input(tmp, 32, FALSE); if(get_datatype(col.d_type).size == -1) tmp[col.maxsize] = '\0'; if(col.usign) printf("<> %d\n", atoi(tmp)); //if(atoi()) if(insert_key(mdb, key, (void*)tmp) == SUCCESS){ result_t rs = search_key(mdb, key); if(rs.rstat == SUCCESS){ char tmp[32]; int i = 1; while(col.c_next != EMPTY){ read_column(mdb, col.c_next, &col); printf(">%s<%s(%d)>: ", col.name, get_datatype_name(col.d_type), col.maxsize); c = get_input(tmp, 32, FALSE); add_field(mdb, rs.fpos, rs.idx, (void*)tmp, i); i++; } } } } } if(!strcmp("delete", c)){ printf(">"); c = get_input(buffer, 64, TRUE); if(!strcmp("column", c)){ char tmpcolname[32]; printf(">column: "); c = get_input(tmpcolname, 32, FALSE); int idx = get_column_idx(mdb, tmpcolname); delete_column(mdb, idx); } if(!strcmp("row", c)){ char tmp[32]; printf(">psid: "); c = get_input(tmp, 32, FALSE); int key = atoi(tmp); result_t rs = search_key(mdb, key); if(rs.rstat == SUCCESS){ int i; for(i=mdb->c_cnt; i>1; i--){ delete_field(mdb, rs.fpos, rs.idx, (i-1)); } delete_key(mdb, key); } } } if(!strcmp("alter", c)){ printf(">"); c = get_input(buffer, 64, TRUE); if(!strcmp("name", c)){ printf(">column: "); char tmpcolname[32]; c = get_input(tmpcolname, 32, FALSE); int idx = get_column_idx(mdb, tmpcolname); printf(">new name: "); c = get_input(tmpcolname, 32, FALSE); rename_column(mdb, tmpcolname, idx); } if(!strcmp("left", c)){ char tmpcolname[32]; printf(">column: "); c = get_input(tmpcolname, 32, FALSE); int idx = get_column_idx(mdb, tmpcolname); shift_column_left(mdb, idx); } if(!strcmp("right", c)){ char tmpcolname[32]; printf(">column: "); c = get_input(tmpcolname, 32, FALSE); int idx = get_column_idx(mdb, tmpcolname); shift_column_right(mdb, idx); } } if(!strcmp("select", c)){ printf(">"); char tmp[16]; printf(">psid: "); c = get_input(tmp, 32, FALSE); int key = atoi(tmp); result_t rs = search_key(mdb, key); if(rs.rstat == SUCCESS){ found(mdb, rs.fpos, rs.idx); } } if(!strcmp("add", c)){ printf(">"); c = get_input(buffer, 64, TRUE); if(!strcmp("column", c)){ char colname[32]; DTYPE type; int size; bool usign = FALSE; int idx; printf(">name: "); c = get_input(colname, 32, FALSE); printf(">type: "); char tmptype[32]; c = get_input(tmptype, 32, FALSE); type = get_datatype_idx(tmptype); if(type == EMPTY){ printf("Unkown datatype\n"); continue; } size = get_datatype(type).size; if(size == EMPTY){ printf(">size: "); char tmpsize[16]; c = get_input(tmpsize, 16, FALSE); size = atoi(tmpsize); } if(get_datatype(type).signness){ printf(">unsigned: "); char tmpsign[4]; c = get_input(tmpsign, 4, FALSE); if(!strcmp("y", tmpsign)){ usign = TRUE; } } printf(">before: "); char tmpcolname[32]; c = get_input(tmpcolname, 32, FALSE); idx = get_column_idx(mdb, tmpcolname); add_column(mdb, colname, size, type, usign, idx); } } if(!strcmp("show", c)){ printf(">"); c = get_input(buffer, 64, TRUE); if(!strcmp("columns", c)){ printf("Idx Offset Psid Columnname Size Type Unsigned Next\n"); printf("--------------------------------------------------------------------------\n"); print_column(mdb, mdb->data.c_root, 0); } if(!strcmp("tree", c)){ print_tree(mdb, mdb->data.n_root, 0); } if(!strcmp("status", c)){ print_status(mdb); } if(!strcmp("table", c)){ print_table(mdb); } } if(!strcmp("free", c)){ printf(">"); c = get_input(buffer, 64, TRUE); if(!strcmp("columns", c)){ printf("Idx Offset Psid Columnname Size Type Unsigned Next\n"); printf("--------------------------------------------------------------------------\n"); print_column(mdb, mdb->data.c_free, 0); } if(!strcmp("node", c)){ print_tree(mdb, mdb->data.n_free, 0); } if(!strcmp("datafields", c)){ print_datafield(mdb, mdb->data.d_free); } } } commit_db(mdb); close_dbfile(mdb->vfp); close_db(mdb); return 0; }
sqlquery::~sqlquery() { close_dbfile(); }