/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- * vim: sw=2 ts=2 et lcs=trail\:.,tab\:>~ : * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
int sqlite3_T_null(BindingColumnData aData) { return ::sqlite3_bind_null(aData.stmt, aData.column + 1);
}
int sqlite3_T_blob(BindingColumnData aData, constvoid* aBlob, int aSize) { return ::sqlite3_bind_blob(aData.stmt, aData.column + 1, aBlob, aSize, free);
}
int sqlite3_T_array(BindingColumnData aData, void* aArray, int aSize, int aType) { // In debug builds ensure that the statement includes at least one `carray()`.
MOZ_ASSERT(
::strstr(::sqlite3_sql(aData.stmt), "carray("), "Binding arrays to SQL statements requires using the carray() function.");
if (aType == CARRAY_TEXT) { // We don't manage the string buffers lifecycle, thus let SQLite make its // own copy. int srv = ::sqlite3_carray_bind(aData.stmt, aData.column + 1, aArray, aSize,
aType, SQLITE_TRANSIENT);
free(aArray); return srv;
} return ::sqlite3_carray_bind(aData.stmt, aData.column + 1, aArray, aSize,
aType, free);
}
void BindingParams::lock() {
NS_ASSERTION(mLocked == false, "Parameters have already been locked!");
mLocked = true;
// We no longer need to hold a reference to our statement or our owning array. // The array owns us at this point, and it will own a reference to the // statement.
mOwningStatement = nullptr;
mOwningArray = nullptr;
}
void BindingParams::unlock(Statement* aOwningStatement) {
NS_ASSERTION(mLocked == true, "Parameters were not yet locked!");
mLocked = false;
mOwningStatement = aOwningStatement;
}
already_AddRefed<mozIStorageError> BindingParams::bind(
sqlite3_stmt* aStatement) { // Iterate through all of our stored data, and bind it. for (size_t i = 0; i < mParameters.Length(); i++) { int rc = variantToSQLiteT(BindingColumnData(aStatement, i), mParameters[i]); if (rc != SQLITE_OK) { // We had an error while trying to bind. Now we need to create an error // object with the right message. Note that we special case // SQLITE_MISMATCH, but otherwise get the message from SQLite. constchar* msg = "Could not covert nsIVariant to SQLite type."; if (rc != SQLITE_MISMATCH) {
msg = ::sqlite3_errmsg(::sqlite3_db_handle(aStatement));
}
// We do not accept any forms of names other than ":name", but we need to // add the colon for SQLite.
nsAutoCString name(":");
name.Append(key); int oneIdx = ::sqlite3_bind_parameter_index(aStatement, name.get());
if (oneIdx == 0) {
nsAutoCString errMsg(key);
errMsg.AppendLiteral(" is not a valid named parameter.");
err = new Error(SQLITE_RANGE, errMsg.get()); return err.forget();
}
// Get the column index that we need to store this at.
uint32_t index;
nsresult rv = mOwningStatement->GetParameterIndex(aName, &index);
NS_ENSURE_SUCCESS(rv, rv);
NS_IMETHODIMP
BindingParams::BindArrayOfStringsByName(const nsACString& aName, const nsTArray<nsString>& aValue) {
NS_ENSURE_ARG_MAX(aValue.Length(), INT_MAX);
nsTArray<nsCString> UTF8Strings(aValue.Length()); for (const nsString& str : aValue) {
UTF8Strings.AppendElement(NS_ConvertUTF16toUTF8(str));
}
std::pair<constvoid*, int> data( static_cast<constvoid*>(UTF8Strings.Elements()), int(UTF8Strings.Length())); // The variant will make a copy of all the buffers.
nsCOMPtr<nsIVariant> value(new ArrayOfUTF8StringsVariant(data));
NS_ENSURE_TRUE(value, NS_ERROR_OUT_OF_MEMORY);
return BindByName(aName, value);
}
NS_IMETHODIMP
BindingParams::BindArrayOfUTF8StringsByName(const nsACString& aName, const nsTArray<nsCString>& aValue) {
NS_ENSURE_ARG_MAX(aValue.Length(), INT_MAX);
std::pair<constvoid*, int> data(static_cast<constvoid*>(aValue.Elements()), int(aValue.Length())); // The variant will make a copy of all the buffers.
nsCOMPtr<nsIVariant> value(new ArrayOfUTF8StringsVariant(data));
NS_ENSURE_TRUE(value, NS_ERROR_OUT_OF_MEMORY);
// Store the variant for later use.
RefPtr<Variant_base> variant = convertVariantToStorageVariant(aValue); if (!variant) return NS_ERROR_UNEXPECTED; if (mParameters.Length() <= aIndex) {
(void)mParameters.SetLength(aIndex);
(void)mParameters.AppendElement(variant);
} else {
mParameters.ReplaceElementAt(aIndex, variant);
} return NS_OK;
}
NS_IMETHODIMP
AsyncBindingParams::BindByIndex(uint32_t aIndex, nsIVariant* aValue) {
NS_ENSURE_FALSE(mLocked, NS_ERROR_UNEXPECTED); // In the asynchronous case we do not know how many parameters there are to // bind to, so we cannot check the validity of aIndex.
NS_IMETHODIMP
BindingParams::BindArrayOfStringsByIndex(uint32_t aIndex, const nsTArray<nsString>& aValue) {
NS_ENSURE_ARG_MAX(aValue.Length(), INT_MAX);
nsTArray<nsCString> UTF8Strings(aValue.Length()); for (const nsString& str : aValue) {
UTF8Strings.AppendElement(NS_ConvertUTF16toUTF8(str).get());
}
std::pair<constvoid*, int> data( static_cast<constvoid*>(UTF8Strings.Elements()), int(UTF8Strings.Length())); // The variant will make a copy of all the buffers.
nsCOMPtr<nsIVariant> value(new ArrayOfUTF8StringsVariant(data));
NS_ENSURE_TRUE(value, NS_ERROR_OUT_OF_MEMORY);
return BindByIndex(aIndex, value);
}
NS_IMETHODIMP
BindingParams::BindArrayOfUTF8StringsByIndex(
uint32_t aIndex, const nsTArray<nsCString>& aValue) {
NS_ENSURE_ARG_MAX(aValue.Length(), INT_MAX);
std::pair<constvoid*, int> data(static_cast<constvoid*>(aValue.Elements()), int(aValue.Length())); // The variant will make a copy of all the buffers.
nsCOMPtr<nsIVariant> value(new ArrayOfUTF8StringsVariant(data));
NS_ENSURE_TRUE(value, NS_ERROR_OUT_OF_MEMORY);
return BindByIndex(aIndex, value);
}
} // namespace mozilla::storage
¤ Dauer der Verarbeitung: 0.22 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.