void sqlLoadCode( const Database &db , const SqlApiBindProgramId &programid , int nr , VirtualCode &vc ) { DataFile datafile ( db, SYSTEM_CODEDATA_FNAME, DBFMODE_READONLY); KeyFile indexfile ( db, SYSTEM_CODEKEY_FNAME , DBFMODE_READONLY); KeyFileDefinition keydef(indexfile); KeyType key; keydef.put(key,0,String(programid.m_fileName)); keydef.put(key,1,nr); bool found = indexfile.searchMin( RELOP_EQ, key, 2); #ifdef DEBUGMODULE _tprintf(_T("loading code for <%s>,%d\n"),programid.filename,nr); #endif if(!found) throwSqlError(SQL_UNKNOWN_PROGRAMID,_T("Unknown programfile:<%s>"),programid.m_fileName); datafile.readRecord( keydef.getRecordAddr(key), &vc, sizeof(VirtualCode)); if(_tcscmp(vc.getProgramId().m_timestamp,programid.m_timestamp) != 0) throwSqlError(SQL_TIMESTAMP_MISMATCH,_T("Timestamp mismatch on <%s>"),programid.m_fileName); }
void Database::sysTabDbInsert(SysTableDbData &dbdef) { if(!DbFile::exist(SYSTEM_DBDATA_FNAME)) { createDbDb(); } LogFile logFile(SYSTEM_DBLOG_FNAME); DataFile dataFile( SYSTEM_DBDATA_FNAME, DBFMODE_READWRITE, &logFile); KeyFile indexFile(SYSTEM_DBKEY_FNAME, DBFMODE_READWRITE, &logFile); logFile.begin(); _tcsupr(dbdef.m_dbName); try { DbAddr addr = dataFile.insert(&dbdef, sizeof(SysTableDbData)); KeyFileDefinition keydef(indexFile); KeyType key; keydef.put(key, 0, String(dbdef.m_dbName)); keydef.putRecordAddr(key, addr); indexFile.insert(key); } catch(sqlca) { logFile.abort(); throw; } logFile.commit(); }
const IndexDefinition &Database::getIndexDefinition(const String &indexName) const { if(indexName.length() > MAXINDEXNAME) { throwSqlError(SQL_INVALID_INDEXNAME,_T("Indexname <%s> is too long"), indexName.cstr() ); } const String tmpName = toUpperCase(indexName); IndexDefinition **indexDefpp = m_indexDefIndexNameCache.get(tmpName); if(indexDefpp == NULL) { DataFile dataFile( *this,SYSTEM_INDEXDATA_FNAME, DBFMODE_READONLY); KeyFile indexFile(*this,SYSTEM_INDEXKEY2_FNAME, DBFMODE_READONLY); KeyFileDefinition keydef(indexFile); KeyType key; keydef.put(key,0,tmpName); if(!indexFile.searchMin(RELOP_EQ, key, 1)) { throwSqlError(SQL_INVALID_INDEXNAME, _T("Index <%s> doesn't exist"),indexName.cstr()); } SysTableIndexData indexData; dataFile.readRecord(keydef.getRecordAddr(key),&indexData, sizeof(indexData)); getIndexDefinitions(indexData.m_tableName); indexDefpp = m_indexDefIndexNameCache.get(tmpName); } if(indexDefpp == NULL) { throwSqlError(SQL_INVALID_INDEXNAME, _T("Index <%s> doesn't exist"),indexName.cstr()); } return **indexDefpp; }
static bool codelookup( Database &db, const String &filename, int nr) { KeyFile indexfile(db, SYSTEM_CODEKEY_FNAME ,DBFMODE_READONLY); KeyFileDefinition keydef(indexfile); KeyType key; keydef.put(key,0,filename); keydef.put(key,1,nr); return indexfile.searchMin(RELOP_EQ, key, 2); }
bool Database::searchDbName(const String &dbName, SysTableDbData &dbdef) { if(dbName.length() > SQLAPI_MAXDBNAME) { throwSqlError(SQL_DBNAME_TOO_LONG,_T("Database name <%s> too long"),dbName.cstr()); } if(!DbFile::exist(SYSTEM_DBDATA_FNAME)) { return false; } DataFile dataFile( SYSTEM_DBDATA_FNAME, DBFMODE_READONLY, NULL); KeyFile indexFile( SYSTEM_DBKEY_FNAME, DBFMODE_READONLY, NULL); KeyType key; KeyFileDefinition keydef(indexFile); keydef.put(key, 0, toUpperCase(dbName)); if(!indexFile.searchMin(RELOP_EQ, key, 1)) { return false; } dataFile.readRecord(keydef.getRecordAddr(key), &dbdef, sizeof(SysTableDbData)); return true; }
void Database::sysTabDbDelete(const String &dbName) { LogFile logFile(SYSTEM_DBLOG_FNAME); KeyType key; DataFile dataFile( SYSTEM_DBDATA_FNAME, DBFMODE_READWRITE, &logFile); KeyFile indexFile(SYSTEM_DBKEY_FNAME, DBFMODE_READWRITE, &logFile); KeyFileDefinition keydef(indexFile); keydef.put(key, 0, toUpperCase(dbName)); if(!indexFile.searchMin(RELOP_EQ, key, 1)) { throwSqlError(SQL_DB_NOT_EXIST,_T("Database <%s> doesn't exist"),dbName.cstr()); } logFile.begin(); try { dataFile.remove(keydef.getRecordAddr(key)); indexFile.remove(key); } catch(sqlca) { logFile.abort(); throw; } logFile.commit(); }
void Database::readIndexDefinitions(const String &tableName, IndexArray &indexArray) const { const String tmpName = toUpperCase(tableName); indexArray.clear(); const TableDefinition &tableDef = getTableDefinition(tmpName); /* just to check the tmpName */ DataFile dataFile( *this, SYSTEM_INDEXDATA_FNAME, DBFMODE_READONLY); KeyFile indexFile(*this, SYSTEM_INDEXKEY1_FNAME, DBFMODE_READONLY); KeyFileDefinition keydef(indexFile); KeyType key; keydef.put(key,0,tmpName); KeyCursor cursor(indexFile, RELOP_EQ, &key, 1, RELOP_EQ, &key, 1, SORT_ASCENDING); while(cursor.hasNext()) { cursor.next(key); SysTableIndexData index; dataFile.readRecord(keydef.getRecordAddr(key),&index, sizeof(SysTableIndexData)); indexArray.add(index); } }
// AVS // completelly rewrited to support new conceptions int TMapLoader::Load(const char * filename, const char * szActiveEmul) { char buf[256]; int bufLen; ifstream inpfile(filename); KeyTrans.DeleteAllDefs(); Charmap.init(); // it is an array for store [...] ... [end ...] parts from file stringArray SA(0,0,sizeof(string)); int AllOk = 0; while ( inpfile ) { getline(inpfile, buf, 255); bufLen = strlen(buf); if ( !bufLen ) continue; if ( buf[0] == '[' && buf[bufLen-1] == ']' ) { // is a part splitter [...] string temps(buf); if (!normalizeSplitter(temps)) { printm(0, FALSE, MSG_KEYUNEXPLINE, temps.c_str()); AllOk = 0; break; }; // if a comment if ( stricmp(temps.c_str(),"[comment]") == 0 ) { #ifdef KEYDEBUG printit(temps.c_str()); #endif if ( !getLongComment(inpfile, buf, sizeof(buf)) ) { printm(0, FALSE, MSG_KEYUNEXPEOF); break; }; #ifdef KEYDEBUG printit("\r \r"); #endif continue; }; string back = temps; // prepare line for make it as [end ...] // and check it if ( strnicmp(back.c_str(), "[global]", 8) == 0 ) {} // do nothing else if ( strnicmp(back.c_str(), "[keymap", 7) == 0 ) { // DJGPP also uses erase rather than remove (Paul Brannan 6/23/98) #ifndef __BORLANDC__ back.erase(7); #else back.remove(7); #endif back += "]"; } else if ( strnicmp(back.c_str(), "[charmap", 8) == 0 ) { // Paul Brannan 6/23/98 #ifndef __BORLANDC__ back.erase(8); #else back.remove(8); #endif back += "]"; } else if ( strnicmp(back.c_str(), "[config", 7) == 0 ) { // Paul Brannan 6/23/98 #ifndef __BORLANDC__ back.erase(7); #else back.remove(7); #endif back += "]"; } else { // cerr << "Unexpected token " << back << endl; printm(0, FALSE, MSG_KEYUNEXPTOK, back.c_str()); break; }; back.insert(1,"END "); // now it looks like [END ...] #ifdef KEYDEBUG printit(temps.c_str()); #endif int ok = 0; // fetch it to temps while ( 1 ) { getline(inpfile, buf, sizeof(buf)); bufLen = strlen(buf); if ( !bufLen ) break; if ( buf[0] == '[' && buf[bufLen-1] == ']' ) { string t(buf); if ( !normalizeSplitter(t) ) break; if ( stricmp(t.c_str(),back.c_str()) == 0 ) { ok = 1; break; }; // AVS 31.12.97 fix [comment] block inside another block if ( stricmp(t.c_str(),"[comment]") == 0 && getLongComment(inpfile, buf, sizeof(buf)) ) continue; break; }; temps += "\n"; temps += buf; }; if ( !ok ) { // cerr << "Unexpected end of file or token" << endl; printm(0, FALSE, MSG_KEYUNEXP); AllOk = 0; break; }; #ifdef KEYDEBUG printit("\r \r"); #endif AllOk = SA.Add(temps);; if ( !AllOk ) break; } else { // cerr << "Unexpected line '" << buf << "'\n"; printm(0, FALSE, MSG_KEYUNEXPLINE, buf); AllOk = 0; break; }; }; inpfile.close(); if ( !AllOk ) return 0; // now all file are in SA, comments are stripped int i = LookForPart(SA, "global", ""); if ( i == INT_MAX ) { // cerr << "No [GLOBAL] definition!" << endl; printm(0, FALSE, MSG_KEYNOGLOBAL); return 0; }; if ( !LoadGlobal(SA[i]) ) { return 0; }; // look for need configuration i = LookForPart(SA, "config", szActiveEmul); if ( i == INT_MAX ) { // cerr << "No [CONFIG " << szActiveEmul << "]\n"; printm(0, FALSE, MSG_KEYNOCONFIG, szActiveEmul); return 0; }; // cerr << "use configuration: " << szActiveEmul << endl; printm(0, FALSE, MSG_KEYUSECONFIG, szActiveEmul); BOOL hadKeys = FALSE; string config = SA[i]; // parse it while ( config.length() ) { buf[0] = 0; getline(config,buf,sizeof(buf)); bufLen = strlen(buf); if ( !bufLen || (buf[0] == '[' && buf[bufLen-1] == ']') ) continue; if ( strnicmp(buf,"keymap",6) == 0 ) { string orig(buf); printit("\t"); printit(buf); printit("\n"); char * mapdef = strtok(buf,":"); char * switchKey = strtok(NULL,"\n"); if ( !KeyTrans.mapArray.IsEmpty() && switchKey == NULL ) { // cerr << "no switch Key for '" << mapdef // << "'" << endl; printm(0, FALSE, MSG_KEYNOSWKEY, mapdef); break; }; if ( KeyTrans.mapArray.IsEmpty() ) { if ( switchKey != NULL ) { // create default keymap // cerr << "You cannot define switch key for default keymap -> ignored" // << endl; printm(0, FALSE, MSG_KEYCANNOTDEF); }; TKeyDef empty; KeyTrans.mapArray.Add(KeyMap(string(mapdef))); KeyTrans.switchMap(empty); // set it as current keymap KeyTrans.mainKeyMap = KeyTrans.currentKeyMap; } else { string keydef(switchKey); keydef += " !*!*!*"; // just for check WORD vk_code; DWORD control; switchKey = ParseKeyDef(keydef.c_str(),vk_code,control); if ( switchKey != NULL ) { TKeyDef swi(NULL,control,vk_code); if ( KeyTrans.switchMap(swi) > 0 ) { // cerr << "Duplicate switching key\n"; printm(0, FALSE, MSG_KEYDUPSWKEY); break; }; KeyTrans.mapArray.Add(KeyMap(swi, orig)); KeyTrans.switchMap(swi); // set it as current keymap } }; mapdef+=7; // 'keymap ' // now load defined keymaps to current while ((mapdef != NULL)&& (mapdef = strtok(mapdef,TOKEN_DELIMITERS)) != NULL ) { i = LookForPart(SA,"keymap",mapdef); if ( i == INT_MAX ) { // cerr << "Unknown KEYMAP " << mapdef << endl; printm(0, FALSE, MSG_KEYUNKNOWNMAP, mapdef); } else { mapdef = strtok(NULL,"\n"); // strtok is used in LoadKeyMap // so - save pointer! hadKeys = LoadKeyMap(SA[i]); // load it }; }; } else if ( strnicmp(buf,"charmap",7) == 0 ) { printit("\t"); printit(buf); printit("\n"); char * mapdef = buf + 8;// 'charmap ' int SuccesLoaded = 0; // now load defined charmaps to current while ((mapdef != NULL)&& (mapdef = strtok(mapdef,TOKEN_DELIMITERS)) != NULL ) { i = LookForPart(SA,"charmap",mapdef); if ( i == INT_MAX ) { // cerr << "Unknown KEYMAP " << mapdef << endl; printm(0, FALSE, MSG_KEYUNKNOWNMAP, mapdef); } else { mapdef = strtok(NULL,"\n"); // strtok is used in LoadKeyMap // so - save pointer! if (LoadCharMap(SA[i])) // load it SuccesLoaded++; }; }; if (!SuccesLoaded) { // cerr << "No charmaps loaded\n"; printm(0, FALSE, MSG_KEYNOCHARMAPS); Charmap.init(); }; /* strtok(buf," "); char* name = strtok(NULL," "); if ( name == NULL ) { cerr << "No name for CHARMAP" << endl; } else { i = LookForPart(SA,"charmap", name); if ( i == INT_MAX ) { cerr << "Unknown CHARMAP " << name << endl; } else { LoadCharMap(SA[i]); }; }; */ } else { // cerr << "unexpected token in " << szActiveEmul << endl; printm(0, FALSE, MSG_KEYUNEXPTOKIN, szActiveEmul); } } if ( hadKeys) { TKeyDef empty; KeyTrans.switchMap(empty); // switch to default KeyTrans.mainKeyMap = KeyTrans.currentKeyMap; // save it's number // cerr << "There are " << (KeyTrans.mapArray.GetItemsInContainer()) << " maps\n"; char s[12]; // good enough for a long int (32-bit) itoa(KeyTrans.mapArray.GetItemsInContainer(), s, 10); printm(0, FALSE, MSG_KEYNUMMAPS, s); return 1; }; return 0; }