Получение значений 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 соответственно в порядке от старшего байта к младшему и от младшего байта к старшему.
Если объект 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) равно true, во всех остальных отношениях будет выглядеть как значение 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*.
Если входной параметр корректен, эти процедуры могут завершиться с ошибкой только в случае нехватки памяти при преобразовании UTF8→UTF16 или UTF16→UTF8. При нехватке памяти возвращаемое значение этих процедур будет таким же, как если бы столбец содержал значение SQL NULL. Если входной sqlite3_value не был получен с помощью sqlite3_value_dup(), корректные возвраты SQL NULL также можно отличить от ошибок нехватки памяти после извлечения значения: для этого необходимо вызвать sqlite3_errcode() сразу после получения подозрительного возвращаемого значения и до вызова любого другого интерфейса SQLite для того же подключения к базе данных. Если входной sqlite3_value был получен с помощью sqlite3_value_dup(), он не связан с подключением к базе данных, поэтому sqlite3_errcode() работать не будет. В таком случае отличить нехватку памяти от настоящего SQL NULL можно только вызвав sqlite3_value_type() для входного значения, чтобы проверить, является ли оно NULL, прежде чем пытаться извлечь значение.
См. также списки объектов, констант и функций.
SQLite is in the Public Domain.
https://sqlite.org/c3ref/value_blob.html