/* * db.cpp * (C) gsd 2001 */ // #include <sstream> // for standard #include <strstream> // for g++ #include <string> #include <iostream> #include <fstream> #include <cstdlib> #include "db.h" using namespace std; CDataBase::CDataBase( string fname) : ifile(&fb), ofile(&fb) { if ( fb.open( fname.c_str(), ios::in | ios::out) ) { } else { cerr << "Can't open " << fname << endl; exit(1); } } void CDataBase::receive( long sender, string message) { // istringstream is( message); // for standard istrstream is(message.c_str()); // for g++ string command; if ( is >> command ) { if ( "REG" == command ) { string uid, number; if( is >> uid >> number ) if ( store( uid, uid+" "+number) ) send( sender, uid + ", " + number + " registered" ); } else if ( "UNREG" == command ) { string uid; if ( is >> uid ) if ( remove( uid) ) send( sender, uid + " unregistered" ); } else if ( "LOAD" == command ) { string uid; string s; is >> uid; if ( retrieve( uid, s) ) send( sender, s); } else if ( "LREG" == command ) { fb.pubseekoff(0, ios::beg); string s; while ( getline( ifile, s) ) { if ( s.find("DELETED") ) send( sender, s); } send( sender, "==== ENDFILE ===="); ifile.clear(); } else send( sender, "DB: bad command"); } else send( sender, "DB: bad parameters"); } bool CDataBase::find( std::string uid, streampos &rpos) { string s; streampos spos = 0; fb.pubseekoff( 0, ios::beg); while ( getline( ifile, s) ) { // istringstream is(s); // for strandard istrstream is(s.c_str()); string skey; if ( is >> skey && skey == uid ) { rpos = spos; return true; } spos = fb.pubseekoff( 0, ios::cur); } ifile.clear(); // clear eof_bit return false; } bool CDataBase::store( std::string uid, std::string s) { streampos spos; if ( find( uid, spos) ) { return false; } else { fb.pubseekoff( 0, ios::end); ofile << s << endl; return true; } } bool CDataBase::retrieve( std::string uid, std::string &s) { streampos spos; if ( find( uid, spos) ) { fb.pubseekoff( spos, ios::beg); getline( ifile, s); return true; } else return false; } bool CDataBase::remove( std::string uid) { streampos spos; if ( find( uid, spos) ) { fb.pubseekoff( spos, ios::beg); ofile << "DELETED"; return true; } else return false; }