Re: LuaTeX non trova il modulo luasql.sqlite3

#93925
robitex
Amministratore del forum
    Up
    0
    Down
    ::


    Eccomi qui!
    Osservate questo codice:
    `local cpath = kpse.find_file('sqlite3.so', 'clua')
    texio.write_nl(cpath)
    local luasql = package.loadlib(cpath, 'luaopen_luasql_sqlite3')

    env = assert(luasql().sqlite3())`

    Con esso si fa a meno di qualsiasi intervento manuale! 8)
    Per prima cosa si incarica il modulo LuaTeX kpse di ricercare il percorso della libreria specificando che si tratta di una libreria dinamica scritta in C.
    L’istruzione successiva stampa ilpercorso in console per controllo.
    Ok.
    Adesso si utilizza la funzione di basso livello package.loadlib. Essa ha bisogno di due argomenti: il percorso alla libreria (cha abbiamo appena fatto ricercare) ed il nome della funzione entry-point.

    A questo punto non rimane che creare l’ambiente per lavorare chiamando due funzioni in cascata: luasql() restituisce una tabella che contiene la funzione sqlite3, quindi il codice significa chiama luasql() per ottenere la tabella che contiene la funzione principale, ed eseguila per ottenere l’ambiente, ovvero il pieno e completo accesso alle funzionalità della libreria.

    Questo è un esempio minimo compilabile se solo si ha l’accortezza di creare a parte il file del database con il codice postato all’inizio:
    `% !TEX program = lualatex

    \documentclass{article}
    \usepackage{luacode,booktabs}

    \begin{document}
    \begin{luacode*}
    local cpath = kpse.find_file('sqlite3.so', 'clua')
    texio.write_nl(cpath)
    local luasql = package.loadlib(cpath, 'luaopen_luasql_sqlite3')

    env = assert(luasql().sqlite3())
    texio.write_nl(type(env))

    — connect to data source
    con = assert (env:connect(“luasql-test”))
    — retrieve a cursor
    cur = assert (con:execute”SELECT name, email from people”)
    — print all rows, the rows will be indexed by field names
    row = cur:fetch ({}, “a”)
    tex.sprint([[\begin{tabular}{@{}ll@{}}\toprule]])
    tex.sprint([[Name & email \\\midrule]])
    while row do
    tex.sprint(-2,row.name)
    tex.sprint(“&”)
    tex.sprint(-2, row.email)
    tex.sprint(“\\\\”)
    — reusing the table of results
    row = cur:fetch (row, “a”)
    end
    tex.sprint([[\bottomrule\end{tabular}]])
    — close everything
    cur:close()
    con:close()
    env:close()
    \end{luacode*}
    \end{document}
    `

    Non so cosa accedrebbe se sul sistema fossere installati più file sqlite3.so. Una cosa questa da approfondire.

    Se volessimo conoscere la versione della libreria dinamica potremo fare:
    `% !TEX program = lualatex

    \documentclass{article}
    \usepackage{luacode,booktabs}

    \begin{document}
    \begin{luacode*}
    local cpath = kpse.find_file('sqlite3.so', 'clua')
    texio.write_nl(cpath)
    local luasql = package.loadlib(cpath, 'luaopen_luasql_sqlite3')

    local libdin = assert(luasql())
    texio.write_nl('VERSION: '..libdin._VERSION)
    texio.write_nl('COPYRIGHT: '..libdin._COPYRIGHT)
    texio.write_nl('DESCRIPTION: '..libdin._DESCRIPTION)
    \end{luacode*}
    \end{document}`
    per ottenere in console:`VERSION: LuaSQL 2.3.0
    COPYRIGHT: Copyright (C) 2003-2012 Kepler Project
    DESCRIPTION: LuaSQL is a simple interface from Lua to a DBMS
    `

    Devo dire che la documentazione di LuaTeX non ha il pregio di essere comprensibile. lo dico perché la consultazione non è agevole: molte informazioni sono omesse ed occorre una lenta ricerca dei singoli pezzi.

    Questo post non risolve ancora completamente il problema, però spiega come funzionano le cose un po’ meglio.
    L’ideale sarebbe poter ricorrere alla funzione require() di Lua. Forse serve scrivere un searcher specializzato ed aggiungerlo agli altri di LuaTeX (una cosa simile a quello di Oberdiek [luatexbase.loder] che funziona solo per librerie esterne scritte in Lua).

    Proseguo le ricerche intanto, augurandovi una buona serata.
    R.

    Go to top