SQL Worked Example

Introduction

The following describes a worked example of using a SQL database with authorised pages. It shows how to construct forms to enter and remove data, and display that data. The example is based on a directory structure:

The Database

The SQL database is a simple table of composers and their dates similar to the one I used in the SQL How-to:

Note that the character set used for the two text fields is UTF-8 UniCode, which allows the correct representation of names such as "Dvořák". The Paloose pipes use this encoding; the output serializers output according to the encoding parameter.

The Index Page

The index page for the example is a simple list:

/examples/sql/sql.html
<?xml version="1.0" encoding="UTF-8"?> <page:page xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:t="http://www.hsfr.org.uk/Schema/Text" xmlns:page="http://www.hsfr.org.uk/Schema/Page" xmlns:list="http://www.hsfr.org.uk/Schema/List" xmlns:pf="http://www.paloose.org/schemas/Forms/1.0" xmlns:link="http://www.hsfr.org.uk/Schema/Link" xmlns:paloose="http://www.paloose.org/schemas/Paloose/1.0"> <page:meta> <page:title>Paloose &#x2014; SQL Example</page:title> <page:copyright>Copyright 2006 &#x2013; 2010 Hugh Field-Richards. All Rights Reserved.</page:copyright> </page:meta> <page:content> <t:heading level="1">SQL Example</t:heading> <t:p>This example allows you to set up and query a database. They are all working with a data base "composers".</t:p> <list:list type="unordered"> <list:item><link:link type="uri" ref="addComposer.html">Create composer</link:link></list:item> <list:item><link:link type="uri" ref="deleteComposer.html">Delete composer</link:link></list:item> </list:list> <list:list type="unordered"> <list:item><link:link type="uri" ref="displayAllComposers.html">Display entire database</link:link></list:item> </list:list> <t:p><link:link type="uri" ref="logout.html">Logout</link:link> from admin pages.</t:p> </page:content> </page:page>

The Sitemap

The sitemap to read this file is fairly simple at this level. First the necessary components (it is worth noting that some of these declarations can be placed in the calling sitemap when this is a subsitemap. I have elected to turn off the caching here.

/examples/sql/sitemap.xmap
<?xml version="1.0" encoding="UTF-8"?> <map:generators default="file"> <map:generator name="file" src="resource://lib/generation/FileGenerator" cachable="no"> <map:use-request-parameters>true</map:use-request-parameters> </map:generator> </map:generators> <map:transformers default="xslt"> <map:transformer name="xslt" src="resource://lib/transforming/TRAXTransformer" cachable="no"> <map:use-request-parameters>true</map:use-request-parameters> </map:transformer> </map:transformers> <map:serializers default="xml"> <map:serializer name="xhtml" mime-type="text/html" src="resource://lib/serialization/XHTMLSerializer"> <doctype-public>-//W3C//DTD XHTML 1.0 Transitional//EN</doctype-public> <doctype-system>http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd</doctype-system> <encoding>ISO-8859-1</encoding> </map:serializer> <map:serializer name="xml" mime-type="text/xml" src="resource://lib/serialization/XMLSerializer"/> </map:serializers> <map:matchers default="wildcard"> <map:matcher name="wildcard" src="resource://lib/matching/WildcardURIMatcher"/> <map:matcher name="regexp" src="resource://lib/matching/RegexpURIMatcher"/> </map:matchers>

The only resource here is a means of outputting the final assembled XML page.

/examples/sql/sitemap.xmap - continued
<map:resources> <map:resource name="outputPage"> <map:transform src="context://resources/transforms/page2html.xsl" label="page-transform"> <map:parameter name="page" value="{1}"/> </map:transform> <map:transform src="context://resources/transforms/stripNamespaces.xsl"/> <map:serialize type="xhtml"/> </map:resource> </map:resources>

When I worked the original example I declared a series of views to help with the debugging.

/examples/sql/sitemap.xmap - continued
<map:views> <map:view name="aggr" from-label="aggr-content"> <map:call resource="outputXML"/> </map:view> <map:view name="xml" from-label="xml-content"> <map:call resource="outputXML"/> </map:view> <map:view name="px" from-label="px-content"> <map:call resource="outputXML"/> </map:view> <map:view name="transform" from-label="page-transform"> <map:call resource="outputXML"/> </map:view> <map:view name="menus" from-label="menus-content"> <map:call resource="outputXML"/> </map:view> <map:view name="pforms-1" from-label="pforms-violations"> <map:call resource="outputXML"/> </map:view> <map:view name="pforms-2" from-label="pforms-default"> <map:call resource="outputXML"/> </map:view> <map:view name="pforms-3" from-label="pforms-html"> <map:call resource="outputXML"/> </map:view> <map:view name="sql" from-label="sql-content"> <map:call resource="outputXML"/> </map:view> <map:view name="sql-transform" from-label="sql-transform"> <map:call resource="outputXML"/> </map:view> </map:views>

The first page has a very simple pipeline:

/examples/sql/sitemap.xmap - continued
<map:pipelines> <map:pipeline> <map:match pattern="sql.html"> <map:aggregate element="root" label="aggr-content"> <map:part src="cocoon:/menus.xml" element="menus" strip-root="true"/> <map:part src="cocoon:/sql.xml" element="content" strip-root="true"/> </map:aggregate> <map:call resource="outputPage"/> </map:match> </map:pipeline> <map:pipeline internal-only="true"> <map:match pattern="menus.xml"> <map:generate src="cocoon:/../menus.xml" label="menus-content"/> <map:serialize/> </map:match> <map:match pattern="*.xml"> <map:generate src="cocoon:/{1}.xml" label="xml-content"/> <map:serialize/> </map:match> </map:pipeline> </map:pipelines> </map:sitemap>

Using the same styles as the Paloose site the above would appear as:

The next section shows adding the link to display all the entries in the data base.

Copyright 2006 — 2010 Hugh Field-Richards. All Rights Reserved.