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 "base/file_util.h" | 7 #include "base/file_util.h" |
8 #include "base/files/file_path.h" | 8 #include "base/files/file_path.h" |
9 #include "base/format_macros.h" | 9 #include "base/format_macros.h" |
10 #include "base/json/json_reader.h" | 10 #include "base/json/json_reader.h" |
(...skipping 1866 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1877 return s; | 1877 return s; |
1878 DCHECK_GE(version, 0); | 1878 DCHECK_GE(version, 0); |
1879 const std::string object_store_data_key = | 1879 const std::string object_store_data_key = |
1880 ObjectStoreDataKey::Encode(database_id, object_store_id, key); | 1880 ObjectStoreDataKey::Encode(database_id, object_store_id, key); |
1881 | 1881 |
1882 std::string v; | 1882 std::string v; |
1883 EncodeVarInt(version, &v); | 1883 EncodeVarInt(version, &v); |
1884 v.append(value.bits); | 1884 v.append(value.bits); |
1885 | 1885 |
1886 leveldb_transaction->Put(object_store_data_key, &v); | 1886 leveldb_transaction->Put(object_store_data_key, &v); |
1887 transaction->PutBlobInfo(database_id, | 1887 s = transaction->PutBlobInfoIfNeeded(database_id, |
1888 object_store_id, | 1888 object_store_id, |
1889 object_store_data_key, | 1889 object_store_data_key, |
1890 &value.blob_info, | 1890 &value.blob_info, |
1891 handles); | 1891 handles); |
1892 if (!s.ok()) | |
1893 return s; | |
1892 DCHECK(!handles->size()); | 1894 DCHECK(!handles->size()); |
1893 | 1895 |
1894 const std::string exists_entry_key = | 1896 const std::string exists_entry_key = |
1895 ExistsEntryKey::Encode(database_id, object_store_id, key); | 1897 ExistsEntryKey::Encode(database_id, object_store_id, key); |
1896 std::string version_encoded; | 1898 std::string version_encoded; |
1897 EncodeInt(version, &version_encoded); | 1899 EncodeInt(version, &version_encoded); |
1898 leveldb_transaction->Put(exists_entry_key, &version_encoded); | 1900 leveldb_transaction->Put(exists_entry_key, &version_encoded); |
1899 | 1901 |
1900 std::string key_encoded; | 1902 std::string key_encoded; |
1901 EncodeIDBKey(key, &key_encoded); | 1903 EncodeIDBKey(key, &key_encoded); |
(...skipping 28 matching lines...) Expand all Loading... | |
1930 int64 object_store_id, | 1932 int64 object_store_id, |
1931 const RecordIdentifier& record_identifier) { | 1933 const RecordIdentifier& record_identifier) { |
1932 IDB_TRACE("IndexedDBBackingStore::DeleteRecord"); | 1934 IDB_TRACE("IndexedDBBackingStore::DeleteRecord"); |
1933 if (!KeyPrefix::ValidIds(database_id, object_store_id)) | 1935 if (!KeyPrefix::ValidIds(database_id, object_store_id)) |
1934 return InvalidDBKeyStatus(); | 1936 return InvalidDBKeyStatus(); |
1935 LevelDBTransaction* leveldb_transaction = transaction->transaction(); | 1937 LevelDBTransaction* leveldb_transaction = transaction->transaction(); |
1936 | 1938 |
1937 const std::string object_store_data_key = ObjectStoreDataKey::Encode( | 1939 const std::string object_store_data_key = ObjectStoreDataKey::Encode( |
1938 database_id, object_store_id, record_identifier.primary_key()); | 1940 database_id, object_store_id, record_identifier.primary_key()); |
1939 leveldb_transaction->Remove(object_store_data_key); | 1941 leveldb_transaction->Remove(object_store_data_key); |
1940 transaction->PutBlobInfo( | 1942 leveldb::Status s = transaction->PutBlobInfoIfNeeded( |
1941 database_id, object_store_id, object_store_data_key, NULL, NULL); | 1943 database_id, object_store_id, object_store_data_key, NULL, NULL); |
1944 if (!s.ok()) | |
1945 return s; | |
1942 | 1946 |
1943 const std::string exists_entry_key = ExistsEntryKey::Encode( | 1947 const std::string exists_entry_key = ExistsEntryKey::Encode( |
1944 database_id, object_store_id, record_identifier.primary_key()); | 1948 database_id, object_store_id, record_identifier.primary_key()); |
1945 leveldb_transaction->Remove(exists_entry_key); | 1949 leveldb_transaction->Remove(exists_entry_key); |
1946 return leveldb::Status::OK(); | 1950 return leveldb::Status::OK(); |
1947 } | 1951 } |
1948 | 1952 |
1949 leveldb::Status IndexedDBBackingStore::DeleteRange( | 1953 leveldb::Status IndexedDBBackingStore::DeleteRange( |
1950 IndexedDBBackingStore::Transaction* transaction, | 1954 IndexedDBBackingStore::Transaction* transaction, |
1951 int64 database_id, | 1955 int64 database_id, |
(...skipping 2186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4138 scoped_ptr<IndexedDBBackingStore::BlobChangeRecord> record( | 4142 scoped_ptr<IndexedDBBackingStore::BlobChangeRecord> record( |
4139 new BlobChangeRecord(key_, object_store_id_)); | 4143 new BlobChangeRecord(key_, object_store_id_)); |
4140 record->blob_info_ = blob_info_; | 4144 record->blob_info_ = blob_info_; |
4141 | 4145 |
4142 ScopedVector<webkit_blob::BlobDataHandle>::const_iterator iter; | 4146 ScopedVector<webkit_blob::BlobDataHandle>::const_iterator iter; |
4143 for (iter = handles_.begin(); iter != handles_.end(); ++iter) | 4147 for (iter = handles_.begin(); iter != handles_.end(); ++iter) |
4144 record->handles_.push_back(new webkit_blob::BlobDataHandle(**iter)); | 4148 record->handles_.push_back(new webkit_blob::BlobDataHandle(**iter)); |
4145 return record.Pass(); | 4149 return record.Pass(); |
4146 } | 4150 } |
4147 | 4151 |
4152 leveldb::Status IndexedDBBackingStore::Transaction::PutBlobInfoIfNeeded( | |
4153 int64 database_id, | |
4154 int64 object_store_id, | |
4155 const std::string& object_store_data_key, | |
4156 std::vector<IndexedDBBlobInfo>* blob_info, | |
4157 ScopedVector<webkit_blob::BlobDataHandle>* handles) { | |
4158 if (!blob_info || blob_info->empty()) { | |
4159 blob_change_map_.erase(object_store_data_key); | |
4160 incognito_blob_map_.erase(object_store_data_key); | |
4161 | |
4162 BlobEntryKey blob_entry_key; | |
4163 StringPiece leveldb_key_piece(object_store_data_key); | |
4164 if (!BlobEntryKey::FromObjectStoreDataKey(&leveldb_key_piece, | |
4165 &blob_entry_key)) { | |
4166 NOTREACHED(); | |
4167 return InternalInconsistencyStatus(); | |
4168 } | |
4169 scoped_ptr<LevelDBIterator> it = transaction()->CreateIterator(); | |
jsbell
2014/06/10 22:16:32
Why an iterator instead of just a Get?
ericu
2014/06/10 22:30:48
Copypasta. Fixed.
| |
4170 std::string encoded_key = blob_entry_key.Encode(); | |
4171 leveldb::Status s = it->Seek(encoded_key); | |
4172 if (!s.ok()) | |
4173 return s; | |
4174 if (!it->IsValid() || CompareKeys(it->Key(), encoded_key) != 0) | |
4175 return leveldb::Status::OK(); | |
4176 } | |
4177 PutBlobInfo( | |
4178 database_id, object_store_id, object_store_data_key, blob_info, handles); | |
4179 return leveldb::Status::OK(); | |
4180 } | |
4181 | |
4148 // This is storing an info, even if empty, even if the previous key had no blob | 4182 // This is storing an info, even if empty, even if the previous key had no blob |
4149 // info that we know of. It duplicates a bunch of information stored in the | 4183 // info that we know of. It duplicates a bunch of information stored in the |
4150 // leveldb transaction, but only w.r.t. the user keys altered--we don't keep the | 4184 // leveldb transaction, but only w.r.t. the user keys altered--we don't keep the |
4151 // changes to exists or index keys here. | 4185 // changes to exists or index keys here. |
4152 void IndexedDBBackingStore::Transaction::PutBlobInfo( | 4186 void IndexedDBBackingStore::Transaction::PutBlobInfo( |
4153 int64 database_id, | 4187 int64 database_id, |
4154 int64 object_store_id, | 4188 int64 object_store_id, |
4155 const std::string& object_store_data_key, | 4189 const std::string& object_store_data_key, |
4156 std::vector<IndexedDBBlobInfo>* blob_info, | 4190 std::vector<IndexedDBBlobInfo>* blob_info, |
4157 ScopedVector<webkit_blob::BlobDataHandle>* handles) { | 4191 ScopedVector<webkit_blob::BlobDataHandle>* handles) { |
(...skipping 20 matching lines...) Expand all Loading... | |
4178 const GURL& url, | 4212 const GURL& url, |
4179 int64_t key) | 4213 int64_t key) |
4180 : is_file_(false), url_(url), key_(key) {} | 4214 : is_file_(false), url_(url), key_(key) {} |
4181 | 4215 |
4182 IndexedDBBackingStore::Transaction::WriteDescriptor::WriteDescriptor( | 4216 IndexedDBBackingStore::Transaction::WriteDescriptor::WriteDescriptor( |
4183 const FilePath& file_path, | 4217 const FilePath& file_path, |
4184 int64_t key) | 4218 int64_t key) |
4185 : is_file_(true), file_path_(file_path), key_(key) {} | 4219 : is_file_(true), file_path_(file_path), key_(key) {} |
4186 | 4220 |
4187 } // namespace content | 4221 } // namespace content |
OLD | NEW |