CString CSymbolEnginePokerTracker::SymbolsProvided() { CString list; for (int i=0; i<PT_DLL_GetNumberOfStats(); ++i) { CString basic_symbol_name = PT_DLL_GetBasicSymbolNameWithoutPTPrefix(i); // Add symbol for raise-chair CString new_symbol = "pt_" + basic_symbol_name + "_raischair"; list.AppendFormat(" %s", new_symbol); // Add symbol for headsup-chair... new_symbol = "pt_" + basic_symbol_name + "_headsup"; list.AppendFormat(" %s", new_symbol); // ... and all similar symbols new_symbol = "pt_" + basic_symbol_name + "_smallblind"; list.AppendFormat(" %s", new_symbol); new_symbol = "pt_" + basic_symbol_name + "_bigblind"; list.AppendFormat(" %s", new_symbol); new_symbol = "pt_" + basic_symbol_name + "_cutoff"; list.AppendFormat(" %s", new_symbol); new_symbol = "pt_" + basic_symbol_name + "_firstcaller"; list.AppendFormat(" %s", new_symbol); new_symbol = "pt_" + basic_symbol_name + "_lastcaller"; list.AppendFormat(" %s", new_symbol); new_symbol = "pt_" + basic_symbol_name + "_firstraiser"; list.AppendFormat(" %s", new_symbol); new_symbol = "pt_" + basic_symbol_name + "_dealer"; list.AppendFormat(" %s", new_symbol); new_symbol = "pt_" + basic_symbol_name + "_user"; list.AppendFormat(" %s", new_symbol); // Add symbols for all chairs, indexed by trailing numbers for (int j=0; j<kMaxNumberOfPlayers; j++) { new_symbol.Format("pt_%s%i", basic_symbol_name, j); list.AppendFormat(" %s", new_symbol); } } return list; }
double CPokerTrackerThread::UpdateStat(int m_chr, int stat) { PGresult *res = NULL; double result = k_undefined; clock_t updStart, updEnd; int duration; int sym_elapsed = p_symbol_engine_time->elapsed(); //No more unnecessary queries when we don't even have a siteid to check int siteid = pt_lookup.GetSiteId(); if (siteid == k_undefined) return k_undefined; if (!_connected || PQstatus(_pgconn) != CONNECTION_OK) return k_undefined; assert(m_chr >= k_first_chair); assert(m_chr <= k_last_chair); assert(stat >= 0); assert(stat < PT_DLL_GetNumberOfStats()); // get query string for the requested statistic CString query = PT_DLL_GetQuery(stat, p_symbol_engine_isomaha->isomaha(), p_symbol_engine_istournament->istournament(), siteid, _player_data[m_chr].pt_name); // Do the query against the PT database updStart = clock(); try { // See if we can find the player name in the database write_log(preferences.debug_pokertracker(), "[PokerTracker] Querying %s for m_chr %d: %s\n", PT_DLL_GetBasicSymbolNameWithoutPTPrefix(stat), m_chr, query); res = PQexec(_pgconn, query); } catch (_com_error &e) { write_log(preferences.debug_pokertracker(), "[PokerTracker] ERROR\n"); write_log(preferences.debug_pokertracker(), _T("\tCode = %08lx\n"), e.Error()); write_log(preferences.debug_pokertracker(), _T("\tCode meaning = %s\n"), e.ErrorMessage()); _bstr_t bstrSource(e.Source()); _bstr_t bstrDescription(e.Description()); write_log(preferences.debug_pokertracker(), _T("\tSource = %s\n"), (LPCTSTR) bstrSource); write_log(preferences.debug_pokertracker(), _T("\tDescription = %s\n"), (LPCTSTR) bstrDescription); write_log(preferences.debug_pokertracker(), _T("\tQuery = [%s]\n"), query); } updEnd = clock(); duration = (int) ((double)(updEnd - updStart) / 1000); if (duration >= 3) write_log(preferences.debug_pokertracker(), "[PokerTracker] Query time in seconds: [%d]\n", duration); // Check query return code if (PQresultStatus(res) != PGRES_TUPLES_OK) { switch (PQresultStatus(res)) { case PGRES_COMMAND_OK: write_log(preferences.debug_pokertracker(), "[PokerTracker] PGRES_COMMAND_OK: %s [%s]\n", PQerrorMessage(_pgconn), query); break; case PGRES_EMPTY_QUERY: write_log(preferences.debug_pokertracker(), "[PokerTracker] PGRES_EMPTY_QUERY: %s [%s]\n", PQerrorMessage(_pgconn), query); break; case PGRES_BAD_RESPONSE: write_log(preferences.debug_pokertracker(), "[PokerTracker] PGRES_BAD_RESPONSE: %s [%s]\n", PQerrorMessage(_pgconn), query); break; case PGRES_COPY_OUT: write_log(preferences.debug_pokertracker(), "[PokerTracker] PGRES_COPY_OUT: %s [%s]\n", PQerrorMessage(_pgconn), query); break; case PGRES_COPY_IN: write_log(preferences.debug_pokertracker(), "[PokerTracker] PGRES_COPY_IN: %s [%s]\n", PQerrorMessage(_pgconn), query); break; case PGRES_NONFATAL_ERROR: write_log(preferences.debug_pokertracker(), "[PokerTracker] PGRES_NONFATAL_ERROR: %s [%s]\n", PQerrorMessage(_pgconn), query); break; case PGRES_FATAL_ERROR: write_log(preferences.debug_pokertracker(), "[PokerTracker] PGRES_FATAL_ERROR: %s [%s]\n", PQerrorMessage(_pgconn), query); break; default: write_log(preferences.debug_pokertracker(), "[PokerTracker] GENERIC ERROR: %s [%s]\n", PQerrorMessage(_pgconn), query); break; } } else { if (PQgetisnull(res,0,0) != 1) { result = atof(PQgetvalue(res,0,0)); write_log(preferences.debug_pokertracker(), "[PokerTracker] Query %s for m_chr %d success: %f\n", PT_DLL_GetBasicSymbolNameWithoutPTPrefix(stat), m_chr, result); } PQclear(res); // update cache with new values PT_DLL_SetStat(stat, m_chr, result); } return result; }