| 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_index_writer.h" | 5 #include "content/browser/indexed_db/indexed_db_index_writer.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "base/strings/utf_string_conversions.h" | 8 #include "base/strings/utf_string_conversions.h" |
| 9 #include "content/browser/indexed_db/indexed_db_backing_store.h" | 9 #include "content/browser/indexed_db/indexed_db_backing_store.h" |
| 10 #include "content/browser/indexed_db/indexed_db_tracing.h" | 10 #include "content/browser/indexed_db/indexed_db_tracing.h" |
| (...skipping 20 matching lines...) Expand all Loading... |
| 31 bool IndexWriter::VerifyIndexKeys( | 31 bool IndexWriter::VerifyIndexKeys( |
| 32 IndexedDBBackingStore* backing_store, | 32 IndexedDBBackingStore* backing_store, |
| 33 IndexedDBBackingStore::Transaction* transaction, | 33 IndexedDBBackingStore::Transaction* transaction, |
| 34 int64 database_id, | 34 int64 database_id, |
| 35 int64 object_store_id, | 35 int64 object_store_id, |
| 36 int64 index_id, | 36 int64 index_id, |
| 37 bool* can_add_keys, | 37 bool* can_add_keys, |
| 38 const IndexedDBKey& primary_key, | 38 const IndexedDBKey& primary_key, |
| 39 base::string16* error_message) const { | 39 base::string16* error_message) const { |
| 40 *can_add_keys = false; | 40 *can_add_keys = false; |
| 41 for (size_t i = 0; i < index_keys_.size(); ++i) { | 41 DCHECK_EQ(index_id, index_keys_.first); |
| 42 for (size_t i = 0; i < index_keys_.second.size(); ++i) { |
| 42 bool ok = AddingKeyAllowed(backing_store, | 43 bool ok = AddingKeyAllowed(backing_store, |
| 43 transaction, | 44 transaction, |
| 44 database_id, | 45 database_id, |
| 45 object_store_id, | 46 object_store_id, |
| 46 index_id, | 47 index_id, |
| 47 (index_keys_)[i], | 48 (index_keys_.second)[i], |
| 48 primary_key, | 49 primary_key, |
| 49 can_add_keys); | 50 can_add_keys); |
| 50 if (!ok) | 51 if (!ok) |
| 51 return false; | 52 return false; |
| 52 if (!*can_add_keys) { | 53 if (!*can_add_keys) { |
| 53 if (error_message) { | 54 if (error_message) { |
| 54 *error_message = ASCIIToUTF16("Unable to add key to index '") + | 55 *error_message = ASCIIToUTF16("Unable to add key to index '") + |
| 55 index_metadata_.name + | 56 index_metadata_.name + |
| 56 ASCIIToUTF16("': at least one key does not satisfy " | 57 ASCIIToUTF16("': at least one key does not satisfy " |
| 57 "the uniqueness requirements."); | 58 "the uniqueness requirements."); |
| 58 } | 59 } |
| 59 return true; | 60 return true; |
| 60 } | 61 } |
| 61 } | 62 } |
| 62 *can_add_keys = true; | 63 *can_add_keys = true; |
| 63 return true; | 64 return true; |
| 64 } | 65 } |
| 65 | 66 |
| 66 void IndexWriter::WriteIndexKeys( | 67 void IndexWriter::WriteIndexKeys( |
| 67 const IndexedDBBackingStore::RecordIdentifier& record_identifier, | 68 const IndexedDBBackingStore::RecordIdentifier& record_identifier, |
| 68 IndexedDBBackingStore* backing_store, | 69 IndexedDBBackingStore* backing_store, |
| 69 IndexedDBBackingStore::Transaction* transaction, | 70 IndexedDBBackingStore::Transaction* transaction, |
| 70 int64 database_id, | 71 int64 database_id, |
| 71 int64 object_store_id) const { | 72 int64 object_store_id) const { |
| 72 int64 index_id = index_metadata_.id; | 73 int64 index_id = index_metadata_.id; |
| 73 for (size_t i = 0; i < index_keys_.size(); ++i) { | 74 DCHECK_EQ(index_id, index_keys_.first); |
| 75 for (size_t i = 0; i < index_keys_.second.size(); ++i) { |
| 74 bool ok = backing_store->PutIndexDataForRecord(transaction, | 76 bool ok = backing_store->PutIndexDataForRecord(transaction, |
| 75 database_id, | 77 database_id, |
| 76 object_store_id, | 78 object_store_id, |
| 77 index_id, | 79 index_id, |
| 78 index_keys_[i], | 80 index_keys_.second[i], |
| 79 record_identifier); | 81 record_identifier); |
| 80 // This should have already been verified as a valid write during | 82 // This should have already been verified as a valid write during |
| 81 // verify_index_keys. | 83 // verify_index_keys. |
| 82 DCHECK(ok); | 84 DCHECK(ok); |
| 83 } | 85 } |
| 84 } | 86 } |
| 85 | 87 |
| 86 bool IndexWriter::AddingKeyAllowed( | 88 bool IndexWriter::AddingKeyAllowed( |
| 87 IndexedDBBackingStore* backing_store, | 89 IndexedDBBackingStore* backing_store, |
| 88 IndexedDBBackingStore::Transaction* transaction, | 90 IndexedDBBackingStore::Transaction* transaction, |
| (...skipping 26 matching lines...) Expand all Loading... |
| 115 return true; | 117 return true; |
| 116 } | 118 } |
| 117 | 119 |
| 118 bool MakeIndexWriters( | 120 bool MakeIndexWriters( |
| 119 scoped_refptr<IndexedDBTransaction> transaction, | 121 scoped_refptr<IndexedDBTransaction> transaction, |
| 120 IndexedDBBackingStore* backing_store, | 122 IndexedDBBackingStore* backing_store, |
| 121 int64 database_id, | 123 int64 database_id, |
| 122 const IndexedDBObjectStoreMetadata& object_store, | 124 const IndexedDBObjectStoreMetadata& object_store, |
| 123 const IndexedDBKey& primary_key, // makes a copy | 125 const IndexedDBKey& primary_key, // makes a copy |
| 124 bool key_was_generated, | 126 bool key_was_generated, |
| 125 const std::vector<int64>& index_ids, | |
| 126 const std::vector<IndexedDBDatabase::IndexKeys>& index_keys, | 127 const std::vector<IndexedDBDatabase::IndexKeys>& index_keys, |
| 127 ScopedVector<IndexWriter>* index_writers, | 128 ScopedVector<IndexWriter>* index_writers, |
| 128 base::string16* error_message, | 129 base::string16* error_message, |
| 129 bool* completed) { | 130 bool* completed) { |
| 130 DCHECK_EQ(index_ids.size(), index_keys.size()); | |
| 131 *completed = false; | 131 *completed = false; |
| 132 | 132 |
| 133 std::map<int64, IndexedDBDatabase::IndexKeys> index_key_map; | 133 for (std::vector<IndexedDBDatabase::IndexKeys>::const_iterator it = |
| 134 for (size_t i = 0; i < index_ids.size(); ++i) | 134 index_keys.begin(); |
| 135 index_key_map[index_ids[i]] = index_keys[i]; | 135 it != index_keys.end(); |
| 136 ++it) { |
| 137 IndexedDBObjectStoreMetadata::IndexMap::const_iterator found = |
| 138 object_store.indexes.find(it->first); |
| 139 if (found == object_store.indexes.end()) |
| 140 continue; |
| 141 const IndexedDBIndexMetadata& index = found->second; |
| 142 IndexedDBDatabase::IndexKeys keys = *it; |
| 136 | 143 |
| 137 for (IndexedDBObjectStoreMetadata::IndexMap::const_iterator it = | |
| 138 object_store.indexes.begin(); | |
| 139 it != object_store.indexes.end(); | |
| 140 ++it) { | |
| 141 const IndexedDBIndexMetadata& index = it->second; | |
| 142 | |
| 143 IndexedDBDatabase::IndexKeys keys = index_key_map[it->first]; | |
| 144 // If the object_store is using auto_increment, then any indexes with an | 144 // If the object_store is using auto_increment, then any indexes with an |
| 145 // identical key_path need to also use the primary (generated) key as a key. | 145 // identical key_path need to also use the primary (generated) key as a key. |
| 146 if (key_was_generated && (index.key_path == object_store.key_path)) | 146 if (key_was_generated && (index.key_path == object_store.key_path)) |
| 147 keys.push_back(primary_key); | 147 keys.second.push_back(primary_key); |
| 148 | 148 |
| 149 scoped_ptr<IndexWriter> index_writer(new IndexWriter(index, keys)); | 149 scoped_ptr<IndexWriter> index_writer(new IndexWriter(index, keys)); |
| 150 bool can_add_keys = false; | 150 bool can_add_keys = false; |
| 151 bool backing_store_success = | 151 bool backing_store_success = |
| 152 index_writer->VerifyIndexKeys(backing_store, | 152 index_writer->VerifyIndexKeys(backing_store, |
| 153 transaction->BackingStoreTransaction(), | 153 transaction->BackingStoreTransaction(), |
| 154 database_id, | 154 database_id, |
| 155 object_store.id, | 155 object_store.id, |
| 156 index.id, | 156 index.id, |
| 157 &can_add_keys, | 157 &can_add_keys, |
| 158 primary_key, | 158 primary_key, |
| 159 error_message); | 159 error_message); |
| 160 if (!backing_store_success) | 160 if (!backing_store_success) |
| 161 return false; | 161 return false; |
| 162 if (!can_add_keys) | 162 if (!can_add_keys) |
| 163 return true; | 163 return true; |
| 164 | 164 |
| 165 index_writers->push_back(index_writer.release()); | 165 index_writers->push_back(index_writer.release()); |
| 166 } | 166 } |
| 167 | 167 |
| 168 *completed = true; | 168 *completed = true; |
| 169 return true; | 169 return true; |
| 170 } | 170 } |
| 171 | 171 |
| 172 } // namespace content | 172 } // namespace content |
| OLD | NEW |