3.23 CGI-liittym{
CGI-liittym{ on menetelm{, jonka WEB-palveluiden sivuille
voidaan mm. luoda dynaamisia sivuja. Koska K-kieless{ on jo
systeemikutsu, ymp{rist|muuttujat, niin CGI-palvelijana
K-kieli on n{pp{r{, kun t{h{n lis{t{{n viel{ SQL-palvelut.
Kun k{ytet{{n SQL-kantoja, vaativat ne yleens{ joidenkin
ymp{rist|muuttujien olemassaoloa. HTTP-palvelimessa suoritettaessa
CGI-ohjelmaa, ei k{ytt|j{rjestelm{n ymp{rist|muuttujat n{y.
T{m{n takia on K-kieleen rakennettu konfigurointi tiedosto, joka
luetaan ja sen perusteella asetetaan tarvittavat ymp{rist|muuttujat
ja kannan k{ytt{j{tunnukset.
M{{ritys tulee tehd{ tiedostoon nimelt{ kcgi.def hakemistoon
$DOCUMENT_ROOT (kts. HTTP-palvelijan m{{rittelyist{).
Ko. tiedostoon m{{rittelykirjoitetaan seuraavaan tapaan:
HOME=/u/home/visitor
ORACLE_SID=kdb
ORACLE_HOME=/opt/local/db/oracle
Esim. kora.cgi vaatii edell{ mainitut m{{ritykset. $HOME hakemistossa
tulee olla .hevitmp -tiedosto, jossa on k{ytt{j{tunnukset kantaan
Kati:n m{{ritysten mukaisesti.
3.23.1 CGI-parametrien luku listaan CGI_lue( muuttuja_lista, ymparisto_lista )
Syntaksi: CGI_lue(muuttuja_lista, ymparisto_lista)
Toiminto: Luetaan listaan muuttuja_lista, joko POST metodissa
CONTENT_FILE:st{ (=yleens{ stdin) tai GET metodissa
QUERY_STRING:st{ CGI muuttujat ja arvot. Jos listaa
ei ole olemassa, CGI_lue luo sen itse. Listassa
tulee olla v{hint{{n kaksi saraketta eli muuttujan
nimi sarakkeessa 1 ja muuttujan arvo sarakkeessa 2.
Ymparisto_lista listaan luetaan http:n mukaiset
ymp{rist|muuttujat. Jos ko. listan nimeksi annetaan
tyhj{merkkijono, niin silloin listaa ei tehd{.
Palautusarvo: palauttaa aina <> 0, jos oli yksikin muuttuja.
Esim:
-- luetaan listaan WEBLST muuttujat ja listaan
-- ENVLST http-ymp{rist|muuttujat
$ok = CGI_lue("WEBLST","ENVLST");
-- t{m{n j{lkeen listassa k{ytett{viss{
-- kaikki listank{sittely toiminnot
3.23.2 CGI-dokumenttijonojen k{sittely CGI_kuva( kuvahakemisto,
MIME-tyyppi, MIME-alityyppi, erotinjono, esitystyyppi,jonon/kuvan nimi,
toistokerrat, odotusaika)
Syntaksi: CGI_kuva( kuvahakemisto, MIME-tyyppi, MIME-alityyppi,
erotinjono, esitystyyppi, jonon/kuvan nimi,
toistokerrat, odotusaika)
Toiminto: T{ll{ toiminnolla voidaan HTML-sivulle liitt{{
yksitt{inen dokumentti (HTML, GIF-kuva, ....)
tai muodostaa dokumenttisarja. Yhdess{ sarjassa
voi olla vain yhden tyypin mukaisia dokumentteja.
T{m{ mahdollistaa t{ll|in my|s animaatioiden teon.
Samalla HTML-sivulla voi toimia yht{aikaa useita
animaatioita.
Kuvahakemisto - hakemisto, jossa kuvat sijaitsevat,
voi olla suhteellinen tai
absoluuttinen hakemisto viittaus
suhteessa HTTP:n juureen.
MIME-tyyppi - esim. image tai text, oltava
m{{ritelty selaajassa.
MIME-alityyppi - esim. gif tai html ..., oltava
m{{ritelty selaajassa.
erotinjono - esim. GIFSeperator, t{m{
merkkijono tulee dokumenttien
v{liin. (Boundary).
esitystyyppi - joko file tai queue. Jos
n{ytet{{n yksitt{inen
dokumentti, niin file, mutta
jos n{ytet{{n dokumenttisarja,
niin queue. Katso seuraava parametri.
jonon/dokumentin nimi
- jos esitystyyppi on queue, niin
silloin t{m{ tiedosto on dokumentti-
jonon kuvaajatiedoston nimi tai
jos esitystyyppi on file, niin
dokumentin nimi. Tiedosto on
sijaittava hakemistossa kuvahakemisto.
toistokerrat - monestiko jono/dokumentti toistetaan.
Jos arvo < 0, niin k{ytet{{n jono-
tapauksessa ko. jonon kuvaus
tiedostossa olevaa toistom{{r{{.
Jos arvo = 0, niin toistetaan
niin kauan kuin sivu on olemassa.
Jos > 0, niin toistetaan ko. m{{r{.
Jos tiedosto, niin yleens{ 1.
odotusaika - montako sekuntia odotetaan
jonossa ennen seuraavan n{ytt{mist{.
Voi olla 0, jolloin k{ytet{{n
jonotiedostossa olevia kuvakohtaisia
arvoja. T{ll{ ohjataan animaatioita.
Palautusarvo Ei merkityst{.
Jonotiedoston muoto:
Odotustapa;Odotusaika;dokumenttitiedosto;
Odotustapa;Odotusaika;dokumenttitiedosto;
...
repeat;Toistojen m{{r{;;; <- voi puuttua
* <- kommenntirivi voi olla
Odotustapa S on sleep, jolloin odotusaika on sekuntteja.
Osotustapa W on wait, jolloin odotusaika on huomattavasti lyhyempi,
mutta kuormittaa HTTP-palvelijaa enemm{n.
Esimerkki:
CGI_kuva("/show","image","gif","GIFSeperator","queue",
"esitys.shw",0,0);
- k{ynnistet{{n hakemistosta DOCUMENT_ROOT/show
dokumenttijono tiedostosta esitys.shw. Esitys
koostuu image/gig tyyppisist{ kuvista ja
kuvien v{liss{ on --GIFSeperator erotin rivi.
Esitys py|rii "ikuisesti" ja k{ytet{{n jono-tiedostossa
olevia aikaviiveit{.
Jonotiedosto esitys.shw:
* esitys.shw, Jukka Inkeri, Awot, 010496
S;0;ok.gif; - ei odoteta ennen kuvaa yht{{n
S;20;kuva1.gif; - odotetaan 20 sekunttia ennen t{t{ kuvaa
W;10;kuva2.gif; - odotetaan 10 wait-yksikk|{, eli v{h{n
W;10;kuva3.gif; - odotetaan 10 wait-yksikk|{, eli v{h{n
W;10;kuva4.gif; - odotetaan 10 wait-yksikk|{, eli v{h{n
repeat;10;; - ei merkityst{, koska kutsussa pyydetty
"ikuisesti"
Esimerkiksi kasc.cgi ja kora.cgi k{ytt{v{t kimage.k K-ohjelmaa
kuivien esitykseen. Kutsu HTML-sivulla muotoa: (huomaa, ett{
erottimena parametrien v{lill{ / -merkki ja jos halutaan, ett{
parametriss{ on mukana / -merkkej{, tulee parametri kehyst{{ heitto-
merkeill{ ( '-merkki).
<IMG SRC="/'/show'/image/gif/GIFSeperator/queue/esitys.shw/0/0">
Huom: Kuvat skaalataan ensimm{isen kuvan koon mukaisesti. Jos
k{ytet{{n HEIGHT ja WIDTH m{{rityksi{, niin silloin ko.
m{{ritysten mukaisesti skaalataan kuvat.
3.23.3 Numerosarjan n{ytt| bittikuvana CGI_laskuri( arvo, kaanteinen, pituus)
Syntaksi: CGI_laskuri( arvo, kaanteinen, pituus )
Toiminto: Muuttaa kokonaisluku arvon X-bitmap kuvaksi.
Jos kaanteinen on tosi eli <> 0, niin luku
tulee mustalla pohjalla, muuten taustav{rin
mukaisesti. Pituus muuttujalla voidaan
m{{ritelkl{ n{yt|n leveys merkkein{. Jos
arvossa v{hemm{n merkkej{, niin t{ytet{{n
etunollilla. Jos pituus on 0, niin n{yt|ss{
vain arvossa olevien merkkien verran merkkej{.
Palautusarvo: ei merkityst{ palautusarvolla.
Esim:
-- n{ytet{{n arvo k{{nteisen{ videolla kymmenell{
-- numerolla
CGI_laskuri(arvo, 1 , 10);
3.24 CGI-ohjelmaesimerkkej{
3.24.1 CGI-muuttujien listaus
--listataan CGI FORM muuttujat
$ok=CGI_lue("WEBLST","ENVLST");
$ok= lista_selaa("WEBLST",ens);
jokaiselle
jos $ok <> 0 niin
<< -- listassa on jotain
tulosta lista_kentta_lue("WEBLST",1);
tulosta lista_kentta_lue("WEBLST",2);
tulosta "^J";
-- haetaan seuraava
$ok = lista_selaa("WEBLST",seur);
>>
muuten toisto_loppu;
seuraava;
3.24.2 CGI-kuvaesitys (animaatio)
--kimage.k
-- Karjalan ATK-Awot Oy, Jukka Inkeri, 30.1.96
-- k{sitellaan image-kuvia
$ok=CGI_lue("WEBLST","ENVLST");
-- katsotaan dokumenttien juuri-hakemisto, jossa kuvat ovat jossakin
-- hakemistossa
$ok=lista_etsi("ENVLST","DOCUMENT_ROOT",1);
$polku=lista_kentta_lue("ENVLST",2);
$kokopolku=$polku :: "/" :: $PARA1;
$ok=CGI_kuva($kokopolku,$PARA2,$PARA3,$PARA4,$PARA5,$PARA6,
$PARA7,$PARA8);
lopeta;
Esimerkkin{ kimage.k :n k{ytt| HTML-sivulla:
<IMG SRC="/cgi-bin/kasc.cgi/kimage.k/'/show'/image/gif/GIFSeperator/queue/katso.shw/0/1">
- kimage.k, kuvat hakemistossa /show (suhteessa DOCUMENT_ROOT)
- MIME-tyyppi image
- MIME-subtype gif
- boundary on GIFSeperator
- queue = esitysjono
- katso.shw esitys l|ytyy tiedostosta /show/katso.shw
- 0 = suoritetaan ikuisesti
- 1 = aikaviive kuvien v{lill{, jos sit{ ei olisi ko. jono tiedostossa
- jos tyyppi olisi queue:n sijaan file, niin sitten n{ytett{isiin
vain yksitt{inen kuva
3.24.3 CGI-laskuri
--kcounter.k
-- Karjalan ATK-Awot Oy, Jukka Inkeri, 9.2.96
-- laskurin naytto HTML-sivulle image/x-bitmap muodossa
--
-- PARA1 laskurin nimi esim awot1
-- PARA2 0 = ei k{{nteinen 1 = k{{nteinen
-- PARA3 numeron{yt|n pituus merkkein{, 0=luvun mukaan
$laskurihak="cnt"; -- hakemisto, jossa laskurit
-- haetaan CGI ymp{rist|muuttujat
$ok=CGI_lue("WEBLST","ENVLST");
-- katsotaan miss{ laskurit
$ok=lista_etsi("ENVLST","DOCUMENT_ROOT",1);
$polku=lista_kentta_lue("ENVLST",2);
-- laskuritiedosto
$kokopolku=$polku :: "/" :: $laskurihak :: "/" :: $PARA1;
--luetaan ko. laskuri
$arvo=tiedostosta($kokopolku);
jos $arvo = "EOF" niin $arvo=0; -- puuttui, aloitetaan 0:sta
--kasvatetaan laskuria
$arvo=$arvo+1;
$arvo=muoto($arvo,"%.0f") ; -- ei desimaaleja
--poistetaan ent.arvo
$syscmd="/bin/rm -f " :: $kokopolku;
$ok=systeemikomento($syscmd);
--talteen uusi arvo
$ok=tiedostoon($kokopolku,muoto($arvo,"%.0f") :: "^J");
$ok=sulje_tiedosto($kokopolku);
--tuotetaan bittikuva laskurin arvosta
$ok=CGI_laskuri($arvo,$PARA2,$PARA3);
lopeta;
Ko. esimerkki n{ytt{{ laskurin nimelt{ $PARA1 arvon. Laskuri
sijaitsee tiedostossa $DOCUMENT_ROOT/cnt/$PARA1.
K{ytt|esimerkki HTML-sivulla:
K{vij|iden m{{r{ 1.1.1996 j{lkeen t{ll{ sivulla
<IMG SRC="/cgi-bin/kasc.cgi/kcounter.k/awot/1/6>
- laskuri awot
- 1 eli n{ytet{{n k{{nteisen{
- 6 mittaisena numerosarjana, t{ytt| etunollilla
3.24.4 CGI-tietokannasta haku
--db_ex.k
-- Karjalan ATK-Awot Oy, Jukka Inkeri, 30.1.96
-- Esimerkki Oracle/Ingres-kannasta hausta
-- Form-lomakkeessa pyydetty k{ytt{j{lt{ postinumeroa
-- alustetaan HTML-sivu
$HtmlHead="Kanta testi";
$ok=aliohjelma("htmlbeg.k");
-- luetaan parametrit
$ok=CGI_lue("WEBLST","ENVLST");
$ok=lista_etsi("WEBLST","teksti",1); -- kent{ss{ teksti postinumero
jos $ok = 0 niin
<<
tulosta "Ei ole^J^M";
$ok=aliohjelma("htmlend.k");
keskeyta;
>>
$ppnro=lista_kentta_lue("WEBLST",2); -- postinumero
$ok=aliohjelma("htmlend.k");
jokaiselle
$pnro,$tnimi,$lnimi=select kotpostnro, taydnim, lyhnim from
henkilo where kotpostnro = $ppnro endsql;
jos $pnro <> null niin <<
tulosta $pnro,$lnimi,$tnimi,"^J^M";
>>
seuraava;
tulosta "";
-- luodaan loppusivu HTML
$ok=aliohjelma("htmlend.k");
lopeta;