| 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 395 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 406 found = false; | 406 found = false; |
| 407 s = GetInt(transaction.get(), it->Key(), &database_id, &found); | 407 s = GetInt(transaction.get(), it->Key(), &database_id, &found); |
| 408 if (!s.ok()) { | 408 if (!s.ok()) { |
| 409 INTERNAL_READ_ERROR_UNTESTED(SET_UP_METADATA); | 409 INTERNAL_READ_ERROR_UNTESTED(SET_UP_METADATA); |
| 410 return s; | 410 return s; |
| 411 } | 411 } |
| 412 if (!found) { | 412 if (!found) { |
| 413 INTERNAL_CONSISTENCY_ERROR_UNTESTED(SET_UP_METADATA); | 413 INTERNAL_CONSISTENCY_ERROR_UNTESTED(SET_UP_METADATA); |
| 414 return InternalInconsistencyStatus(); | 414 return InternalInconsistencyStatus(); |
| 415 } | 415 } |
| 416 std::string int_version_key = DatabaseMetaDataKey::Encode( | 416 std::string version_key = DatabaseMetaDataKey::Encode( |
| 417 database_id, DatabaseMetaDataKey::USER_INT_VERSION); | 417 database_id, DatabaseMetaDataKey::USER_VERSION); |
| 418 PutVarInt(transaction.get(), | 418 PutVarInt(transaction.get(), version_key, |
| 419 int_version_key, | 419 IndexedDBDatabaseMetadata::DEFAULT_VERSION); |
| 420 IndexedDBDatabaseMetadata::DEFAULT_INT_VERSION); | |
| 421 } | 420 } |
| 422 } | 421 } |
| 423 if (s.ok() && db_schema_version < 2) { | 422 if (s.ok() && db_schema_version < 2) { |
| 424 db_schema_version = 2; | 423 db_schema_version = 2; |
| 425 PutInt(transaction.get(), schema_version_key, db_schema_version); | 424 PutInt(transaction.get(), schema_version_key, db_schema_version); |
| 426 db_data_version = blink::kSerializedScriptValueVersion; | 425 db_data_version = blink::kSerializedScriptValueVersion; |
| 427 PutInt(transaction.get(), data_version_key, db_data_version); | 426 PutInt(transaction.get(), data_version_key, db_data_version); |
| 428 } | 427 } |
| 429 if (db_schema_version < 3) { | 428 if (db_schema_version < 3) { |
| 430 db_schema_version = 3; | 429 db_schema_version = 3; |
| (...skipping 780 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1211 // Decode database id (in iterator value). | 1210 // Decode database id (in iterator value). |
| 1212 int64_t database_id = 0; | 1211 int64_t database_id = 0; |
| 1213 StringPiece value_slice(it->Value()); | 1212 StringPiece value_slice(it->Value()); |
| 1214 if (!DecodeInt(&value_slice, &database_id) || !value_slice.empty()) { | 1213 if (!DecodeInt(&value_slice, &database_id) || !value_slice.empty()) { |
| 1215 INTERNAL_CONSISTENCY_ERROR_UNTESTED(GET_DATABASE_NAMES); | 1214 INTERNAL_CONSISTENCY_ERROR_UNTESTED(GET_DATABASE_NAMES); |
| 1216 continue; | 1215 continue; |
| 1217 } | 1216 } |
| 1218 | 1217 |
| 1219 // Look up version by id. | 1218 // Look up version by id. |
| 1220 bool found = false; | 1219 bool found = false; |
| 1221 int64_t database_version = IndexedDBDatabaseMetadata::DEFAULT_INT_VERSION; | 1220 int64_t database_version = IndexedDBDatabaseMetadata::DEFAULT_VERSION; |
| 1222 *s = GetVarInt(db_.get(), | 1221 *s = GetVarInt(db_.get(), |
| 1223 DatabaseMetaDataKey::Encode( | 1222 DatabaseMetaDataKey::Encode( |
| 1224 database_id, DatabaseMetaDataKey::USER_INT_VERSION), | 1223 database_id, DatabaseMetaDataKey::USER_VERSION), |
| 1225 &database_version, | 1224 &database_version, &found); |
| 1226 &found); | |
| 1227 if (!s->ok() || !found) { | 1225 if (!s->ok() || !found) { |
| 1228 INTERNAL_READ_ERROR_UNTESTED(GET_DATABASE_NAMES); | 1226 INTERNAL_READ_ERROR_UNTESTED(GET_DATABASE_NAMES); |
| 1229 continue; | 1227 continue; |
| 1230 } | 1228 } |
| 1231 | 1229 |
| 1232 // Ignore stale metadata from failed initial opens. | 1230 // Ignore stale metadata from failed initial opens. |
| 1233 if (database_version != IndexedDBDatabaseMetadata::DEFAULT_INT_VERSION) | 1231 if (database_version != IndexedDBDatabaseMetadata::DEFAULT_VERSION) |
| 1234 found_names.push_back(database_name_key.database_name()); | 1232 found_names.push_back(database_name_key.database_name()); |
| 1235 } | 1233 } |
| 1236 | 1234 |
| 1237 if (!s->ok()) | 1235 if (!s->ok()) |
| 1238 INTERNAL_READ_ERROR(GET_DATABASE_NAMES); | 1236 INTERNAL_READ_ERROR(GET_DATABASE_NAMES); |
| 1239 | 1237 |
| 1240 return found_names; | 1238 return found_names; |
| 1241 } | 1239 } |
| 1242 | 1240 |
| 1243 leveldb::Status IndexedDBBackingStore::GetIDBDatabaseMetaData( | 1241 leveldb::Status IndexedDBBackingStore::GetIDBDatabaseMetaData( |
| 1244 const base::string16& name, | 1242 const base::string16& name, |
| 1245 IndexedDBDatabaseMetadata* metadata, | 1243 IndexedDBDatabaseMetadata* metadata, |
| 1246 bool* found) { | 1244 bool* found) { |
| 1247 const std::string key = DatabaseNameKey::Encode(origin_identifier_, name); | 1245 const std::string key = DatabaseNameKey::Encode(origin_identifier_, name); |
| 1248 *found = false; | 1246 *found = false; |
| 1249 | 1247 |
| 1250 leveldb::Status s = GetInt(db_.get(), key, &metadata->id, found); | 1248 leveldb::Status s = GetInt(db_.get(), key, &metadata->id, found); |
| 1251 if (!s.ok()) { | 1249 if (!s.ok()) { |
| 1252 INTERNAL_READ_ERROR(GET_IDBDATABASE_METADATA); | 1250 INTERNAL_READ_ERROR(GET_IDBDATABASE_METADATA); |
| 1253 return s; | 1251 return s; |
| 1254 } | 1252 } |
| 1255 if (!*found) | 1253 if (!*found) |
| 1256 return leveldb::Status::OK(); | 1254 return leveldb::Status::OK(); |
| 1257 | 1255 |
| 1258 s = GetVarInt(db_.get(), | 1256 s = GetVarInt(db_.get(), DatabaseMetaDataKey::Encode( |
| 1259 DatabaseMetaDataKey::Encode( | 1257 metadata->id, DatabaseMetaDataKey::USER_VERSION), |
| 1260 metadata->id, DatabaseMetaDataKey::USER_INT_VERSION), | 1258 &metadata->version, found); |
| 1261 &metadata->int_version, | |
| 1262 found); | |
| 1263 if (!s.ok()) { | 1259 if (!s.ok()) { |
| 1264 INTERNAL_READ_ERROR_UNTESTED(GET_IDBDATABASE_METADATA); | 1260 INTERNAL_READ_ERROR_UNTESTED(GET_IDBDATABASE_METADATA); |
| 1265 return s; | 1261 return s; |
| 1266 } | 1262 } |
| 1267 if (!*found) { | 1263 if (!*found) { |
| 1268 INTERNAL_CONSISTENCY_ERROR_UNTESTED(GET_IDBDATABASE_METADATA); | 1264 INTERNAL_CONSISTENCY_ERROR_UNTESTED(GET_IDBDATABASE_METADATA); |
| 1269 return InternalInconsistencyStatus(); | 1265 return InternalInconsistencyStatus(); |
| 1270 } | 1266 } |
| 1271 | 1267 |
| 1272 if (metadata->int_version == IndexedDBDatabaseMetadata::DEFAULT_INT_VERSION) | 1268 if (metadata->version == IndexedDBDatabaseMetadata::DEFAULT_VERSION) |
| 1273 metadata->int_version = IndexedDBDatabaseMetadata::NO_INT_VERSION; | 1269 metadata->version = IndexedDBDatabaseMetadata::NO_VERSION; |
| 1274 | 1270 |
| 1275 s = GetMaxObjectStoreId( | 1271 s = GetMaxObjectStoreId( |
| 1276 db_.get(), metadata->id, &metadata->max_object_store_id); | 1272 db_.get(), metadata->id, &metadata->max_object_store_id); |
| 1277 if (!s.ok()) { | 1273 if (!s.ok()) { |
| 1278 INTERNAL_READ_ERROR_UNTESTED(GET_IDBDATABASE_METADATA); | 1274 INTERNAL_READ_ERROR_UNTESTED(GET_IDBDATABASE_METADATA); |
| 1279 } | 1275 } |
| 1280 | 1276 |
| 1281 // We don't cache this, we just check it if it's there. | 1277 // We don't cache this, we just check it if it's there. |
| 1282 int64_t blob_key_generator_current_number = | 1278 int64_t blob_key_generator_current_number = |
| 1283 DatabaseMetaDataKey::kInvalidBlobKey; | 1279 DatabaseMetaDataKey::kInvalidBlobKey; |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1322 DCHECK_GE(max_database_id, 0); | 1318 DCHECK_GE(max_database_id, 0); |
| 1323 | 1319 |
| 1324 int64_t database_id = max_database_id + 1; | 1320 int64_t database_id = max_database_id + 1; |
| 1325 PutInt(transaction, MaxDatabaseIdKey::Encode(), database_id); | 1321 PutInt(transaction, MaxDatabaseIdKey::Encode(), database_id); |
| 1326 *new_id = database_id; | 1322 *new_id = database_id; |
| 1327 return leveldb::Status::OK(); | 1323 return leveldb::Status::OK(); |
| 1328 } | 1324 } |
| 1329 | 1325 |
| 1330 leveldb::Status IndexedDBBackingStore::CreateIDBDatabaseMetaData( | 1326 leveldb::Status IndexedDBBackingStore::CreateIDBDatabaseMetaData( |
| 1331 const base::string16& name, | 1327 const base::string16& name, |
| 1332 int64_t int_version, | 1328 int64_t version, |
| 1333 int64_t* row_id) { | 1329 int64_t* row_id) { |
| 1334 // TODO(jsbell): Don't persist metadata if open fails. http://crbug.com/395472 | 1330 // TODO(jsbell): Don't persist metadata if open fails. http://crbug.com/395472 |
| 1335 scoped_refptr<LevelDBTransaction> transaction = | 1331 scoped_refptr<LevelDBTransaction> transaction = |
| 1336 IndexedDBClassFactory::Get()->CreateLevelDBTransaction(db_.get()); | 1332 IndexedDBClassFactory::Get()->CreateLevelDBTransaction(db_.get()); |
| 1337 | 1333 |
| 1338 leveldb::Status s = GetNewDatabaseId(transaction.get(), row_id); | 1334 leveldb::Status s = GetNewDatabaseId(transaction.get(), row_id); |
| 1339 if (!s.ok()) | 1335 if (!s.ok()) |
| 1340 return s; | 1336 return s; |
| 1341 DCHECK_GE(*row_id, 0); | 1337 DCHECK_GE(*row_id, 0); |
| 1342 | 1338 |
| 1343 if (int_version == IndexedDBDatabaseMetadata::NO_INT_VERSION) | 1339 if (version == IndexedDBDatabaseMetadata::NO_VERSION) |
| 1344 int_version = IndexedDBDatabaseMetadata::DEFAULT_INT_VERSION; | 1340 version = IndexedDBDatabaseMetadata::DEFAULT_VERSION; |
| 1345 | 1341 |
| 1346 PutInt(transaction.get(), | 1342 PutInt(transaction.get(), |
| 1347 DatabaseNameKey::Encode(origin_identifier_, name), | 1343 DatabaseNameKey::Encode(origin_identifier_, name), |
| 1348 *row_id); | 1344 *row_id); |
| 1349 PutVarInt(transaction.get(), | 1345 PutVarInt(transaction.get(), DatabaseMetaDataKey::Encode( |
| 1350 DatabaseMetaDataKey::Encode(*row_id, | 1346 *row_id, DatabaseMetaDataKey::USER_VERSION), |
| 1351 DatabaseMetaDataKey::USER_INT_VERSION), | 1347 version); |
| 1352 int_version); | |
| 1353 PutVarInt( | 1348 PutVarInt( |
| 1354 transaction.get(), | 1349 transaction.get(), |
| 1355 DatabaseMetaDataKey::Encode( | 1350 DatabaseMetaDataKey::Encode( |
| 1356 *row_id, DatabaseMetaDataKey::BLOB_KEY_GENERATOR_CURRENT_NUMBER), | 1351 *row_id, DatabaseMetaDataKey::BLOB_KEY_GENERATOR_CURRENT_NUMBER), |
| 1357 DatabaseMetaDataKey::kBlobKeyGeneratorInitialNumber); | 1352 DatabaseMetaDataKey::kBlobKeyGeneratorInitialNumber); |
| 1358 | 1353 |
| 1359 s = transaction->Commit(); | 1354 s = transaction->Commit(); |
| 1360 if (!s.ok()) | 1355 if (!s.ok()) |
| 1361 INTERNAL_WRITE_ERROR_UNTESTED(CREATE_IDBDATABASE_METADATA); | 1356 INTERNAL_WRITE_ERROR_UNTESTED(CREATE_IDBDATABASE_METADATA); |
| 1362 return s; | 1357 return s; |
| 1363 } | 1358 } |
| 1364 | 1359 |
| 1365 bool IndexedDBBackingStore::UpdateIDBDatabaseIntVersion( | 1360 bool IndexedDBBackingStore::UpdateIDBDatabaseIntVersion( |
| 1366 IndexedDBBackingStore::Transaction* transaction, | 1361 IndexedDBBackingStore::Transaction* transaction, |
| 1367 int64_t row_id, | 1362 int64_t row_id, |
| 1368 int64_t int_version) { | 1363 int64_t version) { |
| 1369 if (int_version == IndexedDBDatabaseMetadata::NO_INT_VERSION) | 1364 if (version == IndexedDBDatabaseMetadata::NO_VERSION) |
| 1370 int_version = IndexedDBDatabaseMetadata::DEFAULT_INT_VERSION; | 1365 version = IndexedDBDatabaseMetadata::DEFAULT_VERSION; |
| 1371 DCHECK_GE(int_version, 0) << "int_version was " << int_version; | 1366 DCHECK_GE(version, 0) << "version was " << version; |
| 1372 PutVarInt(transaction->transaction(), | 1367 PutVarInt( |
| 1373 DatabaseMetaDataKey::Encode(row_id, | 1368 transaction->transaction(), |
| 1374 DatabaseMetaDataKey::USER_INT_VERSION), | 1369 DatabaseMetaDataKey::Encode(row_id, DatabaseMetaDataKey::USER_VERSION), |
| 1375 int_version); | 1370 version); |
| 1376 return true; | 1371 return true; |
| 1377 } | 1372 } |
| 1378 | 1373 |
| 1379 // If you're deleting a range that contains user keys that have blob info, this | 1374 // If you're deleting a range that contains user keys that have blob info, this |
| 1380 // won't clean up the blobs. | 1375 // won't clean up the blobs. |
| 1381 static leveldb::Status DeleteRangeBasic(LevelDBTransaction* transaction, | 1376 static leveldb::Status DeleteRangeBasic(LevelDBTransaction* transaction, |
| 1382 const std::string& begin, | 1377 const std::string& begin, |
| 1383 const std::string& end, | 1378 const std::string& end, |
| 1384 bool upper_open) { | 1379 bool upper_open) { |
| 1385 scoped_ptr<LevelDBIterator> it = transaction->CreateIterator(); | 1380 scoped_ptr<LevelDBIterator> it = transaction->CreateIterator(); |
| (...skipping 3099 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4485 | 4480 |
| 4486 IndexedDBBackingStore::Transaction::WriteDescriptor::WriteDescriptor( | 4481 IndexedDBBackingStore::Transaction::WriteDescriptor::WriteDescriptor( |
| 4487 const WriteDescriptor& other) = default; | 4482 const WriteDescriptor& other) = default; |
| 4488 IndexedDBBackingStore::Transaction::WriteDescriptor::~WriteDescriptor() = | 4483 IndexedDBBackingStore::Transaction::WriteDescriptor::~WriteDescriptor() = |
| 4489 default; | 4484 default; |
| 4490 IndexedDBBackingStore::Transaction::WriteDescriptor& | 4485 IndexedDBBackingStore::Transaction::WriteDescriptor& |
| 4491 IndexedDBBackingStore::Transaction::WriteDescriptor:: | 4486 IndexedDBBackingStore::Transaction::WriteDescriptor:: |
| 4492 operator=(const WriteDescriptor& other) = default; | 4487 operator=(const WriteDescriptor& other) = default; |
| 4493 | 4488 |
| 4494 } // namespace content | 4489 } // namespace content |
| OLD | NEW |