我们正在使用sqlite3_prepare_v2
和sqlite3_step
来执行查询并读取结果。但是,我们需要知道获取的行是最后一行,而不执行下一个sqlite3_step语句。有想法吗?
这样做的原因是特殊的优化要求。为了进一步说明,下面是从表中读取未知行数的代码。我们的代码要求知道最后一条记录,以便可以采取特殊措施。
从代码中可以看到,我们将最后一个数据发送为NULL,以将其标记为读取结束。我们这样做是为了可以直接使用sqlite3_column_blob
返回的缓冲区,而无需任何malloc / copy。
sqlite3_stmt *statement;
char *data = NULL;
if (sqlite3_prepare_v2(mdb, sql, -1, &statement, NULL) != SQLITE_OK) {
return -1;
}
while (sqlite3_step(statement) == SQLITE_ROW) {
data = (char *)sqlite3_column_blob(statement, 0);
processRecord(data, 0); //data and last row indicator
}
processRecord(NULL, 1); //data and last row indicator
我们要避免发送最后一个NULL记录。只有事先知道所获取的记录是最后一条记录,我们才能实现这一目标。
有什么想法要实现吗?
请注意,我们知道我们可以按照以下方式重新组织代码,但是由于sqlite3_step会破坏先前的数据,因此它需要我们复制缓冲区和过多的malloc / copy。我们正在努力避免这种情况,因此请不要建议。
while (sqlite3_step(statement) == SQLITE_ROW) {
if(data)
processRecordAndFree(data, 0);
data = duplicate_data(sqlite3_column_blob(statement, 0));
}
if(data)
processRecordAndFree(data, 1);