F O C U S Open Source Il boom dell’Open Source ha imposto ai colossi dell’informatica di considerare questi particolari prodotti alla stregua dei software convenzionali. Oracle non si è fatta pregare, vediamo cosa è venuto fuori da questo connubio Oracle Oracle ed Open Source una strana coppia? [email protected] di Massimo Ruocchio È laureato in matematica ed è certificato Oracle Application Developer. Si occupa di analisi, progettazione e sviluppo di applicazioni software. P 40 CP 112 ochi anni fa il software open source era considerato “roba da smanettoni”. Nessuno immaginava che questa filosofia avrebbe, in così poco tempo, varcato i cancelli delle più grandi industrie di informatica al mondo. La svolta si è avuta quando le grandi corporate si sono rese conto di poter essere tagliate fuori da una grossa fetta di mercato. Si stava facendo strada, infatti, il cosiddetto “paradigma LAMP” (Linux come sistema operativo, Apache come web server, MySQL come database e Perl come linguaggio di scripting) tutto basato sulla filosofia open source. A quel punto c’erano solo due possibilità: scendere allo stesso piano delle applicazioni open source e combattere oppure farsele amiche. Oracle ha scelto, nella maggior parte dei casi, la seconda possibilità. In quest’articolo vedremo come Oracle ha cercato non di battere, ma di entrare a far parte del “paradigma LAMP”. Parleremo delle partnership con Linux e Apache, dell’integrazione con Perl e della guerra dichiarata ai (dai) database open source. Oracle e Linux La svolta nelle relazioni tra Oracle e l’open source si è verificata nel Luglio del 1998. Durante l’Open World, Oracle annunciò al mondo il rilascio imminente della versione 8i per Linux. Il rilascio avvenne effettivamente il 7 di Ottobre del 1998. Contestualmente Oracle cominciò a distribuire gratuitamente le personal edition dei suoi prodotti. Il passo più importante verso il mondo dell’open source era stato fatto. Gli “smanettoni”, tutti rigorosamente muniti di workstation Linux, potevano liberamente scaricare il database Oracle ed utilizzarlo per le loro applicazioni open source. Di più: Oracle riconosceva a Linux, costruito da un gruppo di ragazzi e distribuito gratis in Internet, pari dignità rispetto agli altri sistemi operativi prodotti secondo i processi classici di ingegneria del software e venduti a prezzi molto salati. Dal punto di vista tecnico la versione Linux di Oracle è molto simile alla versione per Unix. Per i DBA che lavorano con Linux c’è la difficoltà, rispetto a quelli che lavorano con NT, di non avere a disposizione uno strumento grafico che li aiuti nel loro mestiere. Tutto va fatto da linea di comando. Di contro c’è il vantaggio di poter amministrare il sistema da remoto senza dover sedere obbligatoriamente alla console. Sotto Linux Oracle viene eseguito in processi separati. Ciò causa una leggera perdita di performance ma garantisce una maggiore sicurezza nelle transazioni con conseguente maggiore integrità dei dati coinvolti. Se il prodotto che si sta installando è Oracle 9i Application Server, su Linux (e su Unix) si ottengono performance decisamente migliori che su NT. Ciò grazie alla maggiore velocità del web server Apache (che viene utilizzato da Oracle9iAS, come vedremo nel prossimo paragrafo) sui sistemi che utilizzano più processi paralleli anziché più thread nello stesso processo. Infine Linux su sistemi a 32 bit ha la limitazione della dimensione massima dei file di due gigabyte. Questo può influenzare la creazione dei datafile da associare ai tablespace, ma non è un grosso problema. Infatti in Oracle è possibile associare più datafile allo stesso tablespace. In ogni caso su sistemi a 64 bit non ci sono limitazioni pratiche nel dimensionamento dei file. A quanto pare la strategia di Oracle è stata premiata. La rivista Linux Journal (http:// www.linuxjournal.com) ha eletto Oracle miglior database per Linux per l’anno 2001. Nel 2000 il premio era andato a PostgreSQL, un database open source di cui parleremo più avanti. 5. La procedura PL/SQL genera una pagina HTML utilizzando i dati e PL/SQL Web Toolkit; 6. La risposta è inviata a PL/SQL Gateway; 7. Il web server invia la risposta al client. PL/SQL Web Toolkit è un insieme di package che consentono di costruire una pagina HTML con i dati presenti sul database. DAD sta per Database Access Descriptor, un DAD contiene le informazioni su come connettersi ad un database: DNS name, username, password e connect string. FIGURA 1 I passi che si realizzano quando il server riceve una richiesta da soddisfare con PL/SQL Gateway Oracle ed Apache Dopo avere aperto le porte al mondo dell’open source realizzando una versione del database per Linux, Oracle è andata molto oltre includendo un prodotto open source nel proprio software. Con il rilascio di Oracle 9i Application Server, infatti, Oracle ha abbandonato il vecchio web server Spyglass sostituendolo con il web server open source Apache. Perché? Semplice: Apache è migliore di Spyglass! Oracle9iAS con Apache è fino ad 8 volte più veloce della precedente versione con Spyglass. Già la precedente versione di OAS era compatibile con Apache, ma molti preferivano comunque utilizzare Spyglass perché era fornito insieme all’Application Server. L’architettura di Apache si presenta in forma “modulare”, Oracle9iAS fornisce vari moduli Apache per Java 2, SSL, PL/SQL, Perl, CGI ecc… In particolare è interessante dare uno sguardo al modulo Apache per il PL/SQL denominato MOD_PLSQL. MOD_PLSQL è lo strumento con cui Oracle9iAS (mediante PL/SQL Gateway) soddisfa le richieste che contengono PL/SQL o chiamate a procedure residenti sul database (il database deve essere versione 8, 8i o 9i). In Figura 1 sono rappresentati i passi che si realizzano quando il server riceve una richiesta da soddisfare con PL/SQL Gateway: 1. Oracle HTTP Server (il web server Apache) riceve la richiesta di una pagina basata su PL/SQL; 2. La richiesta viene girata a PL/SQL Gateway; 3. La richiesta viene girata al database utilizzando per la connessione le informazioni contenute nel DAD; 4. PL/SQL Gateway determina i parametri da utilizzare e invoca le procedure PL/SQL residenti sul database; Un problema nell’utilizzo di MOD_PLSQL è l’architettura multi-processo di Apache. In particolare se una richiesta viene suddivisa in molte sotto-richieste inviate al server, Apache stabilirà una diversa connessione col database per ogni sotto-richiesta. Ciò genera problemi se si intendono utilizzare variabili pubbliche dei package che restano valorizzate nella sessione e dunque si resettano per ogni sotto-richiesta. Per utilizzare PL/SQL Gateway, e quindi MOD_PLSQL, l’URL da utilizzare nel browser dovrà avere la seguente forma: protocollo://host[:porta]/prefisso/DAD/[!] [schema.][package.]nome_proc[?parametri] dove protocollo è http oppure https host è la macchina dove gira il web server porta è la porta utilizzata dall’application server (80 per default) prefisso è il path virtuale utilizzato per indicare al web server le richieste da indirizzare alla PL/SQL Gateway. Prefisso viene dichiarato in fase di confi- 41 CP 112 F O C U S Open Source gurazione del web server e vale “pls” per default DAD è il DAD da utilizzare ! è un carattere che indica al web server di utilizzare lo schema “flessibile” per il passaggio dei parametri. In questo schema i parametri da passare sono un numero variabile, è utile se l’utente può decidere liberamente quanti e quali parametri passare mediante un apposito form HTML Schema è il nome dell’utente Oracle proprietario della procedura da eseguire Package è il nome del package di cui fa parte la procedura da eseguire nome_proc è il nome della procedura da eseguire ?parametri sono i parametri da passare alla procedura, indicati per nome oppure in array in caso di schema “flessibile”. «Perl è un linguaggio di programmazione interpretato ottimizzato per la ricerca in qualunque tipo di file di testo, per l’estrazione di informazioni da questi file e per stampare report basati sulle informazioni estratte. È anche un buon linguaggio per molte attività di gestione dei sistemi. Il linguaggio vuole essere pratico (facile da usare, efficiente, completo) piuttosto che bello (piccolo, elegante, minimo). Combina (secondo l’autore, in ogni modo) alcune delle migliori funzionalità dei linguaggi C, sed, awk e sh, quindi le persone che hanno familiarità con questi linguaggi dovrebbero avere poche difficoltà con perl. (Gli storici dei linguaggi noteranno delle tracce di csh, Pascal ed anche di BASIC|PLUS.) La sintassi delle espressioni è molto vicina a quella del C. Se avete un problema per cui normalmente usereste sed o awk o sh, ma che eccede le capacità di quei linguaggi oppure deve essere eseguito ad una velocità leggermente superiore, e non volete scrivere le cose più banali in C, allora perl fa per voi. Ci sono anche dei traduttori per convertire i vostri script sed o awk in script perl. OK, l’ho elogiato già abbastanza.» RIQUADRO 1 Il commento con cui Wall accompagnò il rilascio di Perl sul newsgroup alt.comp.sources. (18 Dicembre 1987) Un esempio di URL potrebbe essere http://www.miosito.it:1800/pls/mioDAD/ ordini.inoltra?ord_id=2453 Nel caso in cui la procedura da chiamare sia definita più volte nel database con parametri che hanno lo stesso nome (ed ovviamente sono di tipo diverso) la chiamata va in errore. In caso di overloading di procedure, dunque, bisogna denominare i parametri in maniera diversa nelle diverse implementazioni della procedura. tuttora, vincere la concorrenza dei database open source. Su quali armi può contare Oracle per sconfiggere la concorrenza? Innanzi tutto la popolarità del marchio, affidarsi ad un nome noto fa dormire meglio la notte. Poi la stabilità del prodotto, se c’è un bug su Oracle i tempi di risoluzione non saranno brevissimi ma la soluzione sarà presumibilmente affidabile e risolverà contemporaneamente anche altri problemi. Se c’è un problema su un database open source qualcuno si occuperà di fare una patch, magari in tempi brevi, per quello specifico problema, ma ciò influenzerà negativamente la stabilità del prodotto. Inoltre c’è il problema dell’education e del supporto tecnico, trovare manuali, corsi e consulenti Oracle è facile come comprare una fetta di prosciutto, trovare supporto qualificato per postgreSQL o per MySQL è decisamente più complesso. Ed i vantaggi di usare altri database? Il costo, il costo ed … il costo. E pure la possibilità di fruire liberamente del codice sorgente del prodotto. I due più diffusi database open source in circolazione sono MySQL e PostgreSQL. MySQL è molto limitato, gestisce il lock solo a livello di tabella, non gestisce per niente database trigger, foreign key, rule, subselect e view. PostgreSQL ha quasi tutte le funzionalità avanzate dei database commerciali e, con il rilascio della versione 7.1, ha raggiunto anche livelli di performance più che soddisfacenti. PostgreSQL ha delle “estensioni” che facilitano la migrazione da Oracle. Anche Oracle ha sviluppato il suo prodotto per la migrazione da altri database, Oracle migration workbench. Tra i prodotti da cui è possibile migrare verso Oracle è incluso MySQL. In Tabella 1 sono rappresentati, per ogni database, gli oggetti che possono essere migrati mediante Oracle migration workbench. L’inclusione di MySQL nella lista della “concorrenza riconosciuta” ha inorgoglito non poco gli appassionati di open source e, soprattutto, quelli che avevano scelto MySQL come database. Esempi di grandi aziende oppure enti che hanno scelto MySQL? Yahoo! e la NASA, mica male! Qualcuno si sarà chiesto se Oracle ha provato a sviluppare codice open source. Ebbene sì, ma con scarsi risultati. Oracle aveva preso in considerazione la possibilità di sviluppare in modalità open source alcune librerie di algoritmi per la crittografia. Dopo pochi mesi il tentativo è stato abortito. Ci si è resi conto che non si riusciva a fornire un supporto soddisfacente ai clienti. Questo è tutto per i database open source, ora parliamo di Perl. Oracle e Perl Oracle ed i DB Open Source 42 CP 112 L’integrazione con Linux, Apache e con i linguaggi di scripting (come vedremo) era un passo necessario che Oracle doveva compiere per entrare nel mondo degli “smanettoni”. Il passo successivo era, ed è Perl (Practical Extraction and Report Language) è il linguaggio di scripting open source più diffuso. Perl è nato nel 1987 per opera di Larry Wall. Lo scopo di Wall era la costruzione di un linguaggio con cui fosse possibile estrarre informazioni da generici file e creare report delle inforLISTATO 1 Un semplice script Perl che utilizza DBD::Oracle mazioni estratte. Nel Riquadro 1 è possibile leggere (tradotto in italiano) il use DBI; commento che Wall scrisse il 18 Dicembre 1987 per accompagnare il rilascio di my $id_db = DBI->connect(‘DBI:Oracle:ordini’) Perl sul newsgroup alt.comp.sources. or die “Impossibile connettersi al database:“ . DBI->errstr; my $id_st = $id_db->prepare(‘SELECT stato, note FROM Ordini Vediamo come ci si connette da Perl WHERE Ord_id = ?’) or die “Impossibile creare l’istruzione ad Oracle. In generale per la conda eseguire: “ . $id_db->errstr; nessione a database, Perl è munito di print “Numero Ordine> “; una interfaccia chiamata DBI (Database while ($Ordid = ) { Interface). DBI è una interfaccia molto chomp $Ordid; semplice con cui è possibile dichiarare $id_st->execute($Ordid) or die “Impossibile eseguire l’istruzione: “ . $id_st->errstr; quali istruzioni si vogliono inviare al database e leggere i dati su db. DBI non my ($stato, $note); conosce il linguaggio dei singoli data$id_st->bind_columns(\$stato, \$note); base, l’implementazione delle istruzioni while ($id_st->fetch()) { viene realizzata mediante appositi driver print “Ordine $Ordid Stato: $stato ($note)\n”; diversi per ogni database. } Il driver utilizzato per connettersi ad if ($id_st->rows == 0) { Oracle si chiama DBD::Oracle. Questo print “L’ordine $Ordid non esiste.\n”; tipo di interfaccia garantisce una eccel} lente portabilità. Se si intende svilup$id_st->finish; pare con un database MySQL ma il print “\n”; database di produzione è Oracle basta, print “Numero Ordine> “; } infatti, sostituire il driver DBD::mysql con il driver DBD::Oracle. $id_db->disco Il codice Perl resta invariato perché in Perl si utilizza solo DBI. Vediamo un dichiara la variabile id_db (identificatore del dataesempio. Vogliamo realizzare uno script che, dato il base) e ci mette dentro il valore di ritorno della funnumero di un ordine, restituisca lo stato dell’ordine zione connect che si connette al database ordini utilize le eventuali note. zando il driver per Oracle. La stringa DBI:Oracle Le informazioni sono contenute nella tabella è l’unica cosa di questo programma che deve essere Ordini presente nel database ordini. Il Listato 1 conmodificata per utilizzare un altro database. or die tiene lo script per intero, analizziamo le singole istruserve a gestire le eccezioni, in caso di errore bisogna zioni. L’istruzione use DBI; serve a caricare DBI, abortire il processo visualizzando il messaggio “Imposquale driver utilizzare lo diremo dopo. sibile connettersi al database” e l’errore che è occorso. my $id_db = DBI->connect(‘DBI:Oracle:ordini’) or die “Impossibile connettersi al database: “ . DBI->errstr; my $id_st = $id_db->prepare(‘SELECT stato, note FROM Ordini WHERE Ord_id = ?’) TABELLA 1 Gli oggetti che possono essere migrati per ogni database, mediante Oracle migration workbench FEATURE SUPPORT ACCESS Tables Views Indexes Groups/Roles Users Constraints Priviliges User Defined Types Stored Procedures Triggers Embedded SQL Y Y(Queries) Y N/A Y Y (validation rules) Y Y N/A N/A N/A to Pro*C Relations, Link Tables. Application code reuse Other Features INFORMIX & SYBASE Y Y Y Y Y Y Y N/A Y Y ESQL/C N/A SQL SERVER Y Y Y Y Y Y Y Y Y Y N/A N/A MYSQL Y N/A Y N/A Y Y Y Y N/A N/A N/A ENUM support DB2/400 Y Y Y N Y Y Y N N N N N/A 43 CP 112 F O C U S Open Source or die “Impossibile creare l’istruzione da eseguire: “ . $id_db->errstr; tutte le righe restituite dalla select. Per ogni riga, lo stato e le note dell’ordine vengono stampati a video con l’istruzione print “Ordine $Ordid Stato: $stato $note\n”; è simile all’istruzione precedente, dichiara id_st (identificatore dello statement da eseguire), lo prepara (effettua un parsing) e gestisce un eventuale errore. Il carattere “?” è un jolly a cui sarà sostituito il valore inserito dall’utente. print “Numero Ordine> “; è il prompt per l’utente ed il while che segue non fa altro che ripetere la richiesta fin quando l’utente digita qualcosa. Chomp elimina il carattere di invio a fine input. $id_st->execute($Ordid) or die “Impossibile eseguire l’istruzione: “ . $id_st->errstr; Questa istruzione esegue lo statement passando il valore inserito dall’utente e gestisce gli eventuali errori al solito modo. my ($stato, $note); $id_st->bind_columns(\$stato, \$note); Dopo aver dichiarato due variabili, le colleghiamo ai valori restituiti dalla select mediante l’istruzione bind_columns. Il while che segue effettua il fetch di BIBLIOGRAFIA [1] A. Duncan, S. Hull – “Oracle & Open Source”, O’Reilly, 2001 [2] U. Ogbuji – “How to get Oracle up and running on your Linux box”, LinuxWorld, 1999 [3] B. D. Brown – “The Expert’s Guide to OAS/ 9iAS Migration”, Oracle Magazine, V 2001 [4] Oracle – “Oracle 9i Application Server, features”, Oracle.com, 2002 [5] Oracle – “Oracle 9i Application Server, Using the PL/SQL Gateway”, Oracle.com, 2001 [6] M. Paithane – “Oracle iAS – Technical Overview of Web Server and Modules”, OTN, 2001 [7] R. Cook – “Open source databases”, LinuxWorld, 2000 [8] T. Perdue – “Open Source Databases: As The Tables Turn”, phpbuider.com, 2000 [9] P. Wayner – “Open source databases bloom”, Computerworld, 2001 [10] P. S. Trimble – “Open minds on open source”, Federal Computer Week, 2000 [11] A. Salkever – “Is Open-Source Security Software Safe?”, BusinessWeek, 2001 [12] “Perl Fast Facts”, Perl Mongers, 2002 [13] M. J. Dominus – “Short guide to DBI”, Perl.com, 1999 [14] T. M. Brannon – “DBIx::Recordset VS DBI”, Perl.com, 2001 [15] Chromatic – “DBI is OK”, Perl.com , 2001 44 CP 112 Per gestire l’eventualità che non ci siano record per l’ordine richiesto abbiamo inserito il controllo if ($id_st->rows == 0) { print “L’ordine $Ordid non esiste.\n”; } Abbiamo finito: $id_st->finish; chiude il cursore relativo allo statement id_st e $id_db>disconnect; si disconnette dal database. Il runtime di questo script è una cosa del genere: Numero Ordine> 2713 Ordine 2713 Stato: inevaso (manca pagamento) Numero Ordine> Ovviamente DBI offre molto di più di quanto abbiamo visto in questo semplice script ma approfondire l’argomento va oltre lo scopo di quest’articolo, in bibliografia e nei riferimenti si possono trovare informazioni più complete e dettagliate. Conclusioni Pur non applicando direttamente la filosofia open source, Oracle si sta legando fortemente a questo nuovo modo di intendere il software. Rimasi perplesso nel Maggio del 2000 quando, alla conferenza iDevelop2000 della Oracle, trovai nel software pack, contenente tutti i prodotti Oracle, il cd di Linux. Sapevo che i prodotti Oracle erano ormai disponibili anche su quella piattaforma, ma distribuire addirittura il cd mi pareva troppo! Oggi Oracle ha addirittura preferito, per la nuova release di Oracle9iAS, il web server open source Apache a quello prodotto in casa. La “strana coppia” non è poi tanto “strana”. RIFERIMENTI [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] http://www.opensource.org http://www.oracle.com http://technet.oracle.com http://www.linuxworld.com http://www.oramag.com http://www.computerworld.com/ http://www.fcw.com http://www.businessweek.com http://www.mysql.com http://www.it.postgresql.org http://www.phpbuilder.com http://www.perl.org http://www.perl.com