【发布时间】: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++ 的真子集,但您可以使用两者的共同特征编写代码,而不会超出这些界限。毫无疑问,这是合法的,我不想和你争论。