Bandicoot a webové aplikácie

Július Chrobák 30. 6. 2011

Bandicoot je nový programovací systém založený na relačnom modeli. Cieľom tohto článku je implementácia ukážkovej webovej aplikácie s použitím Bandicootu a JavaScriptu. Nasledujúce odstavce popisujú, ako vytvoriť jednoduchú aplikáciu. Na perzistenciu a kalkulácie s dátami je použitý Bandicoot.

JavaScript je použitý na vytvorenie používateľského rozhrania, ktoré pomocou objektu XMLHttpRequest volá jednotlivé funkcie v Bandicoote. Program slúži ako príklad na popísanie funkcií systému Bandicoot a nadväzuje na ukážky z predchádzajúceho diela článku, ktorý sa venoval základný prvkom jazyka, t.j. relačným typom a premenným.

Aplikačné rozhranie

Bandicoot disponuje vlastným relačným programovacím jazykom a behovým prostredím. Jedným z prvkov jazyka sú funkcie, ktoré sú automaticky dostupné cez protokol HTTP 1.1 buď cez metódu GET alebo POST v závislosti na vstupných parametroch funkcie. Bandicoot vykonáva všetky funkcie v transakciách a poskytuje konzistentný pohľad na globálne premenné. Stručný popis, ako fungujú transakcie, je dostupný na blog stránke projektu. Nasledujúci diagram znázorňuje situáciu, keď dve klientské aplikácie spúšťajú funkcie X a Y súčasne:

Ako parametre do funkcií, tak aj ich návratové hodnoty sú relácie vo formáte CSV. Prvý riadok definuje atribúty a zvyšné riadky obsahujú jednotlivé záznamy v relácií, napríklad:

autor:string,cena:real,pocetStran:int,rok:int,titul:string
David A. Vise,375.9,363,2007,Google Story
Pavel Satrapa,248.5,253,1994,Začínáme v Pascalu 

Ako spustiť Bandicoot

Pre účely tohto článku sú dostupné balíky pre rôzne operačné systémy (Linux 64bit, MacOS 64bit, Windows 32bit) obsahujúce Bandicoot aj ukážkový program zároveň. Po stiahnutí a rozbalení je okamžite k dispozícii spustiteľný súbor bandicoot, zdrojový kód ukážkového programu knihy.b a HTML súbor knihy.html.

Po spustení príkazu ./bandicoot sa zobrazia požadované vstupné argumenty. Bandicoot podporuje dva rôzne režimy spustenia: standalone a distributed. Pre účely tohto článku je dostačujúca verzia standalone, ktorá pre spustenie vyžaduje príkaz start a štyri vstupné argumenty:

  • p – port pre HTTP server
  • c – program napísaný v jazyku Bandicoot
  • d – adresár pre perzistenciu globálnych premenných
  • s – súbor, kam sa ukladajú kontrolné informácie o posledných verziách globálnych premenných

Pre spustenie ukážkovej aplikácie sú potrebné len dva kroky: (1) vytvoriť adresár na ukladanie dát a (2) spustiť Bandicoot s požadovanými parametrami:

$ mkdir volume/
$ ./bandicoot start -p 12345 -d volume/ -s volume/.state -c knihy.b 

V tomto momente už beží Bandicoot s programom knihy.b a po otvorení súboru knihy.html v internetovom prehliadači je možné začať pracovať s aplikáciou.

knihy.b

Súbor knihy.b definuje dátové typy, premenné a funkcie, ktoré slúžia na manipuláciu či kalkulácie s dátami. Tento súbor je načítaný pri štarte systému, ktorý si vytvorí potrebné interné štruktúry a sprístupní funkcie cez server HTTP. V úvode ukážkového programu je definovaný dátový typ, globálna premenná a jednoduchá funkcia:

 1 rel Kniha {
 2     titul: string,
 3     autor: string,
 4     rok: int,
 5     pocetStran: int,
 6     pocetSlov: int,
 7 }
 8
 9 knihy: Kniha;
10
11 fn Knihy(): Kniha
12 {
13     return knihy;
14 } 

Globálne premenné sú automaticky uložené na disk do adresára určeného argumentom -d pri spustení Bandicootu. Vo funkciách je možné používať aj lokálne premenné a vstupný argument. Všetky premenné sú reláciami a v každom kroku je zaručené odstránenie akýchkoľvek duplicitných záznamov. Telo funkcie sa skladá z výrazov zložených z relačných operátorov a operácie priradenia.

23 fn Pridat(k: Kniha): Kniha
24 {
25     duplicitne := k * knihy project(titul);
26     knihy += k - duplicitne;
27
28     return duplicitne;
29 } 

Účelom tejto funkcie je pridať nové knihy. Vstupný parameter k reprezentuje množinu nových kníh. Funkcia zároveň definuje aj výstupný parameter. Ten obsahuje duplicitné knihy, ktoré už sú v systéme uložené. Záznamy sa v tomto prípade porovnávajú cez atribút titul pomocou operácie join (riadok 25).

Bandicoot umožňuje definovať aj funkcie, ktoré nepracujú s globálnymi premennými. Tie umožňujú používanie relačnej algebry pre dáta, ktoré nie sú ukladané na disk. Program s takýmito funkciami môže byť integrovaný do existujúcich systémov (napríklad ako jednoduchý program pre manipuláciu a kalkuláciu údajov z log súborov vo formáte CSV). V ukážkovom programe existuje funkcia na počítanie štatistík o knihách, ktoré sú poskytnuté ako vstupný argument. Je zrejmé, že v tomto prípade spĺňa funkcia ilustratívny charakter:

36 fn StatistikaKnih(k: Kniha): rel {pocetKnih: int, pocetStran: int}
37 {
38     return k summary(pocetKnih = cnt(),
39                      pocetStran = add(pocetStran, 0));
40 } 

knihy.html

Súbor knihy.html implementuje jednoduché používateľské rozhranie v jazyku JavaScript. Okrem štandardných operácií na vypísanie, pridávanie, zmenu, a vymazávanie kníh poskytuje aj sumárne informácie o vybraných knihách. Pre zjednodušenie komunikácie s Bandicootom sú implementované pomocné objekty Rel, Head a funkcia call, ktoré sú dostupné aj ako samostatný JavaScript súbor.

Komunikácia medzi prehliadačom a Bandicootom prebieha pomocou objektu XMLHttpRequest. Nasledujúca funkcia call má definované tri vstupné argumenty, narába s objektom XMLHttpRequest, a zároveň vracia dáta na výstupe ako objekt Rel:

89 /* funkcia na zavolanie funkcie implementovanej v Bandicoote */
90 function call(type, service, data) {
91     var req = new XMLHttpRequest();
92     req.open(type, "http://localhost:12345/" + service, false);
93     if (data !== undefined)
94         req.send(data);
95     else
96         req.send(null);
97
98     if (req.status != 200)
99         throw "status: " + req.status;
100
101     if (req.responseText != "")
102         return new Rel(req.responseText);
103     else
104         return null;
105 } 

Vstupné argumenty môžu nadobúdať nasledovné hodnoty:

  • type – „GET“ alebo „POST“
  • service – meno funkcie, ktorá sa má vykonať
  • data – dáta vo formáte CSV (len v prípade ak ide o požiadavok POST)

Nasledujúca funkcia add pridáva novú knihu do systému volaním funkcie Pridat, implementovanej v súbore knihy.b:

177 /* jednoduché pridanie jednej knihy */
178 function add() {
179     var csv =
180         "titul:string,autor:string,rok:int,pocetStran:int,cena:real\n" +
181         $("title").value + "," +
182         $("author").value + "," +
183         $("year").value + "," +
184         $("pages").value + "," +
185         $("price").value + "\n";
186
187     // zavolanie metódy Pridat
188     var res = call("POST", "Pridat", csv);
189     if (res.count() == 1)
190         alert("Kniha " + $("title").value + " už existuje");
191     else
192         display();
193 } 

Na riadku 188 sa volá funkcia call kde dochádza ku komunikácii s Bandicootom. Premenná csv obsahuje novú knihu a premenná res reprezentuje výsledok volania, ktorý v prípade ak ide o duplicitnú knihu, obsahu práve jeden záznam.

widgety

Záver

Bandicoot je nový open source projekt, ktorého cieľom je poskytnúť relačný model netradičným spôsobom. Je ľahko použiteľný pre malé aplikácie, ktoré je jednoducho integrovať vďaka rozhraniu HTTP a otvorenému formátu CSV. Tento článok ukazuje ako používať Bandicoot priamo z JavaScriptu. Ak má niekto záujem vyskúšať Bandicoot s Javou, tak mu môže byť nápomocná knižnica bandicoot-lib.

Samotný jazyk Bandicootu zatiaľ implementuje len základy. Do budúcna je v pláne niekoľko rozšírení, ako napríklad pridanie dodatočných operácií, definovanie vlastných relačných operátorov, vytváranie modulov a možnosť definovať rozsiahle relačné ”constrainty”. To všetko však závisí od toho ako veľmi tento projekt zaujme a či sa mu podarí vytvoriť si pole pôsobnosti v silnej konkurencii tradičných relačných databáz.

Našli jste v článku chybu?
Podnikatel.cz: Takhle se prodávají mražené potraviny

Takhle se prodávají mražené potraviny

DigiZone.cz: Parlamentní listy: kde končí PR...

Parlamentní listy: kde končí PR...

Lupa.cz: Jak se prodává firma za miliardu?

Jak se prodává firma za miliardu?

Vitalia.cz: Tahák, jak vyzrát nad zápachem z úst

Tahák, jak vyzrát nad zápachem z úst

Vitalia.cz: Opuncie je plod kaktusu. Pozor na trny

Opuncie je plod kaktusu. Pozor na trny

Vitalia.cz: Voda z Vltavy před a po úpravě na pitnou

Voda z Vltavy před a po úpravě na pitnou

Vitalia.cz: Když všichni seli řepku, on vsadil na dýně

Když všichni seli řepku, on vsadil na dýně

DigiZone.cz: Světový pohár v přímém přenosu na ČT

Světový pohár v přímém přenosu na ČT

Vitalia.cz: Jaký je rozdíl mezi brambůrky a chipsy?

Jaký je rozdíl mezi brambůrky a chipsy?

Vitalia.cz: dTest odhalil ten nejlepší kečup

dTest odhalil ten nejlepší kečup

Vitalia.cz: Muž, který miluje příliš. Ženám neimponuje

Muž, který miluje příliš. Ženám neimponuje

Podnikatel.cz: Byla finanční manažerka, teď cvičí jógu

Byla finanční manažerka, teď cvičí jógu

DigiZone.cz: Mordparta: trochu podchlazený 87. revír

Mordparta: trochu podchlazený 87. revír

120na80.cz: Hrbatá prsa aneb mýty o implantátech

Hrbatá prsa aneb mýty o implantátech

Lupa.cz: Další Češi si nechali vložit do těla čip

Další Češi si nechali vložit do těla čip

Lupa.cz: Jak levné procesory změnily svět?

Jak levné procesory změnily svět?

DigiZone.cz: DVB-T2 ověřeno: seznam TV zveřejněn

DVB-T2 ověřeno: seznam TV zveřejněn

Podnikatel.cz: EET pro e-shopy? Postavené na hlavu

EET pro e-shopy? Postavené na hlavu

Podnikatel.cz: Udělali jsme velkou chybu, napsal Čupr

Udělali jsme velkou chybu, napsal Čupr

Lupa.cz: Aukro.cz mění majitele. Vrací se do českých rukou

Aukro.cz mění majitele. Vrací se do českých rukou