util/Database: fail gracefully if db selection didn't work
Change-Id: If4195353859ef4fb845eda5c5ee251a6adf9c5f5
This commit is contained in:
@ -52,25 +52,31 @@ my_ulonglong Database::affected_rows()
|
|||||||
|
|
||||||
int Database::get_variant_id(const std::string &variant, const std::string &benchmark)
|
int Database::get_variant_id(const std::string &variant, const std::string &benchmark)
|
||||||
{
|
{
|
||||||
query("CREATE TABLE IF NOT EXISTS variant ("
|
if (!query("CREATE TABLE IF NOT EXISTS variant ("
|
||||||
" id int(11) NOT NULL AUTO_INCREMENT,"
|
" id int(11) NOT NULL AUTO_INCREMENT,"
|
||||||
" variant varchar(255) NOT NULL,"
|
" variant varchar(255) NOT NULL,"
|
||||||
" benchmark varchar(255) NOT NULL,"
|
" benchmark varchar(255) NOT NULL,"
|
||||||
" PRIMARY KEY (id),"
|
" PRIMARY KEY (id),"
|
||||||
"UNIQUE KEY variant (variant,benchmark))");
|
"UNIQUE KEY variant (variant,benchmark))")) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int variant_id;
|
int variant_id;
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
// FIXME SQL injection possible
|
// FIXME SQL injection possible
|
||||||
ss << "SELECT id FROM variant WHERE variant = '" << variant << "' AND benchmark = '" << benchmark << "'";
|
ss << "SELECT id FROM variant WHERE variant = '" << variant << "' AND benchmark = '" << benchmark << "'";
|
||||||
MYSQL_RES *variant_id_res = query(ss.str().c_str(), true);
|
MYSQL_RES *variant_id_res = query(ss.str().c_str(), true);
|
||||||
ss.str("");
|
if (!variant_id_res) {
|
||||||
if (mysql_num_rows(variant_id_res)) {
|
return 0;
|
||||||
|
} else if (mysql_num_rows(variant_id_res)) {
|
||||||
MYSQL_ROW row = mysql_fetch_row(variant_id_res);
|
MYSQL_ROW row = mysql_fetch_row(variant_id_res);
|
||||||
variant_id = atoi(row[0]);
|
variant_id = atoi(row[0]);
|
||||||
} else {
|
} else {
|
||||||
|
ss.str("");
|
||||||
ss << "INSERT INTO variant (variant, benchmark) VALUES ('" << variant << "', '" << benchmark << "')";
|
ss << "INSERT INTO variant (variant, benchmark) VALUES ('" << variant << "', '" << benchmark << "')";
|
||||||
query(ss.str().c_str());
|
if (!query(ss.str().c_str())) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
variant_id = mysql_insert_id(handle);
|
variant_id = mysql_insert_id(handle);
|
||||||
}
|
}
|
||||||
return variant_id;
|
return variant_id;
|
||||||
@ -78,25 +84,30 @@ int Database::get_variant_id(const std::string &variant, const std::string &benc
|
|||||||
|
|
||||||
int Database::get_fspmethod_id(const std::string &method)
|
int Database::get_fspmethod_id(const std::string &method)
|
||||||
{
|
{
|
||||||
|
if (!query("CREATE TABLE IF NOT EXISTS fspmethod ("
|
||||||
query("CREATE TABLE IF NOT EXISTS fspmethod ("
|
|
||||||
" id int(11) NOT NULL AUTO_INCREMENT,"
|
" id int(11) NOT NULL AUTO_INCREMENT,"
|
||||||
" method varchar(255) NOT NULL,"
|
" method varchar(255) NOT NULL,"
|
||||||
" PRIMARY KEY (id), UNIQUE KEY method (method))");
|
" PRIMARY KEY (id), UNIQUE KEY method (method))")) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
ss << "SELECT id FROM fspmethod WHERE method = '" << method << "'";
|
ss << "SELECT id FROM fspmethod WHERE method = '" << method << "'";
|
||||||
MYSQL_RES *res = query(ss.str().c_str(), true);
|
MYSQL_RES *res = query(ss.str().c_str(), true);
|
||||||
ss.str("");
|
|
||||||
|
|
||||||
int id;
|
int id;
|
||||||
|
|
||||||
if (mysql_num_rows(res)) {
|
if (!res) {
|
||||||
|
return 0;
|
||||||
|
} else if (mysql_num_rows(res)) {
|
||||||
MYSQL_ROW row = mysql_fetch_row(res);
|
MYSQL_ROW row = mysql_fetch_row(res);
|
||||||
id = atoi(row[0]);
|
id = atoi(row[0]);
|
||||||
} else {
|
} else {
|
||||||
|
ss.str("");
|
||||||
ss << "INSERT INTO fspmethod (method) VALUES ('" << method << "')";
|
ss << "INSERT INTO fspmethod (method) VALUES ('" << method << "')";
|
||||||
query(ss.str().c_str());
|
if (!query(ss.str().c_str())) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
id = mysql_insert_id(handle);
|
id = mysql_insert_id(handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -7,11 +7,15 @@ using namespace fail;
|
|||||||
|
|
||||||
extern Logger log;
|
extern Logger log;
|
||||||
|
|
||||||
void Importer::init(const std::string &variant, const std::string &benchmark, Database *db) {
|
bool Importer::init(const std::string &variant, const std::string &benchmark, Database *db) {
|
||||||
this->db = db;
|
this->db = db;
|
||||||
m_variant_id = db->get_variant_id(variant, benchmark);
|
m_variant_id = db->get_variant_id(variant, benchmark);
|
||||||
|
if (!m_variant_id) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
log << "Importing to variant " << variant << "/" << benchmark
|
log << "Importing to variant " << variant << "/" << benchmark
|
||||||
<< " (ID: " << m_variant_id << ")" << std::endl;
|
<< " (ID: " << m_variant_id << ")" << std::endl;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Importer::clear_database() {
|
bool Importer::clear_database() {
|
||||||
|
|||||||
@ -19,7 +19,7 @@ protected:
|
|||||||
public:
|
public:
|
||||||
typedef unsigned instruction_count_t;
|
typedef unsigned instruction_count_t;
|
||||||
|
|
||||||
void init(const std::string &variant, const std::string &benchmark, fail::Database *db);
|
bool init(const std::string &variant, const std::string &benchmark, fail::Database *db);
|
||||||
|
|
||||||
virtual bool create_database() = 0;
|
virtual bool create_database() = 0;
|
||||||
virtual bool copy_to_database(fail::ProtoIStream &ps);
|
virtual bool copy_to_database(fail::ProtoIStream &ps);
|
||||||
|
|||||||
@ -132,7 +132,10 @@ int main(int argc, char *argv[]) {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
importer->init(variant, benchmark, db);
|
if (!importer->init(variant, benchmark, db)) {
|
||||||
|
log << "importer->init() failed" << endl;
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
importer->set_elf_file(elf_file);
|
importer->set_elf_file(elf_file);
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////
|
||||||
|
|||||||
Reference in New Issue
Block a user