2017-02-02 6 views
2

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

Antwort

2

Es ist ein Missverständnis hier:

Eine neu nur definierte C-Funktion wird im Rahmen des Griffs (db_handler in Ihrem Fall) definiert, wo es aufgenommen. Es ist kein zukünftiger Teil der Datenbankdatei test.db.

Also, wenn Sie tun, um eine

sqlite3_exec(db_handler, "select myFunc()", ...); 

nach Ihrem Anruf auf sqlite3_create_function() sollte es funktionieren wie erwartet.

+0

Danke für die schnelle Antwort. Verstanden, ausprobiert und verifiziert. Gibt es also eine Möglichkeit, über Insertionen anderer Akteure informiert zu werden? – mopyot

+1

@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

Verwandte Themen