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 + -
显示快捷键?