00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <sstream>
00022
00023 #include <sqlite3.h>
00024
00025 #include "ns3/log.h"
00026 #include "ns3/nstime.h"
00027
00028 #include "data-collector.h"
00029 #include "data-calculator.h"
00030 #include "sqlite-data-output.h"
00031
00032 using namespace ns3;
00033
00034 NS_LOG_COMPONENT_DEFINE("SqliteDataOutput");
00035
00036
00037
00038 SqliteDataOutput::SqliteDataOutput() :
00039 m_dbFile("data.db")
00040 {
00041 NS_LOG_FUNCTION_NOARGS();
00042 }
00043 SqliteDataOutput::~SqliteDataOutput()
00044 {
00045 NS_LOG_FUNCTION_NOARGS();
00046 }
00047 void
00048 SqliteDataOutput::DoDispose()
00049 {
00050 NS_LOG_FUNCTION_NOARGS();
00051
00052 DataOutputInterface::DoDispose();
00053
00054 }
00055
00056 void
00057 SqliteDataOutput::SetDBFile(const std::string file)
00058 {
00059 m_dbFile = file;
00060 }
00061 std::string
00062 SqliteDataOutput::GetDBFile() const
00063 {
00064 return m_dbFile;
00065 }
00066
00067 int
00068 SqliteDataOutput::Exec(std::string exe) {
00069 int res;
00070 char **result;
00071 int nrows, ncols;
00072 char *errMsg = 0;
00073
00074 NS_LOG_INFO("executing '" << exe << "'");
00075
00076 res = sqlite3_get_table(m_db,
00077 exe.c_str(),
00078 &result, &nrows, &ncols,
00079 &errMsg);
00080
00081 if (res != SQLITE_OK) {
00082 NS_LOG_ERROR("sqlite3 error: \"" << errMsg << "\"");
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102 }
00103
00104 sqlite3_free_table(result);
00105 return res;
00106
00107
00108 }
00109
00110
00111 void
00112 SqliteDataOutput::Output(DataCollector &dc)
00113 {
00114
00115 if (sqlite3_open(m_dbFile.c_str(), &m_db)) {
00116 NS_LOG_ERROR("Could not open sqlite3 database \"" << m_dbFile << "\"");
00117 NS_LOG_ERROR("sqlite3 error \"" << sqlite3_errmsg(m_db) << "\"");
00118 sqlite3_close(m_db);
00119
00120 return;
00121 }
00122
00123 std::string run = dc.GetRunLabel();
00124
00125 Exec("create table if not exists Experiments (run, experiment, strategy, input, description text)");
00126 Exec("insert into Experiments (run,experiment,strategy,input,description) values ('" +
00127 run + "', '" +
00128 dc.GetExperimentLabel() + "', '" +
00129 dc.GetStrategyLabel() + "', '" +
00130 dc.GetInputLabel() + "', '" +
00131 dc.GetDescription() + "')");
00132
00133 Exec("create table if not exists Metadata ( run text, key text, value)");
00134
00135 for (MetadataList::iterator i = dc.MetadataBegin();
00136 i != dc.MetadataEnd(); i++) {
00137 std::pair<std::string, std::string> blob = (*i);
00138 Exec("insert into Metadata (run,key,value) values ('" +
00139 run + "', '" +
00140 blob.first + "', '" +
00141 blob.second + "')");
00142 }
00143
00144 SqliteOutputCallback callback(this, run);
00145 for (DataCalculatorList::iterator i = dc.DataCalculatorBegin();
00146 i != dc.DataCalculatorEnd(); i++) {
00147 (*i)->Output(callback);
00148 }
00149
00150 sqlite3_close(m_db);
00151
00152
00153 }
00154
00155 SqliteDataOutput::SqliteOutputCallback::SqliteOutputCallback
00156 (Ptr<SqliteDataOutput> owner, std::string run) :
00157 m_owner(owner),
00158 m_runLabel(run)
00159 {
00160
00161 m_owner->Exec("create table if not exists Singletons ( run text, name text, variable text, value )");
00162
00163
00164 }
00165
00166 void
00167 SqliteDataOutput::SqliteOutputCallback::OutputSingleton(std::string key,
00168 std::string variable,
00169 int val)
00170 {
00171
00172 std::stringstream sstr;
00173 sstr << "insert into Singletons (run,name,variable,value) values ('" <<
00174 m_runLabel << "', '" <<
00175 key << "', '" <<
00176 variable << "', " <<
00177 val << ")";
00178 m_owner->Exec(sstr.str());
00179
00180
00181 }
00182 void
00183 SqliteDataOutput::SqliteOutputCallback::OutputSingleton(std::string key,
00184 std::string variable,
00185 uint32_t val)
00186 {
00187 std::stringstream sstr;
00188 sstr << "insert into Singletons (run,name,variable,value) values ('" <<
00189 m_runLabel << "', '" <<
00190 key << "', '" <<
00191 variable << "', " <<
00192 val << ")";
00193 m_owner->Exec(sstr.str());
00194
00195 }
00196 void
00197 SqliteDataOutput::SqliteOutputCallback::OutputSingleton(std::string key,
00198 std::string variable,
00199 double val)
00200 {
00201 std::stringstream sstr;
00202 sstr << "insert into Singletons (run,name,variable,value) values ('" <<
00203 m_runLabel << "', '" <<
00204 key << "', '" <<
00205 variable << "', " <<
00206 val << ")";
00207 m_owner->Exec(sstr.str());
00208
00209 }
00210 void
00211 SqliteDataOutput::SqliteOutputCallback::OutputSingleton(std::string key,
00212 std::string variable,
00213 std::string val)
00214 {
00215 std::stringstream sstr;
00216 sstr << "insert into Singletons (run,name,variable,value) values ('" <<
00217 m_runLabel << "', '" <<
00218 key << "', '" <<
00219 variable << "', '" <<
00220 val << "')";
00221 m_owner->Exec(sstr.str());
00222
00223 }
00224 void
00225 SqliteDataOutput::SqliteOutputCallback::OutputSingleton(std::string key,
00226 std::string variable,
00227 Time val)
00228 {
00229 std::stringstream sstr;
00230 sstr << "insert into Singletons (run,name,variable,value) values ('" <<
00231 m_runLabel << "', '" <<
00232 key << "', '" <<
00233 variable << "', " <<
00234 val.GetTimeStep() << ")";
00235 m_owner->Exec(sstr.str());
00236
00237 }