【问题标题】:How can I pass variables meant for a trigger function in SQLite?如何在 SQLite 中传递用于触发函数的变量?
【发布时间】:2014-02-17 15:41:59
【问题描述】:
/*
// 这是触发器定义
创建临时触发器 'insertTrigger' 而不是 INSERT ON 'foo'
开始
    选择栏(NEW.id,NEW.timestamp); "
结尾;
//*/

无效插入(sqlite3 *db,char *id,char *timestamp,void *context){
    exec_query(db, "INSERT INTO foo(id,timestamp) VALUES(?,?)", id, timestamp);
}

空栏(sqlite3_context *context,int argc,sqlite3_value **argv){
    char *id = (char*)sqlite3_value_text(argv[0]);
    char *timestamp = (char*)sqlite3_value_text(argv[1]);
    //我如何获得上下文* ???
    //这必须是一个线程安全的函数(即多个线程有自己的 sqlite3* 并且所有执行查询(可能包括这个)
}

是否有一些解决方法可以启用此功能?就像一个想法:

无效插入(sqlite3 *db,char *id,char *timestamp,void *context){ sqlite3_mutex_enter(sqlite3_db_mutex(db)); sqlite3_user_setdata(数据库,上下文); //这个不存在 exec_query(db, "INSERT INTO foo(id,timestamp) VALUES(?,?)", id, timestamp); sqlite3_mutex_leave(sqlite3_db_mutex(db)); } 空栏(sqlite3_context *context,int argc,sqlite3_value **argv){ char *id = (char*)sqlite3_value_text(argv[0]); char *timestamp = (char*)sqlite3_value_text(argv[1]); 无效 *context_ = sqlite3_user_data(context); }

似乎还有一些其他方法可以完成此操作,例如 sqlite3_get_auxdata 函数,但我不太了解该 API 的工作原理。

【问题讨论】:

  • 没有“C/C++”之类的东西。您使用的是 C 还是 C++?请删除其他标签。
  • @ThiefMaster 这个问题适用于两种语言。
  • @chacham15 那么应该是两个独立的问题。只需快速浏览一下代码,其中就有void *s。这本身就是在两种语言中以完全不同的方式对待它的一个很好的理由。
  • @H2CO3 不,我不想区别对待。代码需要在 c 和 c++ 中工作。
  • @H2CO3 伙计,不要以为你知道我所知道的(而且你什么都知道)。尽管 C 不是 C++ 的真子集,但您可以使用两者的共同特征编写代码,而不会超出这些界限。毫无疑问,这是合法的,我不想和你争论。

标签: c++ c sqlite


【解决方案1】:

context 不是您的查询的一部分,因此它在触发函数中不可用。

毕竟,您发送来更新表的 SQL 语句可能(应该)根本不知道触发器!

【讨论】:

  • 是的,但请查看更新以了解如何完成此操作(即使特定建议不起作用)。
猜你喜欢
  • 1970-01-01
  • 2021-09-26
  • 1970-01-01
  • 2019-01-23
  • 2011-05-17
  • 2020-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多