L'angolo di 6502Transazioni in C++ [3]
2002-12-28
Indice

Benvenuti!
Chi sono
Demo
Documenti
Quelli piccoli
Problemi
Scacchi
Immagini
Musica
Il mio blog
Scrivimi

English version 


Conclusioni

Il C++ si e' rivelato abbastanza potente da permettere l'implementazione di una logica di rollback su strutture dati complesse in memoria senza un appesantimento sintattico nell'uso della struttura. Ovviamente questo comporta un costo in termini di prestazioni e occupazione di memoria ma in alcuni casi e' comunque un aiuto interessante.

Vista questa potenza ho deciso di implementare i servizi gestionali di un server transazionale direttamente in C++ (senza cioe' scrivere un interprete specifico come ho fatto in passato). Forse sara' una decisione su cui tornero' indietro ma per il momento sembra una strada percorribile.

Allegato c'e' un semplice esempio di implementazione di quanto ho descritto. Il programma dichiara tre variabili di tipo Field<std::string>, Field<int>, Ptr<int>(1) le modifica, le stampa, esegue un Rollback e le stampa di nuovo.

Ovviamente il comando di Commit consiste semplicemente nell'azzerare il vettore Transaction (ricordandosi di eliminare tutti gli oggetti TrOp puntati).

Dimostrazione gestione transazioni in C++
Il programma e' stato provato con il compilatore BCC55(2) messo a disposizione gratuitamente da Borland/Inprise, con g++ sotto linux e con VisualC++ 6.0 di Microsoft.

 


(1)Per qualche strana ragione non sono riuscito a descrivere la specializzazione Field<T*>in modo da poter compilare con Visual C++ di Microsoft (i messaggi di errore erano decisamente oscuri e sia BCC55 che g++ compilavano senza problemi). Utilizzando un template specifico per i puntatori la cosa si e' risolta non senza lasciarmi qualche perplessita' sulla portabilita' del C++ quando si inizia a esplorare angoli bui della sintassi.
(2)Sembra che io sia incappato in qualche bug del compilatore in quanto durante l'espansione dei template ricevo un warning che segnala che ad una funzione che riceve un non-const reference viene passata una istanza temporanea. In realta' questo non avviene nel codice presentato (la funzione e' correttamente dichiarata ricevere un const reference) e ho gia' sottomesso al riguardo un bug report agli autori del compilatore.