5. Sąsajos

Įsivaizduokite situaciją, kada jūs turite labai daug duomenų, saugomų formate, kurio nesupranta standartinės Web naršyklės. Ir jums reikia šią informaciją kaip nors atvaizduoti Web tinkle, bei leisti vartotojui atlikti paiešką. Kaip įvykdyti tokią užduotį?

Tokios problemos gali būti išspręstos naudojant CGI programas, kurios veikia kaip sąsajos tarp duomenų ir Web'o. Tam, kad geriau suprastumę sąsajų veikimo mechanizmą, smulkiau panagrinėsime vieną pavyzdį.  

 

UNIX'o instrukcijų dokumentų sąsaja

Instrukcijų dokumentai (manual pages) operacinėje sistemoje UNIX teikia informaciją apie įvairias programinės įrangos ir pagalbines programas, instaliuotas toje sistemoje. Mes panagrinėsime pavyzdį, kuriame nuskaitomas pareikalautas instrukcijos dokumentas, konvertuojamas į HTML formatą bei atvaizduojamas vartotojui. Instrukcijų dokumentų formatavimui naudosime standartinę pagalbinę programą nroff. Visą veiksmų seką būtų galima pailiustruoti paveikslėliu pav 5.1:

Pav 5.1  Instrukcijų dokumento konvertavimas į HTML

Pagrindinė problema, į kurią reiktų atkreipti dėmesį, yra gaunamų duomenų analizė bei išvedamų duomenų generavimas. Tai ir sudaro sąsajų esmę.

Beveik visose UNIX sistemose instrukcijų dokumentai yra suskirstyti į aštuonias arba daugiau grupės (subkatalogus), patalpintas vienoje pagrindinėje direktorijoje - dažniausiai /usr/local/man arba /usr/man. Nagrinėjamo pavyzdžio forma užklausia tokios grupės numerį bei norimo instrukcijų dokumneto pavadinimą.

Toliau darbą atlieka CGI programa. Ji susideda iš instrukcijų dokumento grupės (subkatalogo), bei pačio instrukcijų dokumento suradimo, šio dokumento formatavimo nroff  pagalba, bei konvertavimo į HTML formatą.

Tipiškas nesuformatuotas instrukcijų dokumentas atrodo maždaug taip:

.TH EMACS 1 "1994 aPRIL 19"
.UC 4
.SH NAME
emacs \- GNU project Emacs
.SH SYNOPSIS
.B emacs
[
.I command-line switches
] [
.I files ...
]
.br
.SH DESCRIPTION
.I GNU Emacs
is a version of
.I Emacs,
written by the author of the original (PDP-10)
.I emacs,
richard Stallman.
.br
.
.
.

Suformatuotas nroff pagalba jis atrodo taip:

EMACS(1)          USER COMMANDS           EMACS(1)
NAME
        emacs - GNU project Emacs
SYNOPSIS
        emacs [command-line switches] [files ...]
DESCRIPTION
        GNU Emacs is a version of Emacs, written by the author 
        of the original (PDP-10) Emacs, Richard Stallman.
.
.
.
Sun Release 4.1 Last change: 1994 April 19

$last_line = "Last change:";

Kintamojo $last_line reikšmė sutampa su tekstu, kuris yra paskutinėje kiekvieno instrukcijų dokumento eilutėje. Šis kintamasis naudojamas išmesti tai eilutei dokumento formatavimo metu.

&parse_form_data (*FORM);

($manpage = $FORM{'manpage'}) =~ s/^\s*(.*)\b\s*$/$1/;
$section = $FORM{'section'};

Formos duomenys iššifruojami ir patalpinami kintamuosiuose $manpage (instrukcijų dokumento pavadinimas) ir $section (instrukcijų dokumento grupė).

if ( (!$manpage) || ($manpage !~ /^[\w\+\-]+$/) ) {
	&return_error (500, "UNIX Manual Page Gateway Error",
			    "Invalid manual page specification.");

Šis programos blokas labai svarbus. Jeigu instrukcijų dokumentas nenurodytas arba jo pavadinime yra simbolių nepriklausančių aibei (A-Z, a-z, 0-9, _, +, -), gražinama klaida. Pašalinių simbolių tikrinimas susijęs su saugumo klausimu.

} else {
	if ($section !~ /^\d+$/) {
		$section = &find_section ();
	} else {
		$section = &check_section ();
	}

Jei $section kintamasis lygus skaičiui, kviečiama procedūra check_section, kuri nustato reikiamą instrukcijos dokumento grupę. Priešingu atveju (pvz. "Nežinau") kviečiama procedūra find_section. Ji tikrina visas grupes ieškodama reikiamos.

if ( ($section >= 1) && ($section <= 8) ) {
		&display_manpage ();
	} else {
		&return_error (500, "UNIX Manual Page Gateway Error",
				    "Could not find the requested document.");
	}
}
exit (0);

Jeigu vykdant procedūras find_section ir check_sectio įvyko klaida, jos gražina '0', kuris patalpinamas kintamajame section. Jeigu viskas gerai, kviečiama procedūra display_manpage, kuri atvaizduoja instrukcijų dokumentą.