RussianLDP Рейтинг@Mail.ru
WebMoney: 
WMZ Z294115950220 
WMR R409981405661 
WME E134003968233 
Visa 
4274 3200 2453 6495 

Small. Fast. Reliable.
Choose any three.

SQLite C Interface

Получение значения 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_blobBLOB
sqlite3_value_doubleREAL
sqlite3_value_int32-bit INTEGER
sqlite3_value_int6464-bit INTEGER
sqlite3_value_pointerУказатель
sqlite3_value_textUTF-8 TEXT
sqlite3_value_text16UTF-16 TEXT в нативном порядке байт
sqlite3_value_text16beUTF-16be TEXT
sqlite3_value_text16leUTF-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*.

Пока входной параметр правилен, эта хранимая процедура может потерпеть неудачу только если ошибка памяти происходит во время преобразования формата. Только следующее подмножество интерфейсов подвергается ошибкам памяти:

  • 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 вызовут на том же самом соединении с базой данных.