Server Web basati su mSQL e perl mini HOWTO <author>Oliver Corff, <tt/corff@zedat.fu-berlin.de/ <date>v0.1, 17 settembre 1997 <abstract> Questo Mini HOWTO, fortemente ispirato dall'articolo di Michael Schilli <it>Gebunkert: Datenbankbedienung mit Perl und CGI</it>, pubblicato nel computer magazine tedesco iX nell'agosto 1997, descrive come costruire un database client/server SQL utilizzando WWW e HTML per l'interfaccia utente. Documentazione tradotta da Gianmario Parisi, <tt/gianmario.parisi@libero.it/. </abstract> <toc> <sect>Scopi di questo documento <p> <sect1>Destinatari <p> Chiunque voglia installare un server database per il web ma non sa quale software è necessario e come installarlo dovrebbe trarre beneficio dalla lettura di questo testo. Questo testo fornisce tutte le informazioni necessarie per ottenere un database SQL per web server funzionante; esso <em/non/ riguarda alcun dettaglio della programmazione CGI, né spiega il linguaggio SQL. Sono disponibili dei libri eccellenti su entrambi gli argomenti, ed è intenzione di questo testo fornire una piattaforma funzionante sulla quale un utente può in seguito studiare la programmazione CGI e SQL. Per ottenere una piccolo sistema SQL funzionante (non l'esempio del sistema di prenotazione di una grande compagnia aerea, o il database per la gestione di una missione spaziale) sarà sufficiente disporre del software descritto in questo testo e la documentazione che lo accompagna. Il manuale utente di msql (un database introdotto nel testo) fornisce sufficienti informazioni su SQL per costruire il proprio database. Il lettore di questo testo dovrebbe avere una buona conoscenza su come ottenere file via <tt/ftp/ se non ha accesso ai CD-ROM, ed una comprensione di base di come ottenere file binari eseguibili partendo dai sorgenti. In ogni modo, tutti i passi spiegati nel testo sono stati provati su sistemi reali e dovrebbero funzionare sul sistema del lettore. <sect1>Convenzioni usate nel testo <p> Un comando utente: <verb> # make install </verb> Uscita a video d un programma: <tscreen><verb> Programma installato. Leggere README per particolari su come iniziare. </verb></tscreen> Codice d'esempio: <code> # Mio commento char letter; </code> <sect>Introduzione <p> Si può assumere con sicurezza che database con grandi volumi di dati o una complessa struttura relazionale (come, probabilmente, un database lessicale per linguaggio naturale) deve essere accessibile a molti utenti ed operatori simultaneamente. Idealmente, dovrebbe essere possibile usare differenti piattaforme hardware e software esistenti che possono essere combinate nel sistema. Allo scopo di ridurre i costi di implementazione, solo un sistema, il database server, deve essere potente. Le stazioni utente devono tipicamente mostrare i dati e accettare i comandi, ma l'elaborazione è eseguita su una sola macchina, cosa che porta al nome di database client-server. Inoltre, l'interfaccia utente dovrebbe essere facile da mantenere e dovrebbe richiedere il meno possibile sul lato client. Un sistema che soddisfa questi criteri può essere costruito attorno agli elementi seguenti tra protocolli, concetti e software: <descrip> <tag/Linux/ fornisce il sistema operativo. È una implementazione stabile di Unix che fornisce autentici servizi multi-utente e multi-tasking con pieno supporto di rete (TCP/IP e.~a.). Eccetto i costi effettivi dei supporti e di spedizione, è disponibile gratuitamente in forma di cosiddette distribuzioni che di solito includono tutto il necessario dal SO base all'elaborazione testi, scripting, sviluppo software, generatori di interfacce, ecc. <tag/HTML/ è l'Hypertext Markup Language usato per costruire interfacce verso sistemi di rete quale le Intranet ed il World Wide Web. HTML è molto semplice è può essere prodotto con un editor di testo ASCII. <tag/Browser/ sono applicazioni con interfaccia testuale (per~es.~Lynx) o grafica (per~es.~Mosaic, Netscape, Arena ecc.) che accettano, valutano e mostrano documenti HTML. Sono le uniche parti di software utilizzate direttamente dall'utente del database. Utilizzando i browser, è possibile mostrare vari tipi di dati (testo, immagini) e comunicare con server http (vedi nel seguito) su ogni modello di computer per cui sia disponibile un browser. <tag/server http/ forniscono l'accesso all'area di un computer host dove sono immagazzinati i dati destinati ad uso pubblico su una rete. Essi "comprendono" il protocollo http e procurano le informazioni richieste dall'utente. <tag/SQL/ lo Structured Query Language (linguaggio strutturato per interrogazioni) è un linguaggio per manipolare dati in database relazionali. Ha una grammatica molto semplice e costituisce uno standard ampiamente supportato. Database basati su SQL sono diventati il nucleo del classico concetto di database client/server. Ci sono molti famosi sistemi SQL disponibili, come Oracle, Informix, ecc., e poi c'è anche msql disponibile a costo molto basso o nullo se usato in ambienti accademici e di istruzione. <tag/CGI/ la Common Gateway Interface è l'interfaccia di programmazione tra il sistema che mantiene i dati (nel nostro caso un sistema basato su SQL) ed il protocollo di rete (HTML, naturalmente). I CGI possono essere costruiti attraverso molti linguaggi di programmazione, ma un linguaggio particolarmente popolare è il perl. <tag/perl/ è un linguaggio di scripting estremamente potente che combina tutti i meriti del C, di diversi linguaggi shell e dei linguaggi per manipolazione di file come awk e sed. Perl ha moltissime interfacce modularizzate e può essere usato, ad esempio, per controllare database SQL. </descrip> <sect>Procedura di Installazione <p> <sect1>Requisiti Hardware <p> Non possono essere fatte affermazioni generali riguardo i requisiti hardware di un server database. Troppi fattori dipendono dal numero di utenti, dal tipo di applicazione, dal carico di rete ecc. In piccoli ambienti con pochi utenti e scarso traffico di rete una macchina i486-equivalente con 16 Mb di RAM può essere completamente sufficiente. Linux, il sistema operativo, è molto efficiente in termini di risorse, e può fornire abbastanza potenza per eseguire un'ampia varietà di applicazioni allo stesso tempo. Naturalmente, processori più veloci e più RAM significano più velocità, ma molto più importante del processore è l'ammontare di RAM. Più RAM ha il sistema, meno esso è costretto ad eseguire swap di processi su disco nel caso la memoria diventi un collo di bottiglia. Disponendo di 32 MB di RAM ed un bus PCI, operazioni di ricerca e ordinamento possono essere eseguite senza ricorso a file di swap ecc., ottenendo prestazioni velocissime. Il modello di installazione descritto in questo articolo è stato realizzato su un IBM 686 (133 MHz) con 32 MB di RAM ed un hard disk IDE da 1.2 GB. Assumendo che il processo di installazione parta da zero, viene fornita una lista dei passi necessari. <sect1>Requisiti Software <p> Il software descritto in questo articolo è disponibile su Internet o su CD-ROM. Sono stati usati i seguenti prodotti: <itemize> <item> Red Hat Linux PowerTools: Red Hat 4.2 - 6 CD Complete Easy-to-Use estate '97; in alternativa <tt>http://www.redhat.com</tt>; <item> msql SQL database server: è ora disponibile in due versioni. Le versioni differiscono nel numero di transazioni che possono gestire, nell'interfaccia di amministrazione, ecc. La versione più vecchia, 1.0.16, è disponibile dai mirror di Sunsite. Gli eseguibili ELF possono essere trovati a <tt>sunsite:apps/database/sql/msql-1.0.16</tt> o su CD-ROM (disco 4 di InfoMagic Linux Developer's Resource, 6-CD, Dicembre 1996) o alternativamente dalla seguente URL: <tt>http://www.infomagic.com</tt>. La versione più nuova, 2.0.1, può essere direttamente ottenuta dal homepage della Hughes in Australia (<tt>http://www.hughes.com.au</tt>) o da numerosi mirror sparsi per il mondo; <item> perl da CPAN: Il Comprehensive Perl Archive Network. Walnut Creek CDROM, ISBN 1-57176-077-6, Maggio 1997; <item> programmi d'esempio CGI di Michael Schilli's dalla rivista tedesca iX 8/1997, pagine 150--152, disponibile via ftp da <tt>ftp.uni-paderborn.de:/doc/magazin/iX</tt>; </itemize> <sect1>Installazione del sistema operativo <p> Linux è installato nella forma della distribuzione Red Hat 4.2. Allo scopo di installare con successo, la macchina deve avere un drive CD-ROM accessibile da DOS, un drive CD-ROM avviabile (bootable), altrimenti dev'essere preparato un disco di boot seguendo le istruzioni sul CD di Linux. Durante l'installazione l'utente può selezionare e configurare numerosi pacchetti software. È conveniente selezionare i seguenti elementi: <itemize> <item> supporto di rete TCP/IP, <item> il server http Apache, <item> il linguaggio di scripting perl <item> il sistema X Window <item> i browser Arena (grafico) e Lynx (testuale). </itemize> Tutti questi pacchetti sono forniti con la distribuzione Linux. Se questi pacchetti non vengono installati ora, si avrà la possibilità di farlo in seguito con l'assistenza di glint, il gestore per l'installazione software con interfaccia grafica ed intuitiva. Assicurarsi di operare come utente root durante l'installazione dei pacchetti software. Va oltre gli scopi di questo articolo descrivere la procedura di installazione ed inizializzazione della rete. Consultare la documentazione in linea (manpage, HTML, texinfo) e stampata (Linux Bible, ecc.~ecc.). La procedura di installazione di Red Hat è matura e richiede poche attenzioni da parte dell'utente oltre alle scelte usuali (come fornire il nome host ecc.). Una volta terminata con successo l'installazione, il sistema è sostanzialmente pronto per l'esecuzione. Installare il sistema X Window non è obbligatorio per un server puro, ma ciò rende l'accesso al sistema ed il test molto più semplice. La procedura di installazione di X è eseguita con uno qualsiasi tra diversi programmi; XF86Setup offre la più estesa procedura guidata e necessita del minor numero di operazioni manuali per la gestione di fastidiosi dettagli (come programmazione del clock video, ecc.). L'unico requisito è che il software possa rilevare l'adattatore video. Un adattatore video accelerato economico (come schede basate su Trio S64 precedenti a S64UV+) di solito funziona ``al volo''. A questo punto assumiamo che il nostro sistema sia attivo ed in esecuzione e che Apache, Perl e X Window siano stati installati con successo. Si assumerà inoltre che tutte le strutture standard come come file e directory siano mantenute come definito nell'installazione. Ultimo, ma non meno importante, lasceremo l'hostname cosí com'è, e accettiamo in questo momento il nome <tt>localhost</tt>. Useremo questo nome per testare l'installazione. Una volta che l'intero sistema funziona può essere aggiunto il vero nome. Notare che il setup della rete richiede anche di editare il file <tt>/etc/hosts</tt>, tra gli altri. Idealmente questo dovrebbe essere fatto con gli strumenti di amministrazione forniti all'utente root. <sect1>Il server http <p> Il server http fornito con Linux è conosciuto come Apache dagli umani e come httpd dal sistema. La manpage (man httpd) spiega come installare ed avviare il demone http (quindi http<em/d/) ma, come detto, se l'installazione è avvenuta senza problemi, il server dovrebbe essere in esecuzione. Si può verificare l'albero delle directory: deve esserci una directory <tt>/home/httpd/</tt> con tre sottodirectory: <tt>../cgi-bin/</tt>, <tt>../html/</tt> e <tt>../icons/</tt>. In <tt>../html/</tt> deve esserci un file <tt>index.html</tt>. In seguito modificheremo o sostituiremo questo file con l'<tt>index.html</tt> effettivo definito da noi. Tutte le informazioni di configurazione sono registrate in <tt>/etc/httpd/conf/</tt>. Il sistema è ben preconfigurato e non richiede un ulteriore setup se l'installazione non ha subito errori. <sect1>I Browser <p> Ci sono essenzialmente tre tipi di browser disponibili per Linux: sistemi puramente testuali come Lynx, semplici e sperimentali come Arena (gratis!) e commerciali come Netscape (Shareware!) con supporto Java. Mentre Lynx e Arena sono forniti con Linux, Netscape deve essere recuperato da altre fonti. Netscape è disponibile in forma binaria precompilata per Linux su architetture ix86 e potrà essere eseguito ``al volo'' appena estratto dall'archivio. <sect2>Configurazione di Lynx <p> Una volta avviato, Lynx cercherà una URL predefinita solitamente non molto significativa se il sistema non ha un accesso permanente ad Internet. Per cambiare la URL predefinita (e molti altri dettagli di configurazione) l'amministratore di sistema dovrebbe editare <tt>/usr/lib/lynx.cfg</tt>. Il file è grande, circa 57000 byte e contiene informazioni a volte contraddittorie. Esso dichiara la propria home come <tt>/usr/local/lib/</tt>. Non lontano dall'inizio del file c'è una linea che comincia con <tt>STARTFILE</tt>. Rimpiazzare questa linea con la voce seguente: <tt>STARTFILE:http://localhost</tt> assicurandosi che non siano inseriti spazi ecc.~: <code> # STARTFILE:http://www.nyu.edu/pages/wsn/subir/lynx.html STARTFILE:http://localhost </code> Dopo aver salvato il file, Lynx dovrebbe mostrare il nostro documento <tt>index.html</tt> se avviato senza argomenti. <sect2>Configurazione del browser Arena <p> Arena dapprima cerca la propria URL predefinita quando lanciato senza argomenti. Questa è codificata nell'eseguibile ma può essere sovrascritta tramite la variabile d'ambiente <tt>WWW_HOME</tt>. L'amministratore di sistema può inserire la linea <tt>WWW_HOME="http://localhost"</tt> in <tt>/etc/profile</tt>. La variabile deve essere esportata, o tramite una istruzione separate (<tt>export WWW_HOME</tt>) o appendendo <tt>WWW_HOME</tt> all'istruzione export esistente: <code> WWW_HOME="http://localhost" export WWW_HOME </code> Al successivo login, la nuova URL predefinita sarà nota ad Arena a livello di sistema. <sect2>Installazione e configurazione di Netscape <p> Netscape è un prodotto commerciale e quindi non incluso nelle distribuzioni Linux. È scaricabile da Internet o disponibile in collezioni software su CD-ROM. Netscape giunge in forma binaria precompilata per ogni importante piattaforma hardware. Per scopi di installazione, è utile creare una directory <tt>/usr/local/Netscape/</tt> dove scompattare l'archivio. I file possono essere lasciati sul posto (eccetto per le librerie Java: seguire le istruzioni nel file <tt>README</tt> accluso ai binari Netscape), ed è sufficiente creare un link in <tt>/usr/local/bin/</tt> eseguendo il comando <verb> # ln -s /usr/local/Netscape/netscape . </verb> dalla directory <tt>/usr/local/bin/</tt>. Netscape è ora pronto per l'uso e può essere configurato attraverso il menù `Options''. In ``General Preferences'' c'è una scheda ``Appearance'' con il campo ``Home Page Location''. Immettere qui <tt>http://localhost</tt> e non dimenticare di salvare le opzioni (attraverso ``Options'' --- ``Save Options'') prima di uscire da Netscape. All'avvio successivo, Netscape mostrerà l'homepage di Apache. <sect1>Cooperazione tra Apache e i Browser <p> Si può ora condurre il primo test reale del browser e del server http: avviare uno dei browser disponibili e la pagina <tt/Apache: Red Hat Linux Web Server/ apparirà. Questa pagina mostra la locazione dei file e altre informazioni basilari sull'installazione del server http. Se questa pagina non viene mostrata controllare se i file menzionati sopra sono nel posto giusto e se la configurazione del browser è corretta. Chiudere i file di configurazione editati prima di lanciare il browser di nuovo. Se tutti i file sono a posto e la configurazione del browser sembra corretta, esaminare il setup di rete della propria macchina. L'hostname potrebbe essere differente da quello immesso nella configurazione, o il setup di rete potrebbe essere in sé non corretto. È molto importante che <tt>/etc/hosts</tt> contenga almeno una linea come <code> 127.0.0.1 localhost localhost.localdomain </code> che implica la possibilità di connettersi localmente alla propria macchina. Questo è verificabile richiamando uno dei programmi di rete che richiedono un hostname come argomento, come <tt>telnet localhost</tt> (ammesso che <tt>telnet</tt> sia installato). Se l'esecuzione fallisce occorre verificare la configurazione di rete prima di continuare. <sect1>Il Motore Database e la sua installazione <p> L'installazione del database richiede poca preparazione in più rispetto ai passi precedenti. Ci sono pochi motori database SQL disponibili, con differenti prerequisiti per l'amministrazione e l'esecuzione, ed uno dei migliori è msql, o ``Mini-SQL'' di David Hughes. msql è shareware. A seconda della versione utilizzata, è previsto un addebito di 250 dollari USA o più per siti commerciali, 65 dollari o più per utenti privati, mentre enti educativi, formativi e organizzazioni no-profit registrate possono usare il software gratuitamente. I costi esatti sono forniti nelle note di licenza della documentazione del database. Le cifre indicate sono solo un indicatore approssimativo. Alcune parole per giustificare la scelta di msql da parte dell'autore. Prima di tutto, c'è l'esperienza personale. Durante la ricerca di motori database, msql si è dimostrato il più semplice da installare e mantenere, e fornisce una sufficiente copertura del linguaggio SQL tale da soddisfare le esigenze generali. Solo durante la stesura di questo articolo l'autore ha scoperto le seguenti parole nell'Alligator Descartes' DBI FAQ (perl database interface FAQ): <quote> Dal punto di vista dell'autore, se l'insieme di dati è relativamente piccolo, con tabelle inferiori al milione di righe, e meno di mille tabelle in un dato database, allora mSQL è una soluzione perfettamente accettabile per il vostro problema. Questo database è estremamente economico, meravigliosamente robusto ed ha un supporto eccellente. [...] </quote> Msql è disponibile attualmente in due versioni, msql-1.0.16 e msql-2.0.1, che differiscono in prestazioni (non osservabili in progetti di piccola scala) e software allegato (la versione più recente presenta più strumenti, un proprio linguaggio di scripting ecc.). Verranno descritte entrambe le versioni di msql siccome la loro installazioni differisce in alcuni punti. <sect2>Installazione di msql-1.0.16 <p> msql è disponibile in formato sorgente ed in forma binaria compilata con supporto ELF. L'uso dei binari ELF rende l'installazione semplice in quanto l'archivio <tt>msql-1.0.16.ELF.tgz</tt> contiene un albero di directory assoluto e completo, cosicché tutte le directory sono create correttamente quando estratte da <tt>/</tt>. Se si decide di compilare msql-1.0.16 e si intende usare il pacchetto MsqlPerl piuttosto che l'interfaccia DBI (vedere una trattazione dettagliata delle differenze più oltre) tenere presente che MsqlPerl potrebbe segnalare degli errori in fase di test che richiedono l'installazione di una patch per correggere una errata gestione dell'SQL. La patch è descritta nella documentazione MsqlPerl (file <tt/patch.lost.tables/). In particolare le richieste di MsqlPerl includeranno tre linee in <tt/msqldb.c/ dopo la linea 1400 che riporta <tt/ entry->def = NULL;/: <verb> *(entry->DB) = 0; *(entry->table) = 0; entry->age = 0; </verb> La porzione di codice dovrebbe apparire come <code> freeTableDef(entry->def); safeFree(entry->rowBuf); safeFree(entry->keyBuf); entry->def = NULL; *(entry->DB) = 0; *(entry->table) = 0; entry->age = 0; </code> La compilazione di msql richiede diversi passi. Dopo la scompattazione dell'archivio con i sorgenti è necessario costruire una directory destinazione. Questo si ottiene con <verb> # make target </verb> Se tutto va bene, il sistema risponde con <tscreen><verb> Build of target directory for Linux-2.0.30-i486 complete </verb></tscreen> Bisogna ora spostarsi nella directory appena creata ed immettere dapprima il comando <verb> # ./setup </verb> La sequenza <tt>./</tt> è necessaria per assicurarsi di eseguire il comando <tt/setup/ in questa directory e non un altro con lo stesso nome. Verrà richiesto di scegliere la locazione della directory con i sorgenti e se si desidera una installazione come utente root. Una volta che l'utente ha effettuato le scelte il sistema esegue una serie di test per verificare la disponibilità di software (compilatore, utilità ecc.) per terminare col messaggio <tscreen><verb> Ready to build mSQL. You may wish to check "common/site.h" although the defaults should be fine. When you're ready, type "make all" to build the software </verb></tscreen> Si potrà immettere <verb> # make all </verb> Se tutto va come previsto, si leggerà: <tscreen><verb> make[2]: Leaving directory `/usr/local/Minerva/src/msql' <-- [msql] done Make of mSQL complete. You should now mSQL using make install NOTE : mSQL cannot be used free of charge at commercial sites. Please read the doc/License file to see what you have to do. make[1]: Leaving directory `/usr/local/Minerva/src' </verb></tscreen> Tutti i binari devono essere resi visibili dal percorso di ricerca creando dei link software in <tt>/usr/local/bin/</tt>. Spostarsi nella directory ed immettere il comando <verb> # ln -s /usr/local/Minerva/bin/* . </verb> dopo il quale i link saranno impostati correttamente. <sect2>Test di msql-1 <p> Dopo l'installazione è possibile testare se il database funziona. Prima di ogni altra cosa il server (demone) deve essere avviato. L'amministratore di sistema con i privilegi di root immette il comando <verb> # msqld &ero </verb> (non dimenticare di aggiungere il simbolo <tt>&</tt>, altrimenti msql non verrà eseguito in background) dopodiché apparirà il seguente messaggio a schermo: <tscreen><verb> mSQL Server 1.0.16 starting ... Warning : Couldn't open ACL file: No such file or directory Without an ACL file global access is Read/Write </verb></tscreen> Questo messaggio ci informa che ogni cosa funziona ma che non esistono restrizioni di accesso. Per il momento è sufficiente avviare il demone msql da shell, ma in seguito si potrebbe desiderare che il sistema esegua automaticamente il comando per noi. Il comando deve essere inserito in uno script <tt>rc.d</tt> appropriato. Solo ora l'amministratore può immettere il primo comando effettivo di database: <verb> # msqladmin create inventur </verb> msql risponde con <tt>Database "inventur" created.</tt>. Come ulteriore prova, si verifichi che la directory <tt>/usr/local/Minerva/msqldb/</tt> contiene ora la sottodirectory vuota <tt>../inventur/</tt>. Potremmo manipolare il nuovo database con gli strumenti di amministrazione; queste procedure sono tutte coperte in dettaglio dalla documentazione msql. <sect2>Installazione di msql-2.0.1 <p> C'è una versione più recente e più potente del server mSQL di Huges, l'installazione del quale differisce in pochi punti. L'installazione ex-novo di msql-2 implica i passi seguenti. Copiare l'archivio nel punto di estrazione previsto, per esempio <tt>/usr/local/msql-2/</tt>, poi estrarre i file: <verb> # tar xfvz msql-2.0.1.tar.gz </verb> Spostarsi nella directory radice dell'albero di installazione e immettere <verb> # tar xfvz msql-2.0.1.tar.gz </verb> spostarsi in <tt>targets</tt> e cercare il proprio tipo di piattaforma. Dovrebbe esserci una nuova sottodirectory <tt>Linux-</tt><it>(vostra versione)-(vostra cpu)/</it>. Spostarsi in essa ed avviare il programma di setup: <verb> # ./setup </verb> C'è anche un file <tt>site.mm</tt> che può essere editato. Vogliamo conservare il percorso di installazione in <tt>/usr/local/Minerva/</tt> (predefinito per msql 1.0.16)? In questo caso modificare la linea <tt>INST_DIR=...</tt> di conseguenza. Altrimenti, lasciare tutto com'è. Ora possiamo lanciare la compilazione del database <verb> # make # make install </verb> Se tutto va per il vero giusto, vedremo un messaggio come: <tscreen><verb> [...] Installation of mSQL-2 complete. ********* ** This is the commercial, production release of mSQL-2.0 ** Please see the README file in the top directory of the ** distribution for license information. ********* </verb></tscreen> Dopo che tutto è installato correttamente dobbiamo curarci dei dettagli amministrativi. Qui comincia la vera differenza da msql-1. Anzitutto, creare un utente responsabile della amministrazione del database. <verb> # adduser msql </verb> Poi si imposti <tt>msql</tt> come proprietario di tutti i file nella directory mSQL col comando: <verb> # cd /usr/local/Minerva # chown -R msql:msql * </verb> Poi possiamo creare link per tutti gli eseguibili binari del database in <tt>/usr/local/bin/</tt> col comando: <verb> # ln -s /usr/local/Minerva/bin/* . </verb> <sect2>Test di msql-2 <p> Possiamo avviare il server database con il comando <tt>msql2d &</tt>; dovremmo ottenere una risposta simile a questa: <tscreen><verb> Mini SQL Version 2.0.1 Copyright (c) 1993-4 David J. Hughes Copyright (c) 1995-7 Hughes Technologies Pty. Ltd. All rights reserved. Loading configuration from '/usr/local/Minerva/msql.conf'. Server process reconfigured to accept 214 connections. Server running as user 'msql'. Server mode is Read/Write. Warning : No ACL file. Using global read/write access. </verb></tscreen> Ciò sembra perfetto. Il database è compilato ed installato, e possiamo ora continuare con i moduli perl siccome questi si basano in parte sulla presenza di un database funzionante per il test. Incidentalmente, questo è anche un buon momento per stampare il manuale completo fornito con msql-2.0.1: <verb> # gzip -d manual.ps.gz # lpr manual.ps </verb> Possiamo ora procedere con la compilazione delle interfacce, ma è una buona idea mantenere il server SQL attivo ed in esecuzione perché ciò rende il test delle librerie di interfaccia un po' più semplice. <sect1>Scelta delle interfacce: DBI/mSQL, MsqlPerl, Lite <p> Una frase spesso citata del Camel Book (la principale documentazione perl) afferma che c'è più di un modo di ottenere un risultato quando si usa perl. Questo, ahimè, resta vero anche per il nostro modello di applicazione. Ci sono fondamentalmente tre modi di accedere ad un database msql via CGI. Prima di tutto la domanda è se utilizzare o meno perl. Se usiamo perl (su ciò si focalizza questo articolo) potremo ancora scegliere tra due modelli completamente diversi di interfaccia. A fianco del perl, possiamo anche utilizzare il linguaggio scripting di msql, chiamato Lite, che è ragionevolmente semplice e simile al C. <sect2>DBI e DBD-mSQL <p> Al momento della redazione di questo articolo, l'uso della interfaccia perl DBI per l'accesso a database viene preferito. DBI ha alcuni vantaggi: fornisce un controllo unificato di accesso ad un numero di database commerciali per mezzo di un unico insieme di comandi. Il database effettivamente in uso su un dato sistema è poi contattato attraverso un driver che nasconde efficacemente le peculiarità del database al programmatore. Cosí, l'uso di DBI permette una agevole transizione tra differenti database di differenti produttori. In un singolo script è possibile contattare diversi database. Fare riferimento alle DBI-FAQ per i dettagli. C'è, tuttavia, uno svantaggio: l'interfaccia DBI è ancora in fase di sviluppo e i numeri di versione aumentano rapidamente (talvolta gli aggiornamenti si hanno in meno di un mese). Analogamente, anche i singoli driver di database sono aggiornati frequentemente e possono riferirsi a specifiche versioni dell'interfaccia di database. Utenti che effettuano nuove installazioni dovrebbero attenersi strettamente ai numeri di versione dati in questo articolo perché altre versioni possono causare problemi di compilazione e di test la risoluzione dei quali non è cosa per gente debole di cuore. <sect2>MsqlPerl <p> MsqlPerl è una libreria per l'accesso a msql direttamente da script perl. Essa scavalca l'interfaccia DBI ed è piuttosto compatta. Sebbene essa lavori bene con entrambe le versioni di msql, il suo uso non è più consigliato a vantaggio dell'interfaccia DBI generalizzata. Nondimeno, in un contesto specifico, MsqlPerl può risultare la scelta giusta grazie alle dimensioni contenute ed alla facilità di installazione. Da notare, essa ha meno dipendenze dalla versione di quelle rivelate dall'interazione di DBI con diversi driver di database. <sect2>Il linguaggio scripting di msql: Lite <p> Ultimo ma non meno importante, msql-2 possiede un suo linguaggio di script: Lite. Il linguaggio è un parente stretto del C, snellito dalle sue stranezze e arricchito con caratteristiche di tipo shell (in sintesi, qualcosa di simile ad una versione di perl molto specializzata). Lite è un linguaggio semplice ed è ben documentato nel manuale msql-2. Il pacchetto msql-2 fornisce anche una applicazione di esempio basata su Lite. Non descriveremo Lite in questa sede perché esso è specifico di msql-2, e perché si assume che i lettori di questo articolo abbiano un interesse ed una comprensione di base del perl. Nondimeno un approfondimento di Lite è altamente raccomandato: Lite può fornire la soluzione vincente in un ambiente basato esclusivamente su msql-2 (senza ricorso ad altri database), grazie alla sua concezione semplice e diretta. <sect1>La via generale: DBI e DBD-msql <p> Assumiamo che perl sia stato installato durante il setup di sistema o attraverso il gestore pacchetti summenzionato. Non daremo altri dettagli qui. Per verificare che la versione di perl sia aggiornata eseguiamo: <verb> # perl -v </verb> perl dovrebbe rispondere col seguente messaggio: <tscreen><verb> This is perl, version 5.003 with EMBED Locally applied patches: SUIDBUF - Buffer overflow fixes for suidperl security built under linux at Apr 22 1997 10:04:46 + two suidperl security patches Copyright 1987-1996, Larry Wall </verb></tscreen> Probabilmente, tutto è a posto. Il passo successivo include l'installazione delle librerie perl per database in generale (DBI), il driver msql (DBD-mSQL) e CGI. Il driver CGI è necessario in ogni caso. Sono necessari i seguenti archivi: <enum> <item> DBI-0.81.tar.gz <item> DBD-mSQL-0.65.tar.gz <item> CGI.pm-2.31.tar.gz (or successivo) </enum> Qui occorre una puntualizzazione per i neofiti: l'installazione di test descritta qui funziona bene utilizzando software con <em/esattamente/ questi numeri di versione, mentre combinazioni di altre versioni falliscono per un motivo o per l'altro. Il debug di combinazioni di versioni difettose è sconsigliabile a chi non abbia grande familiarità con i dettagli delle convenzioni di chiamata delle interfacce ecc. In alcuni casi un metodo può essere semplicemente rinominato pur effettuando lo stesso compito, ma a volte la struttura interna cambia significativamente. Quindi, ancora una volta, è necessario mantenere i numeri di versione qui indicati se si vuole operare in sicurezza, anche se nel frattempo fossero comparse versioni successive. Aggiornamenti frequenti di queste interfacce sono una regola piuttosto che un'eccezione, quindi l'installazione di versioni differenti da quelle indicate può essere fonte di problemi. È molto importante che il driver di database per mSQL (DBD-mSQL) sia installato <em/dopo/ l'interfaccia generica DBI. Si comincerà creando la directory <tt>/usr/local/PerlModules/</tt> siccome è molto importante mantenere l'albero originale delle directory perl intatto. Potremmo anche scegliere un nome di directory diverso siccome il nome non è assolutamente critico, e sfortunatamente ciò non è specificato nei file README dei vari moduli perl. Dopo aver copiato gli archivi suddetti in <tt>/usr/local/PerlModules/</tt> li scompattiamo con <verb> # tar xzvf [file-archivio] </verb> per ognuno dei tre archivi. Non dimenticare di fornire il nome di file corretto a <tt>tar</tt>. Il processo di installazione per i tre moduli è essenzialmente standardizzato; solo i messaggi a schermo che mostrano passi significativi per i singoli pacchetti sono riportati nel seguito. <sect2>Installazione dell'interfaccia database di perl - DBI <p> L'interfaccia verso il database deve sempre essere installata prima del driver di database specifico. La scompattazione dell'archivio DBI crea la directory <tt>/usr/local/PerlModules/DBI-0.81/</tt>. Spostandosi nella directory, si trovano un file <tt>README</tt> (che andrebbe letto) ed un perl-Makefile (estensione .PL). Diamo il comando <verb> # perl Makefile.PL </verb> Il sistema dovrebbe rispondere con un lungo messaggio la cui parte importante è mostrata qui: <tscreen><verb> [...] MakeMaker (v5.34) Checking if your kit is complete... Looks good NAME => q[DBI] PREREQ_PM => { } VERSION_FROM => q[DBI.pm] clean => { FILES=>q[$(DISTVNAME)/] } dist => { DIST_DEFAULT=>q[clean distcheck disttest [...] Using PERL=/usr/bin/perl WARNING! By default new modules are installed into your 'site_lib' directories. Since site_lib directories come after the normal library directories you MUST delete old DBI files and directories from your 'privlib' and 'archlib' directories and their auto subdirectories. Writing Makefile for DBI </verb></tscreen> Questo dovrebbe andare bene, come indicato dal programma (looks good), e possiamo procedere col passo successivo: <verb> # make </verb> Se non si hanno messaggi di errore (il protocollo dettagliato mostrato a schermo <em/non/ è un messaggio di errore) si testi la nuova libreria installata con il comando <verb> # make test </verb> Osservare le seguenti linee di output (effettuare lo scroll all'indietro con <tt/[Shift]-[PgUp]/): <tscreen><verb> [...] t/basics............ok t/dbidrv............ok t/examp.............ok All tests successful. [...] DBI test application $Revision: 1.20 $ Switch: DBI-0.81 Switch by Tim Bunce, 0.81 Available Drivers: ExampleP, NullP, Sponge ExampleP: testing 2 sets of 5 connections: Connecting... 1 2 3 4 5 Disconnecting... Connecting... 1 2 3 4 5 Disconnecting... Made 10 connections in 0 secs ( 0.00 usr 0.00 sys = 0.00 cpu) test.pl done </verb></tscreen> Il passo finale è quello di installare tutti i file nelle directory appropriate. Ciò si ottiene col comando <verb> # make install </verb> Non resta altro. Se per qualche ragione l'installazione fallisce e deve essere rieseguita non dimenticarsi di eseguire prima <verb> # make realclean </verb> Questo rimuove i resti indesiderati della precedente installazione. Si possono anche rimuovere i file installati copiando il contenuto dello schermo (mostrato abbreviato) <tscreen><verb> Installing /usr/lib/perl5/site_perl/i386-linux/./auto/DBI/DBIXS.h Installing /usr/lib/perl5/site_perl/i386-linux/./auto/DBI/DBI.so Installing /usr/lib/perl5/site_perl/i386-linux/./auto/DBI/DBI.bs [...] Writing /usr/lib/perl5/site_perl/i386-linux/auto/DBI/.packlist Appending installation info to /usr/lib/perl5/i386-linux/5.003/perllocal.pod </verb></tscreen> in un file, rimpiazzando ogni occorrenza di <tt/Installing/ con <tt/rm/. Se tale file viene chiamato <tt/uninstall/ si può poi eseguire <verb> # . uninstall </verb> che rimuoverà i file installati. <sect2>Il driver msql di perl DBD-mSQL <p> Il driver msql può essere installato soltanto <em/dopo/ la felice installazione dell'interfaccia generica per database di perl. I passi fondamentali sono gli stessi di sopra; così avremo dapprima <verb> # perl Makefile.PL </verb> Qui, il sistema dovrebbe rispondere con un invito alla lettura della documentazione a corredo. Esso rileverà poi dove risiede msql, e chiederà quale versione è in uso. <tscreen><verb> $MSQL_HOME not defined. Searching for mSQL... Using mSQL in /usr/local/Hughes -> Which version of mSQL are you using [1/2]? </verb></tscreen> inserire il numero di versione corretto. Seguiranno poche linee di testo. Osservare le seguenti: <tscreen><verb> Splendid! Your mSQL daemon is running. We can auto-detect your configuration! I've auto-detected your configuration to be running on port: 1114 </verb></tscreen> Si può ora testare il driver con <verb> # make test </verb> Di nuovo, segue un output piuttosto lungo. Se esso termina con <tscreen><verb> Testing: $cursor->func( '_ListSelectedFields' ). This will fail. ok: not a SELECT in msqlListSelectedFields! Re-testing: $dbh->do( 'DROP TABLE testaa' ) ok *** Testing of DBD::mSQL complete! You appear to be normal! *** </verb></tscreen> si è sulla buona strada ed è possibile installare il driver con <verb> # make install </verb> Questo conclude le operazioni di installazione; il prossimo paragrafo riguarda MsqlPerl e se si è scelto l'uso di DBI può essere saltato. <sect1>L'interfaccia MsqlPerl <p> Se si decide di usare esclusivamente l'interfaccia MsqlPerl non occorre il driver di database generico, ma solo <tt/MsqlPerl-1.15.tar.gz/, siccome, come detto in precedenza, MsqlPerl fornisce una interfaccia diretta tra server database e perl senza l'uso dell'interfaccia DBI. Installazione e test sono immediati. Dopo aver eseguito <tt>perl Makefile.PL</tt> l'utilità make può essere avviata. Dapprima occorrerà rispondere alla domanda su dove risiede msql. Se msql è in <tt>/usr/local/Minerva/</tt> si potrà confermare la risposta di default. Poi eseguire <tt>make test</tt>. Prima di ciò bisogna assicurarsi di avere un database chiamato <tt>test</tt> e di possedere i diritti di lettura/scrittura su di esso. Tale database può essere creato con <verb> # msqladmin create test </verb> <sect1>La libreria CGI di perl <p> L'installazione del componente CGI di perl è il più semplice dei tre passi. È sufficiente eseguire i comandi seguenti nell'ordine dato e tutto è fatto: <verb> # perl Makefile.PL # make # make install </verb> Diversamente dai driver precedenti questa interfaccia non ha una opzione di test (<tt># make test</tt>) siccome gli altri moduli <em/devono/ essere testati in ogni caso. Viene anche creata una sottodirectory con script CGI di esempio. È possibile copiare i contenuti di questa directory in <tt>/home/http/cgi-bin/</tt> ed usare il browser per sperimentare gli script. <sect1>Lista di controllo dell'installazione <p> Abbiamo compiuto i passi seguenti, nell'ordine dato: <enum> <item> Installazione di Linux con supporto di rete <item> Installazione di un server http (Apache) <item> Installazione di un browser (Arena, lynx o Netscape) <item> Installazione di un server SQL (msql) <item> Installazione di una interfaccia perl SQL <item> Installazione dei file CGI </enum> Infine, è possibile fare un po' di pulizia. Tutti i rami di directory contenenti i sorgenti per le installazioni possono essere rimossi (tuttavia, non vanno cancellati gli archivi originali!) siccome tutti i file binari e la documentazione si trovano in directory differenti. <sect>Esecuzione di un database di esempio <p> Dopo il completamento dell'installazione del sistema si può finalmente eseguire una modello di applicazione. A seconda della versione di msql installata e dell'interfaccia perl utilizzata si dovrà modificare il programma di esempio in qualche punto. Innanzitutto, il file <tt/index.html/ posto in <tt>/home/httpd/html/</tt> deve essere modificato per permettere di richiamare l'applicazione database campione. È possibile porre il database (che verrà chiamato <tt/database.cgi/ o <tt/inventur.cgi/ nonostante il nome del file <tt/perl.lst.ck/) nella directory <tt>/home/httpd/html/test/</tt>. Per ottenere lo scopo, appendere una linea (naturalmente dipendente dalle scelte di installazione) simile alla seguente nel file <tt/index.html/: <code> <LI>Test the <A HREF="test/database.cgi">Database, DBI:DBD-mSQL style!&etago;A> <LI>Test the <A HREF="test/inventur.cgi">Database, MsqlPerl style!&etago;A> </code> Solitamente si dovrebbe mantenere una sola di queste due scelte, ma disponendo di entrambi i tipi di interfaccia database installata è possibile lasciare entrambe le linee così come sono. Sarà in seguito possibile comparare le prestazioni, ecc. <sect1>Adattamento dello script di esempio per MsqlPerl <p> Allo script campione deve essere notificato l'uso dell'interfaccia MsqlPerl. Le modifiche intervengono in diversi punti. Dapprima, vicino all'inizio del file, rimpiazzare la clausola <tt/use/: <code> # # use DBI; # Interfaccia Database Generica use Msql; </code> Poi, alla linea 27, la sintassi MsqlPerl non richiede la menzione di un driver specifico: <code> # $dbh = DBI->connect($host, $database, '', $driver) || $dbh = Msql->connect($host, $database) || </code> Poi, dalla linea 33 per tutto l'intero script, bisogna modificare tutte le istanze di <tt/do/ con <tt/query/: <code> # $dbh->do("SELECT * FROM hw") || db_init($dbh); $dbh->query("SELECT * FROM hw") || db_init($dbh); </code> Infine, la linea 207 deve essere commentata: <code> # $sth->execute || msg("SQL Error:", $sth->errstr); </code> Inoltre, può diventare necessario scambiare tutte le chiamate <tt/errstr/ come quella nel precedente frammento di codice con <tt/errmsg/. Anche questa scelta dipende dalla versione. Dopo queste modifiche, lo script dovrebbe girare senza intoppi. <sect1>Adattamento dello script di esempio per for msql-2 <p> La sintassi SQL è stata ridefinita durante lo sviluppo di msql-2. Lo script originale fallirà l'esecuzione delle istruzioni di inizializzazione tabella nelle linee 45 -- 58. Il modificatore <tt/primary key/ non è più supportato da msql-2, e dovrebbe essere semplicemente evitato: <code> $dbh->do(<<EOT) || die $dbh->errstr; # Neue Personen-Tabelle create table person ( # We do not need the 'primary key' modifier anymore in msql-2! # pn int primary key, # Personalnummer pn int, # Personalnummer name char(80), # Nachname, Vorname raum int # Raumnummer ) EOT $dbh->do(<<EOT) || die $dbh->errstr; # Neue Hardware-Tabelle create table hw ( # We do not need the 'primary key' modifier anymore in msql-2! # asset int primary key, # Inventurnummer asset int, # Inventurnummer name char(80), # Bezeichnung person int # Besitzer ) EOT </code> Sfortunatamente, questo script accetterà nuovi elementi con identico numero di personale; il modificatore msql-1 <tt/primary key/ intende prevenire esattamente questo comportamento. La documentazione msql-2 mostra come usare la clausola <tt/CREATE INDEX/ per ottenere elementi univoci. <sect>Conclusione e Riepilogo <p> Se si è installato msql-2 sul proprio sistema si può dare un'occhiata ai programmi d'esempio scritti in Lite, il linguaggio di scripting proprietario di msql-2. Entrambe le versioni di msql sono fornite con un insieme base di strumenti di amministrazione che permettono all'utente di creare e cancellare tabelle (<tt/msqladmin/) e di esaminare le strutture di database (<tt/relshow/). La seconda generazione di msql (cioè msql-2) presenta qualche strumento in più: <tt/msqlimport/ e <tt/msqlexport/. Questi permettono l'esportazione e l'importazione di dati sotto forma di file di testo da e verso database SQL. Possono essere usati per il caricamento di quantità di dati esistenti <em/d'un colpo/ in tabelle già create, o l'estrazione di dati da tabelle, in modo che l'utente non debba scrivere <em/alcuna/ linea di perl o SQL o qualsiasi altro codice per questi compiti. Se si desidera scrivere propri script perl per l'interazione con database si troverà sufficiente supporto nei file di esempio e nella estensiva documentazione in linea fornita col modulo DBI. Ad ogni modo, si è ora pronti per cominciare e presentare i propri dati ad utenti della propria rete, o anche del Web. </article>