/** * Lookup up a key in the database is a two step process: * * a) First we look for any Entries in the database that might apply to this * url. For each URL there are one or two possible domain names to check: * the two-part domain name (example.com) and the three-part name * (www.example.com). We check the database for both of these. * b) If we find any entries, we check the list of fragments for that entry * against the possible subfragments of the URL as described in the * "Simplified Regular Expression Lookup" section of the protocol doc. */ nsresult nsUrlClassifierDBServiceWorker::DoLookup(const nsACString& spec, nsIUrlClassifierLookupCallback* c) { if (gShuttingDownThread) { c->LookupComplete(nsnull); return NS_ERROR_NOT_INITIALIZED; } nsresult rv = OpenDb(); if (NS_FAILED(rv)) { c->LookupComplete(nsnull); return NS_ERROR_FAILURE; } #if defined(PR_LOGGING) PRIntervalTime clockStart = 0; if (LOG_ENABLED()) { clockStart = PR_IntervalNow(); } #endif nsAutoPtr<LookupResultArray> results(new LookupResultArray()); if (!results) { c->LookupComplete(nsnull); return NS_ERROR_OUT_OF_MEMORY; } // we ignore failures from Check because we'd rather return the // results that were found than fail. mClassifier->SetFreshTime(gFreshnessGuarantee); mClassifier->Check(spec, *results); LOG(("Found %d results.", results->Length())); #if defined(PR_LOGGING) if (LOG_ENABLED()) { PRIntervalTime clockEnd = PR_IntervalNow(); LOG(("query took %dms\n", PR_IntervalToMilliseconds(clockEnd - clockStart))); } #endif nsAutoPtr<LookupResultArray> completes(new LookupResultArray()); for (PRUint32 i = 0; i < results->Length(); i++) { if (!mMissCache.Contains(results->ElementAt(i).hash.prefix)) { completes->AppendElement(results->ElementAt(i)); } } for (PRUint32 i = 0; i < completes->Length(); i++) { if (!completes->ElementAt(i).Confirmed()) { // We're going to be doing a gethash request, add some extra entries. // Note that we cannot pass the first two by reference, because we // add to completes, whicah can cause completes to reallocate and move. AddNoise(completes->ElementAt(i).mCodedPrefix, completes->ElementAt(i).mTableName, mGethashNoise, *completes); break; } } // At this point ownership of 'results' is handed to the callback. c->LookupComplete(completes.forget()); return NS_OK; }