Radek Chalupa   konzultace a školení programování, vývoj software na zakázku

Databáze SQLite v C/C++ - úvod

4.6.2017

SQLite je souborová databáze podporující SQL přístup. Od svého vzniku roste její popularita a rozšíření. Kromě nejrůznějších desktopových aplikací najdeme její podporu také u mnohých webhostingů neboť je snadno přístupná v jazyce PHP. Databáze je velmi rychlá a s malými nároky na systémové prostředky. O její popularitě svědčí také to, že v posledních verzích Microsoft Visual C++ nahradila dříve používaný "SQL Server Compact" v aplikaci tzv. "Intellisense", tj, rychlého doplňování kódu. Nyní tedy v projektech psaných v C++ najdeme místo .ncb souboru soubor .db, což je právě databázový soubor SQLite.

Nyní už k tomu jak využít SQLite databázi v desktopové aplikaci psané ve Visual C++. Jednou z výhod SQLite je to, že celý její zdrojový kód je obsažen ve dvou souborech - sqlite3.c a sqlite3.h, které jsou samozřejmě volně distribuovatelné a prvním krokem je tedy stažení jejich nejnovější verze z webových stránek www.sqlite.org. Stáhneme zip soubor sqlite-amalgamation-xxx.zip (kde xxx je samozřejmě vždy konkrétní číslo nejnovější verze).

Pokud máme projekt ve Visual C++, musíme nejprve do projektu přidat výše uvedený zdrojový kód SQLite databáze. V zásadě máme 2 možnosti: přidat výše uvedené zdrojové soubory do projektu nebo si vytvořit statickou knihovnu .lib a do projektu pak přidat pouze hlavičkový soubor a jako vstupní soubor linkeru vytvořený soubor statické knihovny .lib. Každý způsob má své pro i proti. V prvním případě nám při pokusu o sestavení projektu zahlásí chybu předkompilované hlavičky, kter0 jsou v C++ a soubor sqlite3.c je kompilován jako "čisté" C. Řešením je vybrat vlastnosti souboru sqlite3.c a (nejlépe rovnou pro všechny konfigurace a platformy) nastavit v C/C++ -> Precompiled headers variantu "Not using prcompiled headers". Dalším (tentokrát nikoliv zásadním) problémem může být, že pokud používáte nástroj "Analýza kódu", v souboru sqlite3.c je nalezeno několik varování. Samozřejmě je možné je postupně proklikat a nastavit jejich potlačení ve zdrojovém kódu (pomocí direktivy #pragma), avšak jakmile si stáhnete novější verzi zdrojového kódu, musíte to dělat znova. Navíc pokud jste zvyklí nastavovat v projektu úroveň varování na 4 (tj. nejvyšší - výchozí je 3) tato varování se objeví také při běžném rebuildu.

Výše uvedených problémům se lze vyhnout vytvořením statické knihovny. To je sice při prvním použití trochu pracnější, ale pokud použijete SQLite ve více projektech, situace se obrátí ve prospěch varianty statické knihovny. Založíme si projekt typu Win32 aplikace - statická knihovna. Do projektu přidáme soubory zdrojového kódu SQLite, tedy sqlite3.c a sqlite3.h. Sestavíme nejlépe rovnou všechny 4 základní konfigurace, tedy 64 a 32 bitovou, obě jak v debug tak release sestavení. Nyní stačí přidat příslušný lib soubor do každého projektu ve kterém chceme SQLite použít. Možností jak to udělat je víc. Já osobně se snažím co nejvíce zapsat přímo do zdrojového kódu namísto nastavování ve vlastnostech projektu. Přijde mi to jednodušší a rychlejší při opakovaném použití. Ale už konkrétně. Vytvořené lib soubory mám všechny v jedné složce s knihovnami, proto jejich názvy upravím tak aby vyjadřovaly o jakou konfiguraci jde. Pak už stačí do každého projektu přidat #include s cestou k souboru sqlite3.h a následující direktivy:

#ifdef _WIN64
#ifdef _DEBUG
#pragma comment (lib, "..\\Knihovny\\lib\\sqlite64_debug.lib")
#else
#pragma comment (lib, "..\\Knihovny\\lib\\sqlite64.lib")
#endif
#else
#ifdef _DEBUG
#pragma comment (lib, "..\\Knihovny\\lib\\sqlite32_debug.lib")
#else
#pragma comment (lib, "..\\Knihovny\\lib\\sqlite32.lib")
#endif
#endif

Jak je zřejmé, linker si pak vybere příslušný odpovídající lib soubor podle aktuálně sestavované konfigurace.

Nyní je všechno připraveno a můžeme se dát do programování. Samozřejmě je nutné znát na potřebné úrovni jazyk C a seznámit se s používáním funkcí SQLite (jak už jsem zmínil, je psaná v čistém C, tj, bez objektů). Dokumentaci najdeme na webu SQLite. Zájemci mohou samozřejmě využít příslušné školení.