void RepoQuery::bindTypedValue(const char* paramName, const TypedValue& tv) { if (tv.m_type == KindOfUninit) { bindBlob(paramName, "", 0, true); } else { String blob = f_serialize(tvAsCVarRef(&tv)); bindBlob(paramName, blob->data(), blob->size()); } }
void Database::Query::bindValue(int paramIndex, const DataValue& value) { switch (value.getType()) { case DataValue::TYPE_VOID: case DataValue::TYPE_NULL: bindNull(paramIndex); break; case DataValue::TYPE_BOOL: bind(paramIndex, DataValue(value).toInt()); break; case DataValue::TYPE_INT: bind(paramIndex, value.getData<int>()); break; case DataValue::TYPE_INT64: bind(paramIndex, value.getData<int64>()); break; case DataValue::TYPE_FLOAT: bind(paramIndex, value.getData<float>()); break; case DataValue::TYPE_DOUBLE: bind(paramIndex, value.getData<double>()); break; case DataValue::TYPE_STRING: bind(paramIndex, value.getStringPtr(), value.getStringSize()); break; case DataValue::TYPE_BLOB: bindBlob(paramIndex, value.getBlobPtr(), value.getBlobSize()); break; case DataValue::TYPE_TIMESTAMP: bind(paramIndex, value.getData<Timestamp>().getUnixTime64()); break; // types which sqlite doesn't support natively are treated as blob case DataValue::TYPE_FLOAT2: case DataValue::TYPE_FLOAT3: case DataValue::TYPE_FLOAT4: case DataValue::TYPE_FLOAT3X3: case DataValue::TYPE_FLOAT4X4: case DataValue::TYPE_VECTOR2: case DataValue::TYPE_VECTOR3: case DataValue::TYPE_VECTOR4: case DataValue::TYPE_QUAT: case DataValue::TYPE_MATRIX3: case DataValue::TYPE_MATRIX4: { DataValue copy(value); size_t size; const void* blob = copy.toBlob(&size); bindBlob(paramIndex, blob, size); } break; case DataValue::TYPE_ARRAY: bind(paramIndex, DataValue(value).toBuffer()); case DataValue::TYPE_RECORD: bind(paramIndex, DataValue(value).toBuffer()); case DataValue::TYPE_OBJECT: bind(paramIndex, DataValue(value).toBuffer()); case DataValue::TYPE_BUFFER: bind(paramIndex, value.getRef<MemoryBuffer>()); break; default: NIT_THROW(EX_NOT_SUPPORTED); } }
int SQLiteStatement::bindBlob(int index, const String& text) { // String::characters() returns 0 for the empty string, which SQLite // treats as a null, so we supply a non-null pointer for that case. UChar anyCharacter = 0; const UChar* characters; if (text.isEmpty() && !text.isNull()) characters = &anyCharacter; else characters = text.characters(); return bindBlob(index, characters, text.length() * sizeof(UChar)); }
int SQLiteStatement::bindBlob(int index, const String& text) { // SQLite treats uses zero pointers to represent null strings, which means we need to make sure to map null WTFStrings to zero pointers. ASSERT(!String().charactersWithNullTermination().data()); return bindBlob(index, text.charactersWithNullTermination().data(), text.length() * sizeof(UChar)); }
void RepoQuery::bindMd5(const char* paramName, const MD5& md5) { char md5nbo[16]; md5.nbo((void*)md5nbo); bindBlob(paramName, md5nbo, sizeof(md5nbo)); }
void RepoQuery::bindBlob(const char* paramName, const BlobEncoder& blob, bool isStatic) { return bindBlob(paramName, blob.data(), blob.size(), isStatic); }
void Statement::bindBlob(int offset, const std::vector<uint8_t>& value, bool retain) { bindBlob(offset, value.data(), value.size(), retain); }