Newsgroup: it.comp.os.linux.development
Titolo: [Q] notifica cambiamento in mysql

salve a tutti,
utilizzo mysql in un applicativo legacy su quale devo intervenire per delle 
modifiche. Un client spedisce dei comandi all'applicativo modificando delle 
righe nel database, ed io vorrei sapere quando una riga viene aggiornata. E' 
possibile, in qualche modo, evitare il polling del database tramite query 
SELECT ... WHERE ... (prima soluzione che mi č venuta in mente)? esiste 
qualche meccanismo che mi permetta di essere informato da un qualche tipo di 
evento?
Il database, se puņ servire, č mysql  Ver 11.15 Distrib 3.23.41, for 
redhat-linux-gnu (i386), versione piuttosto antiquata ma che difficilmente 
potrņ sostituire/aggiornare.
grazie in anticipo a tutti.
-- 
SF

 
http://csvtosql.sourceforge.net
ALLUCINAZIONE - Colpo inferto con il ditone del piede

 
no, da quel che leggo i trigger sono stati introdotti solo nella versione 5.0. 
Comunque, da quel che vedo con i trigger potrei esclusivamente modificare 
altre tabelle, mentre quello che servirebbe a me sarebbe una notifica diretta 
_all'applicativo_.
-- 
SF

 
http://csvtosql.sourceforge.net
George Orwell era un ottimista.

 
ma l'applicazione *devo* modificarla! per chiarire un po' le cose, forse non 
mi sono spiegato bene: :)
- applicativo client: modifica il database;
- applicativo server: legge variazioni nel database;
io non posso cambiare applicativo client, ma devo modificare applicativo 
server. O forse intendevi proprio che dovrei modificare l'applicativo client?
-- 
SF

 
Questa è una feature che ha PostgreSQL, le NOTIFY.
Quello che si fa è eseguire il comando
NOTIFY somestring;
ad esempio all'interno di un trigger.
Il server a questo punto manda un messaggio asincrono a tutti i client
che sono in ascolto (tramite previa esecuzione del comando LISTEN).
MySQL non supporta questo e credo che l'unica soluzione sia scriverti un
proxy server tra il client ed il database (a meno che tu non abbia già
un server intermedio con la logica applicativa).
Il proxy server non dovrebbe essere troppo difficile da sviluppare,
leggiti la documentazione del protocollo.
Devi solo intercettare i comandi INSERT, UPDATE e DELETE e reagire di
conseguenza.
Ovviamente non potrai sapere se tali comandi modificano effettivamente
il database, ma sempre meglio del polling fatto a mano.
Saluti  Manlio Perillo

 conseguenza.
Meglio intercettare l'OK Packet, restituito dal server in caso di un
comando che non restituisce righe.
In questo comando è presente il campo affected_rows (per INSERT, UPDATE,
DELETE), che è proprio quello che ti serve.
Saluti  Manlio Perillo

 leggiti la documentazione del protocollo.
grazie della dritta, non ci avevo proprio pensato! se non è troppo onerosa da 
implementare, è sicuramente quel che fa al caso mio.
-- 
SF
Love me two times girl, one for tomorrow, one just for today...

 
Il protocollo usato da MySQL non è dei migliori ma te la dovresti cavare.
Intercetta il Command Packet (per vedere la tabella interessata) e poi
l'OK Packet per verificare se e quante righe sono state interessate.
Se vuoi la vita facile per lo sviluppo ti consiglio Twisted, c'è già
tutto pronto.
Io tempo fa per fare qualcosa di simile ho usato
twisted.protocols.portforward
Saluti  Manlio Perillo

 tutto pronto.
ottimo! sto giusto usando il buon pitone per fare il mio demonietto..
