venerdì 8 novembre 2013

Ubuntu: installazione di SQLite da sorgente

Prima o poi un database può servire, e serve un RDBMS per gestirlo. Una scelta molto comune è MySQL, altra possibile scelta è PostgreSQL, ma non sempre c'è bisogno di scomodare tanta potenza e peso.

A volte serve qualcosa di piccolo ed essenziale, facile da installare e da usare, che sia multipiattaforma e richieda poca o nessuna amministrazione, che possa essere usato sia come prodotto a se stante, sia gestito dall'interno dei nostri programmi scritti in un linguaggio di programmazione come C/Java/PHP/Python, e molti altri per cui esiste il binding.

Queste sono le occasioni in cui SQLite fa al caso nostro. Il prodotto ha notevoli possibilità e anche limiti, per cui è sempre da valutare con attenzione se fa proprio al caso nostro.

Vediamo come installarlo su una macchina Ubuntu partendo direttamente dai sorgenti disponibili per il dowload sul sito ufficiale. Per le prove ho usato una Ubuntu 12.04 LTS a 64 bit e SQLite 3, ma con piccole modifiche immagino sia una procedura del tutto generale. Fatemi sapere laddove doveste incontrare problemi, ma anche laddove è andato tutto bene.

Iniziamo con l'installazione preliminare dell'occorrente per la successiva compilazione dei sorgenti. Aprite un terminale e date il comando:

sudo apt-get install build-essential checkinstall

Scaricate dal link precedente il sorgente sqlite-autoconf-nomeversione.tar.gz, nel momento in cui scrivo il nome esatto del file è sqlite-autoconf-3080100.tar.gz., ma con il tempo la parte numerica cambierà in funzione delle nuove versioni, assicuratevi comunque che si tratti sempre del file con la stringa "autoconf" nel nome.

Portatevi con il terminale nella cartella dove avete scaricato il file e decomprimetelo con

tar xvfz sqlite-autoconf-3080100.tar.gz

poi compilatelo con:

cd sqlite-autoconf-3080100
./configure
make
sudo checkinstall

Se tutto procede bene, ad un certo punto "Checkinstall" vi chiederà:

The package documentation directory ./doc-pak does not exist.
Should I create a default set of package docs?  [y]:


Rispondete y oppure n a seconda che vogliate o meno creare ed installare la documentazione del software. Vi verrà anche chiesto di inserire una descrizione del pacchetto:

Inserire una breve descrizione per il pacchetto.
Termina la tua descrizione con un linea vuota o EOF.
>>


Inseritene una a vostro piacimento, per esempio:

SQLite 3.8.1 installed from source with Checkinstall.

e date esattamente 3 volte "Invio" sulla tastiera per proseguire l'installazione. Una volta terminata, per testare il funzionamento di SQLite date il comando:

sqlite3

Se beccate l'errore

SQLite header and source version mismatch

allora c'è un problema di librerie non aggiornate dall'installazione da risolvere così:

sudo updatedb
locate libsqlite3

Vedrete che le librerie libsqlite3.so.0 e libsqlite3.so.0.8.6 sono presenti in almeno 3 directory:

/usr/lib/i386-linux-gnu/libsqlite3.so.0
/usr/lib/i386-linux-gnu/libsqlite3.so.0.8.6
/usr/lib/x86_64-linux-gnu/libsqlite3.a
/usr/lib/x86_64-linux-gnu/libsqlite3.la
/usr/lib/x86_64-linux-gnu/libsqlite3.so
/usr/lib/x86_64-linux-gnu/libsqlite3.so.0
/usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6
/usr/local/lib/libsqlite3.a
/usr/local/lib/libsqlite3.la
/usr/local/lib/libsqlite3.so
/usr/local/lib/libsqlite3.so.0
/usr/local/lib/libsqlite3.so.0.8.6

Controllando le date (controllate effettivamente, non vorrei che proprio nel vostro caso i problemi fossero altri) si vedrà che i file delle directory usr/lib/i386-linux-gnu/ e /usr/lib/x86_64-linux-gnu/ non sono aggiornati alla stessa data di quelli nella directory /usr/local/lib/, i più recenti appena installati.

Su Ubuntu 64 bit è sufficiente aggiornare i file nella sola directory /usr/lib/x86_64-linux-gnu/ copiandovi quelli della directory /usr/local/lib/.

Immagino, ma NON ho testato l'ipotesi, che per installazioni di Ubuntu a 32 bit la directory /usr/lib/x86_64-linux-gnu/ va sostituita con la directory /usr/lib/i386-linux-gnu/.

Perché SQLite riprenda a funzionare è sufficiente aggiornare solo i 2 file libsqlite3.so.0 e libsqlite3.so.0.8.6, per mantenere il tutto allineato è preferibile aggiornarli tutti.

Per sicurezza è meglio cambiare nome ai file da aggiornare piuttosto che cancellarli o sovrascriverli, così da poter tornare indietro in caso di necessità:

sudo mv /usr/lib/x86_64-linux-gnu/libsqlite3.a /usr/lib/x86_64-linux-gnu/libsqlite3.a_bak

sudo mv /usr/lib/x86_64-linux-gnu/libsqlite3.la /usr/lib/x86_64-linux-gnu/libsqlite3.la_bak

sudo mv /usr/lib/x86_64-linux-gnu/libsqlite3.so /usr/lib/x86_64-linux-gnu/libsqlite3.so_bak

sudo mv /usr/lib/x86_64-linux-gnu/libsqlite3.so.0 /usr/lib/x86_64-linux-gnu/libsqlite3.so.0_bak

sudo mv /usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6 /usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6_bak

Infine copiare i nuovi file al posto dei vecchi rinominati:

sudo cp /usr/local/lib/libsqlite3.a /usr/lib/x86_64-linux-gnu/

sudo cp /usr/local/lib/libsqlite3.la /usr/lib/x86_64-linux-gnu/

sudo cp /usr/local/lib/libsqlite3.so /usr/lib/x86_64-linux-gnu/

sudo cp /usr/local/lib/libsqlite3.so.0 /usr/lib/x86_64-linux-gnu/

sudo cp /usr/local/lib/libsqlite3.so.0.8.6 /usr/lib/x86_64-linux-gnu/

Se tutto è stato fatto correttamente ora SQLite dovrebbe funzionare. Provate a ridare il comando:

sqlite3

e SQLite dovrebbe rispondervi:

SQLite version 3.8.1 2013-10-17 12:57:35
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
>


Per uscire dal prompt e terminare SQLite:

.q

Per disinstallarlo completamente:

sudo apt-get remove --purge sqlite-autoconf

E' tutto... buon lavoro con SQLite!