Robitex's Blog

Ideas in the web

Iterare su SQLite con Lua


Sommario

Riferendoci alla libreria LJSqlite3 verrà spiegato come iterare facilmente la collezione di dati di un database relazionale attraverso una query. Verranno inoltre messe in evidenza le proprietà dell’iteratore ai fini della pulizia e dell’intuitività del codice Lua.

Effective code

È sempre molto utile scrivere codice che sia espressivo e compatto, qualità che potremo riassumere in un unico termine idiomatico: effective.
Gli iteratori di Lua, che abbiamo già visto in questo post, sono costrutti sintattici che semplificano il nostro codice facendo corrispondere un concetto/entità con un elemento del linguaggio.
Lo sviluppatore costruisce così strutture concettualmente vicine a ciò che asserisce al problema da risolvere.

L’ambiente di lavoro

Utilizzeremo il database SQLite3 per creare, inserire ed interrogare i dati, e la libreria LJSqlite3 per LuaJIT un compilatore Lua, per creare il codice applicativo.
Sul vostro sistema dovranno essere installati sia SQLite3, che LuaJIT, e le librerie Xsys e LJSQLite3 scaricabili dai rispettivi siti e disponibili per quasi tutti i sistemi operativi.

Inoltre lavoreremo con un (semplice) database in modalità in-memory cioé interamente mantenuto nella memoria centrale, così che tutto il codice di esempio possa trovare posto in un unico file.

L’iteratore Lua

Il nostro obiettivo è scrivere un iteratore ‘stateless‘ in Lua che ad ogni ciclo ci metta a disposizione record per record, il risultato di una query.
Chiamando l’iteratore ‘iselect()‘ potremo prevedere per esso due argomenti: la connessione al database e la query da eseguire. Per concretizzare l’idea, lasciando i dettagli ad un secondo momento, il codice per stampare l’intero contenuto della tabella di esempio ‘val‘ con i suoi attributi ‘id‘ e ‘num‘ potrebbe essere il seguente:

for i, tr in iselect(conn, "SELECT * FROM val;") do
    print( 'Row '..i..': ', tr.id, tr.num)
end

L’iteratore ad ogni ciclo del ‘generic for’ ritorna il progressivo del record e la ‘tupla’ (una tabella Lua ovviamente) con i valori dei campi indicizzati con chiavi corrispondenti ai nomi degli attributi della tabella del database.

Passiamo ora al codice completo dell’esempio con l’implementazione dell’iteratore definito precedentemente. Non spiegherò il listato nei dettagli tecnici rimandando il lettore alle documentazioni dei singoli componenti peraltro scritte piuttosto bene. Eseguire il codice con il comando $ luajit nomefile.lua.

-- iterator function
local function nextrec(t, i)
    i = i + 1
    if i <= t.__number_of_records then
        local tr = {}
        local nc = #t[0]
        for col=1, nc do
            local field = t[0][col]
            tr[field] = t[col][i]
        end
        return i, tr
    end
end

-- stateless iterator
local function iselect(connection, query)
    local t, nr = connection:exec(query, 'hi')
    t.__number_of_records = nr
    return nextrec, t, 0
end

-- SQL code

local sql = require "ljsqlite3"
-- Open a temporary in-memory database.
local conn = sql.open("")

-- Execute SQL commands separated by the ';'
conn:exec[[
CREATE TABLE val (id TEXT, num REAL);

INSERT INTO val VALUES('myid1', 260);
INSERT INTO val VALUES('myid2', 200);
INSERT INTO val VALUES('myid3', 200);
INSERT INTO val (id) VALUES('myid4');
INSERT INTO val (num) VALUES(200);
INSERT INTO val VALUES('myid6', 260);
INSERT INTO val VALUES('myid7', 201);
INSERT INTO val VALUES('myid8', 300);
INSERT INTO val VALUES('myid9', 240);
]]

-- user code
for i, tr in iselect(conn, "SELECT * FROM val;") do
    print( 'Row '..i..': ', tr.id, tr.num)
end
conn:close()

Conclusioni

Oltre a confermare l’intuitività e la semplicità degli iteratori in Lua, abbiamo dimostrato come SQLite3 e le librerie LuaJIT per accedervi, siano in grado di fornire una soluzione performante e potente per la creazione di applicativi non di rete.

Un saluto.

3 risposte a “Iterare su SQLite con Lua

  1. Massimiliano Dominici 14/12/2012 alle 15:48

    Ciao Roberto,

    conoscendo il tuo interesse per LaTeX/LuaTeX, ti segnalo questo progetto di Luigi Scarso, che rimane in tema con l’argomento del tuo articolo: https://github.com/luigiScarso/luatexjit

    Nel repository trovi anche un eseguibile compilato su Ubuntu 32 bit, che però dovrebbe essere compatibile con un’architettura a 64bit. (Sulla mia Fedora 64bit l’invocazione di “luatexjit –version” non restituisce errori, ma non mi sono spinto oltre…)

    Complimenti per il blog😉

    Max.

    • robitex 14/12/2012 alle 18:16

      Ciao Max.
      Sono molto contento di sentirti qui sul blog.
      Conosco luatexjit, me l’ha segnalato Luigi stesso un mesetto fa. Abbiamo progetti penso molto interessanti…
      Grazie per i complimenti.
      Alla prossima.
      R.

      • Massimiliano Dominici 14/12/2012 alle 18:45

        Bene, immaginavo che intorno a lautexjit potesse nascere una collaborazione tra te e Luigi. Allora mi auguro che abbiate presto notizie da diffondere sul progetto, magari sul prossimo numero di ArsTeXnica o al prossimo convegno del GuIT.

        Ciao.
        Max.

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger cliccano Mi Piace per questo: