diff --git a/pyfpdb/AbsoluteToFpdb.py b/pyfpdb/AbsoluteToFpdb.py index 503c1f4e..e8ac53ff 100644 --- a/pyfpdb/AbsoluteToFpdb.py +++ b/pyfpdb/AbsoluteToFpdb.py @@ -26,6 +26,12 @@ from HandHistoryConverter import * # Class for converting Absolute HH format. class Absolute(HandHistoryConverter): + + # Class Variables + sitename = "Absolute" + filetype = "text" + codepage = "cp1252" + siteid = 8 # Static regexes re_SplitHands = re.compile(r"\n\n\n+") @@ -48,24 +54,6 @@ class Absolute(HandHistoryConverter): # re_Board = re.compile(ur"\[ (?P.+) \]") - def __init__(self, in_path = '-', out_path = '-', follow = False, autostart=True, debugging=False, index=0): - """\ -in_path (default '-' = sys.stdin) -out_path (default '-' = sys.stdout) -follow : whether to tail -f the input -autostart: whether to run the thread (or you can call start() yourself) -debugging: if False, pass on partially supported game types. If true, have a go and error...""" - #print "DEBUG: XXXXXXXXXXXXXXX" - HandHistoryConverter.__init__(self, in_path, out_path, sitename="Absolute", follow=follow, index=index) - logging.info("Initialising Absolute converter class") - self.filetype = "text" - self.codepage = "cp1252" - self.siteId = 8 # Needs to match id entry in Sites database - self.debugging = debugging - if autostart: - self.start() - # otherwise you need to call start yourself. - def compilePlayerRegexs(self, hand): players = set([player[1] for player in hand.players]) if not players <= self.compiledPlayers: # x <= y means 'x is subset of y' diff --git a/pyfpdb/Database.py b/pyfpdb/Database.py index 45de48e0..060c8dd7 100755 --- a/pyfpdb/Database.py +++ b/pyfpdb/Database.py @@ -1150,11 +1150,16 @@ class Database: boardcard2, boardcard3, boardcard4, - boardcard5 + boardcard5, + street1Pot, + street2Pot, + street3Pot, + street4Pot, + showdownPot ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, - %s, %s)""" + %s, %s, %s, %s, %s, %s, %s)""" #--- texture, #-- playersVpi, #-- playersAtStreet1, @@ -1167,11 +1172,6 @@ class Database: #-- street2Raises, #-- street3Raises, #-- street4Raises, -#-- street1Pot, -#-- street2Pot, -#-- street3Pot, -#-- street4Pot, -#-- showdownPot #-- seats, q = q.replace('%s', self.sql.query['placeholder']) @@ -1190,7 +1190,7 @@ class Database: p['boardcard2'], p['boardcard3'], p['boardcard4'], - p['boardcard5']) + p['boardcard5'], # hudCache['playersVpi'], # hudCache['playersAtStreet1'], # hudCache['playersAtStreet2'], @@ -1202,12 +1202,12 @@ class Database: # hudCache['street2Raises'], # hudCache['street3Raises'], # hudCache['street4Raises'], -# hudCache['street1Pot'], -# hudCache['street2Pot'], -# hudCache['street3Pot'], -# hudCache['street4Pot'], -# hudCache['showdownPot'] - ) + p['street1Pot'], + p['street2Pot'], + p['street3Pot'], + p['street4Pot'], + p['showdownPot'] + )) #return getLastInsertId(backend, conn, cursor) # def storeHand diff --git a/pyfpdb/GuiTableViewer.py b/pyfpdb/GuiTableViewer.py index 8d25366a..cdc0e83b 100644 --- a/pyfpdb/GuiTableViewer.py +++ b/pyfpdb/GuiTableViewer.py @@ -22,7 +22,6 @@ import gtk import os import fpdb_simple - import fpdb_import import fpdb_db diff --git a/pyfpdb/Hand.py b/pyfpdb/Hand.py index 97a68b18..ab64c320 100644 --- a/pyfpdb/Hand.py +++ b/pyfpdb/Hand.py @@ -203,11 +203,6 @@ db: a connected fpdb_db object""" hh['tableName'] = self.tablename hh['maxSeats'] = self.maxseats hh['seats'] = len(sqlids) - # boardcard1 smallint, /* 0=none, 1-13=2-Ah 14-26=2-Ad 27-39=2-Ac 40-52=2-As */ - # boardcard2 smallint, - # boardcard3 smallint, - # boardcard4 smallint, - # boardcard5 smallint, # Flop turn and river may all be empty - add (likely) too many elements and trim with range boardcards = self.board['FLOP'] + self.board['TURN'] + self.board['RIVER'] + [u'0x', u'0x', u'0x', u'0x', u'0x'] cards = [Card.encodeCard(c) for c in boardcards[0:5]] @@ -217,7 +212,6 @@ db: a connected fpdb_db object""" hh['boardcard4'] = cards[3] hh['boardcard5'] = cards[4] - print hh # texture smallint, # playersVpi SMALLINT NOT NULL, /* num of players vpi */ # Needs to be recorded @@ -241,17 +235,14 @@ db: a connected fpdb_db object""" # Needs to be recorded # street4Raises TINYINT NOT NULL, /* num big bets paid to see showdown */ # Needs to be recorded - # street1Pot INT, /* pot size at flop/street4 */ - # Needs to be recorded - # street2Pot INT, /* pot size at turn/street5 */ - # Needs to be recorded - # street3Pot INT, /* pot size at river/street6 */ - # Needs to be recorded - # street4Pot INT, /* pot size at sd/street7 */ - # Needs to be recorded - # showdownPot INT, /* pot size at sd/street7 */ + + #print "DEBUG: self.getStreetTotals = (%s, %s, %s, %s, %s)" % self.getStreetTotals() + #FIXME: Pot size still in decimal, needs to be converted to cents + (hh['street1Pot'], hh['street2Pot'], hh['street3Pot'], hh['street4Pot'], hh['showdownPot']) = self.getStreetTotals() + # comment TEXT, # commentTs DATETIME + #print hh handid = db.storeHand(hh) # HandsPlayers - ? ... Do we fix winnings? # Tourneys ? @@ -489,7 +480,6 @@ Card ranks will be uppercased board = set([c for s in self.board.values() for c in s]) self.addHoleCards(holeandboard.difference(board),player,shown, mucked) - def totalPot(self): """If all bets and blinds have been added, totals up the total pot size""" @@ -573,6 +563,9 @@ Map the tuple self.gametype onto the pokerstars string describing it """Return a string of the stakes of the current hand.""" return "%s%s/%s%s" % (self.sym, self.sb, self.sym, self.bb) + def getStreetTotals(self): + pass + def writeGameLine(self): """Return the first HH line for the current hand.""" gs = "PokerStars Game #%s: " % self.handid @@ -638,6 +631,7 @@ class HoldemOmahaHand(Hand): for street in self.actionStreets: if self.streets[street]: hhc.readAction(self, street) + self.pot.markTotal(street) hhc.readCollectPot(self) hhc.readShownCards(self) self.totalPot() # finalise it (total the pot) @@ -662,6 +656,18 @@ class HoldemOmahaHand(Hand): else: self.addHoleCards('PREFLOP', player, open=[], closed=cards, shown=shown, mucked=mucked, dealt=dealt) + def getStreetTotals(self): + # street1Pot INT, /* pot size at flop/street4 */ + # street2Pot INT, /* pot size at turn/street5 */ + # street3Pot INT, /* pot size at river/street6 */ + # street4Pot INT, /* pot size at sd/street7 */ + # showdownPot INT, /* pot size at sd/street7 */ + tmp1 = self.pot.getTotalAtStreet('FLOP') + tmp2 = self.pot.getTotalAtStreet('TURN') + tmp3 = self.pot.getTotalAtStreet('RIVER') + tmp4 = 0 + tmp5 = 0 + return (tmp1,tmp2,tmp3,tmp4,tmp5) def writeHTMLHand(self, fh=sys.__stdout__): from nevow import tags as T @@ -886,6 +892,7 @@ class DrawHand(Hand): for street in self.streetList: if self.streets[street]: hhc.readAction(self, street) + self.pot.markTotal(street) hhc.readCollectPot(self) hhc.readShownCards(self) self.totalPot() # finalise it (total the pot) @@ -946,6 +953,14 @@ class DrawHand(Hand): act = (player, 'discards', num) self.actions[street].append(act) + def getStreetTotals(self): + # street1Pot INT, /* pot size at flop/street4 */ + # street2Pot INT, /* pot size at turn/street5 */ + # street3Pot INT, /* pot size at river/street6 */ + # street4Pot INT, /* pot size at sd/street7 */ + # showdownPot INT, /* pot size at sd/street7 */ + return (0,0,0,0,0) + def writeHand(self, fh=sys.__stdout__): # PokerStars format. @@ -1053,6 +1068,7 @@ class StudHand(Hand): if self.streets[street]: log.debug(street + self.streets[street]) hhc.readAction(self, street) + self.pot.markTotal(street) hhc.readCollectPot(self) hhc.readShownCards(self) # not done yet self.totalPot() # finalise it (total the pot) @@ -1123,6 +1139,14 @@ Add a complete on [street] by [player] to [amountTo] self.lastBet['THIRD'] = Decimal(bringin) self.pot.addMoney(player, Decimal(bringin)) + def getStreetTotals(self): + # street1Pot INT, /* pot size at flop/street4 */ + # street2Pot INT, /* pot size at turn/street5 */ + # street3Pot INT, /* pot size at river/street6 */ + # street4Pot INT, /* pot size at sd/street7 */ + # showdownPot INT, /* pot size at sd/street7 */ + return (0,0,0,0,0) + def writeHand(self, fh=sys.__stdout__): # PokerStars format. @@ -1281,11 +1305,12 @@ class Pot(object): def __init__(self): - self.contenders = set() - self.committed = {} - self.total = None - self.returned = {} - self.sym = u'$' # this is the default currency symbol + self.contenders = set() + self.committed = {} + self.streettotals = {} + self.total = None + self.returned = {} + self.sym = u'$' # this is the default currency symbol def setSym(self, sym): self.sym = sym @@ -1302,6 +1327,14 @@ class Pot(object): self.contenders.add(player) self.committed[player] += amount + def markTotal(self, street): + self.streettotals[street] = sum(self.committed.values()) + + def getTotalAtStreet(self, street): + if street in self.streettotals: + return self.streettotals[street] + return 0 + def end(self): self.total = sum(self.committed.values()) diff --git a/pyfpdb/HandHistoryConverter.py b/pyfpdb/HandHistoryConverter.py index 343cb82f..d2d6c1b5 100644 --- a/pyfpdb/HandHistoryConverter.py +++ b/pyfpdb/HandHistoryConverter.py @@ -77,9 +77,13 @@ follow : whether to tail -f the input""" # TODO: out_path should be sanity checked. out_dir = os.path.dirname(self.out_path) if not os.path.isdir(out_dir) and out_dir != '': - logging.info("Creatin directory '%s'" % out_dir) + log.info("Creating directory '%s'" % out_dir) os.makedirs(out_dir) - self.out_fh = codecs.open(self.out_path, 'w', 'cp1252') + try: + self.out_fh = codecs.open(self.out_path, 'w', 'cp1252') + log.debug("out_path %s opened as %s" % (self.out_path, self.out_fh)) + except: + log.error("out_path %s couldn't be opened" % (self.out_path)) self.follow = follow self.compiledPlayers = set() diff --git a/pyfpdb/SQL.py b/pyfpdb/SQL.py index 25440720..15345192 100644 --- a/pyfpdb/SQL.py +++ b/pyfpdb/SQL.py @@ -1,2777 +1,2777 @@ -#!/usr/bin/env python -"""Returns a dict of SQL statements used in fpdb. -""" -# Copyright 2008-2009, Ray E. Barker -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -# NOTES: The sql statements use the placeholder %s for bind variables -# which is then replaced by ? for sqlite. Comments can be included -# within sql statements using C style /* ... */ comments, BUT -# THE COMMENTS MUST NOT INCLUDE %s OR ?. - -######################################################################## - -# Standard Library modules -import re - -# pyGTK modules - -# FreePokerTools modules - -class Sql: - - def __init__(self, game = 'holdem', type = 'fpdb', db_server = 'mysql'): - self.query = {} -###############################################################################3 -# Support for the Free Poker DataBase = fpdb http://fpdb.sourceforge.net/ -# - if type == 'fpdb': - - ################################ - # List tables - ################################ - if db_server == 'mysql': - self.query['list_tables'] = """SHOW TABLES""" - elif db_server == 'postgresql': - self.query['list_tables'] = """SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'""" - elif db_server == 'sqlite': - self.query['list_tables'] = """SELECT name FROM sqlite_master - WHERE type='table' - ORDER BY name;""" - - ################################################################## - # Drop Tables - MySQL, PostgreSQL and SQLite all share same syntax - ################################################################## - - self.query['drop_table'] = """DROP TABLE IF EXISTS """ - - - ################################ - # Create Settings - ################################ - if db_server == 'mysql': - self.query['createSettingsTable'] = """CREATE TABLE Settings ( - version SMALLINT NOT NULL) - ENGINE=INNODB""" - elif db_server == 'postgresql': - self.query['createSettingsTable'] = """CREATE TABLE Settings (version SMALLINT NOT NULL)""" - - elif db_server == 'sqlite': - self.query['createSettingsTable'] = """CREATE TABLE Settings - (version INTEGER NOT NULL) """ - - - ################################ - # Create Sites - ################################ - - if db_server == 'mysql': - self.query['createSitesTable'] = """CREATE TABLE Sites ( - id SMALLINT UNSIGNED AUTO_INCREMENT NOT NULL, PRIMARY KEY (id), - name varchar(32) NOT NULL, - currency char(3) NOT NULL) - ENGINE=INNODB""" - elif db_server == 'postgresql': - self.query['createSitesTable'] = """CREATE TABLE Sites ( - id SERIAL, PRIMARY KEY (id), - name varchar(32), - currency char(3))""" - elif db_server == 'sqlite': - self.query['createSitesTable'] = """CREATE TABLE Sites ( - id INTEGER PRIMARY KEY, - name TEXT NOT NULL, - currency TEXT NOT NULL)""" - - - ################################ - # Create Gametypes - ################################ - - if db_server == 'mysql': - self.query['createGametypesTable'] = """CREATE TABLE Gametypes ( - id SMALLINT UNSIGNED AUTO_INCREMENT NOT NULL, PRIMARY KEY (id), - siteId SMALLINT UNSIGNED NOT NULL, FOREIGN KEY (siteId) REFERENCES Sites(id), - type char(4) NOT NULL, - base char(4) NOT NULL, - category varchar(9) NOT NULL, - limitType char(2) NOT NULL, - hiLo char(1) NOT NULL, - smallBlind int, - bigBlind int, - smallBet int NOT NULL, - bigBet int NOT NULL) - ENGINE=INNODB""" - elif db_server == 'postgresql': - self.query['createGametypesTable'] = """CREATE TABLE Gametypes ( - id SERIAL, PRIMARY KEY (id), - siteId INTEGER, FOREIGN KEY (siteId) REFERENCES Sites(id), - type char(4), - base char(4), - category varchar(9), - limitType char(2), - hiLo char(1), - smallBlind int, - bigBlind int, - smallBet int, - bigBet int)""" - elif db_server == 'sqlite': - self.query['createGametypesTable'] = """CREATE TABLE GameTypes ( - id INTEGER PRIMARY KEY, - siteId INTEGER, - type TEXT, - base TEXT, - category TEXT, - limitType TEXT, - hiLo TEXT, - smallBlind INTEGER, - bigBlind INTEGER, - smallBet INTEGER, - bigBet INTEGER, - FOREIGN KEY(siteId) REFERENCES Sites(id) ON DELETE CASCADE)""" - - - ################################ - # Create Players - ################################ - - if db_server == 'mysql': - self.query['createPlayersTable'] = """CREATE TABLE Players ( - id INT UNSIGNED AUTO_INCREMENT NOT NULL, PRIMARY KEY (id), - name VARCHAR(32) CHARACTER SET utf8 NOT NULL, - siteId SMALLINT UNSIGNED NOT NULL, FOREIGN KEY (siteId) REFERENCES Sites(id), - comment text, - commentTs DATETIME) - ENGINE=INNODB""" - elif db_server == 'postgresql': - self.query['createPlayersTable'] = """CREATE TABLE Players ( - id SERIAL, PRIMARY KEY (id), - name VARCHAR(32), - siteId INTEGER, FOREIGN KEY (siteId) REFERENCES Sites(id), - comment text, - commentTs timestamp without time zone)""" - elif db_server == 'sqlite': - self.query['createPlayersTable'] = """CREATE TABLE Players ( - id INTEGER PRIMARY KEY, - name TEXT, - siteId INTEGER, - comment TEXT, - commentTs REAL, - FOREIGN KEY(siteId) REFERENCES Sites(id) ON DELETE CASCADE)""" - - - ################################ - # Create Autorates - ################################ - - if db_server == 'mysql': - self.query['createAutoratesTable'] = """CREATE TABLE Autorates ( - id BIGINT UNSIGNED AUTO_INCREMENT NOT NULL, PRIMARY KEY (id), - playerId INT UNSIGNED NOT NULL, FOREIGN KEY (playerId) REFERENCES Players(id), - gametypeId SMALLINT UNSIGNED NOT NULL, FOREIGN KEY (gametypeId) REFERENCES Gametypes(id), - description varchar(50) NOT NULL, - shortDesc char(8) NOT NULL, - ratingTime DATETIME NOT NULL, - handCount int NOT NULL) - ENGINE=INNODB""" - elif db_server == 'postgresql': - self.query['createAutoratesTable'] = """CREATE TABLE Autorates ( - id BIGSERIAL, PRIMARY KEY (id), - playerId INT, FOREIGN KEY (playerId) REFERENCES Players(id), - gametypeId INT, FOREIGN KEY (gametypeId) REFERENCES Gametypes(id), - description varchar(50), - shortDesc char(8), - ratingTime timestamp without time zone, - handCount int)""" - elif db_server == 'sqlite': - self.query['createAutoratesTable'] = """CREATE TABLE Autorates ( - id INTEGER PRIMARY KEY, - playerId INT, - gametypeId INT, - description TEXT, - shortDesc TEXT, - ratingTime REAL, - handCount int)""" - - - ################################ - # Create Hands - ################################ - - if db_server == 'mysql': - self.query['createHandsTable'] = """CREATE TABLE Hands ( - id BIGINT UNSIGNED AUTO_INCREMENT NOT NULL, PRIMARY KEY (id), - tableName VARCHAR(20) NOT NULL, - siteHandNo BIGINT NOT NULL, - gametypeId SMALLINT UNSIGNED NOT NULL, FOREIGN KEY (gametypeId) REFERENCES Gametypes(id), - handStart DATETIME NOT NULL, - importTime DATETIME NOT NULL, - seats TINYINT NOT NULL, - maxSeats TINYINT NOT NULL, - boardcard1 smallint, /* 0=none, 1-13=2-Ah 14-26=2-Ad 27-39=2-Ac 40-52=2-As */ - boardcard2 smallint, - boardcard3 smallint, - boardcard4 smallint, - boardcard5 smallint, - texture smallint, - playersVpi SMALLINT NOT NULL, /* num of players vpi */ - playersAtStreet1 SMALLINT NOT NULL, /* num of players seeing flop/street4 */ - playersAtStreet2 SMALLINT NOT NULL, - playersAtStreet3 SMALLINT NOT NULL, - playersAtStreet4 SMALLINT NOT NULL, - playersAtShowdown SMALLINT NOT NULL, - street0Raises TINYINT NOT NULL, /* num small bets paid to see flop/street4, including blind */ - street1Raises TINYINT NOT NULL, /* num small bets paid to see turn/street5 */ - street2Raises TINYINT NOT NULL, /* num big bets paid to see river/street6 */ - street3Raises TINYINT NOT NULL, /* num big bets paid to see sd/street7 */ - street4Raises TINYINT NOT NULL, /* num big bets paid to see showdown */ - street1Pot INT, /* pot size at flop/street4 */ - street2Pot INT, /* pot size at turn/street5 */ - street3Pot INT, /* pot size at river/street6 */ - street4Pot INT, /* pot size at sd/street7 */ - showdownPot INT, /* pot size at sd/street7 */ - comment TEXT, - commentTs DATETIME) - ENGINE=INNODB""" - elif db_server == 'postgresql': - self.query['createHandsTable'] = """CREATE TABLE Hands ( - id BIGSERIAL, PRIMARY KEY (id), - tableName VARCHAR(20) NOT NULL, - siteHandNo BIGINT NOT NULL, - gametypeId INT NOT NULL, FOREIGN KEY (gametypeId) REFERENCES Gametypes(id), - handStart timestamp without time zone NOT NULL, - importTime timestamp without time zone NOT NULL, - seats SMALLINT NOT NULL, - maxSeats SMALLINT NOT NULL, - boardcard1 smallint, /* 0=none, 1-13=2-Ah 14-26=2-Ad 27-39=2-Ac 40-52=2-As */ - boardcard2 smallint, - boardcard3 smallint, - boardcard4 smallint, - boardcard5 smallint, - texture smallint, - playersVpi SMALLINT NOT NULL, /* num of players vpi */ - playersAtStreet1 SMALLINT NOT NULL, /* num of players seeing flop/street4 */ - playersAtStreet2 SMALLINT NOT NULL, - playersAtStreet3 SMALLINT NOT NULL, - playersAtStreet4 SMALLINT NOT NULL, - playersAtShowdown SMALLINT NOT NULL, - street0Raises SMALLINT NOT NULL, /* num small bets paid to see flop/street4, including blind */ - street1Raises SMALLINT NOT NULL, /* num small bets paid to see turn/street5 */ - street2Raises SMALLINT NOT NULL, /* num big bets paid to see river/street6 */ - street3Raises SMALLINT NOT NULL, /* num big bets paid to see sd/street7 */ - street4Raises SMALLINT NOT NULL, /* num big bets paid to see showdown */ - street1Pot INT, /* pot size at flop/street4 */ - street2Pot INT, /* pot size at turn/street5 */ - street3Pot INT, /* pot size at river/street6 */ - street4Pot INT, /* pot size at sd/street7 */ - showdownPot INT, /* pot size at sd/street7 */ - comment TEXT, - commentTs timestamp without time zone)""" - elif db_server == 'sqlite': - self.query['createHandsTable'] = """CREATE TABLE Hands ( - id INTEGER PRIMARY KEY, - tableName TEXT(20) NOT NULL, - siteHandNo INT NOT NULL, - gametypeId INT NOT NULL, - handStart REAL NOT NULL, - importTime REAL NOT NULL, - seats INT NOT NULL, - maxSeats INT NOT NULL, - boardcard1 INT, /* 0=none, 1-13=2-Ah 14-26=2-Ad 27-39=2-Ac 40-52=2-As */ - boardcard2 INT, - boardcard3 INT, - boardcard4 INT, - boardcard5 INT, - texture INT, - playersVpi INT NOT NULL, /* num of players vpi */ - playersAtStreet1 INT NOT NULL, /* num of players seeing flop/street4 */ - playersAtStreet2 INT NOT NULL, - playersAtStreet3 INT NOT NULL, - playersAtStreet4 INT NOT NULL, - playersAtShowdown INT NOT NULL, - street0Raises INT NOT NULL, /* num small bets paid to see flop/street4, including blind */ - street1Raises INT NOT NULL, /* num small bets paid to see turn/street5 */ - street2Raises INT NOT NULL, /* num big bets paid to see river/street6 */ - street3Raises INT NOT NULL, /* num big bets paid to see sd/street7 */ - street4Raises INT NOT NULL, /* num big bets paid to see showdown */ - street1Pot INT, /* pot size at flop/street4 */ - street2Pot INT, /* pot size at turn/street5 */ - street3Pot INT, /* pot size at river/street6 */ - street4Pot INT, /* pot size at sd/street7 */ - showdownPot INT, /* pot size at sd/street7 */ - comment TEXT, - commentTs REAL)""" - - - ################################ - # Create TourneyTypes - ################################ - - if db_server == 'mysql': - self.query['createTourneyTypesTable'] = """CREATE TABLE TourneyTypes ( - id SMALLINT UNSIGNED AUTO_INCREMENT NOT NULL, PRIMARY KEY (id), - siteId SMALLINT UNSIGNED NOT NULL, FOREIGN KEY (siteId) REFERENCES Sites(id), - buyin INT NOT NULL, - fee INT NOT NULL, - knockout INT NOT NULL, - rebuyOrAddon BOOLEAN NOT NULL) - ENGINE=INNODB""" - elif db_server == 'postgresql': - self.query['createTourneyTypesTable'] = """CREATE TABLE TourneyTypes ( - id SERIAL, PRIMARY KEY (id), - siteId INT NOT NULL, FOREIGN KEY (siteId) REFERENCES Sites(id), - buyin INT NOT NULL, - fee INT NOT NULL, - knockout INT NOT NULL, - rebuyOrAddon BOOLEAN NOT NULL)""" - elif db_server == 'sqlite': - self.query['createTourneyTypesTable'] = """CREATE TABLE TourneyTypes ( - id INTEGER PRIMARY KEY, - siteId INT NOT NULL, - buyin INT NOT NULL, - fee INT NOT NULL, - knockout INT NOT NULL, - rebuyOrAddon BOOLEAN NOT NULL)""" - - ################################ - # Create Tourneys - ################################ - - if db_server == 'mysql': - self.query['createTourneysTable'] = """CREATE TABLE Tourneys ( - id INT UNSIGNED AUTO_INCREMENT NOT NULL, PRIMARY KEY (id), - tourneyTypeId SMALLINT UNSIGNED NOT NULL, FOREIGN KEY (tourneyTypeId) REFERENCES TourneyTypes(id), - siteTourneyNo BIGINT NOT NULL, - entries INT NOT NULL, - prizepool INT NOT NULL, - startTime DATETIME NOT NULL, - comment TEXT, - commentTs DATETIME) - ENGINE=INNODB""" - elif db_server == 'postgresql': - self.query['createTourneysTable'] = """CREATE TABLE Tourneys ( - id SERIAL, PRIMARY KEY (id), - tourneyTypeId INT, FOREIGN KEY (tourneyTypeId) REFERENCES TourneyTypes(id), - siteTourneyNo BIGINT, - entries INT, - prizepool INT, - startTime timestamp without time zone, - comment TEXT, - commentTs timestamp without time zone)""" - elif db_server == 'sqlite': - self.query['createTourneysTable'] = """CREATE TABLE Tourneys ( - id INTEGER PRIMARY KEY, - tourneyTypeId INT, - siteTourneyNo INT, - entries INT, - prizepool INT, - startTime REAL, - comment TEXT, - commentTs REAL)""" - ################################ - # Create HandsPlayers - ################################ - - if db_server == 'mysql': - self.query['createHandsPlayersTable'] = """CREATE TABLE HandsPlayers ( - id BIGINT UNSIGNED AUTO_INCREMENT NOT NULL, PRIMARY KEY (id), - handId BIGINT UNSIGNED NOT NULL, FOREIGN KEY (handId) REFERENCES Hands(id), - playerId INT UNSIGNED NOT NULL, FOREIGN KEY (playerId) REFERENCES Players(id), - startCash INT NOT NULL, - position CHAR(1), - seatNo SMALLINT NOT NULL, - - card1 smallint NOT NULL, /* 0=none, 1-13=2-Ah 14-26=2-Ad 27-39=2-Ac 40-52=2-As */ - card2 smallint NOT NULL, - card3 smallint, - card4 smallint, - card5 smallint, - card6 smallint, - card7 smallint, - startCards smallint, - - ante INT, - winnings int NOT NULL, - rake int NOT NULL, - totalProfit INT, - comment text, - commentTs DATETIME, - tourneysPlayersId BIGINT UNSIGNED, - tourneyTypeId SMALLINT UNSIGNED NOT NULL, FOREIGN KEY (tourneyTypeId) REFERENCES TourneyTypes(id), - - wonWhenSeenStreet1 FLOAT, - wonWhenSeenStreet2 FLOAT, - wonWhenSeenStreet3 FLOAT, - wonWhenSeenStreet4 FLOAT, - wonAtSD FLOAT, - - street0VPI BOOLEAN, - street0Aggr BOOLEAN, - street0_3BChance BOOLEAN, - street0_3BDone BOOLEAN, - street0_4BChance BOOLEAN, - street0_4BDone BOOLEAN, - other3BStreet0 BOOLEAN, - other4BStreet0 BOOLEAN, - - street1Seen BOOLEAN, - street2Seen BOOLEAN, - street3Seen BOOLEAN, - street4Seen BOOLEAN, - sawShowdown BOOLEAN, - - street1Aggr BOOLEAN, - street2Aggr BOOLEAN, - street3Aggr BOOLEAN, - street4Aggr BOOLEAN, - - otherRaisedStreet0 BOOLEAN, - otherRaisedStreet1 BOOLEAN, - otherRaisedStreet2 BOOLEAN, - otherRaisedStreet3 BOOLEAN, - otherRaisedStreet4 BOOLEAN, - foldToOtherRaisedStreet0 BOOLEAN, - foldToOtherRaisedStreet1 BOOLEAN, - foldToOtherRaisedStreet2 BOOLEAN, - foldToOtherRaisedStreet3 BOOLEAN, - foldToOtherRaisedStreet4 BOOLEAN, - - stealAttemptChance BOOLEAN, - stealAttempted BOOLEAN, - foldBbToStealChance BOOLEAN, - foldedBbToSteal BOOLEAN, - foldSbToStealChance BOOLEAN, - foldedSbToSteal BOOLEAN, - - street1CBChance BOOLEAN, - street1CBDone BOOLEAN, - street2CBChance BOOLEAN, - street2CBDone BOOLEAN, - street3CBChance BOOLEAN, - street3CBDone BOOLEAN, - street4CBChance BOOLEAN, - street4CBDone BOOLEAN, - - foldToStreet1CBChance BOOLEAN, - foldToStreet1CBDone BOOLEAN, - foldToStreet2CBChance BOOLEAN, - foldToStreet2CBDone BOOLEAN, - foldToStreet3CBChance BOOLEAN, - foldToStreet3CBDone BOOLEAN, - foldToStreet4CBChance BOOLEAN, - foldToStreet4CBDone BOOLEAN, - - street1CheckCallRaiseChance BOOLEAN, - street1CheckCallRaiseDone BOOLEAN, - street2CheckCallRaiseChance BOOLEAN, - street2CheckCallRaiseDone BOOLEAN, - street3CheckCallRaiseChance BOOLEAN, - street3CheckCallRaiseDone BOOLEAN, - street4CheckCallRaiseChance BOOLEAN, - street4CheckCallRaiseDone BOOLEAN, - - street0Calls TINYINT, - street1Calls TINYINT, - street2Calls TINYINT, - street3Calls TINYINT, - street4Calls TINYINT, - street0Bets TINYINT, - street1Bets TINYINT, - street2Bets TINYINT, - street3Bets TINYINT, - street4Bets TINYINT, - street0Raises TINYINT, - street1Raises TINYINT, - street2Raises TINYINT, - street3Raises TINYINT, - street4Raises TINYINT, - - actionString VARCHAR(15), - - FOREIGN KEY (tourneysPlayersId) REFERENCES TourneysPlayers(id)) - ENGINE=INNODB""" - elif db_server == 'postgresql': - self.query['createHandsPlayersTable'] = """CREATE TABLE HandsPlayers ( - id BIGSERIAL, PRIMARY KEY (id), - handId BIGINT NOT NULL, FOREIGN KEY (handId) REFERENCES Hands(id), - playerId INT NOT NULL, FOREIGN KEY (playerId) REFERENCES Players(id), - startCash INT NOT NULL, - position CHAR(1), - seatNo SMALLINT NOT NULL, - - card1 smallint NOT NULL, /* 0=none, 1-13=2-Ah 14-26=2-Ad 27-39=2-Ac 40-52=2-As */ - card2 smallint NOT NULL, - card3 smallint, - card4 smallint, - card5 smallint, - card6 smallint, - card7 smallint, - startCards smallint, - - ante INT, - winnings int NOT NULL, - rake int NOT NULL, - totalProfit INT, - comment text, - commentTs timestamp without time zone, - tourneysPlayersId BIGINT, - tourneyTypeId INT NOT NULL, FOREIGN KEY (tourneyTypeId) REFERENCES TourneyTypes(id), - - wonWhenSeenStreet1 FLOAT, - wonWhenSeenStreet2 FLOAT, - wonWhenSeenStreet3 FLOAT, - wonWhenSeenStreet4 FLOAT, - wonAtSD FLOAT, - - street0VPI BOOLEAN, - street0Aggr BOOLEAN, - street0_3BChance BOOLEAN, - street0_3BDone BOOLEAN, - street0_4BChance BOOLEAN, - street0_4BDone BOOLEAN, - other3BStreet0 BOOLEAN, - other4BStreet0 BOOLEAN, - - street1Seen BOOLEAN, - street2Seen BOOLEAN, - street3Seen BOOLEAN, - street4Seen BOOLEAN, - sawShowdown BOOLEAN, - - street1Aggr BOOLEAN, - street2Aggr BOOLEAN, - street3Aggr BOOLEAN, - street4Aggr BOOLEAN, - - otherRaisedStreet0 BOOLEAN, - otherRaisedStreet1 BOOLEAN, - otherRaisedStreet2 BOOLEAN, - otherRaisedStreet3 BOOLEAN, - otherRaisedStreet4 BOOLEAN, - foldToOtherRaisedStreet0 BOOLEAN, - foldToOtherRaisedStreet1 BOOLEAN, - foldToOtherRaisedStreet2 BOOLEAN, - foldToOtherRaisedStreet3 BOOLEAN, - foldToOtherRaisedStreet4 BOOLEAN, - - stealAttemptChance BOOLEAN, - stealAttempted BOOLEAN, - foldBbToStealChance BOOLEAN, - foldedBbToSteal BOOLEAN, - foldSbToStealChance BOOLEAN, - foldedSbToSteal BOOLEAN, - - street1CBChance BOOLEAN, - street1CBDone BOOLEAN, - street2CBChance BOOLEAN, - street2CBDone BOOLEAN, - street3CBChance BOOLEAN, - street3CBDone BOOLEAN, - street4CBChance BOOLEAN, - street4CBDone BOOLEAN, - - foldToStreet1CBChance BOOLEAN, - foldToStreet1CBDone BOOLEAN, - foldToStreet2CBChance BOOLEAN, - foldToStreet2CBDone BOOLEAN, - foldToStreet3CBChance BOOLEAN, - foldToStreet3CBDone BOOLEAN, - foldToStreet4CBChance BOOLEAN, - foldToStreet4CBDone BOOLEAN, - - street1CheckCallRaiseChance BOOLEAN, - street1CheckCallRaiseDone BOOLEAN, - street2CheckCallRaiseChance BOOLEAN, - street2CheckCallRaiseDone BOOLEAN, - street3CheckCallRaiseChance BOOLEAN, - street3CheckCallRaiseDone BOOLEAN, - street4CheckCallRaiseChance BOOLEAN, - street4CheckCallRaiseDone BOOLEAN, - - street0Calls SMALLINT, - street1Calls SMALLINT, - street2Calls SMALLINT, - street3Calls SMALLINT, - street4Calls SMALLINT, - street0Bets SMALLINT, - street1Bets SMALLINT, - street2Bets SMALLINT, - street3Bets SMALLINT, - street4Bets SMALLINT, - street0Raises SMALLINT, - street1Raises SMALLINT, - street2Raises SMALLINT, - street3Raises SMALLINT, - street4Raises SMALLINT, - - actionString VARCHAR(15), - - FOREIGN KEY (tourneysPlayersId) REFERENCES TourneysPlayers(id))""" - elif db_server == 'sqlite': - self.query['createHandsPlayersTable'] = """CREATE TABLE HandsPlayers ( - id INTEGER PRIMARY KEY, - handId INT NOT NULL, - playerId INT NOT NULL, - startCash INT NOT NULL, - position TEXT, - seatNo INT NOT NULL, - - card1 INT NOT NULL, /* 0=none, 1-13=2-Ah 14-26=2-Ad 27-39=2-Ac 40-52=2-As */ - card2 INT NOT NULL, - card3 INT, - card4 INT, - card5 INT, - card6 INT, - card7 INT, - startCards INT, - - ante INT, - winnings INT NOT NULL, - rake INT NOT NULL, - totalProfit INT, - comment TEXT, - commentTs REAL, - tourneysPlayersId INT, - tourneyTypeId INT NOT NULL, - - wonWhenSeenStreet1 REAL, - wonWhenSeenStreet2 REAL, - wonWhenSeenStreet3 REAL, - wonWhenSeenStreet4 REAL, - wonAtSD REAL, - - street0VPI INT, - street0Aggr INT, - street0_3BChance INT, - street0_3BDone INT, - street0_4BChance INT, - street0_4BDone INT, - other3BStreet0 INT, - other4BStreet0 INT, - - street1Seen INT, - street2Seen INT, - street3Seen INT, - street4Seen INT, - sawShowdown INT, - - street1Aggr INT, - street2Aggr INT, - street3Aggr INT, - street4Aggr INT, - - otherRaisedStreet0 INT, - otherRaisedStreet1 INT, - otherRaisedStreet2 INT, - otherRaisedStreet3 INT, - otherRaisedStreet4 INT, - foldToOtherRaisedStreet0 INT, - foldToOtherRaisedStreet1 INT, - foldToOtherRaisedStreet2 INT, - foldToOtherRaisedStreet3 INT, - foldToOtherRaisedStreet4 INT, - - stealAttemptChance INT, - stealAttempted INT, - foldBbToStealChance INT, - foldedBbToSteal INT, - foldSbToStealChance INT, - foldedSbToSteal INT, - - street1CBChance INT, - street1CBDone INT, - street2CBChance INT, - street2CBDone INT, - street3CBChance INT, - street3CBDone INT, - street4CBChance INT, - street4CBDone INT, - - foldToStreet1CBChance INT, - foldToStreet1CBDone INT, - foldToStreet2CBChance INT, - foldToStreet2CBDone INT, - foldToStreet3CBChance INT, - foldToStreet3CBDone INT, - foldToStreet4CBChance INT, - foldToStreet4CBDone INT, - - street1CheckCallRaiseChance INT, - street1CheckCallRaiseDone INT, - street2CheckCallRaiseChance INT, - street2CheckCallRaiseDone INT, - street3CheckCallRaiseChance INT, - street3CheckCallRaiseDone INT, - street4CheckCallRaiseChance INT, - street4CheckCallRaiseDone INT, - - street0Calls INT, - street1Calls INT, - street2Calls INT, - street3Calls INT, - street4Calls INT, - street0Bets INT, - street1Bets INT, - street2Bets INT, - street3Bets INT, - street4Bets INT, - street0Raises INT, - street1Raises INT, - street2Raises INT, - street3Raises INT, - street4Raises INT, - - actionString REAL) - """ - - - ################################ - # Create TourneysPlayers - ################################ - - if db_server == 'mysql': - self.query['createTourneysPlayersTable'] = """CREATE TABLE TourneysPlayers ( - id BIGINT UNSIGNED AUTO_INCREMENT NOT NULL, PRIMARY KEY (id), - tourneyId INT UNSIGNED NOT NULL, FOREIGN KEY (tourneyId) REFERENCES Tourneys(id), - playerId INT UNSIGNED NOT NULL, FOREIGN KEY (playerId) REFERENCES Players(id), - payinAmount INT NOT NULL, - rank INT NOT NULL, - winnings INT NOT NULL, - comment TEXT, - commentTs DATETIME) - ENGINE=INNODB""" - elif db_server == 'postgresql': - self.query['createTourneysPlayersTable'] = """CREATE TABLE TourneysPlayers ( - id BIGSERIAL, PRIMARY KEY (id), - tourneyId INT, FOREIGN KEY (tourneyId) REFERENCES Tourneys(id), - playerId INT, FOREIGN KEY (playerId) REFERENCES Players(id), - payinAmount INT, - rank INT, - winnings INT, - comment TEXT, - commentTs timestamp without time zone)""" - elif db_server == 'sqlite': - self.query['createTourneysPlayersTable'] = """ """ - - - ################################ - # Create HandsActions - ################################ - - if db_server == 'mysql': - self.query['createHandsActionsTable'] = """CREATE TABLE HandsActions ( - id BIGINT UNSIGNED AUTO_INCREMENT NOT NULL, PRIMARY KEY (id), - handsPlayerId BIGINT UNSIGNED NOT NULL, FOREIGN KEY (handsPlayerId) REFERENCES HandsPlayers(id), - street SMALLINT NOT NULL, - actionNo SMALLINT NOT NULL, - action CHAR(5) NOT NULL, - allIn BOOLEAN NOT NULL, - amount INT NOT NULL, - comment TEXT, - commentTs DATETIME) - ENGINE=INNODB""" - elif db_server == 'postgresql': - self.query['createHandsActionsTable'] = """CREATE TABLE HandsActions ( - id BIGSERIAL, PRIMARY KEY (id), - handsPlayerId BIGINT, FOREIGN KEY (handsPlayerId) REFERENCES HandsPlayers(id), - street SMALLINT, - actionNo SMALLINT, - action CHAR(5), - allIn BOOLEAN, - amount INT, - comment TEXT, - commentTs timestamp without time zone)""" - elif db_server == 'sqlite': - self.query['createHandsActionsTable'] = """ """ - - - ################################ - # Create HudCache - ################################ - - if db_server == 'mysql': - self.query['createHudCacheTable'] = """CREATE TABLE HudCache ( - id BIGINT UNSIGNED AUTO_INCREMENT NOT NULL, PRIMARY KEY (id), - gametypeId SMALLINT UNSIGNED NOT NULL, FOREIGN KEY (gametypeId) REFERENCES Gametypes(id), - playerId INT UNSIGNED NOT NULL, FOREIGN KEY (playerId) REFERENCES Players(id), - activeSeats SMALLINT NOT NULL, - position CHAR(1), - tourneyTypeId SMALLINT UNSIGNED NOT NULL, FOREIGN KEY (tourneyTypeId) REFERENCES TourneyTypes(id), - styleKey CHAR(7) NOT NULL, /* 1st char is style (A/T/H/S), other 6 are the key */ - HDs INT NOT NULL, - - wonWhenSeenStreet1 FLOAT, - wonWhenSeenStreet2 FLOAT, - wonWhenSeenStreet3 FLOAT, - wonWhenSeenStreet4 FLOAT, - wonAtSD FLOAT, - - street0VPI INT, - street0Aggr INT, - street0_3BChance INT, - street0_3BDone INT, - street0_4BChance INT, - street0_4BDone INT, - other3BStreet0 INT, - other4BStreet0 INT, - - street1Seen INT, - street2Seen INT, - street3Seen INT, - street4Seen INT, - sawShowdown INT, - - street1Aggr INT, - street2Aggr INT, - street3Aggr INT, - street4Aggr INT, - - otherRaisedStreet0 INT, - otherRaisedStreet1 INT, - otherRaisedStreet2 INT, - otherRaisedStreet3 INT, - otherRaisedStreet4 INT, - foldToOtherRaisedStreet0 INT, - foldToOtherRaisedStreet1 INT, - foldToOtherRaisedStreet2 INT, - foldToOtherRaisedStreet3 INT, - foldToOtherRaisedStreet4 INT, - - stealAttemptChance INT, - stealAttempted INT, - foldBbToStealChance INT, - foldedBbToSteal INT, - foldSbToStealChance INT, - foldedSbToSteal INT, - - street1CBChance INT, - street1CBDone INT, - street2CBChance INT, - street2CBDone INT, - street3CBChance INT, - street3CBDone INT, - street4CBChance INT, - street4CBDone INT, - - foldToStreet1CBChance INT, - foldToStreet1CBDone INT, - foldToStreet2CBChance INT, - foldToStreet2CBDone INT, - foldToStreet3CBChance INT, - foldToStreet3CBDone INT, - foldToStreet4CBChance INT, - foldToStreet4CBDone INT, - - totalProfit INT, - - street1CheckCallRaiseChance INT, - street1CheckCallRaiseDone INT, - street2CheckCallRaiseChance INT, - street2CheckCallRaiseDone INT, - street3CheckCallRaiseChance INT, - street3CheckCallRaiseDone INT, - street4CheckCallRaiseChance INT, - street4CheckCallRaiseDone INT, - - street0Calls INT, - street1Calls INT, - street2Calls INT, - street3Calls INT, - street4Calls INT, - street0Bets INT, - street1Bets INT, - street2Bets INT, - street3Bets INT, - street4Bets INT, - street0Raises INT, - street1Raises INT, - street2Raises INT, - street3Raises INT, - street4Raises INT) - - ENGINE=INNODB""" - elif db_server == 'postgresql': - self.query['createHudCacheTable'] = """CREATE TABLE HudCache ( - id BIGSERIAL, PRIMARY KEY (id), - gametypeId INT, FOREIGN KEY (gametypeId) REFERENCES Gametypes(id), - playerId INT, FOREIGN KEY (playerId) REFERENCES Players(id), - activeSeats SMALLINT, - position CHAR(1), - tourneyTypeId INT, FOREIGN KEY (tourneyTypeId) REFERENCES TourneyTypes(id), - styleKey CHAR(7) NOT NULL, /* 1st char is style (A/T/H/S), other 6 are the key */ - HDs INT, - - wonWhenSeenStreet1 FLOAT, - wonWhenSeenStreet2 FLOAT, - wonWhenSeenStreet3 FLOAT, - wonWhenSeenStreet4 FLOAT, - wonAtSD FLOAT, - - street0VPI INT, - street0Aggr INT, - street0_3BChance INT, - street0_3BDone INT, - street0_4BChance INT, - street0_4BDone INT, - other3BStreet0 INT, - other4BStreet0 INT, - - street1Seen INT, - street2Seen INT, - street3Seen INT, - street4Seen INT, - sawShowdown INT, - street1Aggr INT, - street2Aggr INT, - street3Aggr INT, - street4Aggr INT, - - otherRaisedStreet0 INT, - otherRaisedStreet1 INT, - otherRaisedStreet2 INT, - otherRaisedStreet3 INT, - otherRaisedStreet4 INT, - foldToOtherRaisedStreet0 INT, - foldToOtherRaisedStreet1 INT, - foldToOtherRaisedStreet2 INT, - foldToOtherRaisedStreet3 INT, - foldToOtherRaisedStreet4 INT, - - stealAttemptChance INT, - stealAttempted INT, - foldBbToStealChance INT, - foldedBbToSteal INT, - foldSbToStealChance INT, - foldedSbToSteal INT, - - street1CBChance INT, - street1CBDone INT, - street2CBChance INT, - street2CBDone INT, - street3CBChance INT, - street3CBDone INT, - street4CBChance INT, - street4CBDone INT, - - foldToStreet1CBChance INT, - foldToStreet1CBDone INT, - foldToStreet2CBChance INT, - foldToStreet2CBDone INT, - foldToStreet3CBChance INT, - foldToStreet3CBDone INT, - foldToStreet4CBChance INT, - foldToStreet4CBDone INT, - - totalProfit INT, - - street1CheckCallRaiseChance INT, - street1CheckCallRaiseDone INT, - street2CheckCallRaiseChance INT, - street2CheckCallRaiseDone INT, - street3CheckCallRaiseChance INT, - street3CheckCallRaiseDone INT, - street4CheckCallRaiseChance INT, - street4CheckCallRaiseDone INT, - - street0Calls INT, - street1Calls INT, - street2Calls INT, - street3Calls INT, - street4Calls INT, - street0Bets INT, - street1Bets INT, - street2Bets INT, - street3Bets INT, - street4Bets INT, - street0Raises INT, - street1Raises INT, - street2Raises INT, - street3Raises INT, - street4Raises INT) - """ - elif db_server == 'sqlite': - self.query['createHudCacheTable'] = """CREATE TABLE HudCache ( - id INTEGER PRIMARY KEY, - gametypeId INT, - playerId INT, - activeSeats INT, - position TEXT, - tourneyTypeId INT, - styleKey TEXT NOT NULL, /* 1st char is style (A/T/H/S), other 6 are the key */ - HDs INT, - - wonWhenSeenStreet1 REAL, - wonWhenSeenStreet2 REAL, - wonWhenSeenStreet3 REAL, - wonWhenSeenStreet4 REAL, - wonAtSD REAL, - - street0VPI INT, - street0Aggr INT, - street0_3BChance INT, - street0_3BDone INT, - street0_4BChance INT, - street0_4BDone INT, - other3BStreet0 INT, - other4BStreet0 INT, - - street1Seen INT, - street2Seen INT, - street3Seen INT, - street4Seen INT, - sawShowdown INT, - street1Aggr INT, - street2Aggr INT, - street3Aggr INT, - street4Aggr INT, - - otherRaisedStreet0 INT, - otherRaisedStreet1 INT, - otherRaisedStreet2 INT, - otherRaisedStreet3 INT, - otherRaisedStreet4 INT, - foldToOtherRaisedStreet0 INT, - foldToOtherRaisedStreet1 INT, - foldToOtherRaisedStreet2 INT, - foldToOtherRaisedStreet3 INT, - foldToOtherRaisedStreet4 INT, - - stealAttemptChance INT, - stealAttempted INT, - foldBbToStealChance INT, - foldedBbToSteal INT, - foldSbToStealChance INT, - foldedSbToSteal INT, - - street1CBChance INT, - street1CBDone INT, - street2CBChance INT, - street2CBDone INT, - street3CBChance INT, - street3CBDone INT, - street4CBChance INT, - street4CBDone INT, - - foldToStreet1CBChance INT, - foldToStreet1CBDone INT, - foldToStreet2CBChance INT, - foldToStreet2CBDone INT, - foldToStreet3CBChance INT, - foldToStreet3CBDone INT, - foldToStreet4CBChance INT, - foldToStreet4CBDone INT, - - totalProfit INT, - - street1CheckCallRaiseChance INT, - street1CheckCallRaiseDone INT, - street2CheckCallRaiseChance INT, - street2CheckCallRaiseDone INT, - street3CheckCallRaiseChance INT, - street3CheckCallRaiseDone INT, - street4CheckCallRaiseChance INT, - street4CheckCallRaiseDone INT, - - street0Calls INT, - street1Calls INT, - street2Calls INT, - street3Calls INT, - street4Calls INT, - street0Bets INT, - street1Bets INT, - street2Bets INT, - street3Bets INT, - street4Bets INT, - street0Raises INT, - street1Raises INT, - street2Raises INT, - street3Raises INT, - street4Raises INT) - """ - - - if db_server == 'mysql': - self.query['addTourneyIndex'] = """ALTER TABLE Tourneys ADD INDEX siteTourneyNo(siteTourneyNo)""" - elif db_server == 'postgresql': - self.query['addTourneyIndex'] = """CREATE INDEX siteTourneyNo ON Tourneys (siteTourneyNo)""" - elif db_server == 'sqlite': - self.query['addHandsIndex'] = """ """ - - if db_server == 'mysql': - self.query['addHandsIndex'] = """ALTER TABLE Hands ADD INDEX siteHandNo(siteHandNo)""" - elif db_server == 'postgresql': - self.query['addHandsIndex'] = """CREATE INDEX siteHandNo ON Hands (siteHandNo)""" - elif db_server == 'sqlite': - self.query['addHandsIndex'] = """ """ - - if db_server == 'mysql': - self.query['addPlayersIndex'] = """ALTER TABLE Players ADD INDEX name(name)""" - elif db_server == 'postgresql': - self.query['addPlayersIndex'] = """CREATE INDEX name ON Players (name)""" - elif db_server == 'sqlite': - self.query['addPlayersIndex'] = """ """ - - - self.query['get_last_hand'] = "select max(id) from Hands" - - self.query['get_player_id'] = """ - select Players.id AS player_id - from Players, Sites - where Players.name = %s - and Sites.name = %s - and Players.SiteId = Sites.id - """ - - self.query['getSiteId'] = """SELECT id from Sites where name = %s""" - - self.query['get_stats_from_hand'] = """ - SELECT hc.playerId AS player_id, - hp.seatNo AS seat, - p.name AS screen_name, - sum(hc.HDs) AS n, - sum(hc.street0VPI) AS vpip, - sum(hc.street0Aggr) AS pfr, - sum(hc.street0_3BChance) AS TB_opp_0, - sum(hc.street0_3BDone) AS TB_0, - sum(hc.street1Seen) AS saw_f, - sum(hc.street1Seen) AS saw_1, - sum(hc.street2Seen) AS saw_2, - sum(hc.street3Seen) AS saw_3, - sum(hc.street4Seen) AS saw_4, - sum(hc.sawShowdown) AS sd, - sum(hc.street1Aggr) AS aggr_1, - sum(hc.street2Aggr) AS aggr_2, - sum(hc.street3Aggr) AS aggr_3, - sum(hc.street4Aggr) AS aggr_4, - sum(hc.otherRaisedStreet1) AS was_raised_1, - sum(hc.otherRaisedStreet2) AS was_raised_2, - sum(hc.otherRaisedStreet3) AS was_raised_3, - sum(hc.otherRaisedStreet4) AS was_raised_4, - sum(hc.foldToOtherRaisedStreet1) AS f_freq_1, - sum(hc.foldToOtherRaisedStreet2) AS f_freq_2, - sum(hc.foldToOtherRaisedStreet3) AS f_freq_3, - sum(hc.foldToOtherRaisedStreet4) AS f_freq_4, - sum(hc.wonWhenSeenStreet1) AS w_w_s_1, - sum(hc.wonAtSD) AS wmsd, - sum(hc.stealAttemptChance) AS steal_opp, - sum(hc.stealAttempted) AS steal, - sum(hc.foldSbToStealChance) AS SBstolen, - sum(hc.foldedSbToSteal) AS SBnotDef, - sum(hc.foldBbToStealChance) AS BBstolen, - sum(hc.foldedBbToSteal) AS BBnotDef, - sum(hc.street1CBChance) AS CB_opp_1, - sum(hc.street1CBDone) AS CB_1, - sum(hc.street2CBChance) AS CB_opp_2, - sum(hc.street2CBDone) AS CB_2, - sum(hc.street3CBChance) AS CB_opp_3, - sum(hc.street3CBDone) AS CB_3, - sum(hc.street4CBChance) AS CB_opp_4, - sum(hc.street4CBDone) AS CB_4, - sum(hc.foldToStreet1CBChance) AS f_cb_opp_1, - sum(hc.foldToStreet1CBDone) AS f_cb_1, - sum(hc.foldToStreet2CBChance) AS f_cb_opp_2, - sum(hc.foldToStreet2CBDone) AS f_cb_2, - sum(hc.foldToStreet3CBChance) AS f_cb_opp_3, - sum(hc.foldToStreet3CBDone) AS f_cb_3, - sum(hc.foldToStreet4CBChance) AS f_cb_opp_4, - sum(hc.foldToStreet4CBDone) AS f_cb_4, - sum(hc.totalProfit) AS net, - sum(hc.street1CheckCallRaiseChance) AS ccr_opp_1, - sum(hc.street1CheckCallRaiseDone) AS ccr_1, - sum(hc.street2CheckCallRaiseChance) AS ccr_opp_2, - sum(hc.street2CheckCallRaiseDone) AS ccr_2, - sum(hc.street3CheckCallRaiseChance) AS ccr_opp_3, - sum(hc.street3CheckCallRaiseDone) AS ccr_3, - sum(hc.street4CheckCallRaiseChance) AS ccr_opp_4, - sum(hc.street4CheckCallRaiseDone) AS ccr_4 - FROM Hands h - INNER JOIN HandsPlayers hp ON (hp.handId = h.id) - INNER JOIN HudCache hc ON ( hc.PlayerId = hp.PlayerId+0 - 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 - /* 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 - self.query['get_stats_from_hand_aggregated'] = """ - SELECT hc.playerId AS player_id, - max(case when hc.gametypeId = h.gametypeId - then hp.seatNo - else -1 - end) AS seat, - p.name AS screen_name, - sum(hc.HDs) AS n, - sum(hc.street0VPI) AS vpip, - sum(hc.street0Aggr) AS pfr, - sum(hc.street0_3BChance) AS TB_opp_0, - sum(hc.street0_3BDone) AS TB_0, - sum(hc.street1Seen) AS saw_f, - sum(hc.street1Seen) AS saw_1, - sum(hc.street2Seen) AS saw_2, - sum(hc.street3Seen) AS saw_3, - sum(hc.street4Seen) AS saw_4, - sum(hc.sawShowdown) AS sd, - sum(hc.street1Aggr) AS aggr_1, - sum(hc.street2Aggr) AS aggr_2, - sum(hc.street3Aggr) AS aggr_3, - sum(hc.street4Aggr) AS aggr_4, - sum(hc.otherRaisedStreet1) AS was_raised_1, - sum(hc.otherRaisedStreet2) AS was_raised_2, - sum(hc.otherRaisedStreet3) AS was_raised_3, - sum(hc.otherRaisedStreet4) AS was_raised_4, - sum(hc.foldToOtherRaisedStreet1) AS f_freq_1, - sum(hc.foldToOtherRaisedStreet2) AS f_freq_2, - sum(hc.foldToOtherRaisedStreet3) AS f_freq_3, - sum(hc.foldToOtherRaisedStreet4) AS f_freq_4, - sum(hc.wonWhenSeenStreet1) AS w_w_s_1, - sum(hc.wonAtSD) AS wmsd, - sum(hc.stealAttemptChance) AS steal_opp, - sum(hc.stealAttempted) AS steal, - sum(hc.foldSbToStealChance) AS SBstolen, - sum(hc.foldedSbToSteal) AS SBnotDef, - sum(hc.foldBbToStealChance) AS BBstolen, - sum(hc.foldedBbToSteal) AS BBnotDef, - sum(hc.street1CBChance) AS CB_opp_1, - sum(hc.street1CBDone) AS CB_1, - sum(hc.street2CBChance) AS CB_opp_2, - sum(hc.street2CBDone) AS CB_2, - sum(hc.street3CBChance) AS CB_opp_3, - sum(hc.street3CBDone) AS CB_3, - sum(hc.street4CBChance) AS CB_opp_4, - sum(hc.street4CBDone) AS CB_4, - sum(hc.foldToStreet1CBChance) AS f_cb_opp_1, - sum(hc.foldToStreet1CBDone) AS f_cb_1, - sum(hc.foldToStreet2CBChance) AS f_cb_opp_2, - sum(hc.foldToStreet2CBDone) AS f_cb_2, - sum(hc.foldToStreet3CBChance) AS f_cb_opp_3, - sum(hc.foldToStreet3CBDone) AS f_cb_3, - sum(hc.foldToStreet4CBChance) AS f_cb_opp_4, - sum(hc.foldToStreet4CBDone) AS f_cb_4, - sum(hc.totalProfit) AS net, - sum(hc.street1CheckCallRaiseChance) AS ccr_opp_1, - sum(hc.street1CheckCallRaiseDone) AS ccr_1, - sum(hc.street2CheckCallRaiseChance) AS ccr_opp_2, - sum(hc.street2CheckCallRaiseDone) AS ccr_2, - sum(hc.street3CheckCallRaiseChance) AS ccr_opp_3, - sum(hc.street3CheckCallRaiseDone) AS ccr_3, - sum(hc.street4CheckCallRaiseChance) AS ccr_opp_4, - sum(hc.street4CheckCallRaiseDone) AS ccr_4 - FROM Hands h - INNER JOIN HandsPlayers hp ON (hp.handId = h.id) - 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 - /* styleKey is currently 'd' (for date) followed by a yyyymmdd - date key. Set it to 0000000 or similar to get all records */ - /* Note: s means the placeholder 'percent's but we can't include that - in comments. (db api thinks they are actual arguments) - Could 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 /* find gametypes where these match: */ - AND gt1.type = gt2.type /* ring/tourney */ - AND gt1.category = gt2.category /* holdem/stud*/ - AND gt1.limittype = gt2.limittype /* fl/nl */ - AND gt1.bigblind < gt2.bigblind * %s /* bigblind similar size */ - AND gt1.bigblind > gt2.bigblind / %s - AND gt2.id = h.gametypeId) - GROUP BY hc.PlayerId, p.name - """ - - 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 - FROM HandsPlayers INNER JOIN Players ON (HandsPlayers.playerId = Players.id) - WHERE handId = %s - """ -# WHERE handId = %s AND Players.id LIKE %s - - self.query['get_winners_from_hand'] = """ - SELECT name, winnings - FROM HandsPlayers, Players - WHERE winnings > 0 - AND Players.id = HandsPlayers.playerId - AND handId = %s; - """ - - self.query['get_table_name'] = """ - select tableName, maxSeats, category, type - from Hands,Gametypes - where Hands.id = %s - and Gametypes.id = Hands.gametypeId - """ - - self.query['get_actual_seat'] = """ - select seatNo - from HandsPlayers - where HandsPlayers.handId = %s - and HandsPlayers.playerId = (select Players.id from Players - where Players.name = %s) - """ - - self.query['get_cards'] = """ - select - seatNo AS seat_number, - card1, /*card1Value, card1Suit, */ - card2, /*card2Value, card2Suit, */ - card3, /*card3Value, card3Suit, */ - card4, /*card4Value, card4Suit, */ - card5, /*card5Value, card5Suit, */ - card6, /*card6Value, card6Suit, */ - card7 /*card7Value, card7Suit */ - from HandsPlayers, Players - where handID = %s and HandsPlayers.playerId = Players.id - order by seatNo - """ - - self.query['get_common_cards'] = """ - select - boardcard1, - boardcard2, - boardcard3, - boardcard4, - boardcard5 - from Hands - where Id = %s - """ - - self.query['get_action_from_hand'] = """ - SELECT street, Players.name, HandsActions.action, HandsActions.amount, actionno - FROM Players, HandsActions, HandsPlayers - WHERE HandsPlayers.handid = %s - AND HandsPlayers.playerid = Players.id - 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)""" - elif db_server == 'postgresql': - self.query['get_hand_1day_ago'] = """ - select coalesce(max(id),0) - from Hands - where handStart < now() at time zone 'UTC' - interval '1 day'""" - elif db_server == 'sqlite': - self.query['get_hand_1day_ago'] = """ - select coalesce(max(id),0) - from Hands - where handStart < strftime('%J', 'now') - 1""" - - # not used yet ... - # gets a date, would need to use handsplayers (not hudcache) to get exact hand Id - if db_server == 'mysql': - self.query['get_date_nhands_ago'] = """ - select concat( 'd', date_format(max(h.handStart), '%Y%m%d') ) - from (select hp.playerId - ,coalesce(greatest(max(hp.handId)-%s,1),1) as maxminusx - from HandsPlayers hp - where hp.playerId = %s - group by hp.playerId) hp2 - inner join HandsPlayers hp3 on ( hp3.handId <= hp2.maxminusx - and hp3.playerId = hp2.playerId) - inner join Hands h on (h.id = hp3.handId) - """ - elif db_server == 'postgresql': - self.query['get_date_nhands_ago'] = """ - select 'd' || to_char(max(h3.handStart), 'YYMMDD') - from (select hp.playerId - ,coalesce(greatest(max(hp.handId)-%s,1),1) as maxminusx - from HandsPlayers hp - where hp.playerId = %s - group by hp.playerId) hp2 - inner join HandsPlayers hp3 on ( hp3.handId <= hp2.maxminusx - and hp3.playerId = hp2.playerId) - inner join Hands h on (h.id = hp3.handId) - """ - elif db_server == 'sqlite': # untested guess at query: - self.query['get_date_nhands_ago'] = """ - select 'd' || strftime(max(h3.handStart), 'YYMMDD') - from (select hp.playerId - ,coalesce(greatest(max(hp.handId)-%s,1),1) as maxminusx - from HandsPlayers hp - where hp.playerId = %s - group by hp.playerId) hp2 - inner join HandsPlayers hp3 on ( hp3.handId <= hp2.maxminusx - and hp3.playerId = hp2.playerId) - inner join Hands h on (h.id = hp3.handId) - """ - - # used in GuiPlayerStats: - self.query['getPlayerId'] = """SELECT id from Players where name = %s""" - - # used in Filters: - self.query['getSiteId'] = """SELECT id from Sites where name = %s""" - self.query['getGames'] = """SELECT DISTINCT category from Gametypes""" - self.query['getLimits'] = """SELECT DISTINCT bigBlind from Gametypes ORDER by bigBlind DESC""" - - if db_server == 'mysql': - self.query['playerDetailedStats'] = """ - select AS hgametypeid - ,gt.base - ,gt.category - ,upper(gt.limitType) AS limittype - ,s.name - ,min(gt.bigBlind) AS minbigblind - ,max(gt.bigBlind) AS maxbigblind - /*, AS gtid*/ - , AS plposition - ,count(1) AS n - ,100.0*sum(cast(hp.street0VPI as integer))/count(1) AS vpip - ,100.0*sum(cast(hp.street0Aggr as integer))/count(1) AS pfr - ,case when sum(cast(hp.street0_3Bchance as integer)) = 0 then -999 - else 100.0*sum(cast(hp.street0_3Bdone as integer))/sum(cast(hp.street0_3Bchance as integer)) - end AS pf3 - ,case when sum(cast(hp.stealattemptchance as integer)) = 0 then -999 - else 100.0*sum(cast(hp.stealattempted as integer))/sum(cast(hp.stealattemptchance as integer)) - end AS steals - ,100.0*sum(cast(hp.street1Seen as integer))/count(1) AS saw_f - ,100.0*sum(cast(hp.sawShowdown as integer))/count(1) AS sawsd - ,case when sum(cast(hp.street1Seen as integer)) = 0 then -999 - else 100.0*sum(cast(hp.sawShowdown as integer))/sum(cast(hp.street1Seen as integer)) - end AS wtsdwsf - ,case when sum(cast(hp.sawShowdown as integer)) = 0 then -999 - else 100.0*sum(cast(hp.wonAtSD as integer))/sum(cast(hp.sawShowdown as integer)) - end AS wmsd - ,case when sum(cast(hp.street1Seen as integer)) = 0 then -999 - else 100.0*sum(cast(hp.street1Aggr as integer))/sum(cast(hp.street1Seen as integer)) - end AS flafq - ,case when sum(cast(hp.street2Seen as integer)) = 0 then -999 - else 100.0*sum(cast(hp.street2Aggr as integer))/sum(cast(hp.street2Seen as integer)) - end AS tuafq - ,case when sum(cast(hp.street3Seen as integer)) = 0 then -999 - else 100.0*sum(cast(hp.street3Aggr as integer))/sum(cast(hp.street3Seen as integer)) - end AS rvafq - ,case when sum(cast(hp.street1Seen as integer))+sum(cast(hp.street2Seen as integer))+sum(cast(hp.street3Seen as integer)) = 0 then -999 - else 100.0*(sum(cast(hp.street1Aggr as integer))+sum(cast(hp.street2Aggr as integer))+sum(cast(hp.street3Aggr as integer))) - /(sum(cast(hp.street1Seen as integer))+sum(cast(hp.street2Seen as integer))+sum(cast(hp.street3Seen as integer))) - end AS pofafq - ,sum(hp.totalProfit)/100.0 AS net - ,sum(hp.rake)/100.0 AS rake - ,100.0*avg(hp.totalProfit/(gt.bigBlind+0.0)) AS bbper100 - ,avg(hp.totalProfit)/100.0 AS profitperhand - ,100.0*avg((hp.totalProfit+hp.rake)/(gt.bigBlind+0.0)) AS bb100xr - ,avg((hp.totalProfit+hp.rake)/100.0) AS profhndxr - ,avg(h.seats+0.0) AS avgseats - ,variance(hp.totalProfit/100.0) AS variance - from HandsPlayers hp - inner join Hands h on (h.id = hp.handId) - inner join Gametypes gt on (gt.Id = h.gameTypeId) - inner join Sites s on (s.Id = gt.siteId) - where hp.playerId in - and hp.tourneysPlayersId IS NULL - and h.seats - - - and date_format(h.handStart, '%Y-%m-%d') - group by hgameTypeId - ,hp.playerId - ,gt.base - ,gt.category - - ,plposition - ,upper(gt.limitType) - ,s.name - order by hp.playerId - ,gt.base - ,gt.category - - ,case when 'B' then 'B' - when 'S' then 'S' - else concat('Z', ) - end - - ,maxbigblind desc - ,upper(gt.limitType) - ,s.name - """ - else: # assume postgresql - self.query['playerDetailedStats'] = """ - select AS hgametypeid - ,gt.base - ,gt.category - ,upper(gt.limitType) AS limittype - ,s.name - ,min(gt.bigBlind) AS minbigblind - ,max(gt.bigBlind) AS maxbigblind - /*, AS gtid*/ - , AS plposition - ,count(1) AS n - ,100.0*sum(cast(hp.street0VPI as integer))/count(1) AS vpip - ,100.0*sum(cast(hp.street0Aggr as integer))/count(1) AS pfr - ,case when sum(cast(hp.street0_3Bchance as integer)) = 0 then -999 - else 100.0*sum(cast(hp.street0_3Bdone as integer))/sum(cast(hp.street0_3Bchance as integer)) - end AS pf3 - ,case when sum(cast(hp.stealattemptchance as integer)) = 0 then -999 - else 100.0*sum(cast(hp.stealattempted as integer))/sum(cast(hp.stealattemptchance as integer)) - end AS steals - ,100.0*sum(cast(hp.street1Seen as integer))/count(1) AS saw_f - ,100.0*sum(cast(hp.sawShowdown as integer))/count(1) AS sawsd - ,case when sum(cast(hp.street1Seen as integer)) = 0 then -999 - else 100.0*sum(cast(hp.sawShowdown as integer))/sum(cast(hp.street1Seen as integer)) - end AS wtsdwsf - ,case when sum(cast(hp.sawShowdown as integer)) = 0 then -999 - else 100.0*sum(cast(hp.wonAtSD as integer))/sum(cast(hp.sawShowdown as integer)) - end AS wmsd - ,case when sum(cast(hp.street1Seen as integer)) = 0 then -999 - else 100.0*sum(cast(hp.street1Aggr as integer))/sum(cast(hp.street1Seen as integer)) - end AS flafq - ,case when sum(cast(hp.street2Seen as integer)) = 0 then -999 - else 100.0*sum(cast(hp.street2Aggr as integer))/sum(cast(hp.street2Seen as integer)) - end AS tuafq - ,case when sum(cast(hp.street3Seen as integer)) = 0 then -999 - else 100.0*sum(cast(hp.street3Aggr as integer))/sum(cast(hp.street3Seen as integer)) - end AS rvafq - ,case when sum(cast(hp.street1Seen as integer))+sum(cast(hp.street2Seen as integer))+sum(cast(hp.street3Seen as integer)) = 0 then -999 - else 100.0*(sum(cast(hp.street1Aggr as integer))+sum(cast(hp.street2Aggr as integer))+sum(cast(hp.street3Aggr as integer))) - /(sum(cast(hp.street1Seen as integer))+sum(cast(hp.street2Seen as integer))+sum(cast(hp.street3Seen as integer))) - end AS pofafq - ,sum(hp.totalProfit)/100.0 AS net - ,sum(hp.rake)/100.0 AS rake - ,100.0*avg(hp.totalProfit/(gt.bigBlind+0.0)) AS bbper100 - ,avg(hp.totalProfit)/100.0 AS profitperhand - ,100.0*avg((hp.totalProfit+hp.rake)/(gt.bigBlind+0.0)) AS bb100xr - ,avg((hp.totalProfit+hp.rake)/100.0) AS profhndxr - ,avg(h.seats+0.0) AS avgseats - ,variance(hp.totalProfit/100.0) AS variance - from HandsPlayers hp - inner join Hands h on (h.id = hp.handId) - inner join Gametypes gt on (gt.Id = h.gameTypeId) - inner join Sites s on (s.Id = gt.siteId) - where hp.playerId in - and hp.tourneysPlayersId IS NULL - and h.seats - - - and to_char(h.handStart, 'YYYY-MM-DD') - group by hgameTypeId - ,hp.playerId - ,gt.base - ,gt.category - - ,plposition - ,upper(gt.limitType) - ,s.name - order by hp.playerId - ,gt.base - ,gt.category - - ,case when 'B' then 'B' - when 'S' then 'S' - when '0' then 'Y' - else 'Z'|| - end - - ,maxbigblind desc - ,upper(gt.limitType) - ,s.name - """ - #elif db_server == 'sqlite': - # self.query['playerDetailedStats'] = """ """ - - if db_server == 'mysql': - self.query['playerStats'] = """ - SELECT - concat(upper(stats.limitType), ' ' - ,concat(upper(substring(stats.category,1,1)),substring(stats.category,2) ), ' ' - ,stats.name, ' ' - ,cast(stats.bigBlindDesc as char) - ) AS Game - ,stats.n - ,stats.vpip - ,stats.pfr - ,stats.pf3 - ,stats.steals - ,stats.saw_f - ,stats.sawsd - ,stats.wtsdwsf - ,stats.wmsd - ,stats.FlAFq - ,stats.TuAFq - ,stats.RvAFq - ,stats.PoFAFq - ,stats.Net - ,stats.BBper100 - ,stats.Profitperhand - ,case when hprof2.variance = -999 then '-' - else format(hprof2.variance, 2) - end AS Variance - ,stats.AvgSeats - FROM - (select /* stats from hudcache */ - gt.base - ,gt.category - ,upper(gt.limitType) as limitType - ,s.name - , AS bigBlindDesc - , AS gtId - ,sum(HDs) AS n - ,format(100.0*sum(street0VPI)/sum(HDs),1) AS vpip - ,format(100.0*sum(street0Aggr)/sum(HDs),1) AS pfr - ,case when sum(street0_3Bchance) = 0 then '0' - else format(100.0*sum(street0_3Bdone)/sum(street0_3Bchance),1) - end AS pf3 - ,case when sum(stealattemptchance) = 0 then '-' - else format(100.0*sum(stealattempted)/sum(stealattemptchance),1) - end AS steals - ,format(100.0*sum(street1Seen)/sum(HDs),1) AS saw_f - ,format(100.0*sum(sawShowdown)/sum(HDs),1) AS sawsd - ,case when sum(street1Seen) = 0 then '-' - else format(100.0*sum(sawShowdown)/sum(street1Seen),1) - end AS wtsdwsf - ,case when sum(sawShowdown) = 0 then '-' - else format(100.0*sum(wonAtSD)/sum(sawShowdown),1) - end AS wmsd - ,case when sum(street1Seen) = 0 then '-' - else format(100.0*sum(street1Aggr)/sum(street1Seen),1) - end AS FlAFq - ,case when sum(street2Seen) = 0 then '-' - else format(100.0*sum(street2Aggr)/sum(street2Seen),1) - end AS TuAFq - ,case when sum(street3Seen) = 0 then '-' - else format(100.0*sum(street3Aggr)/sum(street3Seen),1) - end AS RvAFq - ,case when sum(street1Seen)+sum(street2Seen)+sum(street3Seen) = 0 then '-' - else format(100.0*(sum(street1Aggr)+sum(street2Aggr)+sum(street3Aggr)) - /(sum(street1Seen)+sum(street2Seen)+sum(street3Seen)),1) - end AS PoFAFq - ,format(sum(totalProfit)/100.0,2) AS Net - ,format((sum(totalProfit/(gt.bigBlind+0.0))) / (sum(HDs)/100.0),2) - AS BBper100 - ,format( (sum(totalProfit)/100.0) / sum(HDs), 4) AS Profitperhand - ,format( sum(activeSeats*HDs)/(sum(HDs)+0.0), 2) AS AvgSeats - from Gametypes gt - inner join Sites s on s.Id = gt.siteId - inner join HudCache hc on hc.gameTypeId = gt.Id - where hc.playerId in - and - and hc.activeSeats - and concat( '20', substring(hc.styleKey,2,2), '-', substring(hc.styleKey,4,2), '-' - , substring(hc.styleKey,6,2) ) - group by gt.base - ,gt.category - ,upper(gt.limitType) - ,s.name - - ,gtId - ) stats - inner join - ( select # profit from handsplayers/handsactions - hprof.gtId, sum(hprof.profit) sum_profit, - avg(hprof.profit/100.0) profitperhand, - case when hprof.gtId = -1 then -999 - else variance(hprof.profit/100.0) - end as variance - from - (select hp.handId, as gtId, hp.totalProfit as profit - from HandsPlayers hp - inner join Hands h ON h.id = hp.handId - where hp.playerId in - and hp.tourneysPlayersId IS NULL - and date_format(h.handStart, '%Y-%m-%d') - group by hp.handId, gtId, hp.totalProfit - ) hprof - group by hprof.gtId - ) hprof2 - on hprof2.gtId = stats.gtId - order by stats.category, stats.limittype, stats.bigBlindDesc desc """ - else: # assume postgres - self.query['playerStats'] = """ - SELECT upper(stats.limitType) || ' ' - || initcap(stats.category) || ' ' - || stats.name || ' ' - || stats.bigBlindDesc AS Game - ,stats.n - ,stats.vpip - ,stats.pfr - ,stats.pf3 - ,stats.steals - ,stats.saw_f - ,stats.sawsd - ,stats.wtsdwsf - ,stats.wmsd - ,stats.FlAFq - ,stats.TuAFq - ,stats.RvAFq - ,stats.PoFAFq - ,stats.Net - ,stats.BBper100 - ,stats.Profitperhand - ,case when hprof2.variance = -999 then '-' - else to_char(hprof2.variance, '0D00') - end AS Variance - ,AvgSeats - FROM - (select gt.base - ,gt.category - ,upper(gt.limitType) AS limitType - ,s.name - , AS bigBlindDesc - , AS gtId - ,sum(HDs) as n - ,to_char(100.0*sum(street0VPI)/sum(HDs),'990D0') AS vpip - ,to_char(100.0*sum(street0Aggr)/sum(HDs),'90D0') AS pfr - ,case when sum(street0_3Bchance) = 0 then '0' - else to_char(100.0*sum(street0_3Bdone)/sum(street0_3Bchance),'90D0') - end AS pf3 - ,case when sum(stealattemptchance) = 0 then '-' - else to_char(100.0*sum(stealattempted)/sum(stealattemptchance),'90D0') - end AS steals - ,to_char(100.0*sum(street1Seen)/sum(HDs),'90D0') AS saw_f - ,to_char(100.0*sum(sawShowdown)/sum(HDs),'90D0') AS sawsd - ,case when sum(street1Seen) = 0 then '-' - else to_char(100.0*sum(sawShowdown)/sum(street1Seen),'90D0') - end AS wtsdwsf - ,case when sum(sawShowdown) = 0 then '-' - else to_char(100.0*sum(wonAtSD)/sum(sawShowdown),'90D0') - end AS wmsd - ,case when sum(street1Seen) = 0 then '-' - else to_char(100.0*sum(street1Aggr)/sum(street1Seen),'90D0') - end AS FlAFq - ,case when sum(street2Seen) = 0 then '-' - else to_char(100.0*sum(street2Aggr)/sum(street2Seen),'90D0') - end AS TuAFq - ,case when sum(street3Seen) = 0 then '-' - else to_char(100.0*sum(street3Aggr)/sum(street3Seen),'90D0') - end AS RvAFq - ,case when sum(street1Seen)+sum(street2Seen)+sum(street3Seen) = 0 then '-' - else to_char(100.0*(sum(street1Aggr)+sum(street2Aggr)+sum(street3Aggr)) - /(sum(street1Seen)+sum(street2Seen)+sum(street3Seen)),'90D0') - end AS PoFAFq - ,round(sum(totalProfit)/100.0,2) AS Net - ,to_char((sum(totalProfit/(gt.bigBlind+0.0))) / (sum(HDs)/100.0), '990D00') - AS BBper100 - ,to_char(sum(totalProfit/100.0) / (sum(HDs)+0.0), '990D0000') AS Profitperhand - ,to_char(sum(activeSeats*HDs)/(sum(HDs)+0.0),'90D00') AS AvgSeats - from Gametypes gt - inner join Sites s on s.Id = gt.siteId - inner join HudCache hc on hc.gameTypeId = gt.Id - where hc.playerId in - and - and hc.activeSeats - and '20' || SUBSTR(hc.styleKey,2,2) || '-' || SUBSTR(hc.styleKey,4,2) || '-' - || SUBSTR(hc.styleKey,6,2) - group by gt.base - ,gt.category - ,upper(gt.limitType) - ,s.name - - ,gtId - ) stats - inner join - ( select - hprof.gtId, sum(hprof.profit) AS sum_profit, - avg(hprof.profit/100.0) AS profitperhand, - case when hprof.gtId = -1 then -999 - else variance(hprof.profit/100.0) - end as variance - from - (select hp.handId, as gtId, hp.totalProfit as profit - from HandsPlayers hp - inner join Hands h ON (h.id = hp.handId) - where hp.playerId in - and hp.tourneysPlayersId IS NULL - and to_char(h.handStart, 'YYYY-MM-DD') - group by hp.handId, gtId, hp.totalProfit - ) hprof - group by hprof.gtId - ) hprof2 - on hprof2.gtId = stats.gtId - order by stats.base, stats.limittype, stats.bigBlindDesc desc """ - #elif db_server == 'sqlite': - # self.query['playerStats'] = """ """ - - if db_server == 'mysql': - self.query['playerStatsByPosition'] = """ - SELECT - concat(upper(stats.limitType), ' ' - ,concat(upper(substring(stats.category,1,1)),substring(stats.category,2) ), ' ' - ,stats.name, ' ' - ,cast(stats.bigBlindDesc as char) - ) AS Game - ,case when stats.PlPosition = -2 then 'BB' - when stats.PlPosition = -1 then 'SB' - when stats.PlPosition = 0 then 'Btn' - when stats.PlPosition = 1 then 'CO' - when stats.PlPosition = 2 then 'MP' - when stats.PlPosition = 5 then 'EP' - else 'xx' - end AS PlPosition - ,stats.n - ,stats.vpip - ,stats.pfr - ,stats.pf3 - ,stats.steals - ,stats.saw_f - ,stats.sawsd - ,stats.wtsdwsf - ,stats.wmsd - ,stats.FlAFq - ,stats.TuAFq - ,stats.RvAFq - ,stats.PoFAFq - ,stats.Net - ,stats.BBper100 - ,stats.Profitperhand - ,case when hprof2.variance = -999 then '-' - else format(hprof2.variance, 2) - end AS Variance - ,stats.AvgSeats - FROM - (select /* stats from hudcache */ - gt.base - ,gt.category - ,upper(gt.limitType) AS limitType - ,s.name - , AS bigBlindDesc - , AS gtId - ,case when hc.position = 'B' then -2 - when hc.position = 'S' then -1 - when hc.position = 'D' then 0 - when hc.position = 'C' then 1 - when hc.position = 'M' then 2 - when hc.position = 'E' then 5 - else 9 - end as PlPosition - ,sum(HDs) AS n - ,format(100.0*sum(street0VPI)/sum(HDs),1) AS vpip - ,format(100.0*sum(street0Aggr)/sum(HDs),1) AS pfr - ,case when sum(street0_3Bchance) = 0 then '0' - else format(100.0*sum(street0_3Bdone)/sum(street0_3Bchance),1) - end AS pf3 - ,case when sum(stealattemptchance) = 0 then '-' - else format(100.0*sum(stealattempted)/sum(stealattemptchance),1) - end AS steals - ,format(100.0*sum(street1Seen)/sum(HDs),1) AS saw_f - ,format(100.0*sum(sawShowdown)/sum(HDs),1) AS sawsd - ,case when sum(street1Seen) = 0 then '-' - else format(100.0*sum(sawShowdown)/sum(street1Seen),1) - end AS wtsdwsf - ,case when sum(sawShowdown) = 0 then '-' - else format(100.0*sum(wonAtSD)/sum(sawShowdown),1) - end AS wmsd - ,case when sum(street1Seen) = 0 then '-' - else format(100.0*sum(street1Aggr)/sum(street1Seen),1) - end AS FlAFq - ,case when sum(street2Seen) = 0 then '-' - else format(100.0*sum(street2Aggr)/sum(street2Seen),1) - end AS TuAFq - ,case when sum(street3Seen) = 0 then '-' - else format(100.0*sum(street3Aggr)/sum(street3Seen),1) - end AS RvAFq - ,case when sum(street1Seen)+sum(street2Seen)+sum(street3Seen) = 0 then '-' - else format(100.0*(sum(street1Aggr)+sum(street2Aggr)+sum(street3Aggr)) - /(sum(street1Seen)+sum(street2Seen)+sum(street3Seen)),1) - end AS PoFAFq - ,format(sum(totalProfit)/100.0,2) AS Net - ,format((sum(totalProfit/(gt.bigBlind+0.0))) / (sum(HDs)/100.0),2) - AS BBper100 - ,format( (sum(totalProfit)/100.0) / sum(HDs), 4) AS Profitperhand - ,format( sum(activeSeats*HDs)/(sum(HDs)+0.0), 2) AS AvgSeats - from Gametypes gt - inner join Sites s on s.Id = gt.siteId - inner join HudCache hc on hc.gameTypeId = gt.Id - where hc.playerId in - and - and hc.activeSeats - and concat( '20', substring(hc.styleKey,2,2), '-', substring(hc.styleKey,4,2), '-' - , substring(hc.styleKey,6,2) ) - group by gt.base - ,gt.category - ,upper(gt.limitType) - ,s.name - - ,gtId - - ,PlPosition - ) stats - inner join - ( select # profit from handsplayers/handsactions - hprof.gtId, - case when hprof.position = 'B' then -2 - when hprof.position = 'S' then -1 - when hprof.position in ('3','4') then 2 - when hprof.position in ('6','7') then 5 - else hprof.position - end as PlPosition, - sum(hprof.profit) as sum_profit, - avg(hprof.profit/100.0) as profitperhand, - case when hprof.gtId = -1 then -999 - else variance(hprof.profit/100.0) - end as variance - from - (select hp.handId, as gtId, hp.position - , hp.totalProfit as profit - from HandsPlayers hp - inner join Hands h ON (h.id = hp.handId) - where hp.playerId in - and hp.tourneysPlayersId IS NULL - and date_format(h.handStart, '%Y-%m-%d') - group by hp.handId, gtId, hp.position, hp.totalProfit - ) hprof - group by hprof.gtId, PlPosition - ) hprof2 - on ( hprof2.gtId = stats.gtId - and hprof2.PlPosition = stats.PlPosition) - order by stats.category, stats.limitType, stats.bigBlindDesc desc - , cast(stats.PlPosition as signed) - """ - else: # assume postgresql - self.query['playerStatsByPosition'] = """ - select /* stats from hudcache */ - upper(stats.limitType) || ' ' - || upper(substr(stats.category,1,1)) || substr(stats.category,2) || ' ' - || stats.name || ' ' - || stats.bigBlindDesc AS Game - ,case when stats.PlPosition = -2 then 'BB' - when stats.PlPosition = -1 then 'SB' - when stats.PlPosition = 0 then 'Btn' - when stats.PlPosition = 1 then 'CO' - when stats.PlPosition = 2 then 'MP' - when stats.PlPosition = 5 then 'EP' - else 'xx' - end AS PlPosition - ,stats.n - ,stats.vpip - ,stats.pfr - ,stats.pf3 - ,stats.steals - ,stats.saw_f - ,stats.sawsd - ,stats.wtsdwsf - ,stats.wmsd - ,stats.FlAFq - ,stats.TuAFq - ,stats.RvAFq - ,stats.PoFAFq - ,stats.Net - ,stats.BBper100 - ,stats.Profitperhand - ,case when hprof2.variance = -999 then '-' - else to_char(hprof2.variance, '0D00') - end AS Variance - ,stats.AvgSeats - FROM - (select /* stats from hudcache */ - gt.base - ,gt.category - ,upper(gt.limitType) AS limitType - ,s.name - , AS bigBlindDesc - , AS gtId - ,case when hc.position = 'B' then -2 - when hc.position = 'S' then -1 - when hc.position = 'D' then 0 - when hc.position = 'C' then 1 - when hc.position = 'M' then 2 - when hc.position = 'E' then 5 - else 9 - end AS PlPosition - ,sum(HDs) AS n - ,to_char(round(100.0*sum(street0VPI)/sum(HDs)),'990D0') AS vpip - ,to_char(round(100.0*sum(street0Aggr)/sum(HDs)),'90D0') AS pfr - ,case when sum(street0_3Bchance) = 0 then '0' - else to_char(100.0*sum(street0_3Bdone)/sum(street0_3Bchance),'90D0') - end AS pf3 - ,case when sum(stealattemptchance) = 0 then '-' - else to_char(100.0*sum(stealattempted)/sum(stealattemptchance),'90D0') - end AS steals - ,to_char(round(100.0*sum(street1Seen)/sum(HDs)),'90D0') AS saw_f - ,to_char(round(100.0*sum(sawShowdown)/sum(HDs)),'90D0') AS sawsd - ,case when sum(street1Seen) = 0 then '-' - else to_char(round(100.0*sum(sawShowdown)/sum(street1Seen)),'90D0') - end AS wtsdwsf - ,case when sum(sawShowdown) = 0 then '-' - else to_char(round(100.0*sum(wonAtSD)/sum(sawShowdown)),'90D0') - end AS wmsd - ,case when sum(street1Seen) = 0 then '-' - else to_char(round(100.0*sum(street1Aggr)/sum(street1Seen)),'90D0') - end AS FlAFq - ,case when sum(street2Seen) = 0 then '-' - else to_char(round(100.0*sum(street2Aggr)/sum(street2Seen)),'90D0') - end AS TuAFq - ,case when sum(street3Seen) = 0 then '-' - else to_char(round(100.0*sum(street3Aggr)/sum(street3Seen)),'90D0') - end AS RvAFq - ,case when sum(street1Seen)+sum(street2Seen)+sum(street3Seen) = 0 then '-' - else to_char(round(100.0*(sum(street1Aggr)+sum(street2Aggr)+sum(street3Aggr)) - /(sum(street1Seen)+sum(street2Seen)+sum(street3Seen))),'90D0') - end AS PoFAFq - ,to_char(sum(totalProfit)/100.0,'9G999G990D00') AS Net - ,case when sum(HDs) = 0 then '0' - else to_char(sum(totalProfit/(gt.bigBlind+0.0)) / (sum(HDs)/100.0), '990D00') - end AS BBper100 - ,case when sum(HDs) = 0 then '0' - else to_char( (sum(totalProfit)/100.0) / sum(HDs), '90D0000') - end AS Profitperhand - ,to_char(sum(activeSeats*HDs)/(sum(HDs)+0.0),'90D00') AS AvgSeats - from Gametypes gt - inner join Sites s on (s.Id = gt.siteId) - inner join HudCache hc on (hc.gameTypeId = gt.Id) - where hc.playerId in - and - and hc.activeSeats - and '20' || SUBSTR(hc.styleKey,2,2) || '-' || SUBSTR(hc.styleKey,4,2) || '-' - || SUBSTR(hc.styleKey,6,2) - group by gt.base - ,gt.category - ,upper(gt.limitType) - ,s.name - - ,gtId - - ,PlPosition - ) stats - inner join - ( select /* profit from handsplayers/handsactions */ - hprof.gtId, - case when hprof.position = 'B' then -2 - when hprof.position = 'S' then -1 - when hprof.position in ('3','4') then 2 - when hprof.position in ('6','7') then 5 - else cast(hprof.position as smallint) - end as PlPosition, - sum(hprof.profit) as sum_profit, - avg(hprof.profit/100.0) as profitperhand, - case when hprof.gtId = -1 then -999 - else variance(hprof.profit/100.0) - end as variance - from - (select hp.handId, as gtId, hp.position - , hp.totalProfit as profit - from HandsPlayers hp - inner join Hands h ON (h.id = hp.handId) - where hp.playerId in - and hp.tourneysPlayersId IS NULL - and to_char(h.handStart, 'YYYY-MM-DD') - group by hp.handId, gameTypeId, hp.position, hp.totalProfit - ) hprof - group by hprof.gtId, PlPosition - ) hprof2 - on ( hprof2.gtId = stats.gtId - and hprof2.PlPosition = stats.PlPosition) - order by stats.category, stats.limitType, stats.bigBlindDesc desc - , cast(stats.PlPosition as smallint) - """ - #elif db_server == 'sqlite': - # self.query['playerStatsByPosition'] = """ """ - - self.query['getRingProfitAllHandsPlayerIdSite'] = """ - SELECT hp.handId, hp.totalProfit, hp.totalProfit, hp.totalProfit - FROM HandsPlayers hp - INNER JOIN Players pl ON (hp.playerId = pl.id) - INNER JOIN Hands h ON (h.id = hp.handId) - INNER JOIN Gametypes g ON (h.gametypeId = g.id) - where pl.id in - AND pl.siteId in - AND h.handStart > '' - AND h.handStart < '' - AND g.bigBlind in - AND hp.tourneysPlayersId IS NULL - GROUP BY h.handStart, hp.handId, hp.totalProfit - ORDER BY h.handStart""" - - - #################################### - # Queries to rebuild/modify hudcache - #################################### - - self.query['clearHudCache'] = """DELETE FROM HudCache""" - - if db_server == 'mysql': - self.query['rebuildHudCache'] = """ - INSERT INTO HudCache - (gametypeId - ,playerId - ,activeSeats - ,position - ,tourneyTypeId - ,styleKey - ,HDs - ,wonWhenSeenStreet1 - ,wonAtSD - ,street0VPI - ,street0Aggr - ,street0_3BChance - ,street0_3BDone - ,street1Seen - ,street2Seen - ,street3Seen - ,street4Seen - ,sawShowdown - ,street1Aggr - ,street2Aggr - ,street3Aggr - ,street4Aggr - ,otherRaisedStreet1 - ,otherRaisedStreet2 - ,otherRaisedStreet3 - ,otherRaisedStreet4 - ,foldToOtherRaisedStreet1 - ,foldToOtherRaisedStreet2 - ,foldToOtherRaisedStreet3 - ,foldToOtherRaisedStreet4 - ,stealAttemptChance - ,stealAttempted - ,foldBbToStealChance - ,foldedBbToSteal - ,foldSbToStealChance - ,foldedSbToSteal - ,street1CBChance - ,street1CBDone - ,street2CBChance - ,street2CBDone - ,street3CBChance - ,street3CBDone - ,street4CBChance - ,street4CBDone - ,foldToStreet1CBChance - ,foldToStreet1CBDone - ,foldToStreet2CBChance - ,foldToStreet2CBDone - ,foldToStreet3CBChance - ,foldToStreet3CBDone - ,foldToStreet4CBChance - ,foldToStreet4CBDone - ,totalProfit - ,street1CheckCallRaiseChance - ,street1CheckCallRaiseDone - ,street2CheckCallRaiseChance - ,street2CheckCallRaiseDone - ,street3CheckCallRaiseChance - ,street3CheckCallRaiseDone - ,street4CheckCallRaiseChance - ,street4CheckCallRaiseDone - ) - SELECT h.gametypeId - ,hp.playerId - ,h.seats - ,case when hp.position = 'B' then 'B' - when hp.position = 'S' then 'S' - when hp.position = '0' then 'D' - when hp.position = '1' then 'C' - when hp.position = '2' then 'M' - when hp.position = '3' then 'M' - when hp.position = '4' then 'M' - when hp.position = '5' then 'E' - when hp.position = '6' then 'E' - when hp.position = '7' then 'E' - when hp.position = '8' then 'E' - when hp.position = '9' then 'E' - else 'E' - end AS hc_position - ,hp.tourneyTypeId - ,date_format(h.handStart, 'd%y%m%d') - ,count(1) - ,sum(wonWhenSeenStreet1) - ,sum(wonAtSD) - ,sum(street0VPI) - ,sum(street0Aggr) - ,sum(street0_3BChance) - ,sum(street0_3BDone) - ,sum(street1Seen) - ,sum(street2Seen) - ,sum(street3Seen) - ,sum(street4Seen) - ,sum(sawShowdown) - ,sum(street1Aggr) - ,sum(street2Aggr) - ,sum(street3Aggr) - ,sum(street4Aggr) - ,sum(otherRaisedStreet1) - ,sum(otherRaisedStreet2) - ,sum(otherRaisedStreet3) - ,sum(otherRaisedStreet4) - ,sum(foldToOtherRaisedStreet1) - ,sum(foldToOtherRaisedStreet2) - ,sum(foldToOtherRaisedStreet3) - ,sum(foldToOtherRaisedStreet4) - ,sum(stealAttemptChance) - ,sum(stealAttempted) - ,sum(foldBbToStealChance) - ,sum(foldedBbToSteal) - ,sum(foldSbToStealChance) - ,sum(foldedSbToSteal) - ,sum(street1CBChance) - ,sum(street1CBDone) - ,sum(street2CBChance) - ,sum(street2CBDone) - ,sum(street3CBChance) - ,sum(street3CBDone) - ,sum(street4CBChance) - ,sum(street4CBDone) - ,sum(foldToStreet1CBChance) - ,sum(foldToStreet1CBDone) - ,sum(foldToStreet2CBChance) - ,sum(foldToStreet2CBDone) - ,sum(foldToStreet3CBChance) - ,sum(foldToStreet3CBDone) - ,sum(foldToStreet4CBChance) - ,sum(foldToStreet4CBDone) - ,sum(totalProfit) - ,sum(street1CheckCallRaiseChance) - ,sum(street1CheckCallRaiseDone) - ,sum(street2CheckCallRaiseChance) - ,sum(street2CheckCallRaiseDone) - ,sum(street3CheckCallRaiseChance) - ,sum(street3CheckCallRaiseDone) - ,sum(street4CheckCallRaiseChance) - ,sum(street4CheckCallRaiseDone) - FROM HandsPlayers hp - INNER JOIN Hands h ON (h.id = hp.handId) - GROUP BY h.gametypeId - ,hp.playerId - ,h.seats - ,hc_position - ,hp.tourneyTypeId - ,date_format(h.handStart, 'd%y%m%d') -""" - elif db_server == 'postgresql': - self.query['rebuildHudCache'] = """ - INSERT INTO HudCache - (gametypeId - ,playerId - ,activeSeats - ,position - ,tourneyTypeId - ,styleKey - ,HDs - ,wonWhenSeenStreet1 - ,wonAtSD - ,street0VPI - ,street0Aggr - ,street0_3BChance - ,street0_3BDone - ,street1Seen - ,street2Seen - ,street3Seen - ,street4Seen - ,sawShowdown - ,street1Aggr - ,street2Aggr - ,street3Aggr - ,street4Aggr - ,otherRaisedStreet1 - ,otherRaisedStreet2 - ,otherRaisedStreet3 - ,otherRaisedStreet4 - ,foldToOtherRaisedStreet1 - ,foldToOtherRaisedStreet2 - ,foldToOtherRaisedStreet3 - ,foldToOtherRaisedStreet4 - ,stealAttemptChance - ,stealAttempted - ,foldBbToStealChance - ,foldedBbToSteal - ,foldSbToStealChance - ,foldedSbToSteal - ,street1CBChance - ,street1CBDone - ,street2CBChance - ,street2CBDone - ,street3CBChance - ,street3CBDone - ,street4CBChance - ,street4CBDone - ,foldToStreet1CBChance - ,foldToStreet1CBDone - ,foldToStreet2CBChance - ,foldToStreet2CBDone - ,foldToStreet3CBChance - ,foldToStreet3CBDone - ,foldToStreet4CBChance - ,foldToStreet4CBDone - ,totalProfit - ,street1CheckCallRaiseChance - ,street1CheckCallRaiseDone - ,street2CheckCallRaiseChance - ,street2CheckCallRaiseDone - ,street3CheckCallRaiseChance - ,street3CheckCallRaiseDone - ,street4CheckCallRaiseChance - ,street4CheckCallRaiseDone - ) - SELECT h.gametypeId - ,hp.playerId - ,h.seats - ,case when hp.position = 'B' then 'B' - when hp.position = 'S' then 'S' - when hp.position = '0' then 'D' - when hp.position = '1' then 'C' - when hp.position = '2' then 'M' - when hp.position = '3' then 'M' - when hp.position = '4' then 'M' - when hp.position = '5' then 'E' - when hp.position = '6' then 'E' - when hp.position = '7' then 'E' - when hp.position = '8' then 'E' - when hp.position = '9' then 'E' - else 'E' - end AS hc_position - ,hp.tourneyTypeId - ,'d' || to_char(h.handStart, 'YYMMDD') - ,count(1) - ,sum(wonWhenSeenStreet1) - ,sum(wonAtSD) - ,sum(CAST(street0VPI as integer)) - ,sum(CAST(street0Aggr as integer)) - ,sum(CAST(street0_3BChance as integer)) - ,sum(CAST(street0_3BDone as integer)) - ,sum(CAST(street1Seen as integer)) - ,sum(CAST(street2Seen as integer)) - ,sum(CAST(street3Seen as integer)) - ,sum(CAST(street4Seen as integer)) - ,sum(CAST(sawShowdown as integer)) - ,sum(CAST(street1Aggr as integer)) - ,sum(CAST(street2Aggr as integer)) - ,sum(CAST(street3Aggr as integer)) - ,sum(CAST(street4Aggr as integer)) - ,sum(CAST(otherRaisedStreet1 as integer)) - ,sum(CAST(otherRaisedStreet2 as integer)) - ,sum(CAST(otherRaisedStreet3 as integer)) - ,sum(CAST(otherRaisedStreet4 as integer)) - ,sum(CAST(foldToOtherRaisedStreet1 as integer)) - ,sum(CAST(foldToOtherRaisedStreet2 as integer)) - ,sum(CAST(foldToOtherRaisedStreet3 as integer)) - ,sum(CAST(foldToOtherRaisedStreet4 as integer)) - ,sum(CAST(stealAttemptChance as integer)) - ,sum(CAST(stealAttempted as integer)) - ,sum(CAST(foldBbToStealChance as integer)) - ,sum(CAST(foldedBbToSteal as integer)) - ,sum(CAST(foldSbToStealChance as integer)) - ,sum(CAST(foldedSbToSteal as integer)) - ,sum(CAST(street1CBChance as integer)) - ,sum(CAST(street1CBDone as integer)) - ,sum(CAST(street2CBChance as integer)) - ,sum(CAST(street2CBDone as integer)) - ,sum(CAST(street3CBChance as integer)) - ,sum(CAST(street3CBDone as integer)) - ,sum(CAST(street4CBChance as integer)) - ,sum(CAST(street4CBDone as integer)) - ,sum(CAST(foldToStreet1CBChance as integer)) - ,sum(CAST(foldToStreet1CBDone as integer)) - ,sum(CAST(foldToStreet2CBChance as integer)) - ,sum(CAST(foldToStreet2CBDone as integer)) - ,sum(CAST(foldToStreet3CBChance as integer)) - ,sum(CAST(foldToStreet3CBDone as integer)) - ,sum(CAST(foldToStreet4CBChance as integer)) - ,sum(CAST(foldToStreet4CBDone as integer)) - ,sum(CAST(totalProfit as integer)) - ,sum(CAST(street1CheckCallRaiseChance as integer)) - ,sum(CAST(street1CheckCallRaiseDone as integer)) - ,sum(CAST(street2CheckCallRaiseChance as integer)) - ,sum(CAST(street2CheckCallRaiseDone as integer)) - ,sum(CAST(street3CheckCallRaiseChance as integer)) - ,sum(CAST(street3CheckCallRaiseDone as integer)) - ,sum(CAST(street4CheckCallRaiseChance as integer)) - ,sum(CAST(street4CheckCallRaiseDone as integer)) - FROM HandsPlayers hp - INNER JOIN Hands h ON (h.id = hp.handId) - GROUP BY h.gametypeId - ,hp.playerId - ,h.seats - ,hc_position - ,hp.tourneyTypeId - ,to_char(h.handStart, 'YYMMDD') -""" - else: # assume sqlite - self.query['rebuildHudCache'] = """ - INSERT INTO HudCache - (gametypeId - ,playerId - ,activeSeats - ,position - ,tourneyTypeId - ,styleKey - ,HDs - ,wonWhenSeenStreet1 - ,wonAtSD - ,street0VPI - ,street0Aggr - ,street0_3BChance - ,street0_3BDone - ,street1Seen - ,street2Seen - ,street3Seen - ,street4Seen - ,sawShowdown - ,street1Aggr - ,street2Aggr - ,street3Aggr - ,street4Aggr - ,otherRaisedStreet1 - ,otherRaisedStreet2 - ,otherRaisedStreet3 - ,otherRaisedStreet4 - ,foldToOtherRaisedStreet1 - ,foldToOtherRaisedStreet2 - ,foldToOtherRaisedStreet3 - ,foldToOtherRaisedStreet4 - ,stealAttemptChance - ,stealAttempted - ,foldBbToStealChance - ,foldedBbToSteal - ,foldSbToStealChance - ,foldedSbToSteal - ,street1CBChance - ,street1CBDone - ,street2CBChance - ,street2CBDone - ,street3CBChance - ,street3CBDone - ,street4CBChance - ,street4CBDone - ,foldToStreet1CBChance - ,foldToStreet1CBDone - ,foldToStreet2CBChance - ,foldToStreet2CBDone - ,foldToStreet3CBChance - ,foldToStreet3CBDone - ,foldToStreet4CBChance - ,foldToStreet4CBDone - ,totalProfit - ,street1CheckCallRaiseChance - ,street1CheckCallRaiseDone - ,street2CheckCallRaiseChance - ,street2CheckCallRaiseDone - ,street3CheckCallRaiseChance - ,street3CheckCallRaiseDone - ,street4CheckCallRaiseChance - ,street4CheckCallRaiseDone - ) - SELECT h.gametypeId - ,hp.playerId - ,h.seats - ,case when hp.position = 'B' then 'B' - when hp.position = 'S' then 'S' - when hp.position = '0' then 'D' - when hp.position = '1' then 'C' - when hp.position = '2' then 'M' - when hp.position = '3' then 'M' - when hp.position = '4' then 'M' - when hp.position = '5' then 'E' - when hp.position = '6' then 'E' - when hp.position = '7' then 'E' - when hp.position = '8' then 'E' - when hp.position = '9' then 'E' - else 'E' - end AS hc_position - ,hp.tourneyTypeId - ,'d' || substr(strftime('%Y%m%d', h.handStart),3,7) - ,count(1) - ,sum(wonWhenSeenStreet1) - ,sum(wonAtSD) - ,sum(CAST(street0VPI as integer)) - ,sum(CAST(street0Aggr as integer)) - ,sum(CAST(street0_3BChance as integer)) - ,sum(CAST(street0_3BDone as integer)) - ,sum(CAST(street1Seen as integer)) - ,sum(CAST(street2Seen as integer)) - ,sum(CAST(street3Seen as integer)) - ,sum(CAST(street4Seen as integer)) - ,sum(CAST(sawShowdown as integer)) - ,sum(CAST(street1Aggr as integer)) - ,sum(CAST(street2Aggr as integer)) - ,sum(CAST(street3Aggr as integer)) - ,sum(CAST(street4Aggr as integer)) - ,sum(CAST(otherRaisedStreet1 as integer)) - ,sum(CAST(otherRaisedStreet2 as integer)) - ,sum(CAST(otherRaisedStreet3 as integer)) - ,sum(CAST(otherRaisedStreet4 as integer)) - ,sum(CAST(foldToOtherRaisedStreet1 as integer)) - ,sum(CAST(foldToOtherRaisedStreet2 as integer)) - ,sum(CAST(foldToOtherRaisedStreet3 as integer)) - ,sum(CAST(foldToOtherRaisedStreet4 as integer)) - ,sum(CAST(stealAttemptChance as integer)) - ,sum(CAST(stealAttempted as integer)) - ,sum(CAST(foldBbToStealChance as integer)) - ,sum(CAST(foldedBbToSteal as integer)) - ,sum(CAST(foldSbToStealChance as integer)) - ,sum(CAST(foldedSbToSteal as integer)) - ,sum(CAST(street1CBChance as integer)) - ,sum(CAST(street1CBDone as integer)) - ,sum(CAST(street2CBChance as integer)) - ,sum(CAST(street2CBDone as integer)) - ,sum(CAST(street3CBChance as integer)) - ,sum(CAST(street3CBDone as integer)) - ,sum(CAST(street4CBChance as integer)) - ,sum(CAST(street4CBDone as integer)) - ,sum(CAST(foldToStreet1CBChance as integer)) - ,sum(CAST(foldToStreet1CBDone as integer)) - ,sum(CAST(foldToStreet2CBChance as integer)) - ,sum(CAST(foldToStreet2CBDone as integer)) - ,sum(CAST(foldToStreet3CBChance as integer)) - ,sum(CAST(foldToStreet3CBDone as integer)) - ,sum(CAST(foldToStreet4CBChance as integer)) - ,sum(CAST(foldToStreet4CBDone as integer)) - ,sum(CAST(totalProfit as integer)) - ,sum(CAST(street1CheckCallRaiseChance as integer)) - ,sum(CAST(street1CheckCallRaiseDone as integer)) - ,sum(CAST(street2CheckCallRaiseChance as integer)) - ,sum(CAST(street2CheckCallRaiseDone as integer)) - ,sum(CAST(street3CheckCallRaiseChance as integer)) - ,sum(CAST(street3CheckCallRaiseDone as integer)) - ,sum(CAST(street4CheckCallRaiseChance as integer)) - ,sum(CAST(street4CheckCallRaiseDone as integer)) - FROM HandsPlayers hp - INNER JOIN Hands h ON (h.id = hp.handId) - GROUP BY h.gametypeId - ,hp.playerId - ,h.seats - ,hc_position - ,hp.tourneyTypeId - ,'d' || substr(strftime('%Y%m%d', h.handStart),3,7) -""" - - if db_server == 'mysql': - self.query['analyze'] = """ - analyze table Autorates, GameTypes, Hands, HandsPlayers, Hudcache, Players - , Settings, Sites, Tourneys, TourneysPlayers, TourneyTypes - """ - else: # assume postgres - self.query['analyze'] = "vacuum analyze" - - if db_server == 'mysql': - self.query['lockForInsert'] = """ - lock tables Hands write, HandsPlayers write, HandsActions write, Players write - , HudCache write, GameTypes write, Sites write, Tourneys write - , TourneysPlayers write, TourneyTypes write, Autorates write - """ - else: # assume postgres - self.query['lockForInsert'] = "" - - self.query['getGametypeFL'] = """SELECT id - FROM Gametypes - WHERE siteId=%s - AND type=%s - AND category=%s - AND limitType=%s - AND smallBet=%s - AND bigBet=%s - """ - - self.query['getGametypeNL'] = """SELECT id - FROM Gametypes - WHERE siteId=%s - AND type=%s - AND category=%s - AND limitType=%s - AND smallBlind=%s - AND bigBlind=%s - """ - - self.query['insertGameTypes'] = """INSERT INTO Gametypes - (siteId, type, base, category, limitType - ,hiLo, smallBlind, bigBlind, smallBet, bigBet) - VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)""" - - self.query['isAlreadyInDB'] = """SELECT id FROM Hands - WHERE gametypeId=%s AND siteHandNo=%s - """ - - if db_server == 'mysql': - self.query['placeholder'] = u'%s' - elif db_server == 'postgresql': - self.query['placeholder'] = u'%s' - elif db_server == 'sqlite': - self.query['placeholder'] = u'?' - - - # If using sqlite, use the ? placeholder instead of %s - if db_server == 'sqlite': - for k,q in self.query.iteritems(): - self.query[k] = re.sub('%s','?',q) - -if __name__== "__main__": -# just print the default queries and exit - s = Sql() - for key in s.query: - print "For query " + key + ", sql =" - print s.query[key] +#!/usr/bin/env python +"""Returns a dict of SQL statements used in fpdb. +""" +# Copyright 2008-2009, Ray E. Barker +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +# NOTES: The sql statements use the placeholder %s for bind variables +# which is then replaced by ? for sqlite. Comments can be included +# within sql statements using C style /* ... */ comments, BUT +# THE COMMENTS MUST NOT INCLUDE %s OR ?. + +######################################################################## + +# Standard Library modules +import re + +# pyGTK modules + +# FreePokerTools modules + +class Sql: + + def __init__(self, game = 'holdem', type = 'fpdb', db_server = 'mysql'): + self.query = {} +###############################################################################3 +# Support for the Free Poker DataBase = fpdb http://fpdb.sourceforge.net/ +# + if type == 'fpdb': + + ################################ + # List tables + ################################ + if db_server == 'mysql': + self.query['list_tables'] = """SHOW TABLES""" + elif db_server == 'postgresql': + self.query['list_tables'] = """SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'""" + elif db_server == 'sqlite': + self.query['list_tables'] = """SELECT name FROM sqlite_master + WHERE type='table' + ORDER BY name;""" + + ################################################################## + # Drop Tables - MySQL, PostgreSQL and SQLite all share same syntax + ################################################################## + + self.query['drop_table'] = """DROP TABLE IF EXISTS """ + + + ################################ + # Create Settings + ################################ + if db_server == 'mysql': + self.query['createSettingsTable'] = """CREATE TABLE Settings ( + version SMALLINT NOT NULL) + ENGINE=INNODB""" + elif db_server == 'postgresql': + self.query['createSettingsTable'] = """CREATE TABLE Settings (version SMALLINT NOT NULL)""" + + elif db_server == 'sqlite': + self.query['createSettingsTable'] = """CREATE TABLE Settings + (version INTEGER NOT NULL) """ + + + ################################ + # Create Sites + ################################ + + if db_server == 'mysql': + self.query['createSitesTable'] = """CREATE TABLE Sites ( + id SMALLINT UNSIGNED AUTO_INCREMENT NOT NULL, PRIMARY KEY (id), + name varchar(32) NOT NULL, + currency char(3) NOT NULL) + ENGINE=INNODB""" + elif db_server == 'postgresql': + self.query['createSitesTable'] = """CREATE TABLE Sites ( + id SERIAL, PRIMARY KEY (id), + name varchar(32), + currency char(3))""" + elif db_server == 'sqlite': + self.query['createSitesTable'] = """CREATE TABLE Sites ( + id INTEGER PRIMARY KEY, + name TEXT NOT NULL, + currency TEXT NOT NULL)""" + + + ################################ + # Create Gametypes + ################################ + + if db_server == 'mysql': + self.query['createGametypesTable'] = """CREATE TABLE Gametypes ( + id SMALLINT UNSIGNED AUTO_INCREMENT NOT NULL, PRIMARY KEY (id), + siteId SMALLINT UNSIGNED NOT NULL, FOREIGN KEY (siteId) REFERENCES Sites(id), + type char(4) NOT NULL, + base char(4) NOT NULL, + category varchar(9) NOT NULL, + limitType char(2) NOT NULL, + hiLo char(1) NOT NULL, + smallBlind int, + bigBlind int, + smallBet int NOT NULL, + bigBet int NOT NULL) + ENGINE=INNODB""" + elif db_server == 'postgresql': + self.query['createGametypesTable'] = """CREATE TABLE Gametypes ( + id SERIAL, PRIMARY KEY (id), + siteId INTEGER, FOREIGN KEY (siteId) REFERENCES Sites(id), + type char(4), + base char(4), + category varchar(9), + limitType char(2), + hiLo char(1), + smallBlind int, + bigBlind int, + smallBet int, + bigBet int)""" + elif db_server == 'sqlite': + self.query['createGametypesTable'] = """CREATE TABLE GameTypes ( + id INTEGER PRIMARY KEY, + siteId INTEGER, + type TEXT, + base TEXT, + category TEXT, + limitType TEXT, + hiLo TEXT, + smallBlind INTEGER, + bigBlind INTEGER, + smallBet INTEGER, + bigBet INTEGER, + FOREIGN KEY(siteId) REFERENCES Sites(id) ON DELETE CASCADE)""" + + + ################################ + # Create Players + ################################ + + if db_server == 'mysql': + self.query['createPlayersTable'] = """CREATE TABLE Players ( + id INT UNSIGNED AUTO_INCREMENT NOT NULL, PRIMARY KEY (id), + name VARCHAR(32) CHARACTER SET utf8 NOT NULL, + siteId SMALLINT UNSIGNED NOT NULL, FOREIGN KEY (siteId) REFERENCES Sites(id), + comment text, + commentTs DATETIME) + ENGINE=INNODB""" + elif db_server == 'postgresql': + self.query['createPlayersTable'] = """CREATE TABLE Players ( + id SERIAL, PRIMARY KEY (id), + name VARCHAR(32), + siteId INTEGER, FOREIGN KEY (siteId) REFERENCES Sites(id), + comment text, + commentTs timestamp without time zone)""" + elif db_server == 'sqlite': + self.query['createPlayersTable'] = """CREATE TABLE Players ( + id INTEGER PRIMARY KEY, + name TEXT, + siteId INTEGER, + comment TEXT, + commentTs REAL, + FOREIGN KEY(siteId) REFERENCES Sites(id) ON DELETE CASCADE)""" + + + ################################ + # Create Autorates + ################################ + + if db_server == 'mysql': + self.query['createAutoratesTable'] = """CREATE TABLE Autorates ( + id BIGINT UNSIGNED AUTO_INCREMENT NOT NULL, PRIMARY KEY (id), + playerId INT UNSIGNED NOT NULL, FOREIGN KEY (playerId) REFERENCES Players(id), + gametypeId SMALLINT UNSIGNED NOT NULL, FOREIGN KEY (gametypeId) REFERENCES Gametypes(id), + description varchar(50) NOT NULL, + shortDesc char(8) NOT NULL, + ratingTime DATETIME NOT NULL, + handCount int NOT NULL) + ENGINE=INNODB""" + elif db_server == 'postgresql': + self.query['createAutoratesTable'] = """CREATE TABLE Autorates ( + id BIGSERIAL, PRIMARY KEY (id), + playerId INT, FOREIGN KEY (playerId) REFERENCES Players(id), + gametypeId INT, FOREIGN KEY (gametypeId) REFERENCES Gametypes(id), + description varchar(50), + shortDesc char(8), + ratingTime timestamp without time zone, + handCount int)""" + elif db_server == 'sqlite': + self.query['createAutoratesTable'] = """CREATE TABLE Autorates ( + id INTEGER PRIMARY KEY, + playerId INT, + gametypeId INT, + description TEXT, + shortDesc TEXT, + ratingTime REAL, + handCount int)""" + + + ################################ + # Create Hands + ################################ + + if db_server == 'mysql': + self.query['createHandsTable'] = """CREATE TABLE Hands ( + id BIGINT UNSIGNED AUTO_INCREMENT NOT NULL, PRIMARY KEY (id), + tableName VARCHAR(20) NOT NULL, + siteHandNo BIGINT NOT NULL, + gametypeId SMALLINT UNSIGNED NOT NULL, FOREIGN KEY (gametypeId) REFERENCES Gametypes(id), + handStart DATETIME NOT NULL, + importTime DATETIME NOT NULL, + seats TINYINT NOT NULL, + maxSeats TINYINT NOT NULL, + boardcard1 smallint, /* 0=none, 1-13=2-Ah 14-26=2-Ad 27-39=2-Ac 40-52=2-As */ + boardcard2 smallint, + boardcard3 smallint, + boardcard4 smallint, + boardcard5 smallint, + texture smallint, + playersVpi SMALLINT NOT NULL, /* num of players vpi */ + playersAtStreet1 SMALLINT NOT NULL, /* num of players seeing flop/street4 */ + playersAtStreet2 SMALLINT NOT NULL, + playersAtStreet3 SMALLINT NOT NULL, + playersAtStreet4 SMALLINT NOT NULL, + playersAtShowdown SMALLINT NOT NULL, + street0Raises TINYINT NOT NULL, /* num small bets paid to see flop/street4, including blind */ + street1Raises TINYINT NOT NULL, /* num small bets paid to see turn/street5 */ + street2Raises TINYINT NOT NULL, /* num big bets paid to see river/street6 */ + street3Raises TINYINT NOT NULL, /* num big bets paid to see sd/street7 */ + street4Raises TINYINT NOT NULL, /* num big bets paid to see showdown */ + street1Pot INT, /* pot size at flop/street4 */ + street2Pot INT, /* pot size at turn/street5 */ + street3Pot INT, /* pot size at river/street6 */ + street4Pot INT, /* pot size at sd/street7 */ + showdownPot INT, /* pot size at sd/street7 */ + comment TEXT, + commentTs DATETIME) + ENGINE=INNODB""" + elif db_server == 'postgresql': + self.query['createHandsTable'] = """CREATE TABLE Hands ( + id BIGSERIAL, PRIMARY KEY (id), + tableName VARCHAR(20) NOT NULL, + siteHandNo BIGINT NOT NULL, + gametypeId INT NOT NULL, FOREIGN KEY (gametypeId) REFERENCES Gametypes(id), + handStart timestamp without time zone NOT NULL, + importTime timestamp without time zone NOT NULL, + seats SMALLINT NOT NULL, + maxSeats SMALLINT NOT NULL, + boardcard1 smallint, /* 0=none, 1-13=2-Ah 14-26=2-Ad 27-39=2-Ac 40-52=2-As */ + boardcard2 smallint, + boardcard3 smallint, + boardcard4 smallint, + boardcard5 smallint, + texture smallint, + playersVpi SMALLINT NOT NULL, /* num of players vpi */ + playersAtStreet1 SMALLINT NOT NULL, /* num of players seeing flop/street4 */ + playersAtStreet2 SMALLINT NOT NULL, + playersAtStreet3 SMALLINT NOT NULL, + playersAtStreet4 SMALLINT NOT NULL, + playersAtShowdown SMALLINT NOT NULL, + street0Raises SMALLINT NOT NULL, /* num small bets paid to see flop/street4, including blind */ + street1Raises SMALLINT NOT NULL, /* num small bets paid to see turn/street5 */ + street2Raises SMALLINT NOT NULL, /* num big bets paid to see river/street6 */ + street3Raises SMALLINT NOT NULL, /* num big bets paid to see sd/street7 */ + street4Raises SMALLINT NOT NULL, /* num big bets paid to see showdown */ + street1Pot INT, /* pot size at flop/street4 */ + street2Pot INT, /* pot size at turn/street5 */ + street3Pot INT, /* pot size at river/street6 */ + street4Pot INT, /* pot size at sd/street7 */ + showdownPot INT, /* pot size at sd/street7 */ + comment TEXT, + commentTs timestamp without time zone)""" + elif db_server == 'sqlite': + self.query['createHandsTable'] = """CREATE TABLE Hands ( + id INTEGER PRIMARY KEY, + tableName TEXT(20) NOT NULL, + siteHandNo INT NOT NULL, + gametypeId INT NOT NULL, + handStart REAL NOT NULL, + importTime REAL NOT NULL, + seats INT NOT NULL, + maxSeats INT NOT NULL, + boardcard1 INT, /* 0=none, 1-13=2-Ah 14-26=2-Ad 27-39=2-Ac 40-52=2-As */ + boardcard2 INT, + boardcard3 INT, + boardcard4 INT, + boardcard5 INT, + texture INT, + playersVpi INT NOT NULL, /* num of players vpi */ + playersAtStreet1 INT NOT NULL, /* num of players seeing flop/street4 */ + playersAtStreet2 INT NOT NULL, + playersAtStreet3 INT NOT NULL, + playersAtStreet4 INT NOT NULL, + playersAtShowdown INT NOT NULL, + street0Raises INT NOT NULL, /* num small bets paid to see flop/street4, including blind */ + street1Raises INT NOT NULL, /* num small bets paid to see turn/street5 */ + street2Raises INT NOT NULL, /* num big bets paid to see river/street6 */ + street3Raises INT NOT NULL, /* num big bets paid to see sd/street7 */ + street4Raises INT NOT NULL, /* num big bets paid to see showdown */ + street1Pot INT, /* pot size at flop/street4 */ + street2Pot INT, /* pot size at turn/street5 */ + street3Pot INT, /* pot size at river/street6 */ + street4Pot INT, /* pot size at sd/street7 */ + showdownPot INT, /* pot size at sd/street7 */ + comment TEXT, + commentTs REAL)""" + + + ################################ + # Create TourneyTypes + ################################ + + if db_server == 'mysql': + self.query['createTourneyTypesTable'] = """CREATE TABLE TourneyTypes ( + id SMALLINT UNSIGNED AUTO_INCREMENT NOT NULL, PRIMARY KEY (id), + siteId SMALLINT UNSIGNED NOT NULL, FOREIGN KEY (siteId) REFERENCES Sites(id), + buyin INT NOT NULL, + fee INT NOT NULL, + knockout INT NOT NULL, + rebuyOrAddon BOOLEAN NOT NULL) + ENGINE=INNODB""" + elif db_server == 'postgresql': + self.query['createTourneyTypesTable'] = """CREATE TABLE TourneyTypes ( + id SERIAL, PRIMARY KEY (id), + siteId INT NOT NULL, FOREIGN KEY (siteId) REFERENCES Sites(id), + buyin INT NOT NULL, + fee INT NOT NULL, + knockout INT NOT NULL, + rebuyOrAddon BOOLEAN NOT NULL)""" + elif db_server == 'sqlite': + self.query['createTourneyTypesTable'] = """CREATE TABLE TourneyTypes ( + id INTEGER PRIMARY KEY, + siteId INT NOT NULL, + buyin INT NOT NULL, + fee INT NOT NULL, + knockout INT NOT NULL, + rebuyOrAddon BOOLEAN NOT NULL)""" + + ################################ + # Create Tourneys + ################################ + + if db_server == 'mysql': + self.query['createTourneysTable'] = """CREATE TABLE Tourneys ( + id INT UNSIGNED AUTO_INCREMENT NOT NULL, PRIMARY KEY (id), + tourneyTypeId SMALLINT UNSIGNED NOT NULL, FOREIGN KEY (tourneyTypeId) REFERENCES TourneyTypes(id), + siteTourneyNo BIGINT NOT NULL, + entries INT NOT NULL, + prizepool INT NOT NULL, + startTime DATETIME NOT NULL, + comment TEXT, + commentTs DATETIME) + ENGINE=INNODB""" + elif db_server == 'postgresql': + self.query['createTourneysTable'] = """CREATE TABLE Tourneys ( + id SERIAL, PRIMARY KEY (id), + tourneyTypeId INT, FOREIGN KEY (tourneyTypeId) REFERENCES TourneyTypes(id), + siteTourneyNo BIGINT, + entries INT, + prizepool INT, + startTime timestamp without time zone, + comment TEXT, + commentTs timestamp without time zone)""" + elif db_server == 'sqlite': + self.query['createTourneysTable'] = """CREATE TABLE Tourneys ( + id INTEGER PRIMARY KEY, + tourneyTypeId INT, + siteTourneyNo INT, + entries INT, + prizepool INT, + startTime REAL, + comment TEXT, + commentTs REAL)""" + ################################ + # Create HandsPlayers + ################################ + + if db_server == 'mysql': + self.query['createHandsPlayersTable'] = """CREATE TABLE HandsPlayers ( + id BIGINT UNSIGNED AUTO_INCREMENT NOT NULL, PRIMARY KEY (id), + handId BIGINT UNSIGNED NOT NULL, FOREIGN KEY (handId) REFERENCES Hands(id), + playerId INT UNSIGNED NOT NULL, FOREIGN KEY (playerId) REFERENCES Players(id), + startCash INT NOT NULL, + position CHAR(1), + seatNo SMALLINT NOT NULL, + + card1 smallint NOT NULL, /* 0=none, 1-13=2-Ah 14-26=2-Ad 27-39=2-Ac 40-52=2-As */ + card2 smallint NOT NULL, + card3 smallint, + card4 smallint, + card5 smallint, + card6 smallint, + card7 smallint, + startCards smallint, + + ante INT, + winnings int NOT NULL, + rake int NOT NULL, + totalProfit INT, + comment text, + commentTs DATETIME, + tourneysPlayersId BIGINT UNSIGNED, + tourneyTypeId SMALLINT UNSIGNED NOT NULL, FOREIGN KEY (tourneyTypeId) REFERENCES TourneyTypes(id), + + wonWhenSeenStreet1 FLOAT, + wonWhenSeenStreet2 FLOAT, + wonWhenSeenStreet3 FLOAT, + wonWhenSeenStreet4 FLOAT, + wonAtSD FLOAT, + + street0VPI BOOLEAN, + street0Aggr BOOLEAN, + street0_3BChance BOOLEAN, + street0_3BDone BOOLEAN, + street0_4BChance BOOLEAN, + street0_4BDone BOOLEAN, + other3BStreet0 BOOLEAN, + other4BStreet0 BOOLEAN, + + street1Seen BOOLEAN, + street2Seen BOOLEAN, + street3Seen BOOLEAN, + street4Seen BOOLEAN, + sawShowdown BOOLEAN, + + street1Aggr BOOLEAN, + street2Aggr BOOLEAN, + street3Aggr BOOLEAN, + street4Aggr BOOLEAN, + + otherRaisedStreet0 BOOLEAN, + otherRaisedStreet1 BOOLEAN, + otherRaisedStreet2 BOOLEAN, + otherRaisedStreet3 BOOLEAN, + otherRaisedStreet4 BOOLEAN, + foldToOtherRaisedStreet0 BOOLEAN, + foldToOtherRaisedStreet1 BOOLEAN, + foldToOtherRaisedStreet2 BOOLEAN, + foldToOtherRaisedStreet3 BOOLEAN, + foldToOtherRaisedStreet4 BOOLEAN, + + stealAttemptChance BOOLEAN, + stealAttempted BOOLEAN, + foldBbToStealChance BOOLEAN, + foldedBbToSteal BOOLEAN, + foldSbToStealChance BOOLEAN, + foldedSbToSteal BOOLEAN, + + street1CBChance BOOLEAN, + street1CBDone BOOLEAN, + street2CBChance BOOLEAN, + street2CBDone BOOLEAN, + street3CBChance BOOLEAN, + street3CBDone BOOLEAN, + street4CBChance BOOLEAN, + street4CBDone BOOLEAN, + + foldToStreet1CBChance BOOLEAN, + foldToStreet1CBDone BOOLEAN, + foldToStreet2CBChance BOOLEAN, + foldToStreet2CBDone BOOLEAN, + foldToStreet3CBChance BOOLEAN, + foldToStreet3CBDone BOOLEAN, + foldToStreet4CBChance BOOLEAN, + foldToStreet4CBDone BOOLEAN, + + street1CheckCallRaiseChance BOOLEAN, + street1CheckCallRaiseDone BOOLEAN, + street2CheckCallRaiseChance BOOLEAN, + street2CheckCallRaiseDone BOOLEAN, + street3CheckCallRaiseChance BOOLEAN, + street3CheckCallRaiseDone BOOLEAN, + street4CheckCallRaiseChance BOOLEAN, + street4CheckCallRaiseDone BOOLEAN, + + street0Calls TINYINT, + street1Calls TINYINT, + street2Calls TINYINT, + street3Calls TINYINT, + street4Calls TINYINT, + street0Bets TINYINT, + street1Bets TINYINT, + street2Bets TINYINT, + street3Bets TINYINT, + street4Bets TINYINT, + street0Raises TINYINT, + street1Raises TINYINT, + street2Raises TINYINT, + street3Raises TINYINT, + street4Raises TINYINT, + + actionString VARCHAR(15), + + FOREIGN KEY (tourneysPlayersId) REFERENCES TourneysPlayers(id)) + ENGINE=INNODB""" + elif db_server == 'postgresql': + self.query['createHandsPlayersTable'] = """CREATE TABLE HandsPlayers ( + id BIGSERIAL, PRIMARY KEY (id), + handId BIGINT NOT NULL, FOREIGN KEY (handId) REFERENCES Hands(id), + playerId INT NOT NULL, FOREIGN KEY (playerId) REFERENCES Players(id), + startCash INT NOT NULL, + position CHAR(1), + seatNo SMALLINT NOT NULL, + + card1 smallint NOT NULL, /* 0=none, 1-13=2-Ah 14-26=2-Ad 27-39=2-Ac 40-52=2-As */ + card2 smallint NOT NULL, + card3 smallint, + card4 smallint, + card5 smallint, + card6 smallint, + card7 smallint, + startCards smallint, + + ante INT, + winnings int NOT NULL, + rake int NOT NULL, + totalProfit INT, + comment text, + commentTs timestamp without time zone, + tourneysPlayersId BIGINT, + tourneyTypeId INT NOT NULL, FOREIGN KEY (tourneyTypeId) REFERENCES TourneyTypes(id), + + wonWhenSeenStreet1 FLOAT, + wonWhenSeenStreet2 FLOAT, + wonWhenSeenStreet3 FLOAT, + wonWhenSeenStreet4 FLOAT, + wonAtSD FLOAT, + + street0VPI BOOLEAN, + street0Aggr BOOLEAN, + street0_3BChance BOOLEAN, + street0_3BDone BOOLEAN, + street0_4BChance BOOLEAN, + street0_4BDone BOOLEAN, + other3BStreet0 BOOLEAN, + other4BStreet0 BOOLEAN, + + street1Seen BOOLEAN, + street2Seen BOOLEAN, + street3Seen BOOLEAN, + street4Seen BOOLEAN, + sawShowdown BOOLEAN, + + street1Aggr BOOLEAN, + street2Aggr BOOLEAN, + street3Aggr BOOLEAN, + street4Aggr BOOLEAN, + + otherRaisedStreet0 BOOLEAN, + otherRaisedStreet1 BOOLEAN, + otherRaisedStreet2 BOOLEAN, + otherRaisedStreet3 BOOLEAN, + otherRaisedStreet4 BOOLEAN, + foldToOtherRaisedStreet0 BOOLEAN, + foldToOtherRaisedStreet1 BOOLEAN, + foldToOtherRaisedStreet2 BOOLEAN, + foldToOtherRaisedStreet3 BOOLEAN, + foldToOtherRaisedStreet4 BOOLEAN, + + stealAttemptChance BOOLEAN, + stealAttempted BOOLEAN, + foldBbToStealChance BOOLEAN, + foldedBbToSteal BOOLEAN, + foldSbToStealChance BOOLEAN, + foldedSbToSteal BOOLEAN, + + street1CBChance BOOLEAN, + street1CBDone BOOLEAN, + street2CBChance BOOLEAN, + street2CBDone BOOLEAN, + street3CBChance BOOLEAN, + street3CBDone BOOLEAN, + street4CBChance BOOLEAN, + street4CBDone BOOLEAN, + + foldToStreet1CBChance BOOLEAN, + foldToStreet1CBDone BOOLEAN, + foldToStreet2CBChance BOOLEAN, + foldToStreet2CBDone BOOLEAN, + foldToStreet3CBChance BOOLEAN, + foldToStreet3CBDone BOOLEAN, + foldToStreet4CBChance BOOLEAN, + foldToStreet4CBDone BOOLEAN, + + street1CheckCallRaiseChance BOOLEAN, + street1CheckCallRaiseDone BOOLEAN, + street2CheckCallRaiseChance BOOLEAN, + street2CheckCallRaiseDone BOOLEAN, + street3CheckCallRaiseChance BOOLEAN, + street3CheckCallRaiseDone BOOLEAN, + street4CheckCallRaiseChance BOOLEAN, + street4CheckCallRaiseDone BOOLEAN, + + street0Calls SMALLINT, + street1Calls SMALLINT, + street2Calls SMALLINT, + street3Calls SMALLINT, + street4Calls SMALLINT, + street0Bets SMALLINT, + street1Bets SMALLINT, + street2Bets SMALLINT, + street3Bets SMALLINT, + street4Bets SMALLINT, + street0Raises SMALLINT, + street1Raises SMALLINT, + street2Raises SMALLINT, + street3Raises SMALLINT, + street4Raises SMALLINT, + + actionString VARCHAR(15), + + FOREIGN KEY (tourneysPlayersId) REFERENCES TourneysPlayers(id))""" + elif db_server == 'sqlite': + self.query['createHandsPlayersTable'] = """CREATE TABLE HandsPlayers ( + id INTEGER PRIMARY KEY, + handId INT NOT NULL, + playerId INT NOT NULL, + startCash INT NOT NULL, + position TEXT, + seatNo INT NOT NULL, + + card1 INT NOT NULL, /* 0=none, 1-13=2-Ah 14-26=2-Ad 27-39=2-Ac 40-52=2-As */ + card2 INT NOT NULL, + card3 INT, + card4 INT, + card5 INT, + card6 INT, + card7 INT, + startCards INT, + + ante INT, + winnings INT NOT NULL, + rake INT NOT NULL, + totalProfit INT, + comment TEXT, + commentTs REAL, + tourneysPlayersId INT, + tourneyTypeId INT NOT NULL, + + wonWhenSeenStreet1 REAL, + wonWhenSeenStreet2 REAL, + wonWhenSeenStreet3 REAL, + wonWhenSeenStreet4 REAL, + wonAtSD REAL, + + street0VPI INT, + street0Aggr INT, + street0_3BChance INT, + street0_3BDone INT, + street0_4BChance INT, + street0_4BDone INT, + other3BStreet0 INT, + other4BStreet0 INT, + + street1Seen INT, + street2Seen INT, + street3Seen INT, + street4Seen INT, + sawShowdown INT, + + street1Aggr INT, + street2Aggr INT, + street3Aggr INT, + street4Aggr INT, + + otherRaisedStreet0 INT, + otherRaisedStreet1 INT, + otherRaisedStreet2 INT, + otherRaisedStreet3 INT, + otherRaisedStreet4 INT, + foldToOtherRaisedStreet0 INT, + foldToOtherRaisedStreet1 INT, + foldToOtherRaisedStreet2 INT, + foldToOtherRaisedStreet3 INT, + foldToOtherRaisedStreet4 INT, + + stealAttemptChance INT, + stealAttempted INT, + foldBbToStealChance INT, + foldedBbToSteal INT, + foldSbToStealChance INT, + foldedSbToSteal INT, + + street1CBChance INT, + street1CBDone INT, + street2CBChance INT, + street2CBDone INT, + street3CBChance INT, + street3CBDone INT, + street4CBChance INT, + street4CBDone INT, + + foldToStreet1CBChance INT, + foldToStreet1CBDone INT, + foldToStreet2CBChance INT, + foldToStreet2CBDone INT, + foldToStreet3CBChance INT, + foldToStreet3CBDone INT, + foldToStreet4CBChance INT, + foldToStreet4CBDone INT, + + street1CheckCallRaiseChance INT, + street1CheckCallRaiseDone INT, + street2CheckCallRaiseChance INT, + street2CheckCallRaiseDone INT, + street3CheckCallRaiseChance INT, + street3CheckCallRaiseDone INT, + street4CheckCallRaiseChance INT, + street4CheckCallRaiseDone INT, + + street0Calls INT, + street1Calls INT, + street2Calls INT, + street3Calls INT, + street4Calls INT, + street0Bets INT, + street1Bets INT, + street2Bets INT, + street3Bets INT, + street4Bets INT, + street0Raises INT, + street1Raises INT, + street2Raises INT, + street3Raises INT, + street4Raises INT, + + actionString REAL) + """ + + + ################################ + # Create TourneysPlayers + ################################ + + if db_server == 'mysql': + self.query['createTourneysPlayersTable'] = """CREATE TABLE TourneysPlayers ( + id BIGINT UNSIGNED AUTO_INCREMENT NOT NULL, PRIMARY KEY (id), + tourneyId INT UNSIGNED NOT NULL, FOREIGN KEY (tourneyId) REFERENCES Tourneys(id), + playerId INT UNSIGNED NOT NULL, FOREIGN KEY (playerId) REFERENCES Players(id), + payinAmount INT NOT NULL, + rank INT NOT NULL, + winnings INT NOT NULL, + comment TEXT, + commentTs DATETIME) + ENGINE=INNODB""" + elif db_server == 'postgresql': + self.query['createTourneysPlayersTable'] = """CREATE TABLE TourneysPlayers ( + id BIGSERIAL, PRIMARY KEY (id), + tourneyId INT, FOREIGN KEY (tourneyId) REFERENCES Tourneys(id), + playerId INT, FOREIGN KEY (playerId) REFERENCES Players(id), + payinAmount INT, + rank INT, + winnings INT, + comment TEXT, + commentTs timestamp without time zone)""" + elif db_server == 'sqlite': + self.query['createTourneysPlayersTable'] = """ """ + + + ################################ + # Create HandsActions + ################################ + + if db_server == 'mysql': + self.query['createHandsActionsTable'] = """CREATE TABLE HandsActions ( + id BIGINT UNSIGNED AUTO_INCREMENT NOT NULL, PRIMARY KEY (id), + handsPlayerId BIGINT UNSIGNED NOT NULL, FOREIGN KEY (handsPlayerId) REFERENCES HandsPlayers(id), + street SMALLINT NOT NULL, + actionNo SMALLINT NOT NULL, + action CHAR(5) NOT NULL, + allIn BOOLEAN NOT NULL, + amount INT NOT NULL, + comment TEXT, + commentTs DATETIME) + ENGINE=INNODB""" + elif db_server == 'postgresql': + self.query['createHandsActionsTable'] = """CREATE TABLE HandsActions ( + id BIGSERIAL, PRIMARY KEY (id), + handsPlayerId BIGINT, FOREIGN KEY (handsPlayerId) REFERENCES HandsPlayers(id), + street SMALLINT, + actionNo SMALLINT, + action CHAR(5), + allIn BOOLEAN, + amount INT, + comment TEXT, + commentTs timestamp without time zone)""" + elif db_server == 'sqlite': + self.query['createHandsActionsTable'] = """ """ + + + ################################ + # Create HudCache + ################################ + + if db_server == 'mysql': + self.query['createHudCacheTable'] = """CREATE TABLE HudCache ( + id BIGINT UNSIGNED AUTO_INCREMENT NOT NULL, PRIMARY KEY (id), + gametypeId SMALLINT UNSIGNED NOT NULL, FOREIGN KEY (gametypeId) REFERENCES Gametypes(id), + playerId INT UNSIGNED NOT NULL, FOREIGN KEY (playerId) REFERENCES Players(id), + activeSeats SMALLINT NOT NULL, + position CHAR(1), + tourneyTypeId SMALLINT UNSIGNED NOT NULL, FOREIGN KEY (tourneyTypeId) REFERENCES TourneyTypes(id), + styleKey CHAR(7) NOT NULL, /* 1st char is style (A/T/H/S), other 6 are the key */ + HDs INT NOT NULL, + + wonWhenSeenStreet1 FLOAT, + wonWhenSeenStreet2 FLOAT, + wonWhenSeenStreet3 FLOAT, + wonWhenSeenStreet4 FLOAT, + wonAtSD FLOAT, + + street0VPI INT, + street0Aggr INT, + street0_3BChance INT, + street0_3BDone INT, + street0_4BChance INT, + street0_4BDone INT, + other3BStreet0 INT, + other4BStreet0 INT, + + street1Seen INT, + street2Seen INT, + street3Seen INT, + street4Seen INT, + sawShowdown INT, + + street1Aggr INT, + street2Aggr INT, + street3Aggr INT, + street4Aggr INT, + + otherRaisedStreet0 INT, + otherRaisedStreet1 INT, + otherRaisedStreet2 INT, + otherRaisedStreet3 INT, + otherRaisedStreet4 INT, + foldToOtherRaisedStreet0 INT, + foldToOtherRaisedStreet1 INT, + foldToOtherRaisedStreet2 INT, + foldToOtherRaisedStreet3 INT, + foldToOtherRaisedStreet4 INT, + + stealAttemptChance INT, + stealAttempted INT, + foldBbToStealChance INT, + foldedBbToSteal INT, + foldSbToStealChance INT, + foldedSbToSteal INT, + + street1CBChance INT, + street1CBDone INT, + street2CBChance INT, + street2CBDone INT, + street3CBChance INT, + street3CBDone INT, + street4CBChance INT, + street4CBDone INT, + + foldToStreet1CBChance INT, + foldToStreet1CBDone INT, + foldToStreet2CBChance INT, + foldToStreet2CBDone INT, + foldToStreet3CBChance INT, + foldToStreet3CBDone INT, + foldToStreet4CBChance INT, + foldToStreet4CBDone INT, + + totalProfit INT, + + street1CheckCallRaiseChance INT, + street1CheckCallRaiseDone INT, + street2CheckCallRaiseChance INT, + street2CheckCallRaiseDone INT, + street3CheckCallRaiseChance INT, + street3CheckCallRaiseDone INT, + street4CheckCallRaiseChance INT, + street4CheckCallRaiseDone INT, + + street0Calls INT, + street1Calls INT, + street2Calls INT, + street3Calls INT, + street4Calls INT, + street0Bets INT, + street1Bets INT, + street2Bets INT, + street3Bets INT, + street4Bets INT, + street0Raises INT, + street1Raises INT, + street2Raises INT, + street3Raises INT, + street4Raises INT) + + ENGINE=INNODB""" + elif db_server == 'postgresql': + self.query['createHudCacheTable'] = """CREATE TABLE HudCache ( + id BIGSERIAL, PRIMARY KEY (id), + gametypeId INT, FOREIGN KEY (gametypeId) REFERENCES Gametypes(id), + playerId INT, FOREIGN KEY (playerId) REFERENCES Players(id), + activeSeats SMALLINT, + position CHAR(1), + tourneyTypeId INT, FOREIGN KEY (tourneyTypeId) REFERENCES TourneyTypes(id), + styleKey CHAR(7) NOT NULL, /* 1st char is style (A/T/H/S), other 6 are the key */ + HDs INT, + + wonWhenSeenStreet1 FLOAT, + wonWhenSeenStreet2 FLOAT, + wonWhenSeenStreet3 FLOAT, + wonWhenSeenStreet4 FLOAT, + wonAtSD FLOAT, + + street0VPI INT, + street0Aggr INT, + street0_3BChance INT, + street0_3BDone INT, + street0_4BChance INT, + street0_4BDone INT, + other3BStreet0 INT, + other4BStreet0 INT, + + street1Seen INT, + street2Seen INT, + street3Seen INT, + street4Seen INT, + sawShowdown INT, + street1Aggr INT, + street2Aggr INT, + street3Aggr INT, + street4Aggr INT, + + otherRaisedStreet0 INT, + otherRaisedStreet1 INT, + otherRaisedStreet2 INT, + otherRaisedStreet3 INT, + otherRaisedStreet4 INT, + foldToOtherRaisedStreet0 INT, + foldToOtherRaisedStreet1 INT, + foldToOtherRaisedStreet2 INT, + foldToOtherRaisedStreet3 INT, + foldToOtherRaisedStreet4 INT, + + stealAttemptChance INT, + stealAttempted INT, + foldBbToStealChance INT, + foldedBbToSteal INT, + foldSbToStealChance INT, + foldedSbToSteal INT, + + street1CBChance INT, + street1CBDone INT, + street2CBChance INT, + street2CBDone INT, + street3CBChance INT, + street3CBDone INT, + street4CBChance INT, + street4CBDone INT, + + foldToStreet1CBChance INT, + foldToStreet1CBDone INT, + foldToStreet2CBChance INT, + foldToStreet2CBDone INT, + foldToStreet3CBChance INT, + foldToStreet3CBDone INT, + foldToStreet4CBChance INT, + foldToStreet4CBDone INT, + + totalProfit INT, + + street1CheckCallRaiseChance INT, + street1CheckCallRaiseDone INT, + street2CheckCallRaiseChance INT, + street2CheckCallRaiseDone INT, + street3CheckCallRaiseChance INT, + street3CheckCallRaiseDone INT, + street4CheckCallRaiseChance INT, + street4CheckCallRaiseDone INT, + + street0Calls INT, + street1Calls INT, + street2Calls INT, + street3Calls INT, + street4Calls INT, + street0Bets INT, + street1Bets INT, + street2Bets INT, + street3Bets INT, + street4Bets INT, + street0Raises INT, + street1Raises INT, + street2Raises INT, + street3Raises INT, + street4Raises INT) + """ + elif db_server == 'sqlite': + self.query['createHudCacheTable'] = """CREATE TABLE HudCache ( + id INTEGER PRIMARY KEY, + gametypeId INT, + playerId INT, + activeSeats INT, + position TEXT, + tourneyTypeId INT, + styleKey TEXT NOT NULL, /* 1st char is style (A/T/H/S), other 6 are the key */ + HDs INT, + + wonWhenSeenStreet1 REAL, + wonWhenSeenStreet2 REAL, + wonWhenSeenStreet3 REAL, + wonWhenSeenStreet4 REAL, + wonAtSD REAL, + + street0VPI INT, + street0Aggr INT, + street0_3BChance INT, + street0_3BDone INT, + street0_4BChance INT, + street0_4BDone INT, + other3BStreet0 INT, + other4BStreet0 INT, + + street1Seen INT, + street2Seen INT, + street3Seen INT, + street4Seen INT, + sawShowdown INT, + street1Aggr INT, + street2Aggr INT, + street3Aggr INT, + street4Aggr INT, + + otherRaisedStreet0 INT, + otherRaisedStreet1 INT, + otherRaisedStreet2 INT, + otherRaisedStreet3 INT, + otherRaisedStreet4 INT, + foldToOtherRaisedStreet0 INT, + foldToOtherRaisedStreet1 INT, + foldToOtherRaisedStreet2 INT, + foldToOtherRaisedStreet3 INT, + foldToOtherRaisedStreet4 INT, + + stealAttemptChance INT, + stealAttempted INT, + foldBbToStealChance INT, + foldedBbToSteal INT, + foldSbToStealChance INT, + foldedSbToSteal INT, + + street1CBChance INT, + street1CBDone INT, + street2CBChance INT, + street2CBDone INT, + street3CBChance INT, + street3CBDone INT, + street4CBChance INT, + street4CBDone INT, + + foldToStreet1CBChance INT, + foldToStreet1CBDone INT, + foldToStreet2CBChance INT, + foldToStreet2CBDone INT, + foldToStreet3CBChance INT, + foldToStreet3CBDone INT, + foldToStreet4CBChance INT, + foldToStreet4CBDone INT, + + totalProfit INT, + + street1CheckCallRaiseChance INT, + street1CheckCallRaiseDone INT, + street2CheckCallRaiseChance INT, + street2CheckCallRaiseDone INT, + street3CheckCallRaiseChance INT, + street3CheckCallRaiseDone INT, + street4CheckCallRaiseChance INT, + street4CheckCallRaiseDone INT, + + street0Calls INT, + street1Calls INT, + street2Calls INT, + street3Calls INT, + street4Calls INT, + street0Bets INT, + street1Bets INT, + street2Bets INT, + street3Bets INT, + street4Bets INT, + street0Raises INT, + street1Raises INT, + street2Raises INT, + street3Raises INT, + street4Raises INT) + """ + + + if db_server == 'mysql': + self.query['addTourneyIndex'] = """ALTER TABLE Tourneys ADD INDEX siteTourneyNo(siteTourneyNo)""" + elif db_server == 'postgresql': + self.query['addTourneyIndex'] = """CREATE INDEX siteTourneyNo ON Tourneys (siteTourneyNo)""" + elif db_server == 'sqlite': + self.query['addHandsIndex'] = """ """ + + if db_server == 'mysql': + self.query['addHandsIndex'] = """ALTER TABLE Hands ADD INDEX siteHandNo(siteHandNo)""" + elif db_server == 'postgresql': + self.query['addHandsIndex'] = """CREATE INDEX siteHandNo ON Hands (siteHandNo)""" + elif db_server == 'sqlite': + self.query['addHandsIndex'] = """ """ + + if db_server == 'mysql': + self.query['addPlayersIndex'] = """ALTER TABLE Players ADD INDEX name(name)""" + elif db_server == 'postgresql': + self.query['addPlayersIndex'] = """CREATE INDEX name ON Players (name)""" + elif db_server == 'sqlite': + self.query['addPlayersIndex'] = """ """ + + + self.query['get_last_hand'] = "select max(id) from Hands" + + self.query['get_player_id'] = """ + select Players.id AS player_id + from Players, Sites + where Players.name = %s + and Sites.name = %s + and Players.SiteId = Sites.id + """ + + self.query['getSiteId'] = """SELECT id from Sites where name = %s""" + + self.query['get_stats_from_hand'] = """ + SELECT hc.playerId AS player_id, + hp.seatNo AS seat, + p.name AS screen_name, + sum(hc.HDs) AS n, + sum(hc.street0VPI) AS vpip, + sum(hc.street0Aggr) AS pfr, + sum(hc.street0_3BChance) AS TB_opp_0, + sum(hc.street0_3BDone) AS TB_0, + sum(hc.street1Seen) AS saw_f, + sum(hc.street1Seen) AS saw_1, + sum(hc.street2Seen) AS saw_2, + sum(hc.street3Seen) AS saw_3, + sum(hc.street4Seen) AS saw_4, + sum(hc.sawShowdown) AS sd, + sum(hc.street1Aggr) AS aggr_1, + sum(hc.street2Aggr) AS aggr_2, + sum(hc.street3Aggr) AS aggr_3, + sum(hc.street4Aggr) AS aggr_4, + sum(hc.otherRaisedStreet1) AS was_raised_1, + sum(hc.otherRaisedStreet2) AS was_raised_2, + sum(hc.otherRaisedStreet3) AS was_raised_3, + sum(hc.otherRaisedStreet4) AS was_raised_4, + sum(hc.foldToOtherRaisedStreet1) AS f_freq_1, + sum(hc.foldToOtherRaisedStreet2) AS f_freq_2, + sum(hc.foldToOtherRaisedStreet3) AS f_freq_3, + sum(hc.foldToOtherRaisedStreet4) AS f_freq_4, + sum(hc.wonWhenSeenStreet1) AS w_w_s_1, + sum(hc.wonAtSD) AS wmsd, + sum(hc.stealAttemptChance) AS steal_opp, + sum(hc.stealAttempted) AS steal, + sum(hc.foldSbToStealChance) AS SBstolen, + sum(hc.foldedSbToSteal) AS SBnotDef, + sum(hc.foldBbToStealChance) AS BBstolen, + sum(hc.foldedBbToSteal) AS BBnotDef, + sum(hc.street1CBChance) AS CB_opp_1, + sum(hc.street1CBDone) AS CB_1, + sum(hc.street2CBChance) AS CB_opp_2, + sum(hc.street2CBDone) AS CB_2, + sum(hc.street3CBChance) AS CB_opp_3, + sum(hc.street3CBDone) AS CB_3, + sum(hc.street4CBChance) AS CB_opp_4, + sum(hc.street4CBDone) AS CB_4, + sum(hc.foldToStreet1CBChance) AS f_cb_opp_1, + sum(hc.foldToStreet1CBDone) AS f_cb_1, + sum(hc.foldToStreet2CBChance) AS f_cb_opp_2, + sum(hc.foldToStreet2CBDone) AS f_cb_2, + sum(hc.foldToStreet3CBChance) AS f_cb_opp_3, + sum(hc.foldToStreet3CBDone) AS f_cb_3, + sum(hc.foldToStreet4CBChance) AS f_cb_opp_4, + sum(hc.foldToStreet4CBDone) AS f_cb_4, + sum(hc.totalProfit) AS net, + sum(hc.street1CheckCallRaiseChance) AS ccr_opp_1, + sum(hc.street1CheckCallRaiseDone) AS ccr_1, + sum(hc.street2CheckCallRaiseChance) AS ccr_opp_2, + sum(hc.street2CheckCallRaiseDone) AS ccr_2, + sum(hc.street3CheckCallRaiseChance) AS ccr_opp_3, + sum(hc.street3CheckCallRaiseDone) AS ccr_3, + sum(hc.street4CheckCallRaiseChance) AS ccr_opp_4, + sum(hc.street4CheckCallRaiseDone) AS ccr_4 + FROM Hands h + INNER JOIN HandsPlayers hp ON (hp.handId = h.id) + INNER JOIN HudCache hc ON ( hc.PlayerId = hp.PlayerId+0 + 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 + /* 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 + self.query['get_stats_from_hand_aggregated'] = """ + SELECT hc.playerId AS player_id, + max(case when hc.gametypeId = h.gametypeId + then hp.seatNo + else -1 + end) AS seat, + p.name AS screen_name, + sum(hc.HDs) AS n, + sum(hc.street0VPI) AS vpip, + sum(hc.street0Aggr) AS pfr, + sum(hc.street0_3BChance) AS TB_opp_0, + sum(hc.street0_3BDone) AS TB_0, + sum(hc.street1Seen) AS saw_f, + sum(hc.street1Seen) AS saw_1, + sum(hc.street2Seen) AS saw_2, + sum(hc.street3Seen) AS saw_3, + sum(hc.street4Seen) AS saw_4, + sum(hc.sawShowdown) AS sd, + sum(hc.street1Aggr) AS aggr_1, + sum(hc.street2Aggr) AS aggr_2, + sum(hc.street3Aggr) AS aggr_3, + sum(hc.street4Aggr) AS aggr_4, + sum(hc.otherRaisedStreet1) AS was_raised_1, + sum(hc.otherRaisedStreet2) AS was_raised_2, + sum(hc.otherRaisedStreet3) AS was_raised_3, + sum(hc.otherRaisedStreet4) AS was_raised_4, + sum(hc.foldToOtherRaisedStreet1) AS f_freq_1, + sum(hc.foldToOtherRaisedStreet2) AS f_freq_2, + sum(hc.foldToOtherRaisedStreet3) AS f_freq_3, + sum(hc.foldToOtherRaisedStreet4) AS f_freq_4, + sum(hc.wonWhenSeenStreet1) AS w_w_s_1, + sum(hc.wonAtSD) AS wmsd, + sum(hc.stealAttemptChance) AS steal_opp, + sum(hc.stealAttempted) AS steal, + sum(hc.foldSbToStealChance) AS SBstolen, + sum(hc.foldedSbToSteal) AS SBnotDef, + sum(hc.foldBbToStealChance) AS BBstolen, + sum(hc.foldedBbToSteal) AS BBnotDef, + sum(hc.street1CBChance) AS CB_opp_1, + sum(hc.street1CBDone) AS CB_1, + sum(hc.street2CBChance) AS CB_opp_2, + sum(hc.street2CBDone) AS CB_2, + sum(hc.street3CBChance) AS CB_opp_3, + sum(hc.street3CBDone) AS CB_3, + sum(hc.street4CBChance) AS CB_opp_4, + sum(hc.street4CBDone) AS CB_4, + sum(hc.foldToStreet1CBChance) AS f_cb_opp_1, + sum(hc.foldToStreet1CBDone) AS f_cb_1, + sum(hc.foldToStreet2CBChance) AS f_cb_opp_2, + sum(hc.foldToStreet2CBDone) AS f_cb_2, + sum(hc.foldToStreet3CBChance) AS f_cb_opp_3, + sum(hc.foldToStreet3CBDone) AS f_cb_3, + sum(hc.foldToStreet4CBChance) AS f_cb_opp_4, + sum(hc.foldToStreet4CBDone) AS f_cb_4, + sum(hc.totalProfit) AS net, + sum(hc.street1CheckCallRaiseChance) AS ccr_opp_1, + sum(hc.street1CheckCallRaiseDone) AS ccr_1, + sum(hc.street2CheckCallRaiseChance) AS ccr_opp_2, + sum(hc.street2CheckCallRaiseDone) AS ccr_2, + sum(hc.street3CheckCallRaiseChance) AS ccr_opp_3, + sum(hc.street3CheckCallRaiseDone) AS ccr_3, + sum(hc.street4CheckCallRaiseChance) AS ccr_opp_4, + sum(hc.street4CheckCallRaiseDone) AS ccr_4 + FROM Hands h + INNER JOIN HandsPlayers hp ON (hp.handId = h.id) + 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 + /* styleKey is currently 'd' (for date) followed by a yyyymmdd + date key. Set it to 0000000 or similar to get all records */ + /* Note: s means the placeholder 'percent's but we can't include that + in comments. (db api thinks they are actual arguments) + Could 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 /* find gametypes where these match: */ + AND gt1.type = gt2.type /* ring/tourney */ + AND gt1.category = gt2.category /* holdem/stud*/ + AND gt1.limittype = gt2.limittype /* fl/nl */ + AND gt1.bigblind < gt2.bigblind * %s /* bigblind similar size */ + AND gt1.bigblind > gt2.bigblind / %s + AND gt2.id = h.gametypeId) + GROUP BY hc.PlayerId, p.name + """ + + 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 + FROM HandsPlayers INNER JOIN Players ON (HandsPlayers.playerId = Players.id) + WHERE handId = %s + """ +# WHERE handId = %s AND Players.id LIKE %s + + self.query['get_winners_from_hand'] = """ + SELECT name, winnings + FROM HandsPlayers, Players + WHERE winnings > 0 + AND Players.id = HandsPlayers.playerId + AND handId = %s; + """ + + self.query['get_table_name'] = """ + select tableName, maxSeats, category, type + from Hands,Gametypes + where Hands.id = %s + and Gametypes.id = Hands.gametypeId + """ + + self.query['get_actual_seat'] = """ + select seatNo + from HandsPlayers + where HandsPlayers.handId = %s + and HandsPlayers.playerId = (select Players.id from Players + where Players.name = %s) + """ + + self.query['get_cards'] = """ + select + seatNo AS seat_number, + card1, /*card1Value, card1Suit, */ + card2, /*card2Value, card2Suit, */ + card3, /*card3Value, card3Suit, */ + card4, /*card4Value, card4Suit, */ + card5, /*card5Value, card5Suit, */ + card6, /*card6Value, card6Suit, */ + card7 /*card7Value, card7Suit */ + from HandsPlayers, Players + where handID = %s and HandsPlayers.playerId = Players.id + order by seatNo + """ + + self.query['get_common_cards'] = """ + select + boardcard1, + boardcard2, + boardcard3, + boardcard4, + boardcard5 + from Hands + where Id = %s + """ + + self.query['get_action_from_hand'] = """ + SELECT street, Players.name, HandsActions.action, HandsActions.amount, actionno + FROM Players, HandsActions, HandsPlayers + WHERE HandsPlayers.handid = %s + AND HandsPlayers.playerid = Players.id + 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)""" + elif db_server == 'postgresql': + self.query['get_hand_1day_ago'] = """ + select coalesce(max(id),0) + from Hands + where handStart < now() at time zone 'UTC' - interval '1 day'""" + elif db_server == 'sqlite': + self.query['get_hand_1day_ago'] = """ + select coalesce(max(id),0) + from Hands + where handStart < strftime('%J', 'now') - 1""" + + # not used yet ... + # gets a date, would need to use handsplayers (not hudcache) to get exact hand Id + if db_server == 'mysql': + self.query['get_date_nhands_ago'] = """ + select concat( 'd', date_format(max(h.handStart), '%Y%m%d') ) + from (select hp.playerId + ,coalesce(greatest(max(hp.handId)-%s,1),1) as maxminusx + from HandsPlayers hp + where hp.playerId = %s + group by hp.playerId) hp2 + inner join HandsPlayers hp3 on ( hp3.handId <= hp2.maxminusx + and hp3.playerId = hp2.playerId) + inner join Hands h on (h.id = hp3.handId) + """ + elif db_server == 'postgresql': + self.query['get_date_nhands_ago'] = """ + select 'd' || to_char(max(h3.handStart), 'YYMMDD') + from (select hp.playerId + ,coalesce(greatest(max(hp.handId)-%s,1),1) as maxminusx + from HandsPlayers hp + where hp.playerId = %s + group by hp.playerId) hp2 + inner join HandsPlayers hp3 on ( hp3.handId <= hp2.maxminusx + and hp3.playerId = hp2.playerId) + inner join Hands h on (h.id = hp3.handId) + """ + elif db_server == 'sqlite': # untested guess at query: + self.query['get_date_nhands_ago'] = """ + select 'd' || strftime(max(h3.handStart), 'YYMMDD') + from (select hp.playerId + ,coalesce(greatest(max(hp.handId)-%s,1),1) as maxminusx + from HandsPlayers hp + where hp.playerId = %s + group by hp.playerId) hp2 + inner join HandsPlayers hp3 on ( hp3.handId <= hp2.maxminusx + and hp3.playerId = hp2.playerId) + inner join Hands h on (h.id = hp3.handId) + """ + + # used in GuiPlayerStats: + self.query['getPlayerId'] = """SELECT id from Players where name = %s""" + + # used in Filters: + self.query['getSiteId'] = """SELECT id from Sites where name = %s""" + self.query['getGames'] = """SELECT DISTINCT category from Gametypes""" + self.query['getLimits'] = """SELECT DISTINCT bigBlind from Gametypes ORDER by bigBlind DESC""" + + if db_server == 'mysql': + self.query['playerDetailedStats'] = """ + select AS hgametypeid + ,gt.base + ,gt.category + ,upper(gt.limitType) AS limittype + ,s.name + ,min(gt.bigBlind) AS minbigblind + ,max(gt.bigBlind) AS maxbigblind + /*, AS gtid*/ + , AS plposition + ,count(1) AS n + ,100.0*sum(cast(hp.street0VPI as integer))/count(1) AS vpip + ,100.0*sum(cast(hp.street0Aggr as integer))/count(1) AS pfr + ,case when sum(cast(hp.street0_3Bchance as integer)) = 0 then -999 + else 100.0*sum(cast(hp.street0_3Bdone as integer))/sum(cast(hp.street0_3Bchance as integer)) + end AS pf3 + ,case when sum(cast(hp.stealattemptchance as integer)) = 0 then -999 + else 100.0*sum(cast(hp.stealattempted as integer))/sum(cast(hp.stealattemptchance as integer)) + end AS steals + ,100.0*sum(cast(hp.street1Seen as integer))/count(1) AS saw_f + ,100.0*sum(cast(hp.sawShowdown as integer))/count(1) AS sawsd + ,case when sum(cast(hp.street1Seen as integer)) = 0 then -999 + else 100.0*sum(cast(hp.sawShowdown as integer))/sum(cast(hp.street1Seen as integer)) + end AS wtsdwsf + ,case when sum(cast(hp.sawShowdown as integer)) = 0 then -999 + else 100.0*sum(cast(hp.wonAtSD as integer))/sum(cast(hp.sawShowdown as integer)) + end AS wmsd + ,case when sum(cast(hp.street1Seen as integer)) = 0 then -999 + else 100.0*sum(cast(hp.street1Aggr as integer))/sum(cast(hp.street1Seen as integer)) + end AS flafq + ,case when sum(cast(hp.street2Seen as integer)) = 0 then -999 + else 100.0*sum(cast(hp.street2Aggr as integer))/sum(cast(hp.street2Seen as integer)) + end AS tuafq + ,case when sum(cast(hp.street3Seen as integer)) = 0 then -999 + else 100.0*sum(cast(hp.street3Aggr as integer))/sum(cast(hp.street3Seen as integer)) + end AS rvafq + ,case when sum(cast(hp.street1Seen as integer))+sum(cast(hp.street2Seen as integer))+sum(cast(hp.street3Seen as integer)) = 0 then -999 + else 100.0*(sum(cast(hp.street1Aggr as integer))+sum(cast(hp.street2Aggr as integer))+sum(cast(hp.street3Aggr as integer))) + /(sum(cast(hp.street1Seen as integer))+sum(cast(hp.street2Seen as integer))+sum(cast(hp.street3Seen as integer))) + end AS pofafq + ,sum(hp.totalProfit)/100.0 AS net + ,sum(hp.rake)/100.0 AS rake + ,100.0*avg(hp.totalProfit/(gt.bigBlind+0.0)) AS bbper100 + ,avg(hp.totalProfit)/100.0 AS profitperhand + ,100.0*avg((hp.totalProfit+hp.rake)/(gt.bigBlind+0.0)) AS bb100xr + ,avg((hp.totalProfit+hp.rake)/100.0) AS profhndxr + ,avg(h.seats+0.0) AS avgseats + ,variance(hp.totalProfit/100.0) AS variance + from HandsPlayers hp + inner join Hands h on (h.id = hp.handId) + inner join Gametypes gt on (gt.Id = h.gameTypeId) + inner join Sites s on (s.Id = gt.siteId) + where hp.playerId in + and hp.tourneysPlayersId IS NULL + and h.seats + + + and date_format(h.handStart, '%Y-%m-%d') + group by hgameTypeId + ,hp.playerId + ,gt.base + ,gt.category + + ,plposition + ,upper(gt.limitType) + ,s.name + order by hp.playerId + ,gt.base + ,gt.category + + ,case when 'B' then 'B' + when 'S' then 'S' + else concat('Z', ) + end + + ,maxbigblind desc + ,upper(gt.limitType) + ,s.name + """ + else: # assume postgresql + self.query['playerDetailedStats'] = """ + select AS hgametypeid + ,gt.base + ,gt.category + ,upper(gt.limitType) AS limittype + ,s.name + ,min(gt.bigBlind) AS minbigblind + ,max(gt.bigBlind) AS maxbigblind + /*, AS gtid*/ + , AS plposition + ,count(1) AS n + ,100.0*sum(cast(hp.street0VPI as integer))/count(1) AS vpip + ,100.0*sum(cast(hp.street0Aggr as integer))/count(1) AS pfr + ,case when sum(cast(hp.street0_3Bchance as integer)) = 0 then -999 + else 100.0*sum(cast(hp.street0_3Bdone as integer))/sum(cast(hp.street0_3Bchance as integer)) + end AS pf3 + ,case when sum(cast(hp.stealattemptchance as integer)) = 0 then -999 + else 100.0*sum(cast(hp.stealattempted as integer))/sum(cast(hp.stealattemptchance as integer)) + end AS steals + ,100.0*sum(cast(hp.street1Seen as integer))/count(1) AS saw_f + ,100.0*sum(cast(hp.sawShowdown as integer))/count(1) AS sawsd + ,case when sum(cast(hp.street1Seen as integer)) = 0 then -999 + else 100.0*sum(cast(hp.sawShowdown as integer))/sum(cast(hp.street1Seen as integer)) + end AS wtsdwsf + ,case when sum(cast(hp.sawShowdown as integer)) = 0 then -999 + else 100.0*sum(cast(hp.wonAtSD as integer))/sum(cast(hp.sawShowdown as integer)) + end AS wmsd + ,case when sum(cast(hp.street1Seen as integer)) = 0 then -999 + else 100.0*sum(cast(hp.street1Aggr as integer))/sum(cast(hp.street1Seen as integer)) + end AS flafq + ,case when sum(cast(hp.street2Seen as integer)) = 0 then -999 + else 100.0*sum(cast(hp.street2Aggr as integer))/sum(cast(hp.street2Seen as integer)) + end AS tuafq + ,case when sum(cast(hp.street3Seen as integer)) = 0 then -999 + else 100.0*sum(cast(hp.street3Aggr as integer))/sum(cast(hp.street3Seen as integer)) + end AS rvafq + ,case when sum(cast(hp.street1Seen as integer))+sum(cast(hp.street2Seen as integer))+sum(cast(hp.street3Seen as integer)) = 0 then -999 + else 100.0*(sum(cast(hp.street1Aggr as integer))+sum(cast(hp.street2Aggr as integer))+sum(cast(hp.street3Aggr as integer))) + /(sum(cast(hp.street1Seen as integer))+sum(cast(hp.street2Seen as integer))+sum(cast(hp.street3Seen as integer))) + end AS pofafq + ,sum(hp.totalProfit)/100.0 AS net + ,sum(hp.rake)/100.0 AS rake + ,100.0*avg(hp.totalProfit/(gt.bigBlind+0.0)) AS bbper100 + ,avg(hp.totalProfit)/100.0 AS profitperhand + ,100.0*avg((hp.totalProfit+hp.rake)/(gt.bigBlind+0.0)) AS bb100xr + ,avg((hp.totalProfit+hp.rake)/100.0) AS profhndxr + ,avg(h.seats+0.0) AS avgseats + ,variance(hp.totalProfit/100.0) AS variance + from HandsPlayers hp + inner join Hands h on (h.id = hp.handId) + inner join Gametypes gt on (gt.Id = h.gameTypeId) + inner join Sites s on (s.Id = gt.siteId) + where hp.playerId in + and hp.tourneysPlayersId IS NULL + and h.seats + + + and to_char(h.handStart, 'YYYY-MM-DD') + group by hgameTypeId + ,hp.playerId + ,gt.base + ,gt.category + + ,plposition + ,upper(gt.limitType) + ,s.name + order by hp.playerId + ,gt.base + ,gt.category + + ,case when 'B' then 'B' + when 'S' then 'S' + when '0' then 'Y' + else 'Z'|| + end + + ,maxbigblind desc + ,upper(gt.limitType) + ,s.name + """ + #elif db_server == 'sqlite': + # self.query['playerDetailedStats'] = """ """ + + if db_server == 'mysql': + self.query['playerStats'] = """ + SELECT + concat(upper(stats.limitType), ' ' + ,concat(upper(substring(stats.category,1,1)),substring(stats.category,2) ), ' ' + ,stats.name, ' ' + ,cast(stats.bigBlindDesc as char) + ) AS Game + ,stats.n + ,stats.vpip + ,stats.pfr + ,stats.pf3 + ,stats.steals + ,stats.saw_f + ,stats.sawsd + ,stats.wtsdwsf + ,stats.wmsd + ,stats.FlAFq + ,stats.TuAFq + ,stats.RvAFq + ,stats.PoFAFq + ,stats.Net + ,stats.BBper100 + ,stats.Profitperhand + ,case when hprof2.variance = -999 then '-' + else format(hprof2.variance, 2) + end AS Variance + ,stats.AvgSeats + FROM + (select /* stats from hudcache */ + gt.base + ,gt.category + ,upper(gt.limitType) as limitType + ,s.name + , AS bigBlindDesc + , AS gtId + ,sum(HDs) AS n + ,format(100.0*sum(street0VPI)/sum(HDs),1) AS vpip + ,format(100.0*sum(street0Aggr)/sum(HDs),1) AS pfr + ,case when sum(street0_3Bchance) = 0 then '0' + else format(100.0*sum(street0_3Bdone)/sum(street0_3Bchance),1) + end AS pf3 + ,case when sum(stealattemptchance) = 0 then '-' + else format(100.0*sum(stealattempted)/sum(stealattemptchance),1) + end AS steals + ,format(100.0*sum(street1Seen)/sum(HDs),1) AS saw_f + ,format(100.0*sum(sawShowdown)/sum(HDs),1) AS sawsd + ,case when sum(street1Seen) = 0 then '-' + else format(100.0*sum(sawShowdown)/sum(street1Seen),1) + end AS wtsdwsf + ,case when sum(sawShowdown) = 0 then '-' + else format(100.0*sum(wonAtSD)/sum(sawShowdown),1) + end AS wmsd + ,case when sum(street1Seen) = 0 then '-' + else format(100.0*sum(street1Aggr)/sum(street1Seen),1) + end AS FlAFq + ,case when sum(street2Seen) = 0 then '-' + else format(100.0*sum(street2Aggr)/sum(street2Seen),1) + end AS TuAFq + ,case when sum(street3Seen) = 0 then '-' + else format(100.0*sum(street3Aggr)/sum(street3Seen),1) + end AS RvAFq + ,case when sum(street1Seen)+sum(street2Seen)+sum(street3Seen) = 0 then '-' + else format(100.0*(sum(street1Aggr)+sum(street2Aggr)+sum(street3Aggr)) + /(sum(street1Seen)+sum(street2Seen)+sum(street3Seen)),1) + end AS PoFAFq + ,format(sum(totalProfit)/100.0,2) AS Net + ,format((sum(totalProfit/(gt.bigBlind+0.0))) / (sum(HDs)/100.0),2) + AS BBper100 + ,format( (sum(totalProfit)/100.0) / sum(HDs), 4) AS Profitperhand + ,format( sum(activeSeats*HDs)/(sum(HDs)+0.0), 2) AS AvgSeats + from Gametypes gt + inner join Sites s on s.Id = gt.siteId + inner join HudCache hc on hc.gameTypeId = gt.Id + where hc.playerId in + and + and hc.activeSeats + and concat( '20', substring(hc.styleKey,2,2), '-', substring(hc.styleKey,4,2), '-' + , substring(hc.styleKey,6,2) ) + group by gt.base + ,gt.category + ,upper(gt.limitType) + ,s.name + + ,gtId + ) stats + inner join + ( select # profit from handsplayers/handsactions + hprof.gtId, sum(hprof.profit) sum_profit, + avg(hprof.profit/100.0) profitperhand, + case when hprof.gtId = -1 then -999 + else variance(hprof.profit/100.0) + end as variance + from + (select hp.handId, as gtId, hp.totalProfit as profit + from HandsPlayers hp + inner join Hands h ON h.id = hp.handId + where hp.playerId in + and hp.tourneysPlayersId IS NULL + and date_format(h.handStart, '%Y-%m-%d') + group by hp.handId, gtId, hp.totalProfit + ) hprof + group by hprof.gtId + ) hprof2 + on hprof2.gtId = stats.gtId + order by stats.category, stats.limittype, stats.bigBlindDesc desc """ + else: # assume postgres + self.query['playerStats'] = """ + SELECT upper(stats.limitType) || ' ' + || initcap(stats.category) || ' ' + || stats.name || ' ' + || stats.bigBlindDesc AS Game + ,stats.n + ,stats.vpip + ,stats.pfr + ,stats.pf3 + ,stats.steals + ,stats.saw_f + ,stats.sawsd + ,stats.wtsdwsf + ,stats.wmsd + ,stats.FlAFq + ,stats.TuAFq + ,stats.RvAFq + ,stats.PoFAFq + ,stats.Net + ,stats.BBper100 + ,stats.Profitperhand + ,case when hprof2.variance = -999 then '-' + else to_char(hprof2.variance, '0D00') + end AS Variance + ,AvgSeats + FROM + (select gt.base + ,gt.category + ,upper(gt.limitType) AS limitType + ,s.name + , AS bigBlindDesc + , AS gtId + ,sum(HDs) as n + ,to_char(100.0*sum(street0VPI)/sum(HDs),'990D0') AS vpip + ,to_char(100.0*sum(street0Aggr)/sum(HDs),'90D0') AS pfr + ,case when sum(street0_3Bchance) = 0 then '0' + else to_char(100.0*sum(street0_3Bdone)/sum(street0_3Bchance),'90D0') + end AS pf3 + ,case when sum(stealattemptchance) = 0 then '-' + else to_char(100.0*sum(stealattempted)/sum(stealattemptchance),'90D0') + end AS steals + ,to_char(100.0*sum(street1Seen)/sum(HDs),'90D0') AS saw_f + ,to_char(100.0*sum(sawShowdown)/sum(HDs),'90D0') AS sawsd + ,case when sum(street1Seen) = 0 then '-' + else to_char(100.0*sum(sawShowdown)/sum(street1Seen),'90D0') + end AS wtsdwsf + ,case when sum(sawShowdown) = 0 then '-' + else to_char(100.0*sum(wonAtSD)/sum(sawShowdown),'90D0') + end AS wmsd + ,case when sum(street1Seen) = 0 then '-' + else to_char(100.0*sum(street1Aggr)/sum(street1Seen),'90D0') + end AS FlAFq + ,case when sum(street2Seen) = 0 then '-' + else to_char(100.0*sum(street2Aggr)/sum(street2Seen),'90D0') + end AS TuAFq + ,case when sum(street3Seen) = 0 then '-' + else to_char(100.0*sum(street3Aggr)/sum(street3Seen),'90D0') + end AS RvAFq + ,case when sum(street1Seen)+sum(street2Seen)+sum(street3Seen) = 0 then '-' + else to_char(100.0*(sum(street1Aggr)+sum(street2Aggr)+sum(street3Aggr)) + /(sum(street1Seen)+sum(street2Seen)+sum(street3Seen)),'90D0') + end AS PoFAFq + ,round(sum(totalProfit)/100.0,2) AS Net + ,to_char((sum(totalProfit/(gt.bigBlind+0.0))) / (sum(HDs)/100.0), '990D00') + AS BBper100 + ,to_char(sum(totalProfit/100.0) / (sum(HDs)+0.0), '990D0000') AS Profitperhand + ,to_char(sum(activeSeats*HDs)/(sum(HDs)+0.0),'90D00') AS AvgSeats + from Gametypes gt + inner join Sites s on s.Id = gt.siteId + inner join HudCache hc on hc.gameTypeId = gt.Id + where hc.playerId in + and + and hc.activeSeats + and '20' || SUBSTR(hc.styleKey,2,2) || '-' || SUBSTR(hc.styleKey,4,2) || '-' + || SUBSTR(hc.styleKey,6,2) + group by gt.base + ,gt.category + ,upper(gt.limitType) + ,s.name + + ,gtId + ) stats + inner join + ( select + hprof.gtId, sum(hprof.profit) AS sum_profit, + avg(hprof.profit/100.0) AS profitperhand, + case when hprof.gtId = -1 then -999 + else variance(hprof.profit/100.0) + end as variance + from + (select hp.handId, as gtId, hp.totalProfit as profit + from HandsPlayers hp + inner join Hands h ON (h.id = hp.handId) + where hp.playerId in + and hp.tourneysPlayersId IS NULL + and to_char(h.handStart, 'YYYY-MM-DD') + group by hp.handId, gtId, hp.totalProfit + ) hprof + group by hprof.gtId + ) hprof2 + on hprof2.gtId = stats.gtId + order by stats.base, stats.limittype, stats.bigBlindDesc desc """ + #elif db_server == 'sqlite': + # self.query['playerStats'] = """ """ + + if db_server == 'mysql': + self.query['playerStatsByPosition'] = """ + SELECT + concat(upper(stats.limitType), ' ' + ,concat(upper(substring(stats.category,1,1)),substring(stats.category,2) ), ' ' + ,stats.name, ' ' + ,cast(stats.bigBlindDesc as char) + ) AS Game + ,case when stats.PlPosition = -2 then 'BB' + when stats.PlPosition = -1 then 'SB' + when stats.PlPosition = 0 then 'Btn' + when stats.PlPosition = 1 then 'CO' + when stats.PlPosition = 2 then 'MP' + when stats.PlPosition = 5 then 'EP' + else 'xx' + end AS PlPosition + ,stats.n + ,stats.vpip + ,stats.pfr + ,stats.pf3 + ,stats.steals + ,stats.saw_f + ,stats.sawsd + ,stats.wtsdwsf + ,stats.wmsd + ,stats.FlAFq + ,stats.TuAFq + ,stats.RvAFq + ,stats.PoFAFq + ,stats.Net + ,stats.BBper100 + ,stats.Profitperhand + ,case when hprof2.variance = -999 then '-' + else format(hprof2.variance, 2) + end AS Variance + ,stats.AvgSeats + FROM + (select /* stats from hudcache */ + gt.base + ,gt.category + ,upper(gt.limitType) AS limitType + ,s.name + , AS bigBlindDesc + , AS gtId + ,case when hc.position = 'B' then -2 + when hc.position = 'S' then -1 + when hc.position = 'D' then 0 + when hc.position = 'C' then 1 + when hc.position = 'M' then 2 + when hc.position = 'E' then 5 + else 9 + end as PlPosition + ,sum(HDs) AS n + ,format(100.0*sum(street0VPI)/sum(HDs),1) AS vpip + ,format(100.0*sum(street0Aggr)/sum(HDs),1) AS pfr + ,case when sum(street0_3Bchance) = 0 then '0' + else format(100.0*sum(street0_3Bdone)/sum(street0_3Bchance),1) + end AS pf3 + ,case when sum(stealattemptchance) = 0 then '-' + else format(100.0*sum(stealattempted)/sum(stealattemptchance),1) + end AS steals + ,format(100.0*sum(street1Seen)/sum(HDs),1) AS saw_f + ,format(100.0*sum(sawShowdown)/sum(HDs),1) AS sawsd + ,case when sum(street1Seen) = 0 then '-' + else format(100.0*sum(sawShowdown)/sum(street1Seen),1) + end AS wtsdwsf + ,case when sum(sawShowdown) = 0 then '-' + else format(100.0*sum(wonAtSD)/sum(sawShowdown),1) + end AS wmsd + ,case when sum(street1Seen) = 0 then '-' + else format(100.0*sum(street1Aggr)/sum(street1Seen),1) + end AS FlAFq + ,case when sum(street2Seen) = 0 then '-' + else format(100.0*sum(street2Aggr)/sum(street2Seen),1) + end AS TuAFq + ,case when sum(street3Seen) = 0 then '-' + else format(100.0*sum(street3Aggr)/sum(street3Seen),1) + end AS RvAFq + ,case when sum(street1Seen)+sum(street2Seen)+sum(street3Seen) = 0 then '-' + else format(100.0*(sum(street1Aggr)+sum(street2Aggr)+sum(street3Aggr)) + /(sum(street1Seen)+sum(street2Seen)+sum(street3Seen)),1) + end AS PoFAFq + ,format(sum(totalProfit)/100.0,2) AS Net + ,format((sum(totalProfit/(gt.bigBlind+0.0))) / (sum(HDs)/100.0),2) + AS BBper100 + ,format( (sum(totalProfit)/100.0) / sum(HDs), 4) AS Profitperhand + ,format( sum(activeSeats*HDs)/(sum(HDs)+0.0), 2) AS AvgSeats + from Gametypes gt + inner join Sites s on s.Id = gt.siteId + inner join HudCache hc on hc.gameTypeId = gt.Id + where hc.playerId in + and + and hc.activeSeats + and concat( '20', substring(hc.styleKey,2,2), '-', substring(hc.styleKey,4,2), '-' + , substring(hc.styleKey,6,2) ) + group by gt.base + ,gt.category + ,upper(gt.limitType) + ,s.name + + ,gtId + + ,PlPosition + ) stats + inner join + ( select # profit from handsplayers/handsactions + hprof.gtId, + case when hprof.position = 'B' then -2 + when hprof.position = 'S' then -1 + when hprof.position in ('3','4') then 2 + when hprof.position in ('6','7') then 5 + else hprof.position + end as PlPosition, + sum(hprof.profit) as sum_profit, + avg(hprof.profit/100.0) as profitperhand, + case when hprof.gtId = -1 then -999 + else variance(hprof.profit/100.0) + end as variance + from + (select hp.handId, as gtId, hp.position + , hp.totalProfit as profit + from HandsPlayers hp + inner join Hands h ON (h.id = hp.handId) + where hp.playerId in + and hp.tourneysPlayersId IS NULL + and date_format(h.handStart, '%Y-%m-%d') + group by hp.handId, gtId, hp.position, hp.totalProfit + ) hprof + group by hprof.gtId, PlPosition + ) hprof2 + on ( hprof2.gtId = stats.gtId + and hprof2.PlPosition = stats.PlPosition) + order by stats.category, stats.limitType, stats.bigBlindDesc desc + , cast(stats.PlPosition as signed) + """ + else: # assume postgresql + self.query['playerStatsByPosition'] = """ + select /* stats from hudcache */ + upper(stats.limitType) || ' ' + || upper(substr(stats.category,1,1)) || substr(stats.category,2) || ' ' + || stats.name || ' ' + || stats.bigBlindDesc AS Game + ,case when stats.PlPosition = -2 then 'BB' + when stats.PlPosition = -1 then 'SB' + when stats.PlPosition = 0 then 'Btn' + when stats.PlPosition = 1 then 'CO' + when stats.PlPosition = 2 then 'MP' + when stats.PlPosition = 5 then 'EP' + else 'xx' + end AS PlPosition + ,stats.n + ,stats.vpip + ,stats.pfr + ,stats.pf3 + ,stats.steals + ,stats.saw_f + ,stats.sawsd + ,stats.wtsdwsf + ,stats.wmsd + ,stats.FlAFq + ,stats.TuAFq + ,stats.RvAFq + ,stats.PoFAFq + ,stats.Net + ,stats.BBper100 + ,stats.Profitperhand + ,case when hprof2.variance = -999 then '-' + else to_char(hprof2.variance, '0D00') + end AS Variance + ,stats.AvgSeats + FROM + (select /* stats from hudcache */ + gt.base + ,gt.category + ,upper(gt.limitType) AS limitType + ,s.name + , AS bigBlindDesc + , AS gtId + ,case when hc.position = 'B' then -2 + when hc.position = 'S' then -1 + when hc.position = 'D' then 0 + when hc.position = 'C' then 1 + when hc.position = 'M' then 2 + when hc.position = 'E' then 5 + else 9 + end AS PlPosition + ,sum(HDs) AS n + ,to_char(round(100.0*sum(street0VPI)/sum(HDs)),'990D0') AS vpip + ,to_char(round(100.0*sum(street0Aggr)/sum(HDs)),'90D0') AS pfr + ,case when sum(street0_3Bchance) = 0 then '0' + else to_char(100.0*sum(street0_3Bdone)/sum(street0_3Bchance),'90D0') + end AS pf3 + ,case when sum(stealattemptchance) = 0 then '-' + else to_char(100.0*sum(stealattempted)/sum(stealattemptchance),'90D0') + end AS steals + ,to_char(round(100.0*sum(street1Seen)/sum(HDs)),'90D0') AS saw_f + ,to_char(round(100.0*sum(sawShowdown)/sum(HDs)),'90D0') AS sawsd + ,case when sum(street1Seen) = 0 then '-' + else to_char(round(100.0*sum(sawShowdown)/sum(street1Seen)),'90D0') + end AS wtsdwsf + ,case when sum(sawShowdown) = 0 then '-' + else to_char(round(100.0*sum(wonAtSD)/sum(sawShowdown)),'90D0') + end AS wmsd + ,case when sum(street1Seen) = 0 then '-' + else to_char(round(100.0*sum(street1Aggr)/sum(street1Seen)),'90D0') + end AS FlAFq + ,case when sum(street2Seen) = 0 then '-' + else to_char(round(100.0*sum(street2Aggr)/sum(street2Seen)),'90D0') + end AS TuAFq + ,case when sum(street3Seen) = 0 then '-' + else to_char(round(100.0*sum(street3Aggr)/sum(street3Seen)),'90D0') + end AS RvAFq + ,case when sum(street1Seen)+sum(street2Seen)+sum(street3Seen) = 0 then '-' + else to_char(round(100.0*(sum(street1Aggr)+sum(street2Aggr)+sum(street3Aggr)) + /(sum(street1Seen)+sum(street2Seen)+sum(street3Seen))),'90D0') + end AS PoFAFq + ,to_char(sum(totalProfit)/100.0,'9G999G990D00') AS Net + ,case when sum(HDs) = 0 then '0' + else to_char(sum(totalProfit/(gt.bigBlind+0.0)) / (sum(HDs)/100.0), '990D00') + end AS BBper100 + ,case when sum(HDs) = 0 then '0' + else to_char( (sum(totalProfit)/100.0) / sum(HDs), '90D0000') + end AS Profitperhand + ,to_char(sum(activeSeats*HDs)/(sum(HDs)+0.0),'90D00') AS AvgSeats + from Gametypes gt + inner join Sites s on (s.Id = gt.siteId) + inner join HudCache hc on (hc.gameTypeId = gt.Id) + where hc.playerId in + and + and hc.activeSeats + and '20' || SUBSTR(hc.styleKey,2,2) || '-' || SUBSTR(hc.styleKey,4,2) || '-' + || SUBSTR(hc.styleKey,6,2) + group by gt.base + ,gt.category + ,upper(gt.limitType) + ,s.name + + ,gtId + + ,PlPosition + ) stats + inner join + ( select /* profit from handsplayers/handsactions */ + hprof.gtId, + case when hprof.position = 'B' then -2 + when hprof.position = 'S' then -1 + when hprof.position in ('3','4') then 2 + when hprof.position in ('6','7') then 5 + else cast(hprof.position as smallint) + end as PlPosition, + sum(hprof.profit) as sum_profit, + avg(hprof.profit/100.0) as profitperhand, + case when hprof.gtId = -1 then -999 + else variance(hprof.profit/100.0) + end as variance + from + (select hp.handId, as gtId, hp.position + , hp.totalProfit as profit + from HandsPlayers hp + inner join Hands h ON (h.id = hp.handId) + where hp.playerId in + and hp.tourneysPlayersId IS NULL + and to_char(h.handStart, 'YYYY-MM-DD') + group by hp.handId, gameTypeId, hp.position, hp.totalProfit + ) hprof + group by hprof.gtId, PlPosition + ) hprof2 + on ( hprof2.gtId = stats.gtId + and hprof2.PlPosition = stats.PlPosition) + order by stats.category, stats.limitType, stats.bigBlindDesc desc + , cast(stats.PlPosition as smallint) + """ + #elif db_server == 'sqlite': + # self.query['playerStatsByPosition'] = """ """ + + self.query['getRingProfitAllHandsPlayerIdSite'] = """ + SELECT hp.handId, hp.totalProfit, hp.totalProfit, hp.totalProfit + FROM HandsPlayers hp + INNER JOIN Players pl ON (hp.playerId = pl.id) + INNER JOIN Hands h ON (h.id = hp.handId) + INNER JOIN Gametypes g ON (h.gametypeId = g.id) + where pl.id in + AND pl.siteId in + AND h.handStart > '' + AND h.handStart < '' + AND g.bigBlind in + AND hp.tourneysPlayersId IS NULL + GROUP BY h.handStart, hp.handId, hp.totalProfit + ORDER BY h.handStart""" + + + #################################### + # Queries to rebuild/modify hudcache + #################################### + + self.query['clearHudCache'] = """DELETE FROM HudCache""" + + if db_server == 'mysql': + self.query['rebuildHudCache'] = """ + INSERT INTO HudCache + (gametypeId + ,playerId + ,activeSeats + ,position + ,tourneyTypeId + ,styleKey + ,HDs + ,wonWhenSeenStreet1 + ,wonAtSD + ,street0VPI + ,street0Aggr + ,street0_3BChance + ,street0_3BDone + ,street1Seen + ,street2Seen + ,street3Seen + ,street4Seen + ,sawShowdown + ,street1Aggr + ,street2Aggr + ,street3Aggr + ,street4Aggr + ,otherRaisedStreet1 + ,otherRaisedStreet2 + ,otherRaisedStreet3 + ,otherRaisedStreet4 + ,foldToOtherRaisedStreet1 + ,foldToOtherRaisedStreet2 + ,foldToOtherRaisedStreet3 + ,foldToOtherRaisedStreet4 + ,stealAttemptChance + ,stealAttempted + ,foldBbToStealChance + ,foldedBbToSteal + ,foldSbToStealChance + ,foldedSbToSteal + ,street1CBChance + ,street1CBDone + ,street2CBChance + ,street2CBDone + ,street3CBChance + ,street3CBDone + ,street4CBChance + ,street4CBDone + ,foldToStreet1CBChance + ,foldToStreet1CBDone + ,foldToStreet2CBChance + ,foldToStreet2CBDone + ,foldToStreet3CBChance + ,foldToStreet3CBDone + ,foldToStreet4CBChance + ,foldToStreet4CBDone + ,totalProfit + ,street1CheckCallRaiseChance + ,street1CheckCallRaiseDone + ,street2CheckCallRaiseChance + ,street2CheckCallRaiseDone + ,street3CheckCallRaiseChance + ,street3CheckCallRaiseDone + ,street4CheckCallRaiseChance + ,street4CheckCallRaiseDone + ) + SELECT h.gametypeId + ,hp.playerId + ,h.seats + ,case when hp.position = 'B' then 'B' + when hp.position = 'S' then 'S' + when hp.position = '0' then 'D' + when hp.position = '1' then 'C' + when hp.position = '2' then 'M' + when hp.position = '3' then 'M' + when hp.position = '4' then 'M' + when hp.position = '5' then 'E' + when hp.position = '6' then 'E' + when hp.position = '7' then 'E' + when hp.position = '8' then 'E' + when hp.position = '9' then 'E' + else 'E' + end AS hc_position + ,hp.tourneyTypeId + ,date_format(h.handStart, 'd%y%m%d') + ,count(1) + ,sum(wonWhenSeenStreet1) + ,sum(wonAtSD) + ,sum(street0VPI) + ,sum(street0Aggr) + ,sum(street0_3BChance) + ,sum(street0_3BDone) + ,sum(street1Seen) + ,sum(street2Seen) + ,sum(street3Seen) + ,sum(street4Seen) + ,sum(sawShowdown) + ,sum(street1Aggr) + ,sum(street2Aggr) + ,sum(street3Aggr) + ,sum(street4Aggr) + ,sum(otherRaisedStreet1) + ,sum(otherRaisedStreet2) + ,sum(otherRaisedStreet3) + ,sum(otherRaisedStreet4) + ,sum(foldToOtherRaisedStreet1) + ,sum(foldToOtherRaisedStreet2) + ,sum(foldToOtherRaisedStreet3) + ,sum(foldToOtherRaisedStreet4) + ,sum(stealAttemptChance) + ,sum(stealAttempted) + ,sum(foldBbToStealChance) + ,sum(foldedBbToSteal) + ,sum(foldSbToStealChance) + ,sum(foldedSbToSteal) + ,sum(street1CBChance) + ,sum(street1CBDone) + ,sum(street2CBChance) + ,sum(street2CBDone) + ,sum(street3CBChance) + ,sum(street3CBDone) + ,sum(street4CBChance) + ,sum(street4CBDone) + ,sum(foldToStreet1CBChance) + ,sum(foldToStreet1CBDone) + ,sum(foldToStreet2CBChance) + ,sum(foldToStreet2CBDone) + ,sum(foldToStreet3CBChance) + ,sum(foldToStreet3CBDone) + ,sum(foldToStreet4CBChance) + ,sum(foldToStreet4CBDone) + ,sum(totalProfit) + ,sum(street1CheckCallRaiseChance) + ,sum(street1CheckCallRaiseDone) + ,sum(street2CheckCallRaiseChance) + ,sum(street2CheckCallRaiseDone) + ,sum(street3CheckCallRaiseChance) + ,sum(street3CheckCallRaiseDone) + ,sum(street4CheckCallRaiseChance) + ,sum(street4CheckCallRaiseDone) + FROM HandsPlayers hp + INNER JOIN Hands h ON (h.id = hp.handId) + GROUP BY h.gametypeId + ,hp.playerId + ,h.seats + ,hc_position + ,hp.tourneyTypeId + ,date_format(h.handStart, 'd%y%m%d') +""" + elif db_server == 'postgresql': + self.query['rebuildHudCache'] = """ + INSERT INTO HudCache + (gametypeId + ,playerId + ,activeSeats + ,position + ,tourneyTypeId + ,styleKey + ,HDs + ,wonWhenSeenStreet1 + ,wonAtSD + ,street0VPI + ,street0Aggr + ,street0_3BChance + ,street0_3BDone + ,street1Seen + ,street2Seen + ,street3Seen + ,street4Seen + ,sawShowdown + ,street1Aggr + ,street2Aggr + ,street3Aggr + ,street4Aggr + ,otherRaisedStreet1 + ,otherRaisedStreet2 + ,otherRaisedStreet3 + ,otherRaisedStreet4 + ,foldToOtherRaisedStreet1 + ,foldToOtherRaisedStreet2 + ,foldToOtherRaisedStreet3 + ,foldToOtherRaisedStreet4 + ,stealAttemptChance + ,stealAttempted + ,foldBbToStealChance + ,foldedBbToSteal + ,foldSbToStealChance + ,foldedSbToSteal + ,street1CBChance + ,street1CBDone + ,street2CBChance + ,street2CBDone + ,street3CBChance + ,street3CBDone + ,street4CBChance + ,street4CBDone + ,foldToStreet1CBChance + ,foldToStreet1CBDone + ,foldToStreet2CBChance + ,foldToStreet2CBDone + ,foldToStreet3CBChance + ,foldToStreet3CBDone + ,foldToStreet4CBChance + ,foldToStreet4CBDone + ,totalProfit + ,street1CheckCallRaiseChance + ,street1CheckCallRaiseDone + ,street2CheckCallRaiseChance + ,street2CheckCallRaiseDone + ,street3CheckCallRaiseChance + ,street3CheckCallRaiseDone + ,street4CheckCallRaiseChance + ,street4CheckCallRaiseDone + ) + SELECT h.gametypeId + ,hp.playerId + ,h.seats + ,case when hp.position = 'B' then 'B' + when hp.position = 'S' then 'S' + when hp.position = '0' then 'D' + when hp.position = '1' then 'C' + when hp.position = '2' then 'M' + when hp.position = '3' then 'M' + when hp.position = '4' then 'M' + when hp.position = '5' then 'E' + when hp.position = '6' then 'E' + when hp.position = '7' then 'E' + when hp.position = '8' then 'E' + when hp.position = '9' then 'E' + else 'E' + end AS hc_position + ,hp.tourneyTypeId + ,'d' || to_char(h.handStart, 'YYMMDD') + ,count(1) + ,sum(wonWhenSeenStreet1) + ,sum(wonAtSD) + ,sum(CAST(street0VPI as integer)) + ,sum(CAST(street0Aggr as integer)) + ,sum(CAST(street0_3BChance as integer)) + ,sum(CAST(street0_3BDone as integer)) + ,sum(CAST(street1Seen as integer)) + ,sum(CAST(street2Seen as integer)) + ,sum(CAST(street3Seen as integer)) + ,sum(CAST(street4Seen as integer)) + ,sum(CAST(sawShowdown as integer)) + ,sum(CAST(street1Aggr as integer)) + ,sum(CAST(street2Aggr as integer)) + ,sum(CAST(street3Aggr as integer)) + ,sum(CAST(street4Aggr as integer)) + ,sum(CAST(otherRaisedStreet1 as integer)) + ,sum(CAST(otherRaisedStreet2 as integer)) + ,sum(CAST(otherRaisedStreet3 as integer)) + ,sum(CAST(otherRaisedStreet4 as integer)) + ,sum(CAST(foldToOtherRaisedStreet1 as integer)) + ,sum(CAST(foldToOtherRaisedStreet2 as integer)) + ,sum(CAST(foldToOtherRaisedStreet3 as integer)) + ,sum(CAST(foldToOtherRaisedStreet4 as integer)) + ,sum(CAST(stealAttemptChance as integer)) + ,sum(CAST(stealAttempted as integer)) + ,sum(CAST(foldBbToStealChance as integer)) + ,sum(CAST(foldedBbToSteal as integer)) + ,sum(CAST(foldSbToStealChance as integer)) + ,sum(CAST(foldedSbToSteal as integer)) + ,sum(CAST(street1CBChance as integer)) + ,sum(CAST(street1CBDone as integer)) + ,sum(CAST(street2CBChance as integer)) + ,sum(CAST(street2CBDone as integer)) + ,sum(CAST(street3CBChance as integer)) + ,sum(CAST(street3CBDone as integer)) + ,sum(CAST(street4CBChance as integer)) + ,sum(CAST(street4CBDone as integer)) + ,sum(CAST(foldToStreet1CBChance as integer)) + ,sum(CAST(foldToStreet1CBDone as integer)) + ,sum(CAST(foldToStreet2CBChance as integer)) + ,sum(CAST(foldToStreet2CBDone as integer)) + ,sum(CAST(foldToStreet3CBChance as integer)) + ,sum(CAST(foldToStreet3CBDone as integer)) + ,sum(CAST(foldToStreet4CBChance as integer)) + ,sum(CAST(foldToStreet4CBDone as integer)) + ,sum(CAST(totalProfit as integer)) + ,sum(CAST(street1CheckCallRaiseChance as integer)) + ,sum(CAST(street1CheckCallRaiseDone as integer)) + ,sum(CAST(street2CheckCallRaiseChance as integer)) + ,sum(CAST(street2CheckCallRaiseDone as integer)) + ,sum(CAST(street3CheckCallRaiseChance as integer)) + ,sum(CAST(street3CheckCallRaiseDone as integer)) + ,sum(CAST(street4CheckCallRaiseChance as integer)) + ,sum(CAST(street4CheckCallRaiseDone as integer)) + FROM HandsPlayers hp + INNER JOIN Hands h ON (h.id = hp.handId) + GROUP BY h.gametypeId + ,hp.playerId + ,h.seats + ,hc_position + ,hp.tourneyTypeId + ,to_char(h.handStart, 'YYMMDD') +""" + else: # assume sqlite + self.query['rebuildHudCache'] = """ + INSERT INTO HudCache + (gametypeId + ,playerId + ,activeSeats + ,position + ,tourneyTypeId + ,styleKey + ,HDs + ,wonWhenSeenStreet1 + ,wonAtSD + ,street0VPI + ,street0Aggr + ,street0_3BChance + ,street0_3BDone + ,street1Seen + ,street2Seen + ,street3Seen + ,street4Seen + ,sawShowdown + ,street1Aggr + ,street2Aggr + ,street3Aggr + ,street4Aggr + ,otherRaisedStreet1 + ,otherRaisedStreet2 + ,otherRaisedStreet3 + ,otherRaisedStreet4 + ,foldToOtherRaisedStreet1 + ,foldToOtherRaisedStreet2 + ,foldToOtherRaisedStreet3 + ,foldToOtherRaisedStreet4 + ,stealAttemptChance + ,stealAttempted + ,foldBbToStealChance + ,foldedBbToSteal + ,foldSbToStealChance + ,foldedSbToSteal + ,street1CBChance + ,street1CBDone + ,street2CBChance + ,street2CBDone + ,street3CBChance + ,street3CBDone + ,street4CBChance + ,street4CBDone + ,foldToStreet1CBChance + ,foldToStreet1CBDone + ,foldToStreet2CBChance + ,foldToStreet2CBDone + ,foldToStreet3CBChance + ,foldToStreet3CBDone + ,foldToStreet4CBChance + ,foldToStreet4CBDone + ,totalProfit + ,street1CheckCallRaiseChance + ,street1CheckCallRaiseDone + ,street2CheckCallRaiseChance + ,street2CheckCallRaiseDone + ,street3CheckCallRaiseChance + ,street3CheckCallRaiseDone + ,street4CheckCallRaiseChance + ,street4CheckCallRaiseDone + ) + SELECT h.gametypeId + ,hp.playerId + ,h.seats + ,case when hp.position = 'B' then 'B' + when hp.position = 'S' then 'S' + when hp.position = '0' then 'D' + when hp.position = '1' then 'C' + when hp.position = '2' then 'M' + when hp.position = '3' then 'M' + when hp.position = '4' then 'M' + when hp.position = '5' then 'E' + when hp.position = '6' then 'E' + when hp.position = '7' then 'E' + when hp.position = '8' then 'E' + when hp.position = '9' then 'E' + else 'E' + end AS hc_position + ,hp.tourneyTypeId + ,'d' || substr(strftime('%Y%m%d', h.handStart),3,7) + ,count(1) + ,sum(wonWhenSeenStreet1) + ,sum(wonAtSD) + ,sum(CAST(street0VPI as integer)) + ,sum(CAST(street0Aggr as integer)) + ,sum(CAST(street0_3BChance as integer)) + ,sum(CAST(street0_3BDone as integer)) + ,sum(CAST(street1Seen as integer)) + ,sum(CAST(street2Seen as integer)) + ,sum(CAST(street3Seen as integer)) + ,sum(CAST(street4Seen as integer)) + ,sum(CAST(sawShowdown as integer)) + ,sum(CAST(street1Aggr as integer)) + ,sum(CAST(street2Aggr as integer)) + ,sum(CAST(street3Aggr as integer)) + ,sum(CAST(street4Aggr as integer)) + ,sum(CAST(otherRaisedStreet1 as integer)) + ,sum(CAST(otherRaisedStreet2 as integer)) + ,sum(CAST(otherRaisedStreet3 as integer)) + ,sum(CAST(otherRaisedStreet4 as integer)) + ,sum(CAST(foldToOtherRaisedStreet1 as integer)) + ,sum(CAST(foldToOtherRaisedStreet2 as integer)) + ,sum(CAST(foldToOtherRaisedStreet3 as integer)) + ,sum(CAST(foldToOtherRaisedStreet4 as integer)) + ,sum(CAST(stealAttemptChance as integer)) + ,sum(CAST(stealAttempted as integer)) + ,sum(CAST(foldBbToStealChance as integer)) + ,sum(CAST(foldedBbToSteal as integer)) + ,sum(CAST(foldSbToStealChance as integer)) + ,sum(CAST(foldedSbToSteal as integer)) + ,sum(CAST(street1CBChance as integer)) + ,sum(CAST(street1CBDone as integer)) + ,sum(CAST(street2CBChance as integer)) + ,sum(CAST(street2CBDone as integer)) + ,sum(CAST(street3CBChance as integer)) + ,sum(CAST(street3CBDone as integer)) + ,sum(CAST(street4CBChance as integer)) + ,sum(CAST(street4CBDone as integer)) + ,sum(CAST(foldToStreet1CBChance as integer)) + ,sum(CAST(foldToStreet1CBDone as integer)) + ,sum(CAST(foldToStreet2CBChance as integer)) + ,sum(CAST(foldToStreet2CBDone as integer)) + ,sum(CAST(foldToStreet3CBChance as integer)) + ,sum(CAST(foldToStreet3CBDone as integer)) + ,sum(CAST(foldToStreet4CBChance as integer)) + ,sum(CAST(foldToStreet4CBDone as integer)) + ,sum(CAST(totalProfit as integer)) + ,sum(CAST(street1CheckCallRaiseChance as integer)) + ,sum(CAST(street1CheckCallRaiseDone as integer)) + ,sum(CAST(street2CheckCallRaiseChance as integer)) + ,sum(CAST(street2CheckCallRaiseDone as integer)) + ,sum(CAST(street3CheckCallRaiseChance as integer)) + ,sum(CAST(street3CheckCallRaiseDone as integer)) + ,sum(CAST(street4CheckCallRaiseChance as integer)) + ,sum(CAST(street4CheckCallRaiseDone as integer)) + FROM HandsPlayers hp + INNER JOIN Hands h ON (h.id = hp.handId) + GROUP BY h.gametypeId + ,hp.playerId + ,h.seats + ,hc_position + ,hp.tourneyTypeId + ,'d' || substr(strftime('%Y%m%d', h.handStart),3,7) +""" + + if db_server == 'mysql': + self.query['analyze'] = """ + analyze table Autorates, GameTypes, Hands, HandsPlayers, Hudcache, Players + , Settings, Sites, Tourneys, TourneysPlayers, TourneyTypes + """ + else: # assume postgres + self.query['analyze'] = "vacuum analyze" + + if db_server == 'mysql': + self.query['lockForInsert'] = """ + lock tables Hands write, HandsPlayers write, HandsActions write, Players write + , HudCache write, GameTypes write, Sites write, Tourneys write + , TourneysPlayers write, TourneyTypes write, Autorates write + """ + else: # assume postgres + self.query['lockForInsert'] = "" + + self.query['getGametypeFL'] = """SELECT id + FROM Gametypes + WHERE siteId=%s + AND type=%s + AND category=%s + AND limitType=%s + AND smallBet=%s + AND bigBet=%s + """ + + self.query['getGametypeNL'] = """SELECT id + FROM Gametypes + WHERE siteId=%s + AND type=%s + AND category=%s + AND limitType=%s + AND smallBlind=%s + AND bigBlind=%s + """ + + self.query['insertGameTypes'] = """INSERT INTO Gametypes + (siteId, type, base, category, limitType + ,hiLo, smallBlind, bigBlind, smallBet, bigBet) + VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)""" + + self.query['isAlreadyInDB'] = """SELECT id FROM Hands + WHERE gametypeId=%s AND siteHandNo=%s + """ + + if db_server == 'mysql': + self.query['placeholder'] = u'%s' + elif db_server == 'postgresql': + self.query['placeholder'] = u'%s' + elif db_server == 'sqlite': + self.query['placeholder'] = u'?' + + + # If using sqlite, use the ? placeholder instead of %s + if db_server == 'sqlite': + for k,q in self.query.iteritems(): + self.query[k] = re.sub('%s','?',q) + +if __name__== "__main__": +# just print the default queries and exit + s = Sql() + for key in s.query: + print "For query " + key + ", sql =" + print s.query[key] diff --git a/pyfpdb/fpdb_simple.py b/pyfpdb/fpdb_simple.py index 3f75d8d3..c12d38ca 100644 --- a/pyfpdb/fpdb_simple.py +++ b/pyfpdb/fpdb_simple.py @@ -25,6 +25,7 @@ import datetime import time import re import sys +import locale import Card @@ -37,6 +38,8 @@ MYSQL_INNODB = 2 PGSQL = 3 SQLITE = 4 +(localename, encoding) = locale.getdefaultlocale() + class DuplicateError(Exception): def __init__(self, value): self.value = value @@ -543,7 +546,7 @@ def parseActionType(line): #parses the ante out of the given line and checks which player paid it, updates antes accordingly. def parseAnteLine(line, isTourney, names, antes): for i, name in enumerate(names): - if line.startswith(name.encode("latin-1")): + if line.startswith(name.encode(encoding)): pos = line.rfind("$") + 1 if not isTourney: antes[i] += float2int(line[pos:]) @@ -705,7 +708,7 @@ def parseHandStartTime(topline): def findName(line): pos1 = line.find(":") + 2 pos2 = line.rfind("(") - 1 - return unicode(line[pos1:pos2], "latin-1") + return unicode(line[pos1:pos2], encoding) def parseNames(lines): return [findName(line) for line in lines] @@ -822,7 +825,7 @@ def parseTourneyNo(topline): def parseWinLine(line, names, winnings, isTourney): #print "parseWinLine: line:",line for i,n in enumerate(names): - n = n.encode("latin-1") + n = n.encode(encoding) if line.startswith(n): if isTourney: pos1 = line.rfind("collected ") + 10 @@ -1033,13 +1036,13 @@ def recognisePlayerNo(line, names, atype): #print "recogniseplayerno, names:",names for i in xrange(len(names)): if (atype=="unbet"): - if (line.endswith(names[i].encode("latin-1"))): + if (line.endswith(names[i].encode(encoding))): return (i) elif (line.startswith("Dealt to ")): #print "recognisePlayerNo, card precut, line:",line tmp=line[9:] #print "recognisePlayerNo, card postcut, tmp:",tmp - if (tmp.startswith(names[i].encode("latin-1"))): + if (tmp.startswith(names[i].encode(encoding))): return (i) elif (line.startswith("Seat ")): if (line.startswith("Seat 10")): @@ -1047,10 +1050,10 @@ def recognisePlayerNo(line, names, atype): else: tmp=line[8:] - if (tmp.startswith(names[i].encode("latin-1"))): + if (tmp.startswith(names[i].encode(encoding))): return (i) else: - if (line.startswith(names[i].encode("latin-1"))): + if (line.startswith(names[i].encode(encoding))): return (i) #if we're here we mustve failed raise FpdbError ("failed to recognise player in: "+line+" atype:"+atype) diff --git a/pyfpdb/interlocks.py b/pyfpdb/interlocks.py index 96edaa3e..b19ff43b 100755 --- a/pyfpdb/interlocks.py +++ b/pyfpdb/interlocks.py @@ -1,271 +1,271 @@ - -# Code from http://ender.snowburst.org:4747/~jjohns/interlocks.py -# Thanks JJ! - -import sys -import os, os.path -import subprocess -import time -import signal -import base64 - -InterProcessLock = None - -""" -Just use me like a thread lock. acquire() / release() / locked() - -Differences compared to thread locks: -1. By default, acquire()'s wait parameter is false. -2. When acquire fails, SingleInstanceError is thrown instead of simply returning false. -3. acquire() can take a 3rd parameter retry_time, which, if wait is True, tells the locking - mechanism how long to sleep between retrying the lock. Has no effect for unix/InterProcessLockFcntl. - -Differences in fpdb version to JJ's original: -1. Changed acquire() to return false like other locks -2. Made acquire fail if same process already has the lock -""" - -class SingleInstanceError(RuntimeError): - "Thrown when you try to acquire an InterProcessLock and another version of the process is already running." - -class InterProcessLockBase: - def __init__(self, name=None ): - self._has_lock = False - if not name: - name = sys.argv[0] - self.name = name - - def getHashedName(self): - return base64.b64encode(self.name).replace('=','') - - def acquire_impl(self, wait): abstract - - def acquire(self, wait=False, retry_time=1): - if self._has_lock: # make sure 2nd acquire in same process fails - return False - while not self._has_lock: - try: - self.acquire_impl(wait) - self._has_lock = True - #print 'i have the lock' - except SingleInstanceError: - if not wait: - # raise # change back to normal acquire functionality, sorry JJ! - return False - time.sleep(retry_time) - return True - - def release(self): - self.release_impl() - self._has_lock = False - - def locked(self): - if self._has_lock: - return True - try: - self.acquire() - self.release() - return False - except SingleInstanceError: - return True - -LOCK_FILE_DIRECTORY = '/tmp' - -class InterProcessLockFcntl(InterProcessLockBase): - def __init__(self, name=None): - InterProcessLockBase.__init__(self, name) - self.lockfd = 0 - self.lock_file_name = os.path.join(LOCK_FILE_DIRECTORY, self.getHashedName() + '.lck') - assert(os.path.isdir(LOCK_FILE_DIRECTORY)) - - # This is the suggested way to get a safe file name, but I like having a descriptively named lock file. - def getHashedName(self): - import re - bad_filename_character_re = re.compile(r'/\?<>\\\:;\*\|\'\"\^=\.\[\]') - return bad_filename_character_re.sub('_',self.name) - - def acquire_impl(self, wait): - self.lockfd = open(self.lock_file_name, 'w') - fcntrl_options = fcntl.LOCK_EX - if not wait: - fcntrl_options |= fcntl.LOCK_NB - try: - fcntl.flock(self.lockfd, fcntrl_options) - except IOError: - self.lockfd.close() - self.lockfd = 0 - raise SingleInstanceError('Could not acquire exclusive lock on '+self.lock_file_name) - - def release_impl(self): - fcntl.lockf(self.lockfd, fcntl.LOCK_UN) - self.lockfd.close() - self.lockfd = 0 - try: - os.unlink(self.lock_file_name) - except IOError: - # We don't care about the existence of the file too much here. It's the flock() we care about, - # And that should just go away magically. - pass - -class InterProcessLockWin32(InterProcessLockBase): - def __init__(self, name=None): - InterProcessLockBase.__init__(self, name) - self.mutex = None - - def acquire_impl(self,wait): - self.mutex = win32event.CreateMutex(None, 0, self.getHashedName()) - if win32api.GetLastError() == winerror.ERROR_ALREADY_EXISTS: - self.mutex.Close() - self.mutex = None - raise SingleInstanceError('Could not acquire exclusive lock on ' + self.name) - - def release_impl(self): - self.mutex.Close() - -class InterProcessLockSocket(InterProcessLockBase): - def __init__(self, name=None): - InterProcessLockBase.__init__(self, name) - self.socket = None - self.portno = 65530 - abs(self.getHashedName().__hash__()) % 32749 - - def acquire_impl(self, wait): - self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - try: - self.socket.bind(('127.0.0.1', self.portno)) - except socket.error: - self.socket.close() - self.socket = None - raise SingleInstanceError('Could not acquire exclusive lock on ' + self.name) - - def release_impl(self): - self.socket.close() - self.socket = None - -# Set InterProcessLock to the correct type given the sysem parameters available -try: - import fcntl - InterProcessLock = InterProcessLockFcntl -except ImportError: - try: - import win32event - import win32api - import winerror - InterProcessLock = InterProcessLockWin32 - except ImportError: - import socket - InterProcessLock = InterProcessLockSocket - -def test_construct(): - """ - # Making the name of the test unique so it can be executed my multiple users on the same machine. - >>> test_name = 'InterProcessLockTest' +str(os.getpid()) + str(time.time()) - - >>> lock1 = InterProcessLock(name=test_name) - >>> lock1.acquire() - - >>> lock2 = InterProcessLock(name=test_name) - >>> lock3 = InterProcessLock(name=test_name) - - # Since lock1 is locked, other attempts to acquire it fail. - >>> lock2.acquire() - Traceback (most recent call last): - ... - SingleInstanceError: Could not acquire exclusive lock on /tmp/test.lck - - >>> lock3.acquire() - Traceback (most recent call last): - ... - SingleInstanceError: Could not acquire exclusive lock on /tmp/test.lck - - # Release the lock and let lock2 have it. - >>> lock1.release() - >>> lock2.acquire() - - >>> lock3.acquire() - Traceback (most recent call last): - ... - SingleInstanceError: Could not acquire exclusive lock on /tmp/test.lck - - # Release it and give it back to lock1 - >>> lock2.release() - >>> lock1.acquire() - - >>> lock2.acquire() - Traceback (most recent call last): - ... - SingleInstanceError: Could not acquire exclusive lock on /tmp/test.lck - - # Test lock status - >>> lock2.locked() - True - >>> lock3.locked() - True - >>> lock1.locked() - True - - >>> lock1.release() - - >>> lock2.locked() - False - >>> lock3.locked() - False - >>> lock1.locked() - False - - >>> if os.name == 'posix': - ... def os_independent_kill(pid): - ... import signal - ... os.kill(pid, signal.SIGKILL) - ... else: - ... assert(os.name == 'nt') - ... def os_independent_kill(pid): - ... ''' http://www.python.org/doc/faq/windows/#how-do-i-emulate-os-kill-in-windows ''' - ... import win32api - ... import win32con - ... import pywintypes - ... handle = win32api.OpenProcess(win32con.PROCESS_TERMINATE , pywintypes.FALSE, pid) - ... return (0 != win32api.TerminateProcess(handle, 0)) - - # Test to acquire the lock in another process. - >>> def execute(cmd): - ... cmd = 'import time;' + cmd + 'time.sleep(10);' - ... process = subprocess.Popen([sys.executable, '-c', cmd]) - ... pid = process.pid - ... time.sleep(2) # quick hack, but we test synchronization in the end - ... return pid - - >>> pid = execute('import interlocks;a=interlocks.InterProcessLock(name=\\''+test_name+ '\\');a.acquire();') - - >>> lock1.acquire() - Traceback (most recent call last): - ... - SingleInstanceError: Could not acquire exclusive lock on /tmp/test.lck - - >>> os_independent_kill(pid) - - >>> time.sleep(1) - - >>> lock1.acquire() - >>> lock1.release() - - # Testing wait - - >>> pid = execute('import interlocks;a=interlocks.InterProcessLock(name=\\''+test_name+ '\\');a.acquire();') - - >>> lock1.acquire() - Traceback (most recent call last): - ... - SingleInstanceError: Could not acquire exclusive lock on /tmp/test.lck - - >>> os_independent_kill(pid) - - >>> lock1.acquire(True) - >>> lock1.release() - - """ - - pass - -if __name__=='__main__': - import doctest - doctest.testmod(optionflags=doctest.IGNORE_EXCEPTION_DETAIL) + +# Code from http://ender.snowburst.org:4747/~jjohns/interlocks.py +# Thanks JJ! + +import sys +import os, os.path +import subprocess +import time +import signal +import base64 + +InterProcessLock = None + +""" +Just use me like a thread lock. acquire() / release() / locked() + +Differences compared to thread locks: +1. By default, acquire()'s wait parameter is false. +2. When acquire fails, SingleInstanceError is thrown instead of simply returning false. +3. acquire() can take a 3rd parameter retry_time, which, if wait is True, tells the locking + mechanism how long to sleep between retrying the lock. Has no effect for unix/InterProcessLockFcntl. + +Differences in fpdb version to JJ's original: +1. Changed acquire() to return false like other locks +2. Made acquire fail if same process already has the lock +""" + +class SingleInstanceError(RuntimeError): + "Thrown when you try to acquire an InterProcessLock and another version of the process is already running." + +class InterProcessLockBase: + def __init__(self, name=None ): + self._has_lock = False + if not name: + name = sys.argv[0] + self.name = name + + def getHashedName(self): + return base64.b64encode(self.name).replace('=','') + + def acquire_impl(self, wait): abstract + + def acquire(self, wait=False, retry_time=1): + if self._has_lock: # make sure 2nd acquire in same process fails + return False + while not self._has_lock: + try: + self.acquire_impl(wait) + self._has_lock = True + #print 'i have the lock' + except SingleInstanceError: + if not wait: + # raise # change back to normal acquire functionality, sorry JJ! + return False + time.sleep(retry_time) + return True + + def release(self): + self.release_impl() + self._has_lock = False + + def locked(self): + if self._has_lock: + return True + try: + self.acquire() + self.release() + return False + except SingleInstanceError: + return True + +LOCK_FILE_DIRECTORY = '/tmp' + +class InterProcessLockFcntl(InterProcessLockBase): + def __init__(self, name=None): + InterProcessLockBase.__init__(self, name) + self.lockfd = 0 + self.lock_file_name = os.path.join(LOCK_FILE_DIRECTORY, self.getHashedName() + '.lck') + assert(os.path.isdir(LOCK_FILE_DIRECTORY)) + + # This is the suggested way to get a safe file name, but I like having a descriptively named lock file. + def getHashedName(self): + import re + bad_filename_character_re = re.compile(r'/\?<>\\\:;\*\|\'\"\^=\.\[\]') + return bad_filename_character_re.sub('_',self.name) + + def acquire_impl(self, wait): + self.lockfd = open(self.lock_file_name, 'w') + fcntrl_options = fcntl.LOCK_EX + if not wait: + fcntrl_options |= fcntl.LOCK_NB + try: + fcntl.flock(self.lockfd, fcntrl_options) + except IOError: + self.lockfd.close() + self.lockfd = 0 + raise SingleInstanceError('Could not acquire exclusive lock on '+self.lock_file_name) + + def release_impl(self): + fcntl.lockf(self.lockfd, fcntl.LOCK_UN) + self.lockfd.close() + self.lockfd = 0 + try: + os.unlink(self.lock_file_name) + except IOError: + # We don't care about the existence of the file too much here. It's the flock() we care about, + # And that should just go away magically. + pass + +class InterProcessLockWin32(InterProcessLockBase): + def __init__(self, name=None): + InterProcessLockBase.__init__(self, name) + self.mutex = None + + def acquire_impl(self,wait): + self.mutex = win32event.CreateMutex(None, 0, self.getHashedName()) + if win32api.GetLastError() == winerror.ERROR_ALREADY_EXISTS: + self.mutex.Close() + self.mutex = None + raise SingleInstanceError('Could not acquire exclusive lock on ' + self.name) + + def release_impl(self): + self.mutex.Close() + +class InterProcessLockSocket(InterProcessLockBase): + def __init__(self, name=None): + InterProcessLockBase.__init__(self, name) + self.socket = None + self.portno = 65530 - abs(self.getHashedName().__hash__()) % 32749 + + def acquire_impl(self, wait): + self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + try: + self.socket.bind(('127.0.0.1', self.portno)) + except socket.error: + self.socket.close() + self.socket = None + raise SingleInstanceError('Could not acquire exclusive lock on ' + self.name) + + def release_impl(self): + self.socket.close() + self.socket = None + +# Set InterProcessLock to the correct type given the sysem parameters available +try: + import fcntl + InterProcessLock = InterProcessLockFcntl +except ImportError: + try: + import win32event + import win32api + import winerror + InterProcessLock = InterProcessLockWin32 + except ImportError: + import socket + InterProcessLock = InterProcessLockSocket + +def test_construct(): + """ + # Making the name of the test unique so it can be executed my multiple users on the same machine. + >>> test_name = 'InterProcessLockTest' +str(os.getpid()) + str(time.time()) + + >>> lock1 = InterProcessLock(name=test_name) + >>> lock1.acquire() + + >>> lock2 = InterProcessLock(name=test_name) + >>> lock3 = InterProcessLock(name=test_name) + + # Since lock1 is locked, other attempts to acquire it fail. + >>> lock2.acquire() + Traceback (most recent call last): + ... + SingleInstanceError: Could not acquire exclusive lock on /tmp/test.lck + + >>> lock3.acquire() + Traceback (most recent call last): + ... + SingleInstanceError: Could not acquire exclusive lock on /tmp/test.lck + + # Release the lock and let lock2 have it. + >>> lock1.release() + >>> lock2.acquire() + + >>> lock3.acquire() + Traceback (most recent call last): + ... + SingleInstanceError: Could not acquire exclusive lock on /tmp/test.lck + + # Release it and give it back to lock1 + >>> lock2.release() + >>> lock1.acquire() + + >>> lock2.acquire() + Traceback (most recent call last): + ... + SingleInstanceError: Could not acquire exclusive lock on /tmp/test.lck + + # Test lock status + >>> lock2.locked() + True + >>> lock3.locked() + True + >>> lock1.locked() + True + + >>> lock1.release() + + >>> lock2.locked() + False + >>> lock3.locked() + False + >>> lock1.locked() + False + + >>> if os.name == 'posix': + ... def os_independent_kill(pid): + ... import signal + ... os.kill(pid, signal.SIGKILL) + ... else: + ... assert(os.name == 'nt') + ... def os_independent_kill(pid): + ... ''' http://www.python.org/doc/faq/windows/#how-do-i-emulate-os-kill-in-windows ''' + ... import win32api + ... import win32con + ... import pywintypes + ... handle = win32api.OpenProcess(win32con.PROCESS_TERMINATE , pywintypes.FALSE, pid) + ... return (0 != win32api.TerminateProcess(handle, 0)) + + # Test to acquire the lock in another process. + >>> def execute(cmd): + ... cmd = 'import time;' + cmd + 'time.sleep(10);' + ... process = subprocess.Popen([sys.executable, '-c', cmd]) + ... pid = process.pid + ... time.sleep(2) # quick hack, but we test synchronization in the end + ... return pid + + >>> pid = execute('import interlocks;a=interlocks.InterProcessLock(name=\\''+test_name+ '\\');a.acquire();') + + >>> lock1.acquire() + Traceback (most recent call last): + ... + SingleInstanceError: Could not acquire exclusive lock on /tmp/test.lck + + >>> os_independent_kill(pid) + + >>> time.sleep(1) + + >>> lock1.acquire() + >>> lock1.release() + + # Testing wait + + >>> pid = execute('import interlocks;a=interlocks.InterProcessLock(name=\\''+test_name+ '\\');a.acquire();') + + >>> lock1.acquire() + Traceback (most recent call last): + ... + SingleInstanceError: Could not acquire exclusive lock on /tmp/test.lck + + >>> os_independent_kill(pid) + + >>> lock1.acquire(True) + >>> lock1.release() + + """ + + pass + +if __name__=='__main__': + import doctest + doctest.testmod(optionflags=doctest.IGNORE_EXCEPTION_DETAIL) diff --git a/pyfpdb/upd_indexes.sql b/pyfpdb/upd_indexes.sql index e79f4bd4..f652edc4 100755 --- a/pyfpdb/upd_indexes.sql +++ b/pyfpdb/upd_indexes.sql @@ -1,27 +1,27 @@ - -# script to update indexes on mysql (+other?) database - -select '1. Dropping indexes' as ' '; -select 'Can''t drop messages indicate index already gone' as ' '; - -ALTER TABLE `fpdb`.`Settings` DROP INDEX `id`; -ALTER TABLE `fpdb`.`Sites` DROP INDEX `id`; -ALTER TABLE `fpdb`.`Gametypes` DROP INDEX `id`; -ALTER TABLE `fpdb`.`Players` DROP INDEX `id`; -ALTER TABLE `fpdb`.`Autorates` DROP INDEX `id`; -ALTER TABLE `fpdb`.`Hands` DROP INDEX `id`; -ALTER TABLE `fpdb`.`BoardCards` DROP INDEX `id`; -ALTER TABLE `fpdb`.`TourneyTypes` DROP INDEX `id`; -ALTER TABLE `fpdb`.`Tourneys` DROP INDEX `id`; -ALTER TABLE `fpdb`.`TourneysPlayers` DROP INDEX `id`; -ALTER TABLE `fpdb`.`HandsPlayers` DROP INDEX `id`; -ALTER TABLE `fpdb`.`HandsActions` DROP INDEX `id`; -ALTER TABLE `fpdb`.`HudCache` DROP INDEX `id`; - -select '2. Adding extra indexes on useful fields' as ' '; -select 'Duplicate key name messages indicate new indexes already there' as ' '; - -ALTER TABLE `fpdb`.`tourneys` ADD INDEX `siteTourneyNo`(`siteTourneyNo`); -ALTER TABLE `fpdb`.`hands` ADD INDEX `siteHandNo`(`siteHandNo`); -ALTER TABLE `fpdb`.`players` ADD INDEX `name`(`name`); - + +# script to update indexes on mysql (+other?) database + +select '1. Dropping indexes' as ' '; +select 'Can''t drop messages indicate index already gone' as ' '; + +ALTER TABLE `fpdb`.`Settings` DROP INDEX `id`; +ALTER TABLE `fpdb`.`Sites` DROP INDEX `id`; +ALTER TABLE `fpdb`.`Gametypes` DROP INDEX `id`; +ALTER TABLE `fpdb`.`Players` DROP INDEX `id`; +ALTER TABLE `fpdb`.`Autorates` DROP INDEX `id`; +ALTER TABLE `fpdb`.`Hands` DROP INDEX `id`; +ALTER TABLE `fpdb`.`BoardCards` DROP INDEX `id`; +ALTER TABLE `fpdb`.`TourneyTypes` DROP INDEX `id`; +ALTER TABLE `fpdb`.`Tourneys` DROP INDEX `id`; +ALTER TABLE `fpdb`.`TourneysPlayers` DROP INDEX `id`; +ALTER TABLE `fpdb`.`HandsPlayers` DROP INDEX `id`; +ALTER TABLE `fpdb`.`HandsActions` DROP INDEX `id`; +ALTER TABLE `fpdb`.`HudCache` DROP INDEX `id`; + +select '2. Adding extra indexes on useful fields' as ' '; +select 'Duplicate key name messages indicate new indexes already there' as ' '; + +ALTER TABLE `fpdb`.`tourneys` ADD INDEX `siteTourneyNo`(`siteTourneyNo`); +ALTER TABLE `fpdb`.`hands` ADD INDEX `siteHandNo`(`siteHandNo`); +ALTER TABLE `fpdb`.`players` ADD INDEX `name`(`name`); +