2017-02-02 13 views
2

первое сообщение здесь! Этот сайт оказал первостепенную помощь по огромному количеству предыдущих технических вопросов. Спасибо за вашу напряженную работу, все вместе.sqlite3 C пользователь определяемая функция не называемый

И теперь я пришел к своей проблеме.

Я хотел бы написать C sqlite3 UDF (User Defined Function). Предположим, что имя функции - «myFunc».

Я работаю над малиной PI 3B - по-русски (по-русски).

test_table имеет следующую схему:

create table test_table (
    a   integer, 
    b   integer 
); 

мини-программа (для проверки подхода) открывает БД и устанавливает функцию. Затем ждет неопределенное время для событий триггера.

#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; 
} 

я затем открыть отдельно test.db на консоли sqlite3:

$ sqlite3 test.db 

$ sqlite> select myFunc(); 
Error: no such function: myFunc 

Я думаю MyFunc должны быть видны, но это, кажется, не так.

Я мог бы создать триггер, но результат, очевидно, не изменится.

$ 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 

Моя цель - просто получить уведомление о вставке на test_table.

Является ли что-то в основном неправильным с моим подходом?

Любая помощь будет очень удовлетворительной.

С уважением, mopyot

ответ

2

Существует недоразумение:

Вновь определяется C-функция определена только в контексте ручки (db_handler в вашем случае), где он был добавлен. Это не будущая часть файла базы данных test.db.

Так что, если вы делаете

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

после вызова sqlite3_create_function() он должен работать, как вы ожидаете.

+0

Спасибо за быстрый ответ. Понял, попробовал и проверил. Итак, есть ли способ получить уведомление о вставках, выполненных другими актерами? – mopyot

+1

@mopyot Если вы говорите о отдельных процессах: механизм sqlite3 не существует, вам нужно будет использовать другое средство interprocess-communication для достижения этого. – Ctx