Hlavní navigace

GLib: Soupravy dat

Michal Burda

Soupravy dat najdou své uplatnění všude tam, kde potřebujete jaksi "rozšířit" možnosti funkcí jiných knihoven. Umožňují programátorům napojit na jiné datové typy další přídavné datové položky.

Nebudu vám tajit, že mechanizmus souprav dat GDataset je velice podobný klíčovaným seznamům dat. Soupravy dat jsou ale trochu upraveny, aby vyhovovaly poněkud jiným účelům.

Datový typ GDataset slouží k napojení dalších informací na již existující data. Uvedu příklad. Dejme tomu, že ve svém programu používáte nějakou další knihovnu, která pracuje s nějakými svými strukturami. Vám ale jejich složení nevyhovuje – rádi byste si k nim ještě přidali nějaké další datové položky. Původní strukturu nemůžete měnit, proto je vhodné využít GDataset, který umožní navázání dalších záznamů. Pozice (adresa) „hlavní“ struktury v paměti se v algoritmu používá jako klíč k seznamu dat, jehož položky mají také své klíče – GQuark y.

Pokusím se všechno říci ještě jinými slovy. Soupravy dat v podstatě sestávají ze dvou částí. Jakési „hlavní“ datové položky (nejčastěji struct), jejíž vnitřní struktura je neměnitelná, a dalších připojených dat, které nejsou nic jiného, než trochu přizpůsobený mechanizmus klíčovaných seznamů dat. V programu pak stačí udržovat pointer na onen „hlavní“ datový záznam. Jeho prostřednictvím a pomocí speciálních funkcí získáte přístup i k dalším volitelným datovým položkám, jejichž množství, typ, název a obsah můžete určovat dynamicky za běhu programu.

Nevíte-li ještě, co to jsou klíčované seznamy dat, přečtěte si minulý a předminulý článek o knihovně GLib. V dalším textu budete také potřebovat znalost tzv. kvarků – viz 24. část.

Jelikož funkce pro práci se soupravami dat jsou opravdu velmi podobné s rutinami klíčovaných seznamů dat, probereme je trochu rychleji. Opět zde platí, že k položkám můžete přistupovat jak pomocí kvarků tak zadáním řetězcového klíče. Shodné zůstávají i mechanizmy automatického dealokování nepotřebných dat.

Funkční prototypy jsou podobné i vzhledově. Místo datalist v názvu funkce dejte dataset, místo parametru datalist dejte konstantní pointer dataset_location, což není nic jiného než adresa „hlavních dat“ sloužící jako klíč k seznamu ostatních uživatelských datových položek.

Přidávání prvků do soupravy dat

void g_dataset_id_set_data_full(gconstpointer dataset_location,
                           GQuark key_id, gpointer data,
                           GDestroyNotify destroy_func);

void(*GDestroyNotify)(gpointer data);

…nejobecnější funkce, jakou můžete k přidání vlastních údajů do soupravy dat použít. dataset_location je rozlišovací pointer (adresa tzv. „hlavních dat“), key_id pak GQuark použitý jako klíč ke vkládanému prvku, data jsou samotná data a destroy_func tzv. „dealokovací funkce“, kterou se data podle potřeby automaticky uvolňují z paměti. Vkládáte-li statická data, zvolte za destroy_func jednoduše NULL.

#define g_dataset_id_set_data(l, k, d) 

…toto je zkratkovité makro pro případ, že vkládáte již zmiňovaná statická data. l je adresa identifikující soupravu dat (pointer na „hlavní data“), k  je kvarkový klíč a d ukládaná statická data. (Jako destroy_func se nastaví NULL.)

Ještě varianty téhož používající řetězcové klíče:

#define g_dataset_set_data_full(l, k, d, f) 
l 

Získávání údajů ze soupravy dat

I zde máte k dispozici dva druhy přístupů – odkazování se na uložená data pomocí kvarků nebo řetězcovými klíči. První způsob reprezentuje funkce:

gpointer g_dataset_id_get_data(gconstpointer dataset_location,
                               GQuark key_id);

Jako parametry jí zadejte referenční pointer na „hlavní“ data a GQuark ový klíč položky a ona vám na oplátku vrátí její data.

Makro:

#define g_dataset_get_data(l, k) 

…udělá přesně totéž, jen navíc řetězcový klíč k  přeloží na potřebný GQuark. Pro úplnost: l je (jak jinak) pointer na „hlavní“ data.

Pokračování příště.

Našli jste v článku chybu?
Lupa.cz: Kdo pochopí vtip, může jít do ČT vyvíjet weby

Kdo pochopí vtip, může jít do ČT vyvíjet weby

Měšec.cz: Zdravotní a sociální pojištění 2017: Připlatíte

Zdravotní a sociální pojištění 2017: Připlatíte

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

Vitalia.cz: Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

DigiZone.cz: „Black Friday 2016“: závěrečné zhodnocení

„Black Friday 2016“: závěrečné zhodnocení

Měšec.cz: U levneELEKTRO.cz už reklamaci nevyřídíte

U levneELEKTRO.cz už reklamaci nevyřídíte

Lupa.cz: Insolvenční řízení kvůli cookies? Vítejte v ČR

Insolvenční řízení kvůli cookies? Vítejte v ČR

DigiZone.cz: Recenze Westworld: zavraždit a...

Recenze Westworld: zavraždit a...

Podnikatel.cz: EET: Totálně nezvládli metodologii projektu

EET: Totálně nezvládli metodologii projektu

120na80.cz: Na ucho teplý, nebo studený obklad?

Na ucho teplý, nebo studený obklad?

Podnikatel.cz: Podnikatelům dorazí varování od BSA

Podnikatelům dorazí varování od BSA

Vitalia.cz: Co pomáhá dítěti při zácpě?

Co pomáhá dítěti při zácpě?

Vitalia.cz: Když přijdete o oko, přijdete na rok o řidičák

Když přijdete o oko, přijdete na rok o řidičák

Lupa.cz: Co se dá měřit přes Internet věcí

Co se dá měřit přes Internet věcí

120na80.cz: Co všechno ovlivňuje ženskou plodnost?

Co všechno ovlivňuje ženskou plodnost?

Vitalia.cz: Paštiky plné masa ho zatím neuživí

Paštiky plné masa ho zatím neuživí

Lupa.cz: Proč firmy málo chrání data? Chovají se logicky

Proč firmy málo chrání data? Chovají se logicky

Měšec.cz: Air Bank zruší TOP3 garanci a zdražuje kurzy

Air Bank zruší TOP3 garanci a zdražuje kurzy

Vitalia.cz: Znáte „černý detox“? Ani to nezkoušejte

Znáte „černý detox“? Ani to nezkoušejte

Vitalia.cz: Taky věříte na pravidlo 5 sekund?

Taky věříte na pravidlo 5 sekund?