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;
}
Пример #2
0
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;
}