我是否必须对 SQLITE 中的 argv 回调中的每个参数进行深度复制?
Do I have to make a deep copy of every parameter in argv callback in SQLITE?
如果我想在调用回调时存储查询返回的信息,我应该对 argv 中的每个参数进行深度复制,还是我可以安全地假设 sqlite3 赢了从回调返回后释放它?我使用 C 作为编程语言。
static int callback_consult(void *dummy, int argc, char **argv, char **col_name) {
res_consult_t * answer = &(global_answer -> consult_res);
movie_t *curr_tuple = calloc(sizeof(char), sizeof(movie_t));
/* Should I memcpy ??? */
curr_tuple -> name = argv[0];
curr_tuple -> genre = argv[1];
curr_tuple -> description = argv[2];
curr_tuple -> seats_available = argv[3]; /* Convert to int */
(answer -> movies)[tuple] = curr_tuple;
return SQLITE_OK;
}
我猜你是在问传递给 sqlite3_exec()
的回调函数可以安全地做什么。
首先,sqlite3_exec()
的文档是这样说的:
The 3rd argument to the sqlite3_exec() callback is an array of pointers to strings obtained as if from sqlite3_column_text(), one for each column. If an element of a result row is NULL then the corresponding string pointer for the sqlite3_exec() callback is a NULL pointer.
一般来说,您做因此需要为结果列NULL
做好准备。将这样的 NULL
分配给程序中的任何特定变量、结构或联合成员或数组元素是否安全或合适是您程序的一个特征。但是,将 NULL
作为参数传递给 memcpy()
或 strcpy()
肯定是不安全的,因此您可能需要考虑到这一点。
不过,sqlite3_column_text()
的文档触及了问题的实质。特别是,这适用于:
The pointers returned are valid until a type conversion occurs as described above, or until sqlite3_step() or sqlite3_reset() or sqlite3_finalize() is called. The memory space used to hold strings and BLOBs is freed automatically.
自
The sqlite3_exec() interface is a convenience wrapper around sqlite3_prepare_v2(), sqlite3_step(), and sqlite3_finalize() [...].
总体结论是,通过参数 argv
传递给回调函数的字符串仅在回调 returns 之前可用。如果您想保存这些结果以供以后进行某种处理,那么您需要制作副本,或者以其他方式从中提取您需要的数据。
如果我想在调用回调时存储查询返回的信息,我应该对 argv 中的每个参数进行深度复制,还是我可以安全地假设 sqlite3 赢了从回调返回后释放它?我使用 C 作为编程语言。
static int callback_consult(void *dummy, int argc, char **argv, char **col_name) {
res_consult_t * answer = &(global_answer -> consult_res);
movie_t *curr_tuple = calloc(sizeof(char), sizeof(movie_t));
/* Should I memcpy ??? */
curr_tuple -> name = argv[0];
curr_tuple -> genre = argv[1];
curr_tuple -> description = argv[2];
curr_tuple -> seats_available = argv[3]; /* Convert to int */
(answer -> movies)[tuple] = curr_tuple;
return SQLITE_OK;
}
我猜你是在问传递给 sqlite3_exec()
的回调函数可以安全地做什么。
首先,sqlite3_exec()
的文档是这样说的:
The 3rd argument to the sqlite3_exec() callback is an array of pointers to strings obtained as if from sqlite3_column_text(), one for each column. If an element of a result row is NULL then the corresponding string pointer for the sqlite3_exec() callback is a NULL pointer.
一般来说,您做因此需要为结果列NULL
做好准备。将这样的 NULL
分配给程序中的任何特定变量、结构或联合成员或数组元素是否安全或合适是您程序的一个特征。但是,将 NULL
作为参数传递给 memcpy()
或 strcpy()
肯定是不安全的,因此您可能需要考虑到这一点。
不过,sqlite3_column_text()
的文档触及了问题的实质。特别是,这适用于:
The pointers returned are valid until a type conversion occurs as described above, or until sqlite3_step() or sqlite3_reset() or sqlite3_finalize() is called. The memory space used to hold strings and BLOBs is freed automatically.
自
The sqlite3_exec() interface is a convenience wrapper around sqlite3_prepare_v2(), sqlite3_step(), and sqlite3_finalize() [...].
总体结论是,通过参数 argv
传递给回调函数的字符串仅在回调 returns 之前可用。如果您想保存这些结果以供以后进行某种处理,那么您需要制作副本,或者以其他方式从中提取您需要的数据。