p52 - much progress on tourneys and some minor stuff and a change of tables

migrated install-in-windows to website
renamed table tourneysgametypes to tourneytypes
This commit is contained in:
steffen123 2008-08-18 05:58:41 +01:00
parent 6eb42cd05e
commit 8fb57d3729
9 changed files with 71 additions and 157 deletions

View File

@ -1,95 +0,0 @@
These instructions are for 32/64bit Windows NT/2k/XP/2k3/Vista/2k8. Well, in principle. I
made them in XP Pro, if you discover any differences or problems please let me know. If you're still on Win3/95/98/ME then you should switch to GNU/Linux, *BSD or WinXP.
Also see the other install-in-*.txt files.
The length of these instructions is due to MS refusal to provide any meaningful package management, but an installer will be made at some point.
Here are direct download links, last checked 10Aug2008:
http://dev.mysql.com/get/Downloads/MySQL-5.0/mysql-5.0.67-win32.zip/from/pick#mirrors
http://www.python.org/ftp/python/2.5.2/python-2.5.2.msi
http://downloads.sourceforge.net/mysql-python/MySQL-python-1.2.2.win32-py2.5.exe?modtime=1173863337&big_mirror=0
http://ftp.gnome.org/pub/gnome/binaries/win32/gtk+/2.12/gtk+-bundle-2.12.11.zip
http://ftp.gnome.org/pub/GNOME/binaries/win32/pycairo/1.4/pycairo-1.4.12-1.win32-py2.5.exe
http://ftp.gnome.org/pub/GNOME/binaries/win32/pygobject/2.14/pygobject-2.14.1-1.win32-py2.5.exe
http://ftp.gnome.org/pub/GNOME/binaries/win32/pygtk/2.12/pygtk-2.12.1-2.win32-py2.5.exe
1a. Install MySQL and do its basic setup
- Download Windows ZIP/Setup.exe
- Unzip the archive, execute the setup file
At the end make sure you activate that you want to configure it now.
Use the advanced/detailed config. Leave everything as default unless stated below, or unless you know what you're doing.
Make sure to DEACTIVATE TCP/IP networking, unless you want that and know how to secure it
Set a root password. Note that this is NOT the account/pw that fpdb will use. Also note that this is NOT a system account - you can't login to Windows with this, it is only for the database.
Once finished it shold confirm "service started successfully"
1b. MySQL database and user setup
Now open a shell (aka command prompt aka DOS window):
Click Start, then Run. In the opening window type "cmd" (without the inverted commas) and then click OK. A window with a black background should open.
Type (replacing yourPassword with the root password for MySQL you specified during installation):
mysql --user=root --password=yourPassword
It should say something like this:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.0.60-log Gentoo Linux mysql-5.0.60-r1
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
Now create the actual database. The default name is fpdb, I recommend you keep it. Type this:
CREATE DATABASE fpdb;
Next you need to create a user. I recommend you use the default fpdb. Type this (replacing newPassword with the password you want the fpdb user to have - this can, but for security shouldn't, be the same as the root mysql password):
GRANT ALL PRIVILEGES ON fpdb.* TO 'fpdb'@'localhost' IDENTIFIED BY 'newPassword' WITH GRANT OPTION;
Exit mysql by pressing Ctrl+D
2. Install python
Get the latest Windows installer. As of this writing that is 2.5.2. Double click the .msi file to start installation and follow the prompts.
3. Install the Python-DBAPI package for MySQL:
Get the package and double click to install.
4. Time for GTK+ - here's the instructions from their bundle
To use it, create some empty folder like c:\gtk . Using either
Windows Explorer's built-in zip file management, or the command-line
unzip.exe from
ftp://tug.ctan.org/tex-archive/tools/zip/info-zip/WIN32/unz552xN.exe
unzip this bundle.
Then add the bin folder to your PATH. Make sure you have no other
versions of GTK+ in PATH.
To do that:
Right click on "My Computer" ("Arbeitsplatz" in German Windows) on the Desktop or in (Windows) Explorer. Select Properties. Then click on the tab Advanced and then you should see Environment Variables. Simply append GTK's bin folder to the existing PATH (make sure to put a ; between the old PATH and GTK's folder to seperate the entries in this list).
5. Install pycairo, pygobject and pygtk with double click.
6. Copy the default.conf from the docs folder to the appropriate folder in your system, e.g. C:\Documents and Settings\Nick\Application Data\fpdb\profiles\default.conf
Now edit the file, in particular you will always have to type in the correct password (insecure, I know) and if you differ from the default setup you may need to change host, database or user.
7. Double click fpdb.py in the pyfpdb folder of where you downloaded/unpacked it to.
When the program started open the menu Database and click "Create or Recreate Tables".
That's it! Now you can use the bulk importer and the table viewer, more's coming. See readme-user.txt
A word on privelege separation: fpdb should not require root/Administrator rights to run. If it does it is a bug or serious misconfiguration, please let us know.
License
=======
Trademarks of third parties have been used under Fair Use or similar laws.
Copyright 2008 Steffen Jobbagy-Felso
Permission is granted to copy, distribute and/or modify this
document under the terms of the GNU Free Documentation License,
Version 1.2 as published by the Free Software Foundation; with
no Invariant Sections, no Front-Cover Texts, and with no Back-Cover
Texts. A copy of the license can be found in fdl-1.2.txt
The program itself is licensed under AGPLv3, see agpl-3.0.txt

View File

@ -4,8 +4,6 @@ Everything is subject to change and especially the order will often change. Patc
alpha2 (release by 17Aug)
======
change config file to windows line endings
add sf.net logo to webpage
change tabledesign VALIGN
seperate and improve instructions for update
expand instructions for profile file
add instructions for mailing list to contacts
@ -14,6 +12,8 @@ re-run existing regression tests
alpha3
======
add sf.net logo to webpage
change tabledesign VALIGN
finish updating filelist
finish todos in git instructions
make sure totalProfit shows actual profit rather than winnings.

View File

@ -421,9 +421,9 @@ The program itself is licensed under AGPLv3, see agpl-3.0.txt</p>
<TD><P>Position for which this row applies. In this table this can be B(BB), S(SB), D(Dealer/Button), C(Cutoff), M(Middle - the 3 before cutoff) or E (Early - the 3 before Middle)</P></TD>
</TR>
<TR VALIGN=TOP>
<TD><P>tourneysGametypeId</P></TD>
<TD><P>tourneyTypeId</P></TD>
<TD><P>smallint</P></TD>
<TD><P>References TourneysGametypes.id</P></TD>
<TD><P>References TourneyTypes.id</P></TD>
</TR>
<TR VALIGN=TOP>
@ -777,9 +777,9 @@ The program itself is licensed under AGPLv3, see agpl-3.0.txt</p>
<TD><P><BR></P></TD>
</TR>
<TR VALIGN=TOP>
<TD><P>tourneysGametypeId</P></TD>
<TD><P>tourneyTypeId</P></TD>
<TD><P>smallint</P></TD>
<TD><P>References TourneysGametypes.id</P></TD>
<TD><P>References TourneyTypes.id</P></TD>
</TR>
<TR VALIGN=TOP>
<TD><P>siteTourneyNo</P></TD>
@ -813,7 +813,7 @@ The program itself is licensed under AGPLv3, see agpl-3.0.txt</p>
</TR>
</TABLE>
<p><BR></P>
<p><B>Table TourneyGametypes</B></P>
<p><B>Table TourneyTypes</B></P>
<TABLE BORDER=1 CELLPADDING=2 CELLSPACING=0>
<TR VALIGN=TOP>
<TD><P>Field name</P></TD>

View File

@ -370,7 +370,7 @@ This program is licensed under the AGPL3, see docs"""+os.sep+"agpl-3.0.txt")
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.window.connect("delete_event", self.delete_event)
self.window.connect("destroy", self.destroy)
self.window.set_title("Free Poker DB - version: alpha1+, p51")
self.window.set_title("Free Poker DB - version: alpha1+, p52")
self.window.set_border_width(1)
self.window.set_size_request(1020,400)
self.window.set_resizable(True)

View File

@ -47,7 +47,7 @@ class fpdb_db:
try:
self.cursor.execute("SELECT * FROM Settings")
settings=self.cursor.fetchone()
if settings[0]!=50:
if settings[0]!=52:
print "outdated or too new database version - please recreate tables"
except:# _mysql_exceptions.ProgrammingError:
print "failed to read settings table - please recreate tables"
@ -126,7 +126,9 @@ class fpdb_db:
self.cursor.execute("DROP TABLE IF EXISTS Tourneys;")
self.cursor.execute("DROP TABLE IF EXISTS Players;")
self.cursor.execute("DROP TABLE IF EXISTS Gametypes;")
self.cursor.execute("DROP TABLE IF EXISTS TourneysGametypes;")
if oldDbVersion>45 and oldDbVersion<=51:
self.cursor.execute("DROP TABLE IF EXISTS TourneysGametypes;")
self.cursor.execute("DROP TABLE IF EXISTS TourneyTypes;")
self.cursor.execute("DROP TABLE IF EXISTS Sites;")
self.db.commit()
@ -213,7 +215,7 @@ class fpdb_db:
card5Value smallint,
card5Suit char(1))""")
self.create_table("""TourneysGametypes (
self.create_table("""TourneyTypes (
id SMALLINT UNSIGNED UNIQUE AUTO_INCREMENT, PRIMARY KEY (id),
siteId SMALLINT UNSIGNED, FOREIGN KEY (siteId) REFERENCES Sites(id),
buyin INT,
@ -223,7 +225,7 @@ class fpdb_db:
self.create_table("""Tourneys (
id INT UNSIGNED UNIQUE AUTO_INCREMENT, PRIMARY KEY (id),
tourneysGametypeId SMALLINT UNSIGNED, FOREIGN KEY (tourneysGametypeId) REFERENCES TourneysGametypes(id),
tourneyTypeId SMALLINT UNSIGNED, FOREIGN KEY (tourneyTypeId) REFERENCES TourneyTypes(id),
siteTourneyNo BIGINT,
entries INT,
prizepool INT,
@ -288,7 +290,7 @@ class fpdb_db:
playerId INT UNSIGNED, FOREIGN KEY (playerId) REFERENCES Players(id),
activeSeats SMALLINT,
position CHAR(1),
tourneysGametypeId SMALLINT UNSIGNED, FOREIGN KEY (tourneysGametypeId) REFERENCES TourneysGametypes(id),
tourneyTypeId SMALLINT UNSIGNED, FOREIGN KEY (tourneyTypeId) REFERENCES TourneyTypes(id),
HDs INT,
street0VPI INT,
@ -351,10 +353,10 @@ class fpdb_db:
street4CheckCallRaiseChance INT,
street4CheckCallRaiseDone INT)""")
self.cursor.execute("INSERT INTO Settings VALUES (50);")
self.cursor.execute("INSERT INTO Settings VALUES (52);")
self.cursor.execute("INSERT INTO Sites VALUES (DEFAULT, \"Full Tilt Poker\", 'USD');")
self.cursor.execute("INSERT INTO Sites VALUES (DEFAULT, \"PokerStars\", 'USD');")
self.cursor.execute("INSERT INTO TourneysGametypes (id) VALUES (DEFAULT);")
self.cursor.execute("INSERT INTO TourneyTypes (id) VALUES (DEFAULT);")
self.db.commit()
print "finished recreating tables"
#end def recreate_tables

View File

@ -44,7 +44,11 @@ def mainParser(db, cursor, site, category, hand):
fee=fpdb_simple.parseFee(hand[0])
entries=-1 #todo: parse this
prizepool=-1 #todo: parse this
knockout=0
tourneyStartTime=handStartTime #todo: read tourney start time
rebuyOrAddon=fpdb_simple.isRebuyOrAddon(hand[0])
tourneyTypeId=fpdb_simple.recogniseTourneyTypeId(cursor, siteID, buyin, fee, knockout, rebuyOrAddon)
fpdb_simple.isAlreadyInDB(cursor, gametypeID, siteHandNo)
#part 2: classify lines by type (e.g. cards, action, win, sectionchange) and street
@ -110,16 +114,13 @@ def mainParser(db, cursor, site, category, hand):
hudImportData=fpdb_simple.generateHudData(playerIDs, category, actionTypes, actionTypeByNo, winnings, totalWinnings, positions)
if isTourney:
raise fpdb_simple.FpdbError ("tourneys are currently broken")
payin_amounts=fpdb_simple.calcPayin(len(names), buyin, fee)
ranks=[]
for i in range (len(names)):
ranks.append(0)
knockout=0
entries=-1
prizepool=-1
payin_amounts=fpdb_simple.calcPayin(len(names), buyin, fee)
if (category=="holdem" or category=="omahahi" or category=="omahahilo"):
result = fpdb_save_to_db.tourney_holdem_omaha(cursor, category, siteTourneyNo, buyin, fee, knockout, entries, prizepool, tourneyStartTime, payin_amounts, ranks,
result = fpdb_save_to_db.tourney_holdem_omaha(cursor, category, siteTourneyNo, buyin, fee, knockout, entries, prizepool, tourneyStartTime, payin_amounts, ranks, tourneyTypeId, siteID,
siteHandNo, gametypeID, handStartTime, names, playerIDs, startCashes, positions, cardValues, cardSuits, boardValues, boardSuits, winnings, rakes, actionTypes, actionAmounts, actionNos, hudImportData, maxSeats, tableName, seatNos)
elif (category=="razz" or category=="studhi" or category=="studhilo"):
raise fpdb_simple.FpdbError ("stud/razz are currently broken")

View File

@ -39,15 +39,7 @@ def ring_stud(cursor, category, site_hand_no, gametype_id, hand_start_time,
def ring_holdem_omaha(cursor, category, site_hand_no, gametype_id, hand_start_time, names, player_ids, start_cashes, positions, card_values, card_suits, board_values, board_suits, winnings, rakes, action_types, action_amounts, actionNos, hudImportData, maxSeats, tableName, seatNos):
"""stores a holdem/omaha hand into the database"""
#fill up the two player card arrays
if (category=="holdem"):
fpdb_simple.fillCardArrays(len(names), 2, card_values, card_suits)
elif (category=="omahahi" or category=="omahahilo"):
fpdb_simple.fillCardArrays(len(names), 4, card_values, card_suits)
else:
raise fpdb_simple.FpdbError ("invalid category: category")
fpdb_simple.fillCardArrays(len(names), category, card_values, card_suits)
fpdb_simple.fill_board_cards(board_values, board_suits)
hands_id=fpdb_simple.storeHands(cursor, site_hand_no, gametype_id, hand_start_time, names, tableName, maxSeats)
@ -62,21 +54,13 @@ def ring_holdem_omaha(cursor, category, site_hand_no, gametype_id, hand_start_ti
return site_hand_no
#end def ring_holdem_omaha
def tourney_holdem_omaha(cursor, category, site_tourney_no, buyin, fee, knockout, entries, prizepool, tourney_start, payin_amounts, ranks, #end of tourney specific params
site_hand_no, gametype_id, hand_start_time, names, player_ids, start_cashes, positions, card_values, card_suits, board_values, board_suits, winnings, rakes, action_types, action_amounts, actionNos, hudImportData):
def tourney_holdem_omaha(cursor, category, site_tourney_no, buyin, fee, knockout, entries, prizepool, tourney_start, payin_amounts, ranks, tourneyTypeId, siteId, #end of tourney specific params
site_hand_no, gametype_id, hand_start_time, names, player_ids, start_cashes, positions, card_values, card_suits, board_values, board_suits, winnings, rakes, action_types, action_amounts, actionNos, hudImportData, maxSeats, tableName, seatNos):
"""stores a tourney holdem/omaha hand into the database"""
#fill up the two player card arrays
if (category=="holdem"):
fpdb_simple.fillCardArrays(len(names), 2, card_values, card_suits)
elif (category=="omahahi" or category=="omahahilo"):
fpdb_simple.fillCardArrays(len(names), 4, card_values, card_suits)
else:
raise fpdb_simple.FpdbError ("invalid category: category")
fpdb_simple.fillCardArrays(len(names), category, card_values, card_suits)
fpdb_simple.fill_board_cards(board_values, board_suits)
tourney_id=fpdb_simple.store_tourneys(cursor, site_id, site_tourney_no, buyin, fee, knockout, entries, prizepool, tourney_start)
tourney_id=fpdb_simple.store_tourneys(cursor, siteId, site_tourney_no, buyin, fee, knockout, entries, prizepool, tourney_start)
tourneys_players_ids=fpdb_simple.store_tourneys_players(cursor, tourney_id, player_ids, payin_amounts, ranks, winnings)
hands_id=fpdb_simple.storeHands(cursor, site_hand_no, gametype_id, hand_start_time, names)

View File

@ -250,12 +250,17 @@ def fill_board_cards(board_values, board_suits):
board_suits.append("x")
#end def fill_board_cards
def fillCardArrays(player_count, card_count, card_values, card_suits):
#fills up the two card arrays
#print "fillCardArrays, player_count:", player_count," card_count:",card_count
#print "card_values:",card_values
def fillCardArrays(player_count, category, card_values, card_suits):
"""fills up the two card arrays"""
if (category=="holdem"):
cardCount=2
elif (category=="omahahi" or category=="omahahilo"):
cardCount=4
else:
raise fpdb_simple.FpdbError ("invalid category: category")
for i in range (player_count):
while (len(card_values[i])<card_count):
while (len(card_values[i])<cardCount):
card_values[i].append(0)
card_suits[i].append("x")
#end def fillCardArrays
@ -465,6 +470,11 @@ def isAlreadyInDB(cursor, gametypeID, siteHandNo):
raise DuplicateError ("dupl")
#end isAlreadyInDB
def isRebuyOrAddon(topline):
"""isRebuyOrAddon not implemented yet"""
return False
#end def isRebuyOrAddon
#returns whether the passed topline indicates a tournament or not
def isTourney(topline):
if (topline.find("Tournament")!=-1):
@ -1011,6 +1021,20 @@ def recogniseGametypeID(cursor, topline, site_id, category, isTourney):#todo: th
return result[0]
#end def recogniseGametypeID
def recogniseTourneyTypeId(cursor, siteId, buyin, fee, knockout, rebuyOrAddon):
cursor.execute ("SELECT id FROM TourneyTypes WHERE siteId=%s AND buyin=%s AND fee=%s AND knockout=%s AND rebuyOrAddon=%s", (siteId, buyin, fee, knockout, rebuyOrAddon))
result=cursor.fetchone()
#print "tried SELECTing gametypes.id, result:",result
try:
len(result)
except TypeError:#this means we need to create a new entry
cursor.execute("""INSERT INTO TourneyTypes (siteId, buyin, fee, knockout, rebuyOrAddon) VALUES (%s, %s, %s, %s, %s)""", (siteId, buyin, fee, knockout, rebuyOrAddon))
cursor.execute("SELECT id FROM TourneyTypes WHERE siteId=%s AND buyin=%s AND fee=%s AND knockout=%s AND rebuyOrAddon=%s", (siteId, buyin, fee, knockout, rebuyOrAddon))
result=cursor.fetchone()
return result[0]
#end def recogniseTourneyTypeId
#returns the SQL ids of the names given in an array
def recognisePlayerIDs(cursor, names, site_id):
result = []
@ -1807,7 +1831,7 @@ def storeHudCache(cursor, category, gametypeId, playerIds, hudImportData):
if doInsert:
#print "playerid before insert:",row[2]
cursor.execute("""INSERT INTO HudCache
(gametypeId, playerId, activeSeats, position, tourneysGametypeId,
(gametypeId, playerId, activeSeats, position, tourneyTypeId,
HDs, street0VPI, street0Aggr, street0_3B4BChance, street0_3B4BDone,
street1Seen, street2Seen, street3Seen, street4Seen, sawShowdown,
street1Aggr, street2Aggr, street3Aggr, street4Aggr, otherRaisedStreet1,
@ -1845,7 +1869,7 @@ def storeHudCache(cursor, category, gametypeId, playerIds, hudImportData):
foldToStreet2CBChance=%s, foldToStreet2CBDone=%s, foldToStreet3CBChance=%s, foldToStreet3CBDone=%s, foldToStreet4CBChance=%s,
foldToStreet4CBDone=%s, totalProfit=%s, street1CheckCallRaiseChance=%s, street1CheckCallRaiseDone=%s, street2CheckCallRaiseChance=%s,
street2CheckCallRaiseDone=%s, street3CheckCallRaiseChance=%s, street3CheckCallRaiseDone=%s, street4CheckCallRaiseChance=%s, street4CheckCallRaiseDone=%s
WHERE gametypeId=%s AND playerId=%s AND activeSeats=%s AND position=%s AND tourneysGametypeId=%s""", (row[6], row[7], row[8], row[9], row[10],
WHERE gametypeId=%s AND playerId=%s AND activeSeats=%s AND position=%s AND tourneyTypeId=%s""", (row[6], row[7], row[8], row[9], row[10],
row[11], row[12], row[13], row[14], row[15],
row[16], row[17], row[18], row[19], row[20],
row[21], row[22], row[23], row[24], row[25],
@ -1900,3 +1924,4 @@ def store_tourneys_players(cursor, tourney_id, player_ids, payin_amounts, ranks,
#print "created new tourneys_players.id:",tmp
result.append(tmp[0])
return result
#end def store_tourneys_players

View File

@ -13,11 +13,10 @@ require SITE_PATH.'sidebar.php';
<h1>Installing in Windows</h1>
<p>These instructions are for 32/64bit Windows NT/2k/XP/2k3/Vista/2k8. Well, in principle. I made them in XP Pro, if you discover any differences or problems please let me know. If you're still on Win3/95/98/ME then you should switch to GNU/Linux, *BSD or WinXP. Also see the installation pages for other plataforms.<br>
<br>
The length of these instructions is due to MS refusal to provide any kind of package management. <br>
<br>
Here are direct download links from 10Aug2008:<br>
<p>These instructions are for 32/64bit Windows NT/2k/XP/2k3/Vista/2k8. Well, in principle. I
made them in XP Pro, if you discover any differences or problems please let me know. If you're still on Win3/95/98/ME then you should switch to GNU/Linux, *BSD or WinXP. <br>
The length of these instructions is due to MS refusal to provide any meaningful package management, but an installer will be made at some point.</p>
<p>Here are direct download links, last checked on 10Aug2008:<br>
<a href="http://dev.mysql.com/get/Downloads/MySQL-5.0/mysql-5.0.67-win32.zip/from/pick#mirrors">http://dev.mysql.com/get/Downloads/MySQL-5.0/mysql-5.0.67-win32.zip/from/pick#mirrors</a><br>
<a href="http://www.python.org/ftp/python/2.5.2/python-2.5.2.msi">http://www.python.org/ftp/python/2.5.2/python-2.5.2.msi</a><br>
<a href="http://downloads.sourceforge.net/mysql-python/MySQL-python-1.2.2.win32-py2.5.exe?modtime=1173863337&big_mirror=0">http://downloads.sourceforge.net/mysql-python/MySQL-python-1.2.2.win32-py2.5.exe?modtime=1173863337&amp;big_mirror=0</a><br>
@ -38,7 +37,7 @@ Once finished it shold confirm "service started successfully"<br>
<br>
<b>1b. MySQL database and user setup</b><br>
Now open a shell (aka command prompt aka DOS window):<br>
Click Start, then Run. In the opening window type "cmd" (without the inverted commas) and then click OK. A windows with a black background should open.<br>
Click Start, then Run. In the opening window type "cmd" (without the inverted commas) and then click OK. A window with a black background should open.<br>
<br>
Type (replacing yourPassword with the root password for MySQL you specified during installation):<br>
mysql --user=root --password=yourPassword<br>
@ -66,9 +65,7 @@ Get the latest Windows installer. As of this writing that is 2.5.2. Double click
<b>3. Install the Python-DBAPI package for MySQL:</b><br>
Get the package and double click to install.<br>
<br>
<b>4. </b> In MySQL create a new database fpdb and a user by the same name. Set a password. I did this in webmin. Then set permissions for that user to: Select | Insert | Update | Delete | Create | Drop<br>
<br>
<b>5. Time for GTK+ - here's the instructions from their bundle</b><br>
<b>4. Time for GTK+ - here's the instructions from their bundle</b><br>
<br>
To use it, create some empty folder like c:\gtk . Using either<br>
Windows Explorer's built-in zip file management, or the command-line<br>
@ -81,17 +78,17 @@ versions of GTK+ in PATH.<br>
To do that:<br>
Right click on "My Computer" ("Arbeitsplatz" in German Windows) on the Desktop or in (Windows) Explorer. Select Properties. Then click on the tab Advanced and then you should see Environment Variables. Simply append GTK's bin folder to the existing PATH (make sure to put a ; between the old PATH and GTK's folder to seperate the entries in this list).<br>
<br>
<b>6.</b> Install pycairo, pygobject and pygtk with double click.<br>
<b>5.</b> Install pycairo, pygobject and pygtk with double click.<br>
<br>
<b>7.</b> Copy the default.conf from the docs folder to the appropriate folder in your system, e.g. C:\Documents and Settings\Nick\Application Data\fpdb\profiles\default.conf<br>
<b>6.</b> Copy the default.conf from the docs folder to the appropriate folder in your system, e.g. C:\Documents and Settings\Nick\Application Data\fpdb\profiles\default.conf<br>
<br>
Now edit the file, in particular you will always have to type in the correct password (insecure, I know) and if you differ from the default setup you may need to change host, database or user.<br>
<br>
<b>8.</b> Double click fpdb.py in the pyfpdb folder of where you downloaded/unpacked it to.<br>
<b>7.</b> Double click fpdb.py in the pyfpdb folder of where you downloaded/unpacked it to.<br>
When the program started open the menu Database and click "Create or Recreate Tables".<br>
<br>
That's it! Now you can use the bulk importer and the table viewer, more's coming. See readme-user.txt<br>
<br>
A word on privelege separation: fpdb should not require root/Administrator rights to run. If it does it is a bug or serious misconfiguration, please let us know.<br>
License<br>
=======<br>
Trademarks of third parties have been used under Fair Use or similar laws.<br>