Мы используем 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
Мы хотели бы избежать отправки последней пустой записи. Мы можем достичь этого, только если будем заранее знать, что выбранная нами запись была последней.
Есть идеи, как этого добиться?
ОБРАТИТЕ ВНИМАНИЕ Мы знаем, что мы можем реорганизовать код, как показано ниже, но это требует от нас дублирования буфера и слишком большого количества malloc / copy, так как sqlite3_step уничтожит предыдущие данные. Этого мы пытаемся избежать, поэтому, пожалуйста, НЕ предлагайте это.
while (sqlite3_step(statement) == SQLITE_ROW) {
if(data)
processRecordAndFree(data, 0);
data = duplicate_data(sqlite3_column_blob(statement, 0));
}
if(data)
processRecordAndFree(data, 1);