void MysqlThread::RunThread(IThreadHandle *pHandle) { DatabaseInfo info; info.database = m_db.chars(); info.pass = ""; info.user = ""; info.host = ""; info.port = 0; float save_time = m_qrInfo.queue_time; memset(&m_qrInfo, 0, sizeof(m_qrInfo)); m_qrInfo.queue_time = save_time; IDatabase *pDatabase = g_Sqlite.Connect(&info, &m_qrInfo.amxinfo.info.errorcode, m_qrInfo.amxinfo.error, 254); IQuery *pQuery = NULL; if (!pDatabase) { m_qrInfo.connect_success = false; m_qrInfo.query_success = false; } else { m_qrInfo.connect_success = true; pQuery = pDatabase->PrepareQuery(m_query.chars()); if (!pQuery->Execute2(&m_qrInfo.amxinfo.info, m_qrInfo.amxinfo.error, 254)) { m_qrInfo.query_success = false; } else { m_qrInfo.query_success = true; } } if (m_qrInfo.query_success && m_qrInfo.amxinfo.info.rs) { m_atomicResult.CopyFrom(m_qrInfo.amxinfo.info.rs); m_qrInfo.amxinfo.info.rs = &m_atomicResult; } if (pQuery) { m_qrInfo.amxinfo.pQuery = pQuery; } else { m_qrInfo.amxinfo.opt_ptr = new char[m_query.length() + 1]; strcpy(m_qrInfo.amxinfo.opt_ptr, m_query.chars()); } if (pDatabase) { pDatabase->FreeHandle(); pDatabase = NULL; } }
//native Result:dbi_query2(Sql:_sql, &rows, _query[], {Float,_}:...); static cell AMX_NATIVE_CALL dbi_query2(AMX *amx, cell *params) { olddb_s *old = (olddb_s *)GetHandle(params[1], Handle_OldDb); if (!old) { MF_LogError(amx, AMX_ERR_NATIVE, "Invalid DBI handle %d", params[1]); return -1; } int len; char *queryString = MF_FormatAmxString(amx, params, 3, &len); IQuery *pQuery = old->pDatabase->PrepareQuery(queryString); QueryInfo info; old->error[0] = '\0'; old->errcode = 0; if (!pQuery->Execute2(&info, old->error, 254)) { old->errcode = info.errorcode; return -1; } else { cell *addr = MF_GetAmxAddr(amx, params[2]); *addr = static_cast<cell>(info.affected_rows); if (info.rs && info.rs->RowCount()) { oldresult_s *oldrs = new oldresult_s; int hndl; oldrs->info = info; oldrs->pQuery = pQuery; oldrs->firstCall = true; hndl = MakeHandle(oldrs, Handle_OldResult, FreeOldResult); return hndl; } else { pQuery->FreeHandle(); return 0; } } /** never reach here */ return 0; }