mysql.cc
来自「M5,一个功能强大的多处理器系统模拟器.很多针对处理器架构,性能的研究都使用它作」· CC 代码 · 共 948 行 · 第 1/2 页
CC
948 行
voidMySql::connect(const string &host, const string &user, const string &passwd, const string &db, const string &name, const string &sample, const string &project){ run->connect(host, user, passwd, db, name, sample, project);}boolMySql::connected() const{ return run->connected();}voidMySql::configure(){ /* * set up all stats! */ using namespace Database; MySQL::Connection &mysql = run->conn(); stat_list_t::const_iterator i, end = stats().end(); for (i = stats().begin(); i != end; ++i) { (*i)->visit(*this); } for (i = stats().begin(); i != end; ++i) { StatData *data = *i; if (data->prereq) { // update the prerequisite uint16_t stat_id = find(data->id); uint16_t prereq_id = find(data->prereq->id); assert(stat_id && prereq_id); stringstream update; ccprintf(update, "UPDATE stats SET st_prereq=%d WHERE st_id=%d", prereq_id, stat_id); mysql.query(update); if (mysql.error) panic("could not update prereq\n%s\n", mysql.error); if (mysql.commit()) panic("could not commit transaction\n%s\n", mysql.error); } } if (mysql.commit()) panic("could not commit transaction\n%s\n", mysql.error); configured = true;}boolMySql::configure(const StatData &data, string type){ stat.init(); stat.name = data.name; stat.descr = data.desc; stat.type = type; stat.print = data.flags & print; stat.prec = data.precision; stat.nozero = data.flags & nozero; stat.nonan = data.flags & nonan; stat.total = data.flags & total; stat.pdf = data.flags & pdf; stat.cdf = data.flags & cdf; return stat.print;}voidMySql::configure(const ScalarData &data){ if (!configure(data, "SCALAR")) return; insert(data.id, stat.setup(run));}voidMySql::configure(const VectorData &data){ if (!configure(data, "VECTOR")) return; uint16_t statid = stat.setup(run); if (!data.subnames.empty()) { InsertSubData subdata; subdata.stat = statid; subdata.y = 0; for (int i = 0; i < data.subnames.size(); ++i) { subdata.x = i; subdata.name = data.subnames[i]; subdata.descr = data.subdescs.empty() ? "" : data.subdescs[i]; if (!subdata.name.empty() || !subdata.descr.empty()) subdata.setup(run); } } insert(data.id, statid);}voidMySql::configure(const DistData &data){ if (!configure(data, "DIST")) return; if (!data.data.fancy) { stat.size = data.data.size; stat.min = data.data.min; stat.max = data.data.max; stat.bktsize = data.data.bucket_size; } insert(data.id, stat.setup(run));}voidMySql::configure(const VectorDistData &data){ if (!configure(data, "VECTORDIST")) return; if (!data.data[0].fancy) { stat.size = data.data[0].size; stat.min = data.data[0].min; stat.max = data.data[0].max; stat.bktsize = data.data[0].bucket_size; } uint16_t statid = stat.setup(run); if (!data.subnames.empty()) { InsertSubData subdata; subdata.stat = statid; subdata.y = 0; for (int i = 0; i < data.subnames.size(); ++i) { subdata.x = i; subdata.name = data.subnames[i]; subdata.descr = data.subdescs.empty() ? "" : data.subdescs[i]; if (!subdata.name.empty() || !subdata.descr.empty()) subdata.setup(run); } } insert(data.id, statid);}voidMySql::configure(const Vector2dData &data){ if (!configure(data, "VECTOR2D")) return; uint16_t statid = stat.setup(run); if (!data.subnames.empty()) { InsertSubData subdata; subdata.stat = statid; subdata.y = -1; for (int i = 0; i < data.subnames.size(); ++i) { subdata.x = i; subdata.name = data.subnames[i]; subdata.descr = data.subdescs.empty() ? "" : data.subdescs[i]; if (!subdata.name.empty() || !subdata.descr.empty()) subdata.setup(run); } } if (!data.y_subnames.empty()) { InsertSubData subdata; subdata.stat = statid; subdata.x = -1; subdata.descr = ""; for (int i = 0; i < data.y_subnames.size(); ++i) { subdata.y = i; subdata.name = data.y_subnames[i]; if (!subdata.name.empty()) subdata.setup(run); } } insert(data.id, statid);}voidMySql::configure(const FormulaData &data){ MySQL::Connection &mysql = run->conn(); assert(mysql.connected()); configure(data, "FORMULA"); insert(data.id, stat.setup(run)); uint16_t stat = find(data.id); string formula = data.str(); stringstream insert_formula; ccprintf(insert_formula, "INSERT INTO formulas(fm_stat,fm_formula) values(%d, \"%s\")", stat, formula); mysql.query(insert_formula);// if (mysql.error)// panic("could not insert formula\n%s\n", mysql.error); stringstream insert_ref; ccprintf(insert_ref, "INSERT INTO formula_ref(fr_stat,fr_run) values(%d, %d)", stat, run->run()); mysql.query(insert_ref);// if (mysql.error)// panic("could not insert formula reference\n%s\n", mysql.error); if (mysql.commit()) panic("could not commit transaction\n%s\n", mysql.error);}boolMySql::valid() const{ return run->connected();}voidMySql::output(){ using namespace Database; assert(valid()); if (!configured) configure(); // store sample # newdata.tick = curTick; MySQL::Connection &mysql = run->conn(); Database::stat_list_t::const_iterator i, end = Database::stats().end(); for (i = Database::stats().begin(); i != end; ++i) { StatData *stat = *i; stat->visit(*this); if (mysql.commit()) panic("could not commit transaction\n%s\n", mysql.error); } newdata.flush();}voidMySql::event(const std::string &event){ newevent.insert(event);}voidMySql::output(const ScalarData &data){ if (!(data.flags & print)) return; newdata.stat = find(data.id); newdata.x = 0; newdata.y = 0; newdata.data = data.value(); newdata.insert();}voidMySql::output(const VectorData &data){ if (!(data.flags & print)) return; newdata.stat = find(data.id); newdata.y = 0; const VCounter &cvec = data.value(); int size = data.size(); for (int x = 0; x < size; x++) { newdata.x = x; newdata.data = cvec[x]; newdata.insert(); }}voidMySql::output(const DistDataData &data){ const int db_sum = -1; const int db_squares = -2; const int db_samples = -3; const int db_min_val = -4; const int db_max_val = -5; const int db_underflow = -6; const int db_overflow = -7; newdata.x = db_sum; newdata.data = data.sum; newdata.insert(); newdata.x = db_squares; newdata.data = data.squares; newdata.insert(); newdata.x = db_samples; newdata.data = data.samples; newdata.insert(); if (data.samples && !data.fancy) { newdata.x = db_min_val; newdata.data = data.min_val; newdata.insert(); newdata.x = db_max_val; newdata.data = data.max_val; newdata.insert(); newdata.x = db_underflow; newdata.data = data.underflow; newdata.insert(); newdata.x = db_overflow; newdata.data = data.overflow; newdata.insert(); int size = data.cvec.size(); for (int x = 0; x < size; x++) { newdata.x = x; newdata.data = data.cvec[x]; newdata.insert(); } }}voidMySql::output(const DistData &data){ if (!(data.flags & print)) return; newdata.stat = find(data.id); newdata.y = 0; output(data.data);}voidMySql::output(const VectorDistData &data){ if (!(data.flags & print)) return; newdata.stat = find(data.id); int size = data.data.size(); for (int y = 0; y < size; ++y) { newdata.y = y; output(data.data[y]); }}voidMySql::output(const Vector2dData &data){ if (!(data.flags & print)) return; newdata.stat = find(data.id); int index = 0; for (int x = 0; x < data.x; x++) { newdata.x = x; for (int y = 0; y < data.y; y++) { newdata.y = y; newdata.data = data.cvec[index++]; newdata.insert(); } }}voidMySql::output(const FormulaData &data){}/* * Implement the visitor */voidMySql::visit(const ScalarData &data){ if (!configured) configure(data); else output(data);}voidMySql::visit(const VectorData &data){ if (!configured) configure(data); else output(data);}voidMySql::visit(const DistData &data){ return; if (!configured) configure(data); else output(data);}voidMySql::visit(const VectorDistData &data){ return; if (!configured) configure(data); else output(data);}voidMySql::visit(const Vector2dData &data){ return; if (!configured) configure(data); else output(data);}voidMySql::visit(const FormulaData &data){ if (!configured) configure(data); else output(data);}boolinitMySQL(string host, string user, string password, string database, string project, string name, string sample){ extern list<Output *> OutputList; static MySql mysql; if (mysql.connected()) return false; mysql.connect(host, user, password, database, name, sample, project); OutputList.push_back(&mysql); return true;}/* end namespace Stats */ }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?