diff --git a/libIRDB/include/core/file.hpp b/libIRDB/include/core/file.hpp index aefafef8b8b056cc6a394daeb805295cef142d6c..26e297721b52f4e31609e5b5c53a5ed91e57766e 100644 --- a/libIRDB/include/core/file.hpp +++ b/libIRDB/include/core/file.hpp @@ -60,6 +60,7 @@ class File_t : public BaseObj_t friend class AggregateType_t; friend class FuncType_t; friend class ICFS_t; + friend class DataScoop_t; // friend class IBTargets; private: diff --git a/libIRDB/include/core/fileir.hpp b/libIRDB/include/core/fileir.hpp index 017173d03c1ecf36e16a877f01f1957dfa33c233..73e7fc69943cff05d4edea18610a1cfaae9a6f10 100644 --- a/libIRDB/include/core/fileir.hpp +++ b/libIRDB/include/core/fileir.hpp @@ -105,6 +105,11 @@ class FileIR_t : public BaseObj_t std::map<db_id_t,AddressID_t*> &addrMap, std::map<db_id_t,Type_t*> &typeMap ); + void ReadScoopsFromDB + ( + std::map<db_id_t,AddressID_t*> &addrMap, + std::map<db_id_t,Type_t*> &typeMap + ); std::map<db_id_t,Instruction_t*> ReadInsnsFromDB ( std::map<db_id_t,Function_t*> &funcMap, diff --git a/libIRDB/include/core/scoop.hpp b/libIRDB/include/core/scoop.hpp index 98d74c2d268cd5ba1484e40d366df67c9cfe0621..343bfc08d7d5c0d0df2de94d0241ff093687849d 100644 --- a/libIRDB/include/core/scoop.hpp +++ b/libIRDB/include/core/scoop.hpp @@ -63,6 +63,8 @@ class DataScoop_t : public BaseObj_t void ClearWriteable() { permissions &= ~permissions_w; } void ClearExecuteable() { permissions &= ~permissions_x; } + std::string WriteToDB(File_t *fid, db_id_t newid); + private: const int permissions_r=4; const int permissions_w=2; diff --git a/libIRDB/src/core/SConscript b/libIRDB/src/core/SConscript index 0090dbe1b28707cbc700df8b3f5e06e6c1ec6681..4152768f8539630af0b8b5db2d3c9dcabc78f5f6 100644 --- a/libIRDB/src/core/SConscript +++ b/libIRDB/src/core/SConscript @@ -18,6 +18,7 @@ files= ''' instruction.cpp pqxxdb.cpp type.cpp + scoop.cpp variantid.cpp ''' cpppath=''' diff --git a/libIRDB/src/core/fileir.cpp b/libIRDB/src/core/fileir.cpp index af2bbcc89773d8d61e970c1d28ea743109d9c287..0df0ff72e69ccfbcc4eb035293f4758dbe933b29 100644 --- a/libIRDB/src/core/fileir.cpp +++ b/libIRDB/src/core/fileir.cpp @@ -117,6 +117,7 @@ void FileIR_t::ReadFromDB() std::map<db_id_t,Type_t*> typesMap = ReadTypesFromDB(types); std::map<db_id_t,AddressID_t*> addrMap=ReadAddrsFromDB(); std::map<db_id_t,Function_t*> funcMap=ReadFuncsFromDB(addrMap, typesMap); + ReadScoopsFromDB(addrMap, typesMap); std::map<db_id_t,Instruction_t*> addressToInstructionMap; std::map<Instruction_t*, db_id_t> unresolvedICFS; @@ -615,6 +616,13 @@ void FileIR_t::WriteToDB() string q = icfs->WriteToDB(fileptr); dbintr->IssueQuery(q); } + for(DataScoopSet_t::const_iterator it=scoops.begin(); it!=scoops.end(); ++it) + { + DataScoop_t* scoop = *it; + assert(scoop); + string q = scoop->WriteToDB(fileptr,j); + dbintr->IssueQuery(q); + } } @@ -632,6 +640,10 @@ void FileIR_t::SetBaseIDS() j=MAX(j,(*i)->GetBaseID()); for(std::set<Relocation_t*>::const_iterator i=relocs.begin(); i!=relocs.end(); ++i) j=MAX(j,(*i)->GetBaseID()); + for(std::set<Type_t*>::const_iterator i=types.begin(); i!=types.end(); ++i) + j=MAX(j,(*i)->GetBaseID()); + for(DataScoopSet_t::const_iterator i=scoops.begin(); i!=scoops.end(); ++i) + j=MAX(j,(*i)->GetBaseID()); /* increment past the max ID so we don't duplicate */ j++; @@ -652,6 +664,9 @@ void FileIR_t::SetBaseIDS() for(std::set<Type_t*>::const_iterator i=types.begin(); i!=types.end(); ++i) if((*i)->GetBaseID()==NOT_IN_DATABASE) (*i)->SetBaseID(j++); + for(DataScoopSet_t::const_iterator i=scoops.begin(); i!=scoops.end(); ++i) + if((*i)->GetBaseID()==NOT_IN_DATABASE) + (*i)->SetBaseID(j++); } std::string Relocation_t::WriteToDB(File_t* fid, Instruction_t* myinsn) @@ -1111,3 +1126,46 @@ void FileIR_t::CleanupICFS() GarbageCollectICFS(); DedupICFS(); } + +void FileIR_t::ReadScoopsFromDB + ( + std::map<db_id_t,AddressID_t*> &addrMap, + std::map<db_id_t,Type_t*> &typeMap + ) +{ +/* + scoop_id SERIAL PRIMARY KEY, -- key + name text DEFAULT '', -- string representation of the type + type_id integer, -- the type of the data, as an index into the table table. + start_address_id integer, -- address id for start. + end_address_id integer, -- address id for end + permissions integer -- in umask format (bitmask for rwx) + + */ + + std::string q= "select * from " + fileptr->scoop_table_name + " ; "; + + dbintr->IssueQuery(q); + + while(!dbintr->IsDone()) + { + + db_id_t sid=atoi(dbintr->GetResultColumn("scoop_id").c_str()); + std::string name=dbintr->GetResultColumn("name"); + db_id_t type_id=atoi(dbintr->GetResultColumn("type_id").c_str()); + Type_t *type=typeMap[type_id]; + db_id_t start_id=atoi(dbintr->GetResultColumn("start_address_id").c_str()); + AddressID_t* start_addr=addrMap[start_id]; + db_id_t end_id=atoi(dbintr->GetResultColumn("end_address_id").c_str()); + AddressID_t* end_addr=addrMap[end_id]; + int permissions=atoi(dbintr->GetResultColumn("permissions").c_str()); + + DataScoop_t* newscoop=new DataScoop_t(sid,name,start_addr,end_addr,type,permissions); + assert(newscoop); + GetDataScoops().insert(newscoop); + dbintr->MoveToNextRow(); + } + + return; +} +