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 sqlite3_value_double → REAL sqlite3_value_int → 32-bit INTEGER sqlite3_value_int64 → 64-bit INTEGER sqlite3_value_pointer → Указатель sqlite3_value_text → UTF-8 TEXT sqlite3_value_text16 → UTF-16 TEXT в нативном порядке байт sqlite3_value_text16be → UTF-16be TEXT sqlite3_value_text16le → UTF-16le TEXT sqlite3_value_bytes → Размер BLOB или текста UTF-8 TEXT в байтах sqlite3_value_bytes16 → Размер UTF-16 TEXT в байтах sqlite3_value_type → Значение по умолчанию для этого типа данных sqlite3_value_numeric_type → Лучше всего подходящий значению числовой тип данных sqlite3_value_nochange → True, если колонка неизменна в UPDATE для виртуальной таблицы. sqlite3_value_frombind → True, если значение порождено из связанного параметра
Детали:
Это извлекает тип, размер и информацию о содержании из объектов protected sqlite3_value. Они используются, чтобы передать информацию о параметре в функции, которые осуществляют функции SQL и виртуальные таблицы.
Это работает только с объектами protected sqlite3_value. Любая попытка использовать это на unprotected sqlite3_value не ориентирована на многопоточное исполнение.
Это работает точно так же, как соответствующие функции доступа колонки за исключением того, что эта хранимая процедура берет один объект protected 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() пытается применить числовую близость к значению. Это означает, что попытка предпринята, чтобы преобразовать значение в целое число или число с плавающей точкой. Если такое преобразование возможно без потери информации (другими словами, если значение это последовательность, которая похожа на число), преобразование выполняется. Иначе никакое преобразование не происходит. datatype после преобразования возвращен.
В методе 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, то возвращаемое значение произвольно и бессмысленно.
sqlite3_value_frombind(X) вернет не 0, если значение X порождено из одного из sqlite3_bind(). Если X прибывает из литерального значения SQL, столбца таблицы или выражения, то sqlite3_value_frombind(X) вернет 0.
Пожалуйста, обратите особое внимание на то, что указатель, возвращенный из sqlite3_value_blob(), sqlite3_value_text() или sqlite3_value_text16(), может быть лишен законной силы последующим запросом sqlite3_value_bytes(), sqlite3_value_bytes16(), sqlite3_value_text() или sqlite3_value_text16().
Это нужно вызвать от того же самого потока, как функция SQL, которая поставляла параметры sqlite3_value*.
Пока входной параметр правилен, эта хранимая процедура может потерпеть неудачу только если ошибка памяти происходит во время преобразования формата. Только следующее подмножество интерфейсов подвергается ошибкам памяти:
Если ошибка памяти происходит, то возвращаемое значение совпадает с тем, как если бы колонка содержала SQL NULL. Настоящий SQL NULL можно отличить от ошибок памяти, вызвав sqlite3_errcode() немедленно после того, как подозрительное возвращаемое значение получено и прежде чем любой другой интерфейс SQLite вызовут на том же самом соединении с базой данных.