未调用 sqlite3 C 用户定义函数
sqlite3 C user defined function not being called
先post来了!该站点在解决大量以前的技术问题上提供了至关重要的帮助。
感谢大家的辛勤付出,集体发言。
现在来解决我的问题。
我想编写一个 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
这里有个误区:
新定义的 C-function 仅在添加它的句柄上下文中定义(在您的情况下为 db_handler
)。它不是数据库文件 test.db
.
的未来部分
所以如果你做一个
sqlite3_exec(db_handler, "select myFunc()", ...);
在您调用 sqlite3_create_function()
之后,它应该会如您所愿地工作。
先post来了!该站点在解决大量以前的技术问题上提供了至关重要的帮助。 感谢大家的辛勤付出,集体发言。
现在来解决我的问题。
我想编写一个 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
这里有个误区:
新定义的 C-function 仅在添加它的句柄上下文中定义(在您的情况下为 db_handler
)。它不是数据库文件 test.db
.
所以如果你做一个
sqlite3_exec(db_handler, "select myFunc()", ...);
在您调用 sqlite3_create_function()
之后,它应该会如您所愿地工作。