Ho scritto questa roba molto tempo fa per un'applicazione C ++ e ho fatto un post sul mio blog. Ecco un breve riassunto (dal momento che the l'articolo originale è piuttosto lungo e contiene allegati di file):
In SQLite scrivi callback in C ++ non elaborato:
File di intestazione (file.h)
#include <iostream>
#include <sqlite3.h>
#include <cstdlib>
#include <assert.h>
void memberfunction(const unsigned char* text1,
const unsigned char* text2,
const unsigned char* text3);
void mcallback(sqlite3_context* context, int argc, sqlite3_value** argv);
Definisce le due funzioni aggiuntive di cui avremo bisogno per il prossimo passo (in realtà la nostra funzione C ++ e una stored procedure SQLite).
File di implementazione (file.cpp)
Questa funzione verrà chiamata dal nostro trigger dal DB.
void memeberfunction(const unsigned char* text1,
const unsigned char* text2,
const unsigned char* text3)
{
cout << "inserted: " << text1 << " " << text2 << " " << text3 << "n";
}
E ora una procedura memorizzata SQLite per chiamare la nostra funzione; un trigger SQLite invocherà questo.
void mcallback(sqlite3_context* context, int argc, sqlite3_value** argv)
{
assert(argc == 3);
//SQLite types must be converted to C++ types
const unsigned char* text1 = sqlite3_value_text(argv[0]);
const unsigned char* text2 = sqlite3_value_text(argv[1]);
const unsigned char* text3 = sqlite3_value_text(argv[2]);
memeberfunction( text1, text2, text3);
}
Non dobbiamo limitare la funzione a una semplice stampa; questa funzione potrebbe avere (per esempio) i dati spostati su un'altra tabella.
Registrare la stored procedure nel DB
error = sqlite3_create_function(conn, "mcallback", 3, SQLITE_UTF8, NULL,
&mcallback, NULL, NULL);
Crea il trigger SQLite
Abbiamo bisogno della stored procedure poiché i trigger sono costruiti sopra di essi.
error = sqlite3_exec(conn, "create temp trigger callbacktrigger "
"after insert on hello for each row "
"begin "
"select mcallback(new.first_column, "
"new.second_column, new.exclamation_pt); "
"end;", 0, 0, 0);
Il trigger è solo temporaneo. In questo modo non rimarrà nel database dopo che l'esecuzione è terminata (del nostro intero programma). Il nostro callback non sarà in giro dopo comunque e il trigger potrebbe (e sarà, data la sua natura) causare problemi maggiori se usiamo il database all'esterno di questa applicazione.