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;