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. 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.
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 |