K-kielisessä ohjelmassa voi olla kommentteja, jotka ovat seuraavia muotoja:
/* kommentti */ voi esiintyä missä tahansa // kommentti rivin loppu kommenttia -- kommentti rivin loppu kommenttiaKommenteilla ei ole mitään merkitystä ohjelman toiminnalle.
Jatkossa esimerkeissä on käytetty -- merkintää.
Muuttujien nimet koostuvat dollarimerkistä ($), jota seuraa yksi tai useampi kirjaimia, numeroita ja alleviivauksia. Isot ja pienet kirjaimet merkitsevät samaa merkkiä. Muuttujia ei tarvitse erikseen esitellä, vaan muuttuja saa tyyppinsä ja arvonsa sijoitettavan arvon perusteella.
Esim:
$mja = 1; -- kokonaisluku $MJA = 1; -- kokonaisluku = $mja $mja = 1.012; -- reaaliluku $mja = "KALLE"; -- merkkijono
Sijoitutettava arvo voi olla muuttuja, vakio, monimutkaisempi aritmeettinen lauseke, Boolen lauseke, sql-lauseke tai select-lauseke.
Syntaksi: $mja = lauseke $mja1, $mja2, ... = lauseke Toiminta: muuttujille annetaan lausekkeen arvo
Esim: $mja = 1; -- kokonaisluku $Mja = 1; -- kokonaisluku =mja=MJA=Mja $mja = 1.012; -- reaaliluku $mja = 1+2+(4-2)/($c*2-1); -- aritmeettinen lauseke $mja = "KALLE"; -- merkkijono $nimi = "K-KIELI"; -- merkkijono $a=(3<4); -- vertailu $a,$b,$c = null; -- alustetaan tyhjeellä kaikki a,b,cSijoitettava lauseke voi olla myös null, joka tarkoittaa tyhjää merkkijonoa. Tyhjää merkkijonoa ei voi kirjoittaa muodossa "".Select- ja SQL-lauseke käsitellään erikseen kohdassa SQL-lausekkeet, jossa käsitellään myös tilannetta, jossa sijoitusmerkin vasemmalla puolella on useampi kuin yksi muuttuja.
Syntaksi: lauseke1 operaatio lauseke2Palautusarvo: aritmeettisen operaation tulos
Aritmeettisia operaatioita ovat: + yhteenlasku - vähennyslasku * kertolasku / jakolasku % jakojäännös
Lisäksi aritmeettisissa lausekkeissa voidaan käyttää sulkuja ().
Esim: $a = 1+2-4.5*100/3; $a = (1+2-4.5*100)/3; $a = -2.34; $j = 100 % 21;
Syntaksi: lauseke1 operaattori lauseke2Palautusarvo: 1 jos tosi, 0 jos epätosi
Boolen operaattoreita ovat: < pienempi kuin <= pienempi tai yhtäsuuri kuin > suurempi kuin >= suurempi tai yhtäsuuri kuin = yhtäsuuri <> erisuuri ja ja tai tai
$a= 3<4; -- a:n arvoksi 1 $a= (4<$b) ja (6>=$c); -- a:n arvoksi 1 jos molemmat ehdot -- tosia
Syntaksi: jos lauseke niin lauseet muuten lauseetPalautusarvo: -
Toiminta: jos lausekkeen arvo on tosi, suoritetaan niin- lauseet, muussa tapauksessa muuten-lauseet
Esimerkkejä ehtolauseista:
jos $a=1 niin $b=2; -- jos a:n arvo on 1, niin $b:lle arvo 2 muuten $b=3; -- muuten $b:lle arvo 3jos $a=1 niin << -- jos a=1 niin $b=2; -- b:lle arvo 2 ja $c=4; -- c:lle arvo 4 >> muuten $b=3;
jos $a=1 niin << $b=2; $c=4; >> muuten << $b=3; $c=5; >>
jos $a=1 niin << $b=2; jos $d=100 niin $b=99; $c=4; >> muuten << $b=3; jos $d=100 niin $b=98; $c=5; >>
Syntaksi: jokaiselle lauseet seuraavaPalautusarvo: -
Syntaksi: toisto_alkaa lauseet toisto_loppuu
Palautusarvo: -
Syntaksi: toisto_loppu
Palautusarvo: -
Rajoitus: jokaisella - seuraava rakenne voi sisältää vain yhden select-lauseen. Sisäkkäisesti voi olla vaikka miten monta jokaisella-seuraava rakennetta ja niissä kussakin oma select-lause. Tämä rajoitus johtuu siitä, että kullekin tasolle voi kiinnittää vain yhden avoimen tiwtokannan kursorin.
Sanojen "jokaiselle" ja "seuraava" välissä olevia lauseita suoritetaan toistuvasti kunnes joko suoritetaan lause toisto_loppu tai sellainen select-lauseke, joka ei palauta enää tietoja (tai palauttaa virheen). Tällöin ns. toisto asetetaan päältä pois, mutta kaikki loput lauseet ko. toisto rakenteessa suoritetaan. Jos haluaa, ettei suoriteta, tulee ko. toisto_loppu asetus olla viimeinen suoritettava lause. Tämän jälkeen jatketaan sanaa "seuraava" seuraavasta lauseesta.
Esim: Haetaan tietoja toistuvasti kannasta niin kauan kuin tietoja riittää.
$lkm = 1; jokaiselle -- haetaan taulusta Henkilo seuraava 20-vuotias $nimi,$ika = select Nimi,Ika from Henkilo where Ika=20 endsql; -- seuraavaa ei tehdä, jos tietoja ei enää löydy $lkm=$lkm+1; seuraava; -- tulostetaan montako löytyi tulosta "Löytyi:",$lkm," henkilöä ^J"; -- muuttujassa $nimi ja $ika ovat viimeisen onnistuneen select:n -- palauttamat arvotEsim: Toistetaan lauseita 10 kertaa:
$lkm = 1; jokaiselle $lkm=$lkm+1; jos $lkm>=10 niin toisto_loppu; --jatketaan tulostuksesta muuten << $a = $a+$lkm; $c=$c+1; >> seuraava; tulosta a$; $lkm = 1; toisto_alkaa $lkm=$lkm+1; jos $lkm>=10 niin toisto_loppu; --jatketaan tulostuksesta muuten << $a = $a+$lkm; $c=$c+1; >> toisto_loppuu; tulosta a$;
Syntaksi: select merkkijono endsql;Palautusarvo: pyydettyjen sarakkeiden arvot
Select-lauseke on muotoa select select-lause endsql;. Lause noudattaa SQL:n select-lauseen syntaksia lukuunottamatta lopussa olevaa varattua sanaa endsql. Lause annetaan SQL:lle suoritettavaksi sellaisenaan kuitenkin siten, että ensin muuttujat korvataan niiden arvoilla ja funktio sql_date käsitellään.
Funktio sql_date on muotoa sql_date('pp.kk.vvvv'), missä päivämäärän on oltava muodossa pp.kk.vvvv. Sql_date voi olla muotoa sql_date('vvvvkkpp'), missä päivämäärän on oltava muodossa vvvvkkpp.
Järjestelmä muuttaa päivämäärän SQL:n vaatimaan esitysmuotoon.
Jos select palauttaa useamman sarakkeen arvon kuin mitä sijoitettavia muuttujia on, hylätään ylimääräiset arvot. Jos arvoja taas on vähemmän kuin muuttujia, sijoitetaan ylimääräisiin muuttujiin tyhjä merkkijono (null).
Jos select-lauseke esiintyy toistolauseessa ja tietoja ei enää löydy, niin toisto päättyy eikä muuttujien arvoihin kosketa. Jos select-lauseke esiintyy toistolauseen ulkopuolella ja tietoja ei löydy lainkaan, niin muuttujien arvoihin sijoitetaan null.
Esim: Haetaan taulusta Henkilo ensimmäinen rivi, jossa Ika on 20 ja palautetaan C-kieliselle ohjelmalle sarakkeiden HenkNro, HenkNim ja Ika arvot. $nro,$nimi,$ika = select HenkNro,HenkNim,Ika from Henkilo where Ika = 20 endsql; palauta $nro,$nimi,$ika;
Esim: Haetaan taulusta Henkilo kaikki rivit, joissa Ika on 20 ja palautetaan C-kieliselle ohjelmalle sarakkeiden HenkNro, HenkNim ja Ika arvot. $vaatimus=20; jokaiselle $nro,$nimi,$ika = select HenkNro,HenkNim,Ika from Henkilo where Ika = $vaatimus endsql; -- palautetaan arvot C-kieleen -- tätä palautusriviä ei tehdä, jos tietoja ei enää ole palauta $nro,$ika,$nimi; seuraava; -- muuttujissa viimeisen rivin tiedot
Esim: Haetaan taulusta Henkilo kaikki rivit, joissa SyntAik on 28.2.1961 ja palautetaan C-kieliselle ohjelmalle sarakkeiden HenkNro, HenkNim ja Ika arvot. $vaatimus="28.02.1961"; --$vaatimus="19610228"; -- olisi myös kelvollinen pvm:n esitystapa jokaiselle $nro,$nimi,$ika = select HenkNro,HenkNim,Ika from Henkilo where SyntAik = sql_date('$vaatimus') endsql; palauta $nro,$ika,$nimi; seuraava;
Huom: Katso myös yhteys-funktiot (3.8.4).
Syntaksi: sql merkkijono endsql;Palautusarvo: suoritettujen sql-rivien lukumäärä
Sql-lauseke on muotoa sql sql-lause endsql;. SQL-lause on mikä tahansa sql-lause paitsi select (kts. 3.8.1 Select-lauseke). Lause annetaan SQL:lle suoritettavaksi sellaisenaan kuitenkin siten, että ensin muuttujat korvataan niiden arvoilla ja funktio sql_date käsitellään.
Funktio sql_date on muotoa sql_date('pp.kk.vvvv'), missä päivämäärän on oltava muodossa pp.kk.vvvv. Järjestelmä muuttaa päivämäärän SQL:n vaatimaan esitysmuotoon.
SQL-lauseke palauttaa niiden rivien lukumäärän, jolle sql-lause on suoritettu.
Esim: Suoritetaan commit:$lkm = sql commit endsql;
Esim: Suoritetaan päivitys:
$lkm=sql UPDATE Henkilo SET SyntAik=sql_date('01.01.1960') WHERE HenkNro=2 endsql; tulosta "Update:", $lkm,"^J"; -- päivitettyjen lukumäärä
Huom: Katso myös yhteys-funktiot (3.8.4).
Syntaksi: sql_date(lauseke)Palautusarvo: Merkkijono, joka esittää merkkijonon lauseke halutussa sql:n muodossa
Funktio sql_date on muotoa sql_date("pp.kk.vvvv"), missä päivämäärän on oltava muodossa pp.kk.vvvv. Sql_date voi olla muotoa sql_date("vvvvkkpp"), missä päivämäärän on oltava muodossa vvvvkkpp.
Järjestelmä muuttaa päivämäärän SQL:n vaatimaan esitysmuotoon.
Esim. $a = sql_date("20.12.1993"); $a = sql_date("19931220"); -- palauttaa muuttujan a arvoksi ORACLE:ssa -- to_date('19931220','yyyymmdd') -- palauttaa muuttujan a arvoksi INGRES:ssä -- date('19931220')
Syntaksi: yhteys_avaa(lauseke) yhteys_vaihda(lauseke) yhteys_sulje(lauseke)Palautusarvo: Palauttaa 0, jos funktion suoritus epäonnistui.
Ns. pääyhteys kantaan täytyy avata ennen K:n suoritusta ja asettaa käyttäjätunnukset kantaan funktiolla K_set_user. Katso kappale 5. Pääyhteyden id on 1.
Ko. funktioilla voidaan tehostaa SQL-kantojen käyttöä, koska voidaan avata useampi yhteys kantoihin. Esim. toinen yhteys lukee kantaa ja toinen yhteys päivittää kantaa.
Esim. $paivitys=2; -- yhteys kaksi päivitystä varten -- pääyhteys on 1 $ok=yhteys_avaa($paivitys); jos $ok = 0 niin << -- ei onnistu ??? keskeytä; >> $ok=yhteys_vaihda(1); jokaiselle $nro = select nro from henkilo endsql; jos $nro>0 niin << $ok=yhteys_vaihda($paivitys); $ok=sql insert into loytyi values('$nro') endsql; $ok=yhteys_vaihda(1); >> seuraava; $ok=yhteys_sulje($paivitys); lopeta;
SQL-komentoja voi jäljittää erikseen. Sitä varten K-kielessä on kaksi muuttujaa $sql_debug ja $sql_debug_file. Asettamalla $sql_debug="K", niin kaikki suoritettavat sql-lauseet kirjoitetaan muuttujan $sql_debug_file arvon mukaiseen tiedostoon. Oletus on /tmp/ksql.dbg
Esim. $sql_debug="K"; $sql_debug_file="/tmp/1.sql"; $arvo=select .... endsql; $sql_debug="E";
Syntaksi: lauseke1 :: lauseke2Palautusarvo: Merkkijono, jossa lauseke1 ja lauseke2 yhdessä
Kaksi merkkijonoa liitetään yhteen operaattorilla ::.
Esim: $c=100; $a="tänään on " :: $pp :: "." :: $kk :: "." :: $vu :: " päivä"; $a="123" :: "456" :: (1+2*$c); -- 123456201 -- Huom: 1+2*100 = 201
Syntaksi: osajono(lauseke,lauseke1,lauseke2)
Palautusarvo: lausekkeen osajono alkaen merkistä lauseke1 ja mukaan otetaan lauseke2 verran merkkejä. Jos ei löydy merkkejä haluttua määrää, niin vastaus on sen verran sitten lyhyempi ja jos esim. merkkijono on vain 4 merkkiä pitkä ja yritetään ottaa osajono alkaen vaikka 7:stä merkistä, niin palautus arvo on tyhjämerkkijono eli null.
Alkuindeksi alkaa 1:stä.
Esim: Otetaan merkkijonosta alken 4:stä merkistä 5 merkkiä:$b=osajono("123456789",4,5); -- b=45678
Syntaksi: pituus(lauseke)Palautusarvo: lausekkeen tuloksen pituus merkkeinä
Esim: $pit = pituus("123456789"); -- palauttaa arvon 9
Syntaksi: muoto(lauseke,esitysmuoto)Esitysmuodossa voi olla myös vakio-osia.Palautusarvo: lausekkeen arvo esitysmuodon mukaisessa muodossa
Esitysmuoto esitetään kuten C-kielessä printf-funktion esitysmuoto. Esitysmuodon rakenne:
TUNNISTE TASAUS LEVEYS TYYPPI
TUNNISTE on aina %-merkki
TASAUS - vasempaan reunaan tasattu ja + oikeaan reunaan tasattu, oletusarvona aina tasattu oikeaan reunaan. Tasaus-merkki voi puuttua.
LEVEYS montako merkkiä pitkäksi lavennetaan tuloste. oletusarvoisesti täytetään etutyhjeillä. Kts. edellä TASAUS. Reaaliluvuilla leveys annetaan kahtena lukuna pisteellä erotettuna. Ensimmäinen luku määrittelee leveyden ja toinen luku desimaalien lukumäärän. Leveyden määritys voi puuttua, jolloin muotoillaan sellaisenaan eli ei tapahdu muutosta.
TYYPPI Määrittelee muotoiltavan arvon tyypin: f reaaliluku ld kokonaisluku s merkkijono
Esim: $a = muoto("123.3333","%10.1f"); -- 10 mittaisena, 1 desimaali $a = muoto("123.3333","%d"); -- kokonaislukuna, tasaus oik. $a = muoto("123.3333","%10f"); -- 10 mittaisena, tasaus oik. $a = muoto("123.3333","%-10f"); -- 10 mittaisena, tasattu -- vasempaan laitaan $a = muoto("KALLE","%-s MATTINEN"); -- KALLE MATTINEN $a = muoto("KALLE","%+30s MATTINEN"); -- KALLE MATTINEN, oik.30
Syntaksi: merkki(lauseke)Palautusarvo: lausekkeen arvo ASCII merkkinä.
Esim. laitetaan merkkijonoon tyhje eli ascii 32 desimaalilukuna: $a = "ALKU" :: merkki(32) :: "LOPPU" ; -- tuloksena merkkijono ALKU LOPPU erotettuna tyhjeellä
Syntaksi: etsi(etsittava,jono)Palautusarvo: palauttaa 0, jos etsittävää merkkijonoa ei löydy jonosta. Jos löytyy, palauttaa indeksin eli kohdan merkkijonosta, josta etsittävä merkkijono alkaa. Indeksointi alkaa ykkösestä.
Esim: Onko merkkijono "456" merkkijonossa "1234567890"
$paikka=etsi("456","123456789"); -- paikan arvo on 4, josta kohden löytyy merkkijono 456
Syntaksi: etsi_ja_korvaa(uusiarvo,etsittava,jono)Palautusarvo: palauttaa jonon siten, että etsittava merkkijono on korvattu jonolla uusiarvo. Jos ei ole, palauttaa jonon arvon muuttumattomana.
Korvaa merkkijonosta jokaisen merkkijonon etsittava arvon merkkijonolla uusiaarvo.
Esim: Korvataan merkkijono "BCD" merkkijonolla "_bcd_".
$jono="Merkkijono ABCDE ja ABCDE "; $jono=etsi_ja_korvaa("_bcd_","BCD",$jono); -- jonon uusi arvo on -- Merkkijono A_bcd_E ja A_bcd_E
Syntaksi: $arvo = kentta(merkkijono_lauseke,kenttanumero,erotin)Palautusarvo: lausekkeen arvo ASCII merkkinä. Toiminto: palautetaan merkkijonosta kenttänumeron osoittaman kentän arvon. Kenttäerotin voi olla mikä tahansa merkki.
Esim: Olkoon merkkijonon $jono arvona "123,AAA,BBB,CCCC".
$k1 = kentta($jono,1,","); -- kenttä 1, erotin on pilkku -- $k1 = 123 $k2 = kentta($jono,2,","); -- kenttä 2 -- $k2 = AAA $k5 = kentta($jono,5,","); -- kenttä 5 -- $k5 = null !!!
Syntaksi: $arvo = ymp_muuttuja(lauseke)Palautusarvo: lausekkeen arvo ASCII merkkinä. Toiminto: Palautetaan käyttöjärjestelmän ympäristömuuttuja. Funktion parametrinä oleva lauseke on luettavan ympäristömuuttujan nimi ILMAN $-merkkiä.
Esim: $kotihakemisto = ymp_muuttuja("HOME");
Syntaksi: $arvo = luejono(lauseke)Palautusarvo: käyttäjän antama merkkijono. Toiminto: Luetaan käyttäjältä syöte kysymyksellä lauseke.
Esim: $kuka_olet = luejono("Kuka olet:");
Syntaksi: pvm_muutos(lauseke,muoto1, muoto2)Palautusarvo: lauseke, joka esitysmuotoa muoto1, muutettuna esitysmuotoon muoto2
Esitysmuotoja ovat:
pp.kk.vvvv pp.kk.vv vvvvkkpp vvkkpp sql (käytettävän tietokantajärjestelmän käyttämä muoto, K-kieli tuntee eri tietokantajärjestelmienn käyttämät sisäiset esitysmuodot eli nk. dbo-muodot)Esim: Muutetaan pvm sql:n vaatimaan muotoon:
$sqlpvm = pvm_muutos("20.03.1992","pp.kk.vvvv","sql");
Syntaksi: pvm_ero(lauseke1, lauseke2) -lausekkeiden 1 ja 2 oltava esitysmuodossa vvvvkkppPalautusarvo: palauttaa päivämäärien lauseke1 ja lauseke2 erotuksen
Esim: $ero = pvm_ero("19920610","19920601"); -- ero on 9 päivää
Syntaksi: pvm_kasvatus(lauseke,lauseke2)Toiminto: päivämäärälausekkeeseen lisätään lauseke2 verran päiviä. Lauseke oltava muotoa vvvvkkpp. Lauseke2 oltava kokonaisluku.
Palautusarvo: uusi päivämäärä muodossa vvvvkkpp
Esim: Kasvatetaan pvm kahdella ja pienennetään kahdella:
$uusi = pvm_kasvatus("19920530",2); -- 19920601 $uusi = pvm_kasvatus("19920530",-2); -- 19920528
Syntaksi: tanaanPalautusarvo: nykyinen pvm esitysmuodossa vvvvkkpp
Esim: $pvm = tanaan;
Syntaksi: kloPalautusarvo: kellonaika esitysmuodossa hhmmss
Esim: $klo_nyt = klo;
Syntaksi: palauta lauseke tai palauta lauseke,lauseke,...Toiminto: Palauttaa C-kieleen lausekkeiden arvon (itse asiassa laittaa arvot erityiseen palautuslistaan). Palautusarvo: -
Lause ei päätä K-kielisen ohjelman toimintaa. Ohjelma voi sisältää useita palauta-lauseita ja lisäksi lause voidaan suorittaa toiston sisällä useasti.
Esim: palauta $a; palauta $a,"CPU JA"::" KaTi,(100*$c); palauta pvm_muutos(tanaan,"vvvvkkpp",pp.kk.vv);Luvussa 6 kuvataan miten palautettavat arvot saadaan talteen C-kielisen ohjelman puolella.
Syntaksi: tulosta lauseke ruudulle lauseke tai tulosta lauseke,lauseke,... ruudulle lauseke,lauseke,...Toiminto: tulostaa lausekkeiden arvot . Kontrollimerkit (ascii 1-32) voidaan tulostaa laittamalla ^ merkki ennen vastaavaa kontrollikirjainta.Esim. ctrl-j (ascii 10) tulostetaan merkkijonona ^J. Merkki ^ voidaan tulostaa laittamalla kaksi ^-merkkiä peräkkäin.
Kun tulostustiedosto on "ruutu" (Kts. 3.12.2), joka on tulostuksen oletusarvo, suoritetaan automaattisesti puskurin tyhjennys aina tulosta-lauseen jälkeen. Tällöin on mahdollista tulostaa vaikka yksi merkki, joka tulee heti näyttöön (ei tarvita rivinvaihtoa tehdä). Toisin sanoen tulostusta ei puskuroida.
Ruudulle funktio tulostaa aina tulostiedostoon "ruutu", jolloin tulosta funktio voi kirjoittaa yhtä aikaa muuhun tiedostoon.
Käyttämällä kontrollimerkkejä, saadaan aikaiseksi tehokkaita tulosteita esim. massa-ajoissa.
Erikoismerkkejä: ^H kohdistin yksi vasemmalle ^M kohdistin rivin alkuun ^J rivin vaihto Palautusarvo: -
Esim: tulosta $a; tulosta $a,"CPU JA"::" KaTi,(100*$c); tulosta "MERKKIJONO ^J"; -- merkkijono ja rivinvaihto
Syntaksi: tulostustiedosto(tiednimi)Toiminto: Asettaa tulosta-lauseketta varten tulostuksen kohteen. Oletusarvoisesti kohde on "ruutu" eli ns. stdoutput, mutta se voidaan muuttaa joksikin tiedostoksi, johon käyttäjällä on oikeus kirjoittaa. Jos tiedoston nimeksi annetaan "ruutu", niin silloin tulosta-lauseke tulostaa käyttäjän näytölle (stdoutput). Jos tiedosto on jo olemassa, kirjoitetaan sen perään tuhoamatta entistä sisältöä.
Palautusarvo: palauttaa 0, jos ei onnistu tiedoston avaus.
Huom: Kun on asetettu tulostustiedosto, on se auki, kunnes lopetetaan K:ta kutsuvan ohjelman suoritus tai asetetaan tulostustiedostoksi "ruutu".
Esim: tulosta $a; -- tulostaa näyttöön (oletusarvo) $ok=tulostustiedosto("/tmp/puppu.tmp"); -- tulostetaan ko. tiedoston /tmp/puppu.tmp perään tulosta $a,"CPU JA"::" KaTi,(100*$c); tulosta "MERKKIJONO ^J"; -- merkkijono ja rivinvaihto -- $ok=tulostustiedosto("ruutu"); tulosta "LOPPU"; -- tulostui taas näyttöön
Syntaksi: versioPalautusarvo: K-kielen versionumero merkkijonona
Esim: $versionr = versio;
Syntaksi: crc(maski,nrojono)Palautusarvo: nrojono:lle tarkistusluku
Esim: $tarkmerkki = crc("731","5555"); /* viite */ Esim: $tarkmerkki = crc("21","5555"); /* korttinumero, tilinumero */
Syntaksi: keskeyta
Toiminto: lopetetaan K-ohjelman suoritus kesken
Palautusarvo: -
Syntaksi: lopeta
Toiminto: lauseella merkitaan K-kielisen ohjelman loppu, lauseen suorittaminen aiheuttaa K-kielisen ohjelman suorittamisen päättymisen
Palautusarvo: -
C-kielinen ohjelma välittää parametreja K-kieliselle ohjelmalle muuttujissa, joita käsitellään kuten mitä tahansa muuttujia. C-kielinen ohjelma määrää sen, minkä nimisissä muuttujissa parametrit välitetään.
Esim: K-kielinen ohjelma saa parametrina henkilönumeron muuttujassa $HenkNro ja palauttaa C-kieleen henkilön nimen, joka löytyy Henkilo-taulusta:$nimi = select Nimi from Henkilo where HenkNro = $HenkNro endsql;
jos $nimi <> null niin << palauta 'OK', $nimi keskeyta; >> palauta 'VIRHE'; lopeta;
Parametrien käsittelyä C-kielisessä ohjelmassa käsitellään luvussa 6.
Syntaksi: systeemikomento(lauseke)Toiminto: Suoritetaan käyttöjärjestelmän systeemikomento, joka annetaan funktiolle lausekkeena.
Palautusarvo: palauttaa systeemikomennon palautusarvon numeerisena.
Esim: $lopetus_koodi = systeemikomento("ls -l");
Syntaksi: tiedostoon(tiednimi,lauseke)Toiminto: Kirjoitetaan tiedoston tiednimi loppuun lauseke. Tiedostoa ei tarvitse avata ja sulkea erikseen. Tiedosto avataan aina perään kirjoitukselle ja suljetaan kirjoituksen jälkeen.
Palautusarvo: palauttaa 0, jos ei onnistu kirjoitus.
Esim: $lopetus_koodi = tiedostoon("malli.txt",$txt);
Syntaksi: tiedostosta(tiednimi)Toiminto: Lukee tiedostosta tiednimi yhden rivin. Tiedostoa ei tarvitse erikseen avata vaan ensimmäisellä luku kerralla avataan tiedosto automaattisesti ja kun tiedoston loppu saavutetaan, niin suljetaan myös automaattisesti. Tiedosto tarvitsee erikseen sulkea vain, jos luku keskeytetään. Kts. kohta 3.20.
Palautusarvo: palauttaa luetun merkkijonon tai EOF merkkijonon, jos tiedoston luku ei onnistu tai tiedosto loppui.
Syntaksi: sulje_tiedosto(tiednimi)Toiminto: Sulkee tiedoston tiednimi.
Palautusarvo: palauttaa 0, jos sulkeminen ei onnistunut.
Esim: $ok=sulje_tiedosto("xxxx.txt");
Syntaksi: aliohjelma(tiednimi)Toiminto: Suoritetaan tiedostossa tiednimi oleva K-kielinen ohjelma.
Palautusarvo: palauttaa 0, jos ei onnistu suoritus.
Esim: $lopetus_koodi = aliohjelma("malli.k");
Symbolitaulu on kaikille K-ohjelmille yhteinen eli parametrien välitys on mahdollista muuttujien avulla.
K-kielessä on listatietorakenne, jonne voi kirjoittaa, lukea, muuttaa, poistaa ja etsiä tietoja. Listaan voidaan tieto lukea myös tiedostosta. Lista on joukko tietorivejä, joissa useita sarakkeita. Sarakkeiden ja rivien määrää ei ole rajoitettu. Ainoana rajoittavana tekijänä on koneen keskumuisti, sillä koko lista on muistissa. K:n listat ovat siis dynaamisia moniulotteisia taulukoita.
HA listan rakenne
sarake1/kenttä1 sarake2/kenttä2 .... +--------------------+--------------------+-----------+---------+ rivi 1 ! ! ! ! ! +--------------------+--------------------+-----------+---------+ rivi 2 ! ! ! ! ! +--------------------+--------------------+-----------+---------+ ... ! ! ! ! ! +--------------------+--------------------+-----------+---------+ rivi n ! ! ! ! ! +--------------------+--------------------+-----------+---------+
Syntaksi: lista_luo(nimi, sarakkeiden lukumäärä)Toiminto: Lista pitää luoda ennenkuin sitä voidaan käyttää.
Palautusarvo: palauttaa 0, jos ei onnistu listan luonti. Syynä joko, että lista on jo olemassa tai muisti loppunut.
Esim: $ok = luo_lista("HENK",3); -- henkilöillä 3 kenttää
Syntaksi: lista_lue(nimi, tiedostonimi, sarakkeiden lukumäärä, kenttäerotin)Toiminto: Luetaan lista tiedostosta. Tiedostossa erottimena kenttäerotin. Tiedostosta luetaan sarakkeiden lukumäärän verran sarakkeita. Lista pitää olla luotuna ennen lukua.
Palautusarvo: palauttaa aina <> 0.
Esim: $ok = luo_lista("HENK",3); -- henkilöillä 3 kenttää
-- luetaan tiedostosta henk.txt 2 saraketta, kun -- sarakkeet erotettu pilkuilla $ok = lista_lue("HENK","henk.txt",2,",");
Syntaksi: lista_selaa(nimi, suunta )Toiminto: Muutetaan listan käsittelykohtaa. Suunta voi olla ens haetaan listan ensimmäinen rivi viim haetaan listan viimeinen rivi edell haetaan listan edellinen rivi seur haetaan listan seuraava rivi
Palautusarvo: Palauttaa 0, jos ko. toimintoa ei voi tehdä (listan loppu saavutettu ko. suuntaan selattaessa.
Esim: Listan läpikäynti.
-- haetaan ensimmäinen $ok = lista_selaa("HENK",ens); jokaiselle jos $ok <> 0 niin << -- listassa on jotain tulosta lista_kentta_lue("OMA",1),"^J"; -- haetaan seuraava $ok = lista_selaa("HENK",seur); >> muuten toisto_loppu; seuraava;
Syntaksi: lista_etsi(nimi, etsittävä_arvo, sarake )Toiminto: Etsitään listasta sarakkeesta sarake arvolla etsittävä_arvo.
Palautusarvo: Palauttaa 0, jos ko. sarakkeesta ei löydy ko. etsittävällä arvolla.
Esim: -- etsitään sarakkeesta yksi, arvoa Jussi $ok = lista_etsi("HENK","Jussi",1); jos $ok<>0 niin tulosta "oli se";
Syntaksi: lista_rivi_uusi(nimi)Toiminto: Lisätään yksi rivi listaan nykyisen rivin jälkeen.
Palautusarvo: Palauttaa aina <> 0.
Esim: $ok= lista_rivi_uusi("HENK");
Syntaksi: lista_rivi_pois(nimi , poistettava)Toiminto: Poistetaan listasta joko nykyinen rivi tai kaikki rivit.
Palautusarvo: Palauttaa aina <> 0.
Esim: -- poistetaan ens. rivi $ok= lista_selaa("HENK",ens); $ok= lista_rivi_pois("HENK",nykyinen); -- poistetaan kaikki rivit $ok= lista_rivi_pois("HENK",kaikki);
Syntaksi: lista_kentta_lue(nimi , kenttänumero)Toiminto: Luetaan listan nykyisen rivin n:s kenttä.
Palautusarvo: Palauttaa aina kentän arvon, jos kenttä puuttuu, niin palauttaa null:n.
Esim: $nro = lista_kentta_lue("HENK",1); $nimi= lista_kentta_lue("HENK",2);
Syntaksi: lista_kentta_aseta(nimi , kenttänumero, arvo)Toiminto: Muutetaan listan nykyisen rivin n:s kenttä.
Palautusarvo: Palauttaa aina <> 0.
Esim: $nimi="CPU"; $nro =1002; $ok= lista_kentta_aseta("HENK",1,"1002"); $ok= lista_kentta_aseta("HENK",2,"Nimi"); $ok= lista_kentta_aseta("HENK",1,$nro); $ok= lista_kentta_aseta("HENK",2,$nimi);
CGI-liittymä on menetelmä, jolla WEB-palveluiden sivuille luodaan dynaamisia sivuja. Koska K-kielessä on jo systeemikutsu, ympäristömuuttujat, niin CGI-suodattimena 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/oracleEsim. 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ä 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
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ää sulkuihin merkeillä ( ).
<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.
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.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;
--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
--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> <br>
- laskuri awot - 1 eli näytetään käänteisenä - 6 mittaisena numerosarjana, täyttö etunollilla
--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 "</PRE>"; -- luodaan loppusivu HTML $ok=aliohjelma("htmlend.k"); lopeta;