Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

L'estensione SDO di PHP 5

La libreria SDO (Service Data Object) consente di accedere a file XML, database e altri archivi di informazioni attraverso una semplice interfaccia
La libreria SDO (Service Data Object) consente di accedere a file XML, database e altri archivi di informazioni attraverso una semplice interfaccia
Link copiato negli appunti

L'estensione SDO per PHP 5 è stata introdotta nella distribuzione standard dalla versione 5.1; precedentemente era disponibile come estensione compilata separatamente oppure attraverso CVS.

SDO, acronimo di Service Data Object, è uno standard aperto che permette di lavorare su sorgenti dato provenienti da ambienti diversi (vedasi database, file XML o CSV) utilizzando un'unica interfaccia per accedervi ed interrogarli. In questo modo lo sviluppatore può focalizzare la sua attenzione sulla business logic piuttosto che perdere del tempo lavorando sulla tecnologia sottostante di accesso ai dati.

La specifica SDO (che è possibile scaricare partendo dal sito dell'IBM) può accedere a qualunque fonte di dato che esponga l'implementazione di un DAS specifico per quella fonte. Un DAS (acronimo di Data Access Service) non è altro che un driver che permette alla libreria di comunicare in modo trasparente con la fonte di dato. PHP implementa alcuni DAS, tra cui quello per accedere ai file XML attraverso la sua libreria DOM interna e quello che permette di accedere ad alcuni database appoggiandosi sul layer di astrazione builtin PDO. In realtà, per essere più precisi, è il DAS stesso che si occupa di restituire SDO che possono essere elaborati dall'utente e successivamente salvati sempre attraverso il DAS stesso che è l'unico a conoscenza dei dettagli per l'accesso in lettura o scrittura ai dati.

Al fine di rendere realmente utile la libreria, l'implementazione per PHP espone anche l'interfaccia che permette di definire manualmente dei DAS specifici per l'accesso a fonti di dato non previsti nella versione builtin.

Purtroppo è necessario specificare che attualmente SDO non prevede il supporto per i set di caratteri multibyte, e quindi risulta poco utile in quelle situazioni in cui si ha la necessità di lavorare con unicode o charset simili.

Vediamo allora come utilizzare la libreria SDO.

Utilizzare la libreria SDO

La libreria SDO può essere utilizzata con qualunque DAS implementato sia nativamente che direttamente in PHP. Per semplicità gli esempi di accesso alle fonti di dato SDO verranno fatti utilizzando come fonte di dato un database relazionale. Rispetto all'utilizzo di altri DAS, quello che cambia è l'inizializzazione in cui definiremo le informazioni necessarie affinché l'accesso ai dati possa essere trasparente. In caso di accesso a file XML per esempio il metadato necessario per l'inizializzazione sarà un file XSD, mentre nel nostro caso un array multidimensionale che definisce la struttura della tabella relazionale sulla quale lavorare.

Il primo processo da eseguire è comunque sempre quello di inizializzare il DAS ed interrogarlo al fine di estrarre l'oggetto SDO sul quale successivamente si dovrà andare a lavorare. Nel nostro esempio lavoreremo su un semplice database SQL che rappresenta degli articoli inseriti da alcuni utenti.

$articles_table = array(
    "name" => "articles",
    "columns" => array(
        "id",
        "title",
        "creation_date",
        "author_id"
    ),
    "PK" => "id",
    "FK" => array(
        "from" => "author_id",
        "to" => "author"
    )
);

$authors_table = array(
    "name" => "authors",
    "columns" => array(
        "id",
        "name",
        "surname"
    ),
    "PK" => "id"
);

$metadata = array($authors_table, $articles_table);
$reference = array(
    "parent" => "authors",
    "child" => "articles"
);

$das = new SDO_DAS_Relational($metadata, "authors", $reference);
$hub = new PDO("mysql:dbname=test;host=localhost", "user", "pass");

La crezione di un oggetto DAS relazionale è molto semplice ed intuitiva: per prima cosa dobbiamo tenere a mente che la struttura base con cui SDO lavora è un albero, e quindi è necessario che i dati che andremo ad utilizzare abbiano una sorta di gerarchia padre/figlio. Il costruttore dell'oggetto SDO_DAS_Relational accetta tre parametri: il primo è un array contenente la definizione delle tabelle con cui opereremo, il secondo è il titolo della tabella principale (detta anche di root) ed infine il terzo è un array che specifica la relazione padre/figlio che intercorre tra le tabelle. La definizione dei metadati di una tabella non è altro che un array associativo:

  • La voce name specifica il nome della tabella
  • La voce columns è a sua volta un'array con i nome delle colonne
  • Lla voce PK indica il nome della colonna che fungerà da chiave primaria
  • Lla voce opzionale FK invece indica la relazione di chiave esterna tra una colonna ed un'altra tabella

Specificate queste opzioni di configurazione possiamo passare all'interrogazione del DAS per ottenere l'oggetto SDO sul quale lavorare:

$query = "SELECT * FROM authors, articles WHERE authors.name = 'gabriele' AND authors.id = articles.id";
$sdo_authors = $das->executeQuery($hub, $query);

La query SQL viene eseguita dal DAS utilizzando la connessione passata come primo parametro ad executeQuery; il recordset ottenuto è quindi analizzato in base ai metadati forniti in fase di costruzione del DAS e quindi viene generato e restituito una struttura gerarchica SDO rappresentante i dati recuperati. L'oggetto SDO restituito avrà una struttura come la seguente:

$sdo_authors = DataObject {
    [0] id => 1
    [1] name => gabriele
    [2] surname => farina
    [3] articles => [
        [0] DataObject {
            [0] id => 1
            [1] title => titolo dell'articolo
            [2] creation_date => 2006-12-03
        },
        [1] DataObject {
            [0] id => 2
            [1] title => titolo dell'articolo 2
            [2] creation_date => 2006-12-04
        },
        ....
    ]
}

In pratica la variabile sdo_authors contiene un oggetto DataObject che mappa un record della tabella authors contenente una serie di proprietà. Queste permettono di accedere alle colonne agli altri DataObject che rappresentano i record correlati a quello corrente in base alla relazione espressa dai metadati ed alle condizioni definite nella query di selezione.

Per semplificare l'accesso e l'interrogazione, l'oggetto DataObject si comporta come un array e quindi è possibile accedere ai valori delle proprietà rappresentanti le colonne utilizzando degli indici numerici.

Accedere ai valori di un oggetto SDO

Le operazioni di lettura dei dati da un oggetto SDO sono molto semplici e vengono rese anche estremamente potenti grazie ad una serie di caratteristiche che permettono al programmatore di interrogare un albero SDO utilizzando diversi tipi di sintassi di accesso.

La sintassi più semplice è l'array notation. Basandoci sempre sui dati raccolti nell'esempio precedente, potremmo accedere al titolo del secondo articolo utilizzando:

$sdo_authors[3][1][1]

Dato che spesso e volentieri una sintassi simile è poco leggibile e facilmente prona agli errori, è possibile utilizzare l'object notation per l'accesso ai valori, mescolandola, ove necessario, con l'array notation:

$sdo_authors->articles[1]->title

Questo comportamento degli oggetti SDO permette loro di essere facilmente gestiti come se si trattasse di array o normali oggetti PHP, utilizzando i costrutti del linguaggio tipici del caso.

Il vero valore aggiunto però è la possibilità di utilizzare l'array notation su un DataObject specificando come valore una stringa contenente una query che effettui la ricerca del valore richiesto all'interno dell'oggetto. La query può essere scritta in formati diversi, utilizzando l'array notation per accedere ai figli oppure la dotted notation (utilizzando il punto per accedere alle proprietà al posto delle quadre):

// Array notation
$title = $sdo_authors['articles[2]/title'];

// Dotted notation
$title = $sdo_author['articles.1/title'];

È bene ricordarsi comunque che nel caso in cui si utilizzi la dotted notation il valore iniziale di un array è 0, mentre nel caso di array notation questo valore è 1. Grazie a questa feature è possibile utilizzare Xpath per effettuare le query sul Data Object, anche utilizzando sintassi un po' più complesse per filtrare i risultati:

$article = $sdo_author['articles[title == "titolo di prova"]'];

Ovviamente ogni proprietà può essere acceduta sia in lettura che in scrittura; una volta ottenuti i risultati richiesti, è possibile salvare il DataObject ottenuto appoggiandosi nuovamente al DAS creato inizialmente:

$das->applyChanges($hub, $sdo_authors);

Per aggiungere al DataObject un nodo di una tipologia specifica (nel nostro caso quello che poi diventerà un record della tabella) è necessario utilizzare il metodo createDataObject del DAS, che restituisce un DataObject nuovo istanziato in base al nome della tabella passata come unico parametro:

$francesco = $das->createDataObject("authors");
$francesco->name = "Francesco";
$francesco->surname = "Caccavella";

Infine, nel caso fosse necessario eliminare un nodo dal DataObject, basta utilizzare la funzione unset di PHP passandole come argomento il nodo da eliminare. Un salvataggio dell'oggetto SDO così manipolato apporterà tutte le modifiche necessarie al database sottostante.

Conclusione

Eccoci giunti alla fine di questo articolo. L'argomento è interessante e apre nuovi orizzonti per la sperimentazione di tecniche per l'accesso ai dati. SDO è una specifica implementata in molti linguaggi e presa molto in considerazione anche da realtà di alto spessore; per questo motivo, e per il fatto che rende possibile distaccarsi sempre di più dal concetto della tecnologia utilizzata per memorizzare i dati, è da considerarsi sicuramente un concetto potenzialmente molto interessante.


Ti consigliamo anche