Merge branch 'master' of git://git.assembla.com/fpdboz.git
Conflicts: pyfpdb/AbsoluteToFpdb.py
This commit is contained in:
commit
2e698bb1d4
|
@ -181,9 +181,9 @@ or None if we fail to get the info """
|
||||||
#m = re.search('(\*\* Dealing down cards \*\*\n)(?P<PREFLOP>.*?\n\*\*)?( Dealing Flop \*\* \[ (?P<FLOP1>\S\S), (?P<FLOP2>\S\S), (?P<FLOP3>\S\S) \])?(?P<FLOP>.*?\*\*)?( Dealing Turn \*\* \[ (?P<TURN1>\S\S) \])?(?P<TURN>.*?\*\*)?( Dealing River \*\* \[ (?P<RIVER1>\S\S) \])?(?P<RIVER>.*)', hand.handText,re.DOTALL)
|
#m = re.search('(\*\* Dealing down cards \*\*\n)(?P<PREFLOP>.*?\n\*\*)?( Dealing Flop \*\* \[ (?P<FLOP1>\S\S), (?P<FLOP2>\S\S), (?P<FLOP3>\S\S) \])?(?P<FLOP>.*?\*\*)?( Dealing Turn \*\* \[ (?P<TURN1>\S\S) \])?(?P<TURN>.*?\*\*)?( Dealing River \*\* \[ (?P<RIVER1>\S\S) \])?(?P<RIVER>.*)', hand.handText,re.DOTALL)
|
||||||
if hand.gametype['base'] == 'hold':
|
if hand.gametype['base'] == 'hold':
|
||||||
m = re.search(r"\*\*\* POCKET CARDS \*\*\*(?P<PREFLOP>.+(?=\*\*\* FLOP \*\*\*)|.+)"
|
m = re.search(r"\*\*\* POCKET CARDS \*\*\*(?P<PREFLOP>.+(?=\*\*\* FLOP \*\*\*)|.+)"
|
||||||
r"\*\*\* FLOP \*\*\*(?P<FLOP>.+(?=\*\*\* TURN \*\*\*)|.+)"
|
r"(\*\*\* FLOP \*\*\*(?P<FLOP>.+(?=\*\*\* TURN \*\*\*)|.+))?"
|
||||||
r"\*\*\* TURN \*\*\*(?P<TURN>.+(?=\*\*\* RIVER \*\*\*)|.+)"
|
r"(\*\*\* TURN \*\*\*(?P<TURN>.+(?=\*\*\* RIVER \*\*\*)|.+))?"
|
||||||
r"\*\*\* RIVER \*\*\*(?P<RIVER>.+)", hand.handText, re.DOTALL)
|
r"(\*\*\* RIVER \*\*\*(?P<RIVER>.+))?", hand.handText, re.DOTALL)
|
||||||
|
|
||||||
elif hand.gametype['base'] == 'stud': # TODO: Not implemented yet
|
elif hand.gametype['base'] == 'stud': # TODO: Not implemented yet
|
||||||
m = re.search(r"(?P<ANTES>.+(?=\*\* Dealing down cards \*\*)|.+)"
|
m = re.search(r"(?P<ANTES>.+(?=\*\* Dealing down cards \*\*)|.+)"
|
||||||
|
@ -313,7 +313,6 @@ def validCard(card):
|
||||||
if card == '10c': card = 'Tc'
|
if card == '10c': card = 'Tc'
|
||||||
return card
|
return card
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
parser = OptionParser()
|
parser = OptionParser()
|
||||||
parser.add_option("-i", "--input", dest="ipath", help="parse input hand history", default="-")
|
parser.add_option("-i", "--input", dest="ipath", help="parse input hand history", default="-")
|
||||||
|
|
|
@ -452,7 +452,7 @@ class Database:
|
||||||
|
|
||||||
def get_player_id(self, config, site, player_name):
|
def get_player_id(self, config, site, player_name):
|
||||||
c = self.connection.cursor()
|
c = self.connection.cursor()
|
||||||
c.execute(self.sql.query['get_player_id'], {'player': player_name, 'site': site})
|
c.execute(self.sql.query['get_player_id'], (player_name, site))
|
||||||
row = c.fetchone()
|
row = c.fetchone()
|
||||||
if row:
|
if row:
|
||||||
return row[0]
|
return row[0]
|
||||||
|
@ -813,9 +813,11 @@ class Database:
|
||||||
self.fillDefaultData()
|
self.fillDefaultData()
|
||||||
self.commit()
|
self.commit()
|
||||||
except:
|
except:
|
||||||
print "Error creating tables: ", str(sys.exc_value)
|
#print "Error creating tables: ", str(sys.exc_value)
|
||||||
|
err = traceback.extract_tb(sys.exc_info()[2])[-1]
|
||||||
|
print "***Error creating tables: "+err[2]+"("+str(err[1])+"): "+str(sys.exc_info()[1])
|
||||||
self.rollback()
|
self.rollback()
|
||||||
raise fpdb_simple.FpdbError( "Error creating tables " + str(sys.exc_value) )
|
raise
|
||||||
#end def disconnect
|
#end def disconnect
|
||||||
|
|
||||||
def drop_tables(self):
|
def drop_tables(self):
|
||||||
|
@ -845,8 +847,9 @@ class Database:
|
||||||
|
|
||||||
self.commit()
|
self.commit()
|
||||||
except:
|
except:
|
||||||
print "Error dropping tables: " + str(sys.exc_value)
|
print "***Error dropping tables: "+err[2]+"("+str(err[1])+"): "+str(sys.exc_info()[1])
|
||||||
raise fpdb_simple.FpdbError( "Error dropping tables " + str(sys.exc_value) )
|
self.rollback()
|
||||||
|
raise
|
||||||
#end def drop_tables
|
#end def drop_tables
|
||||||
|
|
||||||
def createAllIndexes(self):
|
def createAllIndexes(self):
|
||||||
|
@ -917,8 +920,14 @@ class Database:
|
||||||
c.execute("INSERT INTO Sites (name,currency) VALUES ('PokerStars', 'USD')")
|
c.execute("INSERT INTO Sites (name,currency) VALUES ('PokerStars', 'USD')")
|
||||||
c.execute("INSERT INTO Sites (name,currency) VALUES ('Everleaf', 'USD')")
|
c.execute("INSERT INTO Sites (name,currency) VALUES ('Everleaf', 'USD')")
|
||||||
c.execute("INSERT INTO Sites (name,currency) VALUES ('Win2day', 'USD')")
|
c.execute("INSERT INTO Sites (name,currency) VALUES ('Win2day', 'USD')")
|
||||||
|
c.execute("INSERT INTO Sites (name,currency) VALUES ('OnGame', 'USD')")
|
||||||
|
c.execute("INSERT INTO Sites (name,currency) VALUES ('UltimateBet', 'USD')")
|
||||||
|
c.execute("INSERT INTO Sites (name,currency) VALUES ('Betfair', 'USD')")
|
||||||
c.execute("INSERT INTO Sites (name,currency) VALUES ('Absolute', 'USD')")
|
c.execute("INSERT INTO Sites (name,currency) VALUES ('Absolute', 'USD')")
|
||||||
c.execute("INSERT INTO TourneyTypes VALUES (DEFAULT, 1, 0, 0, 0, False);")
|
if self.backend == self.SQLITE:
|
||||||
|
c.execute("INSERT INTO TourneyTypes VALUES (NULL, 1, 0, 0, 0, 0);")
|
||||||
|
else:
|
||||||
|
c.execute("INSERT INTO TourneyTypes VALUES (DEFAULT, 1, 0, 0, 0, False);")
|
||||||
#c.execute("""INSERT INTO TourneyTypes
|
#c.execute("""INSERT INTO TourneyTypes
|
||||||
# (siteId,buyin,fee,knockout,rebuyOrAddon) VALUES
|
# (siteId,buyin,fee,knockout,rebuyOrAddon) VALUES
|
||||||
# (1,0,0,0,?)""",(False,) )
|
# (1,0,0,0,?)""",(False,) )
|
||||||
|
@ -1795,6 +1804,8 @@ if __name__=="__main__":
|
||||||
print "database connection object = ", db_connection.connection
|
print "database connection object = ", db_connection.connection
|
||||||
print "database type = ", db_connection.type
|
print "database type = ", db_connection.type
|
||||||
|
|
||||||
|
db_connection.recreate_tables()
|
||||||
|
|
||||||
h = db_connection.get_last_hand()
|
h = db_connection.get_last_hand()
|
||||||
print "last hand = ", h
|
print "last hand = ", h
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,9 @@
|
||||||
#In the "official" distribution you can find the license in
|
#In the "official" distribution you can find the license in
|
||||||
#agpl-3.0.txt in the docs folder of the package.
|
#agpl-3.0.txt in the docs folder of the package.
|
||||||
|
|
||||||
|
#fpdb modules
|
||||||
|
import Card
|
||||||
|
|
||||||
class DerivedStats():
|
class DerivedStats():
|
||||||
def __init__(self, hand):
|
def __init__(self, hand):
|
||||||
self.hand = hand
|
self.hand = hand
|
||||||
|
@ -89,5 +92,69 @@ class DerivedStats():
|
||||||
self.street4CheckCallRaiseChance = 0
|
self.street4CheckCallRaiseChance = 0
|
||||||
self.street4CheckCallRaiseDone = 0
|
self.street4CheckCallRaiseDone = 0
|
||||||
|
|
||||||
def getStats():
|
self.hands = {}
|
||||||
|
self.handsplayers = {}
|
||||||
|
|
||||||
|
def getStats(self, hand):
|
||||||
|
|
||||||
|
for player in hand.players:
|
||||||
|
self.handsplayers[player[1]] = {}
|
||||||
|
|
||||||
|
self.assembleHands(self.hand)
|
||||||
|
self.assembleHandsPlayers(self.hand)
|
||||||
|
|
||||||
|
print "hands =", self.hands
|
||||||
|
print "handsplayers =", self.handsplayers
|
||||||
|
|
||||||
|
def assembleHands(self, hand):
|
||||||
|
self.hands['tableName'] = hand.tablename
|
||||||
|
self.hands['siteHandNo'] = hand.handid
|
||||||
|
self.hands['gametypeId'] = None # Leave None, handled later after checking db
|
||||||
|
self.hands['handStart'] = hand.starttime # format this!
|
||||||
|
self.hands['importTime'] = None
|
||||||
|
self.hands['seats'] = self.countPlayers(hand)
|
||||||
|
self.hands['maxSeats'] = hand.maxseats
|
||||||
|
self.hands['boardcard1'] = None
|
||||||
|
self.hands['boardcard2'] = None
|
||||||
|
self.hands['boardcard3'] = None
|
||||||
|
self.hands['boardcard4'] = None
|
||||||
|
self.hands['boardcard5'] = None
|
||||||
|
|
||||||
|
boardCard = 1
|
||||||
|
for street in hand.communityStreets:
|
||||||
|
for card in hand.board[street]:
|
||||||
|
self.hands['boardcard%s' % str(boardCard)] = Card.encodeCard(card)
|
||||||
|
boardCard += 1
|
||||||
|
|
||||||
|
def assembleHandsPlayers(self, hand):
|
||||||
|
self.vpip(self.hand)
|
||||||
|
for i, street in enumerate(hand.actionStreets[1:]):
|
||||||
|
self.aggr(self.hand, i)
|
||||||
|
|
||||||
|
def vpip(self, hand):
|
||||||
|
vpipers = set()
|
||||||
|
for act in hand.actions[hand.actionStreets[1]]:
|
||||||
|
if act[1] in ('calls','bets', 'raises'):
|
||||||
|
vpipers.add(act[0])
|
||||||
|
|
||||||
|
for player in hand.players:
|
||||||
|
if player[1] in vpipers:
|
||||||
|
self.handsplayers[player[1]]['vpip'] = True
|
||||||
|
else:
|
||||||
|
self.handsplayers[player[1]]['vpip'] = False
|
||||||
|
self.hands['playersVpi'] = len(vpipers)
|
||||||
|
|
||||||
|
def aggr(self, hand, i):
|
||||||
|
aggrers = set()
|
||||||
|
for act in hand.actions[hand.actionStreets[i]]:
|
||||||
|
if act[1] in ('completes', 'raises'):
|
||||||
|
aggrers.add(act[0])
|
||||||
|
|
||||||
|
for player in hand.players:
|
||||||
|
if player[1] in aggrers:
|
||||||
|
self.handsplayers[player[1]]['street%sAggr' % i] = True
|
||||||
|
else:
|
||||||
|
self.handsplayers[player[1]]['street%sAggr' % i] = False
|
||||||
|
|
||||||
|
def countPlayers(self, hand):
|
||||||
pass
|
pass
|
|
@ -74,7 +74,7 @@ class GuiBulkImport():
|
||||||
cb_hmodel = self.cb_drophudcache.get_model()
|
cb_hmodel = self.cb_drophudcache.get_model()
|
||||||
cb_hindex = self.cb_drophudcache.get_active()
|
cb_hindex = self.cb_drophudcache.get_active()
|
||||||
|
|
||||||
self.lab_info.set_text("Importing")
|
self.lab_info.set_text("Importing") # doesn't display :-(
|
||||||
if cb_index:
|
if cb_index:
|
||||||
self.importer.setDropIndexes(cb_model[cb_index][0])
|
self.importer.setDropIndexes(cb_model[cb_index][0])
|
||||||
else:
|
else:
|
||||||
|
@ -95,6 +95,13 @@ class GuiBulkImport():
|
||||||
print 'GuiBulkImport.load done: Stored: %d \tDuplicates: %d \tPartial: %d \tErrors: %d in %s seconds - %.0f/sec'\
|
print 'GuiBulkImport.load done: Stored: %d \tDuplicates: %d \tPartial: %d \tErrors: %d in %s seconds - %.0f/sec'\
|
||||||
% (stored, dups, partial, errs, ttime, (stored+0.0) / ttime)
|
% (stored, dups, partial, errs, ttime, (stored+0.0) / ttime)
|
||||||
self.importer.clearFileList()
|
self.importer.clearFileList()
|
||||||
|
if self.n_hands_in_db == 0 and stored > 0:
|
||||||
|
self.cb_dropindexes.set_sensitive(True)
|
||||||
|
self.cb_dropindexes.set_active(0)
|
||||||
|
self.lab_drop.set_sensitive(True)
|
||||||
|
self.cb_drophudcache.set_sensitive(True)
|
||||||
|
self.cb_drophudcache.set_active(0)
|
||||||
|
self.lab_hdrop.set_sensitive(True)
|
||||||
|
|
||||||
self.lab_info.set_text("Import finished")
|
self.lab_info.set_text("Import finished")
|
||||||
except:
|
except:
|
||||||
|
@ -213,11 +220,11 @@ class GuiBulkImport():
|
||||||
self.cbfilter.show()
|
self.cbfilter.show()
|
||||||
|
|
||||||
# label - drop hudcache
|
# label - drop hudcache
|
||||||
self.lab_drop = gtk.Label("Drop HudCache:")
|
self.lab_hdrop = gtk.Label("Drop HudCache:")
|
||||||
self.table.attach(self.lab_drop, 3, 4, 2, 3, xpadding = 0, ypadding = 0, yoptions=gtk.SHRINK)
|
self.table.attach(self.lab_hdrop, 3, 4, 2, 3, xpadding = 0, ypadding = 0, yoptions=gtk.SHRINK)
|
||||||
self.lab_drop.show()
|
self.lab_hdrop.show()
|
||||||
self.lab_drop.set_justify(gtk.JUSTIFY_RIGHT)
|
self.lab_hdrop.set_justify(gtk.JUSTIFY_RIGHT)
|
||||||
self.lab_drop.set_alignment(1.0, 0.5)
|
self.lab_hdrop.set_alignment(1.0, 0.5)
|
||||||
|
|
||||||
# ComboBox - drop hudcache
|
# ComboBox - drop hudcache
|
||||||
self.cb_drophudcache = gtk.combo_box_new_text()
|
self.cb_drophudcache = gtk.combo_box_new_text()
|
||||||
|
@ -258,7 +265,7 @@ class GuiBulkImport():
|
||||||
self.lab_drop.set_sensitive(False)
|
self.lab_drop.set_sensitive(False)
|
||||||
self.cb_drophudcache.set_active(2)
|
self.cb_drophudcache.set_active(2)
|
||||||
self.cb_drophudcache.set_sensitive(False)
|
self.cb_drophudcache.set_sensitive(False)
|
||||||
self.lab_drop.set_sensitive(False)
|
self.lab_hdrop.set_sensitive(False)
|
||||||
|
|
||||||
def main(argv=None):
|
def main(argv=None):
|
||||||
"""main can also be called in the python interpreter, by supplying the command line as the argument."""
|
"""main can also be called in the python interpreter, by supplying the command line as the argument."""
|
||||||
|
|
|
@ -203,6 +203,51 @@
|
||||||
<location seat="9" x="70" y="53"> </location>
|
<location seat="9" x="70" y="53"> </location>
|
||||||
</layout>
|
</layout>
|
||||||
</site>
|
</site>
|
||||||
|
|
||||||
|
|
||||||
|
<site enabled="False"
|
||||||
|
site_name="Absolute"
|
||||||
|
table_finder="AbsolutePoker.exe"
|
||||||
|
screen_name="YOUR SCREEN NAME HERE"
|
||||||
|
site_path=""
|
||||||
|
HH_path=""
|
||||||
|
decoder="everleaf_decode_table"
|
||||||
|
converter="AbsoluteToFpdb"
|
||||||
|
supported_games="holdem">
|
||||||
|
<layout fav_seat="0" height="547" max="8" width="794">
|
||||||
|
<location seat="1" x="640" y="64"> </location>
|
||||||
|
<location seat="2" x="650" y="230"> </location>
|
||||||
|
<location seat="3" x="650" y="385"> </location>
|
||||||
|
<location seat="4" x="588" y="425"> </location>
|
||||||
|
<location seat="5" x="92" y="425"> </location>
|
||||||
|
<location seat="6" x="0" y="373"> </location>
|
||||||
|
<location seat="7" x="0" y="223"> </location>
|
||||||
|
<location seat="8" x="25" y="50"> </location>
|
||||||
|
</layout>
|
||||||
|
<layout fav_seat="0" height="547" max="6" width="794">
|
||||||
|
<location seat="1" x="640" y="58"> </location>
|
||||||
|
<location seat="2" x="654" y="288"> </location>
|
||||||
|
<location seat="3" x="615" y="424"> </location>
|
||||||
|
<location seat="4" x="70" y="421"> </location>
|
||||||
|
<location seat="5" x="0" y="280"> </location>
|
||||||
|
<location seat="6" x="70" y="58"> </location>
|
||||||
|
</layout>
|
||||||
|
<layout fav_seat="0" height="547" max="2" width="794">
|
||||||
|
<location seat="1" x="651" y="288"> </location>
|
||||||
|
<location seat="2" x="10" y="288"> </location>
|
||||||
|
</layout>
|
||||||
|
<layout fav_seat="0" height="547" max="9" width="794">
|
||||||
|
<location seat="1" x="634" y="38"> </location>
|
||||||
|
<location seat="2" x="667" y="184"> </location>
|
||||||
|
<location seat="3" x="667" y="321"> </location>
|
||||||
|
<location seat="4" x="667" y="445"> </location>
|
||||||
|
<location seat="5" x="337" y="459"> </location>
|
||||||
|
<location seat="6" x="0" y="400"> </location>
|
||||||
|
<location seat="7" x="0" y="322"> </location>
|
||||||
|
<location seat="8" x="0" y="181"> </location>
|
||||||
|
<location seat="9" x="70" y="53"> </location>
|
||||||
|
</layout>
|
||||||
|
</site>
|
||||||
</supported_sites>
|
</supported_sites>
|
||||||
|
|
||||||
<supported_games>
|
<supported_games>
|
||||||
|
@ -337,6 +382,7 @@
|
||||||
<hhc site="Full Tilt Poker" converter="FulltiltToFpdb"/>
|
<hhc site="Full Tilt Poker" converter="FulltiltToFpdb"/>
|
||||||
<hhc site="Everleaf" converter="EverleafToFpdb"/>
|
<hhc site="Everleaf" converter="EverleafToFpdb"/>
|
||||||
<hhc site="Win2day" converter="Win2dayToFpdb"/>
|
<hhc site="Win2day" converter="Win2dayToFpdb"/>
|
||||||
|
<hhc site="Absolute" converter="AbsoluteToFpdb"/>
|
||||||
</hhcs>
|
</hhcs>
|
||||||
|
|
||||||
<supported_databases>
|
<supported_databases>
|
||||||
|
|
|
@ -204,7 +204,9 @@ which it expects to find at self.re_TailSplitHands -- see for e.g. Everleaf.py.
|
||||||
logging.info("Unsupported game type: %s" % gametype)
|
logging.info("Unsupported game type: %s" % gametype)
|
||||||
|
|
||||||
if hand:
|
if hand:
|
||||||
|
# uncomment these to calculate some stats
|
||||||
# print hand
|
# print hand
|
||||||
|
# hand.stats.getStats(hand)
|
||||||
hand.writeHand(self.out_fh)
|
hand.writeHand(self.out_fh)
|
||||||
return hand
|
return hand
|
||||||
else:
|
else:
|
||||||
|
|
299
pyfpdb/SQL.py
299
pyfpdb/SQL.py
|
@ -19,9 +19,15 @@ Set up all of the SQL statements for a given game and database type.
|
||||||
# along with this program; if not, write to the Free Software
|
# along with this program; if not, write to the Free Software
|
||||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
# 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
|
# Standard Library modules
|
||||||
|
import re
|
||||||
|
|
||||||
# pyGTK modules
|
# pyGTK modules
|
||||||
|
|
||||||
|
@ -189,11 +195,11 @@ class Sql:
|
||||||
version SMALLINT NOT NULL)
|
version SMALLINT NOT NULL)
|
||||||
ENGINE=INNODB"""
|
ENGINE=INNODB"""
|
||||||
elif db_server == 'postgresql':
|
elif db_server == 'postgresql':
|
||||||
self.query['createSettingsTable'] = """CREATE TABLE Settings (version SMALLINT)"""
|
self.query['createSettingsTable'] = """CREATE TABLE Settings (version SMALLINT NOT NULL)"""
|
||||||
|
|
||||||
elif db_server == 'sqlite':
|
elif db_server == 'sqlite':
|
||||||
self.query['createSettingsTable'] = """CREATE TABLE Settings
|
self.query['createSettingsTable'] = """CREATE TABLE Settings
|
||||||
(version INTEGER) """
|
(version INTEGER NOT NULL) """
|
||||||
|
|
||||||
|
|
||||||
################################
|
################################
|
||||||
|
@ -290,7 +296,7 @@ class Sql:
|
||||||
name TEXT,
|
name TEXT,
|
||||||
siteId INTEGER,
|
siteId INTEGER,
|
||||||
comment TEXT,
|
comment TEXT,
|
||||||
commentTs BLOB,
|
commentTs REAL,
|
||||||
FOREIGN KEY(siteId) REFERENCES Sites(id) ON DELETE CASCADE)"""
|
FOREIGN KEY(siteId) REFERENCES Sites(id) ON DELETE CASCADE)"""
|
||||||
|
|
||||||
|
|
||||||
|
@ -316,9 +322,16 @@ class Sql:
|
||||||
description varchar(50),
|
description varchar(50),
|
||||||
shortDesc char(8),
|
shortDesc char(8),
|
||||||
ratingTime timestamp without time zone,
|
ratingTime timestamp without time zone,
|
||||||
handCount int)"""
|
handCount int)"""
|
||||||
elif db_server == 'sqlite':
|
elif db_server == 'sqlite':
|
||||||
self.query['createAutoratesTable'] = """ """
|
self.query['createAutoratesTable'] = """CREATE TABLE Autorates (
|
||||||
|
id INTEGER PRIMARY KEY,
|
||||||
|
playerId INT,
|
||||||
|
gametypeId INT,
|
||||||
|
description TEXT,
|
||||||
|
shortDesc TEXT,
|
||||||
|
ratingTime REAL,
|
||||||
|
handCount int)"""
|
||||||
|
|
||||||
|
|
||||||
################################
|
################################
|
||||||
|
@ -400,12 +413,12 @@ class Sql:
|
||||||
tableName TEXT(20),
|
tableName TEXT(20),
|
||||||
siteHandNo INTEGER,
|
siteHandNo INTEGER,
|
||||||
gametypeId INTEGER,
|
gametypeId INTEGER,
|
||||||
handStart BLOB,
|
handStart REAL,
|
||||||
importTime BLOB,
|
importTime REAL,
|
||||||
seats INTEGER,
|
seats INTEGER,
|
||||||
maxSeats INTEGER,
|
maxSeats INTEGER,
|
||||||
comment TEXT,
|
comment TEXT,
|
||||||
commentTs BLOB,
|
commentTs REAL,
|
||||||
FOREIGN KEY(gametypeId) REFERENCES Gametypes(id) ON DELETE CASCADE)"""
|
FOREIGN KEY(gametypeId) REFERENCES Gametypes(id) ON DELETE CASCADE)"""
|
||||||
|
|
||||||
|
|
||||||
|
@ -425,14 +438,19 @@ class Sql:
|
||||||
elif db_server == 'postgresql':
|
elif db_server == 'postgresql':
|
||||||
self.query['createTourneyTypesTable'] = """CREATE TABLE TourneyTypes (
|
self.query['createTourneyTypesTable'] = """CREATE TABLE TourneyTypes (
|
||||||
id SERIAL, PRIMARY KEY (id),
|
id SERIAL, PRIMARY KEY (id),
|
||||||
siteId INT, FOREIGN KEY (siteId) REFERENCES Sites(id),
|
siteId INT NOT NULL, FOREIGN KEY (siteId) REFERENCES Sites(id),
|
||||||
buyin INT,
|
buyin INT NOT NULL,
|
||||||
fee INT,
|
fee INT NOT NULL,
|
||||||
knockout INT,
|
knockout INT NOT NULL,
|
||||||
rebuyOrAddon BOOLEAN)"""
|
rebuyOrAddon BOOLEAN NOT NULL)"""
|
||||||
elif db_server == 'sqlite':
|
elif db_server == 'sqlite':
|
||||||
self.query['createTourneyTypesTable'] = """ """
|
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
|
# Create Tourneys
|
||||||
|
@ -460,15 +478,15 @@ class Sql:
|
||||||
comment TEXT,
|
comment TEXT,
|
||||||
commentTs timestamp without time zone)"""
|
commentTs timestamp without time zone)"""
|
||||||
elif db_server == 'sqlite':
|
elif db_server == 'sqlite':
|
||||||
self.query['createTourneysTable'] = """CREATE TABLE TourneyTypes (
|
self.query['createTourneysTable'] = """CREATE TABLE Tourneys (
|
||||||
id INTEGER PRIMARY KEY,
|
id INTEGER PRIMARY KEY,
|
||||||
siteId INTEGER,
|
tourneyTypeId INT,
|
||||||
buyin INTEGER,
|
siteTourneyNo INT,
|
||||||
fee INTEGER,
|
entries INT,
|
||||||
knockout INTEGER,
|
prizepool INT,
|
||||||
rebuyOrAddon BOOL,
|
startTime REAL,
|
||||||
FOREIGN KEY(siteId) REFERENCES Sites(id) ON DELETE CASCADE)"""
|
comment TEXT,
|
||||||
|
commentTs REAL)"""
|
||||||
################################
|
################################
|
||||||
# Create HandsPlayers
|
# Create HandsPlayers
|
||||||
################################
|
################################
|
||||||
|
@ -709,7 +727,121 @@ class Sql:
|
||||||
|
|
||||||
FOREIGN KEY (tourneysPlayersId) REFERENCES TourneysPlayers(id))"""
|
FOREIGN KEY (tourneysPlayersId) REFERENCES TourneysPlayers(id))"""
|
||||||
elif db_server == 'sqlite':
|
elif db_server == 'sqlite':
|
||||||
self.query['createHandsPlayersTable'] = """ """
|
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)
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
################################
|
################################
|
||||||
|
@ -977,7 +1109,105 @@ class Sql:
|
||||||
street4Raises INT)
|
street4Raises INT)
|
||||||
"""
|
"""
|
||||||
elif db_server == 'sqlite':
|
elif db_server == 'sqlite':
|
||||||
self.query['createHudCacheTable'] = """ """
|
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 NOT NULL,
|
||||||
|
wonWhenSeenStreet2 REAL,
|
||||||
|
wonWhenSeenStreet3 REAL,
|
||||||
|
wonWhenSeenStreet4 REAL,
|
||||||
|
wonAtSD REAL NOT NULL,
|
||||||
|
|
||||||
|
street0VPI INT NOT NULL,
|
||||||
|
street0Aggr INT,
|
||||||
|
street0_3BChance INT NOT NULL,
|
||||||
|
street0_3BDone INT NOT NULL,
|
||||||
|
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':
|
if db_server == 'mysql':
|
||||||
self.query['addTourneyIndex'] = """ALTER TABLE Tourneys ADD INDEX siteTourneyNo(siteTourneyNo)"""
|
self.query['addTourneyIndex'] = """ALTER TABLE Tourneys ADD INDEX siteTourneyNo(siteTourneyNo)"""
|
||||||
|
@ -1004,9 +1234,10 @@ class Sql:
|
||||||
self.query['get_last_hand'] = "select max(id) from Hands"
|
self.query['get_last_hand'] = "select max(id) from Hands"
|
||||||
|
|
||||||
self.query['get_player_id'] = """
|
self.query['get_player_id'] = """
|
||||||
select Players.id AS player_id from Players, Sites
|
select Players.id AS player_id
|
||||||
where Players.name = %(player)s
|
from Players, Sites
|
||||||
and Sites.name = %(site)s
|
where Players.name = %s
|
||||||
|
and Sites.name = %s
|
||||||
and Players.SiteId = Sites.id
|
and Players.SiteId = Sites.id
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
@ -1081,7 +1312,7 @@ class Sql:
|
||||||
AND hc.styleKey > %s
|
AND hc.styleKey > %s
|
||||||
/* styleKey is currently 'd' (for date) followed by a yyyymmdd
|
/* styleKey is currently 'd' (for date) followed by a yyyymmdd
|
||||||
date key. Set it to 0000000 or similar to get all records */
|
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+ ??
|
/* also check activeseats here even if only 3 groups eg 2-3/4-6/7+
|
||||||
e.g. could use a multiplier:
|
e.g. could use a multiplier:
|
||||||
AND h.seats > X / 1.25 and hp.seats < X * 1.25
|
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
|
where X is the number of active players at the current table (and
|
||||||
|
@ -1164,7 +1395,7 @@ class Sql:
|
||||||
date key. Set it to 0000000 or similar to get all records */
|
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
|
/* Note: s means the placeholder 'percent's but we can't include that
|
||||||
in comments. (db api thinks they are actual arguments)
|
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+ ??
|
Could also check activeseats here even if only 3 groups eg 2-3/4-6/7+
|
||||||
e.g. could use a multiplier:
|
e.g. could use a multiplier:
|
||||||
AND h.seats > s / 1.25 and hp.seats < s * 1.25
|
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
|
where s is the number of active players at the current table (and
|
||||||
|
@ -1252,7 +1483,7 @@ class Sql:
|
||||||
INNER JOIN HandsPlayers hp2 ON (hp2.playerId+0 = hp.playerId+0 AND (hp2.handId = h2.id+0)) /* other hands by these players */
|
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)
|
INNER JOIN Players p ON (p.id = hp2.PlayerId+0)
|
||||||
WHERE hp.handId = %s
|
WHERE hp.handId = %s
|
||||||
/* check activeseats once this data returned? (don't want to do that here as it might
|
/* 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)
|
assume a session ended just because the number of seats dipped for a few hands)
|
||||||
*/
|
*/
|
||||||
ORDER BY h.handStart desc, hp2.PlayerId
|
ORDER BY h.handStart desc, hp2.PlayerId
|
||||||
|
@ -1331,7 +1562,7 @@ class Sql:
|
||||||
AND hp2.handId = h2.id) /* other hands by these players */
|
AND hp2.handId = h2.id) /* other hands by these players */
|
||||||
INNER JOIN Players p ON (p.id = hp2.PlayerId+0)
|
INNER JOIN Players p ON (p.id = hp2.PlayerId+0)
|
||||||
WHERE h.id = %s
|
WHERE h.id = %s
|
||||||
/* check activeseats once this data returned? (don't want to do that here as it might
|
/* 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)
|
assume a session ended just because the number of seats dipped for a few hands)
|
||||||
*/
|
*/
|
||||||
ORDER BY h.handStart desc, hp2.PlayerId
|
ORDER BY h.handStart desc, hp2.PlayerId
|
||||||
|
@ -2450,6 +2681,10 @@ class Sql:
|
||||||
else: # assume postgres
|
else: # assume postgres
|
||||||
self.query['lockForInsert'] = ""
|
self.query['lockForInsert'] = ""
|
||||||
|
|
||||||
|
if db_server == 'sqlite':
|
||||||
|
for k,q in self.query.iteritems():
|
||||||
|
self.query[k] = re.sub('%s','?',q)
|
||||||
|
|
||||||
if __name__== "__main__":
|
if __name__== "__main__":
|
||||||
# just print the default queries and exit
|
# just print the default queries and exit
|
||||||
s = Sql(game = 'razz', type = 'ptracks')
|
s = Sql(game = 'razz', type = 'ptracks')
|
||||||
|
|
|
@ -155,7 +155,7 @@ class fpdb_db:
|
||||||
return (self.host, self.database, self.user, self.password)
|
return (self.host, self.database, self.user, self.password)
|
||||||
#end def get_db_info
|
#end def get_db_info
|
||||||
|
|
||||||
def getLastInsertId(self):
|
def getLastInsertId(self, cursor=None):
|
||||||
try:
|
try:
|
||||||
if self.backend == self.MYSQL_INNODB:
|
if self.backend == self.MYSQL_INNODB:
|
||||||
ret = self.db.insert_id()
|
ret = self.db.insert_id()
|
||||||
|
@ -177,9 +177,7 @@ class fpdb_db:
|
||||||
else:
|
else:
|
||||||
ret = row[0]
|
ret = row[0]
|
||||||
elif self.backend == fpdb_db.SQLITE:
|
elif self.backend == fpdb_db.SQLITE:
|
||||||
# don't know how to do this in sqlite
|
ret = cursor.lastrowid
|
||||||
print "getLastInsertId(): not coded for sqlite yet"
|
|
||||||
ret = -1
|
|
||||||
else:
|
else:
|
||||||
print "getLastInsertId(): unknown backend ", self.backend
|
print "getLastInsertId(): unknown backend ", self.backend
|
||||||
ret = -1
|
ret = -1
|
||||||
|
|
|
@ -49,37 +49,6 @@ class FpdbError(Exception):
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return repr(self.value)
|
return repr(self.value)
|
||||||
|
|
||||||
# gets value for last auto-increment key generated
|
|
||||||
# returns -1 if a problem occurs
|
|
||||||
def getLastInsertId(backend, conn, cursor):
|
|
||||||
if backend == MYSQL_INNODB:
|
|
||||||
ret = conn.insert_id()
|
|
||||||
if ret < 1 or ret > 999999999:
|
|
||||||
print "getLastInsertId(): problem fetching insert_id? ret=", ret
|
|
||||||
ret = -1
|
|
||||||
elif backend == PGSQL:
|
|
||||||
# some options:
|
|
||||||
# currval(hands_id_seq) - use name of implicit seq here
|
|
||||||
# lastval() - still needs sequences set up?
|
|
||||||
# insert ... returning is useful syntax (but postgres specific?)
|
|
||||||
# see rules (fancy trigger type things)
|
|
||||||
cursor.execute ("SELECT lastval()")
|
|
||||||
row = cursor.fetchone()
|
|
||||||
if not row:
|
|
||||||
print "getLastInsertId(%s): problem fetching lastval? row=" % seq, row
|
|
||||||
ret = -1
|
|
||||||
else:
|
|
||||||
ret = row[0]
|
|
||||||
elif backend == SQLITE:
|
|
||||||
# don't know how to do this in sqlite
|
|
||||||
print "getLastInsertId(): not coded for sqlite yet"
|
|
||||||
ret = -1
|
|
||||||
else:
|
|
||||||
print "getLastInsertId(): unknown backend ", backend
|
|
||||||
ret = -1
|
|
||||||
return ret
|
|
||||||
#end def getLastInsertId
|
|
||||||
|
|
||||||
#returns an array of the total money paid. intending to add rebuys/addons here
|
#returns an array of the total money paid. intending to add rebuys/addons here
|
||||||
def calcPayin(count, buyin, fee):
|
def calcPayin(count, buyin, fee):
|
||||||
return [buyin + fee for i in xrange(count)]
|
return [buyin + fee for i in xrange(count)]
|
||||||
|
|
42
utils/fix_table_desc.py
Normal file
42
utils/fix_table_desc.py
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
#!/usr/bin/python
|
||||||
|
|
||||||
|
import re
|
||||||
|
|
||||||
|
desc = """
|
||||||
|
+-------------+---------------------+------+-----+---------+----------------+
|
||||||
|
| Field | Type | Null | Key | Default | Extra |
|
||||||
|
+-------------+---------------------+------+-----+---------+----------------+
|
||||||
|
| id | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
|
||||||
|
| tourneyId | int(10) unsigned | NO | MUL | NULL | |
|
||||||
|
| playerId | int(10) unsigned | NO | MUL | NULL | |
|
||||||
|
| payinAmount | int(11) | NO | | NULL | |
|
||||||
|
| rank | int(11) | NO | | NULL | |
|
||||||
|
| winnings | int(11) | NO | | NULL | |
|
||||||
|
| comment | text | YES | | NULL | |
|
||||||
|
| commentTs | datetime | YES | | NULL | |
|
||||||
|
+-------------+---------------------+------+-----+---------+----------------+
|
||||||
|
"""
|
||||||
|
|
||||||
|
table = """
|
||||||
|
{| border="1"
|
||||||
|
|+Gametypes Table
|
||||||
|
"""
|
||||||
|
|
||||||
|
# get rid of the verticle spacing and clean up
|
||||||
|
desc = re.sub("[\+\-]+", "", desc)
|
||||||
|
desc = re.sub("^\n+", "", desc) # there's probably a better way
|
||||||
|
desc = re.sub("\n\n", "\n", desc)
|
||||||
|
|
||||||
|
# the first line is the header info
|
||||||
|
temp, desc = re.split("\n", desc, 1)
|
||||||
|
temp = re.sub("\|", "!", temp)
|
||||||
|
temp = re.sub(" !", " !!", temp)
|
||||||
|
table += temp + " Comments\n"
|
||||||
|
|
||||||
|
# the rest is he body of the table
|
||||||
|
for line in re.split("\n", desc):
|
||||||
|
line = re.sub(" \|", " ||", line)
|
||||||
|
table += "|+\n" + line + "\n"
|
||||||
|
|
||||||
|
table += "|}\n"
|
||||||
|
print table
|
Loading…
Reference in New Issue
Block a user