| |
Introduction
w3-msql is an interface between the World-Wide Web and mSQL. It is a
mechanism that can be used to greatly simplify the use of a Mini SQL
database behind a web server. Using w3-msql, you can embed SQL queries
within your pages and have the results generated on the fly. The w3-msql
program is used as a CGI script that your w3-msql enhanced pages are
passed through. It should be referenced as
- /cgi-bin/w3-msql/Path/To/Your/Page.html
where /Path/To/Your/Page.html is a w3-msql enhanced html file within your WWW
document tree. w3-msql will process the specified page and "fill in
the blanks" by interpreting and processing the embedded mSQL commands.
The w3-msql language
A w3-msql directive is embedded within an html page using the following
syntax :-
- <! msql command args >
The commands that are available are :-
<! msql connect [host] >
- Connect to the mSQL database engine. An option hostname can
be provided to indicate that the database is running on a remote
machine, for example :-
- <! msql connect www.some.domain >
Unlike the C programming language API for mSQL, you can only have one
connection to a database server from within your w3-msql page. You can
access multiple databases from the one connection by using the
database directive outlined below.
<! msql close >
- Close the currently open mSQL database connection. You should call
the close directive when you are finished with the database from
within your page. Once you have closed the connection, you could open a
new connection to another database server if your page requires data
held in mSQL servers on different machines.
<! msql database DBName >
- Choose the database that you wish to access from your queries, for
example :-
- <! msql database test >
If you need to access data from multiple database managed by the same
mSQL server, you can simply issue the database directive again to
select a new database to use. There is no limit to the number of times
you can call the database directive in a single page so you can
literally swap back and forth between databases at any time.
<! msql query "query text" QueryHandle >
- Submit a query to the database. The query text is submitted to
the database and any returned data is stored in the QueryHandle.
You use the QueryHandle to access the data later in your page.
For example :-
- <! msql query "select name from users" q1 >
Once the query has been processed, the first row of the returned data is
fetched and stored in the query handle. The row of data
currently stored in the query handle is called the current row.
The fetch and seek directives are provided by w3-msql to
allow you to use other data rows as the current row. Another
term used in association with the current row is the position of the
data cursor. The data cursor is a logical pointer that indicates
which row of the result table is the current row. The seek
directive can be used to move the location of the data cursor and hence,
change the current row.
The example above uses the SELECT SQL keyword. It should be noted
however that any SQL query, including INSERT, UPDATE and DELETE can be
used within the query text submitted via the query directive.
Naturally, if anything other than SELECT is used, there will be no
returned data available to the page. Use of query operators other than
SELECT allows you to write HTML pages that actually modify the contents
of the database. A simple example of this is to insert the contents of
an HTML form into the database.
<! msql free QueryHandle>
- Frees the QueryHandle and any data associated with the query. For
example :-
- <! msql free q1 >
<! msql print "format" >
- Print the contents of variables from the current row of a query handle,
the environment or from data passed to the page from a GET or
POST (such as from a form). The format string is similar to a
printf() format string in that
escape characters such as \n and \t are understood.
The contents of variables are accessed by embedding the
variables within the format string (like Perl, ESL, or Shell scripts)
rather than by using references to variables such as %s etc. in C.
The order of priority for variables is internal
w3-msql variables followed by environment
variables. That is, when a variable is accessed, w3-msql first
looks for the variable in the w3-msql symbol table and if it
can't find it, it then looks for an
enviornment variable by that name. The first variable it finds
that matches the name specified is used.
To simplify the processing of forms (and to enable data to be
passed between pages) W3-mSQL loads all data passed to it in
the URL into it's symbol table. If you have a form entry such
as < INPUT NAME="user" > then when you click the submit button,
your browser will generate a URL like the following
- http://Your.Machine/Path/To/File.html?user=bambi
The ?user=bambi on the end of the URL reflects the name and
contents of your form fields. W3-mSQL will see these values and
load them into the symbol table so you can access them as
variables in your page. If you referenced the variable $user in
this example it would evaluate to bambi.
As the example above indicates, variables are referenced using a
$ sign. This is the case for internal variables and environment
variables. Accessing the contents of the current row from a
query handle uses a difference format. Firstly, you have to
indicate which query handle contains the information and secondly you
have to indicate which field from the current row you want.
The format used is
- @Handle . FieldOffset
That is, you use a @ for database variables (not the $ sign used
for internal and environment variables), followed by the name of
the query
handle, followed by a '.', followed by the numerical index of
the desired field in the row. Fields are number from left to
right starting at 0. To illustrate this further, if the
following query :-
- <! msql query "select name,age from people" result>
was submitted, @result.0 would correspond to the name field and @result.1
would correspond to the age field. You can reference any number of
fields and other variables in a single format string. For example
- < ! msql print "Hello @result.0, your path is $PATH" >
<! msql print_rows QueryHandle "format" >
- The print_rows directive allows the entire contents of a Query Handle to
be processed in one operation. The format specified is applied to each
row of the remaining result data from the Query Handle, that is, all
data from the position of the data cursor to the end of the
result data is extracted and formatted. If the data cursor has been
moved from the first row of data by using either fetch or
seek directives, only the remaining data will be displayed.
Naturally, the seek directive can be used to return the data
cursor to the initial row of the result data before calling the
print_rows directive.
This facility can be used to easily create lists, tables and select
menus from the contents of a query. An example of each is given
below :-
Table Creation
-
<! msql query "select name, address from staff" result>
<TABLE>
<TH>Name <TH> Address <TR>
<! msql print_rows result "<TD> @result.0 <TD> @result.1 <TR>"
</TABLE>
List Creation
-
<! msql query "select name, address from staff" result>
<UL>
<! msql print_rows result "<LI> @result.0 \n"
</UL>
Select Menu Creation
-
<! msql query "select name, address from staff" result>
<SELECT NAME=menu>
<! msql print_rows result "<OPTION> @result.0 \n"
</SELECT>
<! msql if ( condition ) >
<! msql else >
<! msql fi >
- w3-msql provides an if-then-else construct for conditional inclusion
of sections of an HTML page. If the condition evaluates to TRUE, the
segment of the page between the IF and the ELSE or
FI is processed. This may be normal HTML text or further w3-msql
definitions. To enable complex pages to be created, w3-msql supports
IF clauses nested to any level.
The structure of the condition statement is based on the syntax used by
conditions in C. It supports the usual comparison operator, == != <
<= > >= , as well as the C logical operators && and ||.
Parenthesis may be using within the condition to group sections of the
expression to control the evaluation. Parenthesis can be nested to any
level. For example
- < ! msql if ( ($age < 50) && (($name == "fred") || ($name ==
"joe))) >
The IF directive will try to interpret the data and variables
within the condition in the manner you intend. For example, if you
provided a condition such as
- < ! msql if ( $age == 50 ) >
w3-msql would cast the value of $age to an integer value if possible
because all w3-msql variables are text variables. If the variable in
question does not contain a numeric string, the condition will abort and
an appropriate error will be displayed. It should be noted that only
the == and != operator may be used to compare string values. < <=
> and >= can only be used on numeric values. Naturally, == and !=
can be used on numeric data too.
<! msql fetch QueryHandle>
- Fetches the next row of data from the query handle and updates the
current row and the data cursor.
example :-
- <! msql fetch q1 >
<! msql seek QueryHandle Position>
- Moves the data cursor for the specified query handle to the given
position. Position 0 is the first row in the result data. If the value
of position is negative, it will be replaced by 0. If the position is
beyond the end of the table, the data cursor will be left
pointing at the end of the table. The currnet row is replaced by
the row of data located at the specified position. For example, to move
to the 12th row of data returned in the query handle q1, you would call
- <! msql seek q1 12>
|