nsresult FetchIconURL(nsRefPtr<Database>& aDB, const nsACString& aPageSpec, nsACString& aIconSpec) { NS_PRECONDITION(!aPageSpec.IsEmpty(), "Page spec must not be empty."); NS_PRECONDITION(!NS_IsMainThread(), "This should not be called on the main thread."); aIconSpec.Truncate(); nsCOMPtr<mozIStorageStatement> stmt = aDB->GetStatement( "SELECT f.url " "FROM moz_places h " "JOIN moz_favicons f ON h.favicon_id = f.id " "WHERE h.url = :page_url" ); NS_ENSURE_STATE(stmt); mozStorageStatementScoper scoper(stmt); nsresult rv = URIBinder::Bind(stmt, NS_LITERAL_CSTRING("page_url"), aPageSpec); NS_ENSURE_SUCCESS(rv, rv); bool hasResult; if (NS_SUCCEEDED(stmt->ExecuteStep(&hasResult)) && hasResult) { rv = stmt->GetUTF8String(0, aIconSpec); NS_ENSURE_SUCCESS(rv, rv); } return NS_OK; }
/** * Fetches information on a icon from the Places database. * * @param aDBConn * Database connection to history tables. * @param _icon * Icon that should be fetched. */ nsresult FetchIconInfo(nsRefPtr<Database>& aDB, IconData& _icon) { NS_PRECONDITION(_icon.spec.Length(), "Must have a non-empty spec!"); NS_PRECONDITION(!NS_IsMainThread(), "This should not be called on the main thread"); if (_icon.status & ICON_STATUS_CACHED) { return NS_OK; } nsCOMPtr<mozIStorageStatement> stmt = aDB->GetStatement( "SELECT id, expiration, data, mime_type " "FROM moz_favicons WHERE url = :icon_url" ); NS_ENSURE_STATE(stmt); mozStorageStatementScoper scoper(stmt); nsresult rv = URIBinder::Bind(stmt, NS_LITERAL_CSTRING("icon_url"), _icon.spec); NS_ENSURE_SUCCESS(rv, rv); bool hasResult; rv = stmt->ExecuteStep(&hasResult); NS_ENSURE_SUCCESS(rv, rv); if (!hasResult) { // The icon does not exist yet, bail out. return NS_OK; } rv = stmt->GetInt64(0, &_icon.id); NS_ENSURE_SUCCESS(rv, rv); // Expiration can be NULL. bool isNull; rv = stmt->GetIsNull(1, &isNull); NS_ENSURE_SUCCESS(rv, rv); if (!isNull) { rv = stmt->GetInt64(1, reinterpret_cast<int64_t*>(&_icon.expiration)); NS_ENSURE_SUCCESS(rv, rv); } // Data can be NULL. rv = stmt->GetIsNull(2, &isNull); NS_ENSURE_SUCCESS(rv, rv); if (!isNull) { uint8_t* data; uint32_t dataLen = 0; rv = stmt->GetBlob(2, &dataLen, &data); NS_ENSURE_SUCCESS(rv, rv); _icon.data.Adopt(TO_CHARBUFFER(data), dataLen); // Read mime only if we have data. rv = stmt->GetUTF8String(3, _icon.mimeType); NS_ENSURE_SUCCESS(rv, rv); } return NS_OK; }