dbcampaign: select multiple variants/benchmark pairs

The variant/benchmark selection now can use SQL LIKE syntax, all unfinished
pilots from all selected variants are sent to the clients. E.g.:

./cored-voter-server  -v x86-cored-voter -b simple-% -p basic

Will select the fsppilots in the variants:

- x86-cored-voter/simple-ip/basic
- x86-cored-voter/simple-instr/basic

The variant and benchmark information is now sent within the
fsppilot.

Change-Id: I287bfcddc478d0b79d89e156d6f5bf8188674532
This commit is contained in:
Christian Dietrich
2013-07-03 22:10:18 +02:00
parent 40f610b536
commit 9843b520c1
5 changed files with 124 additions and 60 deletions

View File

@ -74,36 +74,56 @@ my_ulonglong Database::affected_rows()
}
int Database::get_variant_id(const std::string &variant, const std::string &benchmark)
{
std::vector<Database::Variant> Database::get_variants(const std::string &variant, const std::string &benchmark) {
std::vector<Variant> result;
if (!query("CREATE TABLE IF NOT EXISTS variant ("
" id int(11) NOT NULL AUTO_INCREMENT,"
" variant varchar(255) NOT NULL,"
" benchmark varchar(255) NOT NULL,"
" PRIMARY KEY (id),"
"UNIQUE KEY variant (variant,benchmark))")) {
return 0;
return result;
}
int variant_id;
std::stringstream ss;
// FIXME SQL injection possible
ss << "SELECT id FROM variant WHERE variant LIKE '" << variant << "' AND benchmark LIKE '" << benchmark << "'";
ss << "SELECT id, variant, benchmark FROM variant WHERE variant LIKE '" << variant << "' AND benchmark LIKE '" << benchmark << "'";
MYSQL_RES *variant_id_res = query(ss.str().c_str(), true);
if (!variant_id_res) {
return 0;
return result;
} else if (mysql_num_rows(variant_id_res)) {
MYSQL_ROW row = mysql_fetch_row(variant_id_res);
variant_id = atoi(row[0]);
} else {
ss.str("");
for (unsigned int i = 0; i < mysql_num_rows(variant_id_res); ++i) {
MYSQL_ROW row = mysql_fetch_row(variant_id_res);
Variant var;
var.id = atoi(row[0]);
var.variant = std::string(row[1]);
var.benchmark = std::string(row[2]);
result.push_back(var);
}
}
return result;
}
int Database::get_variant_id(const std::string &variant, const std::string &benchmark)
{
std::vector<Variant> variants = get_variants(variant, benchmark);
if (variants.size() == 0) {
// Insert a new variant
std::stringstream ss;
ss << "INSERT INTO variant (variant, benchmark) VALUES ('" << variant << "', '" << benchmark << "')";
if (!query(ss.str().c_str())) {
return 0;
}
variant_id = mysql_insert_id(handle);
return mysql_insert_id(handle);
} else if (variants.size() == 1) {
return variants[0].id;
} else {
LOG << "Variant identifier " << variant << "/" << benchmark << " is ambigious!" << std::endl;
return 0;
}
return variant_id;
}
int Database::get_fspmethod_id(const std::string &method)