Any REBOL driver implementing the port API for databases (as used in REBOL Technologies' drivers) or in Softinnov's drivers will work. Non-standard drivers can be used too but won't benefit from Cheyenne's databases abstraction layer (you will need to open/close connections in your own code).
RSP and webapps provide a thin abstraction layer to access databases. This means, you don't have to care about opening, closing or re-opening databases connections. It is managed automatically by Cheyenne as long as you provide a definition in the configuration file using the databases? directive, in one of the sections (Globals, Hosts or webapp):
globals [
databases [
books mysql://user:pass/localhost/books
]
...
]
domain.com [
...
databases [
books2 mysql://user:pass/localhost/books
]
...
webapp [
...
databases [
books3 mysql://user:pass/localhost/books
]
]
]
Note: avoid using the same database definition name in different scopes as the inherited definitions can collide (needs a more accurate heritage support in the RSP engine).
You can add as much definitions as you need in the same databases block:
databases [
books mysql://user:pass/localhost/books
admin mysql://root:pass/localhost/books
sales oracle://user:pass/1.2.3.4/sales
...
]
Once defined, databases connections will be automatically opened on first SQL request. As Cheyenne relies on a pre-forked model for RSP scripts evaluation, the number of connections will scale up with the worker processes number, so you'll get a natural databases connection pooling for free!
The SQL queries are sent using a single function: DO-SQL that will take two arguments:
Example:
<%
list: do-sql 'books "SELECT * FROM titles WHERE author='Kubrick'"
%>
<table>
<tr><th>Title</th><th>Author</th><th>Year</th>
<% foreach book list [ %>
<tr>
<td><%= book/1 %></td>
<td><%= book/2 %></td>
<td><%= book/3 %></td>
</tr>
<% ] %>
</table>
Another example using parameters from the request:
<%
unless invalid?: validate/full [author string! *][
list: do-sql 'books [
"SELECT * FROM titles WHERE author=?"
request/content/author
]
]
%>
This second form is what you should be using for securing query's arguments and avoiding SQL injection attacks.