Example #1
0
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;
}
Example #2
0
/**
 * 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;
}