//------------------------------------------------------------------------------------- void DBInterfaceMysql::getFields(TABLE_FIELDS& outs, const char* tablename) { std::string sqlname = ENTITY_TABLE_PERFIX"_"; sqlname += tablename; MYSQL_RES* result = mysql_list_fields(mysql(), sqlname.c_str(), NULL); if(result == NULL) { ERROR_MSG(boost::format("EntityTableMysql::loadFields:%1%\n") % getstrerror()); return; } unsigned int numFields; MYSQL_FIELD* fields; numFields = mysql_num_fields(result); fields = mysql_fetch_fields(result); for(unsigned int i=0; i<numFields; i++) { TABLE_FIELD& info = outs[fields[i].name]; info.name = fields[i].name; info.length = fields[i].length; info.maxlength = fields[i].max_length; info.flags = fields[i].flags; info.type = fields[i].type; } mysql_free_result(result); }
//------------------------------------------------------------------------------------- bool DBInterfaceRedis::processException(std::exception & e) { DBException* dbe = static_cast<DBException*>(&e); bool retry = false; if (dbe->isLostConnection()) { INFO_MSG(fmt::format("DBInterfaceRedis::processException: " "Thread {:p} lost connection to database. Exception: {}. " "Attempting to reconnect.\n", (void*)this, dbe->what())); int attempts = 1; while (!this->reattach()) { ERROR_MSG(fmt::format("DBInterfaceRedis::processException: " "Thread {:p} reconnect({}) attempt {} failed({}).\n", (void*)this, db_name_, attempts, getstrerror())); KBEngine::sleep(30); ++attempts; } INFO_MSG(fmt::format("DBInterfaceRedis::processException: " "Thread {:p} reconnected({}). Attempts = {}\n", (void*)this, db_name_, attempts)); retry = true; } else if (dbe->shouldRetry()) { WARNING_MSG(fmt::format("DBInterfaceRedis::processException: Retrying {:p}\nException:{}\nnlastquery={}\n", (void*)this, dbe->what(), lastquery_)); retry = true; } else { WARNING_MSG(fmt::format("DBInterfaceRedis::processException: " "Exception: {}\nlastquery={}\n", dbe->what(), lastquery_)); } return retry; }