Spec-Zone.ru › SQLite

Удобные процедуры для выполнения запросов

int sqlite3_get_table(
  sqlite3 *db,          /* An open database */
  const char *zSql,     /* SQL to be evaluated */
  char ***pazResult,    /* Results of the query */
  int *pnRow,           /* Number of result rows written here */
  int *pnColumn,        /* Number of result columns written here */
  char **pzErrmsg       /* Error msg written here */
);
void sqlite3_free_table(char **result);

Это устаревший интерфейс, который сохраняется для обратной совместимости. Использование этого интерфейса не рекомендуется.

Определение: таблица результатов — это структура данных в памяти, созданная интерфейсом sqlite3_get_table(). Таблица результатов записывает полные результаты запроса из одного или нескольких запросов.

Таблица концептуально имеет ряд строк и столбцов. Но эти числа не являются частью самой таблицы результатов. Эти числа получаются отдельно. Пусть N — количество строк, а M — количество столбцов.

Таблица результатов представляет собой массив указателей на строки UTF-8 с нулевым завершением. В массиве содержится (N+1)*M элементов. Первые M указателей указывают на строки с нулевым завершением, содержащие имена столбцов. Остальные записи указывают на результаты запроса. Значения NULL приводят к нулевым указателям. Все остальные значения представлены в их представлении в виде нуль-терминированной строки UTF-8, как возвращает sqlite3_column_text().

Таблица результатов может состоять из одного или нескольких выделений памяти. Не безопасно передавать таблицу результатов напрямую в sqlite3_free(). Таблица результатов должна быть освобождена с помощью sqlite3_free_table().

В качестве примера формата таблицы результатов предположим, что результат запроса выглядит следующим образом:

Name        | Age
-----------------------
Alice       | 43
Bob         | 28
Cindy       | 21

Есть два столбца (M==2) и три строки (N==3). Таким образом, таблица результатов содержит 8 записей. Предположим, что таблица результатов хранится в массиве с именем azResult. Тогда azResult содержит это содержимое:

azResult[0] = "Name";
azResult[1] = "Age";
azResult[2] = "Alice";
azResult[3] = "43";
azResult[4] = "Bob";
azResult[5] = "28";
azResult[6] = "Cindy";
azResult[7] = "21";

Функция sqlite3_get_table() вычисляет одну или несколько SQL-выражений, разделенных точкой с запятой, в строке UTF-8 с нулевым завершением своего второго параметра и возвращает таблицу результатов указателю, заданному в его третьем параметре.

После того, как приложение завершило работу с результатом из sqlite3_get_table(), оно должно передать указатель на таблицу результатов в sqlite3_free_table(), чтобы освободить выделенную память. Из-за того, как происходит выделение памяти sqlite3_malloc() внутри sqlite3_get_table(), вызывающая функция не должна пытаться вызвать sqlite3_free() напрямую. Только sqlite3_free_table() может правильно и безопасно освободить память.

Интерфейс sqlite3_get_table() реализован как обертка вокруг sqlite3_exec(). Процедура sqlite3_get_table() не имеет доступа к внутренним структурам данных SQLite. Она использует только публичный интерфейс, определенный здесь. Вследствие этого ошибки, возникающие в слое обертки вне вызова внутреннего sqlite3_exec(), не отражаются в последующих вызовах sqlite3_errcode() или sqlite3_errmsg().

См. также списки Объектов, Констант и Функций.

SQLite is in the Public Domain.
https://sqlite.org/c3ref/free_table.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API