webgo/database.py

186 lines
5.2 KiB
Python

#apt-get install python-sqlobject python-psycopg
from sqlobject import *
import sys, os, time
import gnugo, helper
#account and database name
dbname = "/home/mtsrc/daten/projekte/webgo/webgo.sqlite"
#dbname = "/tmp/webgo.sqlite"
dbdebug = "debug=t&debugOutput=t" #don't want SQL debug messages? just change to an empty string: "debug="
dbdebug = "debug="
#build connection string and connect
connection_string='sqlite:%s?%s' %(dbname,dbdebug)
connection=connectionForURI(connection_string)
__connection__ = connection
class GobanTable(SQLObject):
"""
Abstract:
A GobanTable instance contains all data of a current goban: players, board etc.
Details: The table looks like this:
player1
player2
turn_number
size
name
description
sgf
created
lastmove
"""
player1 = StringCol()
player2 = StringCol()
size = IntCol()
turn_number = IntCol(default=1)
description = StringCol(default=None)
sgf = StringCol(default=None)
created = IntCol(default=int(time.time()))
lastmove = IntCol(default=int(time.time()))
def players(self):
"""returns both player names as a tuple"""
print self.player1,self.player2
return (self.player1,self.player2)
def set_time(self):
"""updates self.lastmove to current time"""
self.lastmove = int(time.time())
def create_sgf(self):
"""create an empty sgf file and safe it as a string in self.sgf."""
self.sgf = gnugo.create_sgf_file(self.size)
class Users(SQLObject):
"""
creates a table named users with following columns:
name - name of user
password - passsword of user
game1 - the 10 game slots of this user contain names
... of goban tables
game10
sessionid - id of current session
timeout - when does session time out?
"""
username = StringCol(unique=True,notNone=True,alternateID=True)
password = StringCol(notNone=True)
game1 = StringCol(default=None)
game2 = StringCol(default=None)
game3 = StringCol(default=None)
game4 = StringCol(default=None)
game5 = StringCol(default=None)
game6 = StringCol(default=None)
game7 = StringCol(default=None)
game8 = StringCol(default=None)
game9 = StringCol(default=None)
game10 = StringCol(default=None)
sessionid = StringCol(default=None)
timeout = IntCol(default=None)
def gamelist(self):
"""
return the list of all games of the given user.
"""
#TODO: how to generate this list automatically?
ret = []
ret.append(self.game1)
ret.append(self.game2)
ret.append(self.game3)
ret.append(self.game4)
ret.append(self.game5)
ret.append(self.game6)
ret.append(self.game7)
ret.append(self.game8)
ret.append(self.game9)
ret.append(self.game10)
return ret
def remove_game(self,gamename):
"""removes a game whose name is given."""
gamenames = (int(gamename),str(gamename),gamename)
if self.game1 in gamenames : self.game1=None
if self.game2 in gamenames : self.game2=None
if self.game3 in gamenames : self.game3=None
if self.game4 in gamenames : self.game4=None
if self.game5 in gamenames : self.game5=None
if self.game6 in gamenames : self.game6=None
if self.game7 in gamenames : self.game7=None
if self.game8 in gamenames : self.game8=None
if self.game9 in gamenames : self.game9=None
if self.game10 in gamenames : self.game10=None
def free_slot_left(self):
"""Returns True, if there is an empty game slot left, else returns False."""
if self.game1 == None: return True
elif self.game2 == None: return True
elif self.game3 == None: return True
elif self.game4 == None: return True
elif self.game5 == None: return True
elif self.game6 == None: return True
elif self.game7 == None: return True
elif self.game8 == None: return True
elif self.game9 == None: return True
elif self.game10 == None: return True
else: return False
def add_game(self,gamename):
"""saves the game name into an empty slot"""
if self.game1 == None: self.game1 = gamename
elif self.game2 == None: self.game2 = gamename
elif self.game3 == None: self.game3 = gamename
elif self.game4 == None: self.game4 = gamename
elif self.game5 == None: self.game5 = gamename
elif self.game6 == None: self.game6 = gamename
elif self.game7 == None: self.game7 = gamename
elif self.game8 == None: self.game8 = gamename
elif self.game9 == None: self.game9 = gamename
elif self.game10 == None: self.game10 = gamename
else: return False
def set_timeout(self):
self.timeout = int(time.time()) + 900 #current time in seconds + seconds for session
def get_users_with_free_game_slots():
"""
returns a list of users who have at least one empty game slot """
idlist = list(Users.select())
retlist = []
for entry in idlist:
if entry.free_slot_left() == True:
retlist.append(entry.username)
return retlist
#create table which has been defined above:
# if ifNotExists=True, then an existing table does not get overridden.
Users.createTable(ifNotExists=True)
GobanTable.createTable(ifNotExists=True)
if __name__ == "__main__":
connection_string='sqlite:%s?%s' %(os.path.abspath("webgo.sqlite"),dbdebug)
connection=connectionForURI(connection_string)
__connection__ = connection
# add a game to goban table
user = Users(username="gast",password="gast")
#print user.gamelist()
print user.sessionid
user.sessionid=1
print user.sessionid
#print Users.byUsername("gast")
#deleting a row:
#f = MyObject(1)
#f.destroySelf()