diff --git a/src/stats/model/sqlite-data-output.cc b/src/stats/model/sqlite-data-output.cc index 72e981731..a26584881 100644 --- a/src/stats/model/sqlite-data-output.cc +++ b/src/stats/model/sqlite-data-output.cc @@ -126,26 +126,51 @@ SqliteDataOutput::Output (DataCollector &dc) return; } - std::string run = dc.GetRunLabel (); - Exec ("create table if not exists Experiments (run, experiment, strategy, input, description text)"); - Exec ("insert into Experiments (run,experiment,strategy,input,description) values ('" + - run + "', '" + - dc.GetExperimentLabel () + "', '" + - dc.GetStrategyLabel () + "', '" + - dc.GetInputLabel () + "', '" + - dc.GetDescription () + "')"); + + sqlite3_stmt *stmt; + sqlite3_prepare_v2 (m_db, + "insert into Experiments (run, experiment, strategy, input, description) values (?, ?, ?, ?, ?)", + -1, + &stmt, + NULL + ); + + std::string run = dc.GetRunLabel (); + sqlite3_bind_text (stmt, 1, run.c_str (), run.length (), SQLITE_TRANSIENT); + sqlite3_bind_text (stmt, 2, dc.GetExperimentLabel ().c_str (), + dc.GetExperimentLabel ().length (), SQLITE_TRANSIENT); + sqlite3_bind_text (stmt, 3, dc.GetStrategyLabel ().c_str (), + dc.GetStrategyLabel ().length (), SQLITE_TRANSIENT); + sqlite3_bind_text (stmt, 4, dc.GetInputLabel ().c_str (), + dc.GetInputLabel ().length (), SQLITE_TRANSIENT); + sqlite3_bind_text (stmt, 5, dc.GetDescription ().c_str (), + dc.GetDescription ().length (), SQLITE_TRANSIENT); + sqlite3_step (stmt); + sqlite3_finalize (stmt); Exec ("create table if not exists Metadata ( run text, key text, value)"); + sqlite3_prepare_v2 (m_db, + "insert into Metadata (run, key, value) values (?, ?, ?)", + -1, + &stmt, + NULL + ); for (MetadataList::iterator i = dc.MetadataBegin (); i != dc.MetadataEnd (); i++) { std::pair blob = (*i); - Exec ("insert into Metadata (run,key,value) values ('" + - run + "', '" + - blob.first + "', '" + - blob.second + "')"); + + sqlite3_reset (stmt); + sqlite3_bind_text (stmt, 1, run.c_str (), + run.length (), SQLITE_TRANSIENT); + sqlite3_bind_text (stmt, 2, blob.first.c_str (), + blob.first.length (), SQLITE_TRANSIENT); + sqlite3_bind_text (stmt, 3, blob.second.c_str (), + blob.second.length (), SQLITE_TRANSIENT); + sqlite3_step (stmt); } + sqlite3_finalize (stmt); Exec ("BEGIN"); SqliteOutputCallback callback (this, run); @@ -169,9 +194,22 @@ SqliteDataOutput::SqliteOutputCallback::SqliteOutputCallback m_owner->Exec ("create table if not exists Singletons ( run text, name text, variable text, value )"); + sqlite3_prepare_v2 (m_owner->m_db, + "insert into Singletons (run, name, variable, value) values (?, ?, ?, ?)", + -1, + &m_insertSingletonStatement, + NULL + ); + sqlite3_bind_text (m_insertSingletonStatement, 1, m_runLabel.c_str (), m_runLabel.length (), SQLITE_TRANSIENT); + // end SqliteDataOutput::SqliteOutputCallback::SqliteOutputCallback } +SqliteDataOutput::SqliteOutputCallback::~SqliteOutputCallback () +{ + sqlite3_finalize (m_insertSingletonStatement); +} + void SqliteDataOutput::SqliteOutputCallback::OutputStatistic (std::string key, std::string variable, @@ -200,15 +238,11 @@ SqliteDataOutput::SqliteOutputCallback::OutputSingleton (std::string key, { NS_LOG_FUNCTION (this << key << variable << val); - std::stringstream sstr; - sstr << "insert into Singletons (run,name,variable,value) values ('" << - m_runLabel << "', '" << - key << "', '" << - variable << "', " << - val << ")"; - m_owner->Exec (sstr.str ()); - - // end SqliteDataOutput::SqliteOutputCallback::OutputSingleton + sqlite3_reset (m_insertSingletonStatement); + sqlite3_bind_text (m_insertSingletonStatement, 2, key.c_str (), key.length (), SQLITE_TRANSIENT); + sqlite3_bind_text (m_insertSingletonStatement, 3, variable.c_str (), variable.length (), SQLITE_TRANSIENT); + sqlite3_bind_int (m_insertSingletonStatement, 4, val); + sqlite3_step (m_insertSingletonStatement); } void SqliteDataOutput::SqliteOutputCallback::OutputSingleton (std::string key, @@ -217,15 +251,13 @@ SqliteDataOutput::SqliteOutputCallback::OutputSingleton (std::string key, { NS_LOG_FUNCTION (this << key << variable << val); - std::stringstream sstr; - sstr << "insert into Singletons (run,name,variable,value) values ('" << - m_runLabel << "', '" << - key << "', '" << - variable << "', " << - val << ")"; - m_owner->Exec (sstr.str ()); - // end SqliteDataOutput::SqliteOutputCallback::OutputSingleton + sqlite3_reset (m_insertSingletonStatement); + sqlite3_bind_text (m_insertSingletonStatement, 2, key.c_str (), key.length (), SQLITE_TRANSIENT); + sqlite3_bind_text (m_insertSingletonStatement, 3, variable.c_str (), variable.length (), SQLITE_TRANSIENT); + sqlite3_bind_int64 (m_insertSingletonStatement, 4, val); + sqlite3_step (m_insertSingletonStatement); } + void SqliteDataOutput::SqliteOutputCallback::OutputSingleton (std::string key, std::string variable, @@ -233,15 +265,13 @@ SqliteDataOutput::SqliteOutputCallback::OutputSingleton (std::string key, { NS_LOG_FUNCTION (this << key << variable << val); - std::stringstream sstr; - sstr << "insert into Singletons (run,name,variable,value) values ('" << - m_runLabel << "', '" << - key << "', '" << - variable << "', " << - val << ")"; - m_owner->Exec (sstr.str ()); - // end SqliteDataOutput::SqliteOutputCallback::OutputSingleton + sqlite3_reset (m_insertSingletonStatement); + sqlite3_bind_text (m_insertSingletonStatement, 2, key.c_str (), key.length (), SQLITE_TRANSIENT); + sqlite3_bind_text (m_insertSingletonStatement, 3, variable.c_str (), variable.length (), SQLITE_TRANSIENT); + sqlite3_bind_double (m_insertSingletonStatement, 4, val); + sqlite3_step (m_insertSingletonStatement); } + void SqliteDataOutput::SqliteOutputCallback::OutputSingleton (std::string key, std::string variable, @@ -249,15 +279,13 @@ SqliteDataOutput::SqliteOutputCallback::OutputSingleton (std::string key, { NS_LOG_FUNCTION (this << key << variable << val); - std::stringstream sstr; - sstr << "insert into Singletons (run,name,variable,value) values ('" << - m_runLabel << "', '" << - key << "', '" << - variable << "', '" << - val << "')"; - m_owner->Exec (sstr.str ()); - // end SqliteDataOutput::SqliteOutputCallback::OutputSingleton + sqlite3_reset (m_insertSingletonStatement); + sqlite3_bind_text (m_insertSingletonStatement, 2, key.c_str (), key.length (), SQLITE_TRANSIENT); + sqlite3_bind_text (m_insertSingletonStatement, 3, variable.c_str (), variable.length (), SQLITE_TRANSIENT); + sqlite3_bind_text (m_insertSingletonStatement, 4, val.c_str (), val.length (), SQLITE_TRANSIENT); + sqlite3_step (m_insertSingletonStatement); } + void SqliteDataOutput::SqliteOutputCallback::OutputSingleton (std::string key, std::string variable, @@ -265,12 +293,9 @@ SqliteDataOutput::SqliteOutputCallback::OutputSingleton (std::string key, { NS_LOG_FUNCTION (this << key << variable << val); - std::stringstream sstr; - sstr << "insert into Singletons (run,name,variable,value) values ('" << - m_runLabel << "', '" << - key << "', '" << - variable << "', " << - val.GetTimeStep () << ")"; - m_owner->Exec (sstr.str ()); - // end SqliteDataOutput::SqliteOutputCallback::OutputSingleton + sqlite3_reset (m_insertSingletonStatement); + sqlite3_bind_text (m_insertSingletonStatement, 2, key.c_str (), key.length (), SQLITE_TRANSIENT); + sqlite3_bind_text (m_insertSingletonStatement, 3, variable.c_str (), variable.length (), SQLITE_TRANSIENT); + sqlite3_bind_int64 (m_insertSingletonStatement, 4, val.GetTimeStep ()); + sqlite3_step (m_insertSingletonStatement); } diff --git a/src/stats/model/sqlite-data-output.h b/src/stats/model/sqlite-data-output.h index d87121c11..187a0a16f 100644 --- a/src/stats/model/sqlite-data-output.h +++ b/src/stats/model/sqlite-data-output.h @@ -27,7 +27,7 @@ #define STATS_HAS_SQLITE3 -struct sqlite3; +#include namespace ns3 { @@ -69,6 +69,11 @@ public: */ SqliteOutputCallback(Ptr owner, std::string run); + /** + * Destructor + */ + ~SqliteOutputCallback (); + /** * \brief Generates data statistics * \param key the SQL key to use @@ -132,6 +137,7 @@ public: private: Ptr m_owner; //!< the instance this object belongs to std::string m_runLabel; //!< Run label + sqlite3_stmt *m_insertSingletonStatement; //!< Prepared singleton insert statement // end class SqliteOutputCallback };