sqlite3 C用户定义的函数未被调用

时间:2017-02-02 09:56:11

标签: c sqlite user-defined-functions raspberry-pi3 udf

首先发布在这里!该网站对大量先前的技术问题提供了至关重要的帮助。 感谢您的辛勤工作,集体使用。

现在我的问题出现了。

我想编写一个C sqlite3 UDF(用户定义函数)。 假设函数名称为“myFunc”。

我在Raspberry PI 3B上工作 - Raspbian默认(发布最新)。

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

然后我在sqlite3控制台上单独打开test.db:

$ 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

1 个答案:

答案 0 :(得分:2)

这里有一个误解:

新定义的C函数仅在句柄(在您的情况下为db_handler)的上下文中定义。它不是数据库文件test.db的未来部分。

所以如果你做了

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

致电sqlite3_create_function()后,它应该按照您的预期运作。