The SATerm Database Interface? (aterm-dbi) offers an ATermServices look on a relational database. aterm-dbi uses Java Stratego.ATerm Servlets.
Currently there is just a query service. It is accessible on the URL aterm-dbi/query
. The query service
is an ATermService . It accepts a Query
term in the body of a HTTP POST request and returns the result of
the query in the body of the reponse.
For example this query:
Query("SELECT ID, Name FROM Customer")
Might result in this ResultSet
:
ResultSet( MetaData( Columns( [ Column(Name("id"), Type(Std("INTEGER"), Db("int4"))) , Column(Name("name"), Type(Std("CHAR"), Db("bpchar"))) ] ) ) , Data( [ Row([160, "Meindert Kroese"]) , Row([159, "Steven van Dijk"]) , Row([158, "Martijn Schrage"]) , Row([157, "Sandor Spruit" ]) ] ) )The Stratego.ATerm Database Interface rewrites values of SQL types to an Stratego.ATerm representation. The current implementation can just handle integer types (INTEGER, SMALLINT, and BIGINT) and string types (CHAR, VARCHAR, and LONGVARCHAR). This will be extended in the future to handle all SQL data types.
From Stratego you can invoke the services of aterm-dbi with the http-transform
strategy of StrategoNetworking.
There is one problem: the Java implementation of the ATermLibrary doesn't provide a reader for BAF, the Binary Stratego.ATerm Format?. Because of this format is very efficient, it is used by XTC by default. You should thus invoke the services of aterm-dbi in TAF, the Textual Stratego.ATerm Format?. You could do this with this strategy:
http-text-transform(service-url) = xtc-temp-files( write-to-text ; xtc-http-transform(service-url) ; read-from )
Invocation of the query service of aterm-dbi:
<http-text-transform(!URL("http://127.0.0.1:8080/aterm-dbi/query"))> Query("SELECT ID, Name FROM Customer")
You can download the latest release at:
The war
file is a Java Web Archive, a binary distribution. You can immediately put this file in your servlet container. The .tar.gz files are source distributions. You need Ant to build the sources.
You can also get the latest sources from the Subversion repository:
svn checkout %SVNSTRATEGOXT%/trunk/experimental/aterm-dbiSee latest sources? for more information on how to checkout packages from the StrategoXT subversion repository.
In the samples package of Stratego Networking? you can find some samples in the xmpl/aterm-dbi
directory (unreleased, use the Subversion repository).
aterm-dbi is a J2EE application. It uses a JDBC DataSource
that is made available by the application server it is hosted in via the JNDI.
Advantages of this approach:
You should be able to run the Stratego.ATerm database interface on any J2EE Application Server and using any database system implementation (as long as there is a JDBC 3 driver available).
I will provide instructions for a configuration where I'm using Tomcat 5 and PostgreSQL. Please consult the documentation of the application and database server if you choose other software.
First of all you need a PostgreSQL database. You need version 7.2 or 7.3. Please refer to the documentation of PostgreSQL if you need to install the database system by yourself.
You need a Java 2 SDK to run Tomcat. It is wise to use a recent release (version 1.4.x). Make sure the environment variable JAVA_HOME points to the location where you installed your J2SDK.
Next, you need Tomcat 5. Tomcat 4 will not do the job! Installation of Tomcat 5 is very straightforward nowadays.
Now the basic components of Java based database application are available, now comes the Stratego.ATerm database interface specific part.
You need a JDBC3 driver for your DBMS, in this case the JDBC3 driver for PostgreSQL.
Put it in the common/lib
directory of your Tomcat installation.
Now it's finally time to install the web archive (.war) of aterm-dbi. You should
put this war in the webapps
directory of Tomcat.
We still have to configure Tomcat with the database you want to use. This is application server and database specific, so you will probably need to consult some other documentation.
In Tomcat you should add this to the Host
element with the name
attribute localhost
:
<Context path="/aterm-dbi" docBase="aterm-dbi.war" debug="5" reloadable="true"> <Logger className="org.apache.catalina.logger.FileLogger" prefix="aterm-dbi-log." suffix=".txt" timestamp="true"/> <Resource name="jdbc/aterm-dbi" auth="Container" type="org.postgresql.jdbc3.Jdbc3PoolingDataSource"/> <ResourceParams name="jdbc/aterm-dbi"> <parameter> <name>factory</name> <value>org.postgresql.jdbc3.Jdbc3ObjectFactory</value> </parameter> <parameter> <name>databaseName</name><value>.....</value> </parameter> <parameter> <name>serverName</name><value>127.0.0.1</value> </parameter> <parameter> <name>user</name><value>....</value> </parameter> <parameter> <name>password</name><value>.....</value> </parameter> </ResourceParams> </Context>Of course you should fill in your database-, server-, and username and your password.
We've chosen the PoolingDataSource
implementation of the PostgreSQL JDBC driver,
but if your application server offers a connection pooling implementation
which interfaces with a ConnectionPoolDataSource
, you should choose that option.
-- MartinBravenboer - 10 Mar 2003