From 90b886e77f06105639a2b35bb9391b9254c722de Mon Sep 17 00:00:00 2001 From: sqlcoder Date: Mon, 25 May 2009 21:30:37 +0100 Subject: [PATCH 1/4] another parameter fix to the fpdb.py gui update --- pyfpdb/fpdb.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyfpdb/fpdb.py b/pyfpdb/fpdb.py index 66ed87cf..70ece5e4 100755 --- a/pyfpdb/fpdb.py +++ b/pyfpdb/fpdb.py @@ -366,7 +366,7 @@ class fpdb: self.db.db.rollback() #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 #end def not_implemented From d41a8beacd5d12f955315b8795c8b3cfb8907644 Mon Sep 17 00:00:00 2001 From: sqlcoder Date: Wed, 27 May 2009 22:21:22 +0100 Subject: [PATCH 2/4] add self. to variable reference and comment out debug message --- pyfpdb/fpdb_import.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pyfpdb/fpdb_import.py b/pyfpdb/fpdb_import.py index 33ab49be..fbb74cec 100644 --- a/pyfpdb/fpdb_import.py +++ b/pyfpdb/fpdb_import.py @@ -226,7 +226,7 @@ class Importer: #if os.path.isdir(file): #self.import_file_dict(file, self.filelist[file][0], self.filelist[file][1]) 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) 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. firstline = self.lines[0] 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) if firstline.find("Tournament Summary")!=-1: From afee4ddb8c6f5cdc315d256c014686fc42d06ef6 Mon Sep 17 00:00:00 2001 From: sqlcoder Date: Wed, 27 May 2009 22:25:29 +0100 Subject: [PATCH 3/4] minor cosmetic change to autoimport button --- pyfpdb/GuiAutoImport.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyfpdb/GuiAutoImport.py b/pyfpdb/GuiAutoImport.py index 06f4a96c..2b4c8b76 100755 --- a/pyfpdb/GuiAutoImport.py +++ b/pyfpdb/GuiAutoImport.py @@ -154,7 +154,7 @@ class GuiAutoImport (threading.Thread): # to watch. if widget.get_active(): # toggled on self.doAutoImportBool = True - widget.set_label(u'Stop Autoimport') + widget.set_label(u' _Stop Autoimport ') if self.pipe_to_hud is None: if os.name == 'nt': command = "python HUD_main.py" + " %s" % (self.database) @@ -190,7 +190,7 @@ class GuiAutoImport (threading.Thread): #print >>self.pipe_to_hud.stdin, "\n" self.pipe_to_hud.communicate('\n') # waits for process to terminate self.pipe_to_hud = None - self.startButton.set_label(u'Start Autoimport') + self.startButton.set_label(u' _Start Autoimport ') From 060c102843b5baeef2b76cda06eb04f43e3562f7 Mon Sep 17 00:00:00 2001 From: sqlcoder Date: Wed, 27 May 2009 23:34:10 +0100 Subject: [PATCH 4/4] changes to store date in hudcache.stylekey and display all-time / session / n days stats in hud --- pyfpdb/Database.py | 104 ++++++++++++++++++-- pyfpdb/SQL.py | 200 ++++++++++++++++++++++++++++++++++++-- pyfpdb/fpdb_save_to_db.py | 12 +-- pyfpdb/fpdb_simple.py | 38 +++++--- 4 files changed, 318 insertions(+), 36 deletions(-) diff --git a/pyfpdb/Database.py b/pyfpdb/Database.py index 88f7edd5..ca4e5996 100644 --- a/pyfpdb/Database.py +++ b/pyfpdb/Database.py @@ -26,6 +26,7 @@ Create and manage the database objects. # Standard Library modules import sys import traceback +from datetime import datetime, date, time, timedelta # pyGTK modules @@ -77,10 +78,40 @@ class Database: print "press enter to continue" sys.exit() + self.db_server = c.supported_databases[db_name].db_server 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() + # 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): self.connection.close() @@ -191,16 +222,25 @@ class Database: winners[row[0]] = row[1] 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() - if aggregate: - query = 'get_stats_from_hand_aggregated' - else: - query = 'get_stats_from_hand' - subs = (hand, hand, stylekey, stylekey) - -# now get the stats +# now get the stats c.execute(self.sql.query[query], subs) colnames = [desc[0] for desc in c.description] stat_dict = {} @@ -210,6 +250,52 @@ class Database: t_dict[name.lower()] = val # print 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 ') + else: + query = query.replace("", '') + 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 def get_player_id(self, config, site, player_name): diff --git a/pyfpdb/SQL.py b/pyfpdb/SQL.py index 02193287..18d7d116 100644 --- a/pyfpdb/SQL.py +++ b/pyfpdb/SQL.py @@ -29,7 +29,7 @@ Set up all of the SQL statements for a given game and database type. class Sql: - def __init__(self, game = 'holdem', type = 'PT3'): + def __init__(self, game = 'holdem', type = 'PT3', db_server = 'mysql'): self.query = {} ############################################################################ @@ -175,7 +175,6 @@ class Sql: SELECT hc.playerId AS player_id, hp.seatNo AS seat, p.name AS screen_name, - hc.styleKey AS stylekey, sum(hc.HDs) AS n, sum(hc.street0VPI) AS vpip, sum(hc.street0Aggr) AS pfr, @@ -238,10 +237,16 @@ class Sql: AND hc.gametypeId+0 = h.gametypeId+0) INNER JOIN Players p ON (p.id = hp.PlayerId+0) WHERE h.id = %s - AND (hc.styleKey = %s or %s = 'ALL') /* styleKey should be passed in twice */ - /* This allows the caller to query only a particular stylekey or all, - e.g. may want to use different values for Hero and others */ - GROUP BY hc.PlayerId, hp.seatNo, p.name, hc.styleKey + AND hc.styleKey > %s + /* styleKey is currently 'd' (for date) followed by a yyyymmdd + 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 > 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 @@ -252,7 +257,6 @@ class Sql: else -1 end) AS seat, p.name AS screen_name, - hc.styleKey AS stylekey, sum(hc.HDs) AS n, sum(hc.street0VPI) AS vpip, sum(hc.street0Aggr) AS pfr, @@ -314,9 +318,15 @@ class Sql: INNER JOIN HudCache hc ON (hc.playerId = hp.playerId) INNER JOIN Players p ON (p.id = hc.playerId) WHERE h.id = %s - AND (hc.styleKey = %s or %s = 'ALL') /* styleKey should be passed in twice */ - /* This allows the caller to query only a particular stylekey or all, - e.g. may want to use different values for Hero and others */ + AND hc.styleKey > %s + /* styleKey is currently 'd' (for date) followed by a yyyymmdd + 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 (SELECT gt1.id from Gametypes gt1, Gametypes gt2 WHERE gt1.siteid = gt2.siteid @@ -326,6 +336,164 @@ class Sql: AND gt2.id = h.gametypeId) 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 integer) AS vpip, + cast(hp2.street0Aggr as integer) AS pfr, + cast(hp2.street0_3BChance as integer) AS TB_opp_0, + cast(hp2.street0_3BDone as integer) AS TB_0, + cast(hp2.street1Seen as integer) AS saw_f, + cast(hp2.street1Seen as integer) AS saw_1, + cast(hp2.street2Seen as integer) AS saw_2, + cast(hp2.street3Seen as integer) AS saw_3, + cast(hp2.street4Seen as integer) AS saw_4, + cast(hp2.sawShowdown as integer) AS sd, + cast(hp2.street1Aggr as integer) AS aggr_1, + cast(hp2.street2Aggr as integer) AS aggr_2, + cast(hp2.street3Aggr as integer) AS aggr_3, + cast(hp2.street4Aggr as integer) AS aggr_4, + cast(hp2.otherRaisedStreet1 as integer) AS was_raised_1, + cast(hp2.otherRaisedStreet2 as integer) AS was_raised_2, + cast(hp2.otherRaisedStreet3 as integer) AS was_raised_3, + cast(hp2.otherRaisedStreet4 as integer) AS was_raised_4, + cast(hp2.foldToOtherRaisedStreet1 as integer) AS f_freq_1, + cast(hp2.foldToOtherRaisedStreet2 as integer) AS f_freq_2, + cast(hp2.foldToOtherRaisedStreet3 as integer) AS f_freq_3, + cast(hp2.foldToOtherRaisedStreet4 as integer) AS f_freq_4, + cast(hp2.wonWhenSeenStreet1 as integer) AS w_w_s_1, + cast(hp2.wonAtSD as integer) AS wmsd, + cast(hp2.stealAttemptChance as integer) AS steal_opp, + cast(hp2.stealAttempted as integer) AS steal, + cast(hp2.foldSbToStealChance as integer) AS SBstolen, + cast(hp2.foldedSbToSteal as integer) AS SBnotDef, + cast(hp2.foldBbToStealChance as integer) AS BBstolen, + cast(hp2.foldedBbToSteal as integer) AS BBnotDef, + cast(hp2.street1CBChance as integer) AS CB_opp_1, + cast(hp2.street1CBDone as integer) AS CB_1, + cast(hp2.street2CBChance as integer) AS CB_opp_2, + cast(hp2.street2CBDone as integer) AS CB_2, + cast(hp2.street3CBChance as integer) AS CB_opp_3, + cast(hp2.street3CBDone as integer) AS CB_3, + cast(hp2.street4CBChance as integer) AS CB_opp_4, + cast(hp2.street4CBDone as integer) AS CB_4, + cast(hp2.foldToStreet1CBChance as integer) AS f_cb_opp_1, + cast(hp2.foldToStreet1CBDone as integer) AS f_cb_1, + cast(hp2.foldToStreet2CBChance as integer) AS f_cb_opp_2, + cast(hp2.foldToStreet2CBDone as integer) AS f_cb_2, + cast(hp2.foldToStreet3CBChance as integer) AS f_cb_opp_3, + cast(hp2.foldToStreet3CBDone as integer) AS f_cb_3, + cast(hp2.foldToStreet4CBChance as integer) AS f_cb_opp_4, + cast(hp2.foldToStreet4CBDone as integer) AS f_cb_4, + cast(hp2.totalProfit as integer) AS net, + cast(hp2.street1CheckCallRaiseChance as integer) AS ccr_opp_1, + cast(hp2.street1CheckCallRaiseDone as integer) AS ccr_1, + cast(hp2.street2CheckCallRaiseChance as integer) AS ccr_opp_2, + cast(hp2.street2CheckCallRaiseDone as integer) AS ccr_2, + cast(hp2.street3CheckCallRaiseChance as integer) AS ccr_opp_3, + cast(hp2.street3CheckCallRaiseDone as integer) AS ccr_3, + cast(hp2.street4CheckCallRaiseChance as integer) AS ccr_opp_4, + cast(hp2.street4CheckCallRaiseDone as 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 integer) AS vpip, + cast(hp2.street0Aggr as integer) AS pfr, + cast(hp2.street0_3BChance as integer) AS TB_opp_0, + cast(hp2.street0_3BDone as integer) AS TB_0, + cast(hp2.street1Seen as integer) AS saw_f, + cast(hp2.street1Seen as integer) AS saw_1, + cast(hp2.street2Seen as integer) AS saw_2, + cast(hp2.street3Seen as integer) AS saw_3, + cast(hp2.street4Seen as integer) AS saw_4, + cast(hp2.sawShowdown as integer) AS sd, + cast(hp2.street1Aggr as integer) AS aggr_1, + cast(hp2.street2Aggr as integer) AS aggr_2, + cast(hp2.street3Aggr as integer) AS aggr_3, + cast(hp2.street4Aggr as integer) AS aggr_4, + cast(hp2.otherRaisedStreet1 as integer) AS was_raised_1, + cast(hp2.otherRaisedStreet2 as integer) AS was_raised_2, + cast(hp2.otherRaisedStreet3 as integer) AS was_raised_3, + cast(hp2.otherRaisedStreet4 as integer) AS was_raised_4, + cast(hp2.foldToOtherRaisedStreet1 as integer) AS f_freq_1, + cast(hp2.foldToOtherRaisedStreet2 as integer) AS f_freq_2, + cast(hp2.foldToOtherRaisedStreet3 as integer) AS f_freq_3, + cast(hp2.foldToOtherRaisedStreet4 as integer) AS f_freq_4, + cast(hp2.wonWhenSeenStreet1 as integer) AS w_w_s_1, + cast(hp2.wonAtSD as integer) AS wmsd, + cast(hp2.stealAttemptChance as integer) AS steal_opp, + cast(hp2.stealAttempted as integer) AS steal, + cast(hp2.foldSbToStealChance as integer) AS SBstolen, + cast(hp2.foldedSbToSteal as integer) AS SBnotDef, + cast(hp2.foldBbToStealChance as integer) AS BBstolen, + cast(hp2.foldedBbToSteal as integer) AS BBnotDef, + cast(hp2.street1CBChance as integer) AS CB_opp_1, + cast(hp2.street1CBDone as integer) AS CB_1, + cast(hp2.street2CBChance as integer) AS CB_opp_2, + cast(hp2.street2CBDone as integer) AS CB_2, + cast(hp2.street3CBChance as integer) AS CB_opp_3, + cast(hp2.street3CBDone as integer) AS CB_3, + cast(hp2.street4CBChance as integer) AS CB_opp_4, + cast(hp2.street4CBDone as integer) AS CB_4, + cast(hp2.foldToStreet1CBChance as integer) AS f_cb_opp_1, + cast(hp2.foldToStreet1CBDone as integer) AS f_cb_1, + cast(hp2.foldToStreet2CBChance as integer) AS f_cb_opp_2, + cast(hp2.foldToStreet2CBDone as integer) AS f_cb_2, + cast(hp2.foldToStreet3CBChance as integer) AS f_cb_opp_3, + cast(hp2.foldToStreet3CBDone as integer) AS f_cb_3, + cast(hp2.foldToStreet4CBChance as integer) AS f_cb_opp_4, + cast(hp2.foldToStreet4CBDone as integer) AS f_cb_4, + cast(hp2.totalProfit as integer) AS net, + cast(hp2.street1CheckCallRaiseChance as integer) AS ccr_opp_1, + cast(hp2.street1CheckCallRaiseDone as integer) AS ccr_1, + cast(hp2.street2CheckCallRaiseChance as integer) AS ccr_opp_2, + cast(hp2.street2CheckCallRaiseDone as integer) AS ccr_2, + cast(hp2.street3CheckCallRaiseChance as integer) AS ccr_opp_3, + cast(hp2.street3CheckCallRaiseDone as integer) AS ccr_3, + cast(hp2.street4CheckCallRaiseChance as integer) AS ccr_opp_4, + cast(hp2.street4CheckCallRaiseDone as 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'] = """ SELECT HandsPlayers.playerId, seatNo, name @@ -392,6 +560,18 @@ class Sql: AND HandsActions.handsPlayerId = HandsPlayers.id 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__": # just print the default queries and exit s = Sql(game = 'razz', type = 'ptracks') diff --git a/pyfpdb/fpdb_save_to_db.py b/pyfpdb/fpdb_save_to_db.py index cfc820c6..0dbcbf61 100644 --- a/pyfpdb/fpdb_save_to_db.py +++ b/pyfpdb/fpdb_save_to_db.py @@ -54,7 +54,7 @@ def ring_stud(config, backend, db, cursor, base, category, site_hand_no, gametyp ,start_cashes, antes, card_values ,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: 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() #print "ring holdem, backend=%d" % backend 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: - 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() fpdb_simple.store_board_cards(cursor, hands_id, board_values, board_suits) t6 = time() @@ -131,9 +131,9 @@ def tourney_holdem_omaha(config, backend, db, cursor, base, category, siteTourne #print "tourney holdem, backend=%d" % backend 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: - 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) @@ -165,7 +165,7 @@ def tourney_stud(config, backend, db, cursor, base, category, siteTourneyNo, buy , playerIds, startCashes, antes, cardValues, cardSuits , 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: fpdb_simple.storeActions(cursor, hands_players_ids, actionTypes, allIns, actionAmounts, actionNos) diff --git a/pyfpdb/fpdb_simple.py b/pyfpdb/fpdb_simple.py index d3a1712c..e4471e24 100644 --- a/pyfpdb/fpdb_simple.py +++ b/pyfpdb/fpdb_simple.py @@ -31,6 +31,8 @@ MYSQL_INNODB = 2 PGSQL = 3 SQLITE = 4 +# config while trying out new hudcache mechanism +use_date_in_hudcache = True # Data Structures for index and foreign key creation # 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 #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 ...""" # 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)=" \ #, len(hudImportData['street0VPI']), " len(totprof)=", len(hudImportData['totalProfit']) @@ -2525,7 +2533,9 @@ WHERE gametypeId+0=%s AND playerId=%s AND activeSeats=%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[16], row[17], row[18], row[19], row[20], 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[51], row[52], row[53], row[54], row[55], 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 #print "storehud2, upd num =", num 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)""" - # hard-code styleKey as 'A000000' (all-time cache, no key) for now - , (row[1], row[2], row[3], row[4], row[5], 'A000000', row[6], row[7], row[8], row[9], row[10] + , (row[1], row[2], row[3], row[4], row[5], styleKey, 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[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] @@ -2583,11 +2592,17 @@ VALUES (%s, %s, %s, %s, %s, %s, # print "todo: implement storeHudCache for stud base" #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 ...""" # 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']) for player in xrange(len(playerIds)): @@ -2701,7 +2716,9 @@ WHERE gametypeId+0=%s AND playerId=%s AND activeSeats=%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[16], row[17], row[18], row[19], row[20], 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[51], row[52], row[53], row[54], row[55], 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 #print "storehud2, upd num =", num 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)""" - # hard-code styleKey as 'A000000' (all-time cache, no key) for now - , (row[1], row[2], row[3], row[4], row[5], 'A000000', row[6], row[7], row[8], row[9], row[10] + , (row[1], row[2], row[3], row[4], row[5], styleKey, 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[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]