Merge branch 'master' of git://git.assembla.com/fpdb-sql
This commit is contained in:
commit
a9dac26381
|
@ -26,6 +26,7 @@ Create and manage the database objects.
|
||||||
# Standard Library modules
|
# Standard Library modules
|
||||||
import sys
|
import sys
|
||||||
import traceback
|
import traceback
|
||||||
|
from datetime import datetime, date, time, timedelta
|
||||||
|
|
||||||
# pyGTK modules
|
# pyGTK modules
|
||||||
|
|
||||||
|
@ -77,10 +78,40 @@ class Database:
|
||||||
print "press enter to continue"
|
print "press enter to continue"
|
||||||
sys.exit()
|
sys.exit()
|
||||||
|
|
||||||
|
self.db_server = c.supported_databases[db_name].db_server
|
||||||
self.type = c.supported_databases[db_name].db_type
|
self.type = c.supported_databases[db_name].db_type
|
||||||
self.sql = SQL.Sql(game = game, type = self.type)
|
self.sql = SQL.Sql(game = game, type = self.type, db_server = self.db_server)
|
||||||
self.connection.rollback()
|
self.connection.rollback()
|
||||||
|
|
||||||
|
# To add to config:
|
||||||
|
self.hud_style = 'T' # A=All-time
|
||||||
|
# S=Session
|
||||||
|
# T=timed (last n days)
|
||||||
|
# Future values may also include:
|
||||||
|
# H=Hands (last n hands)
|
||||||
|
self.hud_hands = 1000 # Max number of hands from each player to use for hud stats
|
||||||
|
self.hud_days = 90 # Max number of days from each player to use for hud stats
|
||||||
|
self.hud_session_gap = 30 # Gap (minutes) between hands that indicates a change of session
|
||||||
|
# (hands every 2 mins for 1 hour = one session, if followed
|
||||||
|
# by a 40 minute gap and then more hands on same table that is
|
||||||
|
# a new session)
|
||||||
|
cur = self.connection.cursor()
|
||||||
|
|
||||||
|
self.hand_1day_ago = 0
|
||||||
|
cur.execute(self.sql.query['get_hand_1day_ago'])
|
||||||
|
row = cur.fetchone()
|
||||||
|
if row and row[0]:
|
||||||
|
self.hand_1day_ago = row[0]
|
||||||
|
#print "hand 1day ago =", self.hand_1day_ago
|
||||||
|
|
||||||
|
d = timedelta(days=self.hud_days)
|
||||||
|
now = datetime.utcnow() - d
|
||||||
|
self.date_ndays_ago = "d%02d%02d%02d" % (now.year-2000, now.month, now.day)
|
||||||
|
|
||||||
|
self.hand_nhands_ago = 0 # todo
|
||||||
|
#cur.execute(self.sql.query['get_table_name'], (hand_id, ))
|
||||||
|
#row = cur.fetchone()
|
||||||
|
|
||||||
def close_connection(self):
|
def close_connection(self):
|
||||||
self.connection.close()
|
self.connection.close()
|
||||||
|
|
||||||
|
@ -191,16 +222,25 @@ class Database:
|
||||||
winners[row[0]] = row[1]
|
winners[row[0]] = row[1]
|
||||||
return winners
|
return winners
|
||||||
|
|
||||||
def get_stats_from_hand(self, hand, aggregate = False, stylekey = 'A000000'):
|
def get_stats_from_hand(self, hand, aggregate = False):
|
||||||
|
if self.hud_style == 'S':
|
||||||
|
return( self.get_stats_from_hand_session(hand) )
|
||||||
|
else: # self.hud_style == A
|
||||||
|
if aggregate:
|
||||||
|
query = 'get_stats_from_hand_aggregated'
|
||||||
|
else:
|
||||||
|
query = 'get_stats_from_hand'
|
||||||
|
|
||||||
|
if self.hud_style == 'T':
|
||||||
|
stylekey = self.date_ndays_ago
|
||||||
|
else: # assume A (all-time)
|
||||||
|
stylekey = '0000000' # all stylekey values should be higher than this
|
||||||
|
|
||||||
|
subs = (hand, hand, stylekey)
|
||||||
|
#print "get stats: hud style =", self.hud_style, "subs =", subs
|
||||||
c = self.connection.cursor()
|
c = self.connection.cursor()
|
||||||
|
|
||||||
if aggregate:
|
# now get the stats
|
||||||
query = 'get_stats_from_hand_aggregated'
|
|
||||||
else:
|
|
||||||
query = 'get_stats_from_hand'
|
|
||||||
subs = (hand, hand, stylekey, stylekey)
|
|
||||||
|
|
||||||
# now get the stats
|
|
||||||
c.execute(self.sql.query[query], subs)
|
c.execute(self.sql.query[query], subs)
|
||||||
colnames = [desc[0] for desc in c.description]
|
colnames = [desc[0] for desc in c.description]
|
||||||
stat_dict = {}
|
stat_dict = {}
|
||||||
|
@ -210,6 +250,52 @@ class Database:
|
||||||
t_dict[name.lower()] = val
|
t_dict[name.lower()] = val
|
||||||
# print t_dict
|
# print t_dict
|
||||||
stat_dict[t_dict['player_id']] = t_dict
|
stat_dict[t_dict['player_id']] = t_dict
|
||||||
|
|
||||||
|
return stat_dict
|
||||||
|
|
||||||
|
# uses query on handsplayers instead of hudcache to get stats on just this session
|
||||||
|
def get_stats_from_hand_session(self, hand):
|
||||||
|
|
||||||
|
if self.hud_style == 'S':
|
||||||
|
query = self.sql.query['get_stats_from_hand_session']
|
||||||
|
if self.db_server == 'mysql':
|
||||||
|
query = query.replace("<signed>", 'signed ')
|
||||||
|
else:
|
||||||
|
query = query.replace("<signed>", '')
|
||||||
|
else: # self.hud_style == A
|
||||||
|
return None
|
||||||
|
|
||||||
|
subs = (self.hand_1day_ago, hand)
|
||||||
|
c = self.connection.cursor()
|
||||||
|
|
||||||
|
# now get the stats
|
||||||
|
#print "sess_stats: subs =", subs, "subs[0] =", subs[0]
|
||||||
|
c.execute(query, subs)
|
||||||
|
colnames = [desc[0] for desc in c.description]
|
||||||
|
n,stat_dict = 0,{}
|
||||||
|
row = c.fetchone()
|
||||||
|
while row:
|
||||||
|
if colnames[0].lower() == 'player_id':
|
||||||
|
playerid = row[0]
|
||||||
|
else:
|
||||||
|
print "ERROR: query %s result does not have player_id as first column" % (query,)
|
||||||
|
break
|
||||||
|
|
||||||
|
for name, val in zip(colnames, row):
|
||||||
|
if not playerid in stat_dict:
|
||||||
|
stat_dict[playerid] = {}
|
||||||
|
stat_dict[playerid][name.lower()] = val
|
||||||
|
elif not name.lower() in stat_dict[playerid]:
|
||||||
|
stat_dict[playerid][name.lower()] = val
|
||||||
|
elif name.lower() not in ('hand_id', 'player_id', 'seat', 'screen_name', 'seats'):
|
||||||
|
stat_dict[playerid][name.lower()] += val
|
||||||
|
n += 1
|
||||||
|
if n >= 4000: break # todo: don't think this is needed so set nice and high
|
||||||
|
# for now - comment out or remove?
|
||||||
|
row = c.fetchone()
|
||||||
|
#print " %d rows fetched, len(stat_dict) = %d" % (n, len(stat_dict))
|
||||||
|
|
||||||
|
#print "session stat_dict =", stat_dict
|
||||||
return stat_dict
|
return stat_dict
|
||||||
|
|
||||||
def get_player_id(self, config, site, player_name):
|
def get_player_id(self, config, site, player_name):
|
||||||
|
|
|
@ -154,7 +154,7 @@ class GuiAutoImport (threading.Thread):
|
||||||
# to watch.
|
# to watch.
|
||||||
if widget.get_active(): # toggled on
|
if widget.get_active(): # toggled on
|
||||||
self.doAutoImportBool = True
|
self.doAutoImportBool = True
|
||||||
widget.set_label(u'Stop Autoimport')
|
widget.set_label(u' _Stop Autoimport ')
|
||||||
if self.pipe_to_hud is None:
|
if self.pipe_to_hud is None:
|
||||||
if os.name == 'nt':
|
if os.name == 'nt':
|
||||||
command = "python HUD_main.py" + " %s" % (self.database)
|
command = "python HUD_main.py" + " %s" % (self.database)
|
||||||
|
@ -190,7 +190,7 @@ class GuiAutoImport (threading.Thread):
|
||||||
#print >>self.pipe_to_hud.stdin, "\n"
|
#print >>self.pipe_to_hud.stdin, "\n"
|
||||||
self.pipe_to_hud.communicate('\n') # waits for process to terminate
|
self.pipe_to_hud.communicate('\n') # waits for process to terminate
|
||||||
self.pipe_to_hud = None
|
self.pipe_to_hud = None
|
||||||
self.startButton.set_label(u'Start Autoimport')
|
self.startButton.set_label(u' _Start Autoimport ')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
200
pyfpdb/SQL.py
200
pyfpdb/SQL.py
|
@ -29,7 +29,7 @@ Set up all of the SQL statements for a given game and database type.
|
||||||
|
|
||||||
class Sql:
|
class Sql:
|
||||||
|
|
||||||
def __init__(self, game = 'holdem', type = 'PT3'):
|
def __init__(self, game = 'holdem', type = 'PT3', db_server = 'mysql'):
|
||||||
self.query = {}
|
self.query = {}
|
||||||
|
|
||||||
############################################################################
|
############################################################################
|
||||||
|
@ -175,7 +175,6 @@ class Sql:
|
||||||
SELECT hc.playerId AS player_id,
|
SELECT hc.playerId AS player_id,
|
||||||
hp.seatNo AS seat,
|
hp.seatNo AS seat,
|
||||||
p.name AS screen_name,
|
p.name AS screen_name,
|
||||||
hc.styleKey AS stylekey,
|
|
||||||
sum(hc.HDs) AS n,
|
sum(hc.HDs) AS n,
|
||||||
sum(hc.street0VPI) AS vpip,
|
sum(hc.street0VPI) AS vpip,
|
||||||
sum(hc.street0Aggr) AS pfr,
|
sum(hc.street0Aggr) AS pfr,
|
||||||
|
@ -238,10 +237,16 @@ class Sql:
|
||||||
AND hc.gametypeId+0 = h.gametypeId+0)
|
AND hc.gametypeId+0 = h.gametypeId+0)
|
||||||
INNER JOIN Players p ON (p.id = hp.PlayerId+0)
|
INNER JOIN Players p ON (p.id = hp.PlayerId+0)
|
||||||
WHERE h.id = %s
|
WHERE h.id = %s
|
||||||
AND (hc.styleKey = %s or %s = 'ALL') /* styleKey should be passed in twice */
|
AND hc.styleKey > %s
|
||||||
/* This allows the caller to query only a particular stylekey or all,
|
/* styleKey is currently 'd' (for date) followed by a yyyymmdd
|
||||||
e.g. may want to use different values for Hero and others */
|
date key. Set it to 0000000 or similar to get all records */
|
||||||
GROUP BY hc.PlayerId, hp.seatNo, p.name, hc.styleKey
|
/* also check activeseats here? even if only 3 groups eg 2-3/4-6/7+ ??
|
||||||
|
e.g. could use a multiplier:
|
||||||
|
AND h.seats > X / 1.25 and hp.seats < X * 1.25
|
||||||
|
where X is the number of active players at the current table (and
|
||||||
|
1.25 would be a config value so user could change it)
|
||||||
|
*/
|
||||||
|
GROUP BY hc.PlayerId, hp.seatNo, p.name
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# same as above except stats are aggregated for all blind/limit levels
|
# same as above except stats are aggregated for all blind/limit levels
|
||||||
|
@ -252,7 +257,6 @@ class Sql:
|
||||||
else -1
|
else -1
|
||||||
end) AS seat,
|
end) AS seat,
|
||||||
p.name AS screen_name,
|
p.name AS screen_name,
|
||||||
hc.styleKey AS stylekey,
|
|
||||||
sum(hc.HDs) AS n,
|
sum(hc.HDs) AS n,
|
||||||
sum(hc.street0VPI) AS vpip,
|
sum(hc.street0VPI) AS vpip,
|
||||||
sum(hc.street0Aggr) AS pfr,
|
sum(hc.street0Aggr) AS pfr,
|
||||||
|
@ -314,9 +318,15 @@ class Sql:
|
||||||
INNER JOIN HudCache hc ON (hc.playerId = hp.playerId)
|
INNER JOIN HudCache hc ON (hc.playerId = hp.playerId)
|
||||||
INNER JOIN Players p ON (p.id = hc.playerId)
|
INNER JOIN Players p ON (p.id = hc.playerId)
|
||||||
WHERE h.id = %s
|
WHERE h.id = %s
|
||||||
AND (hc.styleKey = %s or %s = 'ALL') /* styleKey should be passed in twice */
|
AND hc.styleKey > %s
|
||||||
/* This allows the caller to query only a particular stylekey or all,
|
/* styleKey is currently 'd' (for date) followed by a yyyymmdd
|
||||||
e.g. may want to use different values for Hero and others */
|
date key. Set it to 0000000 or similar to get all records */
|
||||||
|
/* also check activeseats here? even if only 3 groups eg 2-3/4-6/7+ ??
|
||||||
|
e.g. could use a multiplier:
|
||||||
|
AND h.seats > %s / 1.25 and hp.seats < %s * 1.25
|
||||||
|
where %s is the number of active players at the current table (and
|
||||||
|
1.25 would be a config value so user could change it)
|
||||||
|
*/
|
||||||
AND hc.gametypeId+0 in
|
AND hc.gametypeId+0 in
|
||||||
(SELECT gt1.id from Gametypes gt1, Gametypes gt2
|
(SELECT gt1.id from Gametypes gt1, Gametypes gt2
|
||||||
WHERE gt1.siteid = gt2.siteid
|
WHERE gt1.siteid = gt2.siteid
|
||||||
|
@ -327,6 +337,164 @@ class Sql:
|
||||||
GROUP BY hc.PlayerId, p.name, hc.styleKey
|
GROUP BY hc.PlayerId, p.name, hc.styleKey
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
if db_server == 'mysql':
|
||||||
|
self.query['get_stats_from_hand_session'] = """
|
||||||
|
SELECT hp.playerId AS player_id,
|
||||||
|
hp.handId AS hand_id,
|
||||||
|
hp.seatNo AS seat,
|
||||||
|
p.name AS screen_name,
|
||||||
|
h.seats AS seats,
|
||||||
|
1 AS n,
|
||||||
|
cast(hp2.street0VPI as <signed>integer) AS vpip,
|
||||||
|
cast(hp2.street0Aggr as <signed>integer) AS pfr,
|
||||||
|
cast(hp2.street0_3BChance as <signed>integer) AS TB_opp_0,
|
||||||
|
cast(hp2.street0_3BDone as <signed>integer) AS TB_0,
|
||||||
|
cast(hp2.street1Seen as <signed>integer) AS saw_f,
|
||||||
|
cast(hp2.street1Seen as <signed>integer) AS saw_1,
|
||||||
|
cast(hp2.street2Seen as <signed>integer) AS saw_2,
|
||||||
|
cast(hp2.street3Seen as <signed>integer) AS saw_3,
|
||||||
|
cast(hp2.street4Seen as <signed>integer) AS saw_4,
|
||||||
|
cast(hp2.sawShowdown as <signed>integer) AS sd,
|
||||||
|
cast(hp2.street1Aggr as <signed>integer) AS aggr_1,
|
||||||
|
cast(hp2.street2Aggr as <signed>integer) AS aggr_2,
|
||||||
|
cast(hp2.street3Aggr as <signed>integer) AS aggr_3,
|
||||||
|
cast(hp2.street4Aggr as <signed>integer) AS aggr_4,
|
||||||
|
cast(hp2.otherRaisedStreet1 as <signed>integer) AS was_raised_1,
|
||||||
|
cast(hp2.otherRaisedStreet2 as <signed>integer) AS was_raised_2,
|
||||||
|
cast(hp2.otherRaisedStreet3 as <signed>integer) AS was_raised_3,
|
||||||
|
cast(hp2.otherRaisedStreet4 as <signed>integer) AS was_raised_4,
|
||||||
|
cast(hp2.foldToOtherRaisedStreet1 as <signed>integer) AS f_freq_1,
|
||||||
|
cast(hp2.foldToOtherRaisedStreet2 as <signed>integer) AS f_freq_2,
|
||||||
|
cast(hp2.foldToOtherRaisedStreet3 as <signed>integer) AS f_freq_3,
|
||||||
|
cast(hp2.foldToOtherRaisedStreet4 as <signed>integer) AS f_freq_4,
|
||||||
|
cast(hp2.wonWhenSeenStreet1 as <signed>integer) AS w_w_s_1,
|
||||||
|
cast(hp2.wonAtSD as <signed>integer) AS wmsd,
|
||||||
|
cast(hp2.stealAttemptChance as <signed>integer) AS steal_opp,
|
||||||
|
cast(hp2.stealAttempted as <signed>integer) AS steal,
|
||||||
|
cast(hp2.foldSbToStealChance as <signed>integer) AS SBstolen,
|
||||||
|
cast(hp2.foldedSbToSteal as <signed>integer) AS SBnotDef,
|
||||||
|
cast(hp2.foldBbToStealChance as <signed>integer) AS BBstolen,
|
||||||
|
cast(hp2.foldedBbToSteal as <signed>integer) AS BBnotDef,
|
||||||
|
cast(hp2.street1CBChance as <signed>integer) AS CB_opp_1,
|
||||||
|
cast(hp2.street1CBDone as <signed>integer) AS CB_1,
|
||||||
|
cast(hp2.street2CBChance as <signed>integer) AS CB_opp_2,
|
||||||
|
cast(hp2.street2CBDone as <signed>integer) AS CB_2,
|
||||||
|
cast(hp2.street3CBChance as <signed>integer) AS CB_opp_3,
|
||||||
|
cast(hp2.street3CBDone as <signed>integer) AS CB_3,
|
||||||
|
cast(hp2.street4CBChance as <signed>integer) AS CB_opp_4,
|
||||||
|
cast(hp2.street4CBDone as <signed>integer) AS CB_4,
|
||||||
|
cast(hp2.foldToStreet1CBChance as <signed>integer) AS f_cb_opp_1,
|
||||||
|
cast(hp2.foldToStreet1CBDone as <signed>integer) AS f_cb_1,
|
||||||
|
cast(hp2.foldToStreet2CBChance as <signed>integer) AS f_cb_opp_2,
|
||||||
|
cast(hp2.foldToStreet2CBDone as <signed>integer) AS f_cb_2,
|
||||||
|
cast(hp2.foldToStreet3CBChance as <signed>integer) AS f_cb_opp_3,
|
||||||
|
cast(hp2.foldToStreet3CBDone as <signed>integer) AS f_cb_3,
|
||||||
|
cast(hp2.foldToStreet4CBChance as <signed>integer) AS f_cb_opp_4,
|
||||||
|
cast(hp2.foldToStreet4CBDone as <signed>integer) AS f_cb_4,
|
||||||
|
cast(hp2.totalProfit as <signed>integer) AS net,
|
||||||
|
cast(hp2.street1CheckCallRaiseChance as <signed>integer) AS ccr_opp_1,
|
||||||
|
cast(hp2.street1CheckCallRaiseDone as <signed>integer) AS ccr_1,
|
||||||
|
cast(hp2.street2CheckCallRaiseChance as <signed>integer) AS ccr_opp_2,
|
||||||
|
cast(hp2.street2CheckCallRaiseDone as <signed>integer) AS ccr_2,
|
||||||
|
cast(hp2.street3CheckCallRaiseChance as <signed>integer) AS ccr_opp_3,
|
||||||
|
cast(hp2.street3CheckCallRaiseDone as <signed>integer) AS ccr_3,
|
||||||
|
cast(hp2.street4CheckCallRaiseChance as <signed>integer) AS ccr_opp_4,
|
||||||
|
cast(hp2.street4CheckCallRaiseDone as <signed>integer) AS ccr_4
|
||||||
|
FROM
|
||||||
|
Hands h /* players in this hand */
|
||||||
|
INNER JOIN Hands h2 ON (h2.id > %s AND h2.tableName = h.tableName)
|
||||||
|
INNER JOIN HandsPlayers hp ON (h.id = hp.handId)
|
||||||
|
INNER JOIN HandsPlayers hp2 ON (hp2.playerId+0 = hp.playerId+0 AND (hp2.handId = h2.id+0)) /* other hands by these players */
|
||||||
|
INNER JOIN Players p ON (p.id = hp2.PlayerId+0)
|
||||||
|
WHERE hp.handId = %s
|
||||||
|
/* check activeseats once this data returned? (don't want to do that here as it might
|
||||||
|
assume a session ended just because the number of seats dipped for a few hands)
|
||||||
|
*/
|
||||||
|
ORDER BY h.handStart desc, hp2.PlayerId
|
||||||
|
/* order rows by handstart descending so that we can stop reading rows when
|
||||||
|
there's a gap over X minutes between hands (ie. when we get back to start of
|
||||||
|
the session */
|
||||||
|
"""
|
||||||
|
else: # assume postgresql
|
||||||
|
self.query['get_stats_from_hand_session'] = """
|
||||||
|
SELECT hp.playerId AS player_id,
|
||||||
|
hp.handId AS hand_id,
|
||||||
|
hp.seatNo AS seat,
|
||||||
|
p.name AS screen_name,
|
||||||
|
h.seats AS seats,
|
||||||
|
1 AS n,
|
||||||
|
cast(hp2.street0VPI as <signed>integer) AS vpip,
|
||||||
|
cast(hp2.street0Aggr as <signed>integer) AS pfr,
|
||||||
|
cast(hp2.street0_3BChance as <signed>integer) AS TB_opp_0,
|
||||||
|
cast(hp2.street0_3BDone as <signed>integer) AS TB_0,
|
||||||
|
cast(hp2.street1Seen as <signed>integer) AS saw_f,
|
||||||
|
cast(hp2.street1Seen as <signed>integer) AS saw_1,
|
||||||
|
cast(hp2.street2Seen as <signed>integer) AS saw_2,
|
||||||
|
cast(hp2.street3Seen as <signed>integer) AS saw_3,
|
||||||
|
cast(hp2.street4Seen as <signed>integer) AS saw_4,
|
||||||
|
cast(hp2.sawShowdown as <signed>integer) AS sd,
|
||||||
|
cast(hp2.street1Aggr as <signed>integer) AS aggr_1,
|
||||||
|
cast(hp2.street2Aggr as <signed>integer) AS aggr_2,
|
||||||
|
cast(hp2.street3Aggr as <signed>integer) AS aggr_3,
|
||||||
|
cast(hp2.street4Aggr as <signed>integer) AS aggr_4,
|
||||||
|
cast(hp2.otherRaisedStreet1 as <signed>integer) AS was_raised_1,
|
||||||
|
cast(hp2.otherRaisedStreet2 as <signed>integer) AS was_raised_2,
|
||||||
|
cast(hp2.otherRaisedStreet3 as <signed>integer) AS was_raised_3,
|
||||||
|
cast(hp2.otherRaisedStreet4 as <signed>integer) AS was_raised_4,
|
||||||
|
cast(hp2.foldToOtherRaisedStreet1 as <signed>integer) AS f_freq_1,
|
||||||
|
cast(hp2.foldToOtherRaisedStreet2 as <signed>integer) AS f_freq_2,
|
||||||
|
cast(hp2.foldToOtherRaisedStreet3 as <signed>integer) AS f_freq_3,
|
||||||
|
cast(hp2.foldToOtherRaisedStreet4 as <signed>integer) AS f_freq_4,
|
||||||
|
cast(hp2.wonWhenSeenStreet1 as <signed>integer) AS w_w_s_1,
|
||||||
|
cast(hp2.wonAtSD as <signed>integer) AS wmsd,
|
||||||
|
cast(hp2.stealAttemptChance as <signed>integer) AS steal_opp,
|
||||||
|
cast(hp2.stealAttempted as <signed>integer) AS steal,
|
||||||
|
cast(hp2.foldSbToStealChance as <signed>integer) AS SBstolen,
|
||||||
|
cast(hp2.foldedSbToSteal as <signed>integer) AS SBnotDef,
|
||||||
|
cast(hp2.foldBbToStealChance as <signed>integer) AS BBstolen,
|
||||||
|
cast(hp2.foldedBbToSteal as <signed>integer) AS BBnotDef,
|
||||||
|
cast(hp2.street1CBChance as <signed>integer) AS CB_opp_1,
|
||||||
|
cast(hp2.street1CBDone as <signed>integer) AS CB_1,
|
||||||
|
cast(hp2.street2CBChance as <signed>integer) AS CB_opp_2,
|
||||||
|
cast(hp2.street2CBDone as <signed>integer) AS CB_2,
|
||||||
|
cast(hp2.street3CBChance as <signed>integer) AS CB_opp_3,
|
||||||
|
cast(hp2.street3CBDone as <signed>integer) AS CB_3,
|
||||||
|
cast(hp2.street4CBChance as <signed>integer) AS CB_opp_4,
|
||||||
|
cast(hp2.street4CBDone as <signed>integer) AS CB_4,
|
||||||
|
cast(hp2.foldToStreet1CBChance as <signed>integer) AS f_cb_opp_1,
|
||||||
|
cast(hp2.foldToStreet1CBDone as <signed>integer) AS f_cb_1,
|
||||||
|
cast(hp2.foldToStreet2CBChance as <signed>integer) AS f_cb_opp_2,
|
||||||
|
cast(hp2.foldToStreet2CBDone as <signed>integer) AS f_cb_2,
|
||||||
|
cast(hp2.foldToStreet3CBChance as <signed>integer) AS f_cb_opp_3,
|
||||||
|
cast(hp2.foldToStreet3CBDone as <signed>integer) AS f_cb_3,
|
||||||
|
cast(hp2.foldToStreet4CBChance as <signed>integer) AS f_cb_opp_4,
|
||||||
|
cast(hp2.foldToStreet4CBDone as <signed>integer) AS f_cb_4,
|
||||||
|
cast(hp2.totalProfit as <signed>integer) AS net,
|
||||||
|
cast(hp2.street1CheckCallRaiseChance as <signed>integer) AS ccr_opp_1,
|
||||||
|
cast(hp2.street1CheckCallRaiseDone as <signed>integer) AS ccr_1,
|
||||||
|
cast(hp2.street2CheckCallRaiseChance as <signed>integer) AS ccr_opp_2,
|
||||||
|
cast(hp2.street2CheckCallRaiseDone as <signed>integer) AS ccr_2,
|
||||||
|
cast(hp2.street3CheckCallRaiseChance as <signed>integer) AS ccr_opp_3,
|
||||||
|
cast(hp2.street3CheckCallRaiseDone as <signed>integer) AS ccr_3,
|
||||||
|
cast(hp2.street4CheckCallRaiseChance as <signed>integer) AS ccr_opp_4,
|
||||||
|
cast(hp2.street4CheckCallRaiseDone as <signed>integer) AS ccr_4
|
||||||
|
FROM Hands h /* this hand */
|
||||||
|
INNER JOIN Hands h2 ON ( h2.id > %s /* other hands */
|
||||||
|
AND h2.tableName = h.tableName)
|
||||||
|
INNER JOIN HandsPlayers hp ON (h.id = hp.handId) /* players in this hand */
|
||||||
|
INNER JOIN HandsPlayers hp2 ON ( hp2.playerId+0 = hp.playerId+0
|
||||||
|
AND hp2.handId = h2.id) /* other hands by these players */
|
||||||
|
INNER JOIN Players p ON (p.id = hp2.PlayerId+0)
|
||||||
|
WHERE h.id = %s
|
||||||
|
/* check activeseats once this data returned? (don't want to do that here as it might
|
||||||
|
assume a session ended just because the number of seats dipped for a few hands)
|
||||||
|
*/
|
||||||
|
ORDER BY h.handStart desc, hp2.PlayerId
|
||||||
|
/* order rows by handstart descending so that we can stop reading rows when
|
||||||
|
there's a gap over X minutes between hands (ie. when we get back to start of
|
||||||
|
the session */
|
||||||
|
"""
|
||||||
|
|
||||||
self.query['get_players_from_hand'] = """
|
self.query['get_players_from_hand'] = """
|
||||||
SELECT HandsPlayers.playerId, seatNo, name
|
SELECT HandsPlayers.playerId, seatNo, name
|
||||||
FROM HandsPlayers INNER JOIN Players ON (HandsPlayers.playerId = Players.id)
|
FROM HandsPlayers INNER JOIN Players ON (HandsPlayers.playerId = Players.id)
|
||||||
|
@ -392,6 +560,18 @@ class Sql:
|
||||||
AND HandsActions.handsPlayerId = HandsPlayers.id
|
AND HandsActions.handsPlayerId = HandsPlayers.id
|
||||||
ORDER BY street, actionno
|
ORDER BY street, actionno
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
if db_server == 'mysql':
|
||||||
|
self.query['get_hand_1day_ago'] = """
|
||||||
|
select coalesce(max(id),0)
|
||||||
|
from hands
|
||||||
|
where handstart < date_sub(utc_timestamp(), interval '1' day)"""
|
||||||
|
else: # assume postgresql
|
||||||
|
self.query['get_hand_1day_ago'] = """
|
||||||
|
select coalesce(max(id),0)
|
||||||
|
from hands
|
||||||
|
where handstart < now() at time zone 'UTC' - interval '1 day'"""
|
||||||
|
|
||||||
if __name__== "__main__":
|
if __name__== "__main__":
|
||||||
# just print the default queries and exit
|
# just print the default queries and exit
|
||||||
s = Sql(game = 'razz', type = 'ptracks')
|
s = Sql(game = 'razz', type = 'ptracks')
|
||||||
|
|
|
@ -375,7 +375,7 @@ class fpdb:
|
||||||
self.db.db.rollback()
|
self.db.db.rollback()
|
||||||
#end def load_profile
|
#end def load_profile
|
||||||
|
|
||||||
def not_implemented(self, widget, data):
|
def not_implemented(self, widget, data=None):
|
||||||
print "todo: called unimplemented menu entry (users: pls ignore this)"#remove this once more entries are implemented
|
print "todo: called unimplemented menu entry (users: pls ignore this)"#remove this once more entries are implemented
|
||||||
#end def not_implemented
|
#end def not_implemented
|
||||||
|
|
||||||
|
|
|
@ -226,7 +226,7 @@ class Importer:
|
||||||
#if os.path.isdir(file):
|
#if os.path.isdir(file):
|
||||||
#self.import_file_dict(file, self.filelist[file][0], self.filelist[file][1])
|
#self.import_file_dict(file, self.filelist[file][0], self.filelist[file][1])
|
||||||
else:
|
else:
|
||||||
removeFromFileList[file] = True
|
self.removeFromFileList[file] = True
|
||||||
self.addToDirList = filter(lambda x: self.addImportDirectory(x, True, self.addToDirList[x][0], self.addToDirList[x][1]), self.addToDirList)
|
self.addToDirList = filter(lambda x: self.addImportDirectory(x, True, self.addToDirList[x][0], self.addToDirList[x][1]), self.addToDirList)
|
||||||
|
|
||||||
for file in self.removeFromFileList:
|
for file in self.removeFromFileList:
|
||||||
|
@ -303,7 +303,8 @@ class Importer:
|
||||||
try: # sometimes we seem to be getting an empty self.lines, in which case, we just want to return.
|
try: # sometimes we seem to be getting an empty self.lines, in which case, we just want to return.
|
||||||
firstline = self.lines[0]
|
firstline = self.lines[0]
|
||||||
except:
|
except:
|
||||||
print "DEBUG: import_fpdb_file: failed on self.lines[0]: '%s' '%s' '%s' '%s' " %( file, site, self.lines, loc)
|
# just skip the debug message and return silently:
|
||||||
|
#print "DEBUG: import_fpdb_file: failed on self.lines[0]: '%s' '%s' '%s' '%s' " %( file, site, self.lines, loc)
|
||||||
return (0,0,0,1,0)
|
return (0,0,0,1,0)
|
||||||
|
|
||||||
if firstline.find("Tournament Summary")!=-1:
|
if firstline.find("Tournament Summary")!=-1:
|
||||||
|
|
|
@ -54,7 +54,7 @@ def ring_stud(config, backend, db, cursor, base, category, site_hand_no, gametyp
|
||||||
,start_cashes, antes, card_values
|
,start_cashes, antes, card_values
|
||||||
,card_suits, winnings, rakes, seatNos)
|
,card_suits, winnings, rakes, seatNos)
|
||||||
|
|
||||||
fpdb_simple.storeHudCache(backend, cursor, base, category, gametype_id, player_ids, hudImportData)
|
fpdb_simple.storeHudCache(backend, cursor, base, category, gametype_id, hand_start_time, player_ids, hudImportData)
|
||||||
|
|
||||||
if saveActions:
|
if saveActions:
|
||||||
fpdb_simple.storeActions(cursor, hands_players_ids, action_types
|
fpdb_simple.storeActions(cursor, hands_players_ids, action_types
|
||||||
|
@ -90,9 +90,9 @@ def ring_holdem_omaha(config, backend, db, cursor, base, category, site_hand_no,
|
||||||
t4 = time()
|
t4 = time()
|
||||||
#print "ring holdem, backend=%d" % backend
|
#print "ring holdem, backend=%d" % backend
|
||||||
if fastStoreHudCache:
|
if fastStoreHudCache:
|
||||||
fpdb_simple.storeHudCache2(backend, cursor, base, category, gametype_id, player_ids, hudImportData)
|
fpdb_simple.storeHudCache2(backend, cursor, base, category, gametype_id, hand_start_time, player_ids, hudImportData)
|
||||||
else:
|
else:
|
||||||
fpdb_simple.storeHudCache(backend, cursor, base, category, gametype_id, player_ids, hudImportData)
|
fpdb_simple.storeHudCache(backend, cursor, base, category, gametype_id, hand_start_time, player_ids, hudImportData)
|
||||||
t5 = time()
|
t5 = time()
|
||||||
fpdb_simple.store_board_cards(cursor, hands_id, board_values, board_suits)
|
fpdb_simple.store_board_cards(cursor, hands_id, board_values, board_suits)
|
||||||
t6 = time()
|
t6 = time()
|
||||||
|
@ -131,9 +131,9 @@ def tourney_holdem_omaha(config, backend, db, cursor, base, category, siteTourne
|
||||||
|
|
||||||
#print "tourney holdem, backend=%d" % backend
|
#print "tourney holdem, backend=%d" % backend
|
||||||
if fastStoreHudCache:
|
if fastStoreHudCache:
|
||||||
fpdb_simple.storeHudCache2(backend, cursor, base, category, gametype_id, player_ids, hudImportData)
|
fpdb_simple.storeHudCache2(backend, cursor, base, category, gametype_id, hand_start_time, player_ids, hudImportData)
|
||||||
else:
|
else:
|
||||||
fpdb_simple.storeHudCache(backend, cursor, base, category, gametype_id, player_ids, hudImportData)
|
fpdb_simple.storeHudCache(backend, cursor, base, category, gametype_id, hand_start_time, player_ids, hudImportData)
|
||||||
|
|
||||||
fpdb_simple.store_board_cards(cursor, hands_id, board_values, board_suits)
|
fpdb_simple.store_board_cards(cursor, hands_id, board_values, board_suits)
|
||||||
|
|
||||||
|
@ -165,7 +165,7 @@ def tourney_stud(config, backend, db, cursor, base, category, siteTourneyNo, buy
|
||||||
, playerIds, startCashes, antes, cardValues, cardSuits
|
, playerIds, startCashes, antes, cardValues, cardSuits
|
||||||
, winnings, rakes, seatNos, tourneys_players_ids)
|
, winnings, rakes, seatNos, tourneys_players_ids)
|
||||||
|
|
||||||
fpdb_simple.storeHudCache(backend, cursor, base, category, gametypeId, playerIds, hudImportData)
|
fpdb_simple.storeHudCache(backend, cursor, base, category, gametypeId, hand_start_time, playerIds, hudImportData)
|
||||||
|
|
||||||
if saveActions:
|
if saveActions:
|
||||||
fpdb_simple.storeActions(cursor, hands_players_ids, actionTypes, allIns, actionAmounts, actionNos)
|
fpdb_simple.storeActions(cursor, hands_players_ids, actionTypes, allIns, actionAmounts, actionNos)
|
||||||
|
|
|
@ -31,6 +31,8 @@ MYSQL_INNODB = 2
|
||||||
PGSQL = 3
|
PGSQL = 3
|
||||||
SQLITE = 4
|
SQLITE = 4
|
||||||
|
|
||||||
|
# config while trying out new hudcache mechanism
|
||||||
|
use_date_in_hudcache = True
|
||||||
|
|
||||||
# Data Structures for index and foreign key creation
|
# Data Structures for index and foreign key creation
|
||||||
# drop_code is an int with possible values: 0 - don't drop for bulk import
|
# drop_code is an int with possible values: 0 - don't drop for bulk import
|
||||||
|
@ -2407,9 +2409,15 @@ def generateFoldToCB(street, playerIDs, didStreetCB, streetCBDone, foldToStreetC
|
||||||
foldToStreetCBDone[player]=True
|
foldToStreetCBDone[player]=True
|
||||||
#end def generateFoldToCB
|
#end def generateFoldToCB
|
||||||
|
|
||||||
def storeHudCache(backend, cursor, base, category, gametypeId, playerIds, hudImportData):
|
def storeHudCache(backend, cursor, base, category, gametypeId, hand_start_time, playerIds, hudImportData):
|
||||||
"""Modified version aiming for more speed ..."""
|
"""Modified version aiming for more speed ..."""
|
||||||
# if (category=="holdem" or category=="omahahi" or category=="omahahilo"):
|
# if (category=="holdem" or category=="omahahi" or category=="omahahilo"):
|
||||||
|
if use_date_in_hudcache:
|
||||||
|
#print "key =", "d%02d%02d%02d " % (hand_start_time.year-2000, hand_start_time.month, hand_start_time.day)
|
||||||
|
styleKey = "d%02d%02d%02d" % (hand_start_time.year-2000, hand_start_time.month, hand_start_time.day)
|
||||||
|
else:
|
||||||
|
# hard-code styleKey as 'A000000' (all-time cache, no key) for now
|
||||||
|
styleKey = 'A000000'
|
||||||
|
|
||||||
#print "storeHudCache, len(playerIds)=", len(playerIds), " len(vpip)=" \
|
#print "storeHudCache, len(playerIds)=", len(playerIds), " len(vpip)=" \
|
||||||
#, len(hudImportData['street0VPI']), " len(totprof)=", len(hudImportData['totalProfit'])
|
#, len(hudImportData['street0VPI']), " len(totprof)=", len(hudImportData['totalProfit'])
|
||||||
|
@ -2525,7 +2533,9 @@ WHERE gametypeId+0=%s
|
||||||
AND playerId=%s
|
AND playerId=%s
|
||||||
AND activeSeats=%s
|
AND activeSeats=%s
|
||||||
AND position=%s
|
AND position=%s
|
||||||
AND tourneyTypeId+0=%s""", (row[6], row[7], row[8], row[9], row[10],
|
AND tourneyTypeId+0=%s
|
||||||
|
AND styleKey=%s
|
||||||
|
""", (row[6], row[7], row[8], row[9], row[10],
|
||||||
row[11], row[12], row[13], row[14], row[15],
|
row[11], row[12], row[13], row[14], row[15],
|
||||||
row[16], row[17], row[18], row[19], row[20],
|
row[16], row[17], row[18], row[19], row[20],
|
||||||
row[21], row[22], row[23], row[24], row[25],
|
row[21], row[22], row[23], row[24], row[25],
|
||||||
|
@ -2536,7 +2546,7 @@ AND tourneyTypeId+0=%s""", (row[6], row[7], row[8], row[9], row[10],
|
||||||
row[46], row[47], row[48], row[49], row[50],
|
row[46], row[47], row[48], row[49], row[50],
|
||||||
row[51], row[52], row[53], row[54], row[55],
|
row[51], row[52], row[53], row[54], row[55],
|
||||||
row[56], row[57], row[58], row[59], row[60],
|
row[56], row[57], row[58], row[59], row[60],
|
||||||
row[1], row[2], row[3], str(row[4]), row[5]))
|
row[1], row[2], row[3], str(row[4]), row[5], styleKey))
|
||||||
# Test statusmessage to see if update worked, do insert if not
|
# Test statusmessage to see if update worked, do insert if not
|
||||||
#print "storehud2, upd num =", num
|
#print "storehud2, upd num =", num
|
||||||
if ( (backend == PGSQL and cursor.statusmessage != "UPDATE 1")
|
if ( (backend == PGSQL and cursor.statusmessage != "UPDATE 1")
|
||||||
|
@ -2567,8 +2577,7 @@ VALUES (%s, %s, %s, %s, %s, %s,
|
||||||
%s, %s, %s, %s, %s,
|
%s, %s, %s, %s, %s,
|
||||||
%s, %s, %s, %s, %s,
|
%s, %s, %s, %s, %s,
|
||||||
%s, %s, %s, %s, %s)"""
|
%s, %s, %s, %s, %s)"""
|
||||||
# hard-code styleKey as 'A000000' (all-time cache, no key) for now
|
, (row[1], row[2], row[3], row[4], row[5], styleKey, row[6], row[7], row[8], row[9], row[10]
|
||||||
, (row[1], row[2], row[3], row[4], row[5], 'A000000', row[6], row[7], row[8], row[9], row[10]
|
|
||||||
,row[11], row[12], row[13], row[14], row[15], row[16], row[17], row[18], row[19], row[20]
|
,row[11], row[12], row[13], row[14], row[15], row[16], row[17], row[18], row[19], row[20]
|
||||||
,row[21], row[22], row[23], row[24], row[25], row[26], row[27], row[28], row[29], row[30]
|
,row[21], row[22], row[23], row[24], row[25], row[26], row[27], row[28], row[29], row[30]
|
||||||
,row[31], row[32], row[33], row[34], row[35], row[36], row[37], row[38], row[39], row[40]
|
,row[31], row[32], row[33], row[34], row[35], row[36], row[37], row[38], row[39], row[40]
|
||||||
|
@ -2583,11 +2592,17 @@ VALUES (%s, %s, %s, %s, %s, %s,
|
||||||
# print "todo: implement storeHudCache for stud base"
|
# print "todo: implement storeHudCache for stud base"
|
||||||
#end def storeHudCache
|
#end def storeHudCache
|
||||||
|
|
||||||
def storeHudCache2(backend, cursor, base, category, gametypeId, playerIds, hudImportData):
|
def storeHudCache2(backend, cursor, base, category, gametypeId, hand_start_time, playerIds, hudImportData):
|
||||||
"""Modified version aiming for more speed ..."""
|
"""Modified version aiming for more speed ..."""
|
||||||
# if (category=="holdem" or category=="omahahi" or category=="omahahilo"):
|
# if (category=="holdem" or category=="omahahi" or category=="omahahilo"):
|
||||||
|
if use_date_in_hudcache:
|
||||||
|
#print "key =", "d%02d%02d%02d " % (hand_start_time.year-2000, hand_start_time.month, hand_start_time.day)
|
||||||
|
styleKey = "d%02d%02d%02d" % (hand_start_time.year-2000, hand_start_time.month, hand_start_time.day)
|
||||||
|
else:
|
||||||
|
# hard-code styleKey as 'A000000' (all-time cache, no key) for now
|
||||||
|
styleKey = 'A000000'
|
||||||
|
|
||||||
#print "storeHudCache, len(playerIds)=", len(playerIds), " len(vpip)=" \
|
#print "storeHudCache2, len(playerIds)=", len(playerIds), " len(vpip)=" \
|
||||||
#, len(hudImportData['street0VPI']), " len(totprof)=", len(hudImportData['totalProfit'])
|
#, len(hudImportData['street0VPI']), " len(totprof)=", len(hudImportData['totalProfit'])
|
||||||
for player in xrange(len(playerIds)):
|
for player in xrange(len(playerIds)):
|
||||||
|
|
||||||
|
@ -2701,7 +2716,9 @@ WHERE gametypeId+0=%s
|
||||||
AND playerId=%s
|
AND playerId=%s
|
||||||
AND activeSeats=%s
|
AND activeSeats=%s
|
||||||
AND position=%s
|
AND position=%s
|
||||||
AND tourneyTypeId+0=%s""", (row[6], row[7], row[8], row[9], row[10],
|
AND tourneyTypeId+0=%s
|
||||||
|
AND styleKey=%s
|
||||||
|
""", (row[6], row[7], row[8], row[9], row[10],
|
||||||
row[11], row[12], row[13], row[14], row[15],
|
row[11], row[12], row[13], row[14], row[15],
|
||||||
row[16], row[17], row[18], row[19], row[20],
|
row[16], row[17], row[18], row[19], row[20],
|
||||||
row[21], row[22], row[23], row[24], row[25],
|
row[21], row[22], row[23], row[24], row[25],
|
||||||
|
@ -2712,7 +2729,7 @@ AND tourneyTypeId+0=%s""", (row[6], row[7], row[8], row[9], row[10],
|
||||||
row[46], row[47], row[48], row[49], row[50],
|
row[46], row[47], row[48], row[49], row[50],
|
||||||
row[51], row[52], row[53], row[54], row[55],
|
row[51], row[52], row[53], row[54], row[55],
|
||||||
row[56], row[57], row[58], row[59], row[60],
|
row[56], row[57], row[58], row[59], row[60],
|
||||||
row[1], row[2], row[3], str(row[4]), row[5]))
|
row[1], row[2], row[3], str(row[4]), row[5], styleKey))
|
||||||
# Test statusmessage to see if update worked, do insert if not
|
# Test statusmessage to see if update worked, do insert if not
|
||||||
#print "storehud2, upd num =", num
|
#print "storehud2, upd num =", num
|
||||||
if ( (backend == PGSQL and cursor.statusmessage != "UPDATE 1")
|
if ( (backend == PGSQL and cursor.statusmessage != "UPDATE 1")
|
||||||
|
@ -2743,8 +2760,7 @@ VALUES (%s, %s, %s, %s, %s, %s,
|
||||||
%s, %s, %s, %s, %s,
|
%s, %s, %s, %s, %s,
|
||||||
%s, %s, %s, %s, %s,
|
%s, %s, %s, %s, %s,
|
||||||
%s, %s, %s, %s, %s)"""
|
%s, %s, %s, %s, %s)"""
|
||||||
# hard-code styleKey as 'A000000' (all-time cache, no key) for now
|
, (row[1], row[2], row[3], row[4], row[5], styleKey, row[6], row[7], row[8], row[9], row[10]
|
||||||
, (row[1], row[2], row[3], row[4], row[5], 'A000000', row[6], row[7], row[8], row[9], row[10]
|
|
||||||
,row[11], row[12], row[13], row[14], row[15], row[16], row[17], row[18], row[19], row[20]
|
,row[11], row[12], row[13], row[14], row[15], row[16], row[17], row[18], row[19], row[20]
|
||||||
,row[21], row[22], row[23], row[24], row[25], row[26], row[27], row[28], row[29], row[30]
|
,row[21], row[22], row[23], row[24], row[25], row[26], row[27], row[28], row[29], row[30]
|
||||||
,row[31], row[32], row[33], row[34], row[35], row[36], row[37], row[38], row[39], row[40]
|
,row[31], row[32], row[33], row[34], row[35], row[36], row[37], row[38], row[39], row[40]
|
||||||
|
|
Loading…
Reference in New Issue
Block a user