using namespace std;
-const char * hostname ="localhost";
-const char * user = "root";
-const char * passwd = "foobletch";
-const char * dbname = "kea";
+class uBenchmark {
+public:
+ uBenchmark(uint32_t numInterations);
-void failure(MYSQL* conn, const char* operation) {
+ virtual void printInfo() = 0;
+ virtual void connect() = 0;
+ virtual void disconnect() = 0;
+ virtual void createLease4Test() = 0;
+ virtual void searchLease4Test() = 0;
+ virtual void updateLease4Test() = 0;
+ virtual void deleteLease4Test() = 0;
+
+ virtual void failure(const char* operation);
+
+ void print_clock(const std::string& operation, uint32_t num,
+ const struct timespec& before,
+ const struct timespec& after);
+
+ int run();
+
+protected:
+ uint32_t Num_; // number of operations (e.g. insert lease num times)
+
+ // five timestamps (1 at the beginning and 4 after each step)
+ struct timespec ts[5];
+};
+
+uBenchmark::uBenchmark(uint32_t iterations)
+ :Num_(iterations) {
+
+}
+
+void uBenchmark::failure(const char* operation) {
+ cout << "Error during " << operation << endl;
+ throw string(operation);
+}
+
+void uBenchmark::print_clock(const std::string& operation, uint32_t num,
+ const struct timespec& before,
+ const struct timespec& after) {
+ long int tv_sec = after.tv_sec - before.tv_sec;
+
+ long int tv_nsec = after.tv_nsec - before.tv_nsec;
+
+ cout << "after.tv_nsec=" << after.tv_nsec
+ << " before.tv_nsec=" << before.tv_nsec << endl;
+
+ if (tv_nsec < 0) {
+ tv_sec++;
+ tv_nsec += 1000000000; // 10^9
+ }
+
+ double oneoper = (tv_nsec/1000 + tv_sec*1000000)/num;
+
+ cout << "Operation " << operation << " repeated " << num << " times took "
+ << tv_sec << " seconds, " << tv_nsec/1000 << " us, 1 operation took "
+ << oneoper << "us (or " << (1000000/oneoper) << " oper/sec)" << endl;
+
+}
+
+int uBenchmark::run() {
+
+ try {
+ connect();
+
+ clock_gettime(CLOCK_REALTIME, &ts[0]);
+
+ createLease4Test();
+ clock_gettime(CLOCK_REALTIME, &ts[1]);
+
+ searchLease4Test();
+ clock_gettime(CLOCK_REALTIME, &ts[2]);
+
+ updateLease4Test();
+ clock_gettime(CLOCK_REALTIME, &ts[3]);
+
+ deleteLease4Test();
+ clock_gettime(CLOCK_REALTIME, &ts[4]);
+
+ disconnect();
+
+ } catch (const std::string& e) {
+ cout << "Failed: " << e << endl;
+ return (-1);
+ }
+
+ print_clock("Create leases4 ", Num_, ts[0], ts[1]);
+ // print_clock("Search leases4 ", num, ts[1], ts[2]);
+ // print_clock("Update leases4 ", num, ts[2], ts[3]);
+ // print_clock("Delete leases4 ", num, ts[3], ts[4]);
+
+ return (0);
+}
+
+class MySQL_uBenchmark: public uBenchmark {
+public:
+ MySQL_uBenchmark(const string& hostname, const string& user,
+ const string& passwd, const string& db,
+ uint32_t num_iterations);
+
+ virtual void printInfo();
+ virtual void connect();
+ virtual void disconnect();
+ virtual void createLease4Test();
+ virtual void searchLease4Test();
+ virtual void updateLease4Test();
+ virtual void deleteLease4Test();
+
+protected:
+ void failure(const char* operation);
+
+ std::string Hostname_;
+ std::string User_;
+ std::string Pass_;
+ std::string DB_;
+ MYSQL * Conn_;
+};
+
+
+MySQL_uBenchmark::MySQL_uBenchmark(const string& hostname, const string& user,
+ const string& pass, const string& db,
+ uint32_t num_iterations)
+ :uBenchmark(num_iterations), Hostname_(hostname), User_(user),
+ Pass_(pass), DB_(db), Conn_(NULL) {
+
+}
+
+void MySQL_uBenchmark::failure(const char* operation) {
stringstream tmp;
- tmp << "Error " << mysql_errno(conn) << " during " << operation
- << ": " << mysql_error(conn);
+ tmp << "Error " << mysql_errno(Conn_) << " during " << operation
+ << ": " << mysql_error(Conn_);
throw tmp.str();
}
-MYSQL * connect() {
- MYSQL *conn = NULL;
+void MySQL_uBenchmark::connect() {
- conn = mysql_init(NULL);
- if (!conn) {
- failure(conn, "initializing MySQL library");
+ Conn_ = mysql_init(NULL);
+ if (!Conn_) {
+ failure("initializing MySQL library");
} else {
cout << "MySQL library init successful." << endl;
}
- if (!mysql_real_connect(conn, hostname, user, passwd, dbname, 0, NULL, 0)) {
- failure(conn, "connecting to MySQL server");
+ cout << "hostname=" << Hostname_ << ", user=" << User_
+ << "pass=" << Pass_ << " db=" << DB_ << endl;
+
+ if (!mysql_real_connect(Conn_, Hostname_.c_str(), User_.c_str(),
+ Pass_.c_str(), DB_.c_str(), 0, NULL, 0)) {
+ failure("connecting to MySQL server");
} else {
cout << "MySQL connection established." << endl;
}
- string q = "delete from lease4";
- if (mysql_real_query(conn, q.c_str(), strlen(q.c_str()))) {
- failure(conn, "dropping old lease4 entries.");
+ string q = "delete from lease4;";
+ if (mysql_real_query(Conn_, q.c_str(), strlen(q.c_str()))) {
+ failure("dropping old lease4 entries.");
}
-
- return (conn);
}
-bool disconnect(MYSQL * conn) {
- if (!conn) {
+void MySQL_uBenchmark::disconnect() {
+ if (!Conn_) {
throw "NULL MySQL connection pointer.";
}
- mysql_close(conn);
+ mysql_close(Conn_);
+ Conn_ = NULL;
}
-
-
-bool createLease4Test(MYSQL * conn, uint32_t num) {
- if (!conn) {
- throw "NULL MySQL connection pointer.";
+void MySQL_uBenchmark::createLease4Test() {
+ if (!Conn_) {
+ throw "Not connected to MySQL server.";
}
uint32_t addr = 0x01000000; // Let's start with 1.0.0.0 address
client_id[i] = 33 + i;
}
- for (uint32_t i = 0; i < num; i++) {
+ for (uint32_t i = 0; i < Num_; i++) {
stringstream cltt;
cltt << "2012-07-11 15:43:" << (i % 60);
"fqdn_fwd,fqdn_rev) VALUES(");
end = query + strlen(query);
end += sprintf(end, "%u,\'", addr);
- end += mysql_real_escape_string(conn, end, hwaddr, hwaddr_len);
+ end += mysql_real_escape_string(Conn_, end, hwaddr, hwaddr_len);
end += sprintf(end,"\',\'");
- end += mysql_real_escape_string(conn, end, client_id, client_id_len);
+ end += mysql_real_escape_string(Conn_, end, client_id, client_id_len);
end += sprintf(end, "\',%d,%d,'%s',%d,%s,\'%s\',%s,%s);",
valid_lft, recycle_time, cltt.str().c_str(),
pool_id, (fixed?"true":"false"), hostname.c_str(),
// options and comments fields are not set
unsigned int len = end - query;
- if (mysql_real_query(conn, query, len)) {
+ if (mysql_real_query(Conn_, query, len)) {
// something failed.
- failure(conn, "INSERT query");
+ failure("INSERT query");
} else {
printf(".");
- fflush(stdout);
};
}
printf("\n");
- fflush(stdout);
}
-bool searchLease4Test(MYSQL * conn, uint32_t num) {
- if (!conn) {
- throw "NULL MySQL connection pointer.";
+void MySQL_uBenchmark::searchLease4Test() {
+ if (!Conn_) {
+ throw "Not connected to MySQL server.";
}
}
-bool updateLease4Test(MYSQL* conn, uint32_t num) {
- if (!conn) {
- throw "NULL MySQL connection pointer.";
+void MySQL_uBenchmark::updateLease4Test() {
+ if (!Conn_) {
+ throw "Not connected to MySQL server.";
}
}
-bool deleteLease4Test(MYSQL* conn, uint32_t num) {
- if (!conn) {
- throw "NULL MySQL connection pointer.";
+void MySQL_uBenchmark::deleteLease4Test() {
+ if (!Conn_) {
+ throw "Not connected to MySQL server.";
}
}
-void print_clock(const std::string& operation, uint32_t num,
- const struct timespec& before,
- const struct timespec& after) {
- long int tv_sec = after.tv_sec - before.tv_sec;
-
- long int tv_nsec = after.tv_nsec - before.tv_nsec;
-
- cout << "after.tv_nsec=" << after.tv_nsec
- << " before.tv_nsec=" << before.tv_nsec << endl;
-
- if (tv_nsec < 0) {
- tv_sec++;
- tv_nsec += 1000000000; // 10^9
- }
-
- double oneoper = (tv_nsec/1000 + tv_sec*1000000)/num;
-
- cout << "Operation " << operation << " repeated " << num << " times took "
- << tv_sec << " seconds, " << tv_nsec/1000 << " us, 1 operation took "
- << oneoper << "us" << endl;
-
+void MySQL_uBenchmark::printInfo() {
+ cout << "MySQL client version is " << mysql_get_client_info() << endl;
}
-int main(int argc, const char * argv[]) {
- cout << "MySQL client version is " << mysql_get_client_info() << endl;
+int main(int argc, const char * argv[]) {
+ const char * hostname ="localhost";
+ const char * user = "root";
+ const char * passwd = "foobletch";
+ const char * dbname = "kea";
uint32_t num = 100;
- struct timespec ts[5];
- try {
- MYSQL *conn = connect();
+ MySQL_uBenchmark bench(hostname, user, passwd, dbname, num);
- clock_gettime(CLOCK_REALTIME, &ts[0]);
+ int result = bench.run();
- createLease4Test(conn, num);
- clock_gettime(CLOCK_REALTIME, &ts[1]);
-
- searchLease4Test(conn, num);
- clock_gettime(CLOCK_REALTIME, &ts[2]);
-
- updateLease4Test(conn, num);
- clock_gettime(CLOCK_REALTIME, &ts[3]);
-
- deleteLease4Test(conn, num);
- clock_gettime(CLOCK_REALTIME, &ts[4]);
-
- disconnect(conn);
-
- } catch (const std::string& e) {
- cout << "Failed: " << e << endl;
- return (-1);
- }
-
- print_clock("Create leases4 ", num, ts[0], ts[1]);
-
- return (0);
+ return (result);
}