[Produkty] - Velké databázové platformy, jako například Oracle Database, Microsoft SQL Server, IBM DB2 apod., jsou vidět v každém odborném i neodborném časopise. Avšak co když potřebujete malou, jednoduše instalovatelnou databázi? Ačkoli některé "běžné" databázové stroje nabízí i tzv. embedded verzi (například Firebird), my se dnes podíváme na jiný produkt. Jedné se o Blackfish SQL od společnosti CodeGear.
Blackfish SQL má zajímavý původ. Možná si někteří vzpomenou na produkt JDataStore. A Blackfish SQL právě z JDataStore vychází, respektive jedná se o pokračování tohoto produktu. Existují dvě verze – jedna pro Java prostředí (Blackfish SQL for Java) a druhá pro .NET prostředí (Blackfish SQL for Windows). Neméně zajímavý je i fakt, že .NET verze vznikla a vzniká pomocí automatického převodu zdrojových kódů z Javy do C#. Z výše uvedeného také můžeme usoudit, že tento databázový stroj je napsán plně v managed kódu.
Podíváme-li se na hlavní rysy, najdeme splnění normy SQL-92 (Entry level), plnou podporu Unicode (jak pro ukládání, tak i třídění a indexování), ADO.NET a JDBC ovladač a samozřejmě dbExpress 4 konektivitu. Blackfish SQL může být provozován jako in-process server i jako služba ve Windows. Díky stejnému "podvozku" je jak formát souborů, tak komunikační protokol stejný pro .NET i Java verzi. Není tedy problém provozovat Java verzi a připojovat se k ní z .NET aplikace a obráceně.
Pravděpodobně nejzajímavější vlastností je možnost psaní uložených procedur, respektive spouští nebo uživatelsky definovaných funkcí v libovolném CLR jazyce (pro .NET verzi) nebo Javě (pro Java verzi). Můžete tedy použít Delphi.NET, C#, VB.NET a nemusíte při tom používat ani RAD Studio. Například jednoduchý C# program lze přeložit i pomocí příkazové řádky a standardního csc překladače. Jako třešnička na dortu pak působí možnost přímo serializovat objekty do sloupce s datovým typem object.
Samozřejmě nelze zapomenout na jednoduchost deploymentu. A protože jde o jednoduchost především, spočívá deployment pouze v překopírování několika souborů (tzv. xcopy deplyoment), které spočítáte na prstech jedné ruky.
Připojení je možno využívat ve dvou základních režimech – lokální a vzdálené. Lokální běží přímo v adresním prostoru aplikace. Díky tomu nabízí velmi dobrý výkon, avšak k databázovému souboru může přistupovat pouze jeden proces. Vzdálené připojení se chová jako standardní server-klient architektura. Vzhledem k tomu, že ve společnosti CodeGear chtěli očividně nabídnout to nejlepší z obou světů, lze využít ještě jakýsi hybridní režim. Aplikace se lokálně připojí k danému databázovému souboru (čímž jej exklusivně uzamkne) a zároveň sama nastartuje Blackfish SQL server ve stejném procesu. Potom se mohou i ostatní aplikace (vzdáleně) připojit a pracovat s touto databází. Chytré, nemyslíte?
Nabídka datových typů dnes pravděpodobně neohromí, nicméně není chudá. Jedná se o varchar, tinyint, smallint, int, bigint, decimal, double precision, real, varbinary, date, time, timestamp, boolean a již zmiňovaný object. Chválíme především již zmiňovanou přímou podporu Unicode, která dodává na přehlednosti. Naopak množství číselných typů by mohlo být zastoupeno jedním či dvěma.
Blackfish SQL umožňuje psát uložené procedury (respektive spouště a uživatelsky definovaná funkce) v libovolném CLR jazyce, respektive v Javě. Můžete tak využít pohodlí IDE, které znáte a samozřejmě možností, které daný jazyk nabízí, včetně standardních knihoven a pomocných funkcí.
Metoda musí být statickým veřejným členem třídy a v assembly, ve kterém je tento kód umístěn je třeba "podstrčit" serveru. Assembly se hledají v cestách uvedených v BDSCOMMONDIR, v adresáři s BSQLServer.exe nebo v GAC. Metodu pak zpřístupníme v serveru pomocí:
CREATE METHOD <název> AS Assembly::Namespace.Trida.Metoda;
nebo pro Javu:
CREATE JAVA_METHOD <nazev> AS <definice>
respektive pro spoušť:
CREATE TRIGGER <název> [BEFORE|AFTER] [INSERT|UPDATE|DELETE] ON
<tabulka> AS Assembly::Namespace.Trida.Metoda;
Určitě se nyní ptáte, zdalipak se kód provádí na serveru nebo na klientovi? Veškerý kód se provádí v kontextu serveru, proto není třeba se obávat zbytečných roundtripů apod. V kódu je možné využít automaticky předávaného objektu typu DbConnection a provádět vlastní dotazy. Vrácené hodnoty mohou být návratové hodnoty funkce, i výstupní parametry metody. Pro předávání NULL hodnoty je možné použít standardní test na System.DBNull.Value, případně nullable typy. Poslední, nikoli však nezajímavou, vlastností je možnost vrátit DbDataReader. Vracíte tak z procedury resultset, který je dále zpracován vlastním kódem serveru. Tyto funkce se podobají databázovým pohledům, jsou však mnohem mocnější. Jako příklad ukažme jednoduchou metodu:
C#
public static DbDataReader FooBar(DbConnection connection, int i)
{
DbCommand cmd = connection.CreateCommand();
cmd.CommandText = "select foo from bar where baz = @i";
cmd.Parameters.Add("@i", DbType.Int32).Value = i;
return cmd.ExecuteReader();
}
Delphi
class function FooBar(Connection: DbConnection; I: Integer): DbDataReader;
var
Cmd: DbCommand;
begin
Cmd := Connection.CreateCommand;
Cmd.CommandText := 'select foo from bar where baz = ?';
Cmd.Parameters.Add('param', DbType.Int32).Value := i;
Result := Cmd.ExecuteReader;
end;
Objekty DbDataReader a DbCommand jsou po skončení provádění serverem automaticky uzavřeny a uvolněny.
Blackfish SQL je zajímavá databázová platforma. Užitečná je především hladká podpora pro .NET a Java programování na straně serveru (uživatelsky definované funkce, spouště, uložené procedury). Samozřejmě malé nároky a jednoduchý provoz/instalace na mnoha platformách dělají z tohoto produktu horkého kandidáta například na skladové a katalogové aplikace.