if (!d_stmt) return this;
if (d_dolog) {
- g_log<<Logger::Warning<<"Query: " << d_query <<endl;
+ g_log<<Logger::Warning<< "Query "<<((long)(void*)this)<<": " << d_query << endl;
+ d_dtime.set();
}
if ((err = mysql_stmt_bind_param(d_stmt, d_req_bind))) {
}
}
+ if(d_dolog)
+ g_log<<Logger::Warning<< "Query "<<((long)(void*)this)<<": "<<d_dtime.udiffNoReset()<<" usec to execute"<<endl;
+
return this;
}
bool hasNextRow() {
+ if(d_dolog && d_residx == d_resnum) {
+ g_log<<Logger::Warning<< "Query "<<((long)(void*)this)<<": "<<d_dtime.udiffNoReset()<<" total usec to last row"<<endl;
+ }
return d_residx < d_resnum;
}
bool d_prepared;
bool d_dolog;
+ DTime d_dtime; // only used if d_dolog is set
int d_parnum;
int d_paridx;
int d_fnum;
SSqlStatement* execute() {
prepareStatement();
if (d_dolog) {
- g_log<<Logger::Warning<<"Query: "<<d_query<<endl;
+ g_log<<Logger::Warning<< "Query "<<((long)(void*)this)<<": " << d_query << endl;
+ d_dtime.set();
}
d_res_set = PQexecPrepared(d_db(), d_stmt.c_str(), d_nparams, paramValues, paramLengths, NULL, 0);
ExecStatusType status = PQresultStatus(d_res_set);
throw SSqlException("Fatal error during query: " + d_query + string(": ") + errmsg);
}
d_cur_set = 0;
+ if(d_dolog) {
+ auto diff = d_dtime.udiffNoReset();
+ g_log<<Logger::Warning<< "Query "<<((long)(void*)this)<<": "<< diff <<" usec to execute"<<endl;
+ }
+
nextResult();
return this;
}
bool hasNextRow()
{
+ if(d_dolog && d_residx == d_resnum) {
+ g_log<<Logger::Warning<< "Query "<<((long)(void*)this)<<": "<<d_dtime.udiff()<<" total usec to last row"<<endl;
+ }
+
return d_residx<d_resnum;
}
PGresult *d_res_set;
PGresult *d_res;
bool d_dolog;
+ DTime d_dtime; // only used if d_dolog is set
bool d_prepared;
int d_nparams;
int d_paridx;
SSqlStatement* execute() {
prepareStatement();
- if (d_dolog)
- g_log<<Logger::Warning<< "Query: " << d_query << endl;
+ if (d_dolog) {
+ g_log<<Logger::Warning<< "Query "<<((long)(void*)this)<<": " << d_query << endl;
+ d_dtime.set();
+ }
int attempts = d_db->inTransaction(); // try only once
while(attempts < 2 && (d_rc = sqlite3_step(d_stmt)) == SQLITE_BUSY) attempts++;
throw SSqlException(string("CANTOPEN error in sqlite3, often caused by unwritable sqlite3 db *directory*: ")+string(sqlite3_errmsg(d_db->db())));
throw SSqlException(string("Error while retrieving SQLite query results: ")+string(sqlite3_errmsg(d_db->db())));
}
+ if(d_dolog)
+ g_log<<Logger::Warning<< "Query "<<((long)(void*)this)<<": "<<d_dtime.udiffNoReset()<<" usec to execute"<<endl;
return this;
}
- bool hasNextRow() { return d_rc == SQLITE_ROW; }
+ bool hasNextRow() {
+ if(d_dolog && d_rc != SQLITE_ROW) {
+ g_log<<Logger::Warning<< "Query "<<((long)(void*)this)<<": "<<d_dtime.udiffNoReset()<<" total usec to last row"<<endl;
+ }
+ return d_rc == SQLITE_ROW;
+ }
SSqlStatement* nextRow(row_t& row) {
row.clear();
int d_rc;
bool d_dolog;
bool d_prepared;
-
+ DTime d_dtime;
void prepareStatement() {
const char *pTail;