<?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-8889503345796134899</id><updated>2012-01-24T06:47:42.163-08:00</updated><category term='postgresql'/><category term='MySQL'/><category term='sql'/><category term='php'/><category term='html'/><category term='Constraints'/><category term='Solaris'/><category term='hash'/><category term='load'/><category term='code'/><category term='Perl'/><category term='DBI'/><category term='Java'/><category term='Oracle'/><category term='database'/><category term='backup'/><title type='text'>Learning MySQL / PostgreSQL and other stuff</title><subtitle type='html'>Just somewhere to keep my notes while I'm playing.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://mymymysql.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://mymymysql.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Tim</name><uri>http://www.blogger.com/profile/06805212306986685899</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://1.bp.blogspot.com/_GWztxWEQGnI/SnLAhgJmFCI/AAAAAAAAAEU/1ieqd3aplzo/S220/DSC00082.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>45</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8889503345796134899.post-6700339382623885665</id><published>2011-12-06T08:59:00.001-08:00</published><updated>2011-12-07T07:44:51.546-08:00</updated><title type='text'>Solaris 11 Package Updates</title><content type='html'>&lt;b&gt;Using a Solaris 11 Repository&lt;/b&gt; &lt;br /&gt;Solaris 11 has moved to a package management system that is similar to yum, in that is pulls from a network and manages dependencies.&lt;br /&gt;The command used is pkg  - enter &lt;i&gt;pkg --help&lt;/i&gt; for a full list of options. &lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;root@solaris:~# &lt;span style="background-color: yellow;"&gt;pkg publisher&lt;/span&gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;PUBLISHER&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TYPE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; STATUS&amp;nbsp;&amp;nbsp; URI&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;solaris&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; origin&amp;nbsp;&amp;nbsp; online&amp;nbsp;&amp;nbsp; http://pkg.oracle.com/solaris/release/&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;root@solaris:~# &lt;span style="background-color: yellow;"&gt;pkgrepo info -s http://pkg.oracle.com/solaris/release/&lt;/span&gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;PUBLISHER PACKAGES STATUS&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UPDATED&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;solaris&amp;nbsp;&amp;nbsp; 4292&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; online&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2011-11-09T15:42:00.183118Z&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;root@solaris:~# &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;root@solaris:~# &lt;span style="background-color: yellow;"&gt;pkg update&lt;/span&gt;&lt;br /&gt;No updates available for this image.&lt;br /&gt;root@solaris:~#&lt;/span&gt;&lt;/blockquote&gt;Before you install a package you can dry-run it:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;root@solaris:~# &lt;span style="background-color: yellow;"&gt;pkg install &lt;span style="background-color: red;"&gt;-nv&lt;/span&gt; gcc-3&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Packages to install:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Estimated space available:&amp;nbsp;&amp;nbsp; 9.67 GB&lt;br /&gt;Estimated space to be consumed: 219.43 MB&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Create boot environment:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; No&lt;br /&gt;Create backup boot environment:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; No&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Services to change:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Rebuild boot archive:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; No&lt;br /&gt;&lt;br /&gt;Changed packages:&lt;br /&gt;solaris&lt;br /&gt;&amp;nbsp; developer/gcc-3&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; None -&amp;gt; 3.4.3,5.11-0.175.0.0.0.2.537:20111019T093736Z&lt;br /&gt;&amp;nbsp; developer/gnu-binutils&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; None -&amp;gt; 2.19,5.11-0.175.0.0.0.2.537:20111019T095434Z&lt;br /&gt;Services:&lt;br /&gt;&amp;nbsp; restart_fmri:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; svc:/application/texinfo-update:default&lt;br /&gt;root@solaris:~# &lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;The you go ahead and install the package:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;span style="font-family: 'Courier New',Courier,monospace; font-size: xx-small;"&gt;&amp;nbsp;root@solaris:~# &lt;span style="background-color: yellow;"&gt;pkg install -nv gcc-3&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Packages to install:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Estimated space available:&amp;nbsp;&amp;nbsp; 9.67 GB&lt;br /&gt;Estimated space to be consumed: 219.43 MB&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Create boot environment:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; No&lt;br /&gt;Create backup boot environment:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; No&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Services to change:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Rebuild boot archive:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; No&lt;br /&gt;&lt;br /&gt;Changed packages:&lt;br /&gt;solaris&lt;br /&gt;&amp;nbsp; developer/gcc-3&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; None -&amp;gt; 3.4.3,5.11-0.175.0.0.0.2.537:20111019T093736Z&lt;br /&gt;&amp;nbsp; developer/gnu-binutils&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; None -&amp;gt; 2.19,5.11-0.175.0.0.0.2.537:20111019T095434Z&lt;br /&gt;Services:&lt;br /&gt;&amp;nbsp; restart_fmri:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; svc:/application/texinfo-update:default&lt;br /&gt;root@solaris:~# &lt;/span&gt;&lt;/blockquote&gt;&amp;nbsp;To list the packages that you have installed:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: xx-small;"&gt;timj@solaris11vm2:~$ &lt;span style="background-color: yellow;"&gt;pkg list | head&lt;/span&gt;&lt;br /&gt;NAME (PUBLISHER)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; VERSION&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IFO&lt;br /&gt;SUNWcs&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0.5.11-0.170&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; i-r&lt;br /&gt;archiver/gnu-tar&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1.26-0.175.0.0.0.2.537&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; i--&lt;br /&gt;audio/audio-utilities&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0.5.11-0.175.0.0.0.2.1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; i--&lt;br /&gt;codec/flac&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1.2.1-0.175.0.0.0.0.0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; i--&lt;br /&gt;codec/libtheora&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1.1.1-0.175.0.0.0.0.0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; i--&lt;br /&gt;codec/ogg-vorbis&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2.30.0-0.175.0.0.0.0.0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; i--&lt;br /&gt;codec/speex&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1.2-0.175.0.0.0.0.0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; i--&lt;br /&gt;communication/im/pidgin&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2.10.0-0.175.0.0.0.0.0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; i--&lt;br /&gt;compress/bzip2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1.0.6-0.175.0.0.0.2.537&amp;nbsp;&amp;nbsp;&amp;nbsp; i--&lt;br /&gt;timj@solaris11vm2:~$ &lt;/span&gt;&lt;/blockquote&gt;To list the details of a package:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: xx-small;"&gt;timj@solaris11vm2:~$ &lt;span style="background-color: yellow;"&gt;pkg info xcalc&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Name: x11/xcalc&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Summary: xcalc - scientific calculator for X&lt;br /&gt;&amp;nbsp;&amp;nbsp; Description: xcalc is a scientific calculator desktop accessory that can&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; emulate a TI-30 or an HP-10C.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Category: Applications/Accessories&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; State: Installed&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Publisher: solaris&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Version: 1.0.4.1&lt;br /&gt;&amp;nbsp;Build Release: 5.11&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Branch: 0.175.0.0.0.0.1215&lt;br /&gt;Packaging Date: September 27, 2011 12:58:35 PM &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Size: 104.32 kB&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FMRI: pkg://solaris/x11/xcalc@1.0.4.1,5.11-0.175.0.0.0.0.1215:20110927T125835Z&lt;br /&gt;timj@solaris11vm2:~$ &lt;/span&gt;&lt;/blockquote&gt;Want to know where a file comes from?:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;timj@solaris11vm1:~$ &lt;span style="background-color: yellow;"&gt;pkg search libresolv.so&lt;/span&gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;INDEX&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ACTION VALUE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PACKAGE&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;basename&amp;nbsp;&amp;nbsp; link&amp;nbsp;&amp;nbsp; lib/sparcv9/libresolv.so&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pkg:/system/library@0.5.11-0.175.0.0.0.2.1&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;basename&amp;nbsp;&amp;nbsp; link&amp;nbsp;&amp;nbsp; usr/lib/sparcv9/libresolv.so pkg:/system/library@0.5.11-0.175.0.0.0.2.1&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;basename&amp;nbsp;&amp;nbsp; link&amp;nbsp;&amp;nbsp; lib/libresolv.so&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pkg:/system/library@0.5.11-0.175.0.0.0.2.1&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;basename&amp;nbsp;&amp;nbsp; link&amp;nbsp;&amp;nbsp; usr/lib/amd64/libresolv.so&amp;nbsp;&amp;nbsp; pkg:/system/library@0.5.11-0.175.0.0.0.2.1&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;basename&amp;nbsp;&amp;nbsp; link&amp;nbsp;&amp;nbsp; lib/amd64/libresolv.so&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pkg:/system/library@0.5.11-0.175.0.0.0.2.1&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;basename&amp;nbsp;&amp;nbsp; link&amp;nbsp;&amp;nbsp; usr/lib/libresolv.so&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pkg:/system/library@0.5.11-0.175.0.0.0.2.1&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;timj@solaris11vm1:~$ &lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;To update all packages:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: xx-small;"&gt;root@solaris11vm1:~# &lt;span style="background-color: yellow;"&gt;pkg update&lt;/span&gt;&lt;br /&gt;No updates available for this image.&lt;br /&gt;root@solaris11vm1:~#&amp;nbsp; &lt;/span&gt;&lt;/blockquote&gt;What to do when things go wrong:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: xx-small;"&gt;root@solaris11vm1:~# &lt;span style="background-color: yellow;"&gt;pkg verify -v&amp;nbsp;&amp;nbsp; gcc-3&lt;/span&gt;&lt;br /&gt;PACKAGE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; STATUS &lt;br /&gt;pkg://solaris/developer/gcc-3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OK&lt;br /&gt;root@solaris11vm1:~# &lt;span style="background-color: yellow;"&gt;mkfile 1024 /usr/sfw/bin/gcc&lt;/span&gt;&lt;br /&gt;root@solaris11vm1:~# &lt;span style="background-color: yellow;"&gt;pkg verify -v&amp;nbsp;&amp;nbsp; gcc-3&lt;/span&gt;&lt;br /&gt;PACKAGE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; STATUS &lt;br /&gt;pkg://solaris/developer/gcc-3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ERROR&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; file: usr/sfw/bin/i386-pc-solaris2.11-gcc-3.4.3&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Mode: 01600 should be 0555&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Unexpected Exception: Request error: class file/memory mismatch&lt;br /&gt;root@solaris11vm1:~# &lt;span style="background-color: yellow;"&gt;pkg fix&amp;nbsp;&amp;nbsp; gcc-3&lt;/span&gt;&lt;br /&gt;Verifying: pkg://solaris/developer/gcc-3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ERROR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; file: usr/sfw/bin/i386-pc-solaris2.11-gcc-3.4.3&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Mode: 01600 should be 0555&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Unexpected Exception: Request error: class file/memory mismatch&lt;br /&gt;Created ZFS snapshot: 2011-12-07-15:27:53&lt;br /&gt;Repairing: pkg://solaris/developer/gcc-3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;DOWNLOAD&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PKGS&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FILES&amp;nbsp;&amp;nbsp;&amp;nbsp; XFER (MB)&lt;br /&gt;Completed&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1/1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1/1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0.1/0.1&lt;br /&gt;&lt;br /&gt;PHASE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ACTIONS&lt;br /&gt;Update Phase&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3/3&lt;br /&gt;&lt;br /&gt;PHASE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ITEMS&lt;br /&gt;Image State Update Phase&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2/2 &lt;br /&gt;root@solaris11vm1:~# &lt;span style="background-color: yellow;"&gt;pkg verify -v&amp;nbsp;&amp;nbsp; gcc-3&lt;/span&gt;&lt;br /&gt;PACKAGE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; STATUS &lt;br /&gt;pkg://solaris/developer/gcc-3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OK&lt;br /&gt;root@solaris11vm1:~# &lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8889503345796134899-6700339382623885665?l=mymymysql.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mymymysql.blogspot.com/feeds/6700339382623885665/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8889503345796134899&amp;postID=6700339382623885665' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/6700339382623885665'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/6700339382623885665'/><link rel='alternate' type='text/html' href='http://mymymysql.blogspot.com/2011/12/solaris-11-package-updates.html' title='Solaris 11 Package Updates'/><author><name>Tim</name><uri>http://www.blogger.com/profile/06805212306986685899</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://1.bp.blogspot.com/_GWztxWEQGnI/SnLAhgJmFCI/AAAAAAAAAEU/1ieqd3aplzo/S220/DSC00082.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8889503345796134899.post-7736506177024016426</id><published>2010-12-16T14:04:00.000-08:00</published><updated>2010-12-16T14:09:36.780-08:00</updated><title type='text'>Mail merge in PHP</title><content type='html'>&lt;span style="font-size: large;"&gt;Just for a laugh&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The question was, how do you do a mail merge in PHP. OK, it was a question that no-one was asking, but I never let the deter me before.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;table bgcolor="lightyellow"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;b&gt;Input Data&lt;/b&gt;&lt;/div&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ cat inputdata&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Tim,Jinkerson,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Ben,De Mora,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Jes,Ferrier,&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;tjinkers@TJINKERS-GB ~/merge&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ cat template&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;FAO: .f1 .f2&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Dear .f1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Now is the winter of our discontent &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;made glorious summer by this sun of York&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Many thanks&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Tim&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;tjinkers@TJINKERS-GB ~/merge&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;b&gt;The Program&lt;/b&gt;&lt;/div&gt;&lt;table bgcolor="lightyellow"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ cat mymerge.php&lt;br /&gt;$filename = "template";&lt;br /&gt;$mergef = "inputdata";&lt;br /&gt;$fdm = fopen($mergef,"r");&lt;br /&gt;$fnum=1;&lt;br /&gt;$mdata = fgets($fdm, 512);&lt;br /&gt;while (!feof($fdm))&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; list($f1, $f2, $f3, $f4, $f5) = explode(",", $mdata);&lt;br /&gt;&amp;nbsp; $fd = fopen($filename,"r");&lt;br /&gt;&amp;nbsp; $contents = fread ($fd, filesize($filename));&lt;br /&gt;&amp;nbsp; fclose ($fd);&lt;br /&gt;&amp;nbsp; $ofilename = "file.".$f1.".".$f2.".".$fnum;&lt;br /&gt;&amp;nbsp; $contents=str_replace(".f1", $f1, $contents);&lt;br /&gt;&amp;nbsp; $contents=str_replace(".f2", $f2, $contents);&lt;br /&gt;&amp;nbsp; $contents=str_replace(".f3", $f3, $contents);&lt;br /&gt;&amp;nbsp; $contents=str_replace(".f4", $f4, $contents);&lt;br /&gt;&amp;nbsp; $contents=str_replace(".f5", $f5, $contents);&lt;br /&gt;&amp;nbsp; $fdo = fopen($ofilename,"w");&lt;br /&gt;&amp;nbsp; fwrite ($fdo,$contents);&lt;br /&gt;&amp;nbsp; fclose ($fdo);&lt;br /&gt;&amp;nbsp; $fnum++;&lt;br /&gt;&amp;nbsp; $mdata = fgets($fdm, 512);&lt;br /&gt;}&lt;br /&gt;fclose ($mergef);&lt;br /&gt;?&amp;gt; &lt;br /&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;tjinkers@TJINKERS-GB ~/merge&lt;br /&gt;$ &lt;/blockquote&gt;For each line of the input data, the program reads the template file as a single string, and then does a replace on the markers for the input date. It writes the results out to a file who's name is based on the input data.&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;table bgcolor="lightyellow"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;$ php mymerge.php&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ ls&lt;br /&gt;file.Ben.De Mora.2&amp;nbsp; file.Jes.Ferrier.3&amp;nbsp; file.Tim.Jinkerson.1&amp;nbsp; inputdata&amp;nbsp; mymerge.php&amp;nbsp; template&lt;br /&gt;&lt;br /&gt;tjinkers@TJINKERS-GB ~/merge&lt;br /&gt;$ cat file.Tim.Jinkerson.1&lt;br /&gt;FAO: Tim Jinkerson&lt;br /&gt;Dear Tim&lt;br /&gt;Now is the winter of our discontent &lt;br /&gt;made glorious summer by this sun of York&lt;br /&gt;Many thanks&lt;br /&gt;Tim&lt;br /&gt;&lt;br /&gt;tjinkers@TJINKERS-GB ~/merge&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;$ &lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8889503345796134899-7736506177024016426?l=mymymysql.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mymymysql.blogspot.com/feeds/7736506177024016426/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8889503345796134899&amp;postID=7736506177024016426' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/7736506177024016426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/7736506177024016426'/><link rel='alternate' type='text/html' href='http://mymymysql.blogspot.com/2010/12/mail-merge-in-php.html' title='Mail merge in PHP'/><author><name>Tim</name><uri>http://www.blogger.com/profile/06805212306986685899</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://1.bp.blogspot.com/_GWztxWEQGnI/SnLAhgJmFCI/AAAAAAAAAEU/1ieqd3aplzo/S220/DSC00082.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8889503345796134899.post-6474718903102406303</id><published>2010-10-25T08:04:00.000-07:00</published><updated>2010-10-25T08:04:37.310-07:00</updated><title type='text'>Creating a Solaris 10 Sparse Zone</title><content type='html'>&amp;nbsp;First, create a directory for your zone to be built in.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;mkdir -p /zones/myzone&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;Create a zone config file.&lt;br /&gt;&lt;blockquote&gt;create -b&lt;br /&gt;set zonepath=/zones/myzone&lt;br /&gt;set autoboot=true&lt;br /&gt;add inherit-pkg-dir&lt;br /&gt;set dir=/lib&lt;br /&gt;end&lt;br /&gt;add inherit-pkg-dir&lt;br /&gt;set dir=/platform&lt;br /&gt;end&lt;br /&gt;add inherit-pkg-dir&lt;br /&gt;set dir=/sbin&lt;br /&gt;end&lt;br /&gt;add inherit-pkg-dir&lt;br /&gt;set dir=/usr&lt;br /&gt;end&lt;br /&gt;add net&lt;br /&gt;set address=10.0.2.17/24&lt;br /&gt;set physical=hme0&lt;br /&gt;end&lt;/blockquote&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;zonecfg -z myzone -f sparsezone.cfg&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;zoneadm -z myzone install&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;zoneadm list -v&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;zlogin -C myzone&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;zlogin myzone shutdown -y -i0 -g0&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8889503345796134899-6474718903102406303?l=mymymysql.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mymymysql.blogspot.com/feeds/6474718903102406303/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8889503345796134899&amp;postID=6474718903102406303' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/6474718903102406303'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/6474718903102406303'/><link rel='alternate' type='text/html' href='http://mymymysql.blogspot.com/2010/10/creating-solaris-10-sparse-zone.html' title='Creating a Solaris 10 Sparse Zone'/><author><name>Tim</name><uri>http://www.blogger.com/profile/06805212306986685899</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://1.bp.blogspot.com/_GWztxWEQGnI/SnLAhgJmFCI/AAAAAAAAAEU/1ieqd3aplzo/S220/DSC00082.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8889503345796134899.post-13956193684621220</id><published>2010-10-21T04:39:00.000-07:00</published><updated>2010-10-21T06:38:59.835-07:00</updated><title type='text'>Creating a second database from the linux command line</title><content type='html'>The objective&amp;nbsp; here was to make a copy of an existing database and bring it up under a new instance. I could in theory have used a different version of the database but at the time I only had one available to me.&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Create a new database:&lt;/b&gt;&lt;br /&gt;&lt;blockquote&gt;su - root&lt;br /&gt;mkdir /var/lib/postgresql/testinstance&lt;br /&gt;chown postgres:postgres /var/lib/postgresql/testinstance&lt;br /&gt;su - postgres&lt;br /&gt;initdb -D /var/lib/postgresql/testinstance&lt;/blockquote&gt;&lt;br /&gt;&lt;b&gt;Starting the Instance&lt;/b&gt;&lt;br /&gt;&lt;blockquote&gt;pg_ctl start -D /var/lib/postgresql/testinstance -l /var/tmp/testinstance.log -o "-p 5434"&lt;/blockquote&gt;&lt;b&gt;Check the status:&lt;/b&gt;&lt;br /&gt;&lt;blockquote&gt;pg_ctl status -D /var/lib/postgresql/testinstance&lt;/blockquote&gt;&lt;b&gt;Stopping the Instance&lt;/b&gt;&lt;br /&gt;&lt;blockquote&gt;pg_ctl stop -D /var/lib/postgresql/testinstance&lt;/blockquote&gt;&lt;b&gt;Create user on new database:&lt;/b&gt;&lt;br /&gt;&lt;blockquote&gt;create role timj login password 'xxxxxx';&lt;br /&gt;create database cddb;&lt;br /&gt;alter role timj superuser;&lt;br /&gt;alter role timj nosuperuser;&lt;br /&gt;grant all on database cddb to timj;&lt;/blockquote&gt;&lt;br /&gt;&lt;b&gt;Connecting to the database:&lt;/b&gt;&lt;br /&gt;&lt;blockquote&gt;psql -d postgres -h localhost -p 5434 -U postgres&lt;/blockquote&gt;&lt;b&gt;Dump the old database:&lt;/b&gt;&lt;br /&gt;&lt;blockquote&gt;/usr/bin/pg_dump -h localhost -p 5432 -U timj -F p -v -f "/tmp/mybackup.pgsql" cddb&lt;/blockquote&gt;&lt;b&gt;Restore to new database:&lt;/b&gt;&lt;br /&gt;&lt;blockquote&gt;psql -h localhost -p 5434 -U timj -d cddb &amp;lt; /tmp/mybackup.pgsql&lt;/blockquote&gt;&lt;b&gt;Dumping database in custom mode:&lt;/b&gt;&lt;br /&gt;&lt;blockquote&gt;/usr/bin/pg_dump -h localhost -p 5432 -U timj -F c -v -f "/tmp/mybackup.pgsqlc" cddb&lt;/blockquote&gt;&lt;b&gt;Use pg_restore if you have a non-ascii backup:&lt;/b&gt;&lt;br /&gt;&lt;blockquote&gt;create role timj login password 'xxxxxx';&lt;br /&gt;create database cddb;&lt;br /&gt;grant all on database cddb to timj;&lt;br /&gt;pg_restore -h localhost -p 5434 -U timj -d cddb /tmp/mybackup.pgsqlc&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8889503345796134899-13956193684621220?l=mymymysql.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mymymysql.blogspot.com/feeds/13956193684621220/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8889503345796134899&amp;postID=13956193684621220' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/13956193684621220'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/13956193684621220'/><link rel='alternate' type='text/html' href='http://mymymysql.blogspot.com/2010/10/creating-second-database-from-linux.html' title='Creating a second database from the linux command line'/><author><name>Tim</name><uri>http://www.blogger.com/profile/06805212306986685899</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://1.bp.blogspot.com/_GWztxWEQGnI/SnLAhgJmFCI/AAAAAAAAAEU/1ieqd3aplzo/S220/DSC00082.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8889503345796134899.post-3279064444299524843</id><published>2009-12-22T08:54:00.000-08:00</published><updated>2010-01-26T07:38:56.094-08:00</updated><title type='text'>Point-In-Time Recover in Postgresql</title><content type='html'>The way you do point in time recovery in Postgresql is to restore a known backup, and then reapply WAL logs until you reach the time you wish to stop at. The database must be in Archive Log Mode (just like Oracle), and you must have all the logs to complete the recovery.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Putting the database in Archive Log Mode&lt;/h2&gt;&lt;br /&gt;Step 1:&lt;br /&gt;Back up your database&lt;br /&gt;pg_dump -h localhost -p 5432 -U timj -F c -v -f "D:\pgbackup\cddb_21Dec2009_2.backup" cddb&lt;br /&gt;&lt;br /&gt;Now let's put the database in archive log mode:&lt;br /&gt;&lt;br /&gt;Edit postgresql.conf:&lt;br /&gt;&lt;blockquote&gt;fsync = on&lt;br /&gt;synchronous_commit = on&lt;br /&gt;wal_sync_method = fsync&lt;br /&gt;full_page_writes = on&lt;br /&gt;archive_mode = on&lt;br /&gt;archive_command = 'copy "%p" "D:\\pglogs\\%f"'&lt;br /&gt;archive_timeout = 3600 # switch logs every hour&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;And remember to bounce the database.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Taking a base backup&lt;/h2&gt;&lt;br /&gt;I now have to take a base backup of my system. &lt;br /&gt;To do this I logged in as postgres and issued the following:&lt;br /&gt;&lt;b&gt;SELECT pg_start_backup('label2');&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I backed the database up using a normal file system backup with the datbase up, and then issued:&lt;br /&gt;&lt;b&gt;SELECT pg_stop_backup();&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Next - put in a transaction that we will want recovering:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;insert into artist (name) values ('Vicky Beeching');&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;As this is my first time doing this, I forced a log switch to help with the recovery!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;SELECT pg_switch_xlog();&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;The Disaster!&lt;/h2&gt;After my backup, I created a record in the artist table that should be there post recovery. The table has a time trigger on it, so I knew exactky the time I wanted to recover to. I then deleted Nick Drake's entry from the artist table - could there be a bigger mistake than that!&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;The Recovery&lt;/h2&gt;&lt;b&gt;Step 1: Take the database down.&lt;/b&gt; This may seem like the obvious first step, but there is a gotchya. The default checkpoint time-out in Postgresql is 5 minutes. This means that if you are relying on recoving your database up to the last good transaction, and if that transaction was less than 5 minutes before hand, it may not have been written to a log file in the pg_xlog directory. Therefore, it may be worth while logging on as an admin user and issuing the command &lt;b&gt;checkpoint;&lt;/b&gt; before you shut down the instance.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Step 2: Take a backup!&lt;/b&gt;&lt;br /&gt;With the database down, copy off the data directory and any other tablespaces you have in use.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Step 3: Delete your database!&lt;/b&gt;&lt;br /&gt;We are going to rebuild the database using the good copy we created in our initial backup, the archived WAL logs and the WAL logs from pg_xlog, so we need to get rid of everything in the existing database.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Step 4: Copy across your backed up database&lt;/b&gt;&lt;br /&gt;Copy your good backup into the live data directory.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Step 5: Delete everything from pg_xlog&lt;/b&gt;&lt;br /&gt;The files in the restored pg_xlog directory will be from before the backup, and so of no use to you.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Step 6: Copy across the content of your pg_xlog directory&lt;/b&gt;&lt;br /&gt;From the backup you took after you discovered you needed to recover, copy the files to your live pg_xlog directory.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Step 7: Create a recovery.conf file&lt;/b&gt;&lt;br /&gt;Something like this:&lt;br /&gt;&lt;blockquote&gt;restore_command = 'copy "D:\\pglogs\\%f" "%p"'  # Windows&lt;br /&gt;recovery_target_time ('2009-12-22 15:34:56')&lt;br /&gt;&lt;/blockquote&gt;The copy command should be in the syntax of whatever OS you are using, very much like the entry in postgresql.conf&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Step 8: Restart the database&lt;/b&gt;&lt;br /&gt;You might want to restrict who can access while you are checking the recovery.&lt;br /&gt;At the end of the recovery recovery.conf is renamed recovery.done&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Step 9: Take a fresh baseline baclup!&lt;/b&gt;&lt;br /&gt;It is really good practice to do this before your users start posting transactions, if at all possible.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8889503345796134899-3279064444299524843?l=mymymysql.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mymymysql.blogspot.com/feeds/3279064444299524843/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8889503345796134899&amp;postID=3279064444299524843' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/3279064444299524843'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/3279064444299524843'/><link rel='alternate' type='text/html' href='http://mymymysql.blogspot.com/2009/12/point-in-time-recover-in-postgresql.html' title='Point-In-Time Recover in Postgresql'/><author><name>Tim</name><uri>http://www.blogger.com/profile/06805212306986685899</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://1.bp.blogspot.com/_GWztxWEQGnI/SnLAhgJmFCI/AAAAAAAAAEU/1ieqd3aplzo/S220/DSC00082.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8889503345796134899.post-6709596823938070024</id><published>2009-11-19T04:22:00.001-08:00</published><updated>2009-11-19T04:22:58.051-08:00</updated><title type='text'>Solaris 10 CPU Usage</title><content type='html'>&lt;p&gt;psrinfo shows how many CPUs you have:&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2" width="400" border="1"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="398" bgcolor="#669999"&gt;         &lt;p&gt;bash-3.00# psrinfo            &lt;br /&gt;0&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; on-line&amp;#160;&amp;#160; since 08/24/2009 13:40:13             &lt;br /&gt;1&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; on-line&amp;#160;&amp;#160; since 08/24/2009 13:40:18             &lt;br /&gt;2&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; on-line&amp;#160;&amp;#160; since 08/24/2009 13:40:18             &lt;br /&gt;3&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; on-line&amp;#160;&amp;#160; since 08/24/2009 13:40:18             &lt;br /&gt;4&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; on-line&amp;#160;&amp;#160; since 08/24/2009 13:40:18             &lt;br /&gt;5&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; on-line&amp;#160;&amp;#160; since 08/24/2009 13:40:18             &lt;br /&gt;6&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; on-line&amp;#160;&amp;#160; since 08/24/2009 13:40:18             &lt;br /&gt;7&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; on-line&amp;#160;&amp;#160; since 08/24/2009 13:40:18             &lt;br /&gt;8&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; on-line&amp;#160;&amp;#160; since 08/24/2009 13:40:18&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;adding the –v option gives you details about those CPUs&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2" width="400" border="1"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="398" bgcolor="#669999"&gt;         &lt;p&gt;bash-3.00# psrinfo -v | head            &lt;br /&gt;Status of virtual processor 0 as of: 11/19/2009 03:50:06             &lt;br /&gt;&amp;#160; on-line since 08/24/2009 13:40:13.             &lt;br /&gt;&amp;#160; The sparcv9 processor operates at 1165 MHz,             &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; and has a sparcv9 floating point processor.             &lt;br /&gt;Status of virtual processor 1 as of: 11/19/2009 03:50:06             &lt;br /&gt;&amp;#160; on-line since 08/24/2009 13:40:18.             &lt;br /&gt;&amp;#160; The sparcv9 processor operates at 1165 MHz,             &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; and has a sparcv9 floating point processor.             &lt;br /&gt;Status of virtual processor 2 as of: 11/19/2009 03:50:06             &lt;br /&gt;&amp;#160; on-line since 08/24/2009 13:40:18.             &lt;br /&gt;bash-3.00# &lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;“prstat -s cpu -n 10” is a bit like top, but it tells you what cpu you are running against&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2" width="600" border="0"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="598" bgcolor="#669999"&gt;         &lt;pre&gt;bash-3.00# prstat -s cpu -n 10&lt;br /&gt;   PID USERNAME  SIZE   RSS STATE  PRI NICE      TIME  CPU PROCESS/NLWP&lt;br /&gt;  3138 900233    895M  588M cpu16    1    0 141:24:49 1.7% mysqld/26&lt;br /&gt;  1005 root       19M   18M sleep   59    0  38:34:21 0.0% esd/1&lt;br /&gt;   944 daemon   3192K 2208K sleep   29    0   0:00:00 0.0% statd/1&lt;br /&gt;   542 root     1768K  256K sleep   29    0   0:00:00 0.0% efdaemon/1&lt;br /&gt;  8633 root     1712K 1168K sleep    1    0   0:00:16 0.0% utmpd/1&lt;br /&gt;   165 root     7568K 4920K sleep   29    0   0:00:00 0.0% devfsadm/8&lt;br /&gt;   940 root     2992K 2136K sleep   29    0   0:00:00 0.0% keyserv/3&lt;br /&gt;   147 root     7464K 4472K sleep   29    0   0:00:00 0.0% syseventd/15&lt;br /&gt;     9 root       11M   11M sleep   29    0   1:00:07 0.0% svc.configd/12&lt;br /&gt;     7 root       32M   31M sleep   29    0   0:04:45 0.0% svc.startd/13&lt;br /&gt;Total: 129 processes, 541 lwps, load averages: 1.12, 1.14, 1.18&lt;br /&gt;bash-3.00# &lt;/pre&gt;&lt;br /&gt;        &lt;font face="Courier New"&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;        &lt;p&gt;&lt;/p&gt;&lt;br /&gt;      &lt;/td&gt;&lt;br /&gt;    &lt;/tr&gt;&lt;br /&gt;  &lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;You can the use the mpstat command to see how each processor is doing:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;table cellspacing="0" cellpadding="2" width="600" border="1"&gt;&lt;tbody&gt;&lt;br /&gt;    &lt;tr&gt;&lt;br /&gt;      &lt;td valign="top" width="600" bgcolor="#669999"&gt;&lt;br /&gt;        &lt;pre&gt;bash-3.00# mpstat          &lt;br /&gt;CPU minf mjf xcal  intr ithr  csw icsw migr smtx  srw syscl  usr sys  wt idl&lt;br /&gt;  0   80   0  566   264   53   50    0    2    9    0   203    2   2   0  96&lt;br /&gt;  1    1   0  193    15    2   25    0    0    1    0    57    0   0   0  99&lt;br /&gt;  2    0   0   48     8    0   15    0    0    0    0    12    0   0   0 100&lt;br /&gt;  3    0   0    8     3    0    5    0    0    0    0     4    0   0   0 100&lt;br /&gt;  4   15   0   72     8    0   15    0    0    2    0    33    0   0   0  99&lt;br /&gt;  5    0   0    4     3    0    4    0    0    0    0     1    0   0   0 100&lt;br /&gt;  6    0   0    5     7    1   10    0    0    0    0     0    0   0   0 100&lt;br /&gt;  7    0   0    5     6    0    9    0    0    0    0     0    0   0   0 100&lt;br /&gt;  8   64   0  369    22    0   47    0    2    7    0   185    3   1   0  96&lt;br /&gt;  9    3   0   73     3    0    6    0    0    1    0    22    0   0   0 100&lt;/pre&gt;&lt;br /&gt;      &lt;/td&gt;&lt;br /&gt;    &lt;/tr&gt;&lt;br /&gt;  &lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;“&lt;em&gt;mpstat –p 10 10&lt;/em&gt;”&amp;#160; will refresh the screen every 10 seconds&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8889503345796134899-6709596823938070024?l=mymymysql.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mymymysql.blogspot.com/feeds/6709596823938070024/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8889503345796134899&amp;postID=6709596823938070024' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/6709596823938070024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/6709596823938070024'/><link rel='alternate' type='text/html' href='http://mymymysql.blogspot.com/2009/11/solaris-10-cpu-usage.html' title='Solaris 10 CPU Usage'/><author><name>Tim</name><uri>http://www.blogger.com/profile/06805212306986685899</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://1.bp.blogspot.com/_GWztxWEQGnI/SnLAhgJmFCI/AAAAAAAAAEU/1ieqd3aplzo/S220/DSC00082.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8889503345796134899.post-4098779499658738994</id><published>2009-10-16T07:37:00.000-07:00</published><updated>2009-12-27T00:36:53.460-08:00</updated><title type='text'>Perl: Chose your Database Vendor on the command line!</title><content type='html'>I have created two identical databases. Well, when I say 'identical', one is MySQL and the other is PostgreSQL, but other than that they are pretty similar! They have the same schema and pretty much the same data. It occurred to me that the Perl DBI package hides the database details away from you so successfully that it would be possible to write a program that allowed you to specify the type of database you are accessing on the command line!&lt;br /&gt;&lt;br /&gt;Firstly, my new version of the command line routine:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;sub dbinfo() {&lt;br /&gt;        use Term::ReadKey;&lt;br /&gt;        my $helpinstructions = "Valid parameters are\n-h {host}\n" .&lt;br /&gt;                               "-d {database}\n" . &lt;br /&gt;                               "-u {user}\n" .&lt;br /&gt;                               "-p [password]\n" .&lt;br /&gt;                               "-dms [mysql/pgsql]\n";&lt;br /&gt;        my %mydbinfo = (        db =&gt; "",&lt;br /&gt;                                host =&gt; "",&lt;br /&gt;                                user =&gt; "",&lt;br /&gt;                                passwd =&gt; "",&lt;br /&gt;                                dms =&gt; ""&lt;br /&gt;        );&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        die $helpinstructions unless ($#ARGV &gt; 5);&lt;br /&gt;&lt;br /&gt;        for (my $i=0; $i &lt;= $#ARGV; $i++) {&lt;br /&gt;                $ARGV[$i]= "-?" if ($ARGV[$i] ne '-h' and&lt;br /&gt;                                    $ARGV[$i] ne '-d' and&lt;br /&gt;                                    $ARGV[$i] ne '-u' and&lt;br /&gt;                                    $ARGV[$i] ne '-dms' and&lt;br /&gt;                                    $ARGV[$i] ne '-p' );&lt;br /&gt;                die $helpinstructions if ( $ARGV[$i] eq "-?" ) ;&lt;br /&gt;                $mydbinfo{db} = $ARGV[++$i] if ( $ARGV[$i] eq "-d" ) ;&lt;br /&gt;                $mydbinfo{host} = $ARGV[++$i] if ( $ARGV[$i] eq "-h" ) ;&lt;br /&gt;                $mydbinfo{user} = $ARGV[++$i] if ( $ARGV[$i] eq "-u" ) ;&lt;br /&gt;                $mydbinfo{dms} = $ARGV[++$i] if ( $ARGV[$i] eq "-dms" ) ;&lt;br /&gt;                if ( $ARGV[$i] eq "-p" ) {&lt;br /&gt;                        if ( $i ne $#ARGV) {&lt;br /&gt;                                $mydbinfo{passwd} = $ARGV[++$i];&lt;br /&gt;                        }&lt;br /&gt;                        else {&lt;br /&gt;                                print "\nPlease Enter passwd: ";&lt;br /&gt;                                ReadMode 'noecho';&lt;br /&gt;                                chomp($mydbinfo{passwd} = ReadLine);&lt;br /&gt;                                ReadMode 'normal';&lt;br /&gt;                                print "\n\n";&lt;br /&gt;                        }&lt;br /&gt;                }&lt;br /&gt;        &lt;br /&gt;        }&lt;br /&gt;        die $helpinstructions unless ( $mydbinfo{dms} eq 'mysql' or&lt;br /&gt;                                       $mydbinfo{dms} eq 'pgsql');&lt;br /&gt;        $mydbinfo{dms} = 'PgPP' if ($mydbinfo{dms} eq 'pgsql');&lt;br /&gt;        return %mydbinfo;&lt;br /&gt;}&lt;br /&gt;return true;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;And then the program that calls it:&lt;blockquote&gt;&lt;pre&gt;#!/usr/bin/perl&lt;br /&gt;use strict;&lt;br /&gt;use DBI();&lt;br /&gt;&lt;br /&gt;require "D:\\Documents and Settings\\timj\\perl\\choosedbcommanddbsettings.pl" or&lt;br /&gt;die "Can't Open DB Settings File";&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;my %mydbinfo = dbinfo();&lt;br /&gt;my $dbconnect = "DBI:" . $mydbinfo{dms} . ":database=" . $mydbinfo{db} . ";host=" . $mydbinfo{host} ;&lt;br /&gt;&lt;br /&gt;my $dbh1 = DBI-&gt;connect($dbconnect,$mydbinfo{user}, $mydbinfo{passwd}, { raiseError =&gt; 1, AutoCommit =&gt; 0 })&lt;br /&gt;|| die "Database connection not made: $DBI::errstr";&lt;br /&gt;my $sql = "SELECT artist.name, cd.title FROM artist, cdtable AS cd WHERE artist.id = cd.artid";&lt;br /&gt;my $sth = $dbh1-&gt;prepare($sql);&lt;br /&gt;&lt;br /&gt;$sth-&gt;execute();&lt;br /&gt;&lt;br /&gt;my( $name, $title );&lt;br /&gt;$sth-&gt;bind_columns( \$name, \$title );&lt;br /&gt;&lt;br /&gt;print "Name\t\tTitle\n";&lt;br /&gt;while( $sth-&gt;fetch() ) {&lt;br /&gt;        print "$name\t$title\n";&lt;br /&gt;}&lt;br /&gt;$dbh1-&gt;disconnect() if($dbh1);&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;and here's the output:&lt;blockquote&gt;&lt;pre&gt;D:\Documents and Settings\timj\perl&gt;choosedbreport.pl -dms &lt;b&gt;mysql&lt;/b&gt; -h localhost -u timj -d cddb -p&lt;br /&gt;&lt;br /&gt;Please Enter passwd:&lt;br /&gt;&lt;br /&gt;Name            Title&lt;br /&gt;Phatfish        Guaranteed&lt;br /&gt;Phatfish        15&lt;br /&gt;Bethany Dillon  Waking Up&lt;br /&gt;Bethany Dillon  Bethany Dillon&lt;br /&gt;Bethany Dillon  Imagination&lt;br /&gt;Nick Drake      Made To Love Magic&lt;br /&gt;Nick Drake      Five Leaves Left&lt;br /&gt;Nick Drake      Bryter Layter&lt;br /&gt;&lt;br /&gt;D:\Documents and Settings\timj\perl&gt;choosedbreport.pl -dms &lt;b&gt;pgsql&lt;/b&gt; -h localhost -u timj -d cddb -p&lt;br /&gt;&lt;br /&gt;Please Enter passwd:&lt;br /&gt;&lt;br /&gt;Name            Title&lt;br /&gt;Nick Drake      Made To Love Magic&lt;br /&gt;Nick Drake      Five Leaves Left&lt;br /&gt;Nick Drake      Bryter Layter&lt;br /&gt;Bethany Dillon  Waking Up&lt;br /&gt;Bethany Dillon  Bethany Dillon&lt;br /&gt;Bethany Dillon  Imagination&lt;br /&gt;Phatfish        Guaranteed&lt;br /&gt;Phatfish        15&lt;br /&gt;Portland        These Broken Hands&lt;br /&gt;&lt;br /&gt;D:\Documents and Settings\timj\perl&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;Maybe not very useful, but it's a good demonstration of the power of DBI();&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8889503345796134899-4098779499658738994?l=mymymysql.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mymymysql.blogspot.com/feeds/4098779499658738994/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8889503345796134899&amp;postID=4098779499658738994' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/4098779499658738994'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/4098779499658738994'/><link rel='alternate' type='text/html' href='http://mymymysql.blogspot.com/2009/10/perl-chose-your-database-vendor-on.html' title='Perl: Chose your Database Vendor on the command line!'/><author><name>Tim</name><uri>http://www.blogger.com/profile/06805212306986685899</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://1.bp.blogspot.com/_GWztxWEQGnI/SnLAhgJmFCI/AAAAAAAAAEU/1ieqd3aplzo/S220/DSC00082.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8889503345796134899.post-1458282519559434511</id><published>2009-10-14T10:06:00.000-07:00</published><updated>2009-10-14T10:07:39.916-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='Perl'/><title type='text'>Perl: DB Connection details on the command line: Part 2</title><content type='html'>The previous post showed a simple routine for extracting out the database connection variables from the command line. It worked, but it had two flaws:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;It doesn't validate your parameters&lt;/li&gt;&lt;li&gt;It requires you to put your password on the command line, visible to a PS command in Unix&lt;/li&gt;&lt;/ol&gt;The code below seeks to address both these issues. If you enter a paramter that I don't understand, it kicks you out, and it you end your input with a -p, it accepts the password without echoing it back to the screen, just like you hoped it would!&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;sub dbinfo() {&lt;br /&gt; use Term::ReadKey;&lt;br /&gt; my $helpinstructions = "Valid parameters are\n-h {host}\n" .&lt;br /&gt;                        "-d {database}\n" . &lt;br /&gt;          "-u {user}\n" .&lt;br /&gt;          "-p [password]\n";&lt;br /&gt; my %mydbinfo = ( db =&gt; "",&lt;br /&gt;    host =&gt; "",&lt;br /&gt;    user =&gt; "",&lt;br /&gt;    passwd =&gt; ""&lt;br /&gt; );&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; die $helpinstructions unless ($#ARGV &gt; 5);&lt;br /&gt;&lt;br /&gt; for (my $i=0; $i &lt;= $#ARGV; $i++) {&lt;br /&gt;  $ARGV[$i]= "-?" if  ($ARGV[$i] ne '-h' and&lt;br /&gt;     $ARGV[$i] ne '-d' and&lt;br /&gt;     $ARGV[$i] ne '-u' and&lt;br /&gt;     $ARGV[$i] ne '-p' );&lt;br /&gt;  die $helpinstructions if ( $ARGV[$i] eq "-?" ) ;&lt;br /&gt;  $mydbinfo{db} = $ARGV[++$i] if ( $ARGV[$i] eq "-d" ) ;&lt;br /&gt;  $mydbinfo{host} = $ARGV[++$i] if ( $ARGV[$i] eq "-h" ) ;&lt;br /&gt;  $mydbinfo{user} = $ARGV[++$i] if ( $ARGV[$i] eq "-u" ) ;&lt;br /&gt;  if ( $ARGV[$i] eq "-p" ) {&lt;br /&gt;   if ( $i ne $#ARGV) {&lt;br /&gt;    $mydbinfo{passwd} = $ARGV[++$i];&lt;br /&gt;   }&lt;br /&gt;   else {&lt;br /&gt;    print "\nPlease Enter passwd: ";&lt;br /&gt;    ReadMode 'noecho';&lt;br /&gt;    chomp($mydbinfo{passwd} = ReadLine);&lt;br /&gt;    ReadMode 'normal';&lt;br /&gt;    print "\n\n";&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; &lt;br /&gt; }&lt;br /&gt; return %mydbinfo;&lt;br /&gt;}&lt;br /&gt;return true;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;And the output:&lt;blockquote&gt;&lt;pre&gt;D:\Documents and Settings\timj\perl&gt;testcommandline.pl -h localhost -d cddb -u timj -p&lt;br /&gt;&lt;br /&gt;Please Enter passwd:&lt;br /&gt;&lt;br /&gt;Name            Title&lt;br /&gt;Phatfish        Guaranteed&lt;br /&gt;Phatfish        15&lt;br /&gt;Bethany Dillon  Waking Up&lt;br /&gt;Bethany Dillon  Bethany Dillon&lt;br /&gt;Bethany Dillon  Imagination&lt;br /&gt;Nick Drake      Made To Love Magic&lt;br /&gt;Nick Drake      Five Leaves Left&lt;br /&gt;Nick Drake      Bryter Layter&lt;br /&gt;&lt;br /&gt;D:\Documents and Settings\timj\perl&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;The great thing is that you can directly replace your previous version of the dbsettings routine with this one, and there is no need to alter your existing scripts!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8889503345796134899-1458282519559434511?l=mymymysql.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mymymysql.blogspot.com/feeds/1458282519559434511/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8889503345796134899&amp;postID=1458282519559434511' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/1458282519559434511'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/1458282519559434511'/><link rel='alternate' type='text/html' href='http://mymymysql.blogspot.com/2009/10/perl-db-connection-details-on-command.html' title='Perl: DB Connection details on the command line: Part 2'/><author><name>Tim</name><uri>http://www.blogger.com/profile/06805212306986685899</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://1.bp.blogspot.com/_GWztxWEQGnI/SnLAhgJmFCI/AAAAAAAAAEU/1ieqd3aplzo/S220/DSC00082.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8889503345796134899.post-1186872300686027122</id><published>2009-10-12T09:23:00.000-07:00</published><updated>2009-10-12T23:02:02.085-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='Perl'/><title type='text'>Perl: DB Connection details on the command line</title><content type='html'>What if you want to connect to a database, passing your parameters in on a command line? Here's a handy routine to do that:&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;First the included code&lt;/h2&gt;&lt;blockquote&gt;&lt;pre&gt;sub dbinfo() {&lt;br /&gt; my %mydbinfo = ( db =&gt; "",&lt;br /&gt;    host =&gt; "",&lt;br /&gt;    user =&gt; "",&lt;br /&gt;    passwd =&gt; ""&lt;br /&gt; );&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; die "Not Enough Parameters" unless ($#ARGV &gt; 5);&lt;br /&gt;&lt;br /&gt; for (my $i=0; $i &amp;LT;= $#ARGV; $i++) {&lt;br /&gt;  $mydbinfo{db} = $ARGV[++$i] if ( $ARGV[$i] eq "-d" ) ;&lt;br /&gt;  $mydbinfo{host} = $ARGV[++$i] if ( $ARGV[$i] eq "-h" ) ;&lt;br /&gt;  $mydbinfo{user} = $ARGV[++$i] if ( $ARGV[$i] eq "-u" ) ;&lt;br /&gt;  $mydbinfo{passwd} = $ARGV[++$i] if ( $ARGV[$i] eq "-p" ) ;&lt;br /&gt; &lt;br /&gt; }&lt;br /&gt; return %mydbinfo;&lt;br /&gt;}&lt;br /&gt;return true;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;h2&gt;Next the code that calls this routine&lt;/H2&gt;&lt;blockquote&gt;&lt;pre&gt;#!/usr/bin/perl&lt;br /&gt;use strict;&lt;br /&gt;use DBI();&lt;br /&gt;&lt;br /&gt;require "D:\\Documents and Settings\\timj\\perl\\commanddbsettings.pl" or&lt;br /&gt;die "Can't Open DB Settings File";&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;my %mydbinfo = dbinfo();&lt;br /&gt;my $dbconnect = "DBI:mysql:database=" . $mydbinfo{db} . ";host=" . $mydbinfo{host} ;&lt;br /&gt;&lt;br /&gt;my $dbh1 = DBI-&gt;connect($dbconnect,$mydbinfo{user}, $mydbinfo{passwd}, { raiseError =&gt; 1, AutoCommit =&gt; 0 })&lt;br /&gt;|| die "Database connection not made: $DBI::errstr";&lt;br /&gt;my $sql = "SELECT artist.name, cd.title FROM artist, cdtable AS cd WHERE artist.id = cd.artid";&lt;br /&gt;my $sth = $dbh1-&gt;prepare($sql);&lt;br /&gt;&lt;br /&gt;$sth-&gt;execute();&lt;br /&gt;&lt;br /&gt;my( $name, $title );&lt;br /&gt;$sth-&gt;bind_columns( \$name, \$title );&lt;br /&gt;&lt;br /&gt;print "Name\t\tTitle\n";&lt;br /&gt;while( $sth-&gt;fetch() ) {&lt;br /&gt;        print "$name\t$title\n";&lt;br /&gt;}&lt;br /&gt;$dbh1-&gt;disconnect() if($dbh1)&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;h2&gt;and here it is in action&lt;/h2&gt;&lt;blockquote&gt;&lt;pre&gt;D:\Documents and Settings\timj\perl&gt;testcommandline.pl -d cddb -h localhost -u myuser -p xxx&lt;br /&gt;Name            Title&lt;br /&gt;Phatfish        Guaranteed&lt;br /&gt;Phatfish        15&lt;br /&gt;Bethany Dillon  Waking Up&lt;br /&gt;Bethany Dillon  Bethany Dillon&lt;br /&gt;Bethany Dillon  Imagination&lt;br /&gt;Nick Drake      Made To Love Magic&lt;br /&gt;Nick Drake      Five Leaves Left&lt;br /&gt;Nick Drake      Bryter Layter&lt;br /&gt;&lt;br /&gt;D:\Documents and Settings\timj\perl&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;It's not perfect, it doesn't do a lot of validation, and it doesn't allow you to enter the password with "echo off", but it's a good starting point.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8889503345796134899-1186872300686027122?l=mymymysql.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mymymysql.blogspot.com/feeds/1186872300686027122/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8889503345796134899&amp;postID=1186872300686027122' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/1186872300686027122'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/1186872300686027122'/><link rel='alternate' type='text/html' href='http://mymymysql.blogspot.com/2009/10/perl-db-connection-details-in-seperate_12.html' title='Perl: DB Connection details on the command line'/><author><name>Tim</name><uri>http://www.blogger.com/profile/06805212306986685899</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://1.bp.blogspot.com/_GWztxWEQGnI/SnLAhgJmFCI/AAAAAAAAAEU/1ieqd3aplzo/S220/DSC00082.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8889503345796134899.post-7307107911527140129</id><published>2009-10-10T01:22:00.000-07:00</published><updated>2009-10-12T23:00:28.525-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><title type='text'>MySQL: Some Weirdness Going On</title><content type='html'>When I created &lt;a href="http://mymymysql.blogspot.com/2009/05/foreign-key-contraints-in-mysql.html"&gt;the cdtable&lt;/a&gt; to show off Constraints, I had a little trouble. What everything I read in the manuals told me about defining them didn't work. The issue centred around the fields for which you were defining a foreign key constraint. The book told me to define a KEY for each field, but I found I had to define an INDEX. &lt;br /&gt;&lt;br /&gt;Compare:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;CREATE TABLE cddb.cdtable (&lt;br /&gt;id INT NOT NULL AUTO_INCREMENT,&lt;br /&gt;pubid INT NOT NULL,&lt;br /&gt;artid INT NOT NULL,&lt;br /&gt;title varchar(50) NOT NULL,&lt;br /&gt;yearpublished INT,&lt;br /&gt;PRIMARY KEY (`id`),&lt;br /&gt;KEY `artid` (`artid`),&lt;br /&gt;KEY `pubid` (`pubid`),&lt;br /&gt;CONSTRAINT `cdtable_ibfk_1` FOREIGN KEY (`artid`) REFERENCES `artist` (`id`) ON DELETE CASCADE,&lt;br /&gt;CONSTRAINT `cdtable_ibfk_2` FOREIGN KEY (`pubid`) REFERENCES `publisher` (`id`) ON DELETE CASCADE&lt;br /&gt;) ENGINE=INNODB;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;With&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;CREATE TABLE cddb.cdtable (&lt;br /&gt;id INT NOT NULL AUTO_INCREMENT,&lt;br /&gt;pubid INT NOT NULL,&lt;br /&gt;artid INT NOT NULL,&lt;br /&gt;title varchar(50) NOT NULL,&lt;br /&gt;yearpublished INT,&lt;br /&gt;PRIMARY KEY (id),&lt;br /&gt;INDEX (artid),&lt;br /&gt;FOREIGN KEY (artid)&lt;br /&gt;REFERENCES artist(id) ON DELETE CASCADE,&lt;br /&gt;INDEX (pubid),&lt;br /&gt;FOREIGN KEY (pubid)&lt;br /&gt;REFERENCES publisher(id) ON DELETE CASCADE&lt;br /&gt;) ENGINE=INNODB;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;The first is by the book, the second actually work!&lt;br /&gt;&lt;br /&gt;Well, this morning I decided to back my database up and transfer it over to my study PC. I used the standard GUI backup tool, and 'lo and behold', the backup script it generated had the same issue:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;--&lt;br /&gt;-- Definition of table `cdtable`&lt;br /&gt;--&lt;br /&gt;&lt;br /&gt;DROP TABLE IF EXISTS `cdtable`;&lt;br /&gt;CREATE TABLE `cdtable` (&lt;br /&gt;  `id` int(11) NOT NULL AUTO_INCREMENT,&lt;br /&gt;  `pubid` int(11) NOT NULL,&lt;br /&gt;  `artid` int(11) NOT NULL,&lt;br /&gt;  `title` varchar(50) NOT NULL,&lt;br /&gt;  `yearpublished` int(11) DEFAULT NULL,&lt;br /&gt;  `last_updated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,&lt;br /&gt;  PRIMARY KEY (`id`),&lt;br /&gt;  KEY `artid` (`artid`),&lt;br /&gt;  KEY `pubid` (`pubid`),&lt;br /&gt;  CONSTRAINT `cdtable_ibfk_1` FOREIGN KEY (`artid`) REFERENCES `artist` (`id`) ON DELETE CASCADE,&lt;br /&gt;  CONSTRAINT `cdtable_ibfk_2` FOREIGN KEY (`pubid`) REFERENCES `publisher` (`id`) ON DELETE CASCADE&lt;br /&gt;) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;To allow the backup to restore I had to modify the code to reflect what I had originally written! Good job I'd blogged the code!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8889503345796134899-7307107911527140129?l=mymymysql.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mymymysql.blogspot.com/feeds/7307107911527140129/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8889503345796134899&amp;postID=7307107911527140129' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/7307107911527140129'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/7307107911527140129'/><link rel='alternate' type='text/html' href='http://mymymysql.blogspot.com/2009/10/mysql-some-weirdness-going-on.html' title='MySQL: Some Weirdness Going On'/><author><name>Tim</name><uri>http://www.blogger.com/profile/06805212306986685899</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://1.bp.blogspot.com/_GWztxWEQGnI/SnLAhgJmFCI/AAAAAAAAAEU/1ieqd3aplzo/S220/DSC00082.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8889503345796134899.post-6251981914928326270</id><published>2009-10-09T05:09:00.000-07:00</published><updated>2009-10-12T23:00:07.374-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='Perl'/><title type='text'>Perl: DB Connection details in a seperate file</title><content type='html'>And finally, moving the connection details into a separate file that you can call from any program.&lt;br /&gt;&lt;b&gt;dbsettings.pl&lt;/b&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;sub dbinfo() {&lt;br /&gt; my %mydbinfo = ( db =&amp;gt; "cddb",&lt;br /&gt;    host =&amp;gt; "localhost",&lt;br /&gt;    user =&amp;gt; "myuser",&lt;br /&gt;    passwd =&amp;gt; "xxx"&lt;br /&gt; );&lt;br /&gt; return %mydbinfo;&lt;br /&gt;}&lt;br /&gt;return true;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;b&gt;testrequire.pl&lt;/b&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;#!/usr/bin/perl&lt;br /&gt;use strict;&lt;br /&gt;use DBI();&lt;br /&gt;&lt;br /&gt;require "D:\\Documents and Settings\\timj\\perl\\dbsettings.pl" or&lt;br /&gt;die "Can't Open DB Settings File";&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;my %mydbinfo = dbinfo();&lt;br /&gt;my $dbconnect = "DBI:mysql:database=" . $mydbinfo{db} . ";host=" . $mydbinfo{host} ;&lt;br /&gt;&lt;br /&gt;my $dbh1 = DBI-&amp;gt;connect($dbconnect,$mydbinfo{user}, $mydbinfo{passwd}, { raiseError =&amp;gt; 1, AutoCommit =&amp;gt; 0 })&lt;br /&gt;|| die "Database connection not made: $DBI::errstr";&lt;br /&gt;my $sql = "SELECT artist.name, cd.title FROM artist, cdtable AS cd WHERE artist.id = cd.artid";&lt;br /&gt;my $sth = $dbh1-&amp;gt;prepare($sql);&lt;br /&gt;&lt;br /&gt;$sth-&amp;gt;execute();&lt;br /&gt;&lt;br /&gt;my( $name, $title );&lt;br /&gt;$sth-&amp;gt;bind_columns( \$name, \$title );&lt;br /&gt;&lt;br /&gt;print "Name\t\tTitle\n";&lt;br /&gt;while( $sth-&amp;gt;fetch() ) {&lt;br /&gt;        print "$name\t$title\n";&lt;br /&gt;}&lt;br /&gt;$dbh1-&amp;gt;disconnect() if($dbh1);&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8889503345796134899-6251981914928326270?l=mymymysql.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mymymysql.blogspot.com/feeds/6251981914928326270/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8889503345796134899&amp;postID=6251981914928326270' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/6251981914928326270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/6251981914928326270'/><link rel='alternate' type='text/html' href='http://mymymysql.blogspot.com/2009/10/perl-db-connection-details-in-seperate.html' title='Perl: DB Connection details in a seperate file'/><author><name>Tim</name><uri>http://www.blogger.com/profile/06805212306986685899</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://1.bp.blogspot.com/_GWztxWEQGnI/SnLAhgJmFCI/AAAAAAAAAEU/1ieqd3aplzo/S220/DSC00082.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8889503345796134899.post-5579137966336904419</id><published>2009-10-08T01:06:00.000-07:00</published><updated>2009-10-12T22:59:15.866-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='Perl'/><title type='text'>Perl: Connection Details in a Subroutine</title><content type='html'>This example moves the connection information out of the main flow of the program and in to a subroutine. Notice that I have declared the hash %mydbinfo twice. This is because in both cases they are declared as lexically scoped (using 'my'). This means that the %mydbinfo that we see in the subroutine is a totally sepoerate variable from the %mydbinfo in the main body of the code. If like me you earned your living writing COBOL in the 80's this may seem strange - why would you want to do this. The answer is taht it makes it very clear what the scope of the variable is and who can see it. You can define global variables, but it's considered good practice to limit the scope of variables as tightly as possible whilst still achieving your goals.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;#!/usr/bin/perl&lt;br /&gt;use strict;&lt;br /&gt;use DBI();&lt;br /&gt;&lt;br /&gt;sub dbinfo() {&lt;br /&gt; my %mydbinfo = ( db =&amp;gt; "cddb",&lt;br /&gt;    host =&amp;gt; "localhost",&lt;br /&gt;    user =&amp;gt; "myuser",&lt;br /&gt;    passwd =&amp;gt; "xxx"&lt;br /&gt; );&lt;br /&gt; return %mydbinfo;&lt;br /&gt;}&lt;br /&gt;  &lt;br /&gt;my %mydbinfo = dbinfo();&lt;br /&gt;my $dbconnect = "DBI:mysql:database=" . $mydbinfo{db} . ";host=" . $mydbinfo{host} ;&lt;br /&gt;&lt;br /&gt;my $dbh1 = DBI-&amp;gt;connect($dbconnect,$mydbinfo{user}, $mydbinfo{passwd}, { raiseError =&amp;gt; 1, AutoCommit =&amp;gt; 0 })&lt;br /&gt;|| die "Database connection not made: $DBI::errstr";&lt;br /&gt;my $sql = "SELECT artist.name, cd.title FROM artist, cdtable AS cd WHERE artist.id = cd.artid";&lt;br /&gt;my $sth = $dbh1-&amp;gt;prepare($sql);&lt;br /&gt;&lt;br /&gt;$sth-&amp;gt;execute();&lt;br /&gt;&lt;br /&gt;my( $name, $title );&lt;br /&gt;$sth-&amp;gt;bind_columns( \$name, \$title );&lt;br /&gt;&lt;br /&gt;print "Name\t\tTitle\n";&lt;br /&gt;while( $sth-&amp;gt;fetch() ) {&lt;br /&gt;        print "$name\t$title\n";&lt;br /&gt;}&lt;br /&gt;$dbh1-&amp;gt;disconnect() if($dbh1)&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8889503345796134899-5579137966336904419?l=mymymysql.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mymymysql.blogspot.com/feeds/5579137966336904419/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8889503345796134899&amp;postID=5579137966336904419' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/5579137966336904419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/5579137966336904419'/><link rel='alternate' type='text/html' href='http://mymymysql.blogspot.com/2009/10/perl-connection-details-in-subroutine.html' title='Perl: Connection Details in a Subroutine'/><author><name>Tim</name><uri>http://www.blogger.com/profile/06805212306986685899</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://1.bp.blogspot.com/_GWztxWEQGnI/SnLAhgJmFCI/AAAAAAAAAEU/1ieqd3aplzo/S220/DSC00082.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8889503345796134899.post-9007963013781287018</id><published>2009-10-07T22:44:00.000-07:00</published><updated>2009-10-07T22:53:21.241-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='Perl'/><category scheme='http://www.blogger.com/atom/ns#' term='hash'/><title type='text'>Perl: Storing your DB Connect in a hash</title><content type='html'>This is a half-way house script, that uses a hash to store the database information for the connect.&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;#!/usr/bin/perl&lt;br /&gt;use strict;&lt;br /&gt;use DBI();&lt;br /&gt;&lt;br /&gt;my %mydbinfo = ( db =&amp;gt; "cddb",&lt;br /&gt;   host =&amp;gt; "localhost",&lt;br /&gt;   user =&amp;gt; "myuser",&lt;br /&gt;   passwd =&amp;gt; "xxx"&lt;br /&gt; );&lt;br /&gt;  &lt;br /&gt;my $dbconnect = "DBI:mysql:database=" . $mydbinfo{db} . ";host=" . $mydbinfo{host} ;&lt;br /&gt;&lt;br /&gt;my $dbh1 = DBI-&amp;gt;connect($dbconnect,$mydbinfo{user}, $mydbinfo{passwd}, { raiseError =&amp;gt; 1, AutoCommit =&amp;gt; 0 })&lt;br /&gt;|| die "Database connection not made: $DBI::errstr";&lt;br /&gt;my $sql = "SELECT artist.name, cd.title FROM artist, cdtable AS cd WHERE artist.id = cd.artid";&lt;br /&gt;my $sth = $dbh1-&amp;gt;prepare($sql);&lt;br /&gt;&lt;br /&gt;$sth-&amp;gt;execute();&lt;br /&gt;&lt;br /&gt;my( $name, $title );&lt;br /&gt;$sth-&amp;gt;bind_columns( \$name, \$title );&lt;br /&gt;&lt;br /&gt;print "Name\t\tTitle\n";&lt;br /&gt;while( $sth-&amp;gt;fetch() ) {&lt;br /&gt;        print "$name\t$title\n";&lt;br /&gt;}&lt;br /&gt;$dbh1-&amp;gt;disconnect() if($dbh1);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;This has the advantage of putting all the details neatly at the start of the code, but still has the full DB connect details hard coded, which is obviously something to avoid in most circumstances.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8889503345796134899-9007963013781287018?l=mymymysql.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mymymysql.blogspot.com/feeds/9007963013781287018/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8889503345796134899&amp;postID=9007963013781287018' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/9007963013781287018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/9007963013781287018'/><link rel='alternate' type='text/html' href='http://mymymysql.blogspot.com/2009/10/perl-storing-your-db-connect-in-hash.html' title='Perl: Storing your DB Connect in a hash'/><author><name>Tim</name><uri>http://www.blogger.com/profile/06805212306986685899</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://1.bp.blogspot.com/_GWztxWEQGnI/SnLAhgJmFCI/AAAAAAAAAEU/1ieqd3aplzo/S220/DSC00082.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8889503345796134899.post-3396895467287182973</id><published>2009-07-25T01:46:00.000-07:00</published><updated>2009-07-25T08:57:10.170-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>Reading from a file</title><content type='html'>I have started playing with a new database, that will allow the costing of simple recipes. Here's the schema (so far):&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;table&gt;&lt;tr&gt;&lt;td bgcolor="lightgrey"&gt;&lt;br /&gt;DROP TABLE IF EXISTS recipe.ingredient;&lt;br /&gt;DROP TABLE IF EXISTS recipe.item;&lt;br /&gt;DROP TABLE IF EXISTS recipe.unit;&lt;br /&gt;&lt;br /&gt;CREATE TABLE recipe.unit (&lt;br /&gt; id INT NOT NULL,&lt;br /&gt; name VARCHAR(10) NOT NULL,&lt;br /&gt; PRIMARY KEY (id)&lt;br /&gt;) TYPE = INNODB;&lt;br /&gt;&lt;br /&gt;CREATE TABLE recipe.item (&lt;br /&gt; code VARCHAR(10) NOT NULL,&lt;br /&gt; name VARCHAR(50) NOT NULL,&lt;br /&gt; unitid INT NOT NULL,&lt;br /&gt; cost DECIMAL(10,2) NOT NULL,&lt;br /&gt; PRIMARY KEY (code),&lt;br /&gt; FOREIGN KEY (unitid) REFERENCES unit(id)&lt;br /&gt;) TYPE = INNODB;&lt;br /&gt;&lt;br /&gt;CREATE TABLE recipe.ingredient (&lt;br /&gt; recipe_code VARCHAR(10) NOT NULL,&lt;br /&gt; ingred_code VARCHAR(10) NOT NULL,&lt;br /&gt; quantity DECIMAL(10,2) NOT NULL,&lt;br /&gt; FOREIGN KEY (recipe_code) REFERENCES item (code),&lt;br /&gt; FOREIGN KEY (ingred_code) REFERENCES item (code)&lt;br /&gt;) TYPE = INNODB;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;First thing to do is to populate the unit table.&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;table&gt;&lt;tr&gt;&lt;td bgcolor="lightgrey"&gt;&lt;br /&gt;C:\Documents and Settings\Tim\My Documents\DB\Recipe\sql&gt;more unit.txt&lt;br /&gt;1,litre&lt;br /&gt;2,each&lt;br /&gt;3,gram&lt;br /&gt;&lt;br /&gt;C:\Documents and Settings\Tim\My Documents\DB\Recipe\sql&gt;&lt;br /&gt;&lt;br /&gt;mysql&gt; LOAD DATA LOCAL INFILE 'unit.txt' REPLACE INTO TABLE recipe.unit FIELDS TERMINATED BY ',' &lt;font bgcolor="red"&gt;LINES TERMINATED BY '\r\n'&lt;/font&gt;&lt;br /&gt;    -&gt; ;&lt;br /&gt;Query OK, 3 rows affected (0.02 sec)&lt;br /&gt;Records: 3  Deleted: 0  Skipped: 0  Warnings: 0&lt;br /&gt;&lt;br /&gt;mysql&gt; select * from unit;&lt;br /&gt;+----+-------+&lt;br /&gt;| id | name  |&lt;br /&gt;+----+-------+&lt;br /&gt;|  1 | litre |&lt;br /&gt;|  2 | each  |&lt;br /&gt;|  3 | gram  |&lt;br /&gt;+----+-------+&lt;br /&gt;3 rows in set (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;/pre&gt;&lt;br /&gt;Note: the stupid 'LINES TERMINATED' option used because I'm running on a stupid OS that uses Character Return Line Feeds for it's line termination.&lt;br /&gt;&lt;br /&gt;Then the PHP script to load some raw materials:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&lt;table&gt;&lt;tr&gt;&lt;td bgcolor="lightgrey"&gt;&lt;br /&gt;C:\Documents and Settings\Tim\My Documents\DB\Recipe\php&gt;more rawingred.txt&lt;br /&gt;EGG,Egg,2,15&lt;br /&gt;FLOUR,Flour,3,0.01&lt;br /&gt;MILK,Milk,1,75&lt;br /&gt;&lt;br /&gt;C:\Documents and Settings\Tim\My Documents\DB\Recipe\php&gt;more rawingredload.php&lt;br /&gt;&amp;lt;?php&lt;br /&gt;function openMyDB($dbname)&lt;br /&gt;{&lt;br /&gt;include("DBInfo.inc");&lt;br /&gt;$con = mysql_connect($mydbhost,$mydbuser,$mydbpassword);&lt;br /&gt;if (!$con) {&lt;br /&gt;        die('Could not connect: ' . mysql_error());&lt;br /&gt;}&lt;br /&gt;mysql_select_db($dbname, $con);&lt;br /&gt;return $con;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;$con = openMyDB("recipe");&lt;br /&gt;&lt;br /&gt;$file=fopen("rawingred.txt","r") or exit("Unable to open file!");&lt;br /&gt;while(!feof($file)) {&lt;br /&gt;  $ingred = fgets($file);&lt;br /&gt;  list($code, $name, $unitid, $cost) = split(',', $ingred);&lt;br /&gt;  echo "$code\t$name\t$unitid\t$cost\n";&lt;br /&gt;  $sql="INSERT INTO item (code, name, unitid, cost)&lt;br /&gt;          VALUES ('$code','$name','$unitid','$cost')";&lt;br /&gt;  if (!mysql_query($sql,$con)) {&lt;br /&gt;     die('Error: ' . mysql_error());&lt;br /&gt;  }&lt;br /&gt;  echo "1 record added\n";&lt;br /&gt;  }&lt;br /&gt;fclose($file);&lt;br /&gt;&lt;br /&gt;?&amp;gt;&lt;br /&gt;C:\Documents and Settings\Tim\My Documents\DB\Recipe\php&gt;php rawingredload.php&lt;br /&gt;EGG     Egg     2       15&lt;br /&gt;&lt;br /&gt;1 record added&lt;br /&gt;FLOUR   Flour   3       0.01&lt;br /&gt;&lt;br /&gt;1 record added&lt;br /&gt;MILK    Milk    1       75&lt;br /&gt;1 record added&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;C:\Documents and Settings\Tim\My Documents\DB\Recipe\php&gt;&lt;br /&gt;&lt;br /&gt;mysql&gt; select * from item;&lt;br /&gt;+-------+-------+--------+-------+&lt;br /&gt;| code  | name  | unitid | cost  |&lt;br /&gt;+-------+-------+--------+-------+&lt;br /&gt;| EGG   | Egg   |      2 | 15.00 |&lt;br /&gt;| FLOUR | Flour |      3 |  0.01 |&lt;br /&gt;| MILK  | Milk  |      1 | 75.00 |&lt;br /&gt;+-------+-------+--------+-------+&lt;br /&gt;3 rows in set (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8889503345796134899-3396895467287182973?l=mymymysql.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mymymysql.blogspot.com/feeds/3396895467287182973/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8889503345796134899&amp;postID=3396895467287182973' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/3396895467287182973'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/3396895467287182973'/><link rel='alternate' type='text/html' href='http://mymymysql.blogspot.com/2009/07/reading-from-file.html' title='Reading from a file'/><author><name>Tim</name><uri>http://www.blogger.com/profile/06805212306986685899</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://1.bp.blogspot.com/_GWztxWEQGnI/SnLAhgJmFCI/AAAAAAAAAEU/1ieqd3aplzo/S220/DSC00082.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8889503345796134899.post-439891428962848424</id><published>2009-07-22T08:26:00.000-07:00</published><updated>2009-07-23T02:58:46.976-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='Perl'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>Compare the Perl with PHP</title><content type='html'>I had this idea that I should write exactly the same code in PHP that I had just written in Perl, just to compare.&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;?php&lt;br /&gt;function openMyDB()&lt;br /&gt;{&lt;br /&gt;include("DBInfo.inc");&lt;br /&gt;$con = mysql_connect($mydbhost,$mydbuser,$mydbpassword);&lt;br /&gt;if (!$con) {&lt;br /&gt;        die('Could not connect: ' . mysql_error());&lt;br /&gt;}&lt;br /&gt;mysql_select_db("cddb", $con);&lt;br /&gt;return $con;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;$con = openMyDB();&lt;br /&gt;&lt;br /&gt;mysql_select_db("cddb", $con);&lt;br /&gt;&lt;br /&gt;print "Name\t\tTitle\n";&lt;br /&gt;$result = mysql_query("SELECT artist.name, cd.title FROM artist, cdtable AS cd WHERE artist.id = cd.artid");&lt;br /&gt;while ($row = mysql_fetch_array($result)) {&lt;br /&gt;        echo $row['name'] . "\t" . $row['title'] . "\n" ;&lt;br /&gt;}&lt;br /&gt;mysql_free_result($result);&lt;br /&gt;mysql_close($con);&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;br /&gt;D:\Database\CDDB\Reports&gt;php CDRep.php&lt;br /&gt;Name            Title&lt;br /&gt;Phatfish        Guaranteed&lt;br /&gt;Phatfish        15&lt;br /&gt;Bethany Dillon  Waking Up&lt;br /&gt;Bethany Dillon  Bethany Dillon&lt;br /&gt;Bethany Dillon  Imagination&lt;br /&gt;Nick Drake      Made To Love Magic&lt;br /&gt;Nick Drake      Five Leaves Left&lt;br /&gt;Nick Drake      Bryter Layter&lt;br /&gt;&lt;br /&gt;D:\Database\CDDB\Reports&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;So, which do you prefer?&lt;br /&gt;&lt;br /&gt;Please note that:&lt;br /&gt;&lt;pre&gt;&lt;blockquote&gt;&lt;br /&gt;include("DBInfo.inc"); &lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;is my own code (for what it's worth) that we've seen in previous examples.&lt;br /&gt;&lt;pre&gt;&lt;blockquote&gt;&lt;br /&gt;D:\Database\CDDB\Reports&gt;more  DBInfo.inc&lt;br /&gt;&amp;lt;?php&lt;br /&gt;$mydbhost="localhost";&lt;br /&gt;$mydbuser="myuser";&lt;br /&gt;$mydbpassword="mypassword";&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;br /&gt;D:\Database\CDDB\Reports&gt; &lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8889503345796134899-439891428962848424?l=mymymysql.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mymymysql.blogspot.com/feeds/439891428962848424/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8889503345796134899&amp;postID=439891428962848424' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/439891428962848424'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/439891428962848424'/><link rel='alternate' type='text/html' href='http://mymymysql.blogspot.com/2009/07/compare-perl-with-php.html' title='Compare the Perl with PHP'/><author><name>Tim</name><uri>http://www.blogger.com/profile/06805212306986685899</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://1.bp.blogspot.com/_GWztxWEQGnI/SnLAhgJmFCI/AAAAAAAAAEU/1ieqd3aplzo/S220/DSC00082.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8889503345796134899.post-1267373132166794913</id><published>2009-07-22T01:49:00.000-07:00</published><updated>2009-07-22T02:23:42.570-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='Perl'/><category scheme='http://www.blogger.com/atom/ns#' term='DBI'/><title type='text'>A Perl Script that accesses MySQL</title><content type='html'>Last year I posted a simple Perl script that accesses a PostgreSQL database using the DBI connector. I decided that I should do the same for MySQL. I'm using Active State Perl on Windows XP. Amusingly, this version does not include the MySQL connectors as default, but it's easy enough to add using perl ppm (&lt;span style="font-weight:bold;"&gt;Perl's Perl Package Manager&lt;/span&gt;). &lt;br /&gt;&lt;br /&gt;I want a simple script that lists out artists and their CDs in my database.&lt;br /&gt;&lt;br /&gt;&lt;Blockquote&gt;&lt;pre&gt;&lt;br /&gt;#!/usr/bin/perl&lt;br /&gt;use strict;&lt;br /&gt;use DBI();&lt;br /&gt;my $dbh1 = DBI-&gt;connect("DBI:mysql:database=cddb;host=localhost","uuuu", "xxxxxx", { raiseError =&gt; 1, AutoCommit =&gt; 0 })&lt;br /&gt;|| die "Database connection not made: $DBI::errstr";&lt;br /&gt;my $sql = "SELECT artist.name, cd.title FROM artist, cdtable AS cd WHERE artist.id = cd.artid";&lt;br /&gt;my $sth = $dbh1-&gt;prepare($sql);&lt;br /&gt;&lt;br /&gt;$sth-&gt;execute();&lt;br /&gt;&lt;br /&gt;my( $name, $title );&lt;br /&gt;$sth-&gt;bind_columns( \$name, \$title );&lt;br /&gt;&lt;br /&gt;print "Name\t\tTitle\n";&lt;br /&gt;while( $sth-&gt;fetch() ) {&lt;br /&gt; print "$name\t$title\n";&lt;br /&gt;}&lt;br /&gt;$dbh1-&gt;disconnect() if($dbh1)&lt;br /&gt;&lt;br /&gt;D:\Documents and Settings\timj\perl&gt;c:\Perl\bin\perl cd.pl&lt;br /&gt;Name            Title&lt;br /&gt;Phatfish        Guaranteed&lt;br /&gt;Phatfish        15&lt;br /&gt;Bethany Dillon  Waking Up&lt;br /&gt;Bethany Dillon  Bethany Dillon&lt;br /&gt;Bethany Dillon  Imagination&lt;br /&gt;Nick Drake      Made To Love Magic&lt;br /&gt;Nick Drake      Five Leaves Left&lt;br /&gt;Nick Drake      Bryter Layter&lt;br /&gt;&lt;br /&gt;D:\Documents and Settings\timj\perl&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/Blockquote&gt;&lt;br /&gt;&lt;br /&gt;That's about as simple as it get, I'm sure that there is far more to it than that, but this will do for now!&lt;br /&gt;Tim&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8889503345796134899-1267373132166794913?l=mymymysql.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mymymysql.blogspot.com/feeds/1267373132166794913/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8889503345796134899&amp;postID=1267373132166794913' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/1267373132166794913'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/1267373132166794913'/><link rel='alternate' type='text/html' href='http://mymymysql.blogspot.com/2009/07/perl-script-that-accesses-mysql.html' title='A Perl Script that accesses MySQL'/><author><name>Tim</name><uri>http://www.blogger.com/profile/06805212306986685899</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://1.bp.blogspot.com/_GWztxWEQGnI/SnLAhgJmFCI/AAAAAAAAAEU/1ieqd3aplzo/S220/DSC00082.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8889503345796134899.post-6534097088954916242</id><published>2009-07-20T03:06:00.000-07:00</published><updated>2009-07-20T23:58:37.662-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><title type='text'>Creating a View</title><content type='html'>Let's pretend that we regularly want to be able to select all our publishers with the CDs we have on file for them. We saw in the last post that the SQL is:&lt;br /&gt;&lt;Blockquote&gt;&lt;pre&gt;&lt;br /&gt;SELECT c.title, p.name FROM cdtable c RIGHT OUTER JOIN publisher p ON c.pubid = p.id;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;We can create a view to do this:&lt;br /&gt;&lt;Blockquote&gt;&lt;pre&gt;&lt;br /&gt;mysql&gt; CREATE VIEW V_Publisher as&lt;br /&gt;    -&gt; SELECT c.title, p.name FROM cdtable c RIGHT OUTER JOIN publisher p ON c.pubid = p.id;&lt;br /&gt;Query OK, 0 rows affected (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&gt;&lt;br /&gt;mysql&gt; describe V_Publisher;&lt;br /&gt;+-------+-------------+------+-----+---------+-------+&lt;br /&gt;| Field | Type        | Null | Key | Default | Extra |&lt;br /&gt;+-------+-------------+------+-----+---------+-------+&lt;br /&gt;| title | varchar(50) | YES  |     | NULL    |       |&lt;br /&gt;| name  | varchar(20) | NO   |     | NULL    |       |&lt;br /&gt;+-------+-------------+------+-----+---------+-------+&lt;br /&gt;2 rows in set (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;We can the simply select from this view:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;mysql&gt; select * from V_Publisher;&lt;br /&gt;+--------------------+----------------+&lt;br /&gt;| title              | name           |&lt;br /&gt;+--------------------+----------------+&lt;br /&gt;| Waking Up          | EMI            |&lt;br /&gt;| Bethany Dillon     | EMI            |&lt;br /&gt;| Imagination        | EMI            |&lt;br /&gt;| Guaranteed         | SONY           |&lt;br /&gt;| 15                 | SONY           |&lt;br /&gt;| Made To Love Magic | Island Records |&lt;br /&gt;| Five Leaves Left   | Island Records |&lt;br /&gt;| Bryter Layter      | Island Records |&lt;br /&gt;| NULL               | Apple Records  |&lt;br /&gt;+--------------------+----------------+&lt;br /&gt;9 rows in set (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8889503345796134899-6534097088954916242?l=mymymysql.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mymymysql.blogspot.com/feeds/6534097088954916242/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8889503345796134899&amp;postID=6534097088954916242' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/6534097088954916242'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/6534097088954916242'/><link rel='alternate' type='text/html' href='http://mymymysql.blogspot.com/2009/07/creating-view.html' title='Creating a View'/><author><name>Tim</name><uri>http://www.blogger.com/profile/06805212306986685899</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://1.bp.blogspot.com/_GWztxWEQGnI/SnLAhgJmFCI/AAAAAAAAAEU/1ieqd3aplzo/S220/DSC00082.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8889503345796134899.post-6591681454401399498</id><published>2009-07-20T01:54:00.000-07:00</published><updated>2009-07-20T23:58:54.140-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><title type='text'>Inner and Outer Joins</title><content type='html'>To Demonstrate inner and outer joins, the first thing I need to do is to add some data in to the database that isn't referenced by another table. So here I'm adding a publisher that I have no CDs for. Alas, no Beatles in my collection!&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;mysql&gt; insert into publisher (name) values ('Apple Records');&lt;br /&gt;Query OK, 1 row affected (0.00 sec)&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;A normal join would not tell us about Apple Records, as there is nothing to report.&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;mysql&gt; SELECT c.title, p.name FROM cdtable c, publisher p&lt;br /&gt;    -&gt; where c.pubid = p.id;&lt;br /&gt;+--------------------+----------------+&lt;br /&gt;| title              | name           |&lt;br /&gt;+--------------------+----------------+&lt;br /&gt;| Waking Up          | EMI            |&lt;br /&gt;| Bethany Dillon     | EMI            |&lt;br /&gt;| Imagination        | EMI            |&lt;br /&gt;| Guaranteed         | SONY           |&lt;br /&gt;| 15                 | SONY           |&lt;br /&gt;| Made To Love Magic | Island Records |&lt;br /&gt;| Five Leaves Left   | Island Records |&lt;br /&gt;| Bryter Layter      | Island Records |&lt;br /&gt;+--------------------+----------------+&lt;br /&gt;8 rows in set (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;We get the same results when we code an Inner Join,&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;mysql&gt; SELECT c.title, p.name FROM cdtable c INNER JOIN publisher p ON c.pubid = p.id;&lt;br /&gt;+--------------------+----------------+&lt;br /&gt;| title              | name           |&lt;br /&gt;+--------------------+----------------+&lt;br /&gt;| Waking Up          | EMI            |&lt;br /&gt;| Bethany Dillon     | EMI            |&lt;br /&gt;| Imagination        | EMI            |&lt;br /&gt;| Guaranteed         | SONY           |&lt;br /&gt;| 15                 | SONY           |&lt;br /&gt;| Made To Love Magic | Island Records |&lt;br /&gt;| Five Leaves Left   | Island Records |&lt;br /&gt;| Bryter Layter      | Island Records |&lt;br /&gt;+--------------------+----------------+&lt;br /&gt;8 rows in set (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;When we code a righthand outer join on Publisher, we see Apple, but with no CDs of course.&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;mysql&gt; SELECT c.title, p.name FROM cdtable c RIGHT OUTER JOIN publisher p ON c.pubid = p.id;&lt;br /&gt;+--------------------+----------------+&lt;br /&gt;| title              | name           |&lt;br /&gt;+--------------------+----------------+&lt;br /&gt;| Waking Up          | EMI            |&lt;br /&gt;| Bethany Dillon     | EMI            |&lt;br /&gt;| Imagination        | EMI            |&lt;br /&gt;| Guaranteed         | SONY           |&lt;br /&gt;| 15                 | SONY           |&lt;br /&gt;| Made To Love Magic | Island Records |&lt;br /&gt;| Five Leaves Left   | Island Records |&lt;br /&gt;| Bryter Layter      | Island Records |&lt;br /&gt;| NULL               | Apple Records  |&lt;br /&gt;+--------------------+----------------+&lt;br /&gt;9 rows in set (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8889503345796134899-6591681454401399498?l=mymymysql.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mymymysql.blogspot.com/feeds/6591681454401399498/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8889503345796134899&amp;postID=6591681454401399498' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/6591681454401399498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/6591681454401399498'/><link rel='alternate' type='text/html' href='http://mymymysql.blogspot.com/2009/07/inner-and-outer-joins.html' title='Inner and Outer Joins'/><author><name>Tim</name><uri>http://www.blogger.com/profile/06805212306986685899</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://1.bp.blogspot.com/_GWztxWEQGnI/SnLAhgJmFCI/AAAAAAAAAEU/1ieqd3aplzo/S220/DSC00082.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8889503345796134899.post-7057619770593507356</id><published>2009-07-13T02:25:00.000-07:00</published><updated>2009-07-20T23:59:06.686-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><title type='text'>A Simple Correlated Subquery Example</title><content type='html'>A correlated subquery is a subquery that needs to refer to the data returned in the main query. They can seem pretty scary at first, but they're fairly simply once you get the hang of it.&lt;br /&gt;&lt;br /&gt;In this example, I want to list all my artists, along with the most recent CD they have released. To do this, I have to select all the artists and their CDs, and then use a sub query to select the latested (MAX) date published for each artist.&lt;br /&gt;&lt;br /&gt;With a corrolated subquery you can (usually) run the query without the subquery to see all the results, like this:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;PRE&gt;&lt;br /&gt;mysql&gt; SELECT artist.name, cd.title, cd.yearpublished&lt;br /&gt;    -&gt; FROM artist, cdtable AS cd&lt;br /&gt;    -&gt; WHERE artist.id = cd.artid&lt;br /&gt;    -&gt; ;&lt;br /&gt;+----------------+--------------------+---------------+&lt;br /&gt;| name           | title              | yearpublished |&lt;br /&gt;+----------------+--------------------+---------------+&lt;br /&gt;| Phatfish       | Guaranteed         |          2007 |&lt;br /&gt;| Phatfish       | 15                 |          2008 |&lt;br /&gt;| Bethany Dillon | Waking Up          |          2007 |&lt;br /&gt;| Bethany Dillon | Bethany Dillon     |          2004 |&lt;br /&gt;| Bethany Dillon | Imagination        |          2005 |&lt;br /&gt;| Nick Drake     | Made To Love Magic |          2004 |&lt;br /&gt;| Nick Drake     | Five Leaves Left   |          2004 |&lt;br /&gt;| Nick Drake     | Bryter Layter      |          2000 |&lt;br /&gt;+----------------+--------------------+---------------+&lt;br /&gt;8 rows in set (0.00 sec)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;This lists out all the CDs for each artist, so we need to tell the query to only list the most recent:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;mysql&gt; SELECT artist.name, cd.title, cd.yearpublished&lt;br /&gt;    -&gt; FROM artist, cdtable AS cd&lt;br /&gt;    -&gt; WHERE artist.id = cd.artid&lt;br /&gt;    -&gt; AND cd.yearpublished =&lt;br /&gt;    -&gt;     (SELECT MAX(yearpublished)&lt;br /&gt;    -&gt;      FROM cdtable&lt;br /&gt;    -&gt;      WHERE cdtable.artid = cd.artid)&lt;br /&gt;    -&gt; ;&lt;br /&gt;+----------------+--------------------+---------------+&lt;br /&gt;| name           | title              | yearpublished |&lt;br /&gt;+----------------+--------------------+---------------+&lt;br /&gt;| Phatfish       | 15                 |          2008 |&lt;br /&gt;| Bethany Dillon | Waking Up          |          2007 |&lt;br /&gt;| Nick Drake     | Made To Love Magic |          2004 |&lt;br /&gt;| Nick Drake     | Five Leaves Left   |          2004 |&lt;br /&gt;+----------------+--------------------+---------------+&lt;br /&gt;4 rows in set (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Notice that we have two rows returned for Nick Drake. This is because two CDs match the condition. Of course, Nick Drake wasn't publishing anything in 2004, unfortunately. Had I used the original vinyl publication date, it would have been different.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8889503345796134899-7057619770593507356?l=mymymysql.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mymymysql.blogspot.com/feeds/7057619770593507356/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8889503345796134899&amp;postID=7057619770593507356' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/7057619770593507356'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/7057619770593507356'/><link rel='alternate' type='text/html' href='http://mymymysql.blogspot.com/2009/07/simple-correlated-subquery-example.html' title='A Simple Correlated Subquery Example'/><author><name>Tim</name><uri>http://www.blogger.com/profile/06805212306986685899</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://1.bp.blogspot.com/_GWztxWEQGnI/SnLAhgJmFCI/AAAAAAAAAEU/1ieqd3aplzo/S220/DSC00082.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8889503345796134899.post-6718337230907698109</id><published>2009-06-16T05:34:00.000-07:00</published><updated>2009-07-20T23:59:44.530-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>Improving the menus</title><content type='html'>It would be great if one single program were to be flexible enough to handle all the menus. After all, they are in a single database table.&lt;br /&gt;&lt;br /&gt;The idea is to pass the program a parameter telling it which menu to show. It will test, and if no menu has been requested, it will show the main menu.&lt;br /&gt;&lt;br /&gt;I'll also move tings around to put the database open and closing in to functions, and the head and tail printing as well.&lt;br /&gt;&lt;br /&gt;One thing to bear in mind is that the menu header is currently hard code, and this will need to be pulled from the database.&lt;br /&gt;&lt;br /&gt;So, create a table to store the menu details!&lt;br /&gt;&lt;br /&gt;We'll need a primary index on the menus table:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;CREATE TABLE menus (&lt;br /&gt;   id           INT NOT NULL AUTO_INCREMENT,&lt;br /&gt;   name         VARCHAR(20),&lt;br /&gt;   title        VARCHAR(40),&lt;br /&gt;   description  VARCHAR(80),&lt;br /&gt;   last_updated TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP (),&lt;br /&gt;   PRIMARY KEY (id)&lt;br /&gt;)  ENGINE=INNODB;&lt;br /&gt;&lt;br /&gt;CREATE TABLE cddb.menuitems (&lt;br /&gt;   menuid    INT NOT NULL,&lt;br /&gt;   itemno    INT NOT NULL,&lt;br /&gt;   itemtext  VARCHAR(50) NOT NULL,&lt;br /&gt;   itemlink  VARCHAR(150) NOT NULL,&lt;br /&gt;   last_updated TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP (),&lt;br /&gt;   FOREIGN KEY (menuid) REFERENCES menus(id) ON DELETE CASCADE&lt;br /&gt;)  ENGINE=INNODB;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;And repopulate:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;INSERT INTO cddb.menus (name, title, description) values ('mainmenu','Main Menu', 'Welcome to my CD Collection');&lt;br /&gt;INSERT INTO cddb.menus (name, title, description) values ('listmenu','List Menu', 'List Details of my CD Collection');&lt;br /&gt;&lt;br /&gt;INSERT INTO cddb.menuitems (menuid, itemno, itemtext, itemlink)&lt;br /&gt;  values (1,1,'Data Entry','mainmenu.php?menuname=dataentrymenu');&lt;br /&gt;&lt;br /&gt;INSERT INTO cddb.menuitems (menuid, itemno, itemtext, itemlink)&lt;br /&gt;  values (1,2,'Data Lists','mainmenu.php?menuname=listmenu');&lt;br /&gt;&lt;br /&gt;INSERT INTO cddb.menuitems (menuid, itemno, itemtext, itemlink)&lt;br /&gt;  values (1,3,'Reports','mainmenu.php?menuname=reportsmenu');&lt;br /&gt;&lt;br /&gt;INSERT INTO cddb.menuitems (menuid, itemno, itemtext, itemlink)&lt;br /&gt;  values (2,1,'List Publisher','publishers.php');&lt;br /&gt;INSERT INTO cddb.menuitems (menuid, itemno, itemtext, itemlink)&lt;br /&gt;  values (2,2,'List Artists','artists.php');&lt;br /&gt;INSERT INTO cddb.menuitems (menuid, itemno, itemtext, itemlink)&lt;br /&gt;  values (2,3,'CDs by Artists','lcdsbyartist.php');&lt;br /&gt;INSERT INTO cddb.menuitems (menuid, itemno, itemtext, itemlink)&lt;br /&gt;  values (2,4,'Tracks by CD','track.php');&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Finally - rewrite the menu PHP&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;LT;?php&lt;br /&gt;function openMyDB()&lt;br /&gt;{&lt;br /&gt;include("DBInfo.inc");&lt;br /&gt;$con = mysql_connect($mydbhost,$mydbuser,$mydbpassword);&lt;br /&gt;if (!$con) {&lt;br /&gt; die('Could not connect: ' . mysql_error());&lt;br /&gt;}&lt;br /&gt;mysql_select_db("cddb", $con);&lt;br /&gt;return $con;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function closeMyDB($con)&lt;br /&gt;{&lt;br /&gt;mysql_close($con);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function writeHead($MenuName)&lt;br /&gt;{&lt;br /&gt;$MyQuery =            "SELECT title, description FROM menus m ";&lt;br /&gt;$MyQuery = $MyQuery . "WHERE m.name = '" . $MenuName . "'";&lt;br /&gt;&lt;br /&gt;$result = mysql_query($MyQuery);&lt;br /&gt;$row = mysql_fetch_array($result);&lt;br /&gt;&lt;br /&gt;echo "&amp;LT;html&amp;GT;\n&amp;LT;head&amp;GT;\n&amp;LT;title&amp;GT;" . $row['title'] . "&amp;LT;/title&amp;GT;\n&amp;LT;/head&amp;GT;\n";&lt;br /&gt;echo "&amp;LT;body&amp;GT;\n";&lt;br /&gt;echo "&amp;LT;h1&amp;GT;" . $row['description'] . "&amp;LT;/h1&amp;GT;\n";&lt;br /&gt;mysql_free_result($result);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function writeTail()&lt;br /&gt;{&lt;br /&gt;echo "&amp;LT;/body&amp;GT;\n&amp;LT;/html&amp;GT;";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Main Program starts here&lt;br /&gt;&lt;br /&gt;$mycon=openMyDB();&lt;br /&gt;&lt;br /&gt;if ( empty($_GET['menuname'])) &lt;br /&gt; $MyMenuName='mainmenu';&lt;br /&gt;else&lt;br /&gt; $MyMenuName=$_GET['menuname'];&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;writehead($MyMenuName);&lt;br /&gt;echo "&amp;LT;ol&amp;GT;\n";&lt;br /&gt;&lt;br /&gt;$MyQuery =            "SELECT itemtext, itemlink, itemno FROM menus m, menuitems mi ";&lt;br /&gt;$MyQuery = $MyQuery . "WHERE m.name = '" . $MyMenuName . "' ";&lt;br /&gt;$MyQuery = $MyQuery . "and m.id=mi.menuid order by itemno";&lt;br /&gt;&lt;br /&gt;$result = mysql_query($MyQuery);&lt;br /&gt;while ($row = mysql_fetch_array($result)) {&lt;br /&gt; echo "&amp;LT;li&amp;GT;\n";&lt;br /&gt; echo "&amp;LT;a href=\"" . $row['itemlink'] . "\"&amp;GT;";&lt;br /&gt; echo $row['itemtext'] . "&amp;LT;/a&amp;GT;";&lt;br /&gt; echo "\n&amp;LT;/li&amp;GT;\n";&lt;br /&gt;}&lt;br /&gt;mysql_free_result($result);&lt;br /&gt;echo "&amp;LT;/ol&amp;GT;";&lt;br /&gt;writetail();&lt;br /&gt;closeMyDB($mycon);&lt;br /&gt;&lt;br /&gt;?&amp;GT;&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/8889503345796134899-6718337230907698109?l=mymymysql.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mymymysql.blogspot.com/feeds/6718337230907698109/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8889503345796134899&amp;postID=6718337230907698109' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/6718337230907698109'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/6718337230907698109'/><link rel='alternate' type='text/html' href='http://mymymysql.blogspot.com/2009/06/improving-menus.html' title='Improving the menus'/><author><name>Tim</name><uri>http://www.blogger.com/profile/06805212306986685899</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://1.bp.blogspot.com/_GWztxWEQGnI/SnLAhgJmFCI/AAAAAAAAAEU/1ieqd3aplzo/S220/DSC00082.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8889503345796134899.post-8932677338867268121</id><published>2009-06-09T08:23:00.000-07:00</published><updated>2009-06-13T02:34:54.076-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='html'/><title type='text'>Tidying up the code</title><content type='html'>I have decided to tidy up the code a little. I have moved the database details in to a file that gets included, and moved the database opening and closing into functions. This bit was (slightly) interesting (in fact almost too interesting to be included in this otherwise boring blog). The database open function has to return a value that points to the open database, and then we have to pass that value to the database close function. There - that was exciting wasn't it!&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&amp;lt;?php&lt;br /&gt;&lt;br /&gt;function openMyDB()&lt;br /&gt;{&lt;br /&gt;include("DBInfo.inc");&lt;br /&gt;$con = mysql_connect($mydbhost,$mydbuser,$mydbpassword);&lt;br /&gt;if (!$con) {&lt;br /&gt; die('Could not connect: ' . mysql_error());&lt;br /&gt;}&lt;br /&gt;mysql_select_db("cddb", $con);&lt;br /&gt;return $con;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function closeMyDB($con)&lt;br /&gt;{&lt;br /&gt;mysql_close($con);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function writeHead()&lt;br /&gt;{&lt;br /&gt;echo "&amp;lt;html&amp;gt;\n&amp;lt;head&amp;gt;\n&amp;lt;title&amp;gt;CDs By Artists&amp;lt;/title&amp;gt;\n&amp;lt;/head&amp;gt;\n";&lt;br /&gt;echo "&amp;lt;body&amp;gt;\n";&lt;br /&gt;echo "&amp;lt;h1&amp;gt;CDs By Artists&amp;lt;/h1&amp;gt;\n";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function writeTail()&lt;br /&gt;{&lt;br /&gt;echo "&amp;lt;/body&amp;gt;\n&amp;lt;/html&amp;gt;";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;function writeMenu()&lt;br /&gt;{&lt;br /&gt;echo "&amp;lt;form action=\"" . $_SERVER['PHP_SELF'] . "\" method=\"post\"&amp;gt;\n";&lt;br /&gt;echo "&amp;lt;select name=\"artid\"&amp;gt;\n";&lt;br /&gt;&lt;br /&gt;$result = mysql_query("SELECT id, name FROM artist order by name");&lt;br /&gt;while ($row = mysql_fetch_array($result)) {&lt;br /&gt; echo "&amp;lt;option value=\"";&lt;br /&gt; echo $row['id'] . "\"&amp;gt;".$row['name'];&lt;br /&gt; echo "&amp;lt;/option&amp;gt;\n";&lt;br /&gt;}&lt;br /&gt;mysql_free_result($result);&lt;br /&gt;echo "&amp;lt;/select&amp;gt;\n";&lt;br /&gt;echo "&amp;lt;input type=\"submit\" value=\"Submit\"&amp;gt;";&lt;br /&gt;echo "&amp;lt;/form&amp;gt;\n";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function writeDetails($artid)&lt;br /&gt;{&lt;br /&gt;$result = mysql_query("SELECT name FROM artist where id = " . $artid . ";");&lt;br /&gt;$row = mysql_fetch_array($result);&lt;br /&gt;echo "&amp;lt;h3&amp;gt;" . $row['name'] . "&amp;lt;/h3&amp;gt;\n";&lt;br /&gt;mysql_free_result($result);&lt;br /&gt;$result = mysql_query("SELECT title, yearpublished from cdtable where artid = " . $artid . ";");&lt;br /&gt;echo "&amp;lt;table&amp;gt;\n&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;Year Published&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Title&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;\n";&lt;br /&gt;while ($row = mysql_fetch_array($result)) {&lt;br /&gt; echo "&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;" . $row['yearpublished'] . "&amp;lt;/td&amp;gt;";&lt;br /&gt; echo "&amp;lt;td&amp;gt;" . $row[title] . "&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;\n";&lt;br /&gt;}&lt;br /&gt;mysql_free_result($result);&lt;br /&gt;echo "&amp;lt;/table&amp;gt;\n";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#&lt;br /&gt;## Main Body&lt;br /&gt;#&lt;br /&gt;&lt;br /&gt;$mycon=openMyDB();&lt;br /&gt;writehead();&lt;br /&gt;if ( empty($_POST['artid']) )&lt;br /&gt;{&lt;br /&gt; writeMenu();&lt;br /&gt;}&lt;br /&gt;else &lt;br /&gt;{&lt;br /&gt; writeDetails($_POST['artid']);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;writetail();&lt;br /&gt;closeMyDB($mycon);&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;And the incude file looks like this:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&amp;lt;?php&lt;br /&gt;$mydbhost="localhost";&lt;br /&gt;$mydbuser="timj";&lt;br /&gt;$mydbpassword="xxxxxx";&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;That's enough excitement for one day!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8889503345796134899-8932677338867268121?l=mymymysql.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mymymysql.blogspot.com/feeds/8932677338867268121/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8889503345796134899&amp;postID=8932677338867268121' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/8932677338867268121'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/8932677338867268121'/><link rel='alternate' type='text/html' href='http://mymymysql.blogspot.com/2009/06/tidying-up-code.html' title='Tidying up the code'/><author><name>Tim</name><uri>http://www.blogger.com/profile/06805212306986685899</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://1.bp.blogspot.com/_GWztxWEQGnI/SnLAhgJmFCI/AAAAAAAAAEU/1ieqd3aplzo/S220/DSC00082.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8889503345796134899.post-6358418768462398699</id><published>2009-06-05T07:01:00.001-07:00</published><updated>2009-07-21T00:00:03.542-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>My first form in PHP</title><content type='html'>This form checks to see if it has been past a parameter. If not it displays a pull-down list of the artists on file. If it has been passed a value, it uses that value to pull out the CDs on file for an artist. That way the same piece of code is used twice.&lt;br /&gt;&lt;br /&gt;I've tried to put things in functions to make it a little more tidy.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&amp;lt;?php&lt;br /&gt;function writeHead()&lt;br /&gt;{&lt;br /&gt;echo "&amp;lt;html&amp;gt;\n&amp;lt;head&amp;gt;\n&amp;lt;title&amp;gt;CDs By Artists&amp;lt;/title&amp;gt;\n&amp;lt;/head&amp;gt;\n";&lt;br /&gt;echo "&amp;lt;body&amp;gt;\n";&lt;br /&gt;echo "&amp;lt;h1&amp;gt;CDs By Artists&amp;lt;/h1&amp;gt;\n";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function writeTail()&lt;br /&gt;{&lt;br /&gt;echo "&amp;lt;/body&amp;gt;\n&amp;lt;/html&amp;gt;";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;function writeMenu()&lt;br /&gt;{&lt;br /&gt;echo "&amp;lt;form action=\"" . $_SERVER['PHP_SELF'] . "\" method=\"post\"&amp;gt;\n";&lt;br /&gt;echo "&amp;lt;select name=\"artid\"&amp;gt;\n";&lt;br /&gt;&lt;br /&gt;$result = mysql_query("SELECT id, name FROM artist order by name");&lt;br /&gt;while ($row = mysql_fetch_array($result)) {&lt;br /&gt; echo "&amp;lt;option value=\"";&lt;br /&gt; echo $row['id'] . "\"&amp;gt;".$row['name'];&lt;br /&gt; echo "&amp;lt;/option&amp;gt;\n";&lt;br /&gt;}&lt;br /&gt;mysql_free_result($result);&lt;br /&gt;echo "&amp;lt;/select&amp;gt;\n";&lt;br /&gt;echo "&amp;lt;input type=\"submit\" value=\"Submit\"&amp;gt;";&lt;br /&gt;echo "&amp;lt;/form&amp;gt;\n";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function writeDetails($artid)&lt;br /&gt;{&lt;br /&gt;$result = mysql_query("SELECT name FROM artist where id = " . $artid . ";");&lt;br /&gt;$row = mysql_fetch_array($result);&lt;br /&gt;echo "&amp;lt;h3&amp;gt;" . $row['name'] . "&amp;lt;/h3&amp;gt;\n";&lt;br /&gt;mysql_free_result($result);&lt;br /&gt;$result = mysql_query("SELECT title, yearpublished from cdtable where artid = " . $artid . ";");&lt;br /&gt;echo "&amp;lt;table&amp;gt;\n&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;Year Published&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Title&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;\n";&lt;br /&gt;while ($row = mysql_fetch_array($result)) {&lt;br /&gt; echo "&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;" . $row['yearpublished'] . "&amp;lt;/td&amp;gt;";&lt;br /&gt; echo "&amp;lt;td&amp;gt;" . $row[title] . "&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;\n";&lt;br /&gt;}&lt;br /&gt;mysql_free_result($result);&lt;br /&gt;echo "&amp;lt;/table&amp;gt;\n";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#&lt;br /&gt;## Main Body&lt;br /&gt;#&lt;br /&gt;$con = mysql_connect("localhost","timj","xxxxxx");&lt;br /&gt;if (!$con) {&lt;br /&gt; die('Could not connect: ' . mysql_error());&lt;br /&gt;}&lt;br /&gt;mysql_select_db("cddb", $con);&lt;br /&gt;&lt;br /&gt;writehead();&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;if ($_POST['artid']=="") writeMenu();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;else writeDetails($_POST['artid']);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;writetail();&lt;br /&gt;&lt;br /&gt;mysql_close($con);&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8889503345796134899-6358418768462398699?l=mymymysql.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mymymysql.blogspot.com/feeds/6358418768462398699/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8889503345796134899&amp;postID=6358418768462398699' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/6358418768462398699'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/6358418768462398699'/><link rel='alternate' type='text/html' href='http://mymymysql.blogspot.com/2009/06/my-first-form-in-php.html' title='My first form in PHP'/><author><name>Tim</name><uri>http://www.blogger.com/profile/06805212306986685899</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://1.bp.blogspot.com/_GWztxWEQGnI/SnLAhgJmFCI/AAAAAAAAAEU/1ieqd3aplzo/S220/DSC00082.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8889503345796134899.post-3188694451656225721</id><published>2009-06-05T04:26:00.000-07:00</published><updated>2009-06-09T08:32:25.195-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='html'/><title type='text'>And here is the Artists table:</title><content type='html'>&lt;blockquote&gt;&lt;br /&gt;&amp;lt;?php&lt;br /&gt;echo "&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;Artists&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;";&lt;br /&gt;echo "&amp;lt;body&amp;gt;";&lt;br /&gt;echo "&amp;lt;h1&amp;gt;Artists in my CD Collection&amp;lt;/h1&amp;gt;";&lt;br /&gt;echo "&amp;lt;ol&amp;gt;\n";&lt;br /&gt;$con = mysql_connect("localhost","timj","xxxxx");&lt;br /&gt;if (!$con) {&lt;br /&gt; die('Could not connect: ' . mysql_error());&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;mysql_select_db("cddb", $con);&lt;br /&gt;&lt;br /&gt;$result = mysql_query("SELECT name FROM artist order by name");&lt;br /&gt;while ($row = mysql_fetch_array($result)) {&lt;br /&gt; echo "&amp;lt;li&amp;gt;\n";&lt;br /&gt; echo $row['name'] ;&lt;br /&gt; echo "&amp;lt;/li&amp;gt;\n";&lt;br /&gt;}&lt;br /&gt;mysql_free_result($result);&lt;br /&gt;mysql_close($con);&lt;br /&gt;echo "&amp;lt;/ol&amp;gt;";&lt;br /&gt;echo "&amp;lt;/body&amp;gt;";&lt;br /&gt;echo "&amp;lt;/html&amp;gt;";&lt;br /&gt;?&amp;gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Pretty much the same as the Publishers screen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8889503345796134899-3188694451656225721?l=mymymysql.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mymymysql.blogspot.com/feeds/3188694451656225721/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8889503345796134899&amp;postID=3188694451656225721' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/3188694451656225721'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/3188694451656225721'/><link rel='alternate' type='text/html' href='http://mymymysql.blogspot.com/2009/06/and-here-is-artists-table.html' title='And here is the Artists table:'/><author><name>Tim</name><uri>http://www.blogger.com/profile/06805212306986685899</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://1.bp.blogspot.com/_GWztxWEQGnI/SnLAhgJmFCI/AAAAAAAAAEU/1ieqd3aplzo/S220/DSC00082.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8889503345796134899.post-3972539606903211052</id><published>2009-06-04T09:51:00.000-07:00</published><updated>2009-06-09T08:32:55.585-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>Listing Data</title><content type='html'>Here is the code for my Publishers list:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&amp;lt;?php&lt;br /&gt;echo "&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;List Menu&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;";&lt;br /&gt;echo "&amp;lt;body&amp;gt;";&lt;br /&gt;echo "&amp;lt;h1&amp;gt;Explore My CD Collection&amp;lt;/h1&amp;gt;";&lt;br /&gt;echo "&amp;lt;ol&amp;gt;\n";&lt;br /&gt;$con = mysql_connect("localhost","timj","xxxxxxx");&lt;br /&gt;if (!$con) {&lt;br /&gt; die('Could not connect: ' . mysql_error());&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;mysql_select_db("cddb", $con);&lt;br /&gt;&lt;br /&gt;$result = mysql_query("SELECT itemtext, itemlink, itemno FROM menus WHERE name = 'listmenu' order by itemno");&lt;br /&gt;while ($row = mysql_fetch_array($result)) {&lt;br /&gt; echo "&amp;lt;li&amp;gt;\n";&lt;br /&gt; echo "&amp;lt;a href=\"" . $row['itemlink'] . "\"&amp;gt;";&lt;br /&gt; echo $row['itemtext'] . "&amp;lt;/a&amp;gt;";&lt;br /&gt; echo "\n&amp;lt;/li&amp;gt;\n";&lt;br /&gt;}&lt;br /&gt;mysql_free_result($result);&lt;br /&gt;mysql_close($con);&lt;br /&gt;echo "&amp;lt;/ol&amp;gt;";&lt;br /&gt;echo "&amp;lt;/body&amp;gt;";&lt;br /&gt;echo "&amp;lt;/html&amp;gt;";&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;The Output html looks like this:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;D:\Database\CDDB\DocRoot&amp;gt;php publishers.php&lt;br /&gt;&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;Publsihers&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Publishers in my CD Collection&amp;lt;/h1&amp;gt;&amp;lt;ol&amp;gt;&lt;br /&gt;&amp;lt;li&amp;gt;&lt;br /&gt;EMI&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;li&amp;gt;&lt;br /&gt;SONY&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;/ol&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&lt;br /&gt;D:\Database\CDDB\DocRoot&amp;gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8889503345796134899-3972539606903211052?l=mymymysql.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mymymysql.blogspot.com/feeds/3972539606903211052/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8889503345796134899&amp;postID=3972539606903211052' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/3972539606903211052'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/3972539606903211052'/><link rel='alternate' type='text/html' href='http://mymymysql.blogspot.com/2009/06/listing-data.html' title='Listing Data'/><author><name>Tim</name><uri>http://www.blogger.com/profile/06805212306986685899</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://1.bp.blogspot.com/_GWztxWEQGnI/SnLAhgJmFCI/AAAAAAAAAEU/1ieqd3aplzo/S220/DSC00082.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8889503345796134899.post-466855992709969257</id><published>2009-05-11T05:36:00.000-07:00</published><updated>2009-06-09T08:33:18.597-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><title type='text'>A Trigger to show when a row was last updated</title><content type='html'>It is a good idea to be able to tell when a row has been updated on your table. &lt;br /&gt;Here is a simple way of doing that. It's not perfect auditing, for that you would need to write a trigger to store the before and after values in a table that the normal user could not write to, but it's a start.&lt;br /&gt;&lt;br /&gt;Add a column to our table to hold the date stamp:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;CREATE TABLE cddb.menus (&lt;br /&gt;   name      VARCHAR(20) NOT NULL,&lt;br /&gt;   itemno    INT NOT NULL,&lt;br /&gt;   itemtext  VARCHAR(50) NOT NULL,&lt;br /&gt;   itemlink  VARCHAR(150) NOT NULL,&lt;br /&gt;   last_updated TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP&lt;br /&gt;);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;and write a simple trigger to fire off when the table is updated:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;CREATE TRIGGER cddb.t_menus_1&lt;br /&gt;BEFORE UPDATE&lt;br /&gt;ON cddb.menus&lt;br /&gt;FOR EACH ROW SET&lt;br /&gt;new.last_updated:=CURRENT_TIMESTAMP();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The results we get are:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mysql&gt; select * from menus;&lt;br /&gt;+----------+--------+-----------------+------------------+---------------------+&lt;br /&gt;| name     | itemno | itemtext        | itemlink         | last_updated        |&lt;br /&gt;+----------+--------+-----------------+------------------+---------------------+&lt;br /&gt;| mainmenu |      1 | Data Entre      | dataentry.php    | 2009-05-11 13:57:13 |&lt;br /&gt;| mainmenu |      2 | Data Lists      | datalists.php    | 2009-05-11 13:57:13 |&lt;br /&gt;| mainmenu |      3 | Reports         | reports.php      | 2009-05-11 13:57:13 |&lt;br /&gt;| listmenu |      1 | List Publishers | publishers.php   | 2009-05-11 13:57:13 |&lt;br /&gt;| listmenu |      2 | List Artists    | artists.php      | 2009-05-11 13:57:13 |&lt;br /&gt;| listmenu |      3 | CDs by Artist   | lcdsbyartist.php | 2009-05-11 13:57:13 |&lt;br /&gt;| listmenu |      4 | Tracks by CD    | track.php        | 2009-05-11 13:57:13 |&lt;br /&gt;+----------+--------+-----------------+------------------+---------------------+&lt;br /&gt;7 rows in set (0.02 sec)&lt;br /&gt;&lt;br /&gt;mysql&gt; update menus set itemtext = 'New item' where name = 'mainmenu' and itemno=1;&lt;br /&gt;Query OK, 1 row affected (0.00 sec)&lt;br /&gt;Rows matched: 1  Changed: 1  Warnings: 0&lt;br /&gt;&lt;br /&gt;mysql&gt; select * from menus;&lt;br /&gt;+----------+--------+-----------------+------------------+---------------------+&lt;br /&gt;| name     | itemno | itemtext        | itemlink         | last_updated        |&lt;br /&gt;+----------+--------+-----------------+------------------+---------------------+&lt;br /&gt;| mainmenu |      1 | New item        | dataentry.php    | 2009-05-11 13:59:38 |&lt;br /&gt;| mainmenu |      2 | Data Lists      | datalists.php    | 2009-05-11 13:57:13 |&lt;br /&gt;| mainmenu |      3 | Reports         | reports.php      | 2009-05-11 13:57:13 |&lt;br /&gt;| listmenu |      1 | List Publishers | publishers.php   | 2009-05-11 13:57:13 |&lt;br /&gt;| listmenu |      2 | List Artists    | artists.php      | 2009-05-11 13:57:13 |&lt;br /&gt;| listmenu |      3 | CDs by Artist   | lcdsbyartist.php | 2009-05-11 13:57:13 |&lt;br /&gt;| listmenu |      4 | Tracks by CD    | track.php        | 2009-05-11 13:57:13 |&lt;br /&gt;+----------+--------+-----------------+------------------+---------------------+&lt;br /&gt;7 rows in set (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&gt;&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/8889503345796134899-466855992709969257?l=mymymysql.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mymymysql.blogspot.com/feeds/466855992709969257/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8889503345796134899&amp;postID=466855992709969257' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/466855992709969257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/466855992709969257'/><link rel='alternate' type='text/html' href='http://mymymysql.blogspot.com/2009/05/trigger-to-show-when-row-was-last.html' title='A Trigger to show when a row was last updated'/><author><name>Tim</name><uri>http://www.blogger.com/profile/06805212306986685899</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://1.bp.blogspot.com/_GWztxWEQGnI/SnLAhgJmFCI/AAAAAAAAAEU/1ieqd3aplzo/S220/DSC00082.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8889503345796134899.post-5829416399622348525</id><published>2009-05-08T23:27:00.000-07:00</published><updated>2009-05-11T06:05:44.025-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='load'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>PHP - My website's menus</title><content type='html'>I have decided that I want all the menus on my web site to be dynamic, driven from the database rather than hard-coded in HTML. This has the advantage that it you want to add a menu item, you just add it to the database, you don't need to recode your menus. Of course it requires a little more work up front, but that's what we are here for!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 1:&lt;/span&gt;&lt;br /&gt;Create a database table to hold your menus:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;CREATE TABLE cddb.menus (&lt;br /&gt;  name      VARCHAR(20) NOT NULL,&lt;br /&gt;  itemno    INT NOT NULL,&lt;br /&gt;  itemtext  VARCHAR(50) NOT NULL,&lt;br /&gt;  itemlink  VARCHAR(150) NOT NULL&lt;br /&gt;);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 2:&lt;/span&gt;&lt;br /&gt;Create a text file with your menus defined in it:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mainmenu,1,Data Centre,dataentry.php&lt;br /&gt;mainmenu,2,Data Lists,datalists.php&lt;br /&gt;mainmenu,3,Reports,reports.php&lt;br /&gt;listmenu,1,List Publishers,publishers.php&lt;br /&gt;listmenu,2,List Artists,artists.php&lt;br /&gt;listmenu,3,CDs by Artist,lcdsbyartist.php&lt;br /&gt;listmenu,4,Tracks by CD,track.php&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;I am working on a Windows laptop, and I found that the load command didn't handle the windows EOL characters well, it corrupts the final field. I'm sure that there is a way around this, but I ended up using a dos2unix command in cygwin.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 3:&lt;/span&gt;&lt;br /&gt;Import your menu data into your database:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mysql&gt; LOAD DATA LOCAL INFILE 'menus.txt' INTO TABLE cddb.menus FIELDS TERMINATED BY ',';&lt;br /&gt;Query OK, 7 rows affected, 7 warnings (0.00 sec)&lt;br /&gt;Records: 7  Deleted: 0  Skipped: 0  Warnings: 7&lt;br /&gt;&lt;br /&gt;mysql&gt; select * from menus;&lt;br /&gt;+----------+--------+-----------------+------------------+&lt;br /&gt;| name     | itemno | itemtext        | itemlink         |&lt;br /&gt;+----------+--------+-----------------+------------------+&lt;br /&gt;| mainmenu |      1 | Data Centre     | dataentry.php    |&lt;br /&gt;| mainmenu |      2 | Data Lists      | datalists.php    |&lt;br /&gt;| mainmenu |      3 | Reports         | reports.php      |&lt;br /&gt;| listmenu |      1 | List Publishers | publishers.php   |&lt;br /&gt;| listmenu |      2 | List Artists    | artists.php      |&lt;br /&gt;| listmenu |      3 | CDs by Artist   | lcdsbyartist.php |&lt;br /&gt;| listmenu |      4 | Tracks by CD    | track.php        |&lt;br /&gt;+----------+--------+-----------------+------------------+&lt;br /&gt;7 rows in set (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 4:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Final Step, to get write the PHP to create the index page.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;?php&lt;br /&gt;echo "&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;Main Menu&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;";&lt;br /&gt;echo "&amp;lt;body&amp;gt;";&lt;br /&gt;echo "&amp;lt;h1&amp;gt;Welcome to my CD Collection&amp;lt;/h1&amp;gt;";&lt;br /&gt;echo "&amp;lt;ol&amp;gt;\n";&lt;br /&gt;$con = mysql_connect("localhost","timj","xxx");&lt;br /&gt;if (!$con) {&lt;br /&gt;    die('Could not connect: ' . mysql_error());&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;mysql_select_db("cddb", $con);&lt;br /&gt;&lt;br /&gt;$result = mysql_query("SELECT itemtext, itemlink, itemno FROM menus WHERE name = 'mainmenu' order by itemno");&lt;br /&gt;while ($row = mysql_fetch_array($result)) {&lt;br /&gt;    echo "&amp;lt;li&amp;gt;\n";&lt;br /&gt;    echo "&amp;lt;a href=\"" . $row['itemlink'] . "\"&amp;gt;";&lt;br /&gt;    echo $row['itemtext'] . "&amp;lt;/a&amp;gt;";&lt;br /&gt;    echo "\n&amp;lt;/li&amp;gt;\n";&lt;br /&gt;}&lt;br /&gt;mysql_free_result($result);&lt;br /&gt;mysql_close($con);&lt;br /&gt;echo "&amp;lt;/ol&amp;gt;";&lt;br /&gt;echo "&amp;lt;/body&amp;gt;";&lt;br /&gt;echo "&amp;lt;/html&amp;gt;";&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And that's all there is to it!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8889503345796134899-5829416399622348525?l=mymymysql.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mymymysql.blogspot.com/feeds/5829416399622348525/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8889503345796134899&amp;postID=5829416399622348525' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/5829416399622348525'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/5829416399622348525'/><link rel='alternate' type='text/html' href='http://mymymysql.blogspot.com/2009/05/php-my-websites-menus.html' title='PHP - My website&apos;s menus'/><author><name>Tim</name><uri>http://www.blogger.com/profile/06805212306986685899</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://1.bp.blogspot.com/_GWztxWEQGnI/SnLAhgJmFCI/AAAAAAAAAEU/1ieqd3aplzo/S220/DSC00082.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8889503345796134899.post-388891872078873853</id><published>2009-05-08T22:25:00.000-07:00</published><updated>2009-05-08T23:22:05.950-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='Constraints'/><title type='text'>Foreign Key Contraints in MySQL</title><content type='html'>Schema&lt;br /&gt;&lt;br /&gt;OK, these are a few tables to show off foreign key constraints:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;CREATE TABLE cddb.publisher (&lt;br /&gt;id INT NOT NULL AUTO_INCREMENT,&lt;br /&gt;name VARCHAR(20) NOT NULL,&lt;br /&gt;PRIMARY KEY (id)&lt;br /&gt;) ENGINE=INNODB;&lt;br /&gt;&lt;br /&gt;CREATE TABLE cddb.artist (&lt;br /&gt;id INT NOT NULL AUTO_INCREMENT,&lt;br /&gt;name VARCHAR(50) NOT NULL,&lt;br /&gt;PRIMARY KEY (id)&lt;br /&gt;) ENGINE=INNODB;&lt;br /&gt;&lt;br /&gt;CREATE TABLE cddb.cdtable (&lt;br /&gt;id INT NOT NULL AUTO_INCREMENT,&lt;br /&gt;pubid INT NOT NULL,&lt;br /&gt;artid INT NOT NULL,&lt;br /&gt;title varchar(50) NOT NULL,&lt;br /&gt;yearpublished INT,&lt;br /&gt;PRIMARY KEY (id),&lt;br /&gt;INDEX (artid),&lt;br /&gt;FOREIGN KEY (artid)&lt;br /&gt;REFERENCES artist(id) ON DELETE CASCADE,&lt;br /&gt;INDEX (pubid),&lt;br /&gt;FOREIGN KEY (pubid)&lt;br /&gt;REFERENCES publisher(id) ON DELETE CASCADE&lt;br /&gt;) ENGINE=INNODB;&lt;br /&gt;&lt;br /&gt;mysql&gt; insert into cdtable (pubid, artid, title, yearpublished)&lt;br /&gt;-&gt; values&lt;br /&gt;-&gt; (1,2,'Waking Up',2007);&lt;br /&gt;Query OK, 1 row affected (0.01 sec)&lt;br /&gt;&lt;br /&gt;mysql&gt;&lt;br /&gt;mysql&gt; insert into cdtable (pubid, artid, title, yearpublished)&lt;br /&gt;-&gt; values&lt;br /&gt;-&gt; (1,3,'Yesterday, today &amp;amp; forever',2006);&lt;br /&gt;ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`cddb`.`cdtable`, CONSTRAINT `cdta&lt;br /&gt;ble_ibfk_1` FOREIGN KEY (`artid`) REFERENCES `artist` (`id`) ON DELETE CASCADE)&lt;br /&gt;mysql&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;As you can see, I could not add 'Yesterday, Today and Forever' as Vicky Beeching has not yet been added to the artists table.&lt;br /&gt;&lt;br /&gt;Likewise, if I delete Bethany Dillon as an artist on the system, it will delete all her CDs as well.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mysql&gt; select * from cdtable;&lt;br /&gt;+----+-------+-------+-----------+---------------+&lt;br /&gt;| id | pubid | artid | title     | yearpublished |&lt;br /&gt;+----+-------+-------+-----------+---------------+&lt;br /&gt;|  1 |     1 |     2 | Waking Up |          2007 |&lt;br /&gt;+----+-------+-------+-----------+---------------+&lt;br /&gt;1 row in set (0.00 sec)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;mysql&gt; delete from artist where id=2;&lt;br /&gt;Query OK, 1 row affected (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&gt; select * from cdtable;&lt;br /&gt;Empty set (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&gt;&lt;br /&gt;&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/8889503345796134899-388891872078873853?l=mymymysql.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mymymysql.blogspot.com/feeds/388891872078873853/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8889503345796134899&amp;postID=388891872078873853' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/388891872078873853'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/388891872078873853'/><link rel='alternate' type='text/html' href='http://mymymysql.blogspot.com/2009/05/foreign-key-contraints-in-mysql.html' title='Foreign Key Contraints in MySQL'/><author><name>Tim</name><uri>http://www.blogger.com/profile/06805212306986685899</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://1.bp.blogspot.com/_GWztxWEQGnI/SnLAhgJmFCI/AAAAAAAAAEU/1ieqd3aplzo/S220/DSC00082.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8889503345796134899.post-1269911447359694480</id><published>2009-05-05T14:26:00.000-07:00</published><updated>2009-05-05T14:37:26.372-07:00</updated><title type='text'>A new direction - PHP and MySQL</title><content type='html'>I have decided to focus on the LAMP stack, primarily PHP rather than Perl at the moment, and MySQL rather than Postgresql.&lt;br /&gt;&lt;ol id="rma60"&gt;&lt;li id="rma61"&gt;create a tablespace&lt;br /&gt;&lt;/li&gt;&lt;li id="rma63"&gt;create a database&lt;/li&gt;&lt;li id="rma64"&gt;create a user to own the database&lt;/li&gt;&lt;li id="rma65"&gt;create a role for the user to be in&lt;/li&gt;&lt;li id="rma68"&gt;create a table for publisher&lt;/li&gt;&lt;li id="rma68"&gt;create a table for artist&lt;/li&gt;&lt;li id="rma68"&gt;create a table for CDs, referential integrity against artist and publisher&lt;br /&gt;&lt;/li&gt;&lt;li id="rma68"&gt;create a table for tracks, referential integrity against CD&lt;/li&gt;&lt;li id="rma66"&gt;create a read-only user&lt;/li&gt;&lt;li id="rma67"&gt;write backup scripts for the database&lt;/li&gt;&lt;li id="rma68"&gt;ensure that deleting a CD deletes all tracks&lt;/li&gt;&lt;li id="rma68"&gt;ensure that deleting an artist deletes all CDs and tracks&lt;/li&gt;&lt;li id="rma68"&gt;write a report to report in number of CDs owned by artist&lt;/li&gt;&lt;li id="rma68"&gt;create data load scripts for publisher, artist and CDs&lt;/li&gt;&lt;li id="rma68"&gt;write forms to allow entry of publishers, artists, CD's and tracks&lt;/li&gt;&lt;li id="rma68"&gt;write a form to list the tracks of a selected CD&lt;/li&gt;&lt;li id="rma68"&gt;write a report to list all the CD's owned by an owner&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8889503345796134899-1269911447359694480?l=mymymysql.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mymymysql.blogspot.com/feeds/1269911447359694480/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8889503345796134899&amp;postID=1269911447359694480' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/1269911447359694480'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/1269911447359694480'/><link rel='alternate' type='text/html' href='http://mymymysql.blogspot.com/2009/05/new-direction-php-and-mysql.html' title='A new direction - PHP and MySQL'/><author><name>Tim</name><uri>http://www.blogger.com/profile/06805212306986685899</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://1.bp.blogspot.com/_GWztxWEQGnI/SnLAhgJmFCI/AAAAAAAAAEU/1ieqd3aplzo/S220/DSC00082.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8889503345796134899.post-2234012295280837796</id><published>2008-10-28T10:36:00.001-07:00</published><updated>2008-10-28T10:42:06.646-07:00</updated><title type='text'>My First Trigger!</title><content type='html'>The task - to create a table, and set a trigger to mark a row as updated any time an insert or update is run against it.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CREATE TABLE employee&lt;br /&gt;(&lt;br /&gt;surname character varying(20) NOT NULL,&lt;br /&gt;firstname character(20) NOT NULL,&lt;br /&gt;dob date NOT NULL,&lt;br /&gt;badgeid serial NOT NULL,&lt;br /&gt;last_updated date NOT NULL,&lt;br /&gt;CONSTRAINT u_badgeid UNIQUE (badgeid)&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;CREATE FUNCTION set_lastchg() RETURNS opaque AS&lt;br /&gt;'BEGIN&lt;br /&gt;NEW.last_updated = now();&lt;br /&gt;RETURN NEW;&lt;br /&gt;END;'&lt;br /&gt;LANGUAGE 'plpgsql';&lt;br /&gt;&lt;br /&gt;CREATE TRIGGER t_employee_1&lt;br /&gt;BEFORE INSERT OR UPDATE&lt;br /&gt;ON employee&lt;br /&gt;FOR EACH ROW&lt;br /&gt;EXECUTE PROCEDURE set_lastchg();&lt;br /&gt;&lt;br /&gt;insert into employee (surname, firstname, dob ) values&lt;br /&gt;('Jinkerson','Tim', date '1914-12-25')&lt;br /&gt;&lt;br /&gt;All looks good!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8889503345796134899-2234012295280837796?l=mymymysql.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mymymysql.blogspot.com/feeds/2234012295280837796/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8889503345796134899&amp;postID=2234012295280837796' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/2234012295280837796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/2234012295280837796'/><link rel='alternate' type='text/html' href='http://mymymysql.blogspot.com/2008/10/my-first-trigger.html' title='My First Trigger!'/><author><name>Tim</name><uri>http://www.blogger.com/profile/06805212306986685899</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://1.bp.blogspot.com/_GWztxWEQGnI/SnLAhgJmFCI/AAAAAAAAAEU/1ieqd3aplzo/S220/DSC00082.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8889503345796134899.post-6115039506839987007</id><published>2008-10-26T00:32:00.000-07:00</published><updated>2008-11-23T01:03:32.714-08:00</updated><title type='text'>Archiving and the Write Ahead Log</title><content type='html'>The next lesson is on setting up your database so that we can recover without data loss!&lt;br /&gt;&lt;br /&gt;Turn on in postgresql.conf&lt;br /&gt;On Windows XP this can be found at&lt;br /&gt;C:\Program Files\PostgreSQL\8.3\data&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#------------------------------------------------------------------------------&lt;br /&gt;# WRITE AHEAD LOG&lt;br /&gt;#------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;# - Settings -&lt;br /&gt;&lt;br /&gt;#fsync = on    # turns forced synchronization on or off&lt;br /&gt;#synchronous_commit = on  # immediate fsync at commit&lt;br /&gt;#wal_sync_method = fsync  # the default is the first option&lt;br /&gt;     # supported by the operating system:&lt;br /&gt;     #   open_datasync&lt;br /&gt;     #   fdatasync&lt;br /&gt;     #   fsync&lt;br /&gt;     #   fsync_writethrough&lt;br /&gt;     #   open_sync&lt;br /&gt;#full_page_writes = on   # recover from partial page writes&lt;br /&gt;#wal_buffers = 64kB   # min 32kB&lt;br /&gt;     # (change requires restart)&lt;br /&gt;#wal_writer_delay = 200ms  # 1-10000 milliseconds&lt;br /&gt;&lt;br /&gt;#commit_delay = 0   # range 0-100000, in microseconds&lt;br /&gt;#commit_siblings = 5   # range 1-1000&lt;br /&gt;&lt;br /&gt;# - Checkpoints -&lt;br /&gt;&lt;br /&gt;#checkpoint_segments = 3  # in logfile segments, min 1, 16MB each&lt;br /&gt;#checkpoint_timeout = 5min  # range 30s-1h&lt;br /&gt;#checkpoint_completion_target = 0.5 # checkpoint target duration, 0.0 - 1.0&lt;br /&gt;#checkpoint_warning = 30s  # 0 is off&lt;br /&gt;&lt;br /&gt;# - Archiving -&lt;br /&gt;&lt;br /&gt;#archive_mode = off  # allows archiving to be done&lt;br /&gt;    # (change requires restart)&lt;br /&gt;#archive_command = ''  # command to use to archive a logfile segment&lt;br /&gt;#archive_timeout = 0  # force a logfile segment switch after this&lt;br /&gt;    # time; 0 is off&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Need to configure the Archive copy command&lt;br /&gt;&lt;br /&gt;Making the following changes:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;fsync = on&lt;br /&gt;synchronous_commit = on&lt;br /&gt;wal_sync_method = fsync&lt;br /&gt;full_page_writes = on&lt;br /&gt;archive_mode = on&lt;br /&gt;archive_command = 'copy "%p" "J:\\server\\archivedir\\%f"'&lt;br /&gt;archive_timeout = 3600        # switch logs every hour&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;Loads of information can be found here&lt;br /&gt;&lt;a href="http://www.westnet.com/%7Egsmith/content/postgresql/TuningPGWAL.htm"&gt;http://www.westnet.com/~gsmith/content/postgresql/TuningPGWAL.htm&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Testing it!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;--&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8889503345796134899-6115039506839987007?l=mymymysql.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mymymysql.blogspot.com/feeds/6115039506839987007/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8889503345796134899&amp;postID=6115039506839987007' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/6115039506839987007'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/6115039506839987007'/><link rel='alternate' type='text/html' href='http://mymymysql.blogspot.com/2008/10/archiving-and-write-ahead-log.html' title='Archiving and the Write Ahead Log'/><author><name>Tim</name><uri>http://www.blogger.com/profile/06805212306986685899</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://1.bp.blogspot.com/_GWztxWEQGnI/SnLAhgJmFCI/AAAAAAAAAEU/1ieqd3aplzo/S220/DSC00082.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8889503345796134899.post-2515632973797588507</id><published>2008-10-24T09:10:00.000-07:00</published><updated>2008-11-23T01:03:02.774-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='backup'/><category scheme='http://www.blogger.com/atom/ns#' term='postgresql'/><title type='text'>Backup and Recovery Part 2</title><content type='html'>To Perform a simple recovery of a single database table from your previous backup.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Perform the backup!&lt;/span&gt;&lt;br /&gt;timj@dell-desktop:~$ pg_dump -i -h localhost -U timj  -F c -b -v -f /var/tmp/mybackup testdb&lt;br /&gt;pg_dump: reading schemas&lt;br /&gt;pg_dump: reading user-defined functions&lt;br /&gt;pg_dump: reading user-defined types&lt;br /&gt;pg_dump: reading procedural languages&lt;br /&gt;pg_dump: reading user-defined aggregate functions&lt;br /&gt;pg_dump: reading user-defined operators&lt;br /&gt;pg_dump: reading user-defined operator classes&lt;br /&gt;pg_dump: reading user-defined text search parsers&lt;br /&gt;pg_dump: reading user-defined text search templates&lt;br /&gt;pg_dump: reading user-defined text search dictionaries&lt;br /&gt;pg_dump: reading user-defined text search configurations&lt;br /&gt;pg_dump: reading user-defined operator families&lt;br /&gt;pg_dump: reading user-defined conversions&lt;br /&gt;pg_dump: reading user-defined tables&lt;br /&gt;pg_dump: reading table inheritance information&lt;br /&gt;pg_dump: reading rewrite rules&lt;br /&gt;pg_dump: reading type casts&lt;br /&gt;pg_dump: finding inheritance relationships&lt;br /&gt;pg_dump: reading column info for interesting tables&lt;br /&gt;pg_dump: finding the columns and types of table "numbers"&lt;br /&gt;pg_dump: finding the columns and types of table "myuser"&lt;br /&gt;pg_dump: flagging inherited columns in subtables&lt;br /&gt;pg_dump: reading indexes&lt;br /&gt;pg_dump: reading constraints&lt;br /&gt;pg_dump: reading triggers&lt;br /&gt;pg_dump: reading dependency data&lt;br /&gt;pg_dump: saving encoding = UTF8&lt;br /&gt;pg_dump: saving standard_conforming_strings = off&lt;br /&gt;pg_dump: saving database definition&lt;br /&gt;pg_dump: dumping contents of table myuser&lt;br /&gt;pg_dump: dumping contents of table numbers&lt;br /&gt;timj@dell-desktop:~$ ls -trl /var/tmp/mybackup&lt;br /&gt;-rw-r--r-- 1 timj timj 2261 2008-10-24 17:11 /var/tmp/mybackup&lt;br /&gt;timj@dell-desktop:~$&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;At this stage we lost the 'numbers' table.&lt;/span&gt;&lt;br /&gt;drop table number;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;So we need to recover it&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;timj@dell-desktop:~$ pg_restore -c -h localhost -U timj   -v /var/tmp/mybackup -d testdb  -t numbers&lt;br /&gt;pg_restore: connecting to database for restore&lt;br /&gt;pg_restore: dropping TABLE numbers&lt;br /&gt;pg_restore: [archiver (db)] Error while PROCESSING TOC:&lt;br /&gt;pg_restore: [archiver (db)] Error from TOC entry 1466; 1259 24589 TABLE numbers timj&lt;br /&gt;pg_restore: [archiver (db)] could not execute query: ERROR:  table "numbers" does not exist&lt;br /&gt; Command was:&lt;br /&gt;DROP TABLE public.numbers;&lt;br /&gt;pg_restore: creating TABLE numbers&lt;br /&gt;pg_restore: restoring data for table "numbers"&lt;br /&gt;pg_restore: setting owner and privileges for TABLE numbers&lt;br /&gt;WARNING: errors ignored on restore: 1&lt;br /&gt;timj@dell-desktop:~$&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8889503345796134899-2515632973797588507?l=mymymysql.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mymymysql.blogspot.com/feeds/2515632973797588507/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8889503345796134899&amp;postID=2515632973797588507' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/2515632973797588507'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/2515632973797588507'/><link rel='alternate' type='text/html' href='http://mymymysql.blogspot.com/2008/10/backup-and-recovery-part-2.html' title='Backup and Recovery Part 2'/><author><name>Tim</name><uri>http://www.blogger.com/profile/06805212306986685899</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://1.bp.blogspot.com/_GWztxWEQGnI/SnLAhgJmFCI/AAAAAAAAAEU/1ieqd3aplzo/S220/DSC00082.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8889503345796134899.post-1099261888891737483</id><published>2008-07-16T03:04:00.000-07:00</published><updated>2008-07-16T03:07:57.790-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>Oracle Idle Timeout</title><content type='html'>You can find what your Oracle Idle Timeout is set to by:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;SQL&gt; select * from dba_profiles&lt;br /&gt; 2  where RESOURCE_NAME = 'IDLE_TIME';&lt;br /&gt;PROFILE                        RESOURCE_NAME                    RESOURCE LIMIT&lt;br /&gt;------------------------------ -------------------------------- -------- ----------------------------------------&lt;br /&gt;DEFAULT                        IDLE_TIME                        KERNEL   4320&lt;br /&gt;SQL&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;For details of profiles, see: &lt;a href="http://download.oracle.com/docs/cd/A87860_01/doc/server.817/a85397/statem21.htm#2065932"&gt;here&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8889503345796134899-1099261888891737483?l=mymymysql.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mymymysql.blogspot.com/feeds/1099261888891737483/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8889503345796134899&amp;postID=1099261888891737483' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/1099261888891737483'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/1099261888891737483'/><link rel='alternate' type='text/html' href='http://mymymysql.blogspot.com/2008/07/oracle-idle-timeout.html' title='Oracle Idle Timeout'/><author><name>Tim</name><uri>http://www.blogger.com/profile/06805212306986685899</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://1.bp.blogspot.com/_GWztxWEQGnI/SnLAhgJmFCI/AAAAAAAAAEU/1ieqd3aplzo/S220/DSC00082.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8889503345796134899.post-7979305496216983199</id><published>2008-07-10T13:05:00.000-07:00</published><updated>2008-07-16T03:08:32.384-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Perl'/><category scheme='http://www.blogger.com/atom/ns#' term='DBI'/><category scheme='http://www.blogger.com/atom/ns#' term='postgresql'/><title type='text'>Accessing a database via Perl</title><content type='html'>Here's a small program I wrote to access a Postgresql database.&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;#!/usr/bin/perl&lt;br /&gt;use DBI;&lt;br /&gt;$dbh1 = DBI-&gt;connect( "dbi:Pg:dbname=testdb@localhost","", "", { RaiseError =&gt; 1, AutoCommit =&gt; 0 })&lt;br /&gt;|| die "Database connection not made: $DBI::errstr";&lt;br /&gt;&lt;br /&gt;my $sql = "select vendor, country, freephone, payphone from numbers ";&lt;br /&gt;my $sth = $dbh1-&gt;prepare($sql);&lt;br /&gt;&lt;br /&gt;$sth-&gt;execute();&lt;br /&gt;&lt;br /&gt;my( $vendor, $country, $freephone, $payphone );&lt;br /&gt;$sth-&gt;bind_columns( \$vendor, \$country, \$freephone, \$payphone );&lt;br /&gt;&lt;br /&gt;print "Vendor\tCountry\tFreephone\tPayphone\n";&lt;br /&gt;while( $sth-&gt;fetch() ) {&lt;br /&gt;print "$vendor\t$country\t$freephone\t$payphone\n";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;my $sql = "select name, vendor, leader, participant from myuser ";&lt;br /&gt;my $sth = $dbh1-&gt;prepare($sql);&lt;br /&gt;&lt;br /&gt;$sth-&gt;execute();&lt;br /&gt;&lt;br /&gt;my( $name, $vendor, $leader, $participant );&lt;br /&gt;$sth-&gt;bind_columns( \$name, \$vendor, \$leader, \$participant );&lt;br /&gt;&lt;br /&gt;print "\nName\tVendor\tLeader\tParticipant\n";&lt;br /&gt;while( $sth-&gt;fetch() ) {&lt;br /&gt;print "$name\t$vendor\t$leader\t$participant\n";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;$dbh1-&gt;disconnect() if($dbh1);&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;The output looks like this:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;timj@dell-desktop:~/MySync/db$ ./plsql_phones1.pl&lt;br /&gt;Vendor Country Freephone Payphone&lt;br /&gt;Verizon UK 44-20-7075-3246 0808-238-6025&lt;br /&gt;Verizon France 33-1-70-70-74-20 080-563-9647&lt;br /&gt;Verizon USA 1-203-418-3122 866-692-3163&lt;br /&gt;Verizon India  000-800-852-1266&lt;br /&gt;&lt;br /&gt;Name Vendor Leader Participant&lt;br /&gt;Tim Verizon 1234567 1234567&lt;br /&gt;timj@dell-desktop:~/MySync/db$ &lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8889503345796134899-7979305496216983199?l=mymymysql.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mymymysql.blogspot.com/feeds/7979305496216983199/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8889503345796134899&amp;postID=7979305496216983199' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/7979305496216983199'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/7979305496216983199'/><link rel='alternate' type='text/html' href='http://mymymysql.blogspot.com/2008/07/accessing-database-via-perl.html' title='Accessing a database via Perl'/><author><name>Tim</name><uri>http://www.blogger.com/profile/06805212306986685899</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://1.bp.blogspot.com/_GWztxWEQGnI/SnLAhgJmFCI/AAAAAAAAAEU/1ieqd3aplzo/S220/DSC00082.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8889503345796134899.post-673913353226659251</id><published>2008-06-08T00:24:00.000-07:00</published><updated>2008-06-08T00:27:40.736-07:00</updated><title type='text'>Connecting via OpenOffice</title><content type='html'>There's a great link here.&lt;br /&gt;http://www.postgresql.org/docs/7.3/static/libpq-connect.html&lt;br /&gt;I actually managed to connect just by saying&lt;br /&gt;&lt;pre&gt;dbname=cddb host=localhost&lt;br /&gt;&lt;br /&gt;&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/8889503345796134899-673913353226659251?l=mymymysql.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mymymysql.blogspot.com/feeds/673913353226659251/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8889503345796134899&amp;postID=673913353226659251' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/673913353226659251'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/673913353226659251'/><link rel='alternate' type='text/html' href='http://mymymysql.blogspot.com/2008/06/connecting-via-openoffice.html' title='Connecting via OpenOffice'/><author><name>Tim</name><uri>http://www.blogger.com/profile/06805212306986685899</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://1.bp.blogspot.com/_GWztxWEQGnI/SnLAhgJmFCI/AAAAAAAAAEU/1ieqd3aplzo/S220/DSC00082.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8889503345796134899.post-5203057562766556084</id><published>2008-05-16T04:48:00.000-07:00</published><updated>2008-07-16T03:09:53.196-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Solaris'/><title type='text'>Installing JDK 1.5 on Solaris</title><content type='html'>mkdir jdk-1_5_0_15-solaris-sparcv9-32&lt;br /&gt;mkdir jdk-1_5_0_15-solaris-sparcv9-64&lt;br /&gt;cd  jdk-1_5_0_15-solaris-sparcv9-32 uncompress &amp;lt; ../jdk-1_5_0_15-solaris-sparc.tar.Z | tar xf -&lt;br /&gt;cd ../jdk-1_5_0_15-solaris-sparcv9-64&lt;br /&gt;uncompress &amp;lt; ../jdk-1_5_0_15-solaris-sparcv9.tar.Z  | tar xf - &lt;br /&gt;pkgrm SUNWj5cfg SUNWj5dmx SUNWj5jmp SUNWj5man pkgrm SUNWj5rt SUNWj5rtx&lt;br /&gt;pkgadd -d . SUNWj5rt&lt;br /&gt;pkgadd -d . SUNWj5cfg    SUNWj5dev    SUNWj5dmo    SUNWj5jmp    SUNWj5man&lt;br /&gt;pkgadd -d . SUNWj5rtx SUNWj5dvx SUNWj5dmx&lt;br /&gt;pkginfo -l SUNWj5rt SUNWj5cfg    SUNWj5dev    SUNWj5dmo    SUNWj5jmp    SUNWj5man SUNWj5rtx SUNWj5dvx SUNWj5dmx&lt;br /&gt;If you're on a server with Sparse Zones, you need to do this in the Global zone and then test on each sparse zone.&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span id="ncjz17"&gt;&lt;b&gt;Testing&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;-bash-3.00$ Cat HelloWorld.java&lt;br /&gt;-bash: Cat: command not found&lt;br /&gt;-bash-3.00$ cat HelloWorld.java&lt;br /&gt;public class HelloWorld {         public static void main(String args[])&lt;br /&gt;{                 System.out.println("Hello World");                 int i;                 for (i=0; i&amp;lt; args.length; i++)&lt;br /&gt;System.out.println(args[i]);         } }&lt;br /&gt;-bash-3.00$&lt;br /&gt;-bash-3.00$ javac HelloWorld.java&lt;br /&gt;-bash-3.00$ java HelloWorld&lt;br /&gt;Hello World&lt;br /&gt;-bash-3.00$&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8889503345796134899-5203057562766556084?l=mymymysql.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mymymysql.blogspot.com/feeds/5203057562766556084/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8889503345796134899&amp;postID=5203057562766556084' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/5203057562766556084'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/5203057562766556084'/><link rel='alternate' type='text/html' href='http://mymymysql.blogspot.com/2008/05/installing-jdk-1.html' title='Installing JDK 1.5 on Solaris'/><author><name>Tim</name><uri>http://www.blogger.com/profile/06805212306986685899</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://1.bp.blogspot.com/_GWztxWEQGnI/SnLAhgJmFCI/AAAAAAAAAEU/1ieqd3aplzo/S220/DSC00082.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8889503345796134899.post-6592412535751451352</id><published>2008-05-08T08:18:00.000-07:00</published><updated>2008-05-08T08:28:45.573-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='database'/><category scheme='http://www.blogger.com/atom/ns#' term='postgresql'/><title type='text'>Backing up the database</title><content type='html'>/usr/bin/pg_dump -h localhost -p 5432 -U timj -F c -v -f "/home/timj/db/backup_08_05_2008.backup" cddb&lt;br /&gt;&lt;br /&gt;-h = host&lt;br /&gt;-p = port&lt;br /&gt;-U = database user&lt;br /&gt;-F c = Format suitable for pg_restore&lt;br /&gt;-v = verbose&lt;br /&gt;-f &lt;filename&gt; = file to back up to&lt;br /&gt;&lt;br /&gt;Could just say&lt;br /&gt;&lt;br /&gt;pg_dump -U timj -F c -f "/home/timj/db/backup_08_05_2008.backup" cddb&lt;/filename&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8889503345796134899-6592412535751451352?l=mymymysql.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mymymysql.blogspot.com/feeds/6592412535751451352/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8889503345796134899&amp;postID=6592412535751451352' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/6592412535751451352'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/6592412535751451352'/><link rel='alternate' type='text/html' href='http://mymymysql.blogspot.com/2008/05/backing-up-database.html' title='Backing up the database'/><author><name>Tim</name><uri>http://www.blogger.com/profile/06805212306986685899</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://1.bp.blogspot.com/_GWztxWEQGnI/SnLAhgJmFCI/AAAAAAAAAEU/1ieqd3aplzo/S220/DSC00082.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8889503345796134899.post-8070171633883288320</id><published>2008-05-08T05:39:00.000-07:00</published><updated>2009-10-12T23:04:05.139-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='postgresql'/><title type='text'>Reworking the CD table</title><content type='html'>The CD table works, but needs a unique key to link to the tracks on the CD.&lt;br /&gt;&lt;br /&gt;CREATE TABLE cdtable&lt;br /&gt;(&lt;br /&gt;cdnum serial NOT NULL,&lt;br /&gt;pubnum int4 NOT NULL,&lt;br /&gt;artnum int4 NOT NULL,&lt;br /&gt;cdtitle varchar(50) NOT NULL,&lt;br /&gt;datepublished date,&lt;br /&gt;CONSTRAINT artnum FOREIGN KEY (artnum) REFERENCES artist (artnum)    ON UPDATE NO ACTION ON DELETE NO ACTION,&lt;br /&gt;CONSTRAINT pubnum FOREIGN KEY (pubnum) REFERENCES publisher (pubnum)    ON UPDATE NO ACTION ON DELETE NO ACTION&lt;br /&gt;) WITHOUT OIDS&lt;br /&gt;TABLESPACE ts_cddb_1;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;insert into cdtable (artnum, pubnum, cdtitle, datepublished)&lt;br /&gt;values (1,3,'Heavenbound','02apr2002');&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8889503345796134899-8070171633883288320?l=mymymysql.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mymymysql.blogspot.com/feeds/8070171633883288320/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8889503345796134899&amp;postID=8070171633883288320' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/8070171633883288320'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/8070171633883288320'/><link rel='alternate' type='text/html' href='http://mymymysql.blogspot.com/2008/05/reworking-cd-table.html' title='Reworking the CD table'/><author><name>Tim</name><uri>http://www.blogger.com/profile/06805212306986685899</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://1.bp.blogspot.com/_GWztxWEQGnI/SnLAhgJmFCI/AAAAAAAAAEU/1ieqd3aplzo/S220/DSC00082.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8889503345796134899.post-1569040338339913091</id><published>2008-05-08T05:36:00.001-07:00</published><updated>2008-07-16T03:11:25.246-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='postgresql'/><title type='text'>My First Join In Postgresql</title><content type='html'>cddb=&gt; select a.artname, p.pubname, c.cdtitle&lt;br /&gt;cddb-&gt; from artist a, publisher p, cdtable c&lt;br /&gt;cddb-&gt; where a.artnum = c.artnum&lt;br /&gt;cddb-&gt; and p.pubnum = c.pubnum;&lt;br /&gt; artname  |     pubname     |   cdtitle&lt;br /&gt;----------+-----------------+-------------&lt;br /&gt; Phatfish | Authentic Media | Heavenbound&lt;br /&gt;(1 row)&lt;br /&gt;&lt;br /&gt;cddb=&gt;    &lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Exactly the same as Oracle really!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8889503345796134899-1569040338339913091?l=mymymysql.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mymymysql.blogspot.com/feeds/1569040338339913091/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8889503345796134899&amp;postID=1569040338339913091' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/1569040338339913091'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/1569040338339913091'/><link rel='alternate' type='text/html' href='http://mymymysql.blogspot.com/2008/05/my-first-join-in-postgresql.html' title='My First Join In Postgresql'/><author><name>Tim</name><uri>http://www.blogger.com/profile/06805212306986685899</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://1.bp.blogspot.com/_GWztxWEQGnI/SnLAhgJmFCI/AAAAAAAAAEU/1ieqd3aplzo/S220/DSC00082.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8889503345796134899.post-3008276352905586548</id><published>2008-05-08T03:59:00.000-07:00</published><updated>2008-05-08T04:06:45.892-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='database'/><category scheme='http://www.blogger.com/atom/ns#' term='postgresql'/><title type='text'>CD Table with foreign key contraints!</title><content type='html'>CREATE TABLE cdtable&lt;br /&gt;(&lt;br /&gt;pubnum int4 NOT NULL,&lt;br /&gt;artnum int4 NOT NULL,&lt;br /&gt;cdtitle varchar(50) NOT NULL,&lt;br /&gt;datepublished date,&lt;br /&gt;CONSTRAINT artnum FOREIGN KEY (artnum) REFERENCES artist (artnum)    ON UPDATE NO ACTION ON DELETE NO ACTION,&lt;br /&gt;CONSTRAINT pubnum FOREIGN KEY (pubnum) REFERENCES publisher (pubnum)    ON UPDATE NO ACTION ON DELETE NO ACTION&lt;br /&gt;) WITHOUT OIDS&lt;br /&gt;TABLESPACE ts_cddb_1;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8889503345796134899-3008276352905586548?l=mymymysql.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mymymysql.blogspot.com/feeds/3008276352905586548/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8889503345796134899&amp;postID=3008276352905586548' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/3008276352905586548'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/3008276352905586548'/><link rel='alternate' type='text/html' href='http://mymymysql.blogspot.com/2008/05/cd-table-with-foreign-key-contraints.html' title='CD Table with foreign key contraints!'/><author><name>Tim</name><uri>http://www.blogger.com/profile/06805212306986685899</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://1.bp.blogspot.com/_GWztxWEQGnI/SnLAhgJmFCI/AAAAAAAAAEU/1ieqd3aplzo/S220/DSC00082.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8889503345796134899.post-3512918941697766685</id><published>2008-05-06T10:25:00.000-07:00</published><updated>2008-05-07T07:06:25.100-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='database'/><category scheme='http://www.blogger.com/atom/ns#' term='postgresql'/><title type='text'>The Artist Table</title><content type='html'>Creating the Artist Table&lt;br /&gt;&lt;br /&gt;CREATE TABLE artist (&lt;br /&gt;artnum SERIAL,&lt;br /&gt;artname VARCHAR(50),&lt;br /&gt;CONSTRAINT uc_artist UNIQUE (artnum)&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;cddb=&gt; insert into artist (artname) values ('Phatfish');&lt;br /&gt;INSERT 0 1&lt;br /&gt;cddb=&gt; insert into artist (artname) values ('Bethany Dillon');&lt;br /&gt;INSERT 0 1&lt;br /&gt;cddb=&gt; select * from artist;&lt;br /&gt;artnum |    artname&lt;br /&gt;--------+----------------&lt;br /&gt;    1 | Phatfish&lt;br /&gt;    2 | Bethany Dillon&lt;br /&gt;(2 rows)&lt;br /&gt;&lt;br /&gt;cddb=&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8889503345796134899-3512918941697766685?l=mymymysql.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mymymysql.blogspot.com/feeds/3512918941697766685/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8889503345796134899&amp;postID=3512918941697766685' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/3512918941697766685'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/3512918941697766685'/><link rel='alternate' type='text/html' href='http://mymymysql.blogspot.com/2008/05/artist-table.html' title='The Artist Table'/><author><name>Tim</name><uri>http://www.blogger.com/profile/06805212306986685899</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://1.bp.blogspot.com/_GWztxWEQGnI/SnLAhgJmFCI/AAAAAAAAAEU/1ieqd3aplzo/S220/DSC00082.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8889503345796134899.post-577710411175793313</id><published>2008-05-06T09:10:00.000-07:00</published><updated>2008-05-07T07:07:29.474-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='database'/><category scheme='http://www.blogger.com/atom/ns#' term='postgresql'/><title type='text'>The Publisher Table</title><content type='html'>Create a table with a serial key.&lt;br /&gt;&lt;br /&gt;CREATE TABLE publisher (&lt;br /&gt;pubnum SERIAL,&lt;br /&gt;pubname VARCHAR(20));&lt;br /&gt;&lt;br /&gt;ALTER TABLE publisher  ADD CONSTRAINT uc_pub UNIQUE(pubnum);&lt;br /&gt;&lt;br /&gt;cddb=&gt; insert into publisher (pubname) values ('EMI');&lt;br /&gt;INSERT 0 1&lt;br /&gt;cddb=&gt; insert into publisher (pubname) values ('SONY');&lt;br /&gt;INSERT 0 1&lt;br /&gt;cddb=&gt; select * from publisher;&lt;br /&gt;pubnum | pubname&lt;br /&gt;--------+---------&lt;br /&gt;    1 | EMI&lt;br /&gt;    2 | SONY&lt;br /&gt;(2 rows)&lt;br /&gt;&lt;br /&gt;cddb=&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8889503345796134899-577710411175793313?l=mymymysql.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mymymysql.blogspot.com/feeds/577710411175793313/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8889503345796134899&amp;postID=577710411175793313' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/577710411175793313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/577710411175793313'/><link rel='alternate' type='text/html' href='http://mymymysql.blogspot.com/2008/05/publisher-table.html' title='The Publisher Table'/><author><name>Tim</name><uri>http://www.blogger.com/profile/06805212306986685899</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://1.bp.blogspot.com/_GWztxWEQGnI/SnLAhgJmFCI/AAAAAAAAAEU/1ieqd3aplzo/S220/DSC00082.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8889503345796134899.post-6285409497594610700</id><published>2008-05-06T08:01:00.000-07:00</published><updated>2008-10-26T00:34:17.899-07:00</updated><title type='text'>pgloader</title><content type='html'>Decided I'd play around with pgloader, but couldn't find it in my distro's package manager. I found it in the web, and found that they do not produce an rpm - only a deb! I use Ubuntu on my desktop, but PCLinuxOS on my laptop. So...&lt;br /&gt;&lt;br /&gt;First installed Alien through the package manager.&lt;br /&gt;&lt;br /&gt;wget http://pgfoundry.org/frs/download.php/1680/pgloader_2.3.0-1_all.deb&lt;br /&gt;(as root)&lt;br /&gt;alien -r  --scripts pgloader_2.3.0-1_all.deb&lt;br /&gt;rpm -i pgloader-2.3.0-2.noarch.rpm&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8889503345796134899-6285409497594610700?l=mymymysql.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mymymysql.blogspot.com/feeds/6285409497594610700/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8889503345796134899&amp;postID=6285409497594610700' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/6285409497594610700'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/6285409497594610700'/><link rel='alternate' type='text/html' href='http://mymymysql.blogspot.com/2008/05/pgloader.html' title='pgloader'/><author><name>Tim</name><uri>http://www.blogger.com/profile/06805212306986685899</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://1.bp.blogspot.com/_GWztxWEQGnI/SnLAhgJmFCI/AAAAAAAAAEU/1ieqd3aplzo/S220/DSC00082.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8889503345796134899.post-4638506493194265951</id><published>2008-05-06T05:24:00.000-07:00</published><updated>2008-05-07T05:52:37.362-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='database'/><category scheme='http://www.blogger.com/atom/ns#' term='postgresql'/><title type='text'>First Steps</title><content type='html'>I have set a unix password for postgres, and started /etc/init.d/postgresql&lt;br /&gt;&lt;br /&gt;su - postgres&lt;br /&gt;made a directory called: '/var/lib/pgsql/cddb_data' owned by postgres&lt;br /&gt;&lt;br /&gt;run psql&lt;br /&gt;&lt;br /&gt;CREATE USER timj WITH PASSWORD 'xxxxxxxx' ;&lt;br /&gt;CREATE TABLESPACE ts_cddb_1 OWNER timj LOCATION '/var/lib/pgsql/cddb_data';&lt;br /&gt;CREATE DATABASE cddb OWNER timj TABLESPACE ts_cddb_1;&lt;br /&gt;&lt;br /&gt;This gives me all I need to pgAdminIII, and I have completed objectives 1, 2 and 3!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8889503345796134899-4638506493194265951?l=mymymysql.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mymymysql.blogspot.com/feeds/4638506493194265951/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8889503345796134899&amp;postID=4638506493194265951' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/4638506493194265951'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/4638506493194265951'/><link rel='alternate' type='text/html' href='http://mymymysql.blogspot.com/2008/05/first-steps.html' title='First Steps'/><author><name>Tim</name><uri>http://www.blogger.com/profile/06805212306986685899</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://1.bp.blogspot.com/_GWztxWEQGnI/SnLAhgJmFCI/AAAAAAAAAEU/1ieqd3aplzo/S220/DSC00082.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8889503345796134899.post-9015658268022270673</id><published>2008-05-06T03:23:00.000-07:00</published><updated>2008-05-06T06:52:03.054-07:00</updated><title type='text'>Things to achieve</title><content type='html'>Here is the first cut of the things I want to achieve. The database will store CD details. I want to:&lt;br /&gt;&lt;ol id="rma60"&gt;&lt;li id="rma61"&gt;create a tablespace&lt;br /&gt;&lt;/li&gt;&lt;li id="rma63"&gt;create a database&lt;/li&gt;&lt;li id="rma64"&gt;create a user to own the database&lt;/li&gt;&lt;li id="rma65"&gt;create a role for the user to be in&lt;/li&gt;&lt;li id="rma68"&gt;create a table for publisher&lt;/li&gt;&lt;li id="rma68"&gt;create a table for artist&lt;/li&gt;&lt;li id="rma68"&gt;create a table for CDs, referential integrity against artist and publisher&lt;/li&gt;&lt;li id="rma68"&gt;create a table for tracks, referential integrity against CD&lt;/li&gt;&lt;li id="rma66"&gt;create a read-only user&lt;/li&gt;&lt;li id="rma67"&gt;write backup scripts for the database&lt;/li&gt;&lt;li id="rma68"&gt;ensure that deleting a CD deletes all tracks&lt;/li&gt;&lt;li id="rma68"&gt;ensure that deleting an artist deletes all CDs and tracks&lt;/li&gt;&lt;li id="rma68"&gt;write a report to report in number of CDs owned by artist&lt;/li&gt;&lt;li id="rma68"&gt;create data load scripts for publisher, artist and CDs&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8889503345796134899-9015658268022270673?l=mymymysql.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mymymysql.blogspot.com/feeds/9015658268022270673/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8889503345796134899&amp;postID=9015658268022270673' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/9015658268022270673'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/9015658268022270673'/><link rel='alternate' type='text/html' href='http://mymymysql.blogspot.com/2008/05/cd-database-here-is-first-cut-of-things.html' title='Things to achieve'/><author><name>Tim</name><uri>http://www.blogger.com/profile/06805212306986685899</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://1.bp.blogspot.com/_GWztxWEQGnI/SnLAhgJmFCI/AAAAAAAAAEU/1ieqd3aplzo/S220/DSC00082.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8889503345796134899.post-8203092617777387937</id><published>2008-05-06T02:12:00.000-07:00</published><updated>2008-05-06T05:52:53.663-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='postgresql'/><title type='text'>Learning Postgresql</title><content type='html'>Having previously worked as an Oracle developer and an Oracle DBA, but fallen away from the hand's on technical stuff, I have decided to teach myself Postgresql. I have decided that the best way to do this is to set up a series of tacks to achieve, and to blog my attempts to achieve them. I appreciate that this may not be of wide interest to anyone else, but it will at least keep the details in one place.&lt;br /&gt;&lt;br /&gt;I expect that the targets will change as I find out more, so I expect to have to restate the targets as I go along. Hopefully I will be able to spend 30 minutes a day on this.&lt;br /&gt;&lt;br /&gt;Tim&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8889503345796134899-8203092617777387937?l=mymymysql.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mymymysql.blogspot.com/feeds/8203092617777387937/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8889503345796134899&amp;postID=8203092617777387937' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/8203092617777387937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8889503345796134899/posts/default/8203092617777387937'/><link rel='alternate' type='text/html' href='http://mymymysql.blogspot.com/2008/05/learning-postgresql.html' title='Learning Postgresql'/><author><name>Tim</name><uri>http://www.blogger.com/profile/06805212306986685899</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://1.bp.blogspot.com/_GWztxWEQGnI/SnLAhgJmFCI/AAAAAAAAAEU/1ieqd3aplzo/S220/DSC00082.jpg'/></author><thr:total>1</thr:total></entry></feed>
