OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/indexed_db/indexed_db_backing_store.h" | 5 #include "content/browser/indexed_db/indexed_db_backing_store.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/files/file_path.h" | 10 #include "base/files/file_path.h" |
(...skipping 681 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
692 PutInt(transaction, MaxDatabaseIdKey::Encode(), database_id); | 692 PutInt(transaction, MaxDatabaseIdKey::Encode(), database_id); |
693 *new_id = database_id; | 693 *new_id = database_id; |
694 return Status::OK(); | 694 return Status::OK(); |
695 } | 695 } |
696 | 696 |
697 // If you're deleting a range that contains user keys that have blob info, this | 697 // If you're deleting a range that contains user keys that have blob info, this |
698 // won't clean up the blobs. | 698 // won't clean up the blobs. |
699 Status DeleteRangeBasic(LevelDBTransaction* transaction, | 699 Status DeleteRangeBasic(LevelDBTransaction* transaction, |
700 const std::string& begin, | 700 const std::string& begin, |
701 const std::string& end, | 701 const std::string& end, |
702 bool upper_open, | 702 bool upper_open) { |
703 size_t* delete_count) { | 703 return transaction->RemoveRange(begin, end, upper_open); |
704 DCHECK(delete_count); | |
705 std::unique_ptr<LevelDBIterator> it = transaction->CreateIterator(); | |
706 Status s; | |
707 *delete_count = 0; | |
708 for (s = it->Seek(begin); s.ok() && it->IsValid() && | |
709 (upper_open ? CompareKeys(it->Key(), end) < 0 | |
710 : CompareKeys(it->Key(), end) <= 0); | |
711 s = it->Next()) { | |
712 if (transaction->Remove(it->Key())) | |
713 (*delete_count)++; | |
714 } | |
715 return s; | |
716 } | 704 } |
717 | 705 |
718 Status DeleteBlobsInRange(IndexedDBBackingStore::Transaction* transaction, | 706 Status DeleteBlobsInRange(IndexedDBBackingStore::Transaction* transaction, |
719 int64_t database_id, | 707 int64_t database_id, |
720 int64_t object_store_id, | 708 int64_t object_store_id, |
721 const std::string& start_key, | 709 const std::string& start_key, |
722 const std::string& end_key, | 710 const std::string& end_key, |
723 bool upper_open) { | 711 bool upper_open) { |
724 std::unique_ptr<LevelDBIterator> it = | 712 std::unique_ptr<LevelDBIterator> it = |
725 transaction->transaction()->CreateIterator(); | 713 transaction->transaction()->CreateIterator(); |
(...skipping 1267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1993 Status IndexedDBBackingStore::DeleteObjectStore( | 1981 Status IndexedDBBackingStore::DeleteObjectStore( |
1994 IndexedDBBackingStore::Transaction* transaction, | 1982 IndexedDBBackingStore::Transaction* transaction, |
1995 int64_t database_id, | 1983 int64_t database_id, |
1996 int64_t object_store_id) { | 1984 int64_t object_store_id) { |
1997 IDB_TRACE("IndexedDBBackingStore::DeleteObjectStore"); | 1985 IDB_TRACE("IndexedDBBackingStore::DeleteObjectStore"); |
1998 if (!KeyPrefix::ValidIds(database_id, object_store_id)) | 1986 if (!KeyPrefix::ValidIds(database_id, object_store_id)) |
1999 return InvalidDBKeyStatus(); | 1987 return InvalidDBKeyStatus(); |
2000 LevelDBTransaction* leveldb_transaction = transaction->transaction(); | 1988 LevelDBTransaction* leveldb_transaction = transaction->transaction(); |
2001 | 1989 |
2002 base::string16 object_store_name; | 1990 base::string16 object_store_name; |
2003 size_t delete_count = 0; | |
2004 bool found = false; | 1991 bool found = false; |
2005 Status s = GetString(leveldb_transaction, ObjectStoreMetaDataKey::Encode( | 1992 Status s = GetString(leveldb_transaction, ObjectStoreMetaDataKey::Encode( |
2006 database_id, object_store_id, | 1993 database_id, object_store_id, |
2007 ObjectStoreMetaDataKey::NAME), | 1994 ObjectStoreMetaDataKey::NAME), |
2008 &object_store_name, &found); | 1995 &object_store_name, &found); |
2009 if (!s.ok()) { | 1996 if (!s.ok()) { |
2010 INTERNAL_READ_ERROR_UNTESTED(DELETE_OBJECT_STORE); | 1997 INTERNAL_READ_ERROR_UNTESTED(DELETE_OBJECT_STORE); |
2011 return s; | 1998 return s; |
2012 } | 1999 } |
2013 if (!found) { | 2000 if (!found) { |
2014 INTERNAL_CONSISTENCY_ERROR_UNTESTED(DELETE_OBJECT_STORE); | 2001 INTERNAL_CONSISTENCY_ERROR_UNTESTED(DELETE_OBJECT_STORE); |
2015 return InternalInconsistencyStatus(); | 2002 return InternalInconsistencyStatus(); |
2016 } | 2003 } |
2017 | 2004 |
2018 s = DeleteBlobsInObjectStore(transaction, database_id, object_store_id); | 2005 s = DeleteBlobsInObjectStore(transaction, database_id, object_store_id); |
2019 if (!s.ok()) { | 2006 if (!s.ok()) { |
2020 INTERNAL_CONSISTENCY_ERROR_UNTESTED(DELETE_OBJECT_STORE); | 2007 INTERNAL_CONSISTENCY_ERROR_UNTESTED(DELETE_OBJECT_STORE); |
2021 return s; | 2008 return s; |
2022 } | 2009 } |
2023 | 2010 |
2024 s = DeleteRangeBasic( | 2011 s = DeleteRangeBasic( |
2025 leveldb_transaction, | 2012 leveldb_transaction, |
2026 ObjectStoreMetaDataKey::Encode(database_id, object_store_id, 0), | 2013 ObjectStoreMetaDataKey::Encode(database_id, object_store_id, 0), |
2027 ObjectStoreMetaDataKey::EncodeMaxKey(database_id, object_store_id), true, | 2014 ObjectStoreMetaDataKey::EncodeMaxKey(database_id, object_store_id), true); |
2028 &delete_count); | |
2029 | 2015 |
2030 if (s.ok()) { | 2016 if (s.ok()) { |
2031 leveldb_transaction->Remove( | 2017 leveldb_transaction->Remove( |
2032 ObjectStoreNamesKey::Encode(database_id, object_store_name)); | 2018 ObjectStoreNamesKey::Encode(database_id, object_store_name)); |
2033 | 2019 |
2034 s = DeleteRangeBasic( | 2020 s = DeleteRangeBasic( |
2035 leveldb_transaction, | 2021 leveldb_transaction, |
2036 IndexFreeListKey::Encode(database_id, object_store_id, 0), | 2022 IndexFreeListKey::Encode(database_id, object_store_id, 0), |
2037 IndexFreeListKey::EncodeMaxKey(database_id, object_store_id), true, | 2023 IndexFreeListKey::EncodeMaxKey(database_id, object_store_id), true); |
2038 &delete_count); | |
2039 } | 2024 } |
2040 | 2025 |
2041 if (s.ok()) { | 2026 if (s.ok()) { |
2042 s = DeleteRangeBasic( | 2027 s = DeleteRangeBasic( |
2043 leveldb_transaction, | 2028 leveldb_transaction, |
2044 IndexMetaDataKey::Encode(database_id, object_store_id, 0, 0), | 2029 IndexMetaDataKey::Encode(database_id, object_store_id, 0, 0), |
2045 IndexMetaDataKey::EncodeMaxKey(database_id, object_store_id), true, | 2030 IndexMetaDataKey::EncodeMaxKey(database_id, object_store_id), true); |
2046 &delete_count); | |
2047 } | 2031 } |
2048 | 2032 |
2049 if (!s.ok()) { | 2033 if (!s.ok()) { |
2050 INTERNAL_WRITE_ERROR_UNTESTED(DELETE_OBJECT_STORE); | 2034 INTERNAL_WRITE_ERROR_UNTESTED(DELETE_OBJECT_STORE); |
2051 return s; | 2035 return s; |
2052 } | 2036 } |
2053 | 2037 |
2054 return ClearObjectStore(transaction, database_id, object_store_id); | 2038 return ClearObjectStore(transaction, database_id, object_store_id); |
2055 } | 2039 } |
2056 | 2040 |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2183 IndexedDBBackingStore::Transaction* transaction, | 2167 IndexedDBBackingStore::Transaction* transaction, |
2184 int64_t database_id, | 2168 int64_t database_id, |
2185 int64_t object_store_id) { | 2169 int64_t object_store_id) { |
2186 IDB_TRACE("IndexedDBBackingStore::ClearObjectStore"); | 2170 IDB_TRACE("IndexedDBBackingStore::ClearObjectStore"); |
2187 if (!KeyPrefix::ValidIds(database_id, object_store_id)) | 2171 if (!KeyPrefix::ValidIds(database_id, object_store_id)) |
2188 return InvalidDBKeyStatus(); | 2172 return InvalidDBKeyStatus(); |
2189 const std::string start_key = | 2173 const std::string start_key = |
2190 KeyPrefix(database_id, object_store_id).Encode(); | 2174 KeyPrefix(database_id, object_store_id).Encode(); |
2191 const std::string stop_key = | 2175 const std::string stop_key = |
2192 KeyPrefix(database_id, object_store_id + 1).Encode(); | 2176 KeyPrefix(database_id, object_store_id + 1).Encode(); |
2193 size_t delete_count = 0; | 2177 Status s = |
2194 Status s = DeleteRangeBasic(transaction->transaction(), start_key, stop_key, | 2178 DeleteRangeBasic(transaction->transaction(), start_key, stop_key, true); |
2195 true, &delete_count); | |
2196 if (!s.ok()) { | 2179 if (!s.ok()) { |
2197 INTERNAL_WRITE_ERROR(CLEAR_OBJECT_STORE); | 2180 INTERNAL_WRITE_ERROR(CLEAR_OBJECT_STORE); |
2198 return s; | 2181 return s; |
2199 } | 2182 } |
2200 return DeleteBlobsInObjectStore(transaction, database_id, object_store_id); | 2183 return DeleteBlobsInObjectStore(transaction, database_id, object_store_id); |
2201 } | 2184 } |
2202 | 2185 |
2203 Status IndexedDBBackingStore::DeleteRecord( | 2186 Status IndexedDBBackingStore::DeleteRecord( |
2204 IndexedDBBackingStore::Transaction* transaction, | 2187 IndexedDBBackingStore::Transaction* transaction, |
2205 int64_t database_id, | 2188 int64_t database_id, |
(...skipping 15 matching lines...) Expand all Loading... |
2221 const std::string exists_entry_key = ExistsEntryKey::Encode( | 2204 const std::string exists_entry_key = ExistsEntryKey::Encode( |
2222 database_id, object_store_id, record_identifier.primary_key()); | 2205 database_id, object_store_id, record_identifier.primary_key()); |
2223 leveldb_transaction->Remove(exists_entry_key); | 2206 leveldb_transaction->Remove(exists_entry_key); |
2224 return Status::OK(); | 2207 return Status::OK(); |
2225 } | 2208 } |
2226 | 2209 |
2227 Status IndexedDBBackingStore::DeleteRange( | 2210 Status IndexedDBBackingStore::DeleteRange( |
2228 IndexedDBBackingStore::Transaction* transaction, | 2211 IndexedDBBackingStore::Transaction* transaction, |
2229 int64_t database_id, | 2212 int64_t database_id, |
2230 int64_t object_store_id, | 2213 int64_t object_store_id, |
2231 const IndexedDBKeyRange& key_range, | 2214 const IndexedDBKeyRange& key_range) { |
2232 size_t* exists_delete_count) { | |
2233 DCHECK(exists_delete_count); | |
2234 Status s; | 2215 Status s; |
2235 *exists_delete_count = 0; | |
2236 std::unique_ptr<IndexedDBBackingStore::Cursor> start_cursor = | 2216 std::unique_ptr<IndexedDBBackingStore::Cursor> start_cursor = |
2237 OpenObjectStoreCursor(transaction, database_id, object_store_id, | 2217 OpenObjectStoreCursor(transaction, database_id, object_store_id, |
2238 key_range, blink::WebIDBCursorDirectionNext, &s); | 2218 key_range, blink::WebIDBCursorDirectionNext, &s); |
2239 if (!s.ok()) | 2219 if (!s.ok()) |
2240 return s; | 2220 return s; |
2241 if (!start_cursor) | 2221 if (!start_cursor) |
2242 return Status::OK(); // Empty range == delete success. | 2222 return Status::OK(); // Empty range == delete success. |
2243 std::unique_ptr<IndexedDBBackingStore::Cursor> end_cursor = | 2223 std::unique_ptr<IndexedDBBackingStore::Cursor> end_cursor = |
2244 OpenObjectStoreCursor(transaction, database_id, object_store_id, | 2224 OpenObjectStoreCursor(transaction, database_id, object_store_id, |
2245 key_range, blink::WebIDBCursorDirectionPrev, &s); | 2225 key_range, blink::WebIDBCursorDirectionPrev, &s); |
(...skipping 16 matching lines...) Expand all Loading... |
2262 return InternalInconsistencyStatus(); | 2242 return InternalInconsistencyStatus(); |
2263 | 2243 |
2264 s = DeleteBlobsInRange(transaction, | 2244 s = DeleteBlobsInRange(transaction, |
2265 database_id, | 2245 database_id, |
2266 object_store_id, | 2246 object_store_id, |
2267 start_blob_key.Encode(), | 2247 start_blob_key.Encode(), |
2268 end_blob_key.Encode(), | 2248 end_blob_key.Encode(), |
2269 false); | 2249 false); |
2270 if (!s.ok()) | 2250 if (!s.ok()) |
2271 return s; | 2251 return s; |
2272 size_t data_delete_count = 0; | 2252 s = DeleteRangeBasic(transaction->transaction(), start_key, stop_key, false); |
2273 s = DeleteRangeBasic(transaction->transaction(), start_key, stop_key, false, | |
2274 &data_delete_count); | |
2275 if (!s.ok()) | 2253 if (!s.ok()) |
2276 return s; | 2254 return s; |
2277 start_key = | 2255 start_key = |
2278 ExistsEntryKey::Encode(database_id, object_store_id, start_cursor->key()); | 2256 ExistsEntryKey::Encode(database_id, object_store_id, start_cursor->key()); |
2279 stop_key = | 2257 stop_key = |
2280 ExistsEntryKey::Encode(database_id, object_store_id, end_cursor->key()); | 2258 ExistsEntryKey::Encode(database_id, object_store_id, end_cursor->key()); |
2281 | 2259 |
2282 s = DeleteRangeBasic(transaction->transaction(), start_key, stop_key, false, | 2260 s = DeleteRangeBasic(transaction->transaction(), start_key, stop_key, false); |
2283 exists_delete_count); | |
2284 DCHECK_EQ(data_delete_count, *exists_delete_count); | |
2285 return s; | 2261 return s; |
2286 } | 2262 } |
2287 | 2263 |
2288 Status IndexedDBBackingStore::GetKeyGeneratorCurrentNumber( | 2264 Status IndexedDBBackingStore::GetKeyGeneratorCurrentNumber( |
2289 IndexedDBBackingStore::Transaction* transaction, | 2265 IndexedDBBackingStore::Transaction* transaction, |
2290 int64_t database_id, | 2266 int64_t database_id, |
2291 int64_t object_store_id, | 2267 int64_t object_store_id, |
2292 int64_t* key_generator_current_number) { | 2268 int64_t* key_generator_current_number) { |
2293 if (!KeyPrefix::ValidIds(database_id, object_store_id)) | 2269 if (!KeyPrefix::ValidIds(database_id, object_store_id)) |
2294 return InvalidDBKeyStatus(); | 2270 return InvalidDBKeyStatus(); |
(...skipping 727 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3022 Status IndexedDBBackingStore::DeleteIndex( | 2998 Status IndexedDBBackingStore::DeleteIndex( |
3023 IndexedDBBackingStore::Transaction* transaction, | 2999 IndexedDBBackingStore::Transaction* transaction, |
3024 int64_t database_id, | 3000 int64_t database_id, |
3025 int64_t object_store_id, | 3001 int64_t object_store_id, |
3026 int64_t index_id) { | 3002 int64_t index_id) { |
3027 IDB_TRACE("IndexedDBBackingStore::DeleteIndex"); | 3003 IDB_TRACE("IndexedDBBackingStore::DeleteIndex"); |
3028 if (!KeyPrefix::ValidIds(database_id, object_store_id, index_id)) | 3004 if (!KeyPrefix::ValidIds(database_id, object_store_id, index_id)) |
3029 return InvalidDBKeyStatus(); | 3005 return InvalidDBKeyStatus(); |
3030 LevelDBTransaction* leveldb_transaction = transaction->transaction(); | 3006 LevelDBTransaction* leveldb_transaction = transaction->transaction(); |
3031 | 3007 |
3032 size_t delete_count = 0; | |
3033 const std::string index_meta_data_start = | 3008 const std::string index_meta_data_start = |
3034 IndexMetaDataKey::Encode(database_id, object_store_id, index_id, 0); | 3009 IndexMetaDataKey::Encode(database_id, object_store_id, index_id, 0); |
3035 const std::string index_meta_data_end = | 3010 const std::string index_meta_data_end = |
3036 IndexMetaDataKey::EncodeMaxKey(database_id, object_store_id, index_id); | 3011 IndexMetaDataKey::EncodeMaxKey(database_id, object_store_id, index_id); |
3037 Status s = DeleteRangeBasic(leveldb_transaction, index_meta_data_start, | 3012 Status s = DeleteRangeBasic(leveldb_transaction, index_meta_data_start, |
3038 index_meta_data_end, true, &delete_count); | 3013 index_meta_data_end, true); |
3039 | 3014 |
3040 if (s.ok()) { | 3015 if (s.ok()) { |
3041 const std::string index_data_start = | 3016 const std::string index_data_start = |
3042 IndexDataKey::EncodeMinKey(database_id, object_store_id, index_id); | 3017 IndexDataKey::EncodeMinKey(database_id, object_store_id, index_id); |
3043 const std::string index_data_end = | 3018 const std::string index_data_end = |
3044 IndexDataKey::EncodeMaxKey(database_id, object_store_id, index_id); | 3019 IndexDataKey::EncodeMaxKey(database_id, object_store_id, index_id); |
3045 s = DeleteRangeBasic(leveldb_transaction, index_data_start, index_data_end, | 3020 s = DeleteRangeBasic(leveldb_transaction, index_data_start, index_data_end, |
3046 true, &delete_count); | 3021 true); |
3047 } | 3022 } |
3048 | 3023 |
3049 if (!s.ok()) | 3024 if (!s.ok()) |
3050 INTERNAL_WRITE_ERROR_UNTESTED(DELETE_INDEX); | 3025 INTERNAL_WRITE_ERROR_UNTESTED(DELETE_INDEX); |
3051 | 3026 |
3052 return s; | 3027 return s; |
3053 } | 3028 } |
3054 | 3029 |
3055 Status IndexedDBBackingStore::RenameIndex( | 3030 Status IndexedDBBackingStore::RenameIndex( |
3056 IndexedDBBackingStore::Transaction* transaction, | 3031 IndexedDBBackingStore::Transaction* transaction, |
(...skipping 1418 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4475 | 4450 |
4476 IndexedDBBackingStore::Transaction::WriteDescriptor::WriteDescriptor( | 4451 IndexedDBBackingStore::Transaction::WriteDescriptor::WriteDescriptor( |
4477 const WriteDescriptor& other) = default; | 4452 const WriteDescriptor& other) = default; |
4478 IndexedDBBackingStore::Transaction::WriteDescriptor::~WriteDescriptor() = | 4453 IndexedDBBackingStore::Transaction::WriteDescriptor::~WriteDescriptor() = |
4479 default; | 4454 default; |
4480 IndexedDBBackingStore::Transaction::WriteDescriptor& | 4455 IndexedDBBackingStore::Transaction::WriteDescriptor& |
4481 IndexedDBBackingStore::Transaction::WriteDescriptor:: | 4456 IndexedDBBackingStore::Transaction::WriteDescriptor:: |
4482 operator=(const WriteDescriptor& other) = default; | 4457 operator=(const WriteDescriptor& other) = default; |
4483 | 4458 |
4484 } // namespace content | 4459 } // namespace content |
OLD | NEW |