Seriál Caché Studiodíl 4© Daniel Kutáč, InterSystems CZ, 2002
Úvodem Seriál Caché Studio nabízí postupný výklad práce se systémem Caché vč. praktických příkladů. V ucelených tématech jednotlivých dílů se jejich autor - ing. Daniel Kutáč, sales engineer InterSystems B.V. - věnuje možnostem univerzálního aplikačního a databázového serveru Caché vč. posledních novinek. Objasňuje v čem jsou hlavní výhody Caché - např. rychlost a mohutnost databázového stroje, rychlost vývoje, rozšiřitelnost aplikací, snadná kooperace s různými technologiemi a pružná reakce na poslední technologické trendy. Ke každému dílu jsou připraveny zdrojové kódy, které vhodně ilustrují příklady z textu. Seriál Caché Studio je vhodným doplňkem k ostatním studijním nástrojům, které společnost InterSystems B.V. nabízí: dokumenty v sekci webových stránek Technologie Caché, tištěné materiály nebo jednodenní trénink Caché Entrée, který firma pořádá každý měsíc: http://www.intersystems.cz/. Vždy můžete své informace doplnit na amerických stránkách http://www.intersystems.com/ nebo nás přímo kontaktovat info@intersystems.cz. Věříme, že se budete ke Caché Studiu se zájmem vracet.
Skriptovací jazyky CachéTo, co činí Caché tak mocným nástrojem pro tvorbu aplikací, je bezesporu možnost psát aplikace pomocí Caché vlastních skriptovacích jazyků. Caché kromě databázového stroje totiž obsahuje též stroj skriptovací, jenž umožňuje programátorům psát libovolné programy pro manipulaci s daty a pro zpracování libovolných transakcí. S jistou dávkou zjednodušení lze Caché směle považovat za “programovací jazyk” stejně jako např. C, Javu, Visual Basic aj. V Caché lze napsat celé aplikace, aniž by kód jakkoli přistupoval k datům uloženým v databázi a manipuloval s nimi. Například lze napsat aplikaci v Caché, která bude fungovat jako “message broker”, tedy bude zprostředkovávat komunikaci mezi aplikacemi (a databázemi) třetích stran, přijímat, zpracovávat a odesílat zprávy od původce k příjemci. V současné době je možno v Caché použít dva skriptovací jazyky a případně je i kombinovat. Historicky starším je jazyk Caché ObjectSkript, nově je pak k dispozici Caché Basic. Oba jazyky jsou rovnocenné, z obou zdrojových kódů vzniká stejný zkompilovaný kód. To, čím se oba jazyky liší, je samozřejmě syntaxe a filosofie. Caché ObjectScript nemá na první pohled zřejmou analogii v jiném programovacím jazyce, zatímco Caché Basic byl vytvořen úmyslně tak, aby co možná nejvíce připomínal Visual Basic. Caché ObjectScript Caché ObjectScript je ve své podstatě jazykem procedurálním. Pomocí Caché ObjectScriptu je možno psát samostatné, na objektech nezávislé úseky kódu, tzv. rutiny. Rutina je soubor jednoho nebo více dílčích celků, procedur nebo funkcí. Rutinu lze volat z CachéObjectScriptu nebo I i z Caché Basicu zadáním volitelného návěští a názvu rutiny. Např. máme-li rutinu dil4.MAC (nebo dil4.INT, případně dil4basic.BAS) zavoláním
Zavoláme rutinu dil4 (nejvyšší úroveň, tj.MAC pokud existuje, jinak INT nebo BAS) od prvního řádku. Chceme-li volat specifickou proceduru nebo funkci, např. NapisText budeme psát:
Caché ObjectScript není jazykem uzavřeným do sebe sama. Pomocí call-in a call-out rozhraní je možno volat z a do Caché z jazyka C. (To z toho důvodu, že Caché je možno provozovat na mnoha různých operačních systémech, jejichž základem je, ať chcete nebo ne, právě jazyk C.) Caché ObjectScript se od většiny programovacích jazyků v mnoha ohledech liší. Například nemá rezervovaná slova. Dále v podstatě nepracuje s datovými typy (na programátorské úrovni). Z toho pak plynou na jednu stranu legrační důsledky (např. lze napsat kód:)
Zde slovo ”goto” značí jak příkaz, tak návěští, tak i název proměnné. Na druhou stranu lze napsat např.
Zde se v prvním případě ”x” vyhodnotí jako pravda, zatímco v druhém jako nepravda, platí totiž že řetězec ”13.2a” se vyhodnocuje jako logická hodnota TRUE, neboť jej lze unární operací ”+” převést na číslo (13.2) různé od nuly.
Příkazy Příkazy Caché ObjectScriptu jsou jednoduché, vycházejí z angličtiny. Chcete-li např. napsat na aktuální výstupní zařízení slovo ”Ahoj!” stačí jen provést příkaz WRITE ”Ahoj!” Každý příkaz má i svou podmíněnou podobu, to znamená, že se provede jen v případě, že daná podmínka je splněna. Podmínka se uvádí znakem dvojtečka, např. WRITE:x=2 ”Ahoj!” Příkazy lze zapisovat na řádky za sebe, musí se však oddělit znakem ”mezera”. Příkazy, které nemají argumenty (např. ELSE), musí být odděleny dvěma mezerami. Každá řádka kódu začíná volitelně návěštím následovaným tabulátorem nebo mezerou a pokračuje příkazy. Caché ObjectScript je jazyk, jenž rozlišuje u názvů malá a velká písmena. Výjimkou jsou příkazy a systémové proměnné. Funkce a Procedury Funkce jsou v Caché vnitřní (systémové) a vnější (uživatelské). Vnitřní funkce se volají s uvedením znaku ”$” před názvem, vnější funkce uvedením ”$$”. Funkci lze volat i jako proceduru, tedy bez požadování návratové hodnoty. Procedury se na rozdíl od funkcí volají přesně podle jejich názvů. Jak procedurám, tak funkcím lze předávat parametry, a to buď hodnotou, nebo odkazem. Předává-li se hodnota proměnné odkazem, musí se před název proměnné přidat znak ”.”
Proměnné Proměnné jsou v Caché dvojí, persistentní, zvané globály, a dočasné, existující pouze v paměti vyhrazené procesu. Globál se značí znakem ”^” před názvem. Tedy proměnnéá ”^x” a ”x” jsou dvě různé proměnné. K první z nich mají přístup všechny procesy, ke druhé jen proces, v němž je nastavena. Proměnné v Caché není třeba nijak deklarovat před jejich prvním použitím, automaticky se deklarují samy. Chceme-li, aby proměnné byly zapoudřeny v rámci procedury nebo funkce, deklarujeme je pomocí příkazu NEW. Naopak, chceme-li označit proměnné jako veřejné, zadáme je do seznamu [PUBLIC ], který je volitelnou součástí deklarace procedure nebo funkce. Systémové proměnné mají jako první znak opět ”$”, ale ke zmatení s funkcemi nedochází, kompilátor z kontextu pozná, zda se jedná o funkci nebo proměnnou.
Makra V Caché ObjectScriptu existují tři úrovně rutin. Nejvyšší je úroveň makro (MAC), v té se zpravidla píše aplikační kód. O úroveň níže se nachází částečně přeložený kód (INT), který sestává z čistého ObjectScriptu v textové formě, všechna makra jsou v něm rozvinuta. Nejníže se pak nachází binární kód (OBJ), přeložený a připravený k interpretaci databázovým strojem. Makra se mohou definovat přímo v MAC rutinách ale zpravidla se kvůli přehlednosti definují ve zvláštní kategorii rutin, vložených (INC) souborů. Při odkazu na makra je nutno zadat cestu k INC souboru(ům) a jednotlivá makra se volají zadáním ”$$$” před název makra. Práce s objekty Pro práci s objekty existuje několik metod. Základními jsou %New, %Open, %OpenId. Pro vytvoření nové instance třídy User.Osoba je nutno zadat příkaz:
Zde je vidět použití konstrukce ##class Alternativně je možno použít volání
Rozdíl mezi první a druhou konstrukcí spočívá v tom, že první kontrukce se zkompiluje do OBJ kódu a nelze ji tedy za běhu programu měnit, zatímco u druhé kontrukce je název řídy parametrem metody a lze tedy v runtime zadávat různé názvy tříd. Pracujeme-li s persistentními objekty, musíme rozlišovat důsledně mezi identifikací objektu v paměti a identifikací téže instance na disku. Je–li objekt načten do paměti, pak proměnná, která na něj ukazuje, se nazývá OREF (Object reference), v našem případě je to proměnná ”osoba”. Odkazujeme-li se na objekt na disku, používáme ID (Identitu) instance. Např.:
NapřNapř.:
SQL Při psaní rutin v Caché ObjectScriptu je možno s výhodou kombinovat různé jazyky vložením úseků kódu napsaných v některém z podporovaných jazyků. Jedním z nich je SQL.. Ten je možno s výhodou použít pro vyhledávání dat v databázi. Například můžeme napsat takovýto kód: Obr. 1 Na obrázku je demonstrováno použití jednoduchého SQL dotazu a též i použití kursoru pro práci s vícero vrácenými záznamy.
HTML Při psaní webových aplikací v Caché (podrobně se tomuto tématu budeme věnovat v díle věnovaném CSP technologii) je možno část kódu napsat v rutině, v ní uzavřít úseky HTML kódu, které se provedou na straně webového klienta. Zpravidla však se takový kód píše do metod registovaných tříd, které provádějí serverovou aplikační logiku. Následující obrázek obsahuje malou ukázku. Obr. 2 JavaScript Při psaní dynamických webových aplikací často vyvstává potřeba modifikovat klienta dynamicky. Toho lze docílit v praxi dvěma základními způsoby, pomocí JavaScriptu, jenž je podporován většinou intenetových prohlížečů, a pomocí VBScriptu, jenž je podporován Microsoftem. Caché podporuje vkládání úseků JavaScriptu do kódu Cache ObjectScriptu. JavaScript lze vkládat jak do rutin, tak do metod tříd. Jednoduchou ukázku vloženého JavaScriptu ukazuje následující obrázek. Obr. 3
Java Nejen že Caché umožňuje začlenit do kódu úseky psané v SQL, JavaScriptu, HTML; dokonce nabízí programátorům aplikací pracujících v Javě, že mohou psát celé metody tříd v čisté Javě! Takto napsané metody jsou ovšem logicky k dipozici pouze na straně klienta. K tomu, aby bylo možno takovou třídu použít v Javě, je nutno vystavit ji pomocí její vnější projekce. Caché prodporuje projekce do Javy a C. Obě projekce vytvářejí při kompilaci třídy hlavičkové soubory typu “java” pro Javu, “cpp” a “h” pro C. Ale o tom více v některém z následujících dílů. Caché Basic Od verze 5 je k dispozici nový skriptovací jazyk, Caché Basic. Tento jazyk byl vytvořen za účelem oslovit širokou komunitu programátorů, kteří se setkali s jazyky Visual Basic / VBScript. Syntaxe jazyka Caché Basic vychází ze syntaxe VBScriptu. Na rozdíl od něj obsahuje některé příkazy a syntaktické konstrukce vlastní pouze Caché, které umožňují programátorům jednoduše pracovat s persistentními daty – globály. Caché Basic je možno použít jak pro psaní rutin, tak pro psaní metod. Dokonce je možno psát některé metody tříd v Caché Basicu a jiné v Caché ObjectScriptu v rámci definice jedné třídy! (a ještě jiné v Javě, jak bylo zmíněno v předešlé kapitole.) Caché Basic má na rozdíl od Caché ObjectScriptu a podobně jako VBScript spoustu rezervovaných slov.
Přehled syntaxe Práce s objekty Práci s objekty demonstruje následující úsek kódu. Obr. 4
Práce s globály Práce s globály se neliší od práce s ostatními proměnnými, pouze před název globály je nutno zadat znak ”^”. Pro procházení jednotlivých uzlů globálů je implementována funkce Traverse jenž je obdobou funkce $Order z Caché ObjectSrtiptu. Příklad práce s globálem je předveden na následujícím obrázku: Obr. 5 Všimněte si, že příkaz EraseArray ^BASIC(”a”) smaže uzly ^BASIC(”a”,1) a ^BASIC(”a”,3) ale nikoliv ^BASIC(”a”).
Poznámka: Pokud jste si již stáhli a otevřeli projekt dodaný k tomuto dílu našeho seriálu, možná jste si všimli, že obsahuje nový typ souboru, jenž je zařazen v katalogu ”CSP Files”. Jedná se o webovou stránku napsanou pomocí technologie Caché Server Pages, o níž si budeme povídat příště. Tuto stránku nicméně potřebujeme již v této kapitole kvůli demonstraci HTML kódu vloženého do Caché ObjectScriptu, neboť se odkazuje na třídu, v níž tento kód je.
|