Solitamente quando ad un'applicazione serve un database ci si orienta su una soluzione Client - Server: ma questa architettura è davvero sempre necessaria?
In altre parole, è proprio necessario che l'utilizzatore del nostro software abbia un server SQL con tutto quel che ne deriva, installazione, manutenzione, backup...?
Inoltre, come possiamo fare quando vogliamo inserire un database in un'applicazione C?
A queste domande ci pensa SQLite, una libreria C multipiattaforma che è possibile inglobare nel proprio codice.

sqlite 183454 320


Riprendendo alcune delle informazioni dalla homepage del progetto, SQLite è:
- "self-contained" ovvero non richiede librerie aggiuntive, si basa solo sulla libreria standard C; in questo modo permette di essere ricompilato e linkato facilmente nei nostri progetti;
- "multipiattaforma" in quanto può essere ricompilato e fatto girare in qualsiasi ambiente;
- "serverless" in quanto non richiede la presenza di un server;
- "zero-configuration" proprio perchè non vi è un server non c'è bisogno di alcuna configurazione particolare;
- "transactional" ovvero internamente ogni modifica avviene completamente o non avviene proprio (si pensì alle interruzioni come un crash del programma, del sistema operativo, ad un'interruzione di corrente... SQLite garantisce che il db non sarà corrotto).

Sostanzialmente compilando SQLite e linkandolo al nostro progetto C aggiungiamo delle funzioni per l'apertura di un file di database e per l'esecuzione di query sulle tabelle presenti (quindi anche creazione di tabelle).

Ma in pratica come possiamo linkare SQLite? Dobbiamo caricare una libreria .dll/.so? Dobbiamo linkare un file .lib, sperando che ci sia quello precompilato per il nostro ambiente? Oppure dobbiamo ricompilare centinaia di sorgenti dopo aver modificato un Makefile?
No, molto semplicemente SQLite fornisce un file .C e un file .H che vengono chiamati "amalgamation" perchè sono la combinazione di tutti i files .C e .H del progetto SQLite.
Ne deriva che l'inserimento in un progetto risulta estremamente facile: nel sorgente qui sotto, compilato con Visual Studio 2015, mi è bastato aggiungere il file sqlite3.c al progetto.

#include <stdio.h>
#include "sqlite3.h"

static int callback(void *NotUsed, int argc, char **argv, char **azColName)
{
    int i;
    for (i = 0; i<argc; i++)
    {
        printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
    }
    printf("\n");
    return 0;
}

int main(int argc, char **argv)
{
    sqlite3 *db;
    char *zErrMsg = 0;
    int rc;
    
    printf("Test SQLite\n");

    rc = sqlite3_open("prova.db", &db);
    if (rc)
    {
        fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
        sqlite3_close(db);
        return(1);
    }

    rc = sqlite3_exec(db, "CREATE TABLE IF NOT EXISTS MYTABLE(x, y, z);", callback, 0, &zErrMsg);
    if (rc != SQLITE_OK)
    {
        fprintf(stderr, "SQL error: %s\n", zErrMsg);
        sqlite3_free(zErrMsg);
    }

    rc = sqlite3_exec(db, "INSERT INTO MYTABLE VALUES (\"1\",\"2\",\"3\");", callback, 0, &zErrMsg);
    if (rc != SQLITE_OK)
    {
        fprintf(stderr, "SQL error: %s\n", zErrMsg);
        sqlite3_free(zErrMsg);
    }

    rc = sqlite3_exec(db, "SELECT * FROM MYTABLE;", callback, 0, &zErrMsg);
    if (rc != SQLITE_OK)
    {
        fprintf(stderr, "SQL error: %s\n", zErrMsg);
        sqlite3_free(zErrMsg);
    }

    sqlite3_close(db);
    
    printf("Premi un tasto\n");
    getch();
    return 0;
}

Il database risiede fisicamente su un file con estensione .db: quindi anche per il backup basta fare una copia di tale file!

E per colori i quali non possono fare a meno dei tools grafici esistono dei front-end come SQLiteStudio che permettono di amministrare il database (ma davvero serve?).

sqlitestudio

In conclusione SQLite è interessante per diversi aspetti e può risultare comodo in diverse situazioni: dallo studente che vuole imparare SQL al produttore di programmi gestionali che vuole predisporre una versione demo che non necessita di SQL server...

Buon divertimento con SQLite!

Fonti:

https://www.sqlite.org/
http://sqlitestudio.pl/