Uno dei problemi maggiori che si incontra quando si sviluppa un CMS, o comunque un sistema simile, è quello di permettere ad un solo utente di modificare un "oggetto" già inserito nel database.
Per ovvie ragioni, non si possono tenere bloccate le tabelle sul db (in una transazione oppure eseguendo proprio i comandi appositi) durante tutta la fase di modifica da parte dell'utente.
D'altra parte, visto che i progetti devono essere coclusi per l'altro ieri, spesso ci si concentra prima sulla realizzazione dell'applicazione e poi sugli altri aspetti e spesso nel caso del pericolo di modifiche concorrenti, ci si affida al fatto che, dall'analisi dei casi d'uso, gli utenti generalmente non hanno in carico le stesse pratiche e quindi il rischio che vadano a modificare "oggetti" altrui è minimo.
AJAX_Locking è un framework che utilizza la tecnologia AJAX per gestire blocco d'accesso degli oggetti di una applicazione web.
Ho carpito l'idea da un articolo comparso su DDJ di settembre a firma di David Perelman-Hall. L'articolo descrive una tecnica per bloccare l'accesso, sbloccare e verificare lo stato di record, ma io dico oggetti, senza utilizzare il lock delle tabelle sul db (oppure le transazioni).
Quando un utente intende bloccare un oggetto, una chiamata AJAX al server verifica se l'oggetto è già bloccato ed eventualmente lo blocca. Simmetricamente, al termine della modifica dell'oggetto, una chiamata AJAX libera l'oggetto in questione. E' anche previsto un tempo di timeout scaduto il quale l'oggetto viene liberato automaticamente, per impedire che questo resti bloccato eternamente perchè magari è scaduta la sessione dell'utente. Infine c'è la funzionalità di controllo dello stato che permette di mostrare gli oggetti bloccati (e modificare anche l'interfaccia utente, disabilitando i pulsanti di modifica) e quelli liberi e che consente anche la verifica dello stato durante tutta l'operazione di modifica.
Qualsiasi tipo di oggetto può essere controllato in questa maniera: la chiave che identifica univocamente un oggetto è composta da un tipo e da un id, che sono trattati entrambi come stringa e l'informazione del blocco e dell'utente che l'ha eseguito sono conservate autonomamente dal driver. Così facendo non c'è necessità di aggiungere delle ulteriori colonne alle tabelle sul db che rappresentano l'oggetto (tipicamente più di una).AJAX_Locking è una classe che estende HTML_AJAX_Server e implementa essa stessa le funzionalità di blocco, sblocco e verifica dello stato, attraverso l'uso di un driver, cioè può utilizzare meccanismi diversi per eseguire i compiti e ognuno può scrivere e aggiungerne il proprio.Il driver di defult è AJAX_Locking_Driver_SharedMemory, che usa il pacchetto System_SharedMemory di PEAR per conservare le informazioni riguardanti gli oggetti bloccati. Un secondo driver è AJAX_Locking_Driver_MDB2, che utilizza il pacchetto MDB2 (sempre di PEAR) per conservare i dati in un db.
Per vedere AJAX_Locking all'opera c'è un esempio.
Il timeout della sessione di modifica è impostato a 60 secondi proprio per far vedere cosa accade quando qualcuno si dimentica di salvare ciò che sta facendo. Il codice sorgente lato server è invece visibile cliccando su server.phps.
La classe AJAX_Locking è essa stessa distribuita come pacchetto di PEAR, scaricabile dal mio channel pear.ambrosanio.com. Per aggiungere il mio channel al proprio repository PEAR si deve eseguire il comando:
pear channel-discover pear.ambrosanio.com
mentre per installare AJAX_Locking il comando da dare è:
pear install pear.ambrosanio.com/AJAX_Locking
Per usare AJAX_Locking bisogna scrivere una pagina server che instanzi l'oggetto remoto AJAX e poi bisogna implementare il client AJAX nella pagina client usando HTML_Ajax, un altro pacchetto PEAR, in modo che chiami i metodi lock, unlock e status forniti dal server. AJAX_Locking fornisce essa stessa una libreria javascript per aiutare a scrivere la gestione dei lock lato client.
