Luis Colorado Über den Autor: Luis Colorado ist als Administrator von UNIX Systemen und Internetzugängen bei der spanischen Telefónica Sistemas S.A. tätig. Er machte seinen Abschluß in Physik an der Universidad Complutense of Madrid und entwickelte eine Anzahl von frei verfügbaren UNIX Werzeugen. M@il an den Autor Inhalt: Einführung Motivation M4 Funktionsweise Übertragung der Informationen vom Benutzer an das CGI Download |
Zusammenfassung:
Vorgestellt wird ein
Programm, das den Zugriff auf eine Datenbank von HTML Seiten aus erlaubt.
Als Ziele bei der Entwicklung von PG2CGI standen Kontrolle über
den Datenzugriff, eine flexible Konfigurierung und die Unabhängigkeit
von Layoutformaten im Vordergrund. Das Programm resultierte aus Ideen,
die mir während des Lesens diverser Artikel über M4 kamen (Artikel
der letzten 12 Monate in
Linux Journal
und LinuxFocus).
M4 wurde ursprünglich entwickelt, um CGI (Common
Gateway Interface) mit PostgreSQL Datenbanken zu verbinden. Bald jedoch
stellte sich heraus, daß M4 allgemein ausreichend war, sodaß
es für andere Schnittstellen neben CGI eingesetzt werden konnte (z.B.
als Gateway zwischen einem LDAP Server und anderen Datenbanken wie
Informix und Oracle).
Später wurde die Schnittstelle standarisiert, wobei die notwendige Funktionalität mit aufgenommen wurde, und das PostgreSQL Modul wurde für die neue Schnittstelle umgeschrieben. Nun ist es möglich, neue Treiber zu entwickeln, die es ermöglichen, das Programm in Verbindung mit anderen Datenbank zu benutzen. |
|
FIELD=valueAußerdem muß query_string diesem Format genügen, weitere Informationen sollten nicht in diesem String enthalten sein.
QUERY_STRING: "^FIELD=[^&]*$";Die obige Zeile gewährleistet, daß dies Regel nur angewendet wird, wenn QUERY_STRING die entsprechende Syntax aufweist. Desweiteren erlaubt das Programm, den entsprechenden Wert zu analysieren, falls dieser im obigen Ausdruck geklammert wird.
QUERY_STRING: "^FIELD=([^&]*)$";Während dieses Prozesses transformiert das Programm ebenfalls die Escape Sequenzen der Form %xx, die durch den Navigator eingeführt werden.
QUERY_STRING: "^FIELD=([^&]*)$";
! HTTP_ADDRESS: "^194\.142\.12\.";(Hier würde die Regel ungültig, falls die Anfrage von 194.142.12.xxx käme)
[ QUERY_STRING: "USER=([^&]*)" ];Dieser Term ermöglicht es, einen Wert für den User zu übergeben, falls der Client dies unterstützt. Jedoch wird die Regel nicht ungültig, falls der Client diesen nicht spezifiziert. Mit diesen Mechanismen wird es nun möglich, Regeln aufzustellen. Dazu wird eine Anzahl von Termen zu einem regulären Ausdruck angeordnet, der eine gültige linke Regelseite spezifiziert.. Die Terme stehen zwischen einem Paar geschweifter Klammern "{}".
QUERY_STRING: "NAME=([^&]*)"; QUERY_STRING: "FAMNAME1=([^&]*)"; QUERY_STRING: "FAMNAME2=([^&]*)";das Ergebnis wäre dann:
term_0_match_0 <- "NAME=JOSE"; term_0_match_1 <- "JOSE"; term_1_match_0 <- "FAMNAME1=DE LA FUENTE"; (man beachte, daß "+" Zeichen durch Leerzeichen " " ersetzen worden sind) term_1_match_1 <- "DE LA FUENTE"; term_2_match_0 <- "FAMNAME2=LOPEZ"; term_2_match_1 <- "LOPEZ";
{ PATH_INFO: "^/avisos/?$"; # Regel wird mittels PATH_INFO ausgewählt [SERVER_ADMIN: ".*"]; # Optionale Informationen in SERVER_ADMIN. } -> { DRIVER: "POSTGRESQL"; PGTTY: "/dev/console"; # Logs werden an die Konsole geschickt PGDATABASE: "postgres"; # Es wird eine Anfrage gestellt (dabei wird die oid immer mit übergeben. # Sie wird intern benutzt, um den jeweiligen Datensatz # mittels der Vorlage darzustellen). PGQUERY: "select oid,ct,titulo,texto,mt" " from avisos" " where (dt is NULL or dt > 'now')" " order by mt desc"; # Datei, die die Vorlage enthält M4FILE: "/usr/local/etc/httpd/plantillas_m4/avisos.m4"; WEBMASTER: "term_1_match_0"; #TESTMODE: "TRUE"; } # Die folgende Regel ermöglicht die Wahl einer Ankündigung (aviso) # mit einer bekannten OID (Primärschlüssel). Die Information ist in der # Variable PATH_INFO des CGI enthalten. { PATH_INFO: "^/avisos/([0-9]+)/?$"; SERVER_ADMIN: ".*"; } -> { DRIVER: "POSTGRESQL"; PGTTY: "/dev/console"; # as before, write logs to the console PGDATABASE: "postgres"; OID: "term_0_match_1"; # assign an OID # Auch hier ist die Auswahl wichtig. Die OID des Feldes wird am Anfang # mit übergeben, für den Fall, daß ein Verweis fuer das Löschen dieses # Eintrages gesetzt werden sollte. PGQUERY: "select oid,ct,titulo,texto,mt,dt,autor" " from avisos" " where (dt is NULL or dt > 'now') and oid=OID"; # Hier wird nun eine andere Vorlage benutzt. M4FILE: "/usr/local/etc/httpd/plantillas_m4/avisos_oid.m4"; WEBMASTER: "term_1_match_0"; #TESTMODE: "TRUE"; } |
define(<<<for>>>, <<<dnl
ifelse(eval((<<<$2>>>) <= (<<<$3>>>)), 1, <<<define(<<<$1>>>,<<<$2>>>)$4<<<>>>dnl for(<<<$1>>>,eval(<<<$2>>>+1),<<<$3>>>, <<<$4>>>)dnl >>>)dnl >>>)dnl divert(0)dnl Mime-Version: 1.0 Content-type: text/html <HTML>
<!-- la tabla est\xe1 vac\xeda
-->
>>>,<<<dnl /* PGRES_NTUPLES != 0 )( */
for(<<<i>>>,0,eval(PGRES_NTUPLES-1),<<<dnl
</table>
>>>)dnl /* PGRES_NTUPLES */ >>>,<<<dnl /* ifelse PGRES_RESULTSTATUS )(*/ Error en el resultado: <B>PGRES_RESULTSTATUS</b><BR>
>>>)dnl <CENTER><HR WIDTH=100></center>
|
divert(-1)
$Id: generic_list.m4,v 1.1 1998/07/06 17:13:33 luis Exp $ define(<<<cell>>>, <<<PGRES_CELL_$1_$2>>>) define(<<<field>>>, <<<PGRES_FNAME_$1>>>) define(<<<for>>>, <<<dnl ifelse(eval((<<<$2>>>) <= (<<<$3>>>)), 1, <<<define(<<<$1>>>,<<<$2>>>)$4<<<>>>dnl for(<<<$1>>>,eval(<<<$2>>>+1),<<<$3>>>, <<<$4>>>)dnl >>>)dnl >>>)dnl divert(0)dnl Mime-Version: 1.0 Content-type: text/html <HTML>
ifelse(PGRES_RESULTSTATUS, <<<PGRES_TUPLES_OK>>>,<<<dnl
<!-- la tabla est\xe1 vac\xeda
-->
>>>,<<<dnl /* PGRES_NTUPLES != 0 )( */
>>>)dnl /* PGRES_NTUPLES */ >>>,<<<dnl /* ifelse PGRES_RESULTSTATUS )(*/ Error en el resultado: <B>PGRES_RESULTSTATUS</b><BR>
>>>)dnl <CENTER><HR WIDTH=100></center>
|
Webpages maintained
by Miguel Ángel Sepúlveda
© Luis Colorado 1998 LinuxFocus 1999 |