gateway WWW - Oraperl

ts (decoux@moulon.inra.fr)
Thu, 22 Jul 93 09:42:18 +0200


URL of this document is http://moulon.inra.fr/oracle/www_oraperl_eng.html
URL de la version francaise est http://moulon.inra.fr/oracle/www_oraperl.html

Gateway WWW - Oraperl for Plexus 2.2
====================================

Characteristics
+++++++++++++++

o only the condition of the WHERE clause is required in the search text
o links to other queries can be made.
o multiple styles (glossaries, lists, plaintext, ...)
o queries to multiple databases are possible.
o only the server knows the access details for the database (database name,
username, password).
o no modifications for the clients, only the server is upgraded.
o URL of the document must begin by "/oracle".

Syntax
++++++

o With each document (suffix ".html") is associated a file with suffix ".sql".
This file defines the format of the output to be returned. The file contains
HTML text with possible keywords :
o <unesc> condition of the WHERE clause (HTUnEscape)
o <esc> encoded condition (HTEscape)
o tag <sql "file"> where "file" is the pathname of an oraperl script.

The macros <unesc> and <esc> are replaced by the search text entered by the
user in escaped (URL) or unescaped (as typed) form.

o the oraperl script can define:
o "format STDOUT = ..." this format is used to display the returned
values. Columns of the SELECT clause, are specified by variable
"@column" (or "$column[0], $column[1], ...)
o "format STDOUT_TOP = ..." (optionnal)
o "$statement" : this variable define the SELECT clause. It can have
one, or many, keywords "<unesc>", each used for the condition of the
WHERE clause.
o "$database" : database name (default 'A')
o "$username" : oracle username (default "SCOTT")
o "$password" : password (default "TIGER")
o "$maxselect" : maximum number of returned row (default 40).
o it must have the following line :

require "server/oracle_search.pl";

Example of syntax
+++++++++++++++++

* file "projet.sql"

<h1>Projets associes a <UNESC></h1><ul>
<sql oracle/A/projet_sql.pl>
</ul><p><h2>Caracteristiques associees</h2>
<h3><a href="http://moulon.inra.fr:80/oracle/A/biblio.sql?<esc>">
Bibliographie</a></h3>
<h3><a href="http://moulon.inra.fr:80/oracle/A/carte.sql?<esc>">
Carte</a></h3>
<h3><a href="http://moulon.inra.fr:80/oracle/A/dispositif.sql?<esc>">
Dispositif</a></h3>
<h2><a href="http://moulon.inra.fr:80/oracle/A/projet.lis?<esc>">
Liste </a>des reponses</h2>

* script oracle/A/projet_sql.pl

#! /usr/local/bin/oraperl
format STDOUT =
<li><a href='@<<<<<<<<<<<<<<<'> projet = @<<<<<<<<<<<<<<<<<<<<<<<<<<
$column[0], $column[1]
type = @<<<<<<<<<<<<<<<<<<<<<< responsable = @<<<<<<<<<<<<<<<<<<<<<<<
$column[2], $column[3]
</a>
.
$statement = 'select rowid,projet,type,responsable from projets where <unesc>';
require "server/oracle_search.pl";
1;

Source
++++++

* oracle.pl :

#! /usr/local/bin/perl

sub do_oracle {
local($_, $query, $version) = @_;
local($keyword) = (undef);
do { &retrieve($_); return; } unless $query;
$keyword = $query;
if(($keyword =~ m#%#) && ($keyword !~ m#\+#)) {
$keyword =~ s/%(\d+)/pack(c,hex($1))/eg;
} else {
$keyword =~ s/\+/ /g;
$keyword =~ s/%(\d+)/pack(c,hex($1))/eg if $version;
}

s/\.html$/\.sql/;
-e $_ || &error('not_found', "document \`\`$_\'\' does not exist");
open(file,$_);
&main'MIME_header('ok', 'text/html');
print '<head><title>', $keyword,'</title><isindex></head><body>',"\n";
while(<file>) {
if(($Avant,$script,$Apres) = ( m#(.*)<sql\s+(.*)\s*>(.*)#)) {
print $Avant;
$SIG{CHLD} = '';
system "/usr/local/bin/oraperl $script \"$keyword\"";
if($? != 0) {
print "</BODY>";
close(file);
$SIG{CHLD} = "reaper";
return 1;
}
$SIG{CHLD} = "reaper";
print $Apres;
next;
}
s/<esc>/$query/gio;
s/<unesc>/$keyword/gio;
print ;
}
close(file);
print "</BODY>\n";
1;
}

1;

* oracle_search.pl :

#! /usr/local/bin/oraperl
$statement = ($statement)?$statement:'select * from emp';
$database = ($database)?$database:'A';
$user = ($user)?$user:'scott';
$password = ($password)?$password:'tiger';
$maxselect = ($maxselect)?$maxselect:40;
$statement =~ s/<unesc>/@ARGV/gio;
#
$lda = &ora_login($database,$user,$password) || &oracle_erreur($ora_errstr);
$csr = &ora_open($lda,$statement) || &oracle_erreur($ora_errstr);
while (($maxselect--) && (@column = &ora_fetch($csr))) { write; }
warn $ora_errstr if $ora_errno;
&oracle_erreur("fetch error: $ora_errstr") if $ora_errno;
do ora_close($csr) || &oracle_erreur("can't close cursor");
do ora_logoff($lda) || &oracle_erreur("can't log off Oracle");

sub oracle_erreur {
print "Oracle Server Error :",@_,"<p>",$statement;
exit 3;
}
1;

Installation
++++++++++++

* Copy file "oracle.pl", "oracle_search.pl" in "$http_sdir".

* Change line 24 of "oracle.pl", to adapt to your local installation of "oraperl":

24 system "/usr/local/bin/oraperl $script \"$keyword\"";
^^^^^^^^^^^^^^^^^^^^^^
change it !!!

* Add in "plexus.conf" :

$map{'oracle'}='require "$http_sdir/oracle.pl";&do_oracle($_,$query,$version)';

BUGS
++++

* I'm a beginner in perl : probably many bugs.

Guy Decoux