<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4508963591103760027</id><updated>2011-11-28T06:42:30.598+07:00</updated><category term='install'/><category term='linux'/><category term='table'/><category term='virtualbox'/><category term='mysql'/><category term='python'/><category term='identity'/><category term='programming'/><category term='dekstop'/><category term='left join'/><category term='mount'/><category term='wxpython'/><category term='ubuntu'/><category term='partisi'/><category term='not in'/><category term='error'/><category term='file system'/><category term='outer join'/><category term='query'/><category term='mssql'/><category term='database'/><category term='oracle'/><title type='text'>just a blog ... just a note ...</title><subtitle type='html'>little inspirations</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://yadhi.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4508963591103760027/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://yadhi.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>yadhi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>9</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4508963591103760027.post-6002824397540896079</id><published>2009-04-02T12:27:00.001+07:00</published><updated>2009-04-02T12:30:10.612+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mssql'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>Attach database</title><content type='html'>In MsSQL, a database can attach with system stored procedure sp_attach_db. The simplest way to execute this stored procedure is with this syntax&lt;br /&gt;&lt;br /&gt;EXEC sp_attach_db ‘databaseName’, ‘path/to/database/file’&lt;br /&gt;&lt;br /&gt;Or if you want to attach more than 1 file use this syntax&lt;br /&gt;&lt;br /&gt;EXEC sp_attach_db ‘databaseName’, ‘path/to/database/file/1’ [,‘path/to/database/file/2’] [,‘path/to/database/file/3’]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;You can attach database file up to 16 files. The ‘path/to/database/file’ should no more than 260 characters long.&lt;br /&gt;&lt;br /&gt;This stored procedure is a shortcut for creating a database with syntax&lt;br /&gt;&lt;br /&gt;CREATE DATABASE databaseName ON (FILENAME = ‘/path/to/database/file/1’ [,FILENAME = ‘/path/to/database/file/2’] [FILENAME = ‘/path/to/database/file/3’] […FILENAME = ‘/path/to/database/file/16’]) FOR ATTACH&lt;br /&gt;&lt;br /&gt;FOR ATTACH  required all data files, and if multiple log files exists, they must be attach to&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4508963591103760027-6002824397540896079?l=yadhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yadhi.blogspot.com/feeds/6002824397540896079/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4508963591103760027&amp;postID=6002824397540896079' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4508963591103760027/posts/default/6002824397540896079'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4508963591103760027/posts/default/6002824397540896079'/><link rel='alternate' type='text/html' href='http://yadhi.blogspot.com/2009/04/attach-database.html' title='Attach database'/><author><name>yadhi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4508963591103760027.post-2835767475241517098</id><published>2008-09-16T14:51:00.000+07:00</published><updated>2008-09-16T14:54:41.620+07:00</updated><title type='text'>pake clob, bukan varchar2(4000)</title><content type='html'>aargrgrhhh ....&lt;br&gt;ketemu lagi kolom yg seharusnya pake clob tapi di definisikan pake&lt;br&gt;varchar2(4000), ya gak bakalan cukuplah panjang data yg mau di inputkan.&lt;p&gt;ganti!&lt;p&gt;ALTER TABLE TABLENAME MODIFY COLUMNNAME CLOB&lt;p&gt;ALTER TABLE TABLENAME ALTER COLUMN COLUMNNAME&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4508963591103760027-2835767475241517098?l=yadhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yadhi.blogspot.com/feeds/2835767475241517098/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4508963591103760027&amp;postID=2835767475241517098' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4508963591103760027/posts/default/2835767475241517098'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4508963591103760027/posts/default/2835767475241517098'/><link rel='alternate' type='text/html' href='http://yadhi.blogspot.com/2008/09/pake-clob-bukan-varchar24000.html' title='pake clob, bukan varchar2(4000)'/><author><name>yadhi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4508963591103760027.post-2948980014340915962</id><published>2008-09-16T14:35:00.000+07:00</published><updated>2008-09-16T14:39:52.808+07:00</updated><title type='text'>butuh create function di oracle &amp; mssql</title><content type='html'>huaaahh ... &lt;br&gt;ternyata ada yg harus di rombak di query programku, gak bisa ditulis&lt;br&gt;pake coldfusion. jadinya sekarang harus nyari cara buat create function,&lt;br&gt;kalo gak, gak bakalan bisa sama jumlah yg ditampilkan.&lt;p&gt;hm ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4508963591103760027-2948980014340915962?l=yadhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yadhi.blogspot.com/feeds/2948980014340915962/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4508963591103760027&amp;postID=2948980014340915962' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4508963591103760027/posts/default/2948980014340915962'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4508963591103760027/posts/default/2948980014340915962'/><link rel='alternate' type='text/html' href='http://yadhi.blogspot.com/2008/09/butuh-create-function-di-oracle-mssql.html' title='butuh create function di oracle &amp; mssql'/><author><name>yadhi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4508963591103760027.post-3941564208754793634</id><published>2008-09-05T09:08:00.005+07:00</published><updated>2008-09-05T12:54:20.043+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='install'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='virtualbox'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='dekstop'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>install ubuntu 804 alternate di ubuntu 710</title><content type='html'>setelah beberapa hari mendownload iso ubuntu dari server kambing,&lt;a href="http://kambing.ui.edu/pub/ubuntu/ubuntu/8.04/ubuntu-8.04-alternate-i386.iso"&gt;http://kambing.ui.edu/pub/ubuntu/ubuntu/8.04/ubuntu-8.04-alternate-i386.iso&lt;/a&gt;&lt;br /&gt;ukutan filenya 73096396 byte.&lt;br /&gt;&lt;br /&gt;installnya pake innotek VirtualBox lanjutan dari penasaran gak bisa install versi servernya, sekilas udah jalan OK, tp masih mungkin masih perlu tambahan modul2 lain untuk bisa sesuai keinginan.&lt;br /&gt;&lt;br /&gt;tujuan pertama installnya sih gara2 penasaran pengen install Oracle di&lt;br /&gt;ubuntu, mungkin dicoba minggu depan, senin atau selasa. install Oracle biar bisa belajar sendiri gak tergantung dari server yg disediakan kantor, berarti installnya Oracle XE.&lt;br /&gt;&lt;br /&gt;lebih baik install sendiri trus ya bisa sesuka hati mo diapain, gak akan ada yg ngomel kalo server gagal berjalan normal :p&lt;br /&gt;&lt;br /&gt;Loading, Login, Desktop&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_SqLzh3Y9JXk/SMDIF7bbAhI/AAAAAAAAACA/wyXrCJyiRiQ/s1600-h/Screenshot-ubuntu804+%28Snapshot+1%29+%5BRunning%5D+-+innotek+VirtualBox.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://1.bp.blogspot.com/_SqLzh3Y9JXk/SMDIF7bbAhI/AAAAAAAAACA/wyXrCJyiRiQ/s400/Screenshot-ubuntu804+%28Snapshot+1%29+%5BRunning%5D+-+innotek+VirtualBox.png" alt="" id="BLOGGER_PHOTO_ID_5242409970436866578" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_SqLzh3Y9JXk/SMDIGIHP9UI/AAAAAAAAACI/zv-3nmHimWQ/s1600-h/Screenshot-ubuntu804+%28Snapshot+1%29+%5BRunning%5D+-+innotek+VirtualBox-1.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://2.bp.blogspot.com/_SqLzh3Y9JXk/SMDIGIHP9UI/AAAAAAAAACI/zv-3nmHimWQ/s400/Screenshot-ubuntu804+%28Snapshot+1%29+%5BRunning%5D+-+innotek+VirtualBox-1.png" alt="" id="BLOGGER_PHOTO_ID_5242409973841917250" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_SqLzh3Y9JXk/SMDIGIdF-WI/AAAAAAAAACQ/WnL4iaUtax0/s1600-h/Screenshot-ubuntu804+%28Snapshot+1%29+%5BRunning%5D+-+innotek+VirtualBox-2.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://4.bp.blogspot.com/_SqLzh3Y9JXk/SMDIGIdF-WI/AAAAAAAAACQ/WnL4iaUtax0/s400/Screenshot-ubuntu804+%28Snapshot+1%29+%5BRunning%5D+-+innotek+VirtualBox-2.png" alt="" id="BLOGGER_PHOTO_ID_5242409973933537634" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4508963591103760027-3941564208754793634?l=yadhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yadhi.blogspot.com/feeds/3941564208754793634/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4508963591103760027&amp;postID=3941564208754793634' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4508963591103760027/posts/default/3941564208754793634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4508963591103760027/posts/default/3941564208754793634'/><link rel='alternate' type='text/html' href='http://yadhi.blogspot.com/2008/09/install-ubuntu-804-alternate-di-ubuntu.html' title='install ubuntu 804 alternate di ubuntu 710'/><author><name>yadhi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_SqLzh3Y9JXk/SMDIF7bbAhI/AAAAAAAAACA/wyXrCJyiRiQ/s72-c/Screenshot-ubuntu804+%28Snapshot+1%29+%5BRunning%5D+-+innotek+VirtualBox.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4508963591103760027.post-964940340231771587</id><published>2008-09-03T08:29:00.002+07:00</published><updated>2008-09-03T12:44:56.697+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='identity'/><category scheme='http://www.blogger.com/atom/ns#' term='mssql'/><category scheme='http://www.blogger.com/atom/ns#' term='table'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>reset nomor identity di MS SQL</title><content type='html'>cara untuk reset nomor identity di MS SQL menggunakan perintah&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint lang-sql" style="overflow: auto;"&gt;&lt;br /&gt;DBCC CHECKIDENT (namatable, RESEED, nomoridentity)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;contohnya jika kita punya tableA, kita ingin ketika melakukan INSERT, nomor identity menjadi nomor 1&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint lang-sql" style="overflow: auto;"&gt;&lt;br /&gt;DBCC CHECKIDENT (tableA, RESEED, 0)&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4508963591103760027-964940340231771587?l=yadhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yadhi.blogspot.com/feeds/964940340231771587/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4508963591103760027&amp;postID=964940340231771587' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4508963591103760027/posts/default/964940340231771587'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4508963591103760027/posts/default/964940340231771587'/><link rel='alternate' type='text/html' href='http://yadhi.blogspot.com/2008/09/reset-nomor-identity-di-ms-sql.html' title='reset nomor identity di MS SQL'/><author><name>yadhi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4508963591103760027.post-462309081201247835</id><published>2008-08-29T09:56:00.002+07:00</published><updated>2008-09-03T12:46:41.651+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='file system'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='partisi'/><category scheme='http://www.blogger.com/atom/ns#' term='mount'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>ganti filesystem di ubuntu</title><content type='html'>beberapa waktu yg lalu aku baru nyadar, ternyata ada 30G di hard disk PC&lt;br /&gt;yg ku pake filesystem nya ntfs (/dev/sda8 mount sbg /media/Libs). ntfs?&lt;br /&gt;hehe iya, gak ngerti juga nih, apa dulu salah setting atau ada yg&lt;br /&gt;terlewati :p&lt;p&gt;berhubung sekarang sudah membutuhkan filesystem reiserfs, jadi tadi pagi&lt;br /&gt;ku ganti aja. ternyata caranya cukup mudah, aku pake partition editor&lt;br /&gt;bawaanya ubuntu, GParted.&lt;/p&gt;&lt;p&gt;langkah2nya :&lt;br /&gt;1. buka GParted (System - Administration - Partition Editor) atau sudo gparted&lt;br /&gt;2. klik kanan partisi yg akan diubah, unmount&lt;br /&gt;3. klik kanan lagi, Format to - pilih filesystem yg diinginkan&lt;br /&gt;4. apply all operation. tunggu aja bentar, ntar akan di format ulang.&lt;br /&gt;5. klik kanan partisi, Mount on - klik pilihan mount point&lt;br /&gt;6. ubah file /etc/fstab, ganti baris&lt;br /&gt;/dev/sda8 /media/Data ntfs-3g defaults,locale=en_US.UTF-8 0 0&lt;br /&gt;menjadi&lt;br /&gt;/dev/sda8 /media/Libs reiserfs defaults 0 2&lt;br /&gt;7. tambahkan baris di /etc/mtab&lt;br /&gt;/dev/sda8 /media/Libs reiserfs rw 0 0&lt;br /&gt;&lt;/p&gt;&lt;p&gt;ketika di restart, otomatis /dev/sda8 dgn mount point /media/Libs telah&lt;br /&gt;tersedia&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4508963591103760027-462309081201247835?l=yadhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yadhi.blogspot.com/feeds/462309081201247835/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4508963591103760027&amp;postID=462309081201247835' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4508963591103760027/posts/default/462309081201247835'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4508963591103760027/posts/default/462309081201247835'/><link rel='alternate' type='text/html' href='http://yadhi.blogspot.com/2008/08/ganti-filesystem-di-ubuntu.html' title='ganti filesystem di ubuntu'/><author><name>yadhi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4508963591103760027.post-7977524703202859488</id><published>2008-08-06T07:56:00.005+07:00</published><updated>2008-08-07T08:02:19.244+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='install'/><category scheme='http://www.blogger.com/atom/ns#' term='error'/><category scheme='http://www.blogger.com/atom/ns#' term='virtualbox'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>install ubuntu 8.04 hardy heron di innotek virtualbox</title><content type='html'>install ubuntu di ubuntu nih :p penasaran dah beberapa hari gak berhasil2 :p rencananya sih nantinya mau dijadikan server Oracle XE&lt;br /&gt;&lt;br /&gt;instalnya pake iso, download dari &lt;a href="http://kambing.ui.edu/pub/ubuntu/ubuntu/hardy/ubuntu-8.04-server-i386.iso"&gt;http://kambing.ui.edu/pub/ubuntu/ubuntu/hardy/ubuntu-8.04-server-i386.iso&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;trus setelah proses install selesai, trus reboot, selalu ada pesan&lt;br /&gt;&lt;br /&gt;Starting up ...&lt;br /&gt;This kernel requires the following features not present on the CPU:&lt;br /&gt;0:6&lt;br /&gt;Unable to boot - please use a kernel appropriate for your CPU&lt;br /&gt;&lt;br /&gt;ada solusinya di &lt;a href="https://answers.launchpad.net/ubuntu/+question/39349"&gt;https://answers.launchpad.net/ubuntu/+question/39349&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;gak ngerti ah :p&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4508963591103760027-7977524703202859488?l=yadhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yadhi.blogspot.com/feeds/7977524703202859488/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4508963591103760027&amp;postID=7977524703202859488' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4508963591103760027/posts/default/7977524703202859488'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4508963591103760027/posts/default/7977524703202859488'/><link rel='alternate' type='text/html' href='http://yadhi.blogspot.com/2008/08/install-ubuntu-804-hardy-heron-di.html' title='install ubuntu 8.04 hardy heron di innotek virtualbox'/><author><name>yadhi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4508963591103760027.post-2720074687443126899</id><published>2008-08-05T07:24:00.002+07:00</published><updated>2008-08-05T07:29:16.785+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='query'/><category scheme='http://www.blogger.com/atom/ns#' term='left join'/><category scheme='http://www.blogger.com/atom/ns#' term='outer join'/><category scheme='http://www.blogger.com/atom/ns#' term='not in'/><category scheme='http://www.blogger.com/atom/ns#' term='mssql'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>NOT IN bisa diganti pake JOIN dan IS NULL</title><content type='html'>beberapa bulan yg lalu aku mendapatkan sebuah query yg lambat bgt, setelah googling ternyata permasalahannya ada di kondisi NOT IN, di situ dijelaskan kalo NOT IN bisa diganti pake JOIN dan IS NULL, contoh penggunaannya sbb&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;NOT IN&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint lang-sql" style="overflow: auto;"&gt;&lt;br /&gt;SELECT TABLE_A.COLUMN_A&lt;br /&gt;FROM   TABLE_A&lt;br /&gt;WHERE  TABLE_A.COLUMN_A NOT IN&lt;br /&gt;       (&lt;br /&gt;          SELECT TABLE_B.COLUMN_A&lt;br /&gt;          FROM   TABLE_B&lt;br /&gt;       )&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;JOIN dan IS NULL&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint lang-sql" style="overflow: auto;"&gt;&lt;br /&gt;SELECT TABLE_A.COLUMN_A&lt;br /&gt;FROM   TABLE_A&lt;br /&gt;       LEFT JOIN TABLE_B&lt;br /&gt;           ON TABLE_A.COLUMN_A = TABLE_B.COLUMN_A&lt;br /&gt;WHERE  TABLE_B.COLUMN_A IS NULL&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;query ini udah ku coba di MSSQL dan Oracle, hasilnya bisa dieksekusi jauh lebih cepat&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4508963591103760027-2720074687443126899?l=yadhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yadhi.blogspot.com/feeds/2720074687443126899/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4508963591103760027&amp;postID=2720074687443126899' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4508963591103760027/posts/default/2720074687443126899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4508963591103760027/posts/default/2720074687443126899'/><link rel='alternate' type='text/html' href='http://yadhi.blogspot.com/2008/08/not-in-bisa-diganti-pake-join-dan-is.html' title='NOT IN bisa diganti pake JOIN dan IS NULL'/><author><name>yadhi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4508963591103760027.post-1539052330457290212</id><published>2007-04-19T06:02:00.001+07:00</published><updated>2008-07-29T12:48:38.246+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wxpython'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>MySQL-Simple-Query-Browser-0.1.10</title><content type='html'>I've write  a simple script to manage MySQL database, you can see it at &lt;a href="http://docs.google.com/Doc?id=dhr2c3jq_8g3vv2t"&gt;http://docs.google.com/Doc?id=dhr2c3jq_8g3vv2t&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;below is from that link, but not valid for write rules&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#!/usr/bin/env python&lt;br /&gt;&lt;br /&gt;"""&lt;br /&gt;  for my lovely parent&lt;br /&gt;&lt;br /&gt;  MySQL Simple Query Browser&lt;br /&gt;"""&lt;br /&gt;&lt;br /&gt;__scriptname__      = "MySQL Simple Query Browser"&lt;br /&gt;__author__          = "Triyadhi Surahman"&lt;br /&gt;__email__           = "&amp;lt;triyadhi.surahman@gmail.com&amp;gt; &amp;lt;justrelay@yahoo.com&amp;gt;"&lt;br /&gt;__date__            = "20051224 04:57:29 PM"&lt;br /&gt;__version__         = "0.1.10"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;import wx&lt;br /&gt;import wx.grid as gridlib&lt;br /&gt;import wx.lib.dialogs as dlg&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;import MySQLdb&lt;br /&gt;&lt;br /&gt;import string&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# Constant&lt;br /&gt;# Menu File&lt;br /&gt;ID_FILE_QUIT                            = 10001&lt;br /&gt;# Menu Database&lt;br /&gt;ID_DATABASE_CONNECT                     = 10201&lt;br /&gt;ID_DATABASE_DISCONNECT                  = 10202&lt;br /&gt;ID_DATABASE_CREATE                      = 10203&lt;br /&gt;ID_DATABASE_DROP                        = 10204&lt;br /&gt;ID_DATABASE_REFRESH                     = 10205&lt;br /&gt;# Menu Table&lt;br /&gt;ID_TABLE_CREATE                         = 10301&lt;br /&gt;ID_TABLE_DROP                           = 10302&lt;br /&gt;# Menu Query&lt;br /&gt;ID_QUERY_EXECUTE                        = 10401&lt;br /&gt;# Menu Help&lt;br /&gt;ID_HELP_MANUAL                          = 10501&lt;br /&gt;ID_HELP_ABOUT                           = 10502&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# Misc&lt;br /&gt;ID_BUTTON_ADD_TABLE_NAME_TYPE           = 20001&lt;br /&gt;ID_BUTTON_ADD_CREATE_TABLE              = 20002&lt;br /&gt;ID_COMBOBOX_DATABASE                    = 20003&lt;br /&gt;ID_COMBOBOX_TABLE                       = 20004&lt;br /&gt;&lt;br /&gt;ERROR_MESSAGE                           = True&lt;br /&gt;&lt;br /&gt;# Tested MySQL command, 1st word only&lt;br /&gt;has_result = ['ANALYZE', 'BACKUP', 'CHECK', 'CHECKSUM', 'DESCRIBE', 'OPTIMIZE', 'REPAIR', 'RESTORE', 'SELECT', 'SHOW']&lt;br /&gt;no_result  = ['ALTER', 'CREATE', 'DELETE', 'DROP', 'GRANT', 'INSERT', 'SET', 'RENAME', 'REVOKE', 'TRUNCATE', 'UPDATE', 'USE']&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class DatabaseConnectDialog(wx.Dialog):&lt;br /&gt;  def __init__(self, parent, id, title):&lt;br /&gt;      wx.Dialog.__init__(self, parent, id, title)&lt;br /&gt;    &lt;br /&gt;      self.boxvertical        = wx.BoxSizer(wx.VERTICAL)&lt;br /&gt;    &lt;br /&gt;      boxhorizontal           = wx.BoxSizer(wx.HORIZONTAL)&lt;br /&gt;      statictext              = wx.StaticText(self, -1, "Connect To MySQL Server")&lt;br /&gt;      font                    = wx.Font(12, wx.DEFAULT, wx.NORMAL, wx.NORMAL)&lt;br /&gt;      statictext.SetFont(font)&lt;br /&gt;      statictext.SetSize(statictext.GetBestSize())&lt;br /&gt;      boxhorizontal.Add(statictext, 0, wx.ALIGN_CENTER|wx.ALL, 5)&lt;br /&gt;      self.boxvertical.Add(boxhorizontal, 0, wx.ALIGN_CENTER | wx.ALL, 5)&lt;br /&gt;    &lt;br /&gt;      gridsizer               = wx.GridSizer(3, 2, 5, 5)&lt;br /&gt;    &lt;br /&gt;      statictexthost          = wx.StaticText(self, -1, "Host")&lt;br /&gt;      self.textctrlhost       = wx.TextCtrl(self, -1, value="localhost")&lt;br /&gt;    &lt;br /&gt;      statictextusername      = wx.StaticText(self, -1, "Username")&lt;br /&gt;&lt;br /&gt;      #self.textctrlusername   = wx.TextCtrl(self, -1)&lt;br /&gt;      self.textctrlusername   = wx.TextCtrl(self, -1, value="root")&lt;br /&gt;&lt;br /&gt;      self.textctrlusername.SetFocus()&lt;br /&gt;    &lt;br /&gt;      statictextpassword      = wx.StaticText(self, -1, "Password")&lt;br /&gt;      self.textctrlpassword   = wx.TextCtrl(self, -1, style=wx.TE_PASSWORD)&lt;br /&gt;    &lt;br /&gt;      gridsizer.AddMany([&lt;br /&gt;                          (statictexthost, 0, wx.EXPAND),&lt;br /&gt;                          (self.textctrlhost, 0, wx.EXPAND),&lt;br /&gt;                          (statictextusername, 0, wx.EXPAND),&lt;br /&gt;                          (self.textctrlusername, 0, wx.EXPAND),&lt;br /&gt;                          (statictextpassword, 0, wx.EXPAND),&lt;br /&gt;                          (self.textctrlpassword, 0, wx.EXPAND)&lt;br /&gt;                          ])&lt;br /&gt;    &lt;br /&gt;      self.boxvertical.Add(gridsizer, 0, wx.ALIGN_CENTER | wx.ALL, 5)&lt;br /&gt;    &lt;br /&gt;      boxhorizontal       = wx.BoxSizer(wx.HORIZONTAL)&lt;br /&gt;      self.checkbox            = wx.CheckBox(self, -1, "&amp;amp;Use Default Port (3306)")&lt;br /&gt;      self.checkbox.SetValue(True)&lt;br /&gt;      self.Bind(wx.EVT_CHECKBOX, self.CheckBoxChangePort, self.checkbox)&lt;br /&gt;      boxhorizontal.Add(self.checkbox, 0, wx.ALIGN_CENTRE | wx.ALL, 5)&lt;br /&gt;    &lt;br /&gt;      self.boxvertical.Add(boxhorizontal, 0, wx.ALIGN_LEFT | wx.ALL, 5)&lt;br /&gt;    &lt;br /&gt;      self.gridsizerport   = wx.GridSizer(1, 2, 5, 5)&lt;br /&gt;      statictextport  = wx.StaticText(self, -1, "Port")&lt;br /&gt;      self.textctrlport    = wx.TextCtrl(self, -1)&lt;br /&gt;      self.gridsizerport.AddMany([&lt;br /&gt;                                  (statictextport, 0, wx.EXPAND),&lt;br /&gt;                                  (self.textctrlport, 0, wx.EXPAND)&lt;br /&gt;                                  ])&lt;br /&gt;      self.boxhorizontalport  = wx.BoxSizer(wx.HORIZONTAL)&lt;br /&gt;      self.boxhorizontalport.Add(self.gridsizerport, 0, wx.ALIGN_CENTER | wx.ALL, 0)&lt;br /&gt;      self.boxhorizontalport.Show(self.gridsizerport, 0)&lt;br /&gt;        &lt;br /&gt;      boxhorizontal       = wx.BoxSizer(wx.HORIZONTAL)&lt;br /&gt;      ok                  = wx.Button(self, wx.ID_OK, " &amp;amp;OK ")&lt;br /&gt;      ok.SetDefault()&lt;br /&gt;      boxhorizontal.Add(ok, 0, wx.ALIGN_CENTRE | wx.ALL, 5)&lt;br /&gt;      cancel              = wx.Button(self, wx.ID_CANCEL, " &amp;amp;Cancel ")&lt;br /&gt;      boxhorizontal.Add(cancel, 0, wx.ALIGN_CENTRE | wx.ALL, 5)&lt;br /&gt;      self.boxvertical.Add(boxhorizontal, 0, wx.ALIGN_CENTER | wx.ALL, 5)&lt;br /&gt;    &lt;br /&gt;      self.SetSizer(self.boxvertical)&lt;br /&gt;      # We need it if we want to change the layout automatically&lt;br /&gt;      # see CheckBoxChangePort&lt;br /&gt;      self.SetAutoLayout(True)&lt;br /&gt;      self.boxvertical.Fit(self)&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;  def CheckBoxChangePort(self, event):&lt;br /&gt;      """&lt;br /&gt;          If you want to use another port instead the default port&lt;br /&gt;          Alt+U or click on *Use Default Port* checkbox&lt;br /&gt;      """&lt;br /&gt;      if event.IsChecked() == 0:&lt;br /&gt;          self.boxvertical.Insert(3, self.boxhorizontalport, 0, wx.ALIGN_CENTER | wx.ALL, 5)&lt;br /&gt;          self.boxvertical.Show(self.boxhorizontalport)&lt;br /&gt;      elif event.IsChecked() == 1:&lt;br /&gt;          self.boxvertical.Detach(self.gridsizerport)&lt;br /&gt;          # hidding the box&lt;br /&gt;          self.boxvertical.Show(self.boxhorizontalport, 0)&lt;br /&gt;&lt;br /&gt;      self.boxvertical.RecalcSizes()&lt;br /&gt;      self.boxvertical.Fit(self)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class DatabaseCreateDialog(wx.Dialog) :&lt;br /&gt;  def __init__(self, parent, id, title) :&lt;br /&gt;      wx.Dialog.__init__(self, parent, id, title)&lt;br /&gt;      boxvertical             = wx.BoxSizer(wx.VERTICAL)&lt;br /&gt;    &lt;br /&gt;      boxhorizontal           = wx.BoxSizer(wx.HORIZONTAL)&lt;br /&gt;      statictext              = wx.StaticText(self, -1, "Create Database")&lt;br /&gt;      font                    = wx.Font(12, wx.DEFAULT, wx.NORMAL, wx.NORMAL)&lt;br /&gt;      statictext.SetFont(font)&lt;br /&gt;      statictext.SetSize(statictext.GetBestSize())&lt;br /&gt;      boxhorizontal.Add(statictext, 0, wx.ALIGN_CENTER|wx.ALL, 5)&lt;br /&gt;      boxvertical.Add(boxhorizontal, 0, wx.ALIGN_CENTER | wx.ALL, 5)&lt;br /&gt;    &lt;br /&gt;      gridsizer               = wx.GridSizer(1, 2, 5, 5)&lt;br /&gt;    &lt;br /&gt;      boxhorizontal           = wx.BoxSizer(wx.HORIZONTAL)&lt;br /&gt;      statictext              = wx.StaticText(self, -1, "Database Name")&lt;br /&gt;      self.textctrl           = wx.TextCtrl(self, -1)&lt;br /&gt;    &lt;br /&gt;      gridsizer.AddMany([&lt;br /&gt;                          (statictext, 0, wx.ALIGN_LEFT),&lt;br /&gt;                          (self.textctrl, 0, wx.ALIGN_LEFT)&lt;br /&gt;                          ])&lt;br /&gt;                     &lt;br /&gt;      boxvertical.Add(gridsizer, 0, wx.ALIGN_CENTRE | wx.ALL, 5)&lt;br /&gt;    &lt;br /&gt;      boxhorizontal       = wx.BoxSizer(wx.HORIZONTAL)&lt;br /&gt;      ok              = wx.Button(self, wx.ID_OK, " &amp;amp;OK ")&lt;br /&gt;      ok.SetDefault()&lt;br /&gt;      boxhorizontal.Add(ok, 0, wx.ALIGN_CENTRE | wx.ALL, 5)&lt;br /&gt;      cancel              = wx.Button(self, wx.ID_CANCEL, " &amp;amp;Cancel ")&lt;br /&gt;      boxhorizontal.Add(cancel, 0, wx.ALIGN_CENTRE | wx.ALL, 5)&lt;br /&gt;      boxvertical.Add(boxhorizontal, 0, wx.ALIGN_CENTER | wx.ALL, 5)&lt;br /&gt;    &lt;br /&gt;      self.SetSizer(boxvertical)&lt;br /&gt;      # We need it if we want to change the layout automatically&lt;br /&gt;      # see CheckBoxChangePort&lt;br /&gt;      self.SetAutoLayout(True)&lt;br /&gt;      boxvertical.Fit(self)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        &lt;br /&gt;class DatabaseDropDialog(wx.Dialog) :&lt;br /&gt;  def __init__(self, parent, id, title, databases) :&lt;br /&gt;      wx.Dialog.__init__(self, parent, id, title)&lt;br /&gt;      boxvertical             = wx.BoxSizer(wx.VERTICAL)&lt;br /&gt;    &lt;br /&gt;      boxhorizontal           = wx.BoxSizer(wx.HORIZONTAL)&lt;br /&gt;      statictext              = wx.StaticText(self, -1, "Drop Database")&lt;br /&gt;      font                    = wx.Font(12, wx.DEFAULT, wx.NORMAL, wx.NORMAL)&lt;br /&gt;      statictext.SetFont(font)&lt;br /&gt;      statictext.SetSize(statictext.GetBestSize())&lt;br /&gt;      boxhorizontal.Add(statictext, 0, wx.ALIGN_CENTER|wx.ALL, 5)&lt;br /&gt;      boxvertical.Add(boxhorizontal, 0, wx.ALIGN_CENTER | wx.ALL, 5)&lt;br /&gt;    &lt;br /&gt;      gridsizer               = wx.GridSizer(1, 2, 5, 5)&lt;br /&gt;    &lt;br /&gt;      boxhorizontal           = wx.BoxSizer(wx.HORIZONTAL)&lt;br /&gt;      statictext              = wx.StaticText(self, -1, "Database Name")&lt;br /&gt;      self.combobox           = wx.ComboBox(self, -1, style=wx.CB_READONLY)&lt;br /&gt;    &lt;br /&gt;      dbnamelist              = databases&lt;br /&gt;    &lt;br /&gt;      for d in dbnamelist :&lt;br /&gt;          self.combobox.Append(d)&lt;br /&gt;    &lt;br /&gt;      gridsizer.AddMany([&lt;br /&gt;                          (statictext, 0, wx.ALIGN_LEFT),&lt;br /&gt;                          (self.combobox, 0, wx.ALIGN_LEFT)&lt;br /&gt;                          ])&lt;br /&gt;                     &lt;br /&gt;      boxvertical.Add(gridsizer, 0, wx.ALIGN_CENTRE | wx.ALL, 5)&lt;br /&gt;    &lt;br /&gt;      boxhorizontal       = wx.BoxSizer(wx.HORIZONTAL)&lt;br /&gt;      ok              = wx.Button(self, wx.ID_OK, " &amp;amp;OK ")&lt;br /&gt;      ok.SetDefault()&lt;br /&gt;      boxhorizontal.Add(ok, 0, wx.ALIGN_CENTRE | wx.ALL, 5)&lt;br /&gt;      cancel              = wx.Button(self, wx.ID_CANCEL, " &amp;amp;Cancel ")&lt;br /&gt;      boxhorizontal.Add(cancel, 0, wx.ALIGN_CENTRE | wx.ALL, 5)&lt;br /&gt;      boxvertical.Add(boxhorizontal, 0, wx.ALIGN_CENTER | wx.ALL, 5)&lt;br /&gt;    &lt;br /&gt;      self.SetSizer(boxvertical)&lt;br /&gt;      # We need it if we want to change the layout automatically&lt;br /&gt;      # see CheckBoxChangePort&lt;br /&gt;      self.SetAutoLayout(True)&lt;br /&gt;      boxvertical.Fit(self)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class TableCreateDialog(wx.Dialog) :&lt;br /&gt;  def __init__(self, parent, id, title, databases) :&lt;br /&gt;      wx.Dialog.__init__(self, parent, id, title)&lt;br /&gt;    &lt;br /&gt;      boxvertical             = wx.BoxSizer(wx.VERTICAL)&lt;br /&gt;    &lt;br /&gt;      notebook                = wx.Notebook(self, -1)&lt;br /&gt;      paneltablename          = wx.Panel(notebook, -1)&lt;br /&gt;      paneladd                = wx.Panel(notebook, -1)&lt;br /&gt;      panelsyntax             = wx.Panel(notebook, -1)&lt;br /&gt;      notebook.AddPage(paneltablename, "Name and Type")&lt;br /&gt;      notebook.AddPage(paneladd, "Add Fields")&lt;br /&gt;      notebook.AddPage(panelsyntax, "Syntax")&lt;br /&gt;    &lt;br /&gt;      # BoxSizer vertical for paneltablename&lt;br /&gt;      boxptv                  = wx.BoxSizer(wx.VERTICAL)&lt;br /&gt;      gridsizer               = wx.GridSizer(3, 2, 5, 5)&lt;br /&gt;      statictextdatabases     = wx.StaticText(paneltablename, -1, "Database")&lt;br /&gt;      statictexttablename     = wx.StaticText(paneltablename, -1, "Table Name")&lt;br /&gt;      statictexttabletype     = wx.StaticText(paneltablename, -1, "Table Type")&lt;br /&gt;      self.comboboxdatabases  = wx.ComboBox(paneltablename, -1)&lt;br /&gt;      self.textctrltablename  = wx.TextCtrl(paneltablename, -1, size=self.comboboxdatabases.GetSize())&lt;br /&gt;      self.comboboxtabletype  = wx.ComboBox(paneltablename, -1, style=wx.CB_READONLY)&lt;br /&gt;    &lt;br /&gt;      dbnamelist              = databases&lt;br /&gt;    &lt;br /&gt;      for d in dbnamelist :&lt;br /&gt;          self.comboboxdatabases.Append(d)&lt;br /&gt;    &lt;br /&gt;      tabletypelist           = ['MyISAM', 'InnoDB', 'ISAM']&lt;br /&gt;    &lt;br /&gt;      for t in tabletypelist :&lt;br /&gt;          self.comboboxtabletype.Append(t)&lt;br /&gt;    &lt;br /&gt;      self.comboboxtabletype.SetValue(tabletypelist[0])&lt;br /&gt;    &lt;br /&gt;      gridsizer.AddMany([&lt;br /&gt;                          (statictextdatabases, 0, wx.ALIGN_LEFT),&lt;br /&gt;                          (self.comboboxdatabases, 0, wx.ALIGN_LEFT),&lt;br /&gt;                          (statictexttablename, 0, wx.ALIGN_LEFT),&lt;br /&gt;                          (self.textctrltablename, 0, wx.ALIGN_LEFT),&lt;br /&gt;                          (statictexttabletype, 0, wx.ALIGN_LEFT),&lt;br /&gt;                          (self.comboboxtabletype, 0, wx.ALIGN_LEFT)&lt;br /&gt;                          ])&lt;br /&gt;    &lt;br /&gt;      boxptv.Add(gridsizer, 0, wx.ALIGN_CENTRE | wx.ALL, 5)&lt;br /&gt;      boxhorizontal           = wx.BoxSizer(wx.HORIZONTAL)&lt;br /&gt;      button                  = wx.Button(paneltablename, ID_BUTTON_ADD_TABLE_NAME_TYPE, " &amp;amp;Add ")&lt;br /&gt;      boxhorizontal.Add(button, 0, wx.ALIGN_CENTRE | wx.ALL, 5)&lt;br /&gt;      boxptv.Add(boxhorizontal, 0, wx.ALIGN_CENTRE | wx.ALL, 5)&lt;br /&gt;    &lt;br /&gt;      # event&lt;br /&gt;      self.Bind(wx.EVT_BUTTON, self.AddTableNameType, id=ID_BUTTON_ADD_TABLE_NAME_TYPE)&lt;br /&gt;    &lt;br /&gt;      paneltablename.SetSizer(boxptv)&lt;br /&gt;      paneltablename.SetAutoLayout(True)&lt;br /&gt;      boxptv.Fit(paneltablename)&lt;br /&gt;    &lt;br /&gt;      # BoxSizer vertical for paneladd&lt;br /&gt;      boxpav                  = wx.BoxSizer(wx.VERTICAL)&lt;br /&gt;      gridsizer               = wx.GridSizer(9, 2, 5, 5)&lt;br /&gt;      statictextfieldname     = wx.StaticText(paneladd, -1, "Field Name")&lt;br /&gt;      statictextdatatype      = wx.StaticText(paneladd, -1, "Data Type")&lt;br /&gt;      statictextlengthvalues  = wx.StaticText(paneladd, -1, "Length/Values")&lt;br /&gt;      statictextattributes    = wx.StaticText(paneladd, -1, "Attributes")&lt;br /&gt;      statictextnull          = wx.StaticText(paneladd, -1, "NULL")&lt;br /&gt;      statictextdefault       = wx.StaticText(paneladd, -1, "Default")&lt;br /&gt;      statictextextra         = wx.StaticText(paneladd, -1, "Extra")&lt;br /&gt;      statictextcolumndefinition  = wx.StaticText(paneladd, -1, "Column Definition")&lt;br /&gt;      statictextfulltext      = wx.StaticText(paneladd, -1, "Fulltext")&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;      self.textctrlfieldname  = wx.TextCtrl(paneladd, -1)&lt;br /&gt;      self.textctrlfieldname.SetFocus()&lt;br /&gt;    &lt;br /&gt;      self.comboboxdatatype   = wx.ComboBox(paneladd, -1, style=wx.CB_READONLY)&lt;br /&gt;    &lt;br /&gt;      datatypelist            = [&lt;br /&gt;                              # numeric types&lt;br /&gt;                              'TINYINT', 'BIT', 'BOOL', 'BOOLEAN', 'SMALLINT',&lt;br /&gt;                              'MEDIUMINT', 'INT', 'INTEGER', 'BIGINT', 'FLOAT',&lt;br /&gt;                              'DOUBLE', 'DOUBLE PRECISION','REAL', 'DECIMAL', 'DEC',&lt;br /&gt;                              'NUMERIC', 'FIXED',&lt;br /&gt;                              # date and time types&lt;br /&gt;                              'DATE', 'DATETIME', 'TIMESTAMP', 'TIME', 'YEAR',&lt;br /&gt;                              # string types&lt;br /&gt;                              'CHAR', 'VARCHAR', 'BINARY', 'VARBINARY', 'TINYBLOB',&lt;br /&gt;                              'TINYTEXT', 'BLOB', 'TEXT', 'MEDIUMBLOB', 'MEDIUMTEXT',&lt;br /&gt;                              'LONGBLOB', 'LONGTEXT', 'ENUM', 'SET'&lt;br /&gt;                              ]&lt;br /&gt;      for d in datatypelist :&lt;br /&gt;          self.comboboxdatatype.Append(d)&lt;br /&gt;&lt;br /&gt;      self.textctrllengthvalues = wx.TextCtrl(paneladd, -1)&lt;br /&gt;    &lt;br /&gt;      self.comboboxattributes = wx.ComboBox(paneladd, -1, style=wx.CB_READONLY)&lt;br /&gt;    &lt;br /&gt;      attributeslist          = ['', 'BINARY', 'UNSIGNED', 'UNSIGNED ZEROFILL']&lt;br /&gt;      for u in attributeslist :&lt;br /&gt;          self.comboboxattributes.Append(u)&lt;br /&gt;    &lt;br /&gt;      self.comboboxnull       = wx.ComboBox(paneladd, -1, style=wx.CB_READONLY)&lt;br /&gt;    &lt;br /&gt;      nulllist                = ['', 'NULL', 'NOT NULL']&lt;br /&gt;      for n in nulllist :&lt;br /&gt;          self.comboboxnull.Append(n)&lt;br /&gt;    &lt;br /&gt;      self.textctrldefault    = wx.TextCtrl(paneladd, -1)&lt;br /&gt;    &lt;br /&gt;      self.comboboxextra      = wx.ComboBox(paneladd, -1, style=wx.CB_READONLY)&lt;br /&gt;    &lt;br /&gt;      extralist               = ['', 'AUTO_INCREMENT']&lt;br /&gt;      for e in extralist :&lt;br /&gt;          self.comboboxextra.Append(e)&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;      self.comboboxcolumndefinition = wx.ComboBox(paneladd, -1, style=wx.CB_READONLY)&lt;br /&gt;    &lt;br /&gt;      columndefinitionlist    = ['', 'PRIMARY KEY', 'INDEX', 'UNIQUE']&lt;br /&gt;      for p in columndefinitionlist :&lt;br /&gt;          self.comboboxcolumndefinition.Append(p)&lt;br /&gt;    &lt;br /&gt;      self.checkboxfulltext   = wx.CheckBox(paneladd, -1)&lt;br /&gt;    &lt;br /&gt;      gridsizer.AddMany([&lt;br /&gt;                          (statictextfieldname, 0, wx.ALIGN_LEFT),&lt;br /&gt;                          (self.textctrlfieldname, 0, wx.ALIGN_LEFT),&lt;br /&gt;                          (statictextdatatype, 0, wx.ALIGN_LEFT),&lt;br /&gt;                          (self.comboboxdatatype, 0, wx.ALIGN_LEFT),&lt;br /&gt;                          (statictextlengthvalues, 0, wx.ALIGN_LEFT),&lt;br /&gt;                          (self.textctrllengthvalues, 0, wx.ALIGN_LEFT),&lt;br /&gt;                          (statictextattributes, 0, wx.ALIGN_LEFT),&lt;br /&gt;                          (self.comboboxattributes, 0, wx.ALIGN_LEFT),&lt;br /&gt;                          (statictextnull, 0, wx.ALIGN_LEFT),&lt;br /&gt;                          (self.comboboxnull, 0, wx.ALIGN_LEFT),&lt;br /&gt;                          (statictextdefault, 0, wx.ALIGN_LEFT),&lt;br /&gt;                          (self.textctrldefault, 0, wx.ALIGN_LEFT),&lt;br /&gt;                          (statictextextra, 0, wx.ALIGN_LEFT),&lt;br /&gt;                          (self.comboboxextra, 0, wx.ALIGN_LEFT),&lt;br /&gt;                          (statictextcolumndefinition, 0, wx.ALIGN_LEFT),&lt;br /&gt;                          (self.comboboxcolumndefinition, 0, wx.ALIGN_LEFT),&lt;br /&gt;                          (statictextfulltext, 0, wx.ALIGN_LEFT),&lt;br /&gt;                          (self.checkboxfulltext, 0, wx.ALIGN_LEFT)&lt;br /&gt;                          ])&lt;br /&gt;      boxpav.Add(gridsizer, 0, wx.ALIGN_CENTRE | wx.ALL, 5)&lt;br /&gt;    &lt;br /&gt;      boxhorizontal           = wx.BoxSizer(wx.HORIZONTAL)&lt;br /&gt;      button                  = wx.Button(paneladd, ID_BUTTON_ADD_CREATE_TABLE, " &amp;amp;Add ")&lt;br /&gt;      #self.Bind(wx.EVT_BUTTON, self.OnAddCreateTable, id=ID_BUTTON_ADD_CREATE_TABLE)&lt;br /&gt;      boxhorizontal.Add(button, 0, wx.ALIGN_CENTRE | wx.ALL, 5)&lt;br /&gt;      boxpav.Add(boxhorizontal, 0, wx.ALIGN_CENTRE | wx.ALL, 5)&lt;br /&gt;    &lt;br /&gt;      # event&lt;br /&gt;      self.Bind(wx.EVT_BUTTON, self.AddField, id=ID_BUTTON_ADD_CREATE_TABLE)&lt;br /&gt;    &lt;br /&gt;      paneladd.SetSizer(boxpav)&lt;br /&gt;      paneladd.SetAutoLayout(True)&lt;br /&gt;      boxpav.Fit(paneladd)&lt;br /&gt;    &lt;br /&gt;      # BoxSizer vertical for panelsyntax&lt;br /&gt;      boxpsv                  = wx.BoxSizer(wx.VERTICAL)&lt;br /&gt;      self.textctrlsyntax     = wx.TextCtrl(panelsyntax, -1,&lt;br /&gt;                                          style=wx.TE_MULTILINE | wx.HSCROLL | wx.TE_RICH,&lt;br /&gt;                                          size=paneladd.GetSize())&lt;br /&gt;      boxpsv.Add(self.textctrlsyntax, 0, wx.ALIGN_CENTRE | wx.ALL, 5)&lt;br /&gt;    &lt;br /&gt;      panelsyntax.SetSizer(boxpsv)&lt;br /&gt;      panelsyntax.SetAutoLayout(True)&lt;br /&gt;      boxpsv.Fit(panelsyntax)&lt;br /&gt;    &lt;br /&gt;      boxvertical.Add(notebook, 0, wx.ALIGN_CENTRE | wx.ALL, 5)&lt;br /&gt;    &lt;br /&gt;      boxhorizontal           = wx.BoxSizer(wx.HORIZONTAL)&lt;br /&gt;      ok                  = wx.Button(self, wx.ID_OK, " &amp;amp;OK ")&lt;br /&gt;      ok.SetDefault()&lt;br /&gt;      boxhorizontal.Add(ok, 0, wx.ALIGN_CENTRE | wx.ALL, 5)&lt;br /&gt;      cancel                  = wx.Button(self, wx.ID_CANCEL, " &amp;amp;Cancel ")&lt;br /&gt;      boxhorizontal.Add(cancel, 0, wx.ALIGN_CENTRE | wx.ALL, 5)&lt;br /&gt;      boxvertical.Add(boxhorizontal, 0, wx.ALIGN_CENTER | wx.ALL, 5)&lt;br /&gt;    &lt;br /&gt;      self.SetSizer(boxvertical)&lt;br /&gt;      # We need it if we want to change the layout automatically&lt;br /&gt;      # see CheckBoxChangePort&lt;br /&gt;      self.SetAutoLayout(True)&lt;br /&gt;      boxvertical.Fit(self)&lt;br /&gt;    &lt;br /&gt;      self.ResetValue()&lt;br /&gt;&lt;br /&gt;  def ResetValue(self) :&lt;br /&gt;      self.syntaxvalue = ""&lt;br /&gt;      self.tabledetails = []&lt;br /&gt;      self.databasename = ""&lt;br /&gt;      self.tablename = ""&lt;br /&gt;      self.tabletype = ""&lt;br /&gt;      self.primarykey = ""&lt;br /&gt;      self.unique = ""&lt;br /&gt;      self.index = ""&lt;br /&gt;      self.fulltext = ""&lt;br /&gt;&lt;br /&gt;  def AddTableNameType(self, event) :&lt;br /&gt;      self.databasename   = self.comboboxdatabases.GetValue()&lt;br /&gt;      self.tablename      = self.textctrltablename.GetValue()&lt;br /&gt;      self.tabletype      = self.comboboxtabletype.GetValue()&lt;br /&gt;      self.PanelSyntaxValue()&lt;br /&gt;&lt;br /&gt;  def AddField(self, event) :&lt;br /&gt;      item = ""&lt;br /&gt;      if len(self.tabledetails) &amp;gt; 0 :&lt;br /&gt;          item = ",n"&lt;br /&gt;    &lt;br /&gt;      item += string.strip(self.textctrlfieldname.GetValue())&lt;br /&gt;      item += " " + self.comboboxdatatype.GetValue()&lt;br /&gt;    &lt;br /&gt;      if len(string.strip(self.textctrllengthvalues.GetValue())) &amp;gt; 0 :&lt;br /&gt;          item += "(" + self.textctrllengthvalues.GetValue() + ")"&lt;br /&gt;        &lt;br /&gt;      item += " " + self.comboboxattributes.GetValue()&lt;br /&gt;      item += " " + self.comboboxnull.GetValue()&lt;br /&gt;    &lt;br /&gt;      if len(string.strip(self.textctrldefault.GetValue())) &amp;gt; 0 :&lt;br /&gt;          item += " DEFAULT '" + self.textctrldefault.GetValue() + "'"&lt;br /&gt;        &lt;br /&gt;      item += " " + self.comboboxextra.GetValue()&lt;br /&gt;    &lt;br /&gt;      if self.comboboxcolumndefinition.GetValue() == 'PRIMARY KEY' :&lt;br /&gt;          if len(self.primarykey) == 0 :&lt;br /&gt;              self.primarykey = self.textctrlfieldname.GetValue()&lt;br /&gt;          else :&lt;br /&gt;              self.primarykey += ", " + self.textctrlfieldname.GetValue()&lt;br /&gt;      elif self.comboboxcolumndefinition.GetValue() == 'INDEX' :&lt;br /&gt;          if len(self.index) == 0 :&lt;br /&gt;              self.index = self.textctrlfieldname.GetValue()&lt;br /&gt;          else :&lt;br /&gt;              self.index += ", " + self.textctrlfieldname.GetValue()&lt;br /&gt;      elif self.comboboxcolumndefinition.GetValue() == 'UNIQUE' :&lt;br /&gt;          if len(self.unique) == 0 :&lt;br /&gt;              self.unique = self.textctrlfieldname.GetValue()&lt;br /&gt;          else :&lt;br /&gt;              self.unique += ", " + self.textctrlfieldname.GetValue()&lt;br /&gt;    &lt;br /&gt;      if self.checkboxfulltext.IsChecked() == 1 :&lt;br /&gt;          if len(self.fulltext) == 0 :&lt;br /&gt;              self.fulltext = self.textctrlfieldname.GetValue()&lt;br /&gt;          else :&lt;br /&gt;              self.fulltext += ", " + self.textctrlfieldname.GetValue()&lt;br /&gt;    &lt;br /&gt;      self.tabledetails.append(item)&lt;br /&gt;    &lt;br /&gt;      self.PanelSyntaxValue()&lt;br /&gt;    &lt;br /&gt;  def PanelSyntaxValue(self) :&lt;br /&gt;      self.syntaxvalue = "CREATE TABLE " + self.databasename + "." + self.tablename + " (n"&lt;br /&gt;    &lt;br /&gt;      for i in range(len(self.tabledetails)) :&lt;br /&gt;          self.syntaxvalue += self.tabledetails[i]&lt;br /&gt;            &lt;br /&gt;      if len(self.primarykey) &amp;gt; 0 :&lt;br /&gt;          self.syntaxvalue += ",n PRIMARY KEY (" + self.primarykey + ")"&lt;br /&gt;        &lt;br /&gt;      if len(self.index) &amp;gt; 0 :&lt;br /&gt;          self.syntaxvalue += ",n INDEX (" + self.index + ")"&lt;br /&gt;        &lt;br /&gt;      if len(self.unique) &amp;gt; 0 :&lt;br /&gt;          self.syntaxvalue += ",n UNIQUE (" + self.unique + ")"&lt;br /&gt;            &lt;br /&gt;      if len(self.fulltext) &amp;gt; 0 :&lt;br /&gt;          self.syntaxvalue += ",n FULLTEXT (" + self.fulltext + ")"&lt;br /&gt;            &lt;br /&gt;      self.syntaxvalue += "n) TYPE=" + self.tabletype&lt;br /&gt;            &lt;br /&gt;      self.textctrlsyntax.SetValue(self.syntaxvalue)&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class TableDropDialog(wx.Dialog) :&lt;br /&gt;  def __init__(self, parent, id, title, connection, databases) :&lt;br /&gt;      wx.Dialog.__init__(self, parent, id, title)&lt;br /&gt;    &lt;br /&gt;      self.connection = connection&lt;br /&gt;    &lt;br /&gt;      boxvertical             = wx.BoxSizer(wx.VERTICAL)&lt;br /&gt;    &lt;br /&gt;      boxhorizontal           = wx.BoxSizer(wx.HORIZONTAL)&lt;br /&gt;      statictext              = wx.StaticText(self, -1, "Drop Table")&lt;br /&gt;      font                    = wx.Font(12, wx.DEFAULT, wx.NORMAL, wx.NORMAL)&lt;br /&gt;      statictext.SetFont(font)&lt;br /&gt;      statictext.SetSize(statictext.GetBestSize())&lt;br /&gt;      boxhorizontal.Add(statictext, 0, wx.ALIGN_CENTER|wx.ALL, 5)&lt;br /&gt;      boxvertical.Add(boxhorizontal, 0, wx.ALIGN_CENTER | wx.ALL, 5)&lt;br /&gt;    &lt;br /&gt;      gridsizer               = wx.GridSizer(2, 2, 5, 5)&lt;br /&gt;    &lt;br /&gt;      boxhorizontal           = wx.BoxSizer(wx.HORIZONTAL)&lt;br /&gt;      statictextdb            = wx.StaticText(self, -1, "Database Name")&lt;br /&gt;      self.comboboxdb         = wx.ComboBox(self, ID_COMBOBOX_DATABASE, style=wx.CB_READONLY)&lt;br /&gt;      statictexttable         = wx.StaticText(self, -1, "Table Name")&lt;br /&gt;      self.comboboxtable      = wx.ComboBox(self, ID_COMBOBOX_TABLE, style=wx.CB_READONLY)&lt;br /&gt;    &lt;br /&gt;      self.Bind(wx.EVT_COMBOBOX, self.DatabaseSelected, id=ID_COMBOBOX_DATABASE)&lt;br /&gt;      self.Bind(wx.EVT_COMBOBOX, self.TableSelected, id=ID_COMBOBOX_TABLE)&lt;br /&gt;    &lt;br /&gt;      dbnamelist              = databases&lt;br /&gt;    &lt;br /&gt;      for d in dbnamelist :&lt;br /&gt;          self.comboboxdb.Append(d)&lt;br /&gt;    &lt;br /&gt;      gridsizer.AddMany([&lt;br /&gt;                          (statictextdb, 0, wx.ALIGN_LEFT),&lt;br /&gt;                          (self.comboboxdb, 0, wx.ALIGN_LEFT),&lt;br /&gt;                          (statictexttable, 0, wx.ALIGN_LEFT),&lt;br /&gt;                          (self.comboboxtable, 0, wx.ALIGN_LEFT)&lt;br /&gt;                          ])&lt;br /&gt;                     &lt;br /&gt;      boxvertical.Add(gridsizer, 0, wx.ALIGN_CENTRE | wx.ALL, 5)&lt;br /&gt;    &lt;br /&gt;      boxhorizontal       = wx.BoxSizer(wx.HORIZONTAL)&lt;br /&gt;      ok              = wx.Button(self, wx.ID_OK, " &amp;amp;OK ")&lt;br /&gt;      ok.SetDefault()&lt;br /&gt;      boxhorizontal.Add(ok, 0, wx.ALIGN_CENTRE | wx.ALL, 5)&lt;br /&gt;      cancel              = wx.Button(self, wx.ID_CANCEL, " &amp;amp;Cancel ")&lt;br /&gt;      boxhorizontal.Add(cancel, 0, wx.ALIGN_CENTRE | wx.ALL, 5)&lt;br /&gt;      boxvertical.Add(boxhorizontal, 0, wx.ALIGN_CENTER | wx.ALL, 5)&lt;br /&gt;    &lt;br /&gt;      self.SetSizer(boxvertical)&lt;br /&gt;      # We need it if we want to change the layout automatically&lt;br /&gt;      # see CheckBoxChangePort&lt;br /&gt;      self.SetAutoLayout(True)&lt;br /&gt;      boxvertical.Fit(self)&lt;br /&gt;    &lt;br /&gt;  def DatabaseSelected(self, event) :&lt;br /&gt;      self.comboboxtable.Clear()&lt;br /&gt;      self.GetTable(self.connection, self.comboboxdb.GetValue())&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;  def GetTable(self, connection, dbname) :&lt;br /&gt;      connection.query("""USE """ + dbname)&lt;br /&gt;      connection.query("""SHOW TABLES""")&lt;br /&gt;      r = connection.store_result()&lt;br /&gt;      f = r.fetch_row(maxrows=0)&lt;br /&gt;        &lt;br /&gt;      for i in range(len(f)) :&lt;br /&gt;          self.comboboxtable.Append(f[i][0])&lt;br /&gt;    &lt;br /&gt;  def TableSelected(self, event) :&lt;br /&gt;      self.dropsyntax = "DROP TABLE " + self.comboboxdb.GetValue() + "." + self.comboboxtable.GetValue()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class HelpAbout(wx.Dialog) :&lt;br /&gt;  def __init__(self, parent, id, title) :&lt;br /&gt;      wx.Dialog.__init__(self, parent, id, title)&lt;br /&gt;    &lt;br /&gt;      boxvertical             = wx.BoxSizer(wx.VERTICAL)&lt;br /&gt;    &lt;br /&gt;      boxhorizontal           = wx.BoxSizer(wx.HORIZONTAL)&lt;br /&gt;      namelabel               = wx.StaticText(self, -1, __scriptname__)&lt;br /&gt;      font                    = wx.Font(12, wx.DEFAULT, wx.NORMAL, wx.NORMAL)&lt;br /&gt;      namelabel.SetFont(font)&lt;br /&gt;      namelabel.SetSize(namelabel.GetBestSize())&lt;br /&gt;      namelabel.SetSize(namelabel.GetBestSize())&lt;br /&gt;      boxhorizontal.Add(namelabel, 0, wx.ALIGN_CENTRE | wx.ALL, 5)&lt;br /&gt;    &lt;br /&gt;      boxvertical.Add(boxhorizontal, 0, wx.ALIGN_CENTRE | wx.ALL, 5)&lt;br /&gt;    &lt;br /&gt;      gridsizer               = wx.GridSizer(3, 2, 5, 5)&lt;br /&gt;    &lt;br /&gt;      authorlabel             = wx.StaticText(self, -1, "Author")&lt;br /&gt;      authorvalue             = wx.StaticText(self, -1, __author__)&lt;br /&gt;      emaillabel              = wx.StaticText(self, -1, "Email")&lt;br /&gt;      emailvalue              = wx.StaticText(self, -1, __email__)&lt;br /&gt;      versionlabel            = wx.StaticText(self, -1, "Version")&lt;br /&gt;      versionvalue            = wx.StaticText(self, -1, __version__)&lt;br /&gt;      datelabel               = wx.StaticText(self, -1, "Date")&lt;br /&gt;      datevalue               = wx.StaticText(self, -1, __date__)&lt;br /&gt;    &lt;br /&gt;      gridsizer.AddMany([&lt;br /&gt;                          (authorlabel, 0, wx.ALIGN_LEFT),&lt;br /&gt;                          (authorvalue, 0, wx.ALIGN_LEFT),&lt;br /&gt;                          (emaillabel, 0, wx.ALIGN_LEFT),&lt;br /&gt;                          (emailvalue, 0, wx.ALIGN_LEFT),&lt;br /&gt;                          (versionlabel, 0, wx.ALIGN_LEFT),&lt;br /&gt;                          (versionvalue, 0, wx.ALIGN_LEFT),&lt;br /&gt;                          (datelabel, 0, wx.ALIGN_LEFT),&lt;br /&gt;                          (datevalue, 0, wx.ALIGN_LEFT)&lt;br /&gt;                          ])&lt;br /&gt;                     &lt;br /&gt;      boxvertical.Add(gridsizer, 0, wx.ALIGN_CENTRE | wx.ALL, 5)&lt;br /&gt;    &lt;br /&gt;      boxhorizontal           = wx.BoxSizer(wx.HORIZONTAL)&lt;br /&gt;      ok                  = wx.Button(self, wx.ID_OK, " &amp;amp;OK ")&lt;br /&gt;      ok.SetDefault()&lt;br /&gt;      boxhorizontal.Add(ok, 0, wx.ALIGN_CENTRE | wx.ALL, 5)&lt;br /&gt;      boxvertical.Add(boxhorizontal, 0, wx.ALIGN_CENTER | wx.ALL, 5)&lt;br /&gt;    &lt;br /&gt;      self.SetSizer(boxvertical)&lt;br /&gt;      # We need it if we want to change the layout automatically&lt;br /&gt;      # see CheckBoxChangePort&lt;br /&gt;      self.SetAutoLayout(True)&lt;br /&gt;      boxvertical.Fit(self)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class HelpManual(dlg.ScrolledMessageDialog) :&lt;br /&gt;  def __init__(self, parent) :&lt;br /&gt;      f = open("manual.txt", "r")&lt;br /&gt;      msg = f.read()&lt;br /&gt;      f.close()&lt;br /&gt;    &lt;br /&gt;      dlg.ScrolledMessageDialog.__init__(self, parent, msg, caption="Manual")&lt;br /&gt;    &lt;br /&gt;  def OnOK(self, event) :&lt;br /&gt;      self.Destroy()&lt;br /&gt;      event.Skip()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class ErrorMessageDialog(dlg.ScrolledMessageDialog) :&lt;br /&gt;  def __init__(self, parent, msg) :&lt;br /&gt;      dlg.ScrolledMessageDialog.__init__(self, parent, msg, caption="Query Error")&lt;br /&gt;    &lt;br /&gt;  def OnOK(self, event) :&lt;br /&gt;      self.Destroy()&lt;br /&gt;      event.Skip()&lt;br /&gt;     &lt;br /&gt;    &lt;br /&gt;class MainFrame(wx.Frame):&lt;br /&gt;&lt;br /&gt;  # Style&lt;br /&gt;  style = {&lt;br /&gt;          'frame': wx.DEFAULT_FRAME_STYLE,&lt;br /&gt;          'splitter': wx.SUNKEN_BORDER | wx.CLIP_CHILDREN,&lt;br /&gt;          'textctrl': wx.TE_MULTILINE | wx.HSCROLL | wx.TE_RICH&lt;br /&gt;          }&lt;br /&gt;        &lt;br /&gt;  def __init__(self, parent, title):&lt;br /&gt;      wx.Frame.__init__(self, parent, -1, title,&lt;br /&gt;                          size=wx.Size(750, 550),&lt;br /&gt;                          style=self.style['frame'])&lt;br /&gt;                        &lt;br /&gt;      self.CentreOnScreen()&lt;br /&gt;    &lt;br /&gt;      # Menu Bar&lt;br /&gt;      menubar = wx.MenuBar()&lt;br /&gt;    &lt;br /&gt;      # Menu : File&lt;br /&gt;      menufile                = wx.Menu()&lt;br /&gt;      menufile.Append(ID_FILE_QUIT, "&amp;amp;amp;QuittCtrl+Q")&lt;br /&gt;      menubar.Append(menufile, "&amp;amp;File")&lt;br /&gt;      # Event&lt;br /&gt;      self.Bind(wx.EVT_MENU, self.MenuFileQuit, id=ID_FILE_QUIT)&lt;br /&gt;    &lt;br /&gt;      # Menu : Database&lt;br /&gt;      menudatabase            = wx.Menu()&lt;br /&gt;      menudatabase.Append(ID_DATABASE_CONNECT, "C&amp;amp;onnecttF11")&lt;br /&gt;      menudatabase.Append(ID_DATABASE_DISCONNECT, "D&amp;amp;isconnecttF12")      &lt;br /&gt;      menudatabase.AppendSeparator()&lt;br /&gt;      menudatabase.Append(ID_DATABASE_CREATE, "&amp;amp;Create")&lt;br /&gt;      menudatabase.Append(ID_DATABASE_DROP, "&amp;amp;Drop")      &lt;br /&gt;      menudatabase.AppendSeparator()&lt;br /&gt;      menudatabase.Append(ID_DATABASE_REFRESH, "&amp;amp;RefreshtCtrl+R")&lt;br /&gt;    &lt;br /&gt;      menubar.Append(menudatabase, "&amp;amp;Database")&lt;br /&gt;      # Event&lt;br /&gt;      self.Bind(wx.EVT_MENU, self.MenuDatabaseConnect, id=ID_DATABASE_CONNECT)&lt;br /&gt;      self.Bind(wx.EVT_MENU, self.MenuDatabaseDisconnect, id=ID_DATABASE_DISCONNECT)&lt;br /&gt;      self.Bind(wx.EVT_MENU, self.MenuDatabaseCreate, id=ID_DATABASE_CREATE)&lt;br /&gt;      self.Bind(wx.EVT_MENU, self.MenuDatabaseDrop, id=ID_DATABASE_DROP)&lt;br /&gt;      self.Bind(wx.EVT_MENU, self.MenuDatabaseRefresh, id=ID_DATABASE_REFRESH)&lt;br /&gt;    &lt;br /&gt;      # Menu : Table&lt;br /&gt;      menutable               = wx.Menu()&lt;br /&gt;      menutable.Append(ID_TABLE_CREATE, "&amp;amp;amp;Create")&lt;br /&gt;      menutable.Append(ID_TABLE_DROP, "&amp;amp;Drop")&lt;br /&gt;&lt;br /&gt;      menubar.Append(menutable, "&amp;amp;Table")&lt;br /&gt;    &lt;br /&gt;      # Event&lt;br /&gt;      self.Bind(wx.EVT_MENU, self.MenuTableCreate, id=ID_TABLE_CREATE)&lt;br /&gt;      self.Bind(wx.EVT_MENU, self.MenuTableDrop, id=ID_TABLE_DROP)&lt;br /&gt;    &lt;br /&gt;      # Menu : Query&lt;br /&gt;      menuquery               = wx.Menu()&lt;br /&gt;      menuquery.Append(ID_QUERY_EXECUTE, "&amp;amp;ExecutetF5")&lt;br /&gt;    &lt;br /&gt;      menubar.Append(menuquery, "&amp;amp;Query")&lt;br /&gt;      # Event&lt;br /&gt;      self.Bind(wx.EVT_MENU, self.MenuQueryExecute, id=ID_QUERY_EXECUTE)&lt;br /&gt;    &lt;br /&gt;      # Menu : Help&lt;br /&gt;      menuhelp                = wx.Menu()&lt;br /&gt;      menuhelp.Append(ID_HELP_MANUAL, "&amp;amp;ManualtF1")&lt;br /&gt;      menuhelp.AppendSeparator()&lt;br /&gt;      menuhelp.Append(ID_HELP_ABOUT, "&amp;amp;About")&lt;br /&gt;      menubar.Append(menuhelp, "&amp;amp;Help")&lt;br /&gt;      # Event&lt;br /&gt;      self.Bind(wx.EVT_MENU, self.MenuHelpManual, id=ID_HELP_MANUAL)&lt;br /&gt;      self.Bind(wx.EVT_MENU, self.MenuHelpAbout, id=ID_HELP_ABOUT)&lt;br /&gt;    &lt;br /&gt;      self.SetMenuBar(menubar)&lt;br /&gt;    &lt;br /&gt;      # Status Bar&lt;br /&gt;      self.statusbar          = wx.StatusBar(self)&lt;br /&gt;      self.statusbar.SetFieldsCount(4)&lt;br /&gt;      widths                  = [-2, -1, 50, 50]&lt;br /&gt;      self.statusbar.SetStatusWidths(widths)&lt;br /&gt;      self.SetStatusBar(self.statusbar)&lt;br /&gt;    &lt;br /&gt;      self.statusbar.SetStatusText("No Database Selected", 1)&lt;br /&gt;    &lt;br /&gt;      # Split the Window&lt;br /&gt;      splitter1               = wx.SplitterWindow(self, style=self.style['splitter'])&lt;br /&gt;      splitter2               = wx.SplitterWindow(splitter1, style=self.style['splitter'])&lt;br /&gt;    &lt;br /&gt;      # TextCtrl&lt;br /&gt;      self.textctrl           = wx.TextCtrl(splitter2, -1, style=self.style['textctrl'])&lt;br /&gt;      self.textctrl.SetFocus()&lt;br /&gt;    &lt;br /&gt;      # Grid&lt;br /&gt;      self.grid               = gridlib.Grid(splitter2, -1)&lt;br /&gt;      self.grid.CreateGrid(1, 1)&lt;br /&gt;      self.grid.SetColLabelValue(0, "")&lt;br /&gt;      self.grid.SetRowLabelValue(0, "")&lt;br /&gt;      self.grid.EnableEditing(0)&lt;br /&gt;      self.grid.SetColLabelSize(20)&lt;br /&gt;      self.grid.SetRowLabelSize(0)&lt;br /&gt;      self.gridcols           = 0&lt;br /&gt;      self.gridrows           = 0&lt;br /&gt;    &lt;br /&gt;      # TreeCtrl&lt;br /&gt;      self.treectrl           = wx.TreeCtrl(splitter1, -1)&lt;br /&gt;    &lt;br /&gt;      self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnTreeSelChanged, self.treectrl)&lt;br /&gt;    &lt;br /&gt;      splitter2.SplitHorizontally(self.textctrl, self.grid, -275)&lt;br /&gt;      splitter1.SplitVertically(self.treectrl, splitter2, 150)&lt;br /&gt;      splitter1.SetMinimumPaneSize(20)&lt;br /&gt;      splitter2.SetMinimumPaneSize(20)      &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  def MenuFileQuit(self, event) :&lt;br /&gt;      """&lt;br /&gt;          Alt+F+Q or Ctrl+Q&lt;br /&gt;      """&lt;br /&gt;      self.Close()&lt;br /&gt;    &lt;br /&gt;      event.Skip()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  def MenuDatabaseConnect(self, event) :&lt;br /&gt;      """&lt;br /&gt;          Show the database connect dialog, Alt+D+O or F11&lt;br /&gt;      """&lt;br /&gt;    &lt;br /&gt;      dcd                     = DatabaseConnectDialog(self, -1, "Connect")&lt;br /&gt;      dcd.CenterOnScreen()&lt;br /&gt;      dcd.Show()&lt;br /&gt;    &lt;br /&gt;      if dcd.ShowModal() == wx.ID_OK :&lt;br /&gt;          _host = dcd.textctrlhost.GetValue()&lt;br /&gt;          _user = dcd.textctrlusername.GetValue()&lt;br /&gt;          _passwd = dcd.textctrlpassword.GetValue()&lt;br /&gt;        &lt;br /&gt;          if dcd.checkbox.IsChecked() == 0 :&lt;br /&gt;              # we need port as an integer&lt;br /&gt;              _port = int(dcd.textctrlport.GetValue())&lt;br /&gt;              self.DBConnect(_host, _user, _passwd, _port)        &lt;br /&gt;          else :&lt;br /&gt;              self.DBConnect(_host, _user, _passwd)&lt;br /&gt;&lt;br /&gt;      dcd.Destroy()&lt;br /&gt;    &lt;br /&gt;      event.Skip()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  def MenuDatabaseDisconnect(self, event) :&lt;br /&gt;      """&lt;br /&gt;          Alt+D+I or F11&lt;br /&gt;      """&lt;br /&gt;    &lt;br /&gt;      try :&lt;br /&gt;          self.DBClose()&lt;br /&gt;      except :&lt;br /&gt;          pass&lt;br /&gt;        &lt;br /&gt;      event.Skip()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  def MenuDatabaseCreate(self, event) :&lt;br /&gt;      """&lt;br /&gt;          Show the database create dialog, Alt+D+C or F11&lt;br /&gt;      """&lt;br /&gt;    &lt;br /&gt;      databasecreate = DatabaseCreateDialog(self, -1, "Create")&lt;br /&gt;      databasecreate.CenterOnScreen()&lt;br /&gt;      databasecreate.Show()&lt;br /&gt;    &lt;br /&gt;      if databasecreate.ShowModal() == wx.ID_OK :&lt;br /&gt;          self.ExecuteSQL(self.SplitSQL("CREATE DATABASE " + databasecreate.textctrl.GetValue()))&lt;br /&gt;    &lt;br /&gt;      databasecreate.Destroy()      &lt;br /&gt;    &lt;br /&gt;      event.Skip()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  def MenuDatabaseDrop(self, event) :&lt;br /&gt;      """&lt;br /&gt;          Show the database drop dialog, Alt+D+D or F11&lt;br /&gt;      """&lt;br /&gt;    &lt;br /&gt;      databasedrop = DatabaseDropDialog(self, -1, "Drop", self.databases)&lt;br /&gt;      databasedrop.CenterOnScreen()&lt;br /&gt;      databasedrop.Show()&lt;br /&gt;    &lt;br /&gt;      if databasedrop.ShowModal() == wx.ID_OK :&lt;br /&gt;          self.ExecuteSQL(self.SplitSQL("DROP DATABASE " + databasedrop.combobox.GetValue()))&lt;br /&gt;        &lt;br /&gt;      databasedrop.Destroy()&lt;br /&gt;    &lt;br /&gt;      event.Skip()&lt;br /&gt;        &lt;br /&gt;&lt;br /&gt;  def MenuDatabaseRefresh(self, event) :&lt;br /&gt;      """&lt;br /&gt;          Refresh database, get host, databases, and tables, Alt+D+R or Ctrl+R&lt;br /&gt;      """&lt;br /&gt;    &lt;br /&gt;      try :&lt;br /&gt;          rootitem = self.treectrl.GetItemText(self.treectrl.GetRootItem())&lt;br /&gt;          self.treectrl.DeleteAllItems()&lt;br /&gt;          self.DBGetDatabasesAndTables(rootitem)&lt;br /&gt;      except :&lt;br /&gt;          pass&lt;br /&gt;        &lt;br /&gt;      event.Skip()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  def MenuTableCreate(self, event) :&lt;br /&gt;      """&lt;br /&gt;          Show the table create dialog, Alt+T+C&lt;br /&gt;      """&lt;br /&gt;    &lt;br /&gt;      tablecreatedialog       = TableCreateDialog(self, -1, "Create Table", self.databases)&lt;br /&gt;      tablecreatedialog.CenterOnScreen()&lt;br /&gt;      tablecreatedialog.Show()&lt;br /&gt;    &lt;br /&gt;      if tablecreatedialog.ShowModal() == wx.ID_OK :&lt;br /&gt;          self.ExecuteSQL(self.SplitSQL(tablecreatedialog.textctrlsyntax.GetValue()))&lt;br /&gt;    &lt;br /&gt;      tablecreatedialog.ResetValue()&lt;br /&gt;      tablecreatedialog.Destroy()&lt;br /&gt;    &lt;br /&gt;      event.Skip()&lt;br /&gt;        &lt;br /&gt;    &lt;br /&gt;  def MenuTableDrop(self, event) :&lt;br /&gt;      """&lt;br /&gt;          Show the table drop dialog, Alt+T+D&lt;br /&gt;      """&lt;br /&gt;    &lt;br /&gt;      tabledrop = TableDropDialog(self, -1, "Drop Table", self.db, self.databases)&lt;br /&gt;      tabledrop.CenterOnScreen()&lt;br /&gt;      tabledrop.Show()&lt;br /&gt;    &lt;br /&gt;      if tabledrop.ShowModal() == wx.ID_OK :&lt;br /&gt;          self.ExecuteSQL(self.SplitSQL(tabledrop.dropsyntax))&lt;br /&gt;        &lt;br /&gt;      tabledrop.Destroy()&lt;br /&gt;    &lt;br /&gt;      event.Skip()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  def MenuQueryExecute(self, event) :&lt;br /&gt;      """&lt;br /&gt;          Execute query, Alt+Q+E or F5&lt;br /&gt;      """&lt;br /&gt;    &lt;br /&gt;      self.ExecuteSQL(self.SplitSQL(self.textctrl.GetValue()))&lt;br /&gt;    &lt;br /&gt;      event.Skip()  &lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;  def MenuHelpManual(self, event) :&lt;br /&gt;      """&lt;br /&gt;          Show the Manual, Alt+H+M or F1&lt;br /&gt;      """&lt;br /&gt;      helpmanual = HelpManual(self)&lt;br /&gt;      helpmanual.Show()&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;  def MenuHelpAbout(self, event) :&lt;br /&gt;      """&lt;br /&gt;          Show the About dialog, Alt+H+A&lt;br /&gt;      """&lt;br /&gt;    &lt;br /&gt;      helpabout               = HelpAbout(self, -1, "About")&lt;br /&gt;      helpabout.CenterOnScreen()&lt;br /&gt;      helpabout.Show()&lt;br /&gt;    &lt;br /&gt;      event.Skip()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  def DBConnect(self, _host, _user, _passwd, _port=3306) :&lt;br /&gt;      try :&lt;br /&gt;          self.db = MySQLdb.connect(host=_host, user=_user, passwd=_passwd, port=_port)&lt;br /&gt;          self.DBGetDatabasesAndTables(_host)&lt;br /&gt;      except MySQLdb.Error, details:&lt;br /&gt;          print "Error ", details&lt;br /&gt;        &lt;br /&gt;          if ERROR_MESSAGE :&lt;br /&gt;              err = ErrorMessageDialog(self, ("Error " + str(details)))&lt;br /&gt;              err.Show()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  def DBGetDatabasesAndTables(self, _host) :          &lt;br /&gt;      try :&lt;br /&gt;          self.treeroot = self.treectrl.AddRoot(_host)&lt;br /&gt;          self.db.query("""SHOW DATABASES""")&lt;br /&gt;          r = self.db.store_result()&lt;br /&gt;          fr = r.fetch_row(maxrows=0)&lt;br /&gt;    &lt;br /&gt;          self.databases = []&lt;br /&gt;          self.dbmap = {}&lt;br /&gt;          for i in fr :&lt;br /&gt;              self.databases.append(i[0])&lt;br /&gt;        &lt;br /&gt;          for i in self.databases :&lt;br /&gt;              d = self.treectrl.AppendItem(self.treeroot, i)&lt;br /&gt;              self.dbmap[i] = d&lt;br /&gt;              self.db.query("""USE """ + i)&lt;br /&gt;              self.db.query("""SHOW TABLES""")&lt;br /&gt;              rt = self.db.store_result()&lt;br /&gt;              frt = rt.fetch_row(maxrows=0)&lt;br /&gt;        &lt;br /&gt;              tables = []&lt;br /&gt;              for j in frt :&lt;br /&gt;                  tables.append(j[0])&lt;br /&gt;            &lt;br /&gt;              for j in tables :&lt;br /&gt;                  t = self.treectrl.AppendItem(d, j)&lt;br /&gt;            &lt;br /&gt;                  self.db.query("""DESCRIBE """ + j)&lt;br /&gt;                  rf = self.db.store_result()&lt;br /&gt;                  frf = rf.fetch_row(maxrows=0)&lt;br /&gt;                  field = []&lt;br /&gt;            &lt;br /&gt;                  for k in frf :&lt;br /&gt;                      field.append(k[0])&lt;br /&gt;            &lt;br /&gt;                  for k in field :&lt;br /&gt;                      fi = self.treectrl.AppendItem(t, k)&lt;br /&gt;          self.treectrl.Expand(self.treeroot)&lt;br /&gt;      except MySQLdb.Error, details :&lt;br /&gt;          print "Error ", details&lt;br /&gt;        &lt;br /&gt;          if ERROR_MESSAGE :&lt;br /&gt;              err = ErrorMessageDialog(self, ("Error " + str(details)))&lt;br /&gt;              err.Show()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  def DBClose(self) :&lt;br /&gt;      self.db.close()&lt;br /&gt;      self.treectrl.DeleteAllItems()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  def SplitSQL(self, sql) :&lt;br /&gt;      """&lt;br /&gt;          currently only supported the '#' comment&lt;br /&gt;      """&lt;br /&gt;    &lt;br /&gt;      sql = string.strip(sql)&lt;br /&gt;           &lt;br /&gt;      tup = []&lt;br /&gt;      b       = False&lt;br /&gt;    &lt;br /&gt;      # get the # and n location and place it in 'tup' list&lt;br /&gt;      for i in range(len(sql)) :&lt;br /&gt;          if sql[i] == "#" :&lt;br /&gt;              b = True&lt;br /&gt;              index = i&lt;br /&gt;            &lt;br /&gt;              while b :&lt;br /&gt;                  if index &amp;lt; len(sql) :&lt;br /&gt;                      if sql[index] == "n" :&lt;br /&gt;                          b = False&lt;br /&gt;                          front   = i&lt;br /&gt;                          end     = index&lt;br /&gt;                      index += 1&lt;br /&gt;                  else :&lt;br /&gt;                      b = False&lt;br /&gt;                      front   = i&lt;br /&gt;                      end     = index&lt;br /&gt;                &lt;br /&gt;              tup.append((front, end))&lt;br /&gt;              index = 0&lt;br /&gt;&lt;br /&gt;      tup2 = []&lt;br /&gt;    &lt;br /&gt;      # get char &amp;gt;= tup[i][0] and &amp;lt;= tup[i][1] and place it in tup2&lt;br /&gt;      for i in range(len(tup)) :&lt;br /&gt;          tup2.append("")&lt;br /&gt;        &lt;br /&gt;          for j in range(tup[i][0], tup[i][1]) :&lt;br /&gt;              tup2[i] += sql[j]&lt;br /&gt;            &lt;br /&gt;      # replace sql char with "" when it's found in tup2&lt;br /&gt;      for i in range(len(tup2)) :&lt;br /&gt;          try :&lt;br /&gt;              sql = string.replace(sql, tup2[i], "")&lt;br /&gt;          except :&lt;br /&gt;              pass&lt;br /&gt;        &lt;br /&gt;      # replace, split, strip, and return&lt;br /&gt;      sql = string.replace(sql, "n", "")&lt;br /&gt;      ret = sql.split(";")&lt;br /&gt;      for i in range(len(ret)) :&lt;br /&gt;          ret[i] = string.strip(ret[i])&lt;br /&gt;    &lt;br /&gt;      return ret&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;  def ExecuteSQL(self, sql=[]) :&lt;br /&gt;      query   = []&lt;br /&gt;      query   = sql&lt;br /&gt;    &lt;br /&gt;      success         = False&lt;br /&gt;      errormessage    = ""&lt;br /&gt;    &lt;br /&gt;      for q in range(len(query)) :&lt;br /&gt;          # MySQL command&lt;br /&gt;          command = query[q].split(" ", 1)&lt;br /&gt;        &lt;br /&gt;          if len(query[q]) &amp;gt; 0 :&lt;br /&gt;              # Set up the grid&lt;br /&gt;              self.grid.DeleteCols(0, self.gridcols, 1)&lt;br /&gt;              self.grid.DeleteRows(0, self.gridrows, 1)&lt;br /&gt;              self.grid.SetColLabelValue(0, "")&lt;br /&gt;              self.grid.SetColSize(0, self.grid.GetDefaultColSize())&lt;br /&gt;              self.grid.SetRowSize(0, self.grid.GetDefaultRowSize())&lt;br /&gt;              self.grid.ClearGrid()&lt;br /&gt;        &lt;br /&gt;              try :&lt;br /&gt;                  self.db.query(query[q])&lt;br /&gt;                  r = self.db.store_result()&lt;br /&gt;                  success = True&lt;br /&gt;                &lt;br /&gt;              except MySQLdb.Error, detail :&lt;br /&gt;                  success = False&lt;br /&gt;                  self.gridcols   = 0&lt;br /&gt;                  self.gridrows   = 0&lt;br /&gt;                  print "Error", detail&lt;br /&gt;                &lt;br /&gt;                  errormessage += query[q] + "nError " + str(detail) + "nnn"&lt;br /&gt;                &lt;br /&gt;            &lt;br /&gt;              if success :&lt;br /&gt;                  if command[0].upper() in has_result :&lt;br /&gt;                      f = r.fetch_row(maxrows=0, how=1)&lt;br /&gt;                      if len(f) &amp;gt;= 1 :&lt;br /&gt;                          self.gridcols = len(f[0].keys())&lt;br /&gt;                          self.gridrows = len(f)&lt;br /&gt;            &lt;br /&gt;                          self.grid.InsertCols(0, (self.gridcols - 1))&lt;br /&gt;                          for i in range(len(f[0].keys())) :&lt;br /&gt;                              self.grid.SetColLabelValue(i, f[0].keys()[i])&lt;br /&gt;                &lt;br /&gt;                          self.grid.InsertRows(1, len(f) - 1, 0)&lt;br /&gt;                          for i in range(len(f)) :&lt;br /&gt;                              for j in range(len(f[i].values())) :&lt;br /&gt;                                  if f[i].values()[j] == None :&lt;br /&gt;                                      self.grid.SetCellValue(i, j, "NULL")&lt;br /&gt;                                  else :&lt;br /&gt;                                      self.grid.SetCellValue(i, j, str(f[i].values()[j]))&lt;br /&gt;                        &lt;br /&gt;                          self.grid.AutoSizeColumns(1)&lt;br /&gt;                          self.grid.AutoSizeRows(1)&lt;br /&gt;                          self.gridcols = j&lt;br /&gt;                          self.gridrows = i&lt;br /&gt;                          self.statusbar.SetStatusText(str(self.gridrows + 1), 2)&lt;br /&gt;                &lt;br /&gt;                      else :&lt;br /&gt;                          self.gridcols   = 0&lt;br /&gt;                          self.gridrows   = 0&lt;br /&gt;                &lt;br /&gt;                  elif command[0].upper() in no_result :&lt;br /&gt;                      self.gridcols = 0&lt;br /&gt;                      self.gridrows = 0&lt;br /&gt;                      self.statusbar.SetStatusText("0", 2)&lt;br /&gt;            &lt;br /&gt;                      if command[0].upper() == 'USE' :&lt;br /&gt;                          try :&lt;br /&gt;                              item = self.dbmap[command[1].strip()]&lt;br /&gt;                              self.treectrl.SelectItem(item)&lt;br /&gt;                              self.treectrl.EnsureVisible(item)&lt;br /&gt;                              self.treectrl.Expand(item)&lt;br /&gt;                          except :&lt;br /&gt;                              pass&lt;br /&gt;                  else :&lt;br /&gt;                      self.gridcols   = 0&lt;br /&gt;                      self.gridrows   = 0&lt;br /&gt;                      m = "Sorry, not supported or not tested yet."&lt;br /&gt;                      print "Sorry, not supported or not tested yet."&lt;br /&gt;                    &lt;br /&gt;                      errormessage += query[q] + "n" + m&lt;br /&gt;&lt;br /&gt;              else :&lt;br /&gt;                  pass&lt;br /&gt;                &lt;br /&gt;      if ERROR_MESSAGE :&lt;br /&gt;          if len(errormessage) &amp;gt; 0 :&lt;br /&gt;              err = ErrorMessageDialog(self, errormessage)&lt;br /&gt;              err.Show()&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  def OnTreeSelChanged(self, event) :&lt;br /&gt;      dbname = self.treectrl.GetItemText(event.GetItem())&lt;br /&gt;    &lt;br /&gt;      if dbname in self.databases :&lt;br /&gt;          self.db.select_db(dbname)&lt;br /&gt;          self.statusbar.SetStatusText(str(dbname), 1)&lt;br /&gt;        &lt;br /&gt;      event.Skip()&lt;br /&gt;&lt;br /&gt;    &lt;br /&gt;  def OnCloseWindow(self, event):&lt;br /&gt;      try :&lt;br /&gt;          self.DBClose()&lt;br /&gt;      except :&lt;br /&gt;          pass&lt;br /&gt;         &lt;br /&gt;      self.Destroy()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    &lt;br /&gt;class MyApp(wx.App):&lt;br /&gt;  """&lt;br /&gt;      We must have it&lt;br /&gt;  """&lt;br /&gt;  def OnInit(self):&lt;br /&gt;      frame                   = MainFrame(None, __scriptname__)&lt;br /&gt;      frame.Show()&lt;br /&gt;      self.SetTopWindow(frame)&lt;br /&gt;      return True&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    &lt;br /&gt;def main():&lt;br /&gt;  app                         = MyApp(False)&lt;br /&gt;  app.MainLoop()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;if __name__ == "__main__":&lt;br /&gt;  main()&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4508963591103760027-1539052330457290212?l=yadhi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yadhi.blogspot.com/feeds/1539052330457290212/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4508963591103760027&amp;postID=1539052330457290212' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4508963591103760027/posts/default/1539052330457290212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4508963591103760027/posts/default/1539052330457290212'/><link rel='alternate' type='text/html' href='http://yadhi.blogspot.com/2007/04/usrbinenv-python-for-my-lovely-parent.html' title='MySQL-Simple-Query-Browser-0.1.10'/><author><name>yadhi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
