diff --git a/pyfpdb/FpdbSQLQueries.py b/pyfpdb/FpdbSQLQueries.py index e582c681..2672de23 100644 --- a/pyfpdb/FpdbSQLQueries.py +++ b/pyfpdb/FpdbSQLQueries.py @@ -616,6 +616,34 @@ class FpdbSQLQueries: WHERE Players.name = %s AND HandsPlayers.handId = %s AND Players.siteId = %s AND (tourneysPlayersId IS NULL)""" + if(self.dbname == 'MySQL InnoDB') or (self.dbname == 'PostgreSQL'): + self.query['getRingProfitAllHandsPlayerIdSite'] = """ + SELECT hp.handId, hp.winnings, SUM(ha.amount) costs, hp.winnings - SUM(ha.amount) profit + FROM HandsPlayers hp + INNER JOIN Players pl ON hp.playerId = pl.id + INNER JOIN Hands h ON h.id = hp.handId + INNER JOIN HandsActions ha ON ha.handPlayerId = hp.id + WHERE pl.name = %s + AND pl.siteId = %s + AND hp.tourneysPlayersId IS NULL + GROUP BY hp.handId, hp.winnings, h.handStart + ORDER BY h.handStart""" + elif(self.dbname == 'SQLite'): + #Probably doesn't work. + self.query['getRingProfitAllHandsPlayerIdSite'] = """ + SELECT hp.handId, hp.winnings, SUM(ha.amount) costs, hp.winnings - SUM(ha.amount) profit + FROM HandsPlayers hp + INNER JOIN Players pl ON hp.playerId = pl.id + INNER JOIN Hands h ON h.id = hp.handId + INNER JOIN HandsActions ha ON ha.handPlayerId = hp.id + WHERE pl.name = %s + AND pl.siteId = %s + AND hp.tourneysPlayersId IS NULL + GROUP BY hp.handId, hp.winnings, h.handStart + ORDER BY h.handStart""" + + + if __name__== "__main__": from optparse import OptionParser diff --git a/pyfpdb/GuiBulkImport.py b/pyfpdb/GuiBulkImport.py index 9087cc79..d76e30ed 100644 --- a/pyfpdb/GuiBulkImport.py +++ b/pyfpdb/GuiBulkImport.py @@ -28,6 +28,7 @@ class GuiBulkImport (threading.Thread): """imports a directory, non-recursive. todo: move this to fpdb_import so CLI can use it""" self.path=self.inputFile self.importer.addImportDirectory(self.path) + self.importer.setCallHud(False) self.importer.runImport() print "GuiBulkImport.import_dir done" @@ -64,6 +65,7 @@ class GuiBulkImport (threading.Thread): self.import_dir() else: self.importer.addImportFile(self.inputFile) + self.importer.setCallHud(False) self.importer.runImport() self.importer.clearFileList() diff --git a/pyfpdb/GuiGraphViewer.py b/pyfpdb/GuiGraphViewer.py index 3505d1f7..eacaf676 100644 --- a/pyfpdb/GuiGraphViewer.py +++ b/pyfpdb/GuiGraphViewer.py @@ -20,6 +20,7 @@ import pygtk pygtk.require('2.0') import gtk import os +from time import time #import pokereval try: @@ -67,7 +68,9 @@ class GuiGraphViewer (threading.Thread): self.ax = self.fig.add_subplot(111) #Get graph data from DB + starttime = time() line = self.getRingProfitGraph(name, site) + print "Graph generated in: %s" %(time() - starttime) self.ax.set_title("Profit graph for ring games") @@ -92,23 +95,27 @@ class GuiGraphViewer (threading.Thread): #end of def showClicked def getRingProfitGraph(self, name, site): - self.cursor.execute(self.sql.query['getRingWinningsAllGamesPlayerIdSite'], (name, site)) - winnings = self.db.cursor.fetchall() + #self.cursor.execute(self.sql.query['getRingWinningsAllGamesPlayerIdSite'], (name, site)) + self.cursor.execute(self.sql.query['getRingProfitAllHandsPlayerIdSite'], (name, site)) + # returns (HandId,Winnings,Costs,Profit) + winnings = self.db.cursor.fetchall() - profit=range(len(winnings)) - for i in profit: - self.cursor.execute(self.sql.query['getRingProfitFromHandId'], (name, winnings[i][0], site)) - spent = self.db.cursor.fetchone() - if not spent[0] == None: - profit[i]=(i, winnings[i][1]-spent[0]) - else: - profit[i] = (i, 0) + profit=range(len(winnings)) + for i in profit: + self.cursor.execute(self.sql.query['getRingProfitFromHandId'], (name, winnings[i][0], site)) + spent = self.db.cursor.fetchone() + if not spent[0] == None: + profit[i]=(i, winnings[i][1]-spent[0]) + else: + profit[i] = (i, 0) # todo: this probably adds in flat spots on your graph for hands you were not involved in (ie, observing, sitting out, etc) # and has that counted in your hand totals. Someone needs to figure out the SQL for totally removing any hand you're not in from the equation entirely + - y=map(lambda x:float(x[1]), profit) - line = cumsum(y) - return line/100 +# y=map(lambda x:float(x[1]), profit) + y=map(lambda x:float(x[3]), winnings) + line = cumsum(y) + return line/100 #end of def getRingProfitGraph def __init__(self, db, settings, querylist, config, debug=True): diff --git a/pyfpdb/RegressionTest.py b/pyfpdb/RegressionTest.py index b4dd1b7d..26bec1e9 100644 --- a/pyfpdb/RegressionTest.py +++ b/pyfpdb/RegressionTest.py @@ -24,8 +24,11 @@ import os import sys +import datetime +import Configuration import fpdb_db import fpdb_import +import fpdb_simple import FpdbSQLQueries import unittest @@ -34,6 +37,7 @@ class TestSequenceFunctions(unittest.TestCase): def setUp(self): """Configure MySQL settings/database and establish connection""" + self.c = Configuration.Config() self.mysql_settings={ 'db-host':"localhost", 'db-backend':2, 'db-databaseName':"fpdbtest", @@ -44,7 +48,7 @@ class TestSequenceFunctions(unittest.TestCase): self.mysql_settings['db-databaseName'], self.mysql_settings['db-user'], self.mysql_settings['db-password']) self.mysqldict = FpdbSQLQueries.FpdbSQLQueries('MySQL InnoDB') - self.mysqlimporter = fpdb_import.Importer(self, self.mysql_settings) + self.mysqlimporter = fpdb_import.Importer(self, self.mysql_settings, self.c) # """Configure Postgres settings/database and establish connection""" # self.pg_settings={ 'db-host':"localhost", 'db-backend':3, 'db-databaseName':"fpdbtest", 'db-user':"fpdb", 'db-password':"fpdb"} @@ -69,6 +73,21 @@ class TestSequenceFunctions(unittest.TestCase): self.result = self.mysql_db.cursor.execute("SHOW TABLES") self.failUnless(self.result==13, "Number of tables in database incorrect. Expected 13 got " + str(self.result)) + def testPokerStarsHHDate(self): + latest = "PokerStars Game #21969660557: Hold'em No Limit ($0.50/$1.00) - 2008/11/12 10:00:48 CET [2008/11/12 4:00:48 ET]" + previous = "PokerStars Game #21969660557: Hold'em No Limit ($0.50/$1.00) - 2008/08/17 - 01:14:43 (ET)" + older1 = "PokerStars Game #21969660557: Hold'em No Limit ($0.50/$1.00) - 2008/09/07 06:23:14 ET" + + result = fpdb_simple.parseHandStartTime(older1, "ps") + self.failUnless(result==datetime.datetime(2008,9,7,11,23,14), + "Date incorrect, expected: 2008-09-07 11:23:14 got: " + str(result)) + result = fpdb_simple.parseHandStartTime(latest, "ps") + self.failUnless(result==datetime.datetime(2008,11,12,15,00,48), + "Date incorrect, expected: 2008-11-12 15:00:48 got: " + str(result)) + result = fpdb_simple.parseHandStartTime(previous, "ps") + self.failUnless(result==datetime.datetime(2008,8,17,6,14,43), + "Date incorrect, expected: 2008-08-17 01:14:43 got: " + str(result)) + def testImportHandHistoryFiles(self): """Test import of single HH file""" self.mysqlimporter.addImportFile("regression-test-files/hand-histories/ps-lhe-ring-3hands.txt") diff --git a/pyfpdb/fpdb_simple.py b/pyfpdb/fpdb_simple.py index d1b191de..a746cf64 100644 --- a/pyfpdb/fpdb_simple.py +++ b/pyfpdb/fpdb_simple.py @@ -831,14 +831,16 @@ def parseHandStartTime(topline, site): tmp=topline[pos1:pos2] isUTC=True else: - tmp=topline[-30:] - #print "parsehandStartTime, tmp:", tmp + tmp=topline + # print "parsehandStartTime, tmp:", tmp pos = tmp.find("-")+2 tmp = tmp[pos:] #Need to match either # 2008/09/07 06:23:14 ET or - # 2008/08/17 - 01:14:43 (ET) - m = re.match('(?P[0-9]{4})\/(?P[0-9]{2})\/(?P[0-9]{2})[\- ]+(?P
[0-9]{2}):(?P[0-9]{2}):(?P[0-9]{2})',tmp) + # 2008/08/17 - 01:14:43 (ET) or + # 2008/11/12 9:33:31 CET [2008/11/12 3:33:31 ET] + rexx = '(?P[0-9]{4})\/(?P[0-9]{2})\/(?P[0-9]{2})[\- ]+(?P
[0-9]+):(?P[0-9]+):(?P[0-9]+)' + m = re.search(rexx,tmp) #print "year:", int(m.group('YEAR')), "month", int(m.group('MON')), "day", int(m.group('DAY')), "hour", int(m.group('HR')), "minute", int(m.group('MIN')), "second", int(m.group('SEC')) result = datetime.datetime(int(m.group('YEAR')), int(m.group('MON')), int(m.group('DAY')), int(m.group('HR')), int(m.group('MIN')), int(m.group('SEC'))) else: