From 9ddce0b016952ac57f829e3e6acf0dcdcae4187e Mon Sep 17 00:00:00 2001 From: Ray Date: Tue, 27 Jan 2009 14:11:53 -0500 Subject: [PATCH 01/11] Remove some comments that didn't get removed with its code. --- pyfpdb/HUD_main.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/pyfpdb/HUD_main.py b/pyfpdb/HUD_main.py index 50ec7068..7b934d0a 100755 --- a/pyfpdb/HUD_main.py +++ b/pyfpdb/HUD_main.py @@ -117,15 +117,11 @@ def read_stdin(): # This is the thread function while True: # wait for a new hand number on stdin new_hand_id = sys.stdin.readline() new_hand_id = string.rstrip(new_hand_id) + print "new hand = ", new_hand_id if new_hand_id == "": # blank line means quit destroy() break # this thread is not always killed immediately with gtk.main_quit() -# delete hud_dict entries for any HUD destroyed since last iteration -# for h in hud_dict: -# HUD_removed(h) -# removing this function, we shouldn't need it anymore, since the hud should notify us anyway, right? - # get basic info about the new hand from the db (table_name, max, poker_game) = db_connection.get_table_name(new_hand_id) From 58ccf0327c13e2a0e6ec5c19fd3b246c67c4e8d6 Mon Sep 17 00:00:00 2001 From: Ray Date: Tue, 27 Jan 2009 14:13:54 -0500 Subject: [PATCH 02/11] Complete prev commit by deleting intermed output. --- pyfpdb/HUD_main.py | 1 - 1 file changed, 1 deletion(-) diff --git a/pyfpdb/HUD_main.py b/pyfpdb/HUD_main.py index 7b934d0a..af7e4e9f 100755 --- a/pyfpdb/HUD_main.py +++ b/pyfpdb/HUD_main.py @@ -117,7 +117,6 @@ def read_stdin(): # This is the thread function while True: # wait for a new hand number on stdin new_hand_id = sys.stdin.readline() new_hand_id = string.rstrip(new_hand_id) - print "new hand = ", new_hand_id if new_hand_id == "": # blank line means quit destroy() break # this thread is not always killed immediately with gtk.main_quit() From 5f290ace5699be7bc7118d54b706452e0226e5b2 Mon Sep 17 00:00:00 2001 From: Ray Date: Fri, 30 Jan 2009 13:00:29 -0500 Subject: [PATCH 03/11] Updated version to 0.10 via new VERSION variable. --- pyfpdb/fpdb.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/pyfpdb/fpdb.py b/pyfpdb/fpdb.py index 6e203889..32f5f059 100755 --- a/pyfpdb/fpdb.py +++ b/pyfpdb/fpdb.py @@ -44,6 +44,8 @@ import GuiGraphViewer import FpdbSQLQueries import Configuration +VERSION = "0.10" + class fpdb: def tab_clicked(self, widget, tab_name): """called when a tab button is clicked to activate that tab""" @@ -114,7 +116,8 @@ class fpdb: #end def destroy def dia_about(self, widget, data): - print "todo: implement dia_about" + print "todo: implement dia_about", + print " version = %s, requires database version %s" % (VERSION, "118") #end def dia_about def dia_create_del_database(self, widget, data): @@ -376,7 +379,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: alpha9+, p143 or higher") + self.window.set_title("Free Poker DB - v%s or higher" % (VERSION, )) self.window.set_border_width(1) self.window.set_size_request(1020,400) self.window.set_resizable(True) From 578cdb2ab14d2ebe56ff8c7e58dc4ea05fc3c752 Mon Sep 17 00:00:00 2001 From: Ray Date: Fri, 30 Jan 2009 17:02:32 -0500 Subject: [PATCH 04/11] Added new gentoo ebuild file for 0.10 release. --- ....0_alpha8_p137.ebuild => fpdb-0.10.ebuild} | 2 +- packaging/gentoo/fpdb-1.0_alpha9_p142.ebuild | 62 ------------------- 2 files changed, 1 insertion(+), 63 deletions(-) rename packaging/gentoo/{fpdb-1.0_alpha8_p137.ebuild => fpdb-0.10.ebuild} (94%) delete mode 100644 packaging/gentoo/fpdb-1.0_alpha9_p142.ebuild diff --git a/packaging/gentoo/fpdb-1.0_alpha8_p137.ebuild b/packaging/gentoo/fpdb-0.10.ebuild similarity index 94% rename from packaging/gentoo/fpdb-1.0_alpha8_p137.ebuild rename to packaging/gentoo/fpdb-0.10.ebuild index c55903f3..a41f653b 100644 --- a/packaging/gentoo/fpdb-1.0_alpha8_p137.ebuild +++ b/packaging/gentoo/fpdb-0.10.ebuild @@ -1,7 +1,7 @@ # Copyright 1999-2008 Gentoo Foundation # Gentoo had nothing to do with the production of this ebuild, but I'm pre-emptively transferring all copyrights (as far as legally possible under my local jurisdiction) to them. # Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo-x86/games-util/fpdb/fpdb-1.0_alpha8_p137.ebuild,v 1.0 2008/10/17 steffen@sycamoretest.info Exp $ +# $Header: /var/cvsroot/gentoo-x86/games-util/fpdb/fpdb-0.10.ebuild,v 1.0 2009/1/30 steffen@sycamoretest.info Exp $ NEED_PYTHON=2.3 diff --git a/packaging/gentoo/fpdb-1.0_alpha9_p142.ebuild b/packaging/gentoo/fpdb-1.0_alpha9_p142.ebuild deleted file mode 100644 index c55903f3..00000000 --- a/packaging/gentoo/fpdb-1.0_alpha9_p142.ebuild +++ /dev/null @@ -1,62 +0,0 @@ -# Copyright 1999-2008 Gentoo Foundation -# Gentoo had nothing to do with the production of this ebuild, but I'm pre-emptively transferring all copyrights (as far as legally possible under my local jurisdiction) to them. -# Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo-x86/games-util/fpdb/fpdb-1.0_alpha8_p137.ebuild,v 1.0 2008/10/17 steffen@sycamoretest.info Exp $ - -NEED_PYTHON=2.3 - -#inherit distutils - -MY_P="fpdb-${PV}" -DESCRIPTION="A database program to track your online poker games" -HOMEPAGE="https://sourceforge.net/projects/fpdb/" -SRC_URI="mirror://sourceforge/fpdb/${MY_P}.tar.bz2" - -LICENSE="AGPL-3" -SLOT="0" -KEYWORDS="~amd64 ~x86" -#note: this should work on other architectures too, please send me your experiences -IUSE="" - -RDEPEND="virtual/mysql - dev-python/mysql-python - >=x11-libs/gtk+-2.10 - dev-python/pygtk - dev-python/numpy - dev-python/matplotlib" - -DEPEND="${RDEPEND}" - -src_install() { - DIRINST="${D}usr/share/games/fpdb/" - mkdir -p "${DIRINST}" - cp -R * "${DIRINST}" || die - - DIRBIN="${D}usr/games/bin/" - mkdir -p "${DIRBIN}" - #echo "pathes" - #echo "${DIRINST}pyfpdb/fpdb.py" - #echo "${DIRBIN}fpdb.py" - #echo - echo "cd /usr/share/games/fpdb/pyfpdb/ && python fpdb.py" > "${DIRBIN}fpdb" || die - chmod 755 "${DIRBIN}fpdb" || die -} - -#src_test() { -#} - -pkg_postinst() { - elog "Fpdb has been installed and can be called by executing /usr/games/bin/fpdb" - elog "You need to perform a couple more steps manually." - elog "Please also make sure you followed instructions from previous emerges, in particular make sure you configured mysql and set a root pw for it" - elog "Now run this command to connect to MySQL: mysql --user=root --password=yourPassword" - elog "In the mysql command line interface you need to type these two lines (make sure you get the ; at the end)" - elog "In the second line replace \"newPassword\" with a password of your choice" - elog "CREATE DATABASE fpdb;" - elog "GRANT ALL PRIVILEGES ON fpdb.* TO 'fpdb'@'localhost' IDENTIFIED BY 'newPassword' WITH GRANT OPTION;" - elog "Finally copy the default config file from ${DIRINST}docs/default.conf to ~/.fpdb/ for every user that is to use fpdb." - elog "You will need to edit the default.conf, in particular you need to replace the password with what you entered in the \"GRANT ALL...\"" - elog "Finally run the GUI and click the menu database -> recreate tables" - elog "That's it! See our webpage at http://fpdb.sourceforge.net for more documentation" - elog " " -} From 79fd9987184d96ef3df2aa4418e4c531cb2bb367 Mon Sep 17 00:00:00 2001 From: Ray Date: Fri, 30 Jan 2009 17:13:00 -0500 Subject: [PATCH 05/11] Added Cards0.png = ftp card images for use with Mucked.py --- pyfpdb/Cards0.png | Bin 0 -> 14488 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 pyfpdb/Cards0.png diff --git a/pyfpdb/Cards0.png b/pyfpdb/Cards0.png new file mode 100644 index 0000000000000000000000000000000000000000..e1a8cd4be93b0d2f3b4d3007ac6605930af54e84 GIT binary patch literal 14488 zcmd_RWl$Yox9+=eLU8*NG{C|M?i!qhySo$I9TMDS;VuhzcL@Q4JHb83!rkrgzI)f% z_uRVooL%?p?GN2OXH}1y)jem8Xa2_15lRYDXefjz0000DBrUE20KgQ!-#;V6y`M37 zKGVHl;4MYuMF4=BA#Q}ogZK6)R|zdwRR;@K4`XL@fQXrciTP)cow234in+0wm(#Gh z00007P?A%VIN0A`O7Q9HpLu(Psjsic=O21`{R2*`_YAF=z{H#{gT0!Ve0zIqn>s>f z18*8zR7U`kN=7){e$q=u95n(cIPKTlha+J==DEhs&CWgoV4R(;lH6h5$8cI-!y#ey z3xO&jCF$Vk>?5s55e)2~<^B5^Gx8v`szmBR06dF-SEI}n=A0)!hJ8l;7R?{V>{Zkeenjd6fQ zl2)|Wbtr)Oz@;G$n-qqAva)-5aTOimscfEp;Q*VE)BDY*tbcSp5{*ur6=rg7=ereb zsW;#<9tK_;<_pu8OBFy6xh&de1HGVb0KT6c7MHdnWvD&5s78Vu0CuL9162Xt*fgmN*d7E^`|y4uHXY%T29s55xY;pY*}%Er0qd%hP1sg5Nr|jc-g_qt9}<1 z8Y?VcP&two%3j(qd2;{u@^Dbre$Y2}fByPfBB%4)1G{nOb>a4Hpe-K!1?FLA_w_M6 zB~pF&@@28MdldlCGI7eF<&Y5M2v@Qw?JJlfBDuc33kXO$KD#_z0=vmD=BC=)e?e?+ zAM>l+=orVF`vUW`5ID5?xb~H&>NDRxIbuO^o0&0adgazN<=XGNZ=jcSjsZ-$zV+M7 z1&2xkJOdLRJuq!= zXma~*jB_ZR?le=tfu84QVHXJ=z){xytuoKeC_F}zv8`4SpA`lGOQfT(bK4C|OiWzy z6=M?@fDHpP)9c*YSlraq{5C@%Xjp$ejD7z;z1|*BQQ=>npFd!eEY9`ZKD;iE1MuO# z+}}UEyuH=oz-?@7)x5v%lh5NbYuRc1#^Xy()!i?zFK@4}nt=r`7jMZ!bDd`7_1PnT zpEkET{(0L69B1SVwwSIC47dDjAMUMqyMGJ(xp(wc=-F9b!tfshJ+5_Z?Dtv9VqWt3 zeMJFWRTNbJHIV-w9{|-mBq{)a0~;hRqUO1L?1%AHb)lmf;8I8^W!;w#9$qxJxLcU@!Y&}j3oC!<>t3T<>&PE<7XM!GwW20SXrx-(s{G(wLMShyBzK!Yf*mdg>>)2m^{A2z{_Fnu~ zy=WJ?)@46WREzr9Q9>X9WU9^xrZ)J9f;1I$P-^Z^pZP-?d>oBZl(LOt(r{|CWbSwR zBn;)u*67^ZH-l&2Hh_J!Nt``AT78l&-a~rucj0T2iu4>LG>CliN)?yZC8~!Q(4Y*`j zJ_936D>bB8HOl$|1#2Tzorm%+yS9fe^M~R@Ve6G;LetE|0G1gN{*5*wiwNBTW4l?k zr{4!0cZf+s?UAC2Abr@t2)8qVRuyKy#vUfhlNGkW8BdvdE`Y=!QR6SZ*!6$J`l3G&`ZJ3GnX{w9U@Q*N9Y6SdmxZJv#>}_ z%7*~7RnK*|otrwRT9oP#D;{9rz4tc*HXhbY%~=_hP``31*RV#;E2%IMUiqyx+zZ=Fx8}bX0p;8f_AR$LD<~bSSb|Iz=-Dz z?j>a9HG=(pdM)Nh7SJ1*`AZtMIXBogGkDOj4z+DRm#~cO>+j0d4Xs5eyCLj-_2>a_ zsh6SZk?(<~ZR52=G%6@MG0EI*wgRolOc7b)5mYxyt#YX@>X#=ZJ(G&h$g+)GlN+4S zHx;&C6Kw4I$;ozp)gi_xHYDbB9iHEP8dcVkw@MXklft;U+ z>JZ2zbE&ChbQn%T=8&)1j&CfMc7~5pNcG2{QuNUtu;ZA{jKJFEbT<_*!3FX3*?4Z$=h-9? z8KIGdiUhMu=Vp5al9ypL{2qh$lMkzA9h^4wj1c?3vUBud$5Li{2ePmE)kvF23dU|5 zmuJiH_kVir6p})vRnCnNDVcHISC#$P$*ymPD`4gpEMl8!b|5#*oZe%EU*LlKM<>H{ z?d4Kab}!j)uZyPB6r|YGnH7^#tsFh71R_cRGwh&$7+l_RAu<*5iq>bPl|yhX*oZ-u z(hn|*#Oz~?9(bEcKipl{Q6u`69bV#5aocc){@9y=?m5LeRvQc{gUQAfCpn2_{~J)F z)?QoOt$(UT^bF!{IJ>5vf8M>L@Uav~a; zTQ`%qiEuEQd&hdjMWX9%h`J%1>nWIS8f3FVxQI8|h9oq*-*G*W`LxAM3?}ZfjFWan z?dAPTE$fqUk15hobRi?XYzE{zEM6? zcgD>S8*Kd+Pn>%V+o_Wjwf;7Vm(budWsr&K1^;5KJv;C^R@7K?rnZ1r% zIoc8KDLLp-s5F6q?UH`wkb9Iz|0a*H^U)DdX3GL!aEA->af5(ZXh?52(6Jwe#8ViQ zAeNj7@`F^F-x1Cy&bDnxg&SJkSuw9=@deH#ZBW@HP48%NQImUbOHxQdRFa@2F5Qm6UaX-?icaDE5XGUYizN z?Fq#lByjf0ks8VFhFIWpJ_=CJCjMFd2C6?eUU6-FUOIFtJh>zp;)%Q0x(F?29Gmvk ze%$qzGM?opUV81}P5R^f2$b*8vk$A16e`o9nFd*xC-k>AT=^MmP`ixeltjUJPsr90=aT-DazLIp&50y=p}e#-vhZbbok#D9T*45|PKi&0X<+zQ2%g z4=W(6F012D23=M^tlUK%jEwI| zNHv)$IUjYrL>J};BlRNnHdiR%UGP0UP{;3?+&8`R9PbaXNsaD{O9ThLXl0fm9>}$wwh z&MQRSCDZt#U?3Z4t3#uYsox>;a~a(FdZ)XQk?vNy0PN%M0mRS_m()rzb$HjXVx*iE zevebx9!D^dAc@DkK1_E1vr5P-lAdHGwjB>kJsYvqhvI$AX_3;@?aQn&1#F!h3=f|; zwN~iH)nTD^v0L?bh0BvAva8b-OJqg@n2UK5fd?_|qIr7O(Z)mnR zyVml05d<7U*umCcipA<<%shbX1;A-g+9?>t_gfyyI)l+#QE~AliVr#IqOMbU{J*7A z*)Kc%a&B_%b!wXBJ#kQEu4p*LsHXcI7&1>Jf&W>EL&osK0z>#C6reN)hd_&xX87^D zgvxiM`b16 z+NFXHXvOSwkwYApiV@>;e3A{?J}qYN`nmN8lSj&`Ph;4EheVRTI(*0zg&~09;LNC0 zazIWIV4c{u{?ji_e-565k6fk32bKM>PJ5$70MXn0Cf<|M7nlM8hb`#1Xqld^)XB@V zg=al9R}?<=P<44QgcVLD9r_F$Fk%yyr!w+S?|GVq9A&q<1)GZjGJn-Bk|5noD;Ftw zvKP><-w1!s0`?%2fwoAxYWP;x`0Jb)^2u(uDylW5f#xi6$4y+)5B%!z zpt4?!EW*d1FxuFJ>(js`OpuAWsz|F@uZ9yy#ykO6h(;n$88xgF7^1$aW<*yVc5+EI zgZ-<~1)YC|Y&qX8mc#0~xOSDvCa`iw$l_eZc zcu-jQCuMxPe(IGW2inuH-l(9BPX?DfM7#u0HPWT-DU zLL4(6A)#(qKm^=+2V1N|w56(9q-+5Ee4+|(XrIlGjXt)5;0F+Eq8dhMsIcqp&y#w* z-2^Lp-8~|y)Z`uy^eY|8DgW;|vE6YkjijtWk#kn3sQy7;9v`as-6fO$)MacMTS@HS zqTFjs=x0l`KmMd+^6nPbP0wNCr%a6Tw5=j;lw7~?<;+OWoz_@ep|56)%ZMpc2lC6H z((7HSi~0FFzK`G&dR$?#_uB<>*i;M;vha$mgL==0pncdU(_cz0CaH2Z;|b}UHg=R~ zwrcAJ^G5Sta?~xLxIeiLJ44_-sFtn-g%<9AhGRsT3@^akr+Jt%R>Sydn=xNHd6!8y z(kppK?ylLxG<#n?fBcP$-tY>LF&Ii4Sx@QT!k8KpT1Htd1*V7A6rwCEvljT~-qAz+ zMKzGv3o13v!MOJvI4NeH)210X*CqKjMeZMQx3=vOh$ND6Ht7B3oeE2rLvOtLY_A!j zfa6vq&Z%}D>lh~^|7bN)G)N9 zB*!_l20dJvR*=}@sy|}4-c4N?M>WEiK8yHCr-X=Y-g4$L`831W<#Ci#BI-9GLgP$DzP1D9e>urC$-dwLL3M5Kf8!OrNX= zj!wgHJ9(1)ja$SCAVml1R5=fo4|}yf2g=Py(=>v>_n>XvbhJ3B5T5rOfY1dbcg-{` zX#=v>d{K)k@FkE(JCDz?fV^ENIY}1}@TVM44~@O64(aW)Gmy5^ zsn&)tAgW>fLjt@pu~XD7X@kD-3a1Wv*ed0j%O%fOnz_IEaRyUvM*9u6Is zN@(YID>n-nba6TU9fU@$sUte~666L_(LFfwpBW?Ei9)ATAG&LVXO-dp^wo@r*$DrpY)W>m}#_lX04r`vVtWiRZaov#E3XtP* zm)-lBbXbpn-Mm)&scoX4!_7?M^>#`e*B& zbil0Q?#L*evVZz8BAT`WL3*2R*`Ar?2X_;LemS#XBUi~KCD-!QO38GwrNzjESvS1| z#=a~z`rNaH)pZhc_i}WX{9GZ^qrN3D#9Uk(m;sceyy;v15q8j}GGtY;ou@*y>^xRK zCZk<+TgPWVf%E58z;$~u4c$%5fpdy)1)djP;9Y@%mC-$87HKlDHX#zM3f4PawP$)>^)&XB=U!<~? z-jHO+2M}SG?`{cBpR&!*J))!@DU{o7H&`Gw8lBn>Z8=h6zkm{E;$HGVkc8IEu&3BV zQhw-np_hl#1V4Gal_ShJ$pWS*SVZ)ZLcB{tXDb@#X$R-dQk#(9MlRS~QrK(-;Xu&i z*5JTHHUKa0bDrX>_X6GOed)Hr*#e&=xbcmc(I8V5fEQUo6wskzg^J_Z-`ycm_?`;- z6V&uKbX76XvO{4_ibFM1T8xGVsDBE<%JewgoJ3up#mj-kfe~leiC7ZrN^|RW42ME| zzG-R~?A5~gN$Kb>a1s3ALi>2;>dK7iIj7{H!dYvVLWjZE4wN@ICI(#f0<^H#lTp%m zv?7e6ICU`ntK-9E;ue~k&^3)n_4Ngt3prS}N}nNA6S7 zS8Qt_R`t%s--=L_Y8onxzlwew>9&;VSX2?z>;a}gyED}jSy?0PdGo)gfABg2P1Uw!E54yZ}sZvvpXcpq7zJ*>xF*C7>gh{--cJBEn=Fp;s-@OT+441{^*7Se^REH9z4mtjV&4qgGSRD2`X6+ z?Cnvi@Q6|zjNb-o=lb+hQi2;5njX`$f0sn3<_iP@ook&7cBDBv4ZybLKfPkC>VMsY z+LIVBog>q;QlilOB$S|u7!IHDXgQoYCHD26%vgKR=bPi<&i>=Dan13rXSA1BD!{=B zUE?%aY~EvLM5p%husVk~&CpboI_5`-n?w_uvYdKP4?0wP!$I=0 zo`ziV;YEEVVTP5L=5NfFrc_tgf=l)7?fdgN2~b!*y0)T^CJP|U6<#GW-fTgo!^|5| z;KTHfd4YShSZF6!@AUeL^+bfu_nPK*x1*~`4>eNaW;|#*PgSnxQZ~xlrbCfHX z=-#cSb9^5;%KNGV`I%hEP1lR(nfNrD=fH- zN#5g?2m=HUUFbx+{JOc#lG*|gEAbLpU5l8e5_4-gd_;AleiGPH2op=)Ug zL7ItW2imOw>KWG2Sc_WC$X%(FdY!Z)xu z-~7)ICJ`rDiGjG|?E?907d_Qz`dB!H4oyfUx^pBzxZO>lfn%^vqJ~Uggxn(A1kxuK z?iWz3IdiSZuScUaDA|)GQT5w$PX^2Uy$nDB5|>PpW|oPz&9W*;F)l|wVzLkhu`K<@ zpwf`4fF!flxy-CWUF(&9-_DQrcD!I|bY!%ZO!j2C`8GY72~sjRG0TiPuM>C?7l;%0 zzvHlY;L_%8qFPso%oXvJcoy9AE`l&9rouG=$jMZnDG*NGKqmw)HkM49Q)7i6B<{cg z(y0c-l3Ra7_X4%Yd(os8&T8iXKppX4XDVW^WkL%jig%ni2eTgp&G17mzfzv*ZaEyh6=_we26z(+f&5{z3 zlH11VR{oap>5{g%!~{>_?#iqem~k!i0AoZ{cNdUK)^W<`*E(tGmrdk}5cRVq?huPydZ)40QA2*8zi=CmX&+=mCCth>RHR z1|XU{b36UIk#kl!kjY*!Vv<@UQKpL1e#)vbR?zfb0}<(qce{98w6@20=OHAEC0;4s zx4Nh;X+EE-Wb$EB5fwJdNazi)yODFTWZLSt=INIjC)DdXN0rGeu@+t=s`h;1MosBB zMhnQv8Iugd7s5+v$FMN+VUDsW|Aj$mY)ImL)ahcY*)Sa0i`^(jUMn2R;kQMrRNPGS zR+BOM-k9?Zzf9goxr{w%UwX?z^Iz$V{ceU@sE6qRaJ|6BsFo}*e{g0~@ODIAPAq^N zZrZ{nF5MAF%`a@q{yb!)KZ zG^}KK-zz5b{4=?(L}*{Wd2?Mo?e1K974SurKpPIx-weo24%6MP`w&zJk~WH^z|+bI zH-9^X;HaUbJ08*w&=}f8NTLeIQfSMbh}368L?pkBVqXq8l;u&!U~%kqx2O9N5rW|3 z=L(|bbS~X?YAKo`D{lOq-zmVl3SEQ0)waEBjsBVwJo)!-^?ZvlJW~M_Z!v#}D@POY#j}tK3 z&s&twx>Ul!H|nuh+a%3@_Z0+bAQ=Te_I2z%CxYxffm#vw@l>Rx&R6 z!|T;+Pc`m0Gg-)T^!@sl9TNZ2P_ZZKiCsHMutEZ)-PC`TH< zCJuAGr$MmQdn1NzjSBC6?rV?N0`YE3c-(ilFkcClfICrvS~Bc-yze+)K836>syT?( zKd)sQW$yc46f<|pdHa%cfwxOA3x+O}Nt$*_ZzK~C!ZBiIG=JTo6u2bizKnT*;v|JZ zKZ+BwD?dCwC}GBDTjAAIp3&uiaVq}_7Q#XqQdre^J}v*6i7=hn?RZqOmq@x{nJA8` zDYwciG?%ArS#=?4abIlfl;Fc zP<}Vz(9U1SWb`u08kj9F+HvX^@C70;3jT=0jpXU785Q9y|M(*eDB=Htes`n=qBv;l z`Vylb6Z0iG0T{A}86dWpE%CMQkZJ^Rg*fcJX4Cs#v%%M5r)*KT^|V0cvlh*XD?E?& zpVi?_Vz=-^LJh?v{HC#F7h0V2IIY)bP$ugn1RGO@iSQ6-5WTWJt*x+k;D84d+60<#G900LkZqcJ) zd>^+Tfm`PPHEt{}KSGLD|`Q zVA0Z|kGqI0z9fov)OqanoEg0*iWtvKU?3_w$^7#~jb^cc%p8aqWdI6f1@5YzI3u81 z#Dm&*arf3#RZ-ejC7-(SZPMMH_=Y@iwUH_5oMXGE@m~raK+33tj!B1Q09ik=$p#T{ zpcRb3(w~%^^^B#?0|S8(NheCZYK8_kkGFifETBeL7O#$6MXN^nR2? zD~d#(YH(qxKlW%@bS)?ln(0Ovu2C_lBioTeum~;T&WL<-xlh)&YqGQJXr7SdiX7c3 z2JdHCy4o|cY*O=2E1DbujhQ2-EP&0td@_!_)d+-t6j3}ZShp$V^JqEeSQxFx{|@R6 z%AnddR%VueOLZ6*WteHSsmPAm_8(EJS13wCt1^=I9_;^;4ju0g1xw~j;}*jbt|_9J z5rtFKyIk3 z*=5gpO(Z}%Qp9|mk}9skbYr{y$Oxog8yt}i=TS|IZqK0Vi@Lug*(dDn==2*FO8aN*>hz4FZN$<%*frSBY+P2(v%0ju6l1ao=nf6v3!gMn@)ChbHQ&kmXD-rEZoL$5| zVT;he7%e>QlT4bi*_|%PYdJz(hX+9dG46K%6xf^!=dJXk<%50E(MK){#D{-JfEoLs z#)hwp*?G3d{@4n^-!LgVp^TLrCI5`~=HJce6P?#)#rP*|(Gs!8m`;`^IPbVSPpll? z?v^Z>pT*_boUM3wfjTvNk0dU{7pY<7=X|2V*QoYrLf#9=dDg-I_zkxkvfKM$xv7m7 zp{0%U#x89uRmxly9$}52{$*Bo>Rwx&H^NQ9joKNWx`XKE+P`-O*N3eg3=}G*x0DnD~A<)VLwZpBh9r|)c% zfF!g~2%~$`MB2I0@W&0Xv)2_{aXP4hOnJ{c@~NFjW-wMV@2VEE*ddoc&?HH#?3gHp z_Yb+}NMYJ=y!Zv>rUdj7F{3+>i=0 zcPmKssn3E$fj^2`3-Y_e#Am>QlDYv-0a7tiONzj<$b71A1}H)KhBQQ#UU=Qj|=!4{&zxZh^C4iP~$c!Xl#lTB&m!3rkQ<=vG~ zs9O9KO_MO21`z>;0$6Fq1lpq2Jt#Ya_YrKsz!3^y7*xvO$mY;0vuR2Xn@^+{(t1L6 z$G^kXOf-uLUGC)X4)9s2hI`TEm*&&wl2Tai?r`SZOB)ws!`6wllPSZUx1}1k=p(9W zbamt8qHhsZq0tw~hCh#IY|ze5%yF?0j3|^FrdgazH2ysLx=>Il(P*Qb((o4Av_UNXl8sUZTi!yv zO}V(E5H|O*G_Eiy3D>}wxgX9aN&yS}FDbz*(K;@ALk%2V*%4pKq6J;3A}gCcjKu0V z&v`?JVEe-)4;Z$*$#pVAq*2bly4O=f_r*lMx)-Q-)^|t#rQ_}O7J=dvA^%V5KrWNn zwXl1GwE$rRhi^qj@DGN~mq6O;FQY961kVLJ8el2V9u(ItIBXhsk0&mTW%3*zsnM=U zdcknOgdo}<@0O1cSQc0-ng6SJ_{mw58#Qrs2TsCH3w;n)q1`t7Zy_nAH+4CX;rpx-D4rEREo$ z5@3UgF5HF74Kl`as7aJL)8IWzCRvkDbHBu-e>7g3NaQ{I{H|04ui!$K`|@U;WY9mU zb!!r93vq;yg}|FZl2BQP5#J`VEwphFwXa5Q4RI+za^Kh9x|oU1l6Oz2Q5{#TaLj)^ zy5)K{W0}dn&GRCU{moG;*!SR`M~V{gMD1mK60XICSjl3 z%A#)5`OZ(N5{YVxUM+k-H*ejD!H@juGt>VC8SXwx0J>>(H8k&5m)WsN9x{h0_Mt>J zp!521_jGdW18f&{<)0~#W3;Md5wHq;)Gb8Fna?M0j{7J?`Vs zwN3JR_@mKc@Avu;I}#+uzq~~26&qWn?(0!RfLjdzO}A%#j|9}CKjIpaDRbp6g~4tk zAD@IBb;4W|1Z#~jrvJP(DZJWwa>PXz@U$B8ehU|kv5JShf;=sVOvR5V4EA{}&THG)sHpm}eW<(6Lw7{qEhX-BRD6X*gNx85jIeXp zkJ%6K@?xXq3FKVggcQ2MH;-$?o_*A1QWE*4uEfzyL`%R1Ab9-%SF;y*5YIoGNIa|j z4zs)Qxww(8MZtCb&7kI3%alEyX6OxsfwsR=)z;M$x$bQ8S|;PwI_wDka1ol?Q2OV7 zOpmVM*pN^RC=!`BnLq)Rh)9URk)LCe!!lh{H&&iXCt2Zjejvv6%dbn=94jsiZs>15 z4WO;#(;=xEBNzj@KxT&@=7q$&h^_Vl|5RI?u0xqENeoYfv?qsTR-vz$EfIt}KM zV+euUT@n#I;<1IDAHek&Uv&RSnrbdYOM_Lk{wc82;jIi1#cBq94LOQgx3E8Eie!W&S}4RfqB`C8+~_lJz)*lj z=5kG?mjlHNz)WWA!&C>ZDKuYan1J!u<&<4ua_a;-UNC$W|8KSLXSpK`fz#Eg%s;fi zOb2zY-#?+wuX2^E`R)5MfqpZF#1%5zS&Hp-l z?uMAgtT`z)?mkF+-_Ou=0VGDM=e+s>74Zrx)6gTOcSNC13b)zOXwIzwkr<68E0%vl)#dZkE;BgR*K0 zjyW?6{(Zu?yGVYU*1=+DYm_~K%YK;!1BPuP6(*4NNP`&Z##Zxx;*|wBkZG#rz1s|X zuJ6pBKhWIca9KQfVY=_$(b}|2o6A*STpQ6_oq}U>;GX=hgn5$EAOG>;Jgqq}f|Tf% z;?tw$`@*rT+eTW}|M3w`oKX{LXxKm@K==6sRuOKC2@s?Unaug$!r25cK&)+DTpB*aKRoSw4))2ZF2nOViWM)IyCCHD|gCz*@71;iZ9QwAN6{|{6q z>#UpwG)wHqb9KAyP7JzQ<$icaI=#|5!oJs5@rBQG{M$N0H9va&zlV~_265ww2_qHt z#Q(5rXd9Gk{ZKA6u~$7t&w*sF^1YK^IY-eTUEY>ME+D&c9lsmPe0`u*`tbh&)NDL; z;pu@7Tddj1f@f-qEq(5^fvJ-p>N+~TBtD$s^HrRlpW&6aU{3u{T0=wS^ozcfY~$t= zi^$#Q9ZkNFwg$k7G0WsmZXw@5ka5 zp5}gdgR0JfH-S?$I<%kpopdkw3t{c>znaoS5LBnNy7-ogKqk~|W;huxgJ^5b&{Rr$ z$##cO|E0njpw*I^nyH6P@s+ti=QQAyE^Mh%xCB6-KwhJi8(ubtz;as`FS#(}-!766 z3Wc*HXQh}!(M@ttf?-eJ3!es9+S}ei)>PBfRMs2_%IEFhz;w67nyU4FcgJ!Kk~8Qz zoX=yWAk2>q+2Ikz#sGT+{^c2YDQQBA=2CMZc);1<~bb)JdasQSvA|pME&46c{a0$xdt>_aUo6DT8z&{-*K7YG7CNuv@`^|$DQFxrC{j)m)ABZU|*r3 z(y5un9o!GU$j^v)zPs|yf8d^#9DF7rN?|pnpxy`Pn9zi063p%$db4Xr;2b}RGI9Wt zSD8sZayBp&*k@$<&b~3f9f-EUpc)RUW`2N1+s0TpKFz}QL;>I$QwJj0D`k2^ZIHex?juReDvh|N6!$NzwbP0Y9C&a0 z=L{Xo-&U60?XqKRaZ`uosU~?Rp{rU(KjqyEa{K2&zYK5(vGyEXT$47P_59S{9lxL% z_(&Bov_9~>fd80VW&cmf(e|=(_lJ4LMhf|k=6BV1S|Uevq$aa8g%VomA(sUn{!g=q z_|`HckrP~BE3{%NqGkgeDUp=rp*)~yvS2U|2yHI7Od%64b##=RX*nVQCvnWve{7DM z&upDw?A;H?qp~J(f;JL>a6AZe6;SfDTjAVnLhDqXJg(`FzZgS4S++DMRWI4hZDkp1 z7BnTl(<4WWXACjynVvVs(C#{~{JcplN|{)&JTpfMfPsM&Zw}-5t0jKBTe26wGIw=x zs_7Xfk>B$czSP~)?nqst2YUX>?4YEeUwp}Q^@*tK_zRM2W-GZGcoJ*6JOsA1);5cF zm@S(0b~kSA!%*aT;&ajcUneYd9ej<9*{HqEDW8LCG*7Jw$(|v{q?q*Ib(V9|yw3c* z`*vNI!i0?0)j#= z266EfEc(d>Nb#~xTP0NgKjWGnY+#)SQf-t_(+BR>87hlaT@!nuFeWa(@6&@hE$i`3 z1rN1@?o1)iZ*!6Q2T3M|XoI(XkU_yIHvsD>nik*i5okdSULOeh_;8#a7;Uj&ALC8z zq@7)azTm>f>1)rNZ7$Bv4weh;Ya?F47+piII`}3G;-_{Kq!S^s%~0?Vkl=n9{J^&s z&8yLW94dds14UkcTdZzwUTzky>H>82jq(7y`r_yId;ifx1;ySn)aEpvBhG>ZBrqoY z#nX@IPLJ$qN%#qWO!UQ?oUw)AFA(O7_sWy1>jiJpC7Mu+VGlGwQ-`ctr(LlPr&D_S zrq&HuM&k`-%02txq;$-=ZVncb6KGS!S{k=I^N05QyH{XOkDNK=K7diDtZT>O84lT` z@h1C5YhA{Tzf=d22>(HGZX#`C&7=t{=bDzs#Ew9CWR-sK{82uU z6`*=aF}rn=jh-&Mg&(gKB*3mME~%6X)tpx*!i)h`msHmc%PPq*a z%y)ot2>c#qmOg%%b)Ch21Ol4N2=x}{pu%b2_TZa;DbSCq&wAl5ec{rc*JooN<`hdr v$}EA&ki%jjnW6 Date: Fri, 30 Jan 2009 17:27:31 -0500 Subject: [PATCH 06/11] Straighten out Cards01.png thing. (see typo) --- pyfpdb/Cards0.png | Bin 14488 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 pyfpdb/Cards0.png diff --git a/pyfpdb/Cards0.png b/pyfpdb/Cards0.png deleted file mode 100644 index e1a8cd4be93b0d2f3b4d3007ac6605930af54e84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14488 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 v$}EA&ki%jjnW6 Date: Fri, 30 Jan 2009 17:43:58 -0500 Subject: [PATCH 07/11] Updated some doc files, this dir needs some real work. --- docs/known-bugs-and-planned-features.txt | 4 ++++ docs/readme-dev.txt | 4 ++++ docs/readme-overview.txt | 5 +++++ docs/readme-user.txt | 4 ++++ docs/status.txt | 4 ++++ 5 files changed, 21 insertions(+) diff --git a/docs/known-bugs-and-planned-features.txt b/docs/known-bugs-and-planned-features.txt index a8a3f988..aed9eb6c 100644 --- a/docs/known-bugs-and-planned-features.txt +++ b/docs/known-bugs-and-planned-features.txt @@ -1,3 +1,7 @@ +This file is badly out of date, but I'm going to leave it here for now. :) +More up-to-date information is on the wiki: http://fpdb.wiki.sourceforge.net/ +REB 30-Jan-2009 + Everything is subject to change and the order does not indicate priority. Patches for any of these or other features are very welcome, see readme-overview.txt for contacts. Please also see db-todo.txt diff --git a/docs/readme-dev.txt b/docs/readme-dev.txt index c8b5cd3f..9bfb4ac3 100644 --- a/docs/readme-dev.txt +++ b/docs/readme-dev.txt @@ -1,3 +1,7 @@ +This file is badly out of date, but I'm going to leave it here for now. :) +More up-to-date information is on the wiki: http://fpdb.wiki.sourceforge.net/ +REB 30-Jan-2009 + Hi, This document is to serve as a little overview (later: full technical doc) for current and prospective developers with: a) introduction into the code structure diff --git a/docs/readme-overview.txt b/docs/readme-overview.txt index 825a61de..3c26769f 100644 --- a/docs/readme-overview.txt +++ b/docs/readme-overview.txt @@ -1,3 +1,8 @@ +This file is badly out of date, but I'm going to leave it here for now. :) +More up-to-date information is on the wiki: http://fpdb.wiki.sourceforge.net/ +REB 30-Jan-2009 + + Summary ======= A database program to track your online poker games, the behaviour of the other players and your winnings/losses. Supports Holdem, Omaha, Stud and Razz for cash games as well as SnG and MTT tournaments with more possibly coming in the future. Some of this is not yet working though, please see status.txt and known-bugs-and-planned-features.txt diff --git a/docs/readme-user.txt b/docs/readme-user.txt index 6d3d1f76..8a186667 100644 --- a/docs/readme-user.txt +++ b/docs/readme-user.txt @@ -1,3 +1,7 @@ +This file is badly out of date, but I'm going to leave it here for now. :) +More up-to-date information is on the wiki: http://fpdb.wiki.sourceforge.net/ +REB 30-Jan-2009 + Before you do this make sure you setup the dependencies, the database, user, tables and config file. Running it diff --git a/docs/status.txt b/docs/status.txt index 3ab5fbf8..80f85039 100644 --- a/docs/status.txt +++ b/docs/status.txt @@ -1,3 +1,7 @@ +This file is badly out of date, but I'm going to leave it here for now. :) +More up-to-date information is on the wiki: http://fpdb.wiki.sourceforge.net/ +REB 30-Jan-2009 + For all support please note that the tables WILL be changed, almost certainly without keeping backwards compatibility. Therefore you should keep your history files after import so you can re-import when necessary. Should you lose history files and need a "database updater" let me know. If support for another site/game would encourage you to help with this software please let me know at steffen@sycamoretest.info. From b91ea888e1b95ef8376bdbd17e5dfc964e7a5b7a Mon Sep 17 00:00:00 2001 From: Ray Date: Fri, 30 Jan 2009 21:38:47 -0500 Subject: [PATCH 08/11] Don't commit automatically in prepare-git.sh. --- prepare-git.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prepare-git.sh b/prepare-git.sh index 91b008e9..0999e26d 100755 --- a/prepare-git.sh +++ b/prepare-git.sh @@ -19,4 +19,4 @@ rm regression-test/*.found.txt rm regression-test/*.pyc rm pyfpdb/*.pyc -git-add--interactive +#git-add--interactive From 12bc4dc817bd186d6fca48173ee8c4df31fdb37b Mon Sep 17 00:00:00 2001 From: Ray Date: Fri, 30 Jan 2009 22:02:47 -0500 Subject: [PATCH 09/11] Move the shell scripts to utils and get rid of the empty readme. --- prepare-git.sh | 22 -------------------- readme.txt | 0 create-release.sh => utils/create-release.sh | 12 +++++------ 3 files changed, 6 insertions(+), 28 deletions(-) delete mode 100755 prepare-git.sh delete mode 100644 readme.txt rename create-release.sh => utils/create-release.sh (83%) diff --git a/prepare-git.sh b/prepare-git.sh deleted file mode 100755 index 0999e26d..00000000 --- a/prepare-git.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/sh - -#Copyright 2008 Steffen Jobbagy-Felso -#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 in the docs folder of the package. - -rm regression-test/*.found.txt -rm regression-test/*.pyc -rm pyfpdb/*.pyc - -#git-add--interactive diff --git a/readme.txt b/readme.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/create-release.sh b/utils/create-release.sh similarity index 83% rename from create-release.sh rename to utils/create-release.sh index 9f28a7ac..556ebf28 100755 --- a/create-release.sh +++ b/utils/create-release.sh @@ -23,15 +23,15 @@ mkdir fpdb-$1 cp -R docs fpdb-$1/ cp -R packaging fpdb-$1/ cp -R pyfpdb fpdb-$1/ -rm fpdb-$1/pyfpdb/HUD_config.* +#rm fpdb-$1/pyfpdb/HUD_config.* cp pyfpdb/HUD_config.xml.example fpdb-$1/pyfpdb/HUD_config.xml cp -R regression-test fpdb-$1/ cp -R utils fpdb-$1/ cd fpdb-$1 -zip -r releases/fpdb-1.0_$1.zip * -tar -cf - * | bzip2 >> releases/fpdb-1.0_$1.tar.bz2 -cd .. -rm -r fpdb-$1 +zip * releases/fpdb_$1 * +#tar -cf - * | bzip2 >> releases/fpdb_$1.tar.bz2 +#cd .. +#rm -r fpdb-$1 -echo "Please ensure the files are named fpdb-1.0_alpha*_p*.*" +#echo "Please ensure the files are named fpdb-1.0_alpha*_p*.*" From 61259b61293d38b0875036010ca5a4a79e7a00ec Mon Sep 17 00:00:00 2001 From: Ray Date: Fri, 30 Jan 2009 22:57:34 -0500 Subject: [PATCH 10/11] Simplified and works. --- utils/create-release.sh | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/utils/create-release.sh b/utils/create-release.sh index 556ebf28..b8ed0cea 100755 --- a/utils/create-release.sh +++ b/utils/create-release.sh @@ -15,23 +15,23 @@ #In the "official" distribution you can find the license in #agpl-3.0.txt in the docs folder of the package. +#get rid of extraneous stuff rm regression-test/*.found.txt rm regression-test/*.pyc rm pyfpdb/*.pyc -mkdir fpdb-$1 -cp -R docs fpdb-$1/ -cp -R packaging fpdb-$1/ -cp -R pyfpdb fpdb-$1/ -#rm fpdb-$1/pyfpdb/HUD_config.* -cp pyfpdb/HUD_config.xml.example fpdb-$1/pyfpdb/HUD_config.xml -cp -R regression-test fpdb-$1/ -cp -R utils fpdb-$1/ +# make the fpdb_$1.zip file for windows +echo "*** making zip file" +zip -r ../fpdb_$1.zip docs +zip -r ../fpdb_$1.zip ignore-me_perl6 +zip -r ../fpdb_$1.zip packaging +zip -r ../fpdb_$1.zip pyfpdb +zip -r ../fpdb_$1.zip regression-test +zip -r ../fpdb_$1.zip utils +zip -r ../fpdb_$1.zip website + +# now make the fpdb_$1.tar.bz2 file for linux +echo "*** making tar.bz2 file" +tar --recursion -cjf ../fpdb_$1.tar.bz2 * -cd fpdb-$1 -zip * releases/fpdb_$1 * -#tar -cf - * | bzip2 >> releases/fpdb_$1.tar.bz2 -#cd .. -#rm -r fpdb-$1 -#echo "Please ensure the files are named fpdb-1.0_alpha*_p*.*" From 18140defd8bbacfb8dce88a8e1774237c0c8a9f3 Mon Sep 17 00:00:00 2001 From: Ray Date: Sat, 7 Feb 2009 10:06:48 -0500 Subject: [PATCH 11/11] Update bulk import, optionally drop indexes, improve gui --- pyfpdb/GuiBulkImport.py | 340 +++++++++++++++++++++++----------------- pyfpdb/fpdb_import.py | 63 ++++++-- 2 files changed, 244 insertions(+), 159 deletions(-) diff --git a/pyfpdb/GuiBulkImport.py b/pyfpdb/GuiBulkImport.py index 250bd313..6f06f232 100644 --- a/pyfpdb/GuiBulkImport.py +++ b/pyfpdb/GuiBulkImport.py @@ -1,156 +1,212 @@ #!/usr/bin/python +# -*- coding: utf-8 -*- -#Copyright 2008 Steffen Jobbagy-Felso -#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. +# Copyright 2008 Steffen Jobbagy-Felso +# 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. +# 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 in the docs folder of the package. +# 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 in the docs folder of the package. -import threading -import fpdb_simple -import fpdb_import +# Standard Library modules +import os +from time import time + +# pyGTK modules import pygtk pygtk.require('2.0') import gtk -import os #todo: remove this once import_dir is in fpdb_import -from time import time -class GuiBulkImport (threading.Thread): - def import_dir(self): - """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) - starttime = time() - (stored, dups, partial, errs, ttime) = self.importer.runImport() - print "GuiBulkImport.import_dir done: Stored: %d Dupllicates: %d Partial: %d Errors: %d in %s seconds - %d/sec" %(stored, dups, partial, errs, ttime, (stored/ttime)) - - def load_clicked(self, widget, data=None): - self.inputFile=self.chooser.get_filename() - - self.handCount=self.hand_count_tbuffer.get_text(self.hand_count_tbuffer.get_start_iter(), self.hand_count_tbuffer.get_end_iter()) - if (self.handCount=="unlimited" or self.handCount=="Unlimited"): - self.importer.setHandCount(0) - else: - self.importer.setHandCount(int(self.handCount)) +# fpdb/FreePokerTools modules +import fpdb_simple +import fpdb_import +import fpdb_db +import Configuration - self.errorFile="failed.txt" - - self.minPrint=self.min_print_tbuffer.get_text(self.min_print_tbuffer.get_start_iter(), self.min_print_tbuffer.get_end_iter()) - if (self.minPrint=="never" or self.minPrint=="Never"): - self.importer.setMinPrint(0) - else: - self.importer.setMinPrint=int(self.minPrint) - - self.quiet=self.info_tbuffer.get_text(self.info_tbuffer.get_start_iter(), self.info_tbuffer.get_end_iter()) - if (self.quiet=="yes"): - self.importer.setQuiet(False) - else: - self.importer.setQuiet(True) - - self.failOnError=self.fail_error_tbuffer.get_text(self.fail_error_tbuffer.get_start_iter(), self.fail_error_tbuffer.get_end_iter()) - if (self.failOnError=="no"): - self.importer.setFailOnError(False) - else: - self.importer.setFailOnError(True) - - if os.path.isdir(self.inputFile): - self.import_dir() - else: - self.importer.addImportFile(self.inputFile) - self.importer.setCallHud(False) - self.importer.runImport() - self.importer.clearFileList() - - def get_vbox(self): - """returns the vbox of this thread""" - return self.vbox - #end def get_vbox - - def run (self): - print "todo: implement bulk import thread" - #end def run - - def __init__(self, db, settings, config): - self.db=db - self.settings=settings - self.config=config - self.importer = fpdb_import.Importer(self,self.settings, config) - - self.vbox=gtk.VBox(False,1) - self.vbox.show() - - self.chooser = gtk.FileChooserWidget() - self.chooser.set_filename(self.settings['bulkImport-defaultPath']) - #chooser.set_default_response(gtk.RESPONSE_OK) - #self.filesel.ok_button.connect_object("clicked", gtk.Widget.destroy, self.filesel) - self.vbox.add(self.chooser) - self.chooser.show() - - - self.settings_hbox = gtk.HBox(False, 0) - self.vbox.pack_end(self.settings_hbox, False, True, 0) - self.settings_hbox.show() - - self.hand_count_label = gtk.Label("Hands to import per file") - self.settings_hbox.add(self.hand_count_label) - self.hand_count_label.show() - - self.hand_count_tbuffer=gtk.TextBuffer() - self.hand_count_tbuffer.set_text("unlimited") - self.hand_count_tview=gtk.TextView(self.hand_count_tbuffer) - self.settings_hbox.add(self.hand_count_tview) - self.hand_count_tview.show() - - self.min_hands_label = gtk.Label("Status every") - self.settings_hbox.add(self.min_hands_label) - self.min_hands_label.show() - - self.min_print_tbuffer=gtk.TextBuffer() - self.min_print_tbuffer.set_text("never") - self.min_print_tview=gtk.TextView(self.min_print_tbuffer) - self.settings_hbox.add(self.min_print_tview) - self.min_print_tview.show() +class GuiBulkImport(): - - self.toggles_hbox = gtk.HBox(False, 0) - self.vbox.pack_end(self.toggles_hbox, False, True, 0) - self.toggles_hbox.show() + def import_dir(self): + """imports a directory, non-recursive. todo: move this to fpdb_import so CLI can use it""" - self.info_label = gtk.Label("Print start/end info:") - self.toggles_hbox.add(self.info_label) - self.info_label.show() - - self.info_tbuffer=gtk.TextBuffer() - self.info_tbuffer.set_text("yes") - self.info_tview=gtk.TextView(self.info_tbuffer) - self.toggles_hbox.add(self.info_tview) - self.info_tview.show() - - self.fail_error_label = gtk.Label("Fail on error:") - self.toggles_hbox.add(self.fail_error_label) - self.fail_error_label.show() - - self.fail_error_tbuffer=gtk.TextBuffer() - self.fail_error_tbuffer.set_text("no") - self.fail_error_tview=gtk.TextView(self.fail_error_tbuffer) - self.toggles_hbox.add(self.fail_error_tview) - self.fail_error_tview.show() + self.path = self.inputFile + self.importer.addImportDirectory(self.path) + self.importer.setCallHud(False) + starttime = time() + (stored, dups, partial, errs, ttime) = self.importer.runImport() + print 'GuiBulkImport.import_dir done: Stored: %d Duplicates: %d Partial: %d Errors: %d in %s seconds - %d/sec'\ + % (stored, dups, partial, errs, ttime, stored / ttime) - self.load_button = gtk.Button("Import") #todo: rename variables to import too - self.load_button.connect("clicked", self.load_clicked, "Import clicked") - self.toggles_hbox.add(self.load_button) - self.load_button.show() + def load_clicked(self, widget, data=None): +# get the dir to import from the chooser + self.inputFile = self.chooser.get_filename() - threading.Thread.__init__ ( self ) - print "initialised new bulk import thread (not actually a thread yet)" -#end class import_threaded +# get the import settings from the gui and save in the importer + self.importer.setHandCount(int(self.spin_hands.get_text())) + self.importer.setMinPrint(int(self.spin_hands.get_text())) + self.importer.setQuiet(self.chk_st_st.get_active()) + self.importer.setFailOnError(self.chk_fail.get_active()) + self.importer.setThreads(int(self.spin_threads.get_text())) + self.importer.setHandsInDB(self.n_hands_in_db) + cb_model = self.cb.get_model() + cb_index = self.cb.get_active() + if cb_index: + self.importer.setDropIndexes(cb_model[cb_index][0]) + else: + self.importer.setDropIndexes("auto") + + self.lab_info.set_text("Importing") + if os.path.isdir(self.inputFile): + self.import_dir() + else: + self.importer.addImportFile(self.inputFile) + self.importer.setCallHud(False) + self.importer.runImport() + self.importer.clearFileList() + + self.lab_info.set_text("Import finished") + + def __init__(self, db, settings, config): + self.db = db # this is an instance of fpdb_db + self.settings = settings + self.config = config + self.importer = fpdb_import.Importer(self, self.settings, + config) + + self.vbox = gtk.VBox(False, 0) + self.vbox.show() + + self.chooser = gtk.FileChooserWidget() + self.chooser.set_filename(self.settings['bulkImport-defaultPath']) + self.vbox.add(self.chooser) + self.chooser.show() + +# Table widget to hold the settings + self.table = gtk.Table(rows = 3, columns = 5, homogeneous = False) + self.vbox.add(self.table) + self.table.show() + +# checkbox - print start/stop? + self.chk_st_st = gtk.CheckButton('Print Start/Stop Info') + self.table.attach(self.chk_st_st, 0, 1, 0, 1, xpadding = 10, ypadding = 0, yoptions=gtk.SHRINK) + self.chk_st_st.show() + self.chk_st_st.set_active(True) + +# label - status + self.lab_status = gtk.Label("Hands/status print:") + self.table.attach(self.lab_status, 1, 2, 0, 1, xpadding = 0, ypadding = 0, yoptions=gtk.SHRINK) + self.lab_status.show() + self.lab_status.set_justify(gtk.JUSTIFY_RIGHT) + +# spin button - status + status_adj = gtk.Adjustment(value=100, lower=0, upper=300, step_incr=10, page_incr=1, page_size=0) #not sure what upper value should be! + self.spin_status = gtk.SpinButton(adjustment=status_adj, climb_rate=0.0, digits=0) + self.table.attach(self.spin_status, 2, 3, 0, 1, xpadding = 10, ypadding = 0, yoptions=gtk.SHRINK) + self.spin_status.show() + +# label - threads + self.lab_threads = gtk.Label("Number of threads:") + self.table.attach(self.lab_threads, 3, 4, 0, 1, xpadding = 0, ypadding = 0, yoptions=gtk.SHRINK) + self.lab_threads.show() + self.lab_threads.set_sensitive(False) + self.lab_threads.set_justify(gtk.JUSTIFY_RIGHT) + +# spin button - threads + threads_adj = gtk.Adjustment(value=0, lower=0, upper=10, step_incr=1, page_incr=1, page_size=0) #not sure what upper value should be! + self.spin_threads = gtk.SpinButton(adjustment=threads_adj, climb_rate=0.0, digits=0) + self.table.attach(self.spin_threads, 4, 5, 0, 1, xpadding = 0, ypadding = 0, yoptions=gtk.SHRINK) + self.spin_threads.show() + self.spin_threads.set_sensitive(False) + +# checkbox - fail on error? + self.chk_fail = gtk.CheckButton('Fail on error') + self.table.attach(self.chk_fail, 0, 1, 1, 2, xpadding = 10, ypadding = 0, yoptions=gtk.SHRINK) + self.chk_fail.show() + +# label - hands + self.lab_hands = gtk.Label("Hands/file:") + self.table.attach(self.lab_hands, 1, 2, 1, 2, xpadding = 0, ypadding = 0, yoptions=gtk.SHRINK) + self.lab_hands.show() + self.lab_hands.set_justify(gtk.JUSTIFY_RIGHT) + +# spin button - hands to import + hands_adj = gtk.Adjustment(value=0, lower=0, upper=10, step_incr=1, page_incr=1, page_size=0) #not sure what upper value should be! + self.spin_hands = gtk.SpinButton(adjustment=hands_adj, climb_rate=0.0, digits=0) + self.table.attach(self.spin_hands, 2, 3, 1, 2, xpadding = 10, ypadding = 0, yoptions=gtk.SHRINK) + self.spin_hands.show() + +# label - drop indexes + self.lab_drop = gtk.Label("Drop indexes:") + self.table.attach(self.lab_drop, 3, 4, 1, 2, xpadding = 0, ypadding = 0, yoptions=gtk.SHRINK) + self.lab_drop.show() + self.lab_drop.set_justify(gtk.JUSTIFY_RIGHT) + +# ComboBox - drop indexes + self.cb = gtk.combo_box_new_text() + self.cb.append_text('auto') + self.cb.append_text("don't drop") + self.cb.append_text('drop') + self.cb.set_active(0) + self.table.attach(self.cb, 4, 5, 1, 2, xpadding = 10, ypadding = 0, yoptions=gtk.SHRINK) + self.cb.show() + +# label - info + self.lab_info = gtk.Label() + self.table.attach(self.lab_info, 0, 4, 2, 3, xpadding = 0, ypadding = 0, yoptions=gtk.SHRINK) + self.lab_info.show() + +# button - Import + self.load_button = gtk.Button('Import') # todo: rename variables to import too + self.load_button.connect('clicked', self.load_clicked, + 'Import clicked') + self.table.attach(self.load_button, 4, 5, 2, 3, xpadding = 0, ypadding = 0, yoptions=gtk.SHRINK) + self.load_button.show() + +# see how many hands are in the db and adjust accordingly + db_parms = config.get_db_parameters('fpdb') + db.connect(db_parms['db-backend'], + db_parms['db-host'], + db_parms['db-databaseName'], + db_parms['db-user'], + db_parms['db-password']) + cursor = db.db.cursor() + cursor.execute("Select max(id) from Hands;") + row = cursor.fetchone() + db.disconnect() # that's all we need this for + self.n_hands_in_db = row[0] + if self.n_hands_in_db == 0: + self.cb.set_active(2) + self.cb.set_sensitive(False) + self.lab_drop.set_sensitive(False) + +if __name__ == '__main__': + + + def destroy(*args): # call back for terminating the main eventloop + gtk.main_quit() + + config = Configuration.Config() + db = fpdb_db.fpdb_db() + + settings = {} + if os.name == 'nt': settings['os'] = 'windows' + else: settings['os'] = 'linuxmac' + + settings.update(config.get_db_parameters('fpdb')) + settings.update(config.get_tv_parameters()) + settings.update(config.get_import_parameters()) + settings.update(config.get_default_paths()) + + i = GuiBulkImport(db, settings, config) + main_window = gtk.Window() + main_window.connect('destroy', destroy) + main_window.add(i.vbox) + main_window.show() + gtk.main() diff --git a/pyfpdb/fpdb_import.py b/pyfpdb/fpdb_import.py index aa68c94f..220abe3c 100644 --- a/pyfpdb/fpdb_import.py +++ b/pyfpdb/fpdb_import.py @@ -17,8 +17,24 @@ #see status.txt for site/games support info -import sys +# Standard Library modules +import os # todo: remove this once import_dir is in fpdb_import +import sys +from time import time +import traceback +import math +import datetime +import re + +# fpdb/FreePokerTools modules + +import fpdb_simple +import fpdb_db +import fpdb_parse_logic +import Configuration + +# database interface modules try: import MySQLdb mysqlLibFound=True @@ -31,16 +47,6 @@ try: except: pass -import traceback -import math -import os -import datetime -import re -import fpdb_db -import fpdb_simple -import fpdb_parse_logic -from time import time - class Importer: def __init__(self, caller, settings, config): @@ -60,10 +66,8 @@ class Importer: #Set defaults self.callHud = self.config.get_import_parameters().get("callFpdbHud") if 'minPrint' not in self.settings: - #TODO: Is this value in the xml file? self.settings['minPrint'] = 30 if 'handCount' not in self.settings: - #TODO: Is this value in the xml file? self.settings['handCount'] = 0 self.fdb = fpdb_db.fpdb_db() # sets self.fdb.db self.fdb.cursor and self.fdb.sql self.fdb.do_connect(self.config) @@ -84,6 +88,15 @@ class Importer: def setFailOnError(self, value): self.settings['failOnError'] = value + def setHandsInDB(self, value): + self.settings['handsInDB'] = value + + def setThreads(self, value): + self.settings['threads'] = value + + def setDropIndexes(self, value): + self.settings['dropIndexes'] = value + # def setWatchTime(self): # self.updated = time() @@ -92,7 +105,7 @@ class Importer: #Add an individual file to filelist def addImportFile(self, filename, site = "default", filter = "passthrough"): - #TODO: test it is a valid file + #TODO: test it is a valid file -> put that in config!! self.filelist[filename] = [site] + [filter] #Add a directory of files to filelist @@ -110,14 +123,20 @@ class Importer: else: print "Warning: Attempted to add non-directory: '" + str(dir) + "' as an import directory" - #Run full import on filelist def runImport(self): - fpdb_simple.prepareBulkImport(self.fdb) + """"Run full import on self.filelist.""" + start = datetime.datetime.now() + print "started at", start, "--", len(self.filelist), "files to import.", self.settings['dropIndexes'] + if self.settings['dropIndexes'] == 'auto': + self.settings['dropIndexes'] = self.calculate_auto() + if self.settings['dropIndexes'] == 'drop': + fpdb_simple.prepareBulkImport(self.fdb) totstored = 0 totdups = 0 totpartial = 0 toterrors = 0 tottime = 0 +# if threads <= 1: do this bit for file in self.filelist: (stored, duplicates, partial, errors, ttime) = self.import_file_dict(file, self.filelist[file][0], self.filelist[file][1]) totstored += stored @@ -125,9 +144,19 @@ class Importer: totpartial += partial toterrors += errors tottime += ttime - fpdb_simple.afterBulkImport(self.fdb) + if self.settings['dropIndexes'] == 'drop': + fpdb_simple.afterBulkImport(self.fdb) fpdb_simple.analyzeDB(self.fdb) return (totstored, totdups, totpartial, toterrors, tottime) +# else: import threaded + + def calculate_auto(self): + """An heuristic to determine a reasonable value of drop/don't drop""" + if len(self.filelist) == 1: return "don't drop" + if self.settings['handsInDB'] < 5000: return "drop" + if len(self.filelist) < 50: return "don't drop" + if self.settings['handsInDB'] > 50000: return "don't drop" + return "drop" #Run import on updated files, then store latest update time. def runUpdated(self):