util/Database: fail gracefully if db selection didn't work

Change-Id: If4195353859ef4fb845eda5c5ee251a6adf9c5f5
This commit is contained in:
Horst Schirmeier
2013-03-23 18:00:31 +01:00
parent 14b7d4e6f4
commit 95402cee5d
4 changed files with 32 additions and 14 deletions

View File

@ -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);
} }

View File

@ -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() {

View File

@ -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);

View File

@ -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);
//////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////