void LocalStorageDatabase::importItems(StorageMap& storageMap) { // FIXME: If it can't import, then the default WebKit behavior should be that of private browsing, // not silently ignoring it. https://bugs.webkit.org/show_bug.cgi?id=25894 openDatabase(SkipIfNonExistent); if (!m_database.isOpen()) return; SQLiteStatement query(m_database, "SELECT key, value FROM ItemTable"); if (query.prepare() != SQLResultOk) { LOG_ERROR("Unable to select items from ItemTable for local storage"); return; } HashMap<String, String> items; int result = query.step(); while (result == SQLResultRow) { items.set(query.getColumnText(0), query.getColumnBlobAsString(1)); result = query.step(); } if (result != SQLResultDone) { LOG_ERROR("Error reading items from ItemTable for local storage"); return; } storageMap.importItems(items); }
void ClearManager::onStart() { while (true) { int task = 0; bool result = false; StorageMap images; { QMutexLocker lock(&data->mutex); if (data->tasks.isEmpty()) { data->working = false; break; } task = data->tasks.at(0); images = data->images; } switch (task) { case ClearManagerAll: result = (QDir(cTempDir()).removeRecursively() && QDir(_basePath).removeRecursively()); break; case ClearManagerDownloads: result = QDir(cTempDir()).removeRecursively(); break; case ClearManagerImages: for (StorageMap::const_iterator i = images.cbegin(), e = images.cend(); i != e; ++i) { clearKey(i.value().first, false); } result = true; break; } { QMutexLocker lock(&data->mutex); if (data->tasks.at(0) == task) { data->tasks.pop_front(); if (data->tasks.isEmpty()) { data->working = false; } } if (result) { emit succeed(task, data->working ? 0 : this); } else { emit failed(task, data->working ? 0 : this); } if (!data->working) break; } } }
/// Use the summary analysis to check whether a call to the given /// function would conflict with any in progress accesses. The starting /// index indicates what index into the the callee's parameters the /// arguments array starts at -- this is useful for partial_apply functions, /// which pass only a suffix of the callee's arguments at the apply site. static void checkForViolationWithCall( const StorageMap &Accesses, SILFunction *Callee, unsigned StartingAtIndex, OperandValueArrayRef Arguments, AccessSummaryAnalysis *ASA, llvm::SmallVectorImpl<ConflictingAccess> &ConflictingAccesses) { const AccessSummaryAnalysis::FunctionSummary &FS = ASA->getOrCreateSummary(Callee); // For each argument in the suffix of the callee arguments being passed // at this call site, determine whether the arguments will be accessed // in a way that conflicts with any currently in progress accesses. // If so, diagnose. for (unsigned ArgumentIndex : indices(Arguments)) { unsigned CalleeIndex = StartingAtIndex + ArgumentIndex; const AccessSummaryAnalysis::ArgumentSummary &AS = FS.getAccessForArgument(CalleeIndex); const auto &SubAccesses = AS.getSubAccesses(); // Is the capture accessed in the callee? if (SubAccesses.size() == 0) continue; SILValue Argument = Arguments[ArgumentIndex]; assert(Argument->getType().isAddress()); const AccessedStorage &Storage = findAccessedStorage(Argument); auto AccessIt = Accesses.find(Storage); // Are there any accesses in progress at the time of the call? if (AccessIt == Accesses.end()) continue; const AccessInfo &Info = AccessIt->getSecond(); if (auto Conflict = findConflictingArgumentAccess(AS, Storage, Info)) { ConflictingAccesses.push_back(*Conflict); } } }
void LocalStorageDatabase::importItems(StorageMap& storageMap) { if (m_didImportItems) return; // FIXME: If it can't import, then the default WebKit behavior should be that of private browsing, // not silently ignoring it. https://bugs.webkit.org/show_bug.cgi?id=25894 // We set this to true even if we don't end up importing any items due to failure because // there's really no good way to recover other than not importing anything. m_didImportItems = true; openDatabase(SkipIfNonExistent); if (!m_database.isOpen()) return; SQLiteStatement query(m_database, "SELECT key, value FROM ItemTable"); if (query.prepare() != SQLITE_OK) { LOG_ERROR("Unable to select items from ItemTable for local storage"); return; } HashMap<String, String> items; int result = query.step(); while (result == SQLITE_ROW) { String key = query.getColumnText(0); String value = query.getColumnBlobAsString(1); if (!key.isNull() && !value.isNull()) items.set(key, value); result = query.step(); } if (result != SQLITE_DONE) { LOG_ERROR("Error reading items from ItemTable for local storage"); return; } storageMap.importItems(items); }