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 |