Re: Reducing duplicated business rules

From: "Tom Hebbron" <news_user(at)hebbron(dot)com>
To: pgsql-php(at)postgresql(dot)org
Subject: Re: Reducing duplicated business rules
Date: 2003-11-20 19:36:00
Message-ID: bpj556$8sr$1@news.hub.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-php

Hi group,

I'm interested to see that other people have hit this problem. In the last
few months I've been writing and re-writing PHP classes to access a
postgreSQL database for a CMS.
Here is a rough overview of the way I've dealt with the validation problem.

tuple class
array of attribute class objects

initialisation fetches metadata about the table/view the tuple (row)
belongs to (attribute types, domains & built in CHECK constraints, foriegn
keys, not null)
this data comes from a set of attribute metadata views (built from
system catalogs and optimised - further optimisation is envisaged for PG
7.4)
the tuple / attribute metadata allows us to do the following things

foreign key attributes can auto-build a list of options for a <select>
dropdown (either multiple selection using a join table, or single selection)
the options in the list come from following the foreign key definitions.
Specially named views (schema.table/view.attribute) are used to get labels
for meaningful display,
so you don't have drop down lists with your externally meaningless
primary keys, but nice values (e.g. value = doc_id and label = doc_title)
if no view is found for the table/column, then just the values are used
as labels.

validation is doen using the folowing procedure
for each attribute in the tuple
"SELECT 'newvalue'::datatype"
if this fails, then it is a parse error, and the message "invalid
[attribute name]" is registered with the object against that attribute

then for each check constraint (both single and multiple column) defined
against the table (including where domains are used as attribute data types)
we run the following query
"SELECT [check constraint definition] AS [check constraint name] FROM
([for each attribute in the CHECK, output 'value'::type AS name,]) AS
values"
the result will be true or false, and the name of the only reutrned
column is the name of the check that passed/failed
if you have named your check contstraints sensibly, then the name is
used (if it failed) as an error message against the attribute(s) involved in
the check.

if all the values parse correctly, and all the check constraints are
passed - THEN we try to do the INSERT/UPDATE

other jobs the objects can do is insert parsed default values (from the
metadata) to display initially in the form.

Sadly, all this 'niceness' comes at a cost, because of all the extra queries
that must be executed in order to get back full validation failure messages
from PG.
Once we have released, then it might be possible to try and go back and make
some of this functionality available inside PHP, by adding to the pg_xxx
commands
available in PHP (particularly pg_meta_data())

This tuple object is then renderable as XHTML form elements (with
session/db/table/attirbute unique element names md5'd) so that multiple
tables can be exposed on a single form.

I'd be interested to hear from any other people who've built similar
systems, or about any database abstraction projects which attempt to do the
'possible value lookup' and full validation
descripbed above. Our code was working with 7.3.4 fairly well, and should be
back up and finished soon with 7.4. Once the project is compelted, I'll see
about releasig a more generic set
of classes (our are currently tied to a project-specific inheritance layer)
or expanding this into a gBorg project or similar.

--
--
Tom Hebbron
www.hebbron.com
+39 0444540626 (Vicenza, Italy)

In response to

Responses

Browse pgsql-php by date

  From Date Subject
Next Message Paul & Natalie T 2003-11-21 01:03:36 problem--pg_connect() and odbc_connect() return the same connection
Previous Message Bruce Momjian 2003-11-20 16:45:24 Re: pgsql on windows