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