static cell AMX_NATIVE_CALL SQL_ReadResult(AMX *amx, cell *params) { AmxQueryInfo *qInfo = (AmxQueryInfo *)GetHandle(params[1], Handle_Query); if (!qInfo) { MF_LogError(amx, AMX_ERR_NATIVE, "Invalid query handle: %d", params[1]); return 0; } IResultSet *rs = qInfo->info.rs; if (!rs || rs->IsDone()) { MF_LogError(amx, AMX_ERR_NATIVE, "No result set in this query!"); return 0; } IResultRow *row = rs->GetRow(); unsigned int col = static_cast<unsigned int>(params[2]); if (col >= rs->FieldCount()) { MF_LogError(amx, AMX_ERR_NATIVE, "Invalid column: %d", col); return 0; } cell numparams = params[0] / sizeof(cell); switch (numparams) { case 4: { const char *str = row->GetString(col); if (!str) str = ""; cell *len = MF_GetAmxAddr(amx, params[4]); MF_SetAmxString(amx, params[3], str, (int)*len); break; } case 3: { REAL num = row->GetFloat(col); cell *addr = MF_GetAmxAddr(amx, params[3]); *addr = amx_ftoc(num); break; } case 2: { int num = row->GetInt(col); return num; break; } default: { MF_LogError(amx, AMX_ERR_NATIVE, "Bad number of arguments passed."); break; } } return 1; }
static cell_t SQL_FetchFloat(IPluginContext *pContext, const cell_t *params) { IQuery *query; HandleError err; if ((err = ReadQueryHndl(params[1], pContext, &query)) != HandleError_None) { return pContext->ThrowNativeError("Invalid query Handle %x (error: %d)", params[1], err); } IResultSet *rs = query->GetResultSet(); if (!rs) { return pContext->ThrowNativeError("No current result set"); } IResultRow *row = rs->CurrentRow(); if (!row) { return pContext->ThrowNativeError("Current result set has no fetched rows"); } float f; DBResult res = row->GetFloat(params[2], &f); if (res == DBVal_Error) { return pContext->ThrowNativeError("Error fetching data from field %d", params[2]); } else if (res == DBVal_TypeMismatch) { return pContext->ThrowNativeError("Could not fetch data in field %d as a float", params[2]); } cell_t *addr; pContext->LocalToPhysAddr(params[3], &addr); *addr = (cell_t)res; return sp_ftoc(f); }