erster Beitrag hier! Diese Site war bei einer großen Anzahl von früheren Tech-Angelegenheiten von größter Hilfe. Danke für Ihre harte Arbeit, kollektiv gesprochen.sqlite3 C benutzerdefinierte Funktion wird nicht aufgerufen
Und jetzt kommt zu meinem Problem.
Ich möchte eine C sqlite3 UDF (User Defined Function) schreiben. Angenommen, der Funktionsname lautet "myFunc".
Ich arbeite auf einem Raspberry PI 3B - Raspbian Standard (Distribution up-to-date).
test_table hat folgendes Schema:
create table test_table (
a integer,
b integer
);
Das Mini-Programm (das Konzept zu testen) öffnet die DB und installiert die Funktion. Dann wartet unbegrenzt auf Trigger-Ereignisse.
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
#include <signal.h>
#include <stdbool.h>
#include <unistd.h>
#include <sys/stat.h>
static void myFuncBody(sqlite3_context *context, int argc, sqlite3_value **argv)
{
printf("myFunc fired!\n");
fflush(stdout);
}
int main(int argc, char** argv)
{
sqlite3 *db_handler;
char *errMsg;
int error;
error = sqlite3_open("test.db", &db_handler);
if (error)
{
printf("Error opening the DB.\n");
exit(-2);
}
error = sqlite3_create_function(
db_handler,
"myFunc",
0,
SQLITE_UTF8,
NULL,
myFuncBody,
NULL,
NULL
);
if (error != SQLITE_OK)
{
printf("Error creating the function.\n");
}
for (;;);
return 0;
}
ich dann separat öffnen test.db auf der sqlite3 Konsole:
$ sqlite3 test.db
$ sqlite> select myFunc();
Error: no such function: myFunc
denke ich myFunc sichtbar sein sollte, aber dies scheint nicht der Fall zu sein.
Ich könnte auch einen Trigger erstellen, aber das Ergebnis ändert sich offensichtlich nicht.
$ sqlite> create trigger trigger1 after insert on test_table begin select myFunc(); end;
$ sqlite> insert into test_table values(-100, -150);
Error: no such function: myFunc
Mein Ziel ist einfach, über eine Einfügung auf test_table benachrichtigt zu werden.
Ist etwas grundsätzlich falsch mit meinem Ansatz?
Jede Hilfe wäre viel Approciated.
Grüße, mopyot
Danke für die schnelle Antwort. Verstanden, ausprobiert und verifiziert. Gibt es also eine Möglichkeit, über Insertionen anderer Akteure informiert zu werden? – mopyot
@mopyot Wenn Sie über separate Prozesse sprechen: Es gibt keinen Mechanismus, der von der sqlite3-Engine bereitgestellt wird, Sie müssen eine andere Methode der Interprozess-Kommunikation verwenden, um dies zu erreichen. – Ctx