Получение значений SQL
const void *sqlite3_value_blob(sqlite3_value*); double sqlite3_value_double(sqlite3_value*); int sqlite3_value_int(sqlite3_value*); sqlite3_int64 sqlite3_value_int64(sqlite3_value*); void *sqlite3_value_pointer(sqlite3_value*, const char*); const unsigned char *sqlite3_value_text(sqlite3_value*); const void *sqlite3_value_text16(sqlite3_value*); const void *sqlite3_value_text16le(sqlite3_value*); const void *sqlite3_value_text16be(sqlite3_value*); int sqlite3_value_bytes(sqlite3_value*); int sqlite3_value_bytes16(sqlite3_value*); int sqlite3_value_type(sqlite3_value*); int sqlite3_value_numeric_type(sqlite3_value*); int sqlite3_value_nochange(sqlite3_value*); int sqlite3_value_frombind(sqlite3_value*);
Краткое описание:
sqlite3_value_blob → BLOB value sqlite3_value_double → REAL value sqlite3_value_int → 32-bit INTEGER value sqlite3_value_int64 → 64-bit INTEGER value sqlite3_value_pointer → Pointer value sqlite3_value_text → UTF-8 TEXT value sqlite3_value_text16 → UTF-16 TEXT value in the native byteorder sqlite3_value_text16be → UTF-16be TEXT value sqlite3_value_text16le → UTF-16le TEXT value sqlite3_value_bytes → Size of a BLOB or a UTF-8 TEXT in bytes sqlite3_value_bytes16 → Size of UTF-16 TEXT in bytes sqlite3_value_type → Default datatype of the value sqlite3_value_numeric_type → Best numeric datatype of the value sqlite3_value_nochange → True if the column is unchanged in an UPDATE against a virtual table. sqlite3_value_frombind → True if value originated from a bound parameter
Подробности:
Эти функции извлекают информацию о типе, размере и содержимом из объектов sqlite3_value. Защищенные объекты sqlite3_value используются для передачи информации о параметрах в функции, реализующие пользовательские SQL-функции и виртуальные таблицы.
Эти функции работают только с защищенными объектами sqlite3_value. Любая попытка использовать эти функции с незащищенными объектами sqlite3_value небезопасна в многопоточной среде.
Эти функции работают так же, как и соответствующие функции доступа к столбцам, за исключением того, что эти функции принимают указатель на единственный защищенный объект sqlite3_value, а не указатель sqlite3_stmt* и целочисленный номер столбца.
Интерфейс sqlite3_value_text16() извлекает строку UTF-16 в родном порядке байтов целевой машины. Интерфейсы sqlite3_value_text16be() и sqlite3_value_text16le() извлекают строки UTF-16 соответственно в формате big-endian и little-endian.
Если объект sqlite3_value V был инициализирован с помощью sqlite3_bind_pointer(S,I,P,X,D) или sqlite3_result_pointer(C,P,X,D), и если строки X и Y совпадают по результатам strcmp(X,Y), то sqlite3_value_pointer(V,Y) вернет указатель P. В противном случае sqlite3_value_pointer(V,Y) вернет NULL. Функция sqlite3_bind_pointer() является частью интерфейса передачи указателей, добавленного для SQLite 3.20.0.
Интерфейс sqlite3_value_type(V) возвращает код типа данных для исходного типа данных объекта sqlite3_value V. Возвращаемое значение является одним из SQLITE_INTEGER, SQLITE_FLOAT, SQLITE_TEXT, SQLITE_BLOB или SQLITE_NULL. Другие интерфейсы могут изменить тип данных для объекта sqlite3_value. Например, если тип данных изначально SQLITE_INTEGER, и вызвана sqlite3_value_text(V) для извлечения текстового значения для этого целого числа, то последующие вызовы sqlite3_value_type(V) могут вернуть SQLITE_TEXT. Сохраняется ли внутреннее преобразование типов или нет, не определено и может меняться от одной версии SQLite к другой.
Интерфейс sqlite3_value_numeric_type() пытается применить числовую аффинность к значению. Это означает, что делается попытка преобразовать значение в целое число или число с плавающей запятой. Если такое преобразование возможно без потери информации (например, если значение является строкой, похожей на число), то преобразование выполняется. В противном случае преобразование не выполняется. Возвращается тип данных после преобразования.
В методе xUpdate виртуальной таблицы, интерфейс sqlite3_value_nochange(X) возвращает true только в том случае, если столбец, соответствующий X, не изменился операцией UPDATE, для реализации которой был вызван метод xUpdate, и если предыдущий вызов метода xColumn, который был вызван для извлечения значения для этого столбца, возвратил значение без установки результата (вероятно, потому, что он запросил sqlite3_vtab_nochange() и обнаружил, что столбец неизменный). В методе xUpdate любое значение, для которого sqlite3_value_nochange(X) истинно, во всех других отношениях будет выглядеть как значение NULL. Если sqlite3_value_nochange(X) вызывается в любом месте, кроме метода xUpdate для оператора UPDATE, то возвращаемое значение произвольное и бессмысленное.
Интерфейс sqlite3_value_frombind(X) возвращает ненулевое значение, если значение X произошло от одного из интерфейсов sqlite3_bind(). Если X происходит от значения SQL-литерала, столбца таблицы или выражения, то sqlite3_value_frombind(X) возвращает ноль.
Обратите особое внимание на то, что указатель, возвращаемый функциями sqlite3_value_blob(), sqlite3_value_text() или sqlite3_value_text16(), может стать недействительным после вызова sqlite3_value_bytes(), sqlite3_value_bytes16(), sqlite3_value_text() или sqlite3_value_text16().
Эти функции должны вызываться из того же потока, что и SQL-функция, которая предоставила параметры sqlite3_value*.
До тех пор, пока входной параметр корректен, эти функции могут завершиться неудачей только в случае возникновения ошибки «недостаточно памяти» во время преобразования формата. Только следующие подмножества интерфейсов могут завершиться ошибкой «недостаточно памяти»:
- sqlite3_value_blob()
- sqlite3_value_text()
- sqlite3_value_text16()
- sqlite3_value_text16le()
- sqlite3_value_text16be()
- sqlite3_value_bytes()
- sqlite3_value_bytes16()
Если возникает ошибка «недостаточно памяти», то возвращаемое значение этих функций такое же, как если бы столбец содержал SQL-значение NULL. Действительные SQL-значения NULL можно отличить от ошибок «недостаточно памяти», вызвав sqlite3_errcode() сразу после получения подозрительного возвращаемого значения и перед вызовом любого другого интерфейса SQLite для того же соединения с базой данных.
См. также списки объектов, констант и функций.
SQLite is in the Public Domain.
https://sqlite.org/c3ref/value_blob.html