Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(52)

Unified Diff: webkit/dom_storage/session_storage_database.cc

Issue 9963107: Persist sessionStorage on disk. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Test update. Created 8 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: webkit/dom_storage/session_storage_database.cc
diff --git a/webkit/dom_storage/session_storage_database.cc b/webkit/dom_storage/session_storage_database.cc
index 11db6e5fbdd152c081c52751c334e26d0c6604e5..a1ea5260f43ee69cf7c8f6fcd0bb86adcc42016c 100644
--- a/webkit/dom_storage/session_storage_database.cc
+++ b/webkit/dom_storage/session_storage_database.cc
@@ -108,7 +108,7 @@ bool SessionStorageDatabase::CommitAreaChanges(int64 namespace_id,
return DatabaseErrorCheck(s.ok());
}
-bool SessionStorageDatabase::CloneNamespace(int64 namespace_id,
+void SessionStorageDatabase::CloneNamespace(int64 namespace_id,
int64 new_namespace_id) {
// Go through all origins in the namespace |namespace_id|, create placeholders
// for them in |new_namespace_id|, and associate them with the existing maps.
@@ -128,40 +128,40 @@ bool SessionStorageDatabase::CloneNamespace(int64 namespace_id,
// | namespace-2-origin1 | 1 (mapid) << references the same map
if (!LazyOpen(true))
- return false;
+ return;
leveldb::WriteBatch batch;
const bool kOkIfExists = false;
if (!CreateNamespace(new_namespace_id, kOkIfExists, &batch))
- return false;
+ return;
std::map<std::string, std::string> areas;
if (!GetAreasInNamespace(namespace_id, &areas))
- return false;
+ return;
for (std::map<std::string, std::string>::const_iterator it = areas.begin();
it != areas.end(); ++it) {
const std::string& origin = it->first;
const std::string& map_id = it->second;
if (!IncreaseMapRefCount(map_id, &batch))
- return false;
+ return;
AddAreaToNamespace(new_namespace_id, origin, map_id, &batch);
}
leveldb::Status s = db_->Write(leveldb::WriteOptions(), &batch);
- return DatabaseErrorCheck(s.ok());
+ DatabaseErrorCheck(s.ok());
}
-bool SessionStorageDatabase::DeleteArea(int64 namespace_id,
+void SessionStorageDatabase::DeleteArea(int64 namespace_id,
const GURL& origin) {
if (!LazyOpen(false)) {
// No need to create the database if it doesn't exist.
- return true;
+ return;
}
leveldb::WriteBatch batch;
- if (!DeleteArea(namespace_id, origin.spec(), &batch))
- return false;
+ if (!DeleteAreaHelper(namespace_id, origin.spec(), &batch))
+ return;
leveldb::Status s = db_->Write(leveldb::WriteOptions(), &batch);
- return DatabaseErrorCheck(s.ok());
+ DatabaseErrorCheck(s.ok());
}
bool SessionStorageDatabase::DeleteNamespace(int64 namespace_id) {
@@ -177,7 +177,7 @@ bool SessionStorageDatabase::DeleteNamespace(int64 namespace_id) {
for (std::map<std::string, std::string>::const_iterator it = areas.begin();
it != areas.end(); ++it) {
const std::string& origin = it->first;
- if (!DeleteArea(namespace_id, origin, &batch))
+ if (!DeleteAreaHelper(namespace_id, origin, &batch))
return false;
}
batch.Delete(NamespaceStartKey(namespace_id, namespace_offset_));
@@ -185,6 +185,43 @@ bool SessionStorageDatabase::DeleteNamespace(int64 namespace_id) {
return DatabaseErrorCheck(s.ok());
}
+bool SessionStorageDatabase::ReadNamespaceIds(
+ std::vector<int64>* namespace_ids) {
+ if (!LazyOpen(true))
+ return false;
+
+ std::string namespace_prefix = NamespacePrefix();
+ scoped_ptr<leveldb::Iterator> it(db_->NewIterator(leveldb::ReadOptions()));
+ it->Seek(namespace_prefix);
+ if (it->status().IsNotFound())
+ return true;
+
+ if (!DatabaseErrorCheck(it->status().ok()))
+ return false;
+
+ // Skip the dummy entry "namespace-" and iterate the namespaces.
+ for (it->Next(); it->Valid(); it->Next()) {
+ std::string key = it->key().ToString();
+ if (key.find(namespace_prefix) != 0) {
+ // Iterated past the "namespace-" keys.
+ break;
+ }
+ size_t second_dash = key.find('-', namespace_prefix.length());
+ if (second_dash != std::string::npos)
+ continue;
+
+ // The key is of the form "namespace-<namespaceid>".
+ std::string namespace_id_str = key.substr(namespace_prefix.length());
+ int64 namespace_id;
+ bool conversion_ok =
+ base::StringToInt64(namespace_id_str, &namespace_id);
+ if (!ConsistencyCheck(conversion_ok))
+ return false;
+ namespace_ids->push_back(namespace_id - namespace_offset_);
+ }
+ return true;
+}
+
bool SessionStorageDatabase::LazyOpen(bool create_if_needed) {
base::AutoLock auto_lock(db_lock_);
if (db_error_ || is_inconsistent_) {
@@ -370,16 +407,17 @@ void SessionStorageDatabase::AddAreaToNamespace(int64 namespace_id,
batch->Put(namespace_key, map_id);
}
-bool SessionStorageDatabase::DeleteArea(int64 namespace_id,
- const std::string& origin,
- leveldb::WriteBatch* batch) {
- return DeleteArea(NamespaceIdStr(namespace_id, namespace_offset_),
- origin, batch);
+bool SessionStorageDatabase::DeleteAreaHelper(int64 namespace_id,
+ const std::string& origin,
+ leveldb::WriteBatch* batch) {
+ return DeleteAreaHelper(NamespaceIdStr(namespace_id, namespace_offset_),
+ origin, batch);
}
-bool SessionStorageDatabase::DeleteArea(const std::string& namespace_id_str,
- const std::string& origin,
- leveldb::WriteBatch* batch) {
+bool SessionStorageDatabase::DeleteAreaHelper(
+ const std::string& namespace_id_str,
+ const std::string& origin,
+ leveldb::WriteBatch* batch) {
std::string map_id;
bool exists;
if (!GetMapForArea(namespace_id_str, origin, &exists, &map_id))

Powered by Google App Engine
This is Rietveld 408576698