From c8e6117273a1c0c48609eb5d9608d3dbc070e71c Mon Sep 17 00:00:00 2001 From: an7s <an7s@git.zephyr-software.com> Date: Tue, 16 Apr 2013 15:25:20 +0000 Subject: [PATCH] Optimized inserts for addresses and instructions Former-commit-id: 684d4aeef75b411d2b300d7ecee2fc8f98c559a3 --- libIRDB/include/core/address.hpp | 2 +- libIRDB/include/core/instruction.hpp | 3 +-- libIRDB/src/core/address.cpp | 16 +++++++++----- libIRDB/src/core/fileir.cpp | 32 ++++++++++++++++++++++------ libIRDB/src/core/instruction.cpp | 27 +++++++++++------------ 5 files changed, 50 insertions(+), 30 deletions(-) diff --git a/libIRDB/include/core/address.hpp b/libIRDB/include/core/address.hpp index d8db81ed1..3848f1f21 100644 --- a/libIRDB/include/core/address.hpp +++ b/libIRDB/include/core/address.hpp @@ -27,7 +27,7 @@ class AddressID_t : public BaseObj_t void SetVirtualOffset(virtual_offset_t voff) { virtual_offset=voff; } void WriteToDB() { assert(0); } - std::string WriteToDB(File_t *vid, db_id_t newid); + std::string WriteToDB(File_t *vid, db_id_t newid, bool p_withHeader); inline bool operator<(const AddressID_t& cmp) const { return fileID < cmp.fileID || (fileID == cmp.fileID && virtual_offset < cmp.virtual_offset);} diff --git a/libIRDB/include/core/instruction.hpp b/libIRDB/include/core/instruction.hpp index 2bad0257e..3ec134ba2 100644 --- a/libIRDB/include/core/instruction.hpp +++ b/libIRDB/include/core/instruction.hpp @@ -24,7 +24,6 @@ class Instruction_t : public BaseObj_t std::string GetCallback() const { return callback; } std::string GetComment() const { return comment; } - void SetAddress(AddressID_t* newaddr) { my_address=newaddr; } void SetFunction(Function_t* func ) { my_function=func;} void SetOriginalAddressID(db_id_t origid) { orig_address_id=origid; /* you shouldn't do this, unless you know what you're doing! */} @@ -38,7 +37,7 @@ class Instruction_t : public BaseObj_t void SetIndirectBranchTargetAddress(AddressID_t* myIndTarg) { indTarg=myIndTarg; } void WriteToDB() { assert(0); } - std::string WriteToDB(File_t *fid, db_id_t newid); + std::string WriteToDB(File_t *fid, db_id_t newid, bool p_withHeader); int Disassemble(DISASM &d); std::string getDisassembly(); bool Assemble(std::string assembly); diff --git a/libIRDB/src/core/address.cpp b/libIRDB/src/core/address.cpp index 8da164260..1e5f1ca0f 100644 --- a/libIRDB/src/core/address.cpp +++ b/libIRDB/src/core/address.cpp @@ -6,22 +6,28 @@ using namespace libIRDB; using namespace std; -string AddressID_t::WriteToDB(File_t *fid, db_id_t newid) +string AddressID_t::WriteToDB(File_t *fid, db_id_t newid, bool p_withHeader) { assert(fid); if(GetBaseID()==NOT_IN_DATABASE) SetBaseID(newid); - string q=string("insert into ")+fid->address_table_name + - string("(address_id , file_id , vaddress_offset , doip_id)") + - string(" values ") + + string q; + if (p_withHeader) + q=string("insert into ")+fid->address_table_name + + string("(address_id , file_id , vaddress_offset , doip_id)") + + string(" values "); + else + q = ","; + + q += string("(") + string("'") + to_string(GetBaseID()) + string("', ") + string("'") + to_string(fileID) + string("', ") + string("'") + to_string(virtual_offset) + string("', ") + string("'") + to_string(GetDoipID()) + string("' ") + - string(");"); + string(")"); return q; } diff --git a/libIRDB/src/core/fileir.cpp b/libIRDB/src/core/fileir.cpp index 805188b76..ef39e8c36 100644 --- a/libIRDB/src/core/fileir.cpp +++ b/libIRDB/src/core/fileir.cpp @@ -409,42 +409,60 @@ void FileIR_t::WriteToDB() dbintr->IssueQuery(string("TRUNCATE TABLE ")+ fileptr->relocs_table_name + string(" cascade;")); /* and now that everything has an ID, let's write to the DB */ + bool withHeader; + + withHeader = true; string q=string(""); - for(std::set<Function_t*>::const_iterator i=funcs.begin(); i!=funcs.end(); ++i) + for(std::set<Function_t*>::const_iterator f=funcs.begin(); f!=funcs.end(); ++f) { - q+=(*i)->WriteToDB(fileptr,j); + q+=(*f)->WriteToDB(fileptr,j); if(q.size()>1024*1024) { dbintr->IssueQuery(q); q=string(""); } - } dbintr->IssueQuery(q); + withHeader = true; q=string(""); - for(std::set<AddressID_t*>::const_iterator i=addrs.begin(); i!=addrs.end(); ++i) + for(std::set<AddressID_t*>::const_iterator a=addrs.begin(); a!=addrs.end(); ++a) { - q+=(*i)->WriteToDB(fileptr,j); + q+=(*a)->WriteToDB(fileptr,j,withHeader); + withHeader = false; if(q.size()>1024*1024) { + q+=";"; dbintr->IssueQuery(q); q=string(""); + withHeader = true; } } dbintr->IssueQuery(q); + withHeader = true; q=string(""); for(std::set<Instruction_t*>::const_iterator i=insns.begin(); i!=insns.end(); ++i) { - q+=(*i)->WriteToDB(fileptr,j); + q+=(*i)->WriteToDB(fileptr,j,withHeader); + withHeader = false; if(q.size()>1024*1024) { + q+=";"; dbintr->IssueQuery(q); q=string(""); + withHeader = true; } - } + string r=""; + std::set<Relocation_t*> relocs = (*i)->GetRelocations(); + for(set<Relocation_t*>::iterator it=relocs.begin(); it!=relocs.end(); ++it) + { + Relocation_t* reloc=*it; + r+=reloc->WriteToDB(fileptr,*i); + } + dbintr->IssueQuery(r); + } dbintr->IssueQuery(q); } diff --git a/libIRDB/src/core/instruction.cpp b/libIRDB/src/core/instruction.cpp index 66d754c11..08278f2d6 100644 --- a/libIRDB/src/core/instruction.cpp +++ b/libIRDB/src/core/instruction.cpp @@ -1,6 +1,6 @@ #include <all.hpp> #include <utils.hpp> -#include <stdlib.h> +#include <stdlib.h> #include <fstream> @@ -132,7 +132,7 @@ bool Instruction_t::Assemble(string assembly) } -string Instruction_t::WriteToDB(File_t *fid, db_id_t newid) +string Instruction_t::WriteToDB(File_t *fid, db_id_t newid, bool p_withHeader) { assert(fid); assert(my_address); @@ -156,11 +156,15 @@ string Instruction_t::WriteToDB(File_t *fid, db_id_t newid) if(indTarg) indirect_bt_id=indTarg->GetBaseID(); - string q= - string("insert into ")+fid->instruction_table_name + - string(" (instruction_id, address_id, parent_function_id, orig_address_id, fallthrough_address_id, target_address_id, data, callback, comment, ind_target_address_id, doip_id) ")+ - string(" VALUES (") + - string("'") + to_string(GetBaseID()) + string("', ") + + string q; + + if (p_withHeader) + q = string("insert into ")+fid->instruction_table_name + + string(" (instruction_id, address_id, parent_function_id, orig_address_id, fallthrough_address_id, target_address_id, data, callback, comment, ind_target_address_id, doip_id) VALUES "); + else + q = ","; + + q += string("('") + to_string(GetBaseID()) + string("', ") + string("'") + to_string(my_address->GetBaseID()) + string("', ") + string("'") + to_string(func_id) + string("', ") + string("'") + to_string(orig_address_id) + string("', ") + @@ -171,14 +175,7 @@ string Instruction_t::WriteToDB(File_t *fid, db_id_t newid) string("'") + callback + string("', ") + string("'") + comment + string("', ") + string("'") + to_string(indirect_bt_id) + string("', ") + - string("'") + to_string(GetDoipID()) + string("') ; ") ; - - // for each relocation in this instruction - for(set<Relocation_t*>::iterator it=relocs.begin(); it!=relocs.end(); ++it) - { - Relocation_t* reloc=*it; - q+=reloc->WriteToDB(fid,this); - } + string("'") + to_string(GetDoipID()) + string("') ") ; return q; } -- GitLab