Visualizzazione post con etichetta programmazione. Mostra tutti i post
Visualizzazione post con etichetta programmazione. Mostra tutti i post

30 agosto 2015

Leggere e scrivere un databse .accdb senza Access con Libreoffice

Come riportato qui :

'limited olders driver "Microsoft.Jet.OLEDB.4.0" works fine for read/write, while "Microsoft.ACE.OLEDB.12.0" driver only reads; (fdo#43187). Driver only works on Windows.'

Libreoffice non è pienamente compatibile con le ultime versioni di MS Access, già a partire dalla 2010.
Come fare per accedere (in read/write) a preesistenti file nel formato .accdb, senza per forza acquistare la suite di redmond oppure, in ambienti non-Windows, senza eseguirla con wine o VirtualBox?

Ci viene in aiuto UCanAccess (http://ucanaccess.sourceforge.net/site.html), un'implementazione open source del Driver JDBC che permette ai client jdbc (per esempio, DBeaver, NetBeans, SQLeo, Open Office Base, Libre Office Base, Squirrell) di accedere in lettura e scrittura ai database MS Access (.mdb and .accdb).
Essendo scritta interamente in Java, gira su Windows e su sistemi non-Windows (linux), senza la necessita di driver ODBC, grazie all'impiego di:

  • Jackcess coem libreria per accedere a Ms Access (http://jackcess.sourceforge.net/).
  • Hsqldb come  synchronized DBMS (http://hsqldb.org/).
  
L'elenco completo delle feature può essere trovato nell'home page del progetto, assieme al pacchetto con gli eseguibili, giunto alla versione 3.0.0.


Oltre al classico uso del terminale a riga di comando (per i puristi), attraverso l'esecuzione di script da shell (inclusi nel paccheto compresso e che prevedono la possibilità di eseguire comandi SQL e l'esportabilità in formato CVS dei dati), esiste l'opportunità di integrazione con Libreoffice(LO), secondo le modalità di seguito esposte.

Una volta scaricato e decompresso il pacchetto in un percorso opportuno, apriamo LO e consideriamo la scheda "Avanzate" nel menu Opzioni, dalla quale possiamo accedere alla finestra "Percorso classi", premendo il relativo pulsante.

 Si tratta allora di aggiungere gli archivi (in formato .jar) contenuto nel percorso di decompressione ed elencati di seguito:

//ucanaccess-3.0.0.jar
//lib/commons-lang-2.6.jar
//lib/commons-logging-1.1.1.jar
//lib/hsqldb.jar
//lib/jackcess-2.1.2.jar






Quindi chiudiamo LO e riapriamolo, iniziando la procedura di creazione di un nuovo DB, scegliendo l'opzione "Connect to an existing database (JDBC)"

Supponendo che il file MSAccess che voglio manipolare sia "TOL.accdb"  nle percorso, /home/bleish/Scrivania/TOL.accdb, devo completare i campi mostrati nella finestra nel modo seguente (notare la tripla slash):

  • URL della sorgente dati-->   jdbc:ucanaccess:///home/bleish/Scrivania/TOL.accdb
  • Classi di driver JDBC --> net.ucanaccess.jdbc.UcanaccessDriver

Fatto questo posso passare avanti e salvare il database creato in una cartella desiderata.

Da questo momento è possibile aprire il file e manipolare, attraverso JDBC, il file .accdb di Access.
Tuttavia, l'accesso in modalità read/write è solo consentito alle tabellee alle view, e non è possibile gestire form e codice VB; inoltre molte delle tipiche operazioni sulle tabelle non sono consentite.

10 febbraio 2010

Scrivere librerie MEX in C/C++

Gli elementi principali di un file mex in Matlab, scritto in linguaggio C/C++, sono principalmente quattro
  1. l'header mex.h
  2. il gateway mexFunction
  3. Gli array mxArray
  4. Le API function

mex.h

#include mex.h

Ogni mex-file scritto in C/C++ deve avere una direttiva di inclusione del header mex.h, in modo da poter utilizzare le API nella forma delle routines mx*

Il gateway mexFunction
mexFunction(int nlhs, mxArray *plhs[ ], int nrhs,
const mxArray *prhs[ ])
{
...
}

La routine di gateway tra il file mex e Matlab è chiamata mexFunction e, sostanzialmente, costituisce il "main" della libreria che andiamo ad implementare.

Tale routine, dichiarata il cui prototipo è dichiarato in mex.h, presenta i seguenti elementi:
  • nlhs è il numero di mxArray in uscita (lhs - left hand side)
  • plhs è un array di puntatori agli mxArray delle uscite attese
  • nrhs è il numero di ingressi (rhs - right hand side)
  • prhs è l'array di puntatori agli mxArray dei dati di ingresso, che sono read-only (const)

Si noti che il suffisso dei nomi di queste variabili si riferisce alla loro usuale posizione in una chiamata di funzione nell'ambiente Matlab. All'avvio dell'esecuzione del codice contenuto nel mex-file, i puntatori in plhs sono indefiniti, in quanto è compito del programma definirli esplicitamente (il compilatore non si occuperà di controllare se ciò avvenga).

mxArray

Si tratta di una struttura dati che gestisce i dati del programma e costituisce la rappresentazione in C dei vettori/matrici/string/cell di Matlab

Un mxArray viene dichiarato come una qualsiasi variabile
mxArray *myarray;
ma occorre che esso sia inizializzato con una mx* routine prima di essere usato (ad esempio, mxCreateNumericArray). Si noti che i dati in un mxArray vengono letti/scritti secondo il tipico ordine di Matlab, ovvero in colonna e verso destra, a differenza del C/C++ che li legge in riga e verso il basso.

Le API functions

Le API function prevedono, tra l'altro, le funzionalità per il trasferimento dei dati tra i mex-file e Matlab, la possibilità di richiamare funzioni Matlab dal codice sorgente in C/C++ e l'accesso ai dati contenute in un mxArray. Quelle più usate sono relative alla:
  • creazione di array (mxCreateNumericArray, mxCreateCellArray, mxCreateCharArray);
  • accesso agli array (mxGetPr, mxGetPi, mxGetM, mxGetM, mxGetData, mxGetCell)
  • modifiche agli array (mxSetPr, mxSetPi, mxSetData, mxSetField)
  • controllo di un array (mxIsClass)
  • gestione della memoria (mxMalloc, mxCalloc, mxFree, mexMakeMemoryPersistent, mexAtExit, mxDestroyArray, memcpy)
  • altro (mexEvalString, mexCallMATLAB, mexPrintf, mexWarnMsgTxt )

Una descrizione completa è reperibile in MATLAB External/API Reference Guide.

Di seguito presentiamo un esempio di un mex-file che creare un mxArray per contenere i dati in uscita
#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[])
{
int i, j, m, n;
double *data1, *data2;

if (nrhs != nlhs)
mexErrMsgTxt("The number of input and output arguments must be the same.");

for (i = 0; i < nrhs; i++)
{
/* Find the dimensions of the data */
m = mxGetM(prhs[i]);
n = mxGetN(prhs[i]);

/* Create an mxArray for the output data */
plhs[i] = mxCreateDoubleMatrix(m, n, mxREAL);

/* Retrieve the input data */
data1 = mxGetPr(prhs[i]);

/* Create a pointer to the output data */
data2 = mxGetPr(plhs[i]);

/* Put data in the output array */
for (j = 0; j < m*n; j++)
{
data2[j] = 2 * data1[j];
}
}
}

Altri esempi sono reperibili qui.

Librerie mex in matlab per windows con compilatore gnu

In Matlab, i file MEX (matlab executable) permettono l'esecuzione di propri codici in C/C++ o Fortran direttamente dall'ambiente Matlab come se fossero delle funzioni o routines built-in. I principali vantaggi sono essenzialmente due: la possibilità di utilizzare codice scritto in C/C++ o Fortran senza il bisogno di riscriverlo come script m-file; inoltre, una maggiore efficienza di tale codice (soprattutto nei cicli for) riguardo i tempi di esecuzione.

L'inizializzazione del sistema di compilazione avviene eseguendo
mex -setup
dal prompt di Matlab.
In ambiente Windows, sono supportati una varietà di compilatori, come quelli Borland e Microsoft; tuttavia, in questa sede ci interessa configurare il sistema per l'utilizzo di strumenti GNU e/o open-source, che nativamente non sono presenti nel sistema. Possiamo optare per MinGW oppure per CygWin; noi abbiamo preferito il primo.
Una volta installato il compilatore con tutte le librerie, verificato che le variabili di ambiente sono correttamente configurate, passiamo alla configurazione del sitema mex tramite la comoda utility gnumex.




Tale utility va a creare lo script mexopts.bat che viene richiamato per ogni compilazione, invocando, con i giusti parametri, il compilatore gcc.
Se tutto è andato a buon fine, dovrebbe essere possibile eseguire la compilazione di un codice di esempio fornito con Matlab:
mex yprime.c
Le funzioni implementate nella nuova libreria yprime.dll, generata dalla compilazione del codice C, possono essere invocate come le usuali funzioni di Matlab:
yprime(1,1:4)

ans=
2.0000
8.9685
4.0000
-1.0947

Ulteriori informazioni: