diff --git a/pyfpdb/AlchemyFacilities.py b/pyfpdb/AlchemyFacilities.py deleted file mode 100644 index 260a6c1d..00000000 --- a/pyfpdb/AlchemyFacilities.py +++ /dev/null @@ -1,134 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -#Copyright 2009-2011 Grigorij Indigirkin -#This program is free software: you can redistribute it and/or modify -#it under the terms of the GNU Affero General Public License as published by -#the Free Software Foundation, version 3 of the License. -# -#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 Affero General Public License -#along with this program. If not, see . -#In the "official" distribution you can find the license in agpl-3.0.txt. - -#TODO: gettextify if file is used again - -from decimal_wrapper import Decimal - -from sqlalchemy import types -from sqlalchemy.orm.exc import NoResultFound -from sqlalchemy.exc import IntegrityError - -import Card - -class CardColumn(types.TypeDecorator): - """Stores cards as smallints - - Automatically converts values like '9h' to smallint - - >>> CardColumn().process_bind_param( 'Td', '' ) - 22 - >>> CardColumn().process_bind_param( u'Td', '' ) - 22 - >>> CardColumn().process_bind_param( 22, '' ) - 22 - >>> CardColumn().process_result_value( 22, '' ) - 'Td' - """ - - impl = types.SmallInteger - - def process_bind_param(self, value, dialect): - if value is None or isinstance(value, int): - return value - elif isinstance(value, basestring) and len(value) == 2: - return Card.encodeCard(str(value)) - else: - raise Exception, "Incorrect card value: " + repr(value) - - def process_result_value(self, value, dialect): - return Card.valueSuitFromCard( value ) - - -class MoneyColumn(types.TypeDecorator): - """Stores money: bets, pots, etc - - Understands: - Decimal as real amount - int as amount mupliplied by 100 - string as decimal - Returns Decimal - >>> MoneyColumn().process_bind_param( 230, '' ) - 230 - >>> MoneyColumn().process_bind_param( Decimal('2.30'), '' ) - 230 - >>> MoneyColumn().process_bind_param( '2.30', '' ) - 230 - >>> MoneyColumn().process_result_value( 230, '' ) - Decimal('2.3') - """ - - impl = types.Integer - - def process_bind_param(self, value, dialect): - if value is None or isinstance(value, int): - return value - elif isinstance(value, basestring) or isinstance(value, Decimal): - return int(Decimal(value)*100) - else: - raise Exception, "Incorrect amount:" + repr(value) - - def process_result_value(self, value, dialect): - if value is None: - return None - return Decimal(value)/100 - - -class BigIntColumn(types.TypeDecorator, types.Integer): - """Representing db-independent big integer """ - # Integer inheritance required for auto_increment flag - - impl = types.Integer - - def load_dialect_impl(self, dialect): - from sqlalchemy import databases - if dialect.name == 'mysql': - return databases.mysql.MSBigInteger() - elif dialect.name == 'postgres': - return databases.mysql.PGBigInteger() - return types.Integer() - - -class MappedBase(object): - """Provide dummy contrcutor""" - - def __init__(self, **kwargs): - for k, v in kwargs.iteritems(): - setattr(self, k, v) - - def get_columns_names(self): - return [i.name for i in self._sa_class_manager.mapper.c] - -def get_or_create(klass, session, **kwargs): - """ - Looks up an object with the given kwargs, creating one if necessary. - Returns a tuple of (object, created), where created is a boolean - specifying whether an object was created. - """ - assert kwargs, \ - 'get_or_create() must be passed at least one keyword argument' - try: - return session.query(klass).filter_by(**kwargs).one(), False - except NoResultFound: - try: - obj = klass(**kwargs) - session.add(obj) - session.flush() - return obj, True - except IntegrityError: - return session.query(klass).filter_by(**kwargs).one(), False - diff --git a/pyfpdb/AlchemyMappings.py b/pyfpdb/AlchemyMappings.py deleted file mode 100644 index 53f59a1a..00000000 --- a/pyfpdb/AlchemyMappings.py +++ /dev/null @@ -1,484 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -#Copyright 2009-2011 Grigorij Indigirkin -#This program is free software: you can redistribute it and/or modify -#it under the terms of the GNU Affero General Public License as published by -#the Free Software Foundation, version 3 of the License. -# -#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 Affero General Public License -#along with this program. If not, see . -#In the "official" distribution you can find the license in agpl-3.0.txt. - -"""@package AlchemyMappings -This package contains all classes to be mapped and mappers themselves -""" - -#TODO: gettextify if file is used again - -import logging -import re -from decimal_wrapper import Decimal -from sqlalchemy.orm import mapper, relation, reconstructor -from sqlalchemy.sql import select -from collections import defaultdict - - -from AlchemyTables import * -from AlchemyFacilities import get_or_create, MappedBase -from DerivedStats import DerivedStats -from Exceptions import IncompleteHandError, FpdbError - - -class Player(MappedBase): - """Class reflecting Players db table""" - - @staticmethod - def get_or_create(session, siteId, name): - return get_or_create(Player, session, siteId=siteId, name=name)[0] - - def __str__(self): - return '' % (self.name, self.site and self.site.name) - - -class Gametype(MappedBase): - """Class reflecting Gametypes db table""" - - @staticmethod - def get_or_create(session, siteId, gametype): - map = zip( - ['type', 'base', 'category', 'limitType', 'smallBlind', 'bigBlind', 'smallBet', 'bigBet', 'currency'], - ['type', 'base', 'category', 'limitType', 'sb', 'bb', 'dummy', 'dummy', 'currency']) - gametype = dict([(new, gametype.get(old)) for new, old in map ]) - - hilo = "h" - if gametype['category'] in ('studhilo', 'omahahilo'): - hilo = "s" - elif gametype['category'] in ('razz','27_3draw','badugi'): - hilo = "l" - gametype['hiLo'] = hilo - - for f in ['smallBlind', 'bigBlind', 'smallBet', 'bigBet']: - if gametype[f] is None: - gametype[f] = 0 - gametype[f] = int(Decimal(gametype[f])*100) - - gametype['siteId'] = siteId - return get_or_create(Gametype, session, **gametype)[0] - - -class HandActions(object): - """Class reflecting HandsActions db table""" - def initFromImportedHand(self, hand, actions): - self.hand = hand - self.actions = {} - for street, street_actions in actions.iteritems(): - self.actions[street] = [] - for v in street_actions: - hp = hand.handplayers_by_name[v[0]] - self.actions[street].append({'street': street, 'pid': hp.id, 'seat': hp.seatNo, 'action':v}) - - @property - def flat_actions(self): - actions = [] - for street in self.hand.allStreets: - actions += self.actions[street] - return actions - - - -class HandInternal(DerivedStats): - """Class reflecting Hands db table""" - - def parseImportedHandStep1(self, hand): - """Extracts values to insert into from hand returned by HHC. No db is needed he""" - hand.players = hand.getAlivePlayers() - - # also save some data for step2. Those fields aren't in Hands table - self.siteId = hand.siteId - self.gametype_dict = hand.gametype - - self.attachHandPlayers(hand) - self.attachActions(hand) - - self.assembleHands(hand) - self.assembleHandsPlayers(hand) - - def parseImportedHandStep2(self, session): - """Fetching ids for gametypes and players""" - gametype = Gametype.get_or_create(session, self.siteId, self.gametype_dict) - self.gametypeId = gametype.id - for hp in self.handPlayers: - hp.playerId = Player.get_or_create(session, self.siteId, hp.name).id - - def getPlayerByName(self, name): - if not hasattr(self, 'handplayers_by_name'): - self.handplayers_by_name = {} - for hp in self.handPlayers: - pname = getattr(hp, 'name', None) or hp.player.name - self.handplayers_by_name[pname] = hp - return self.handplayers_by_name[name] - - def attachHandPlayers(self, hand): - """Fill HandInternal.handPlayers list. Create self.handplayers_by_name""" - hand.noSb = getattr(hand, 'noSb', None) - if hand.noSb is None and self.gametype_dict['base']=='hold': - saw_sb = False - for action in hand.actions[hand.actionStreets[0]]: # blindsantes - if action[1] == 'posts' and action[2] == 'small blind' and action[0] is not None: - saw_sb = True - hand.noSb = saw_sb - - self.handplayers_by_name = {} - for seat, name, chips in hand.players: - p = HandPlayer(hand = self, imported_hand=hand, seatNo=seat, - name=name, startCash=chips) - self.handplayers_by_name[name] = p - - def attachActions(self, hand): - """Create HandActions object""" - a = HandActions() - a.initFromImportedHand(self, hand.actions) - - def parseImportedTournament(self, hand, session): - """Fetching tourney, its type and players - - Must be called after Step2 - """ - if self.gametype_dict['type'] != 'tour': return - - # check for consistense - for i in ('buyin', 'tourNo'): - if not hasattr(hand, i): - raise IncompleteHandError( - "Field '%s' required for tournaments" % i, self.id, hand ) - - # repair old-style buyin value - m = re.match('\$(\d+)\+\$(\d+)', hand.buyin) - if m is not None: - hand.buyin, self.fee = m.groups() - - # fetch tourney type - tour_type_hand2db = { - 'buyin': 'buyin', - 'fee': 'fee', - 'speed': 'speed', - 'maxSeats': 'maxseats', - 'knockout': 'isKO', - 'rebuy': 'isRebuy', - 'addOn': 'isAddOn', - 'shootout': 'isShootout', - 'matrix': 'isMatrix', - 'sng': 'isSNG', - } - tour_type_index = dict([ - ( i_db, getattr(hand, i_hand, None) ) - for i_db, i_hand in tour_type_hand2db.iteritems() - ]) - tour_type_index['siteId'] = self.siteId - tour_type = TourneyType.get_or_create(session, **tour_type_index) - - # fetch and update tourney - tour = Tourney.get_or_create(session, hand.tourNo, tour_type.id) - cols = tour.get_columns_names() - for col in cols: - hand_val = getattr(hand, col, None) - if col in ('id', 'tourneyTypeId', 'comment', 'commentTs') or hand_val is None: - continue - db_val = getattr(tour, col, None) - if db_val is None: - setattr(tour, col, hand_val) - elif col == 'koBounty': - setattr(tour, col, max(db_val, hand_val)) - elif col == 'tourStartTime' and hand.startTime: - setattr(tour, col, min(db_val, hand.startTime)) - - if tour.entries is None and tour_type.sng: - tour.entries = tour_type.maxSeats - - # fetch and update tourney players - for hp in self.handPlayers: - tp = TourneysPlayer.get_or_create(session, tour.id, hp.playerId) - # FIXME: other TourneysPlayers should be added here - - session.flush() - - def isDuplicate(self, session): - """Checks if current hand already exists in db - - siteHandNo ans gametypeId have to be setted - """ - return session.query(HandInternal).filter_by( - siteHandNo=self.siteHandNo, gametypeId=self.gametypeId).count()!=0 - - def __str__(self): - s = list() - for i in self._sa_class_manager.mapper.c: - s.append('%25s %s' % (i, getattr(self, i.name))) - - s+=['', ''] - for i,p in enumerate(self.handPlayers): - s.append('%d. %s' % (i, p.name or '???')) - s.append(str(p)) - return '\n'.join(s) - - @property - def boardcards(self): - cards = [] - for i in range(5): - cards.append(getattr(self, 'boardcard%d' % (i+1), None)) - return filter(bool, cards) - - @property - def HandClass(self): - """Return HoldemOmahaHand or something like this""" - import Hand - if self.gametype.base == 'hold': - return Hand.HoldemOmahaHand - elif self.gametype.base == 'draw': - return Hand.DrawHand - elif self.gametype.base == 'stud': - return Hand.StudHand - raise Exception("Unknow gametype.base: '%s'" % self.gametype.base) - - @property - def allStreets(self): - return self.HandClass.allStreets - - @property - def actionStreets(self): - return self.HandClass.actionStreets - - - -class HandPlayer(MappedBase): - """Class reflecting HandsPlayers db table""" - def __init__(self, **kwargs): - if 'imported_hand' in kwargs and 'seatNo' in kwargs: - imported_hand = kwargs.pop('imported_hand') - self.position = self.getPosition(imported_hand, kwargs['seatNo']) - super(HandPlayer, self).__init__(**kwargs) - - @reconstructor - def init_on_load(self): - self.name = self.player.name - - @staticmethod - def getPosition(hand, seat): - """Returns position value like 'B', 'S', '0', '1', ... - - >>> class A(object): pass - ... - >>> A.noSb = False - >>> A.maxseats = 6 - >>> A.buttonpos = 2 - >>> A.gametype = {'base': 'hold'} - >>> A.players = [(i, None, None) for i in (2, 4, 5, 6)] - >>> HandPlayer.getPosition(A, 6) # cut off - '1' - >>> HandPlayer.getPosition(A, 2) # button - '0' - >>> HandPlayer.getPosition(A, 4) # SB - 'S' - >>> HandPlayer.getPosition(A, 5) # BB - 'B' - >>> A.noSb = True - >>> HandPlayer.getPosition(A, 5) # MP3 - '2' - >>> HandPlayer.getPosition(A, 6) # cut off - '1' - >>> HandPlayer.getPosition(A, 2) # button - '0' - >>> HandPlayer.getPosition(A, 4) # BB - 'B' - """ - from itertools import chain - if hand.gametype['base'] == 'stud': - # FIXME: i've never played stud so plz check & del comment \\grindi - bringin = None - for action in chain(*[self.actions[street] for street in hand.allStreets]): - if action[1]=='bringin': - bringin = action[0] - break - if bringin is None: - raise Exception, "Cannot find bringin" - # name -> seat - bringin = int(filter(lambda p: p[1]==bringin, bringin)[0]) - seat = (int(seat) - int(bringin))%int(hand.maxseats) - return str(seat) - else: - seats_occupied = sorted([seat_ for seat_, name, chips in hand.players], key=int) - if hand.buttonpos not in seats_occupied: - # i.e. something like - # Seat 3: PlayerX ($0), is sitting out - # The button is in seat #3 - hand.buttonpos = max(seats_occupied, - key = lambda s: int(s) - if int(s) <= int(hand.buttonpos) - else int(s) - int(hand.maxseats) - ) - seats_occupied = sorted(seats_occupied, - key = lambda seat_: ( - - seats_occupied.index(seat_) - + seats_occupied.index(hand.buttonpos) - + 2) % len(seats_occupied) - ) - # now (if SB presents) seats_occupied contains seats in order: BB, SB, BU, CO, MP3, ... - if hand.noSb: - # fix order in the case nosb - seats_occupied = seats_occupied[1:] + seats_occupied[0:1] - seats_occupied.insert(1, -1) - seat = seats_occupied.index(seat) - if seat == 0: - return 'B' - elif seat == 1: - return 'S' - else: - return str(seat-2) - - @property - def cards(self): - cards = [] - for i in range(7): - cards.append(getattr(self, 'card%d' % (i+1), None)) - return filter(bool, cards) - - def __str__(self): - s = list() - for i in self._sa_class_manager.mapper.c: - s.append('%45s %s' % (i, getattr(self, i.name))) - return '\n'.join(s) - - -class Site(object): - """Class reflecting Players db table""" - INITIAL_DATA = [ - (1 , 'Full Tilt Poker','FT'), - (2 , 'PokerStars', 'PS'), - (3 , 'Everleaf', 'EV'), - (4 , 'Win2day', 'W2'), - (5 , 'OnGame', 'OG'), - (6 , 'UltimateBet', 'UB'), - (7 , 'Betfair', 'BF'), - (8 , 'Absolute', 'AB'), - (9 , 'PartyPoker', 'PP'), - (10, 'Partouche', 'PA'), - (11, 'Carbon', 'CA'), - (12, 'PKR', 'PK'), - ] - INITIAL_DATA_KEYS = ('id', 'name', 'code') - - INITIAL_DATA_DICTS = [ dict(zip(INITIAL_DATA_KEYS, datum)) for datum in INITIAL_DATA ] - - @classmethod - def insert_initial(cls, connection): - connection.execute(sites_table.insert(), cls.INITIAL_DATA_DICTS) - - -class Tourney(MappedBase): - """Class reflecting Tourneys db table""" - - @classmethod - def get_or_create(cls, session, siteTourneyNo, tourneyTypeId): - """Fetch tourney by index or creates one if none. """ - return get_or_create(cls, session, siteTourneyNo=siteTourneyNo, - tourneyTypeId=tourneyTypeId)[0] - - - -class TourneyType(MappedBase): - """Class reflecting TourneyType db table""" - - @classmethod - def get_or_create(cls, session, **kwargs): - """Fetch tourney type by index or creates one if none - - Required kwargs: - buyin fee speed maxSeats knockout - rebuy addOn shootout matrix sng currency - """ - return get_or_create(cls, session, **kwargs)[0] - - -class TourneysPlayer(MappedBase): - """Class reflecting TourneysPlayers db table""" - - @classmethod - def get_or_create(cls, session, tourneyId, playerId): - """Fetch tourney player by index or creates one if none """ - return get_or_create(cls, session, tourneyId=tourneyId, playerId=playerId) - - -class Version(object): - """Provides read/write access for version var""" - CURRENT_VERSION = 120 # db version for current release - # 119 - first alchemy version - # 120 - add m_factor - - conn = None - ver = None - def __init__(self, connection=None): - if self.__class__.conn is None: - self.__class__.conn = connection - - @classmethod - def is_wrong(cls): - return cls.get() != cls.CURRENT_VERSION - - @classmethod - def get(cls): - if cls.ver is None: - try: - cls.ver = cls.conn.execute(select(['version'], settings_table)).fetchone()[0] - except: - return None - return cls.ver - - @classmethod - def set(cls, value): - if cls.conn.execute(settings_table.select()).rowcount==0: - cls.conn.execute(settings_table.insert(), version=value) - else: - cls.conn.execute(settings_table.update().values(version=value)) - cls.ver = value - - @classmethod - def set_initial(cls): - cls.set(cls.CURRENT_VERSION) - - -mapper (Gametype, gametypes_table, properties={ - 'hands': relation(HandInternal, backref='gametype'), -}) -mapper (Player, players_table, properties={ - 'playerHands': relation(HandPlayer, backref='player'), - 'playerTourney': relation(TourneysPlayer, backref='player'), -}) -mapper (Site, sites_table, properties={ - 'gametypes': relation(Gametype, backref = 'site'), - 'players': relation(Player, backref = 'site'), - 'tourneyTypes': relation(TourneyType, backref = 'site'), -}) -mapper (HandActions, hands_actions_table, properties={}) -mapper (HandInternal, hands_table, properties={ - 'handPlayers': relation(HandPlayer, backref='hand'), - 'actions_all': relation(HandActions, backref='hand', uselist=False), -}) -mapper (HandPlayer, hands_players_table, properties={}) - -mapper (Tourney, tourneys_table) -mapper (TourneyType, tourney_types_table, properties={ - 'tourneys': relation(Tourney, backref='type'), -}) -mapper (TourneysPlayer, tourneys_players_table) - -class LambdaKeyDict(defaultdict): - """Operates like defaultdict but passes key argument to the factory function""" - def __missing__(key): - return self.default_factory(key) - diff --git a/pyfpdb/AlchemyTables.py b/pyfpdb/AlchemyTables.py deleted file mode 100644 index 0e42375e..00000000 --- a/pyfpdb/AlchemyTables.py +++ /dev/null @@ -1,460 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -#Copyright 2009-2011 Grigorij Indigirkin -#This program is free software: you can redistribute it and/or modify -#it under the terms of the GNU Affero General Public License as published by -#the Free Software Foundation, version 3 of the License. -# -#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 Affero General Public License -#along with this program. If not, see . -#In the "official" distribution you can find the license in agpl-3.0.txt. - -"""@package AlchemyTables -Contains all sqlalchemy tables -""" - -#TODO: gettextify if file is used again - -from sqlalchemy import Table, Float, Column, Integer, String, MetaData, \ - ForeignKey, Boolean, SmallInteger, DateTime, Text, Index, CHAR, \ - PickleType, Unicode - -from AlchemyFacilities import CardColumn, MoneyColumn, BigIntColumn - - -metadata = MetaData() - - -autorates_table = Table('Autorates', metadata, - Column('id', Integer, primary_key=True, nullable=False), - Column('playerId', Integer, ForeignKey("Players.id"), nullable=False), - Column('gametypeId', SmallInteger, ForeignKey("Gametypes.id"), nullable=False), - Column('description', String(50), nullable=False), - Column('shortDesc', CHAR(8), nullable=False), - Column('ratingTime', DateTime, nullable=False), - Column('handCount', Integer, nullable=False), - mysql_charset='utf8', - mysql_engine='InnoDB', -) - - -gametypes_table = Table('Gametypes', metadata, - Column('id', SmallInteger, primary_key=True), - Column('siteId', SmallInteger, ForeignKey("Sites.id"), nullable=False), # SMALLINT - Column('currency', String(4), nullable=False), # varchar(4) NOT NULL - Column('type', String(4), nullable=False), # char(4) NOT NULL - Column('base', String(4), nullable=False), # char(4) NOT NULL - Column('category', String(9), nullable=False), # varchar(9) NOT NULL - Column('limitType', CHAR(2), nullable=False), # char(2) NOT NULL - Column('hiLo', CHAR(1), nullable=False), # char(1) NOT NULL - Column('smallBlind', Integer(3)), # int - Column('bigBlind', Integer(3)), # int - Column('smallBet', Integer(3), nullable=False), # int NOT NULL - Column('bigBet', Integer(3), nullable=False), # int NOT NULL - mysql_charset='utf8', - mysql_engine='InnoDB', -) - - -hands_table = Table('Hands', metadata, - Column('id', BigIntColumn, primary_key=True), - Column('tableName', String(30), nullable=False), - Column('siteHandNo', BigIntColumn, nullable=False), - Column('gametypeId', SmallInteger, ForeignKey('Gametypes.id'), nullable=False), - Column('startTime', DateTime, nullable=False), - Column('importTime', DateTime, nullable=False), - Column('seats', SmallInteger, nullable=False), - Column('maxSeats', SmallInteger, nullable=False), - - Column('boardcard1', CardColumn), - Column('boardcard2', CardColumn), - Column('boardcard3', CardColumn), - Column('boardcard4', CardColumn), - Column('boardcard5', CardColumn), - Column('texture', SmallInteger), - Column('playersVpi', SmallInteger, nullable=False), - Column('playersAtStreet1', SmallInteger, nullable=False, default=0), - Column('playersAtStreet2', SmallInteger, nullable=False, default=0), - Column('playersAtStreet3', SmallInteger, nullable=False, default=0), - Column('playersAtStreet4', SmallInteger, nullable=False, default=0), - Column('playersAtShowdown',SmallInteger, nullable=False), - Column('street0Raises', SmallInteger, nullable=False), - Column('street1Raises', SmallInteger, nullable=False), - Column('street2Raises', SmallInteger, nullable=False), - Column('street3Raises', SmallInteger, nullable=False), - Column('street4Raises', SmallInteger, nullable=False), - Column('street1Pot', MoneyColumn), - Column('street2Pot', MoneyColumn), - Column('street3Pot', MoneyColumn), - Column('street4Pot', MoneyColumn), - Column('showdownPot', MoneyColumn), - Column('comment', Text), - Column('commentTs', DateTime), - mysql_charset='utf8', - mysql_engine='InnoDB', -) -Index('siteHandNo', hands_table.c.siteHandNo, hands_table.c.gametypeId, unique=True) - - -hands_actions_table = Table('HandsActions', metadata, - Column('id', BigIntColumn, primary_key=True, nullable=False), - Column('handId', BigIntColumn, ForeignKey("Hands.id"), nullable=False), - Column('actions', PickleType, nullable=False), - mysql_charset='utf8', - mysql_engine='InnoDB', -) - - -hands_players_table = Table('HandsPlayers', metadata, - Column('id', BigIntColumn, primary_key=True), - Column('handId', BigIntColumn, ForeignKey("Hands.id"), nullable=False), - Column('playerId', Integer, ForeignKey("Players.id"), nullable=False), - Column('startCash', MoneyColumn), - Column('position', CHAR(1)), #CHAR(1) - Column('seatNo', SmallInteger, nullable=False), #SMALLINT NOT NULL - - Column('card1', CardColumn), #smallint NOT NULL, - Column('card2', CardColumn), #smallint NOT NULL - Column('card3', CardColumn), #smallint - Column('card4', CardColumn), #smallint - Column('card5', CardColumn), #smallint - Column('card6', CardColumn), #smallint - Column('card7', CardColumn), #smallint - Column('startCards', SmallInteger), #smallint - - Column('m_factor', Integer), # null for ring games - Column('ante', MoneyColumn), #INT - Column('winnings', MoneyColumn, nullable=False, default=0), #int NOT NULL - Column('rake', MoneyColumn, nullable=False, default=0), #int NOT NULL - Column('totalProfit', MoneyColumn), #INT - Column('comment', Text), #text - Column('commentTs', DateTime), #DATETIME - Column('tourneysPlayersId', BigIntColumn, ForeignKey("TourneysPlayers.id"),), #BIGINT UNSIGNED - Column('tourneyTypeId', Integer, ForeignKey("TourneyTypes.id"),), #SMALLINT UNSIGNED - - Column('wonWhenSeenStreet1',Float), #FLOAT - Column('wonWhenSeenStreet2',Float), #FLOAT - Column('wonWhenSeenStreet3',Float), #FLOAT - Column('wonWhenSeenStreet4',Float), #FLOAT - Column('wonAtSD', Float), #FLOAT - - Column('street0VPI', Boolean), #BOOLEAN - Column('street0Aggr', Boolean), #BOOLEAN - Column('street0_3BChance', Boolean), #BOOLEAN - Column('street0_3BDone', Boolean), #BOOLEAN - Column('street0_4BChance', Boolean), #BOOLEAN - Column('street0_4BDone', Boolean), #BOOLEAN - Column('other3BStreet0', Boolean), #BOOLEAN - Column('other4BStreet0', Boolean), #BOOLEAN - - Column('street1Seen', Boolean), #BOOLEAN - Column('street2Seen', Boolean), #BOOLEAN - Column('street3Seen', Boolean), #BOOLEAN - Column('street4Seen', Boolean), #BOOLEAN - Column('sawShowdown', Boolean), #BOOLEAN - - Column('street1Aggr', Boolean), #BOOLEAN - Column('street2Aggr', Boolean), #BOOLEAN - Column('street3Aggr', Boolean), #BOOLEAN - Column('street4Aggr', Boolean), #BOOLEAN - - Column('otherRaisedStreet0',Boolean), #BOOLEAN - Column('otherRaisedStreet1',Boolean), #BOOLEAN - Column('otherRaisedStreet2',Boolean), #BOOLEAN - Column('otherRaisedStreet3',Boolean), #BOOLEAN - Column('otherRaisedStreet4',Boolean), #BOOLEAN - Column('foldToOtherRaisedStreet0', Boolean), #BOOLEAN - Column('foldToOtherRaisedStreet1', Boolean), #BOOLEAN - Column('foldToOtherRaisedStreet2', Boolean), #BOOLEAN - Column('foldToOtherRaisedStreet3', Boolean), #BOOLEAN - Column('foldToOtherRaisedStreet4', Boolean), #BOOLEAN - - Column('stealAttemptChance', Boolean), #BOOLEAN - Column('stealAttempted', Boolean), #BOOLEAN - Column('foldBbToStealChance', Boolean), #BOOLEAN - Column('foldedBbToSteal', Boolean), #BOOLEAN - Column('foldSbToStealChance', Boolean), #BOOLEAN - Column('foldedSbToSteal', Boolean), #BOOLEAN - - Column('street1CBChance', Boolean), #BOOLEAN - Column('street1CBDone', Boolean), #BOOLEAN - Column('street2CBChance', Boolean), #BOOLEAN - Column('street2CBDone', Boolean), #BOOLEAN - Column('street3CBChance', Boolean), #BOOLEAN - Column('street3CBDone', Boolean), #BOOLEAN - Column('street4CBChance', Boolean), #BOOLEAN - Column('street4CBDone', Boolean), #BOOLEAN - - Column('foldToStreet1CBChance', Boolean), #BOOLEAN - Column('foldToStreet1CBDone', Boolean), #BOOLEAN - Column('foldToStreet2CBChance', Boolean), #BOOLEAN - Column('foldToStreet2CBDone', Boolean), #BOOLEAN - Column('foldToStreet3CBChance', Boolean), #BOOLEAN - Column('foldToStreet3CBDone', Boolean), #BOOLEAN - Column('foldToStreet4CBChance', Boolean), #BOOLEAN - Column('foldToStreet4CBDone', Boolean), #BOOLEAN - - Column('street1CheckCallRaiseChance',Boolean), #BOOLEAN - Column('street1CheckCallRaiseDone', Boolean), #BOOLEAN - Column('street2CheckCallRaiseChance',Boolean), #BOOLEAN - Column('street2CheckCallRaiseDone', Boolean), #BOOLEAN - Column('street3CheckCallRaiseChance',Boolean), #BOOLEAN - Column('street3CheckCallRaiseDone', Boolean), #BOOLEAN - Column('street4CheckCallRaiseChance',Boolean), #BOOLEAN - Column('street4CheckCallRaiseDone', Boolean), #BOOLEAN - - Column('street0Calls', SmallInteger), #TINYINT - Column('street1Calls', SmallInteger), #TINYINT - Column('street2Calls', SmallInteger), #TINYINT - Column('street3Calls', SmallInteger), #TINYINT - Column('street4Calls', SmallInteger), #TINYINT - Column('street0Bets', SmallInteger), #TINYINT - Column('street1Bets', SmallInteger), #TINYINT - Column('street2Bets', SmallInteger), #TINYINT - Column('street3Bets', SmallInteger), #TINYINT - Column('street4Bets', SmallInteger), #TINYINT - Column('street0Raises', SmallInteger), #TINYINT - Column('street1Raises', SmallInteger), #TINYINT - Column('street2Raises', SmallInteger), #TINYINT - Column('street3Raises', SmallInteger), #TINYINT - Column('street4Raises', SmallInteger), #TINYINT - - Column('actionString', String(15)), #VARCHAR(15) - mysql_charset='utf8', - mysql_engine='InnoDB', -) - - -hud_cache_table = Table('HudCache', metadata, - Column('id', BigIntColumn, primary_key=True), - Column('gametypeId', SmallInteger, ForeignKey("Gametypes.id"), nullable=False), # SMALLINT - Column('playerId', Integer, ForeignKey("Players.id"), nullable=False), # SMALLINT - Column('activeSeats', SmallInteger, nullable=False), # SMALLINT NOT NULL - Column('position', CHAR(1)), # CHAR(1) - Column('tourneyTypeId', Integer, ForeignKey("TourneyTypes.id") ), # SMALLINT - Column('styleKey', CHAR(7), nullable=False), # CHAR(7) NOT NULL - Column('m_factor', Integer), - Column('HDs', Integer, nullable=False), # INT NOT NULL - - Column('wonWhenSeenStreet1', Float), # FLOAT - Column('wonWhenSeenStreet2', Float), # FLOAT - Column('wonWhenSeenStreet3', Float), # FLOAT - Column('wonWhenSeenStreet4', Float), # FLOAT - Column('wonAtSD', Float), # FLOAT - - Column('street0VPI', Integer), # INT - Column('street0Aggr', Integer), # INT - Column('street0_3BChance', Integer), # INT - Column('street0_3BDone', Integer), # INT - Column('street0_4BChance', Integer), # INT - Column('street0_4BDone', Integer), # INT - Column('other3BStreet0', Integer), # INT - Column('other4BStreet0', Integer), # INT - - Column('street1Seen', Integer), # INT - Column('street2Seen', Integer), # INT - Column('street3Seen', Integer), # INT - Column('street4Seen', Integer), # INT - Column('sawShowdown', Integer), # INT - - Column('street1Aggr', Integer), # INT - Column('street2Aggr', Integer), # INT - Column('street3Aggr', Integer), # INT - Column('street4Aggr', Integer), # INT - - Column('otherRaisedStreet0', Integer), # INT - Column('otherRaisedStreet1', Integer), # INT - Column('otherRaisedStreet2', Integer), # INT - Column('otherRaisedStreet3', Integer), # INT - Column('otherRaisedStreet4', Integer), # INT - Column('foldToOtherRaisedStreet0', Integer), # INT - Column('foldToOtherRaisedStreet1', Integer), # INT - Column('foldToOtherRaisedStreet2', Integer), # INT - Column('foldToOtherRaisedStreet3', Integer), # INT - Column('foldToOtherRaisedStreet4', Integer), # INT - - Column('stealAttemptChance', Integer), # INT - Column('stealAttempted', Integer), # INT - Column('foldBbToStealChance', Integer), # INT - Column('foldedBbToSteal', Integer), # INT - Column('foldSbToStealChance', Integer), # INT - Column('foldedSbToSteal', Integer), # INT - - Column('street1CBChance', Integer), # INT - Column('street1CBDone', Integer), # INT - Column('street2CBChance', Integer), # INT - Column('street2CBDone', Integer), # INT - Column('street3CBChance', Integer), # INT - Column('street3CBDone', Integer), # INT - Column('street4CBChance', Integer), # INT - Column('street4CBDone', Integer), # INT - - Column('foldToStreet1CBChance', Integer), # INT - Column('foldToStreet1CBDone', Integer), # INT - Column('foldToStreet2CBChance', Integer), # INT - Column('foldToStreet2CBDone', Integer), # INT - Column('foldToStreet3CBChance', Integer), # INT - Column('foldToStreet3CBDone', Integer), # INT - Column('foldToStreet4CBChance', Integer), # INT - Column('foldToStreet4CBDone', Integer), # INT - - Column('totalProfit', Integer), # INT - - Column('street1CheckCallRaiseChance', Integer), # INT - Column('street1CheckCallRaiseDone', Integer), # INT - Column('street2CheckCallRaiseChance', Integer), # INT - Column('street2CheckCallRaiseDone', Integer), # INT - Column('street3CheckCallRaiseChance', Integer), # INT - Column('street3CheckCallRaiseDone', Integer), # INT - Column('street4CheckCallRaiseChance', Integer), # INT - Column('street4CheckCallRaiseDone', Integer), # INT - - Column('street0Calls', Integer), # INT - Column('street1Calls', Integer), # INT - Column('street2Calls', Integer), # INT - Column('street3Calls', Integer), # INT - Column('street4Calls', Integer), # INT - Column('street0Bets', Integer), # INT - Column('street1Bets', Integer), # INT - Column('street2Bets', Integer), # INT - Column('street3Bets', Integer), # INT - Column('street4Bets', Integer), # INT - Column('street0Raises', Integer), # INT - Column('street1Raises', Integer), # INT - Column('street2Raises', Integer), # INT - Column('street3Raises', Integer), # INT - Column('street4Raises', Integer), # INT - mysql_charset='utf8', - mysql_engine='InnoDB', -) - - -players_table = Table('Players', metadata, - Column('id', Integer, primary_key=True), - Column('name', Unicode(32), nullable=False), # VARCHAR(32) CHARACTER SET utf8 NOT NULL - Column('siteId', SmallInteger, ForeignKey("Sites.id"), nullable=False), # SMALLINT - Column('comment', Text), # text - Column('commentTs', DateTime), # DATETIME - mysql_charset='utf8', - mysql_engine='InnoDB', -) -Index('name', players_table.c.name, players_table.c.siteId, unique=True) - - -settings_table = Table('Settings', metadata, - Column('version', SmallInteger, nullable=False), - mysql_charset='utf8', - mysql_engine='InnoDB', -) - - -sites_table = Table('Sites', metadata, - Column('id', SmallInteger, primary_key=True), - Column('name', String(32), nullable=False), # varchar(32) NOT NULL - Column('code', String(2), nullable=False), # char(2) NOT NULL - mysql_charset='utf8', - mysql_engine='InnoDB', -) - - -tourneys_table = Table('Tourneys', metadata, - Column('id', Integer, primary_key=True), - Column('tourneyTypeId', Integer, ForeignKey("TourneyTypes.id"), nullable=False, default=1), - Column('siteTourneyNo', BigIntColumn, nullable=False), # BIGINT NOT NULL - Column('entries', Integer), # INT NOT NULL - Column('prizepool', Integer), # INT NOT NULL - Column('tourStartTime', DateTime), # DATETIME NOT NULL - Column('tourEndTime', DateTime), # DATETIME - Column('tourneyName', String(40)), # varchar(40) - # Mask use : 1=Positionnal Winnings|2=Match1|4=Match2|...|pow(2,n)=Matchn - Column('matrixIdProcessed',SmallInteger, default=0), # TINYINT UNSIGNED DEFAULT 0 - Column('totalRebuyCount', Integer, default=0), # INT DEFAULT 0 - Column('totalAddOnCount', Integer, default=0), # INT DEFAULT 0 - Column('comment', Text), # TEXT - Column('commentTs', DateTime), # DATETIME - mysql_charset='utf8', - mysql_engine='InnoDB', -) -Index('siteTourneyNo', tourneys_table.c.siteTourneyNo, tourneys_table.c.tourneyTypeId, unique=True) - - -tourney_types_table = Table('TourneyTypes', metadata, - Column('id', Integer, primary_key=True), - Column('siteId', SmallInteger, ForeignKey("Sites.id"), nullable=False), - Column('currency', String(4), nullable=False), # varchar(4) NOT NULL - Column('buyin', Integer, nullable=False), # INT NOT NULL - Column('fee', Integer, nullable=False), # INT NOT NULL - Column('buyInChips', Integer, nullable=False), # INT NOT NULL - Column('maxSeats', Boolean, nullable=False, default=-1), # INT NOT NULL DEFAULT -1 - Column('rebuy', Boolean, nullable=False, default=False), # BOOLEAN NOT NULL DEFAULT False - Column('rebuyCost', Integer), # INT - Column('rebuyChips', Integer), # INT - Column('addOn', Boolean, nullable=False, default=False), # BOOLEAN NOT NULL DEFAULT False - Column('addOnCost', Integer), # INT - Column('addOnChips', Integer), # INT - Column('knockout', Boolean, nullable=False, default=False), # BOOLEAN NOT NULL DEFAULT False - Column('koBounty', Integer), # INT - Column('speed', String(10)), # varchar(10) - Column('shootout', Boolean, nullable=False, default=False), # BOOLEAN NOT NULL DEFAULT False - Column('matrix', Boolean, nullable=False, default=False), # BOOLEAN NOT NULL DEFAULT False - Column('sng', Boolean, nullable=False, default=False), # BOOLEAN NOT NULL DEFAULT False - Column('satellite', Boolean, nullable=False, default=False), # BOOLEAN NOT NULL DEFAULT False - Column('doubleOrNothing', Boolean, nullable=False, default=False), # BOOLEAN NOT NULL DEFAULT False - Column('guarantee', Integer, nullable=False, default=0), # INT NOT NULL DEFAULT 0 - mysql_charset='utf8', - mysql_engine='InnoDB', -) -Index('tourneyTypes_all', - tourney_types_table.c.siteId, tourney_types_table.c.buyin, tourney_types_table.c.fee, - tourney_types_table.c.maxSeats, tourney_types_table.c.knockout, tourney_types_table.c.rebuy, - tourney_types_table.c.addOn, tourney_types_table.c.speed, - tourney_types_table.c.shootout, tourney_types_table.c.matrix, tourney_types_table.c.sng) - - -tourneys_players_table = Table('TourneysPlayers', metadata, - Column('id', BigIntColumn, primary_key=True), - Column('tourneyId', Integer, ForeignKey("Tourneys.id"), nullable=False), - Column('playerId', Integer, ForeignKey("Players.id"), nullable=False), - Column('rank', Integer), # INT NOT NULL - Column('winnings', Integer), # INT NOT NULL - Column('winningsCurrency', Text), # TEXT - Column('rebuyCount', Integer, default=0), # INT DEFAULT 0 - Column('addOnCount', Integer, default=0), # INT DEFAULT 0 - Column('koCount', Integer, default=0), # INT DEFAULT 0 - Column('comment', Text), # TEXT - Column('commentTs', DateTime), # DATETIME - mysql_charset='utf8', - mysql_engine='InnoDB', -) -Index('tourneyId', tourneys_players_table.c.tourneyId, tourneys_players_table.c.playerId, unique=True) - - -def sss(): - "Debug function. Returns (config, sql, db)" - - import Configuration, SQL, Database, os - class Dummy(object): - pass - self = Dummy() - self.config = Configuration.Config() - self.settings = {} - if (os.sep=="/"): - self.settings['os']="linuxmac" - else: - self.settings['os']="windows" - - self.settings.update(self.config.get_db_parameters()) - self.settings.update(self.config.get_import_parameters()) - self.settings.update(self.config.get_default_paths()) - - self.sql = SQL.Sql( db_server = self.settings['db-server']) - self.db = Database.Database(self.config, sql = self.sql) - - return self.config, self.sql, self.db -