<?xml version="1.0" encoding="utf-8" ?>

<rss version="2.0" 
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:admin="http://webns.net/mvcb/"
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
   xmlns:wfw="http://wellformedweb.org/CommentAPI/"
   xmlns:content="http://purl.org/rss/1.0/modules/content/"
   >
<channel>
    <title>zillablog - postgres</title>
    <link>http://www.xzilla.net/</link>
    <description></description>
    <dc:language>en</dc:language>
    <generator>Serendipity 1.3.1 - http://www.s9y.org/</generator>
    <managingEditor>xzilla@users.sourceforge.net</managingEditor>
<webMaster>xzilla@users.sourceforge.net</webMaster>
<ttl>60</ttl>
<pubDate>Wed, 10 Mar 2010 00:39:04 GMT</pubDate>

    <image>
        <url>http://www.xzilla.net/templates/default/img/s9y_banner_small.png</url>
        <title>RSS: zillablog - postgres - </title>
        <link>http://www.xzilla.net/</link>
        <width>100</width>
        <height>21</height>
    </image>

<item>
    <title>Actually, the Relational Model doesn't scale</title>
    <link>http://www.xzilla.net/blog/2010/Mar/Actually,-the-Relational-Model-doesnt-scale.html</link>
            <category>mysql</category>
            <category>postgres</category>
    
    <comments>http://www.xzilla.net/blog/2010/Mar/Actually,-the-Relational-Model-doesnt-scale.html#comments</comments>
    <wfw:comment>http://www.xzilla.net/wfwcomment.php?cid=481</wfw:comment>

    <slash:comments>18</slash:comments>
    <wfw:commentRss>http://www.xzilla.net/rss.php?version=2.0&amp;type=comments&amp;cid=481</wfw:commentRss>
    

    <author>nospam@example.com (Robert Treat)</author>
    <content:encoded>
    Before all my fellow DBAs&#039; heads explode, let me just say that I am a relational guy. I like the relational model, think it&#039;s the best tool for the job, and think every programmer (not just DBA&#039;s) should aspire to be as familiar with it as they are with AJAX, MVC, or whatever other technology pattern you think is important. I&#039;ll even take that a step further; I think the NoSQL movement is mostly a re-hash of failed technologies from the last century. Object and document databases had their run in the market (some might say &lt;a href=&quot;http://www.xzilla.net/exit.php?url_id=421&amp;amp;entry_id=481&quot; title=&quot;http://www.youtube.com/watch?v=eHiX0FZcjkA&quot;  onmouseover=&quot;window.status=&#039;http://www.youtube.com/watch?v=eHiX0FZcjkA&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;&quot;they had their time&quot;&lt;/a&gt;), and they were pretty thoroughly beaten by the RDBMS; that some people have reinvented that wheel doesn&#039;t change the game. &lt;br /&gt;
&lt;br /&gt;
That said, I find the recent comments from &lt;a href=&quot;http://www.xzilla.net/exit.php?url_id=422&amp;amp;entry_id=481&quot; title=&quot;http://thoughts.j-davis.com/2010/03/07/scalability-and-the-relational-model/&quot;  onmouseover=&quot;window.status=&#039;http://thoughts.j-davis.com/2010/03/07/scalability-and-the-relational-model/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;Jeff Davis on the relational model and scalability&lt;/a&gt; to be overlooking some things. The state of computing tasks has changed over the past two decades, and what we know about computer engineering has also changed. Working on highly scalable systems like we do at OmniTI, you can&#039;t escape some of the inherent problems that you face when working in these types of environments. As much as I&#039;d like the answer to every problem to be &quot;just use an RDBMS&quot;, &lt;a href=&quot;http://www.xzilla.net/exit.php?url_id=425&amp;amp;entry_id=481&quot; title=&quot;http://www.julianbrowne.com/article/viewer/brewers-cap-theorem&quot;  onmouseover=&quot;window.status=&#039;http://www.julianbrowne.com/article/viewer/brewers-cap-theorem&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;Brewer&#039;s CAP theorem&lt;/a&gt; just isn&#039;t something you can ignore. &lt;br /&gt;
&lt;br /&gt;
When most people think about the relational model, they think of it in terms of parent-child relationships between tables. Without getting too deep in the details of it, I think it&#039;s pretty fair to say that Primary Keys and Foreign Keys are very large part of any relational implementation, and that pretty much all RDBMS strive to allow you to add these constraints to your model; it&#039;s what helps keep the data consistent. But there&#039;s the rub. CAP theorem points out that as we strive for tighter and tighter consistency, we are pulling away from availability, and sacrificing partition tolerance. Two theoretical systems that run smack dab into each other in the real world. This isn&#039;t really something new; if you have ever de-normalized, dropped a foreign key, or split data across multiple nodes, you&#039;ve run into this before. &lt;br /&gt;
&lt;br /&gt;
Now, where CAP theorem falls on it&#039;s face (imho) is that it also ignores another holy trinity of software development; Cheap, Fast, and Good. The size of your problem is dictated by the resources you have available; if you can afford decent tools (and let&#039;s be clear, decent is not your web dev throwing up MySQL on an EC2 instance) it is quite likely that the stressors of the relational model will never impact you in a way that most CAP folks are worried about. This is also one of the places the NoSQL movement fails; by throwing the baby out with the bath water. Giving up your data integrity before you have scalability issues is a form of premature optimization. The trick, as &lt;a href=&quot;http://www.xzilla.net/exit.php?url_id=424&amp;amp;entry_id=481&quot; title=&quot;http://omniti.com/is/theo-schlossnagle&quot;  onmouseover=&quot;window.status=&#039;http://omniti.com/is/theo-schlossnagle&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;Theo&lt;/a&gt; would say, is having the experience to know when such optimizations are and aren&#039;t premature.&lt;br /&gt;
&lt;br /&gt;
So what&#039;s the take away? I like to say that you use the relational model because it is best, and you use something else because it is necessary. Most SQL implementations can scale very well, and they should be your first choice when starting a new project. But we also can&#039;t pretend that there aren&#039;t inherent problems as these systems grow larger; let&#039;s understand the trade-offs and engineer appropriately. &lt;br /&gt;
 
    </content:encoded>

    <pubDate>Mon, 08 Mar 2010 11:20:56 -0500</pubDate>
    <guid isPermaLink="false">http://www.xzilla.net/blog/2010/Mar/481.html</guid>
    
</item>
<item>
    <title>OmniTI is heading to PGEast 2010</title>
    <link>http://www.xzilla.net/blog/2010/Mar/OmniTI-is-heading-to-PGEast-2010.html</link>
            <category>conf</category>
            <category>pgus</category>
            <category>postgres</category>
    
    <comments>http://www.xzilla.net/blog/2010/Mar/OmniTI-is-heading-to-PGEast-2010.html#comments</comments>
    <wfw:comment>http://www.xzilla.net/wfwcomment.php?cid=480</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://www.xzilla.net/rss.php?version=2.0&amp;type=comments&amp;cid=480</wfw:commentRss>
    

    <author>nospam@example.com (Robert Treat)</author>
    <content:encoded>
    PGEast is the premiere Postgres conference held inside the U.S. each year, and this years conference, in &lt;a href=&quot;http://www.xzilla.net/exit.php?url_id=419&amp;amp;entry_id=480&quot; title=&quot;http://www.postgresqlconference.org/east/2010/accommodations&quot;  onmouseover=&quot;window.status=&#039;http://www.postgresqlconference.org/east/2010/accommodations&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;Philadelphia&lt;/a&gt;, is now less than a month away. The organization and formatting have evolved a little from previous years, but one things still continues; a very strong presentation line up. We at &lt;a href=&quot;http://www.xzilla.net/exit.php?url_id=420&amp;amp;entry_id=480&quot; title=&quot;http://www.omniti.com/&quot;  onmouseover=&quot;window.status=&#039;http://www.omniti.com/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;OmniTI&lt;/a&gt; are very happy to be among that group of people, with four talks in this years conference lineup; &lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://www.xzilla.net/exit.php?url_id=413&amp;amp;entry_id=480&quot; title=&quot;http://postgresqlconference.org/2010/east/talks/know_more_waiting_a_guide_to_postgresql_9.0&quot;  onmouseover=&quot;window.status=&#039;http://postgresqlconference.org/2010/east/talks/know_more_waiting_a_guide_to_postgresql_9.0&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;Know More Waiting, A Guide To PostgreSQL 9.0 by Robert Treat&lt;/a&gt; (hey, that&#039;s me), will give an overview of the upcoming PostgreSQL 9.0 release. While we&#039;re still a few months ahead of release, but we have a pretty good idea of what&#039;s coming in the next release, and this talk will help you start planning for how you will be able to take advantage of the new features coming our way.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://www.xzilla.net/exit.php?url_id=414&amp;amp;entry_id=480&quot; title=&quot;http://postgresqlconference.org/2010/east/talks/postgresql_meet_amqp&quot;  onmouseover=&quot;window.status=&#039;http://postgresqlconference.org/2010/east/talks/postgresql_meet_amqp&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;PostgreSQL, meet AMQP, by Theo Schlossnagle&lt;/a&gt;, looks at &lt;a href=&quot;http://www.xzilla.net/exit.php?url_id=415&amp;amp;entry_id=480&quot; title=&quot;https://labs.omniti.com/trac/pgsoltools/browser/trunk/contrib/pg_amqp&quot;  onmouseover=&quot;window.status=&#039;https://labs.omniti.com/trac/pgsoltools/browser/trunk/contrib/pg_amqp&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;pg_amqp&lt;/a&gt;, a &quot;contrib&quot; style module for Postgres that provides transaction style message queuing from inside of Postgres, using the AMQP standard. &lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://www.xzilla.net/exit.php?url_id=416&amp;amp;entry_id=480&quot; title=&quot;http://postgresqlconference.org/2010/east/talks/yet_another_replication_tool_rubyrep&quot;  onmouseover=&quot;window.status=&#039;http://postgresqlconference.org/2010/east/talks/yet_another_replication_tool_rubyrep&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;Yet Another Replication Tool : RubyRep by Denish Patel&lt;/a&gt;, will delve into one of the newer Postgres replication solutions on the block. RubyRep is design for dead simple installation and setup, while still delivering advanced features like data comparing, synchronization between servers, and even master-master replication options. &lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://www.xzilla.net/exit.php?url_id=417&amp;amp;entry_id=480&quot; title=&quot;http://postgresqlconference.org/2010/east/talks/database_scalability_patterns&quot;  onmouseover=&quot;window.status=&#039;http://postgresqlconference.org/2010/east/talks/database_scalability_patterns&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;Database Scalability Patterns by Robert Treat&lt;/a&gt; (me again), takes a look at the common patterns around scaling your database solution, and looks at some of the different options available to people scaling with Postgres. &lt;br /&gt;
&lt;br /&gt;
But wait, there&#039;s more! While we at OmniTI are definitely excited to be participating in PGEast this year, there are a number of other good talks and speakers, including Magnus Hagander, Jeff Davis, Baron Schwartz, and many others. For full talk details, check out the &lt;a href=&quot;http://www.xzilla.net/exit.php?url_id=418&amp;amp;entry_id=480&quot; title=&quot;http://www.postgresqlconference.org/2010/east/talks&quot;  onmouseover=&quot;window.status=&#039;http://www.postgresqlconference.org/2010/east/talks&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;conference talks page&lt;/a&gt;; I hope you&#039;ll journey out and say hi, it should be a pretty good time.  
    </content:encoded>

    <pubDate>Tue, 02 Mar 2010 09:09:00 -0500</pubDate>
    <guid isPermaLink="false">http://www.xzilla.net/blog/2010/Mar/480.html</guid>
    
</item>
<item>
    <title>BWPUG March 10th, Falls Church take two. </title>
    <link>http://www.xzilla.net/blog/2010/Feb/BWPUG-March-10th,-Falls-Church-take-two..html</link>
            <category>bwpug</category>
            <category>pgus</category>
            <category>postgres</category>
    
    <comments>http://www.xzilla.net/blog/2010/Feb/BWPUG-March-10th,-Falls-Church-take-two..html#comments</comments>
    <wfw:comment>http://www.xzilla.net/wfwcomment.php?cid=479</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://www.xzilla.net/rss.php?version=2.0&amp;type=comments&amp;cid=479</wfw:commentRss>
    

    <author>nospam@example.com (Robert Treat)</author>
    <content:encoded>
    Barring a repeat of last months snowmageddon / snowpocalypse, we&#039;re going to take another stab at heading down to Falls Church, Va, for the March BWPUG meeting.  If you haven&#039;t felt like trucking out to Columbia, then please try to make this one.  Depending on response we may be able to do this more often.&lt;br /&gt;
&lt;br /&gt;
When: March 10th, 6:30PM.&lt;br /&gt;
Where: 3150 Fairview Park Dr, Falls Church, VA&lt;br /&gt;
Host: Noblis, Inc. and the&lt;br /&gt;
     Noblis Innovation and Collaboration Center (NICC)&lt;br /&gt;
&lt;br /&gt;
It&#039;s basically at 495 and 50 in Northern Virginia.  We&#039;ll be discussing the upcoming PostgreSQL 9.0 release, including a preview of my upcoming talk at PG East. &lt;br /&gt;
&lt;br /&gt;
If you&#039;re planning to attend, please RSVP to Stephen Frost via sfrost &lt;u&gt;at&lt;/u&gt; noblis.org. The host/facility we&#039;ll be meeting at does require a government issued photo ID (eg: driver&#039;s license or passport).&lt;br /&gt;
&lt;br /&gt;
Hope to see you there! 
    </content:encoded>

    <pubDate>Mon, 22 Feb 2010 21:02:39 -0500</pubDate>
    <guid isPermaLink="false">http://www.xzilla.net/blog/2010/Feb/479.html</guid>
    
</item>
<item>
    <title>Re-inventing Greg's method to prevent re-inventing</title>
    <link>http://www.xzilla.net/blog/2006/Sep/Re-inventing-Gregs-method-to-prevent-re-inventing.html</link>
            <category>php</category>
            <category>postgres</category>
    
    <comments>http://www.xzilla.net/blog/2006/Sep/Re-inventing-Gregs-method-to-prevent-re-inventing.html#comments</comments>
    <wfw:comment>http://www.xzilla.net/wfwcomment.php?cid=261</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://www.xzilla.net/rss.php?version=2.0&amp;type=comments&amp;cid=261</wfw:commentRss>
    

    <author>nospam@example.com (Robert Treat)</author>
    <content:encoded>
    A few weeks ago, Greg posted a very nice example of &lt;a href=&quot;http://www.xzilla.net/exit.php?url_id=405&amp;amp;entry_id=261&quot; title=&quot;http://people.planetpostgresql.org/greg/index.php?/archives/49-Avoiding-the-reinvention-of-two-email-wheels.html&quot;  onmouseover=&quot;window.status=&#039;http://people.planetpostgresql.org/greg/index.php?/archives/49-Avoiding-the-reinvention-of-two-email-wheels.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;using pl/perl to ensure email validity&lt;/a&gt; inside your database. Certainly the principals of the post all make sense; make use of a database function to do your validity checking and save yourself from having to re-implement that logic in various applications that interact with your database. Of course, with PostgreSQL&#039;s wide array of procedural language support, there&#039;s more than one way to do it. &lt;img src=&quot;http://www.xzilla.net/xzilla/templates/default/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
So the way I&#039;ve decided to re-implement this is by using pl/php. As its name implies, pl/php is a &lt;a href=&quot;http://www.xzilla.net/exit.php?url_id=406&amp;amp;entry_id=261&quot; title=&quot;http://php.net/&quot;  onmouseover=&quot;window.status=&#039;http://php.net/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;PHP based&lt;/a&gt; &lt;a href=&quot;http://www.xzilla.net/exit.php?url_id=407&amp;amp;entry_id=261&quot; title=&quot;http://www.postgresql.org/docs/current/interactive/xplang.html&quot;  onmouseover=&quot;window.status=&#039;http://www.postgresql.org/docs/current/interactive/xplang.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;procedural language&lt;/a&gt; that can be use for most tasks where other procedural languages can be used inside of a PostgreSQL database. It is developed primarily by Command Prompt, Inc. and is available as &lt;a href=&quot;http://www.xzilla.net/exit.php?url_id=412&amp;amp;entry_id=261&quot; title=&quot;http://projects.commandprompt.com/public/plphp&quot;  onmouseover=&quot;window.status=&#039;http://projects.commandprompt.com/public/plphp&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;open source software&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Now, the thing that was so nice about Greg&#039;s example was that he didn&#039;t just write a little regular expression to do validation, rather he used a well developed CPAN module to do his dirty work. When I started to re-implement this in pl/php, I found no end of one off hacks for doing this in PHP, there are actually several posted &lt;a href=&quot;http://www.xzilla.net/exit.php?url_id=408&amp;amp;entry_id=261&quot; title=&quot;http://us3.php.net/manual/en/function.ereg.php#54064&quot;  onmouseover=&quot;window.status=&#039;http://us3.php.net/manual/en/function.ereg.php#54064&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;right in the manual&lt;/a&gt;, but I wanted something that would be more robust. After a bit of digging, I came across &lt;a href=&quot;http://www.xzilla.net/exit.php?url_id=409&amp;amp;entry_id=261&quot; title=&quot;http://pear.php.net/package/Validate&quot;  onmouseover=&quot;window.status=&#039;http://pear.php.net/package/Validate&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;Pear:Validate&lt;/a&gt;. As it&#039;s name implies, Pear:Validate is a package design to give robust, reusable validation routines from inside PHP. In my case it was just what I needed.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;border: 1px dashed black;  padding: 1em;  background: #ffffcc;&quot;&gt;&lt;code style=&quot;white-space: pre;&quot;  &gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION valid_email(text)&lt;br /&gt;
RETURNS boolean&lt;br /&gt;
IMMUTABLE&lt;br /&gt;
LANGUAGE plphpu&lt;br /&gt;
AS $$&lt;br /&gt;
    require_once &#039;Validate.php&#039;;&lt;br /&gt;
&lt;br /&gt;
    $validate = new Validate();&lt;br /&gt;
&lt;br /&gt;
    return $validate-&gt;email(&quot;$args[0]&quot;,array(&quot;check_domain&quot;=&gt;false,&quot;use_rfc822&quot;=&gt;true)) ? 1 : 0;&lt;br /&gt;
$$;&lt;br /&gt;
&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Thats it!  In keeping with the spirit of things, I&#039;ve installed this into our &lt;a href=&quot;http://www.xzilla.net/exit.php?url_id=410&amp;amp;entry_id=261&quot; title=&quot;http://pgfoundry.org/projects/dbsamples/&quot;  onmouseover=&quot;window.status=&#039;http://pgfoundry.org/projects/dbsamples/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;pagila sample database&lt;/a&gt;, and then tested out a few email addresses:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;border: 1px dashed black;  padding: 1em;  background: #ffffcc;&quot;&gt;&lt;code style=&quot;white-space: pre;&quot;  &gt;&lt;br /&gt;
pagila=# SELECT valid_email(&#039;xzilla@users.sourceforge.net&#039;);&lt;br /&gt;
 valid_email&lt;br /&gt;
-----------&lt;br /&gt;
 t&lt;br /&gt;
(1 row)&lt;br /&gt;
pagila=# SELECT valid_email (&#039;Robert Treat &amp;lt;xzilla@ users . sf . net&amp;gt;&#039;);&lt;br /&gt;
 valid_email&lt;br /&gt;
-----------&lt;br /&gt;
 t&lt;br /&gt;
(1 row)&lt;br /&gt;
pagila=# SELECT valid_email(&#039;www.brighterlamp.org&#039;);&lt;br /&gt;
 valid_email&lt;br /&gt;
-----------&lt;br /&gt;
 f&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Yep, PEAR:Validate was able to handle the whitespace and leading text of the second example just fine. And just like any other function, we can also go ahead and use this function as part of a domain and incorporate that change into our database tables as needed.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;border: 1px dashed black;  padding: 1em;  background: #ffffcc;&quot;&gt;&lt;code style=&quot;white-space: pre;&quot;  &gt;&lt;br /&gt;
pagila=# CREATE DOMAIN validemail AS text&lt;br /&gt;
pagila-# NOT NULL&lt;br /&gt;
pagila-# CHECK ( valid_email(VALUE) );&lt;br /&gt;
CREATE DOMAIN&lt;br /&gt;
pagila=#&lt;br /&gt;
pagila=# ALTER TABLE customer ALTER email TYPE validemail ;&lt;br /&gt;
ALTER TABLE&lt;br /&gt;
&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
As you can see, it is very easy to incorporate this change into an existing system, and sharp readers will realize that we just verified the validity of all of the emails in our database as well! &lt;img src=&quot;http://www.xzilla.net/xzilla/templates/default/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot;&gt;  For those that want to see what an error looks like, we can show you that too:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;border: 1px dashed black;  padding: 1em;  background: #ffffcc;&quot;&gt;&lt;code style=&quot;white-space: pre;&quot;  &gt;&lt;br /&gt;
pagila=# INSERT INTO customer (store_id, first_name, last_name, email, address_id, active)&lt;br /&gt;
pagila-# VALUES (2,&#039;Gregis&#039;,&#039;Mijiro&#039;,&#039;gtsm123@aol&#039;,40,1);&lt;br /&gt;
ERROR:  value for domain validemail violates check constraint &quot;validemail_check&quot;&lt;br /&gt;
&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
And wa-la! Friendly error message, centralized logic, and easy to update with a simple change to the valid_email function. While pl/php may not be as polished as something like pl/perl, you can still get a lot of gooey goodness out of it for those who are inclined to lean toward PHP.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;border: 1px solid black;  background: #ccffff;&quot;&gt;Note: I&#039;ll be at &lt;a href=&quot;http://www.xzilla.net/exit.php?url_id=411&amp;amp;entry_id=261&quot; title=&quot;http://hades.phparch.com/ceres/public/page/index.php/works&quot;  onmouseover=&quot;window.status=&#039;http://hades.phparch.com/ceres/public/page/index.php/works&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;php/db|works&lt;/a&gt; in Toronto next week doing a talk on pl/php, showing this and a couple of other neat tricks. If you&#039;re planning to attend, you&#039;ve just gotten a sneak peek. If you&#039;re not planning to attend, it&#039;s not too late to change your mind. &lt;img src=&quot;http://www.xzilla.net/xzilla/templates/default/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot;&gt;&lt;br /&gt;
&lt;/div&gt; 
    </content:encoded>

    <pubDate>Tue, 05 Sep 2006 11:52:00 -0400</pubDate>
    <guid isPermaLink="false">http://www.xzilla.net/blog/2006/Sep/261.html</guid>
    
</item>

</channel>
</rss>