CFDdlUtils - Convert/Export Your Database To XML!!

Ray blogged yesterday about using some cool features in ColdFusion 8 to create a backup of your database. I commented on that post that I had recently been looking into a Java solution called DdlUtils. I hadn't gotten the package completely working when I messed with it the other day, but thanks to a couple of Excedrin Migraine pills I took last night that kept me up all night I got some time to dig into this project a little more. I'll hijack some text from the DdlUtils home page to explain the project:

DdlUtils is a small, easy-to-use component for working with Database Definition (DDL) files. These are XML files that contain the definition of a database schema, e.g. tables and columns. These files can be fed into DdlUtils via its Ant task or programmatically in order to create the corresponding database or alter it so that it corresponds to the DDL. Likewise, DdlUtils can generate a DDL file for an existing database.

DdlUtils uses the Turbine XML format, which is shared by Torque and OJB. This format expresses the database schema in a database-independent way by using JDBC datatypes instead of raw SQL datatypes which are inherently database specific.

The really exciting thing about this project is that the XML schema is common. Theoretically this means you should be able to dump a MySQL database (and its contents) to XML and use the same tool to create that same database in any other (supported) DBMS. Here's a list of the currently supported databases:

  • Axion
  • DB2
  • Derby/Cloudscape
  • Firebird
  • HSQLDB
  • Interbase
  • MaxDB/SapDB
  • McKoi
  • MySql
  • Oracle
  • PostgreSQL
  • SQL Server
  • Sybase

So enough talk, let's see some code. I pulled down a copy of the DdlUtils jar file and started playing with it a bit. I quickly found that there are some external dependencies (some bits from the Apache commons project). I found all the necessary jar files and loaded them all up with Mark Mandel's JavaLoader (which completely rocks!).

For ease I dumped everything into a lib folder and just loaded all of the jars:

<cfset paths = arrayNew(1) />
<cfdirectory action="list" directory="#expandPath("lib")#" name="libDir" />

<cfloop query="libDir">
   <cfset arrayAppend(paths, "#libDir.directory#\#libDir.name#")>
</cfloop>

<cfset loader = createObject("component", "javaloader.JavaLoader").init(paths) />

Next I had to use the "forbidden" ServiceFactory to get a copy of the Java object that represents my DSN. This could probably be done in pure Java but that would require messing with registering the datasource in JNDI and I thought this would be much easier.

<!--- get the cf service factory --->
<cfset cfFactory = createObject("java", "coldfusion.server.ServiceFactory") />
<cfset dSourceService = cfFactory.dataSourceService />
<cfset dSource = dSourceService.getDatasource("cfartgallery") />

Now I create the ddlutils PlatformFactory and create an instance of a platform by passing the previously created datasource object.

<!--- get the ddlutils platform factory --->
<cfset pFactory = loader.create("org.apache.ddlutils.PlatformFactory").init() />
<!--- create a platform for this dsn --->
<cfset platform = pFactory.createNewPlatformInstance(dSource)>

Read the model from the database:

<cfset database = platform.readModelFromDatabase("cfartgallery") />

Write the model to an XML file:

<cfset dbIO = loader.create("org.apache.ddlutils.io.DatabaseIO").init() />
<cfset dbIO.write(database, "#expandPath("cfartgallery.xml")#") />

Which produces the following XML:

<?xml version="1.0"?>
<!DOCTYPE database SYSTEM "http://db.apache.org/torque/dtd/database">
<database name="cfartgallery">
<table name="ART">
<column name="ARTID" primaryKey="true" required="true" type="INTEGER" size="10" autoIncrement="true"/>
<column name="ARTISTID" primaryKey="false" required="false" type="INTEGER" size="10" autoIncrement="false"/>
<column name="ARTNAME" primaryKey="false" required="false" type="VARCHAR" size="50" autoIncrement="false"/>
<column name="DESCRIPTION" primaryKey="false" required="false" type="CLOB" size="2147483647" autoIncrement="false"/>
<column name="PRICE" primaryKey="false" required="false" type="DECIMAL" size="19" autoIncrement="false"/>
<column name="LARGEIMAGE" primaryKey="false" required="false" type="VARCHAR" size="30" autoIncrement="false"/>
<column name="MEDIAID" primaryKey="false" required="false" type="INTEGER" size="10" autoIncrement="false"/>
<column name="ISSOLD" primaryKey="false" required="false" type="SMALLINT" size="5" autoIncrement="false"/>
</table>
<table name="ARTISTS">
<column name="ARTISTID" primaryKey="true" required="true" type="INTEGER" size="10" autoIncrement="true"/>
<column name="FIRSTNAME" primaryKey="false" required="false" type="VARCHAR" size="20" autoIncrement="false"/>
<column name="LASTNAME" primaryKey="false" required="false" type="VARCHAR" size="20" autoIncrement="false"/>
<column name="ADDRESS" primaryKey="false" required="false" type="VARCHAR" size="50" autoIncrement="false"/>
<column name="CITY" primaryKey="false" required="false" type="VARCHAR" size="20" autoIncrement="false"/>
<column name="STATE" primaryKey="false" required="false" type="VARCHAR" size="2" autoIncrement="false"/>
<column name="POSTALCODE" primaryKey="false" required="false" type="VARCHAR" size="10" autoIncrement="false"/>
<column name="EMAIL" primaryKey="false" required="false" type="VARCHAR" size="50" autoIncrement="false"/>
<column name="PHONE" primaryKey="false" required="false" type="VARCHAR" size="20" autoIncrement="false"/>
<column name="FAX" primaryKey="false" required="false" type="VARCHAR" size="12" autoIncrement="false"/>
<column name="THEPASSWORD" primaryKey="false" required="false" type="VARCHAR" size="8" autoIncrement="false"/>
</table>
<table name="GALLERYADMIN">
<column name="GALLERYADMINID" primaryKey="true" required="true" type="INTEGER" size="10" autoIncrement="true"/>
<column name="FIRSTNAME" primaryKey="false" required="false" type="VARCHAR" size="20" autoIncrement="false"/>
<column name="LASTNAME" primaryKey="false" required="false" type="VARCHAR" size="20" autoIncrement="false"/>
<column name="EMAIL" primaryKey="false" required="false" type="VARCHAR" size="50" autoIncrement="false"/>
<column name="ADMINPASSWORD" primaryKey="false" required="false" type="VARCHAR" size="8" autoIncrement="false"/>
</table>
<table name="MEDIA">
<column name="MEDIAID" primaryKey="true" required="true" type="INTEGER" size="10" autoIncrement="true"/>
<column name="MEDIATYPE" primaryKey="false" required="false" type="VARCHAR" size="50" autoIncrement="false"/>
</table>
<table name="ORDERITEMS">
<column name="ORDERITEMID" primaryKey="true" required="true" type="INTEGER" size="10" autoIncrement="true"/>
<column name="ORDERID" primaryKey="false" required="false" type="INTEGER" size="10" autoIncrement="false"/>
<column name="ARTID" primaryKey="false" required="false" type="INTEGER" size="10" autoIncrement="false"/>
<column name="PRICE" primaryKey="false" required="false" type="DECIMAL" size="19" autoIncrement="false"/>
</table>
<table name="ORDERS">
<column name="ORDERID" primaryKey="true" required="true" type="INTEGER" size="10" autoIncrement="true"/>
<column name="TAX" primaryKey="false" required="false" type="DECIMAL" size="19" autoIncrement="false"/>
<column name="TOTAL" primaryKey="false" required="false" type="DECIMAL" size="19" autoIncrement="false"/>
<column name="ORDERDATE" primaryKey="false" required="false" type="TIMESTAMP" size="26,6" autoIncrement="false"/>
<column name="ORDERSTATUSID" primaryKey="false" required="false" type="INTEGER" size="10" autoIncrement="false"/>
<column name="CUSTOMERFIRSTNAME" primaryKey="false" required="false" type="VARCHAR" size="50" autoIncrement="false"/>
<column name="CUSTOMERLASTNAME" primaryKey="false" required="false" type="VARCHAR" size="50" autoIncrement="false"/>
<column name="ADDRESS" primaryKey="false" required="false" type="VARCHAR" size="50" autoIncrement="false"/>
<column name="CITY" primaryKey="false" required="false" type="VARCHAR" size="50" autoIncrement="false"/>
<column name="STATE" primaryKey="false" required="false" type="VARCHAR" size="50" autoIncrement="false"/>
<column name="POSTALCODE" primaryKey="false" required="false" type="VARCHAR" size="50" autoIncrement="false"/>
<column name="PHONE" primaryKey="false" required="false" type="VARCHAR" size="50" autoIncrement="false"/>
</table>
<table name="ORDERSTATUS">
<column name="ORDERSTATUSID" primaryKey="true" required="true" type="INTEGER" size="10" autoIncrement="true"/>
<column name="STATUS" primaryKey="false" required="false" type="VARCHAR" size="15" autoIncrement="false"/>
</table>
</database>

Finally write the data to XML:

<cfset dbDataIO = loader.create("org.apache.ddlutils.io.DatabaseDataIO").init() />
<!--- writeDataToXML(Platform platform, Database model, String path, String xmlEncoding) --->
<cfset dbDataIO.writeDataToXML(platform, database, "#expandPath("cfartgalleryData.xml")#", "UTF-8") />

Which creates this XML:

<?xml version="1.0" encoding="UTF-8"?>
<data>
<ART ARTID="1" ARTISTID="1" ARTNAME="charles1" DESCRIPTION="Pastels/Charcoal" PRICE="10000" LARGEIMAGE="aiden01.jpg" MEDIAID="1" ISSOLD="1"></ART>
<ART ARTID="2" ARTISTID="1" ARTNAME="Michael" DESCRIPTION="Pastels/Charcoal" PRICE="13900" LARGEIMAGE="aiden02.jpg" MEDIAID="1" ISSOLD="0"></ART>
<ART ARTID="3" ARTISTID="1" ARTNAME="Freddy" DESCRIPTION="Pastels/Charcoal" PRICE="12500" LARGEIMAGE="aiden03.jpg" MEDIAID="1" ISSOLD="1"></ART>
<ART ARTID="4" ARTISTID="1" ARTNAME="Paulo" DESCRIPTION="Pastels/Charcoal" PRICE="11100" LARGEIMAGE="aiden04.jpg" MEDIAID="1" ISSOLD="1"></ART>
<ART ARTID="5" ARTISTID="1" ARTNAME="Mary" DESCRIPTION="Pastels/Charcoal" PRICE="13550" LARGEIMAGE="aiden05.jpg" MEDIAID="1" ISSOLD="1"></ART>
<ART ARTID="6" ARTISTID="3" ARTNAME="Space" DESCRIPTION="Mixed Media" PRICE="9800" LARGEIMAGE="elecia01.jpg" MEDIAID="2" ISSOLD="1"></ART>
<ART ARTID="7" ARTISTID="3" ARTNAME="Leaning House" DESCRIPTION="Mixed Media" PRICE="7800" LARGEIMAGE="elecia02.jpg" MEDIAID="2" ISSOLD="1"></ART>
<ART ARTID="8" ARTISTID="3" ARTNAME="Dude" DESCRIPTION="Mixed Media" PRICE="5600" LARGEIMAGE="elecia03.jpg" MEDIAID="2" ISSOLD="1"></ART>
<ART ARTID="9" ARTISTID="3" ARTNAME="Hang Ten" DESCRIPTION="Mixed Media" PRICE="8900" LARGEIMAGE="elecia04.jpg" MEDIAID="2" ISSOLD="0"></ART>
<ART ARTID="10" ARTISTID="3" ARTNAME="Life is a Horse" DESCRIPTION="Mixed Media" PRICE="10500" LARGEIMAGE="elecia05.jpg" MEDIAID="2" ISSOLD="0"></ART>
<ART ARTID="11" ARTISTID="2" ARTNAME="1958" DESCRIPTION="Charcoal " PRICE="75000" LARGEIMAGE="austin01.jpg" MEDIAID="1" ISSOLD="1"></ART>
<ART ARTID="12" ARTISTID="2" ARTNAME="Toxic" DESCRIPTION="Charcoal" PRICE="22000" LARGEIMAGE="austin02.jpg" MEDIAID="1" ISSOLD="1"></ART>
<ART ARTID="13" ARTISTID="2" ARTNAME="Prize Fight" DESCRIPTION="Charcoal " PRICE="25000" LARGEIMAGE="austin03.jpg" MEDIAID="1" ISSOLD="1"></ART>
<ART ARTID="14" ARTISTID="2" ARTNAME="You Don't Know Me" DESCRIPTION="Charcoal" PRICE="42700" LARGEIMAGE="austin04.jpg" MEDIAID="1" ISSOLD="0"></ART>
<ART ARTID="15" ARTISTID="2" ARTNAME="Do it" DESCRIPTION="Charcoal" PRICE="30000" LARGEIMAGE="austin05.jpg" MEDIAID="1" ISSOLD="1"></ART>
<ART ARTID="16" ARTISTID="4" ARTNAME="Bowl of Flowers" DESCRIPTION="Acrylic" PRICE="11800" LARGEIMAGE="jeff01.jpg" MEDIAID="1" ISSOLD="1"></ART>
<ART ARTID="17" ARTISTID="4" ARTNAME="60 Vibe" DESCRIPTION="Acrylic " PRICE="25000" LARGEIMAGE="jeff02.jpg" MEDIAID="1" ISSOLD="0"></ART>
<ART ARTID="18" ARTISTID="4" ARTNAME="Naked" DESCRIPTION="Acrylic" PRICE="30000" LARGEIMAGE="jeff03.jpg" MEDIAID="1" ISSOLD="1"></ART>
<ART ARTID="19" ARTISTID="4" ARTNAME="Sky" DESCRIPTION="Acrylic" PRICE="15000" LARGEIMAGE="jeff04.jpg" MEDIAID="1" ISSOLD="1"></ART>
<ART ARTID="20" ARTISTID="4" ARTNAME="Slices of Life" DESCRIPTION="Acrylic" PRICE="20000" LARGEIMAGE="jeff05.jpg" MEDIAID="1" ISSOLD="0"></ART>
<ART ARTID="21" ARTISTID="6" ARTNAME="Morning Forest" DESCRIPTION="Oil" PRICE="250000" LARGEIMAGE="maxwell01.jpg" MEDIAID="1" ISSOLD="0"></ART>
<ART ARTID="22" ARTISTID="6" ARTNAME="Things" DESCRIPTION="Oil" PRICE="300000" LARGEIMAGE="maxwell02.jpg" MEDIAID="1" ISSOLD="1"></ART>
<ART ARTID="23" ARTISTID="6" ARTNAME="The Lake" DESCRIPTION="Oil" PRICE="150000" LARGEIMAGE="maxwell03.jpg" MEDIAID="1" ISSOLD="0"></ART>
<ART ARTID="24" ARTISTID="6" ARTNAME="Morph" DESCRIPTION="Oil" PRICE="10500" LARGEIMAGE="maxwell04.jpg" MEDIAID="1" ISSOLD="0"></ART>
<ART ARTID="25" ARTISTID="6" ARTNAME="Ideas" DESCRIPTION="Oil" PRICE="250000" LARGEIMAGE="maxwell05.jpg" MEDIAID="1" ISSOLD="1"></ART>
<ART ARTID="26" ARTISTID="5" ARTNAME="Christmas" DESCRIPTION="Pastels" PRICE="54000" LARGEIMAGE="lori01.jpg" MEDIAID="1" ISSOLD="1"></ART>
<ART ARTID="27" ARTISTID="5" ARTNAME="Happiness" DESCRIPTION="Pastels" PRICE="65000" LARGEIMAGE="lori02.jpg" MEDIAID="1" ISSOLD="1"></ART>
<ART ARTID="28" ARTISTID="5" ARTNAME="Closed" DESCRIPTION="Pastels" PRICE="40000" LARGEIMAGE="lori03.jpg" MEDIAID="1" ISSOLD="0"></ART>
<ART ARTID="29" ARTISTID="5" ARTNAME="Enchanted Tree" DESCRIPTION="Pastels" PRICE="350000" LARGEIMAGE="lori04.jpg" MEDIAID="1" ISSOLD="0"></ART>
<ART ARTID="30" ARTISTID="5" ARTNAME="Melon" DESCRIPTION="Pastels" PRICE="200000" LARGEIMAGE="lori05.jpg" MEDIAID="1" ISSOLD="0"></ART>
<ART ARTID="31" ARTISTID="7" ARTNAME="Music" DESCRIPTION="Oils" PRICE="72000" LARGEIMAGE="paul01.jpg" MEDIAID="1" ISSOLD="0"></ART>
<ART ARTID="32" ARTISTID="7" ARTNAME="Empty" DESCRIPTION="Oils" PRICE="35000" LARGEIMAGE="paul02.jpg" MEDIAID="1" ISSOLD="1"></ART>
<ART ARTID="33" ARTISTID="7" ARTNAME="My Venus" DESCRIPTION="Oils" PRICE="58000" LARGEIMAGE="paul03.jpg" MEDIAID="1" ISSOLD="0"></ART>
<ART ARTID="34" ARTISTID="7" ARTNAME="Man in Jeans" DESCRIPTION="Oils" PRICE="100000" LARGEIMAGE="paul04.jpg" MEDIAID="1" ISSOLD="0"></ART>
<ART ARTID="35" ARTISTID="7" ARTNAME="Man on Stool" DESCRIPTION="Oils" PRICE="90000" LARGEIMAGE="paul05.jpg" MEDIAID="1" ISSOLD="1"></ART>
<ART ARTID="36" ARTISTID="8" ARTNAME="Mystery" DESCRIPTION="Pastels" PRICE="250000" LARGEIMAGE="raquel01.jpg" MEDIAID="1" ISSOLD="0"></ART>
<ART ARTID="37" ARTISTID="8" ARTNAME="Paradise" DESCRIPTION="Pastels" PRICE="300000" LARGEIMAGE="raquel02.jpg" MEDIAID="1" ISSOLD="0"></ART>
<ART ARTID="38" ARTISTID="8" ARTNAME="Mountains" DESCRIPTION="Pastels" PRICE="150000" LARGEIMAGE="raquel03.jpg" MEDIAID="1" ISSOLD="1"></ART>
<ART ARTID="39" ARTISTID="8" ARTNAME="Mom" DESCRIPTION="Pastels" PRICE="85000" LARGEIMAGE="raquel04.jpg" MEDIAID="1" ISSOLD="0"></ART>
<ART ARTID="40" ARTISTID="8" ARTNAME="Beauty" DESCRIPTION="Pastels" PRICE="100000" LARGEIMAGE="raquel05.jpg" MEDIAID="1" ISSOLD="0"></ART>
<ART ARTID="41" ARTISTID="9" ARTNAME="Cowboy" DESCRIPTION="Watercolor" PRICE="40000" LARGEIMAGE="viata01.jpg" MEDIAID="1" ISSOLD="0"></ART>
<ART ARTID="42" ARTISTID="9" ARTNAME="Pretty Life" DESCRIPTION="Watercolor" PRICE="35000" LARGEIMAGE="viata02.jpg" MEDIAID="1" ISSOLD="0"></ART>
<ART ARTID="43" ARTISTID="9" ARTNAME="Singer" DESCRIPTION="Watercolor" PRICE="56500" LARGEIMAGE="viata03.jpg" MEDIAID="1" ISSOLD="0"></ART>
<ART ARTID="44" ARTISTID="9" ARTNAME="Windy" DESCRIPTION="Watercolor" PRICE="36000" LARGEIMAGE="viata04.jpg" MEDIAID="1" ISSOLD="1"></ART>
<ART ARTID="45" ARTISTID="9" ARTNAME="Yellow to Me" DESCRIPTION="Watercolor" PRICE="20000" LARGEIMAGE="viata05.jpg" MEDIAID="1" ISSOLD="1"></ART>
<ART ARTID="46" ARTISTID="19" ARTNAME="Garden" DESCRIPTION="Photograph" PRICE="35000" LARGEIMAGE="anthony01.jpg" MEDIAID="6" ISSOLD="1"></ART>
<ART ARTID="47" ARTISTID="19" ARTNAME="Flower" DESCRIPTION="Photograph" PRICE="20000" LARGEIMAGE="anthony02.jpg" MEDIAID="6" ISSOLD="0"></ART>
<ART ARTID="48" ARTISTID="19" ARTNAME="White Flowers" DESCRIPTION="Photograph" PRICE="45000" LARGEIMAGE="anthony03.jpg" MEDIAID="6" ISSOLD="1"></ART>
<ART ARTID="49" ARTISTID="19" ARTNAME="Ground Cover" DESCRIPTION="Photograph" PRICE="20000" LARGEIMAGE="anthony04.jpg" MEDIAID="6" ISSOLD="0"></ART>
<ART ARTID="50" ARTISTID="19" ARTNAME="Blue Moon" DESCRIPTION="Photograph" PRICE="30000" LARGEIMAGE="anthony05.jpg" MEDIAID="6" ISSOLD="1"></ART>
<ART ARTID="51" ARTISTID="20" ARTNAME="Cow" DESCRIPTION="Painting" PRICE="23000" LARGEIMAGE="ellery01.jpg" MEDIAID="0" ISSOLD="0"></ART>
<ART ARTID="52" ARTISTID="20" ARTNAME="Picasso" DESCRIPTION="Painting" PRICE="14000" LARGEIMAGE="ellery02.jpg" MEDIAID="0" ISSOLD="0"></ART>
<ART ARTID="53" ARTISTID="21" ARTNAME="Miro" DESCRIPTION="Painting" PRICE="10000" LARGEIMAGE="emma01.jpg" MEDIAID="0" ISSOLD="0"></ART>
<ART ARTID="54" ARTISTID="22" ARTNAME="Dino" DESCRIPTION="Painting" PRICE="12000" LARGEIMAGE="taylor01.jpg" MEDIAID="0" ISSOLD="0"></ART>
<ART ARTID="55" ARTISTID="4" ARTNAME="sda" PRICE="10" LARGEIMAGE="7"></ART>
<ARTISTS ARTISTID="1" FIRSTNAME="Aiden" LASTNAME="Donolan" ADDRESS="352 Corporate Ave." CITY="Denver" STATE="CO" POSTALCODE="80206-4526" EMAIL="aiden.donolan@donolan.com" PHONE="555-751-8464" FAX="555-751-8463" THEPASSWORD="peapod"></ARTISTS>
<ARTISTS ARTISTID="2" FIRSTNAME="Austin" LASTNAME="Weber" ADDRESS="25463 Main Street, Suite C" CITY="Berkeley" STATE="CA" POSTALCODE="94707-4513" EMAIL="austin@life.com" PHONE="555-513-4318" FAX="510-513-4888" THEPASSWORD="nopolyes"></ARTISTS>
<ARTISTS ARTISTID="3" FIRSTNAME="Elicia" LASTNAME="Kim" ADDRESS="2523 National Blvd" CITY="Los Angeles" STATE="CA" POSTALCODE="90064-5134" EMAIL="eleciakim@newmedia.com" PHONE="555-846-4613" FAX="" THEPASSWORD="longtail"></ARTISTS>
<ARTISTS ARTISTID="4" FIRSTNAME="Jeff" LASTNAME="Baclawski" ADDRESS="903 Boardwalk Ave" CITY="Hollywood" STATE="FL" POSTALCODE="33021-8894" EMAIL="user@demodata.com" PHONE="239-213-4561" FAX="239-213-7465" THEPASSWORD="demo"></ARTISTS>
<ARTISTS ARTISTID="5" FIRSTNAME="Lori" LASTNAME="Johnson" ADDRESS="6462 Cowtown Rd" CITY="Pierre" STATE="SD" POSTALCODE="57501-7782" EMAIL="lb@bovinas.com" PHONE="605-776-8461" FAX="605-776-8462" THEPASSWORD="nowhere"></ARTISTS>
<ARTISTS ARTISTID="6" FIRSTNAME="Maxwell" LASTNAME="Wilson" ADDRESS="72500 MLK Blvd" CITY="Tulsa" STATE="OK" POSTALCODE="74116-4613" EMAIL="max@mypaintings.com" PHONE="918-347-4513" FAX="918-456-1315" THEPASSWORD="eyeball"></ARTISTS>
<ARTISTS ARTISTID="7" FIRSTNAME="Paul" LASTNAME="Trani" ADDRESS="3320 Fashion Dr" CITY="New York" STATE="NY" POSTALCODE="10017-1231" EMAIL="paul.trani@trani.com" PHONE="212-630-5345" THEPASSWORD="ouchy"></ARTISTS>
<ARTISTS ARTISTID="8" FIRSTNAME="Raquel" LASTNAME="Young" ADDRESS="1120 Presidential Ave" CITY="Atlanta" STATE="GA" POSTALCODE="39901-4813" EMAIL="raquel@soulpaints.com" PHONE="770-397-9486" FAX="770-391-8435" THEPASSWORD="cmyk"></ARTISTS>
<ARTISTS ARTISTID="9" FIRSTNAME="Viata" LASTNAME="Trenton" ADDRESS="4563 42nd St" CITY="New York" STATE="NY" POSTALCODE="10012-4562" EMAIL="trenton.v@trenton.com" PHONE="212-456-8468" FAX="212-468-8765" THEPASSWORD="pillow"></ARTISTS>
<ARTISTS ARTISTID="10" FIRSTNAME="Diane" LASTNAME="Demo" ADDRESS="123 Demo Lane" CITY="Denver" STATE="CO" POSTALCODE="55555" EMAIL="diane@demo.com" PHONE="555-555-5555" FAX="" THEPASSWORD="demo"></ARTISTS>
<ARTISTS ARTISTID="11" FIRSTNAME="Anthony" LASTNAME="Kunovic" ADDRESS="111 94th Ave" CITY="Aspen" STATE="CO" POSTALCODE="90809" EMAIL="aj@ajgalleries.com" PHONE="970-555-1373" THEPASSWORD="overlord"></ARTISTS>
<ARTISTS ARTISTID="12" FIRSTNAME="Ellery" LASTNAME="Buntel" ADDRESS="23 Elm St" CITY="Washington" STATE="DC" POSTALCODE="77893" EMAIL="ellery.buntel@myart.com" PHONE="637-902-7200" FAX="637-300-2888" THEPASSWORD="crayon"></ARTISTS>
<ARTISTS ARTISTID="13" FIRSTNAME="Emma" LASTNAME="Buntel" ADDRESS="789 Main St" CITY="Washington" STATE="DC" POSTALCODE="77834" EMAIL="emma.buntel@myart.com" PHONE="637-930-2999" THEPASSWORD="bluebird"></ARTISTS>
<ARTISTS ARTISTID="14" FIRSTNAME="Taylor Webb" LASTNAME="Frazier" ADDRESS="58 Plaza Ct" CITY="Santa Fe" STATE="NM" POSTALCODE="34453" EMAIL="taylor.webb@myart.com" PHONE="444-333-9876" THEPASSWORD="icecream"></ARTISTS>
<ARTISTS ARTISTID="15" FIRSTNAME="Mike" LASTNAME="Nimer" ADDRESS="qwed qdsa" CITY="asd da" STATE="ca" POSTALCODE="01321" EMAIL="me@m.com" THEPASSWORD="admin"></ARTISTS>
<GALLERYADMIN GALLERYADMINID="1" FIRSTNAME="Suzanne" LASTNAME="White" EMAIL="swhite@fashiongalleria.com" ADMINPASSWORD="bludress"></GALLERYADMIN>
<GALLERYADMIN GALLERYADMINID="2" FIRSTNAME="Mike" LASTNAME="Green" EMAIL="mgreen@fashiongalleria.com" ADMINPASSWORD="organza"></GALLERYADMIN>
<GALLERYADMIN GALLERYADMINID="3" FIRSTNAME="Darrell" LASTNAME="Demo" EMAIL="admin@demodata.com" ADMINPASSWORD="demo"></GALLERYADMIN>
<MEDIA MEDIAID="1" MEDIATYPE="Painting"></MEDIA>
<MEDIA MEDIAID="2" MEDIATYPE="Sculpure"></MEDIA>
<MEDIA MEDIAID="3" MEDIATYPE="Pottery"></MEDIA>
<MEDIA MEDIAID="4" MEDIATYPE="Jewelry"></MEDIA>
<MEDIA MEDIAID="5" MEDIATYPE="Tapestry"></MEDIA>
<MEDIA MEDIAID="6" MEDIATYPE="Photography"></MEDIA>
<MEDIA MEDIAID="7" MEDIATYPE="Functional"></MEDIA>
<MEDIA MEDIAID="8" MEDIATYPE="Wearable"></MEDIA>
<ORDERITEMS ORDERITEMID="1" ORDERID="1" ARTID="1" PRICE="10000"></ORDERITEMS>
<ORDERITEMS ORDERITEMID="2" ORDERID="2" ARTID="3" PRICE="12400"></ORDERITEMS>
<ORDERITEMS ORDERITEMID="3" ORDERID="2" ARTID="5" PRICE="13550"></ORDERITEMS>
<ORDERITEMS ORDERITEMID="4" ORDERID="3" ARTID="6" PRICE="9800"></ORDERITEMS>
<ORDERITEMS ORDERITEMID="5" ORDERID="4" ARTID="7" PRICE="7800"></ORDERITEMS>
<ORDERITEMS ORDERITEMID="6" ORDERID="5" ARTID="8" PRICE="5600"></ORDERITEMS>
<ORDERITEMS ORDERITEMID="7" ORDERID="6" ARTID="11" PRICE="75000"></ORDERITEMS>
<ORDERITEMS ORDERITEMID="8" ORDERID="7" ARTID="12" PRICE="22000"></ORDERITEMS>
<ORDERITEMS ORDERITEMID="9" ORDERID="8" ARTID="15" PRICE="30000"></ORDERITEMS>
<ORDERITEMS ORDERITEMID="10" ORDERID="9" ARTID="16" PRICE="11800"></ORDERITEMS>
<ORDERITEMS ORDERITEMID="11" ORDERID="10" ARTID="18" PRICE="30000"></ORDERITEMS>
<ORDERITEMS ORDERITEMID="12" ORDERID="11" ARTID="44" PRICE="36000"></ORDERITEMS>
<ORDERITEMS ORDERITEMID="13" ORDERID="12" ARTID="45" PRICE="20000"></ORDERITEMS>
<ORDERITEMS ORDERITEMID="14" ORDERID="13" ARTID="38" PRICE="150000"></ORDERITEMS>
<ORDERITEMS ORDERITEMID="15" ORDERID="14" ARTID="35" PRICE="90000"></ORDERITEMS>
<ORDERITEMS ORDERITEMID="16" ORDERID="15" ARTID="32" PRICE="35000"></ORDERITEMS>
<ORDERITEMS ORDERITEMID="17" ORDERID="16" ARTID="19" PRICE="15000"></ORDERITEMS>
<ORDERITEMS ORDERITEMID="18" ORDERID="17" ARTID="25" PRICE="250000"></ORDERITEMS>
<ORDERITEMS ORDERITEMID="19" ORDERID="18" ARTID="4" PRICE="11100"></ORDERITEMS>
<ORDERITEMS ORDERITEMID="20" ORDERID="19" ARTID="22" PRICE="300000"></ORDERITEMS>
<ORDERITEMS ORDERITEMID="21" ORDERID="20" ARTID="27" PRICE="65000"></ORDERITEMS>
<ORDERITEMS ORDERITEMID="22" ORDERID="21" ARTID="46" PRICE="35000"></ORDERITEMS>
<ORDERITEMS ORDERITEMID="23" ORDERID="22" ARTID="48" PRICE="45000"></ORDERITEMS>
<ORDERITEMS ORDERITEMID="24" ORDERID="23" ARTID="50" PRICE="30000"></ORDERITEMS>
<ORDERS ORDERID="1" TAX="400" TOTAL="10400" ORDERDATE="2003-06-10 00:00:00.0" ORDERSTATUSID="1" CUSTOMERFIRSTNAME="Bob" CUSTOMERLASTNAME="Green" ADDRESS="12 Gover St" CITY="Oakland" STATE="CA" POSTALCODE="45794"></ORDERS>
<ORDERS ORDERID="2" TAX="1038" TOTAL="26988" ORDERDATE="2002-07-02 00:00:00.0" ORDERSTATUSID="5" CUSTOMERFIRSTNAME="Sue" CUSTOMERLASTNAME="White" ADDRESS="123 4th St" CITY="Greeley" STATE="CO" POSTALCODE="55555"></ORDERS>
<ORDERS ORDERID="3" TAX="392" TOTAL="10192" ORDERDATE="2001-06-05 00:00:00.0" ORDERSTATUSID="5" CUSTOMERFIRSTNAME="Tiffany" CUSTOMERLASTNAME="Rose" ADDRESS="11267 Green St" CITY="Seattle" STATE="WA" POSTALCODE="34567"></ORDERS>
<ORDERS ORDERID="4" TAX="312" TOTAL="8112" ORDERDATE="2003-06-18 00:00:00.0" ORDERSTATUSID="5" CUSTOMERFIRSTNAME="Frank" CUSTOMERLASTNAME="Smith" ADDRESS="78 45th Ave" CITY="Las Vegas" STATE="NV" POSTALCODE="68689"></ORDERS>
<ORDERS ORDERID="5" TAX="224" TOTAL="5824" ORDERDATE="2001-05-22 00:00:00.0" ORDERSTATUSID="5" CUSTOMERFIRSTNAME="Anthony" CUSTOMERLASTNAME="Shumacher" ADDRESS="988 Brownlee Way" CITY="Denver" STATE="CO" POSTALCODE="30604"></ORDERS>
<ORDERS ORDERID="6" TAX="3000" TOTAL="78000" ORDERDATE="2004-04-01 00:00:00.0" ORDERSTATUSID="1" CUSTOMERFIRSTNAME="Jerry" CUSTOMERLASTNAME="Day" ADDRESS="689 Dell Ave" CITY="Santa Fe" STATE="NM" POSTALCODE="39087"></ORDERS>
<ORDERS ORDERID="7" TAX="880" TOTAL="22880" ORDERDATE="2001-08-28 00:00:00.0" ORDERSTATUSID="5" CUSTOMERFIRSTNAME="Dave" CUSTOMERLASTNAME="Cardinal" ADDRESS="234 Phoenix Way" CITY="Phoenix" STATE="AZ" POSTALCODE="33399"></ORDERS>
<ORDERS ORDERID="8" TAX="1200" TOTAL="31200" ORDERDATE="2002-12-25 00:00:00.0" ORDERSTATUSID="5" CUSTOMERFIRSTNAME="Mary" CUSTOMERLASTNAME="Carter" ADDRESS="944 Eaton Way" CITY="Colorado Springs" STATE="CO" POSTALCODE="90004"></ORDERS>
<ORDERS ORDERID="9" TAX="472" TOTAL="12272" ORDERDATE="2001-01-13 00:00:00.0" ORDERSTATUSID="5" CUSTOMERFIRSTNAME="Cheryl" CUSTOMERLASTNAME="Masters" ADDRESS="6 23rd" CITY="Ogden" STATE="UT" POSTALCODE="56555"></ORDERS>
<ORDERS ORDERID="10" TAX="1200" TOTAL="31200" ORDERDATE="2004-02-05 00:00:00.0" ORDERSTATUSID="2" CUSTOMERFIRSTNAME="Louahn" CUSTOMERLASTNAME="Lloyd" ADDRESS="Scottsdale Circle" CITY="Scottsdale" STATE="AZ" POSTALCODE="45677"></ORDERS>
<ORDERS ORDERID="11" TAX="1440" TOTAL="37440" ORDERDATE="2004-09-19 00:00:00.0" ORDERSTATUSID="2" CUSTOMERFIRSTNAME="Nancy" CUSTOMERLASTNAME="Smithers" ADDRESS="4 Palm Dr" CITY="Houston" STATE="TX" POSTALCODE="34500"></ORDERS>
<ORDERS ORDERID="12" TAX="800" TOTAL="20800" ORDERDATE="2003-05-25 00:00:00.0" ORDERSTATUSID="5" CUSTOMERFIRSTNAME="Bob" CUSTOMERLASTNAME="Franks" ADDRESS="456 W. 6th" CITY="Deadwood" STATE="OK" POSTALCODE="98999"></ORDERS>
<ORDERS ORDERID="13" TAX="6000" TOTAL="156000" ORDERDATE="2003-07-09 00:00:00.0" ORDERSTATUSID="5" CUSTOMERFIRSTNAME="Michael" CUSTOMERLASTNAME="Harvey" ADDRESS="23 Land Park" CITY="Cheyenne" STATE="WY" POSTALCODE="80906"></ORDERS>
<ORDERS ORDERID="14" TAX="3600" TOTAL="93600" ORDERDATE="2003-12-11 00:00:00.0" ORDERSTATUSID="5" CUSTOMERFIRSTNAME="Jane" CUSTOMERLASTNAME="Downs" ADDRESS="234 54th St" CITY="New York" STATE="NY" POSTALCODE="20405"></ORDERS>
<ORDERS ORDERID="15" TAX="1400" TOTAL="36400" ORDERDATE="2004-01-30 00:00:00.0" ORDERSTATUSID="2" CUSTOMERFIRSTNAME="Kerry" CUSTOMERLASTNAME="Kerns" ADDRESS="34 Lincoln Way" CITY="Boston" STATE="MA" POSTALCODE="30445"></ORDERS>
<ORDERS ORDERID="16" TAX="600" TOTAL="15600" ORDERDATE="2004-03-16 00:00:00.0" ORDERSTATUSID="2" CUSTOMERFIRSTNAME="Emily" CUSTOMERLASTNAME="Michaels" ADDRESS="8999 1st Ave" CITY="Anytown" STATE="AK" POSTALCODE="90806"></ORDERS>
<ORDERS ORDERID="17" TAX="10000" TOTAL="260000" ORDERDATE="2004-05-25 00:00:00.0" ORDERSTATUSID="2" CUSTOMERFIRSTNAME="Joe" CUSTOMERLASTNAME="Anthony" ADDRESS="1555 Quail St" CITY="Denver" STATE="CO" POSTALCODE="80215"></ORDERS>
<ORDERS ORDERID="18" TAX="444" TOTAL="11544" ORDERDATE="2004-06-13 00:00:00.0" ORDERSTATUSID="2" CUSTOMERFIRSTNAME="Pauette" CUSTOMERLASTNAME="Crow" ADDRESS="45 54th Drive" CITY="Dallas" STATE="TX" POSTALCODE="34120"></ORDERS>
<ORDERS ORDERID="19" TAX="12000" TOTAL="312000" ORDERDATE="2004-07-25 00:00:00.0" ORDERSTATUSID="2" CUSTOMERFIRSTNAME="David" CUSTOMERLASTNAME="Kissler" ADDRESS="5673 Summit Ave" CITY="Los Angeles" STATE="CA" POSTALCODE="80910"></ORDERS>
<ORDERS ORDERID="20" TAX="2600" TOTAL="67600" ORDERDATE="2004-08-12 00:00:00.0" ORDERSTATUSID="2" CUSTOMERFIRSTNAME="Matt" CUSTOMERLASTNAME="Armstrong" ADDRESS="76 120th" CITY="Kansas City" STATE="KS" POSTALCODE="44980"></ORDERS>
<ORDERS ORDERID="21" TAX="1400" TOTAL="36400" ORDERDATE="2003-03-16 00:00:00.0" ORDERSTATUSID="5" CUSTOMERFIRSTNAME="Joe" CUSTOMERLASTNAME="Kunovic" ADDRESS="3987 Frontage Road" CITY="Boston" STATE="MA" POSTALCODE="39500"></ORDERS>
<ORDERS ORDERID="22" TAX="1800" TOTAL="46800" ORDERDATE="2004-03-16 00:00:00.0" ORDERSTATUSID="3" CUSTOMERFIRSTNAME="Annette" CUSTOMERLASTNAME="Kunovic" ADDRESS="4589 Main St" CITY="New York" STATE="NY" POSTALCODE="89993"></ORDERS>
<ORDERS ORDERID="23" TAX="1200" TOTAL="31200" ORDERDATE="2004-06-19 00:00:00.0" ORDERSTATUSID="1" CUSTOMERFIRSTNAME="Allen" CUSTOMERLASTNAME="Rice" ADDRESS="34 First Lane" CITY="Los Angeles" STATE="CA" POSTALCODE="67839"></ORDERS>
<ORDERSTATUS ORDERSTATUSID="1" STATUS="pending"></ORDERSTATUS>
<ORDERSTATUS ORDERSTATUSID="2" STATUS="complete"></ORDERSTATUS>
<ORDERSTATUS ORDERSTATUSID="3" STATUS="shipped"></ORDERSTATUS>
<ORDERSTATUS ORDERSTATUSID="4" STATUS="billed"></ORDERSTATUS>
<ORDERSTATUS ORDERSTATUSID="5" STATUS="paid"></ORDERSTATUS>
</data>

It's all pretty much just POC at this point, but I'm thinking of creating a full blown API out of the code and releasing it as a sort of mini-framework. Any thoughts on that? Would anyone find this useful/helpful?

Comments
Hi Todd,

Nice Post! This would be really helpful in database migration.
# Posted By Hareni | 11/29/07 6:06 AM
I have the very basics of an CF ORM based on the Torque XML. Never finished it due to getting the idea, and switching over to Transfer :)
# Posted By dc | 11/29/07 8:48 AM
@dc:

Do you think continuing on that project would be beneficial or is Transfer meeting all your needs? In other words, does Torque do anything "better/different" then Transfer does?
# Posted By todd sharp | 11/29/07 1:28 PM
Although the XML syntax is used, this is a subset of the functionality provided by my (free) DataMgr component set.

http://www.bryantwebconsulting.com/blog/index.cfm/...
http://www.bryantwebconsulting.com/blog/index.cfm/...

My list of supported databases isn't as extensive yet (though I do plan to expand it).
# Posted By Steve Bryant | 11/29/07 10:37 PM
Steve: I'm aware of datamanager - I still am considering using it for the project that I'm working on that needed this. The allure of a cross DBMS solution with many supported databases was what drew me to ddlutils.

With that, let me be lazy and ask you a few questions instead of looking into it more. Any plans of taking advantage of cfdbinfo (possible conditional cf8 support so as to not alienate your users) to greatly expand the supported databases? Do you have a createDatabase() function (or would you consider adding one)? Does DataMgr support indexes, foreign keys, etc - does it support dumping existing rows of data to xml also?

If I could convince you to add a few of those things then I would really like to use your component set for my project (which will be open sourced and will benefit all open source developers and users of OS software in the CF community).

Ping me offline if you'd like to talk more. I'm on GTalk (cfsilence@gmail.com).
# Posted By todd sharp | 11/30/07 10:51 AM
Great questions.

I don't have any plans currently to take advantage of cfdbinfo. DataMgr will currently run on CFMX 6.1 and above and I don't want to sacrifice that - especially since cfdbinfo alone would not be sufficient to add support for new databases.

I am willing to add support for any database to which I can get access (I'm not going to go download every database on my computer, but if someone will set up a datasource that I can reach from my computer, I will work on adding support for that database).

I don't have a createDatabase() function, but I would consider adding one. It doesn't currently support indexes and foerign keys, but I would certainly be willing to look into that (it has been on my mind for some time).

DataMgr itself doesn't support dumping rows as XML (Though DataSynch does). That would be easy to add though.

It sounds like you have some great ideas! I will shoot you an email for more discussion on this.
# Posted By Steve Bryant | 11/30/07 12:07 PM
Todd:

Great post. Quick question--you mention that you had to add one or more external libraries to get the thing running, but never list them. Can you give us a list of what those are?

Thanks,
Mark
# Posted By Mark Mazelin | 12/6/07 10:09 AM
Mark:

I'd be glad to share the whole project with you - I had intended on releasing the whole project but I've ran into some issues and haven't had a chance to work more on the project yet. One of the issues is that CF ships with a custom SQL server JDBC driver that is not recognized by ddlutils so I'm refactoring how the database type is determined (ddlutils dyncamically evaluates the db type based on the given JDBC driver so I need to find a different method).

I can send you a copy of the zip once I've got that tweaked or do you just want what I've got so far?
# Posted By todd sharp | 12/6/07 1:37 PM

Calendar

Sun Mon Tue Wed Thu Fri Sat
     12
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31       

Subscribe

Enter your email address to subscribe to this blog.

Tags

actionscript ajax blogging cfsnippets coldfusion flash forms flex funny stuff misc model-glue off topic personal project learn slidesix sql

Recent Comments

ColdFusion/Sharepoint Integration - Part 1 - Authenticating
todd sharp said: Jenn: Check your email. Todd