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 std::string value; |
| 4170 bool found = false; |
| 4171 leveldb::Status s = |
| 4172 transaction()->Get(blob_entry_key.Encode(), &value, &found); |
| 4173 if (!s.ok()) |
| 4174 return s; |
| 4175 if (!found) |
| 4176 return leveldb::Status::OK(); |
| 4177 } |
| 4178 PutBlobInfo( |
| 4179 database_id, object_store_id, object_store_data_key, blob_info, handles); |
| 4180 return leveldb::Status::OK(); |
| 4181 } |
| 4182 |
4148 // This is storing an info, even if empty, even if the previous key had no blob | 4183 // 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 | 4184 // 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 | 4185 // leveldb transaction, but only w.r.t. the user keys altered--we don't keep the |
4151 // changes to exists or index keys here. | 4186 // changes to exists or index keys here. |
4152 void IndexedDBBackingStore::Transaction::PutBlobInfo( | 4187 void IndexedDBBackingStore::Transaction::PutBlobInfo( |
4153 int64 database_id, | 4188 int64 database_id, |
4154 int64 object_store_id, | 4189 int64 object_store_id, |
4155 const std::string& object_store_data_key, | 4190 const std::string& object_store_data_key, |
4156 std::vector<IndexedDBBlobInfo>* blob_info, | 4191 std::vector<IndexedDBBlobInfo>* blob_info, |
4157 ScopedVector<webkit_blob::BlobDataHandle>* handles) { | 4192 ScopedVector<webkit_blob::BlobDataHandle>* handles) { |
(...skipping 20 matching lines...) Expand all Loading... |
4178 const GURL& url, | 4213 const GURL& url, |
4179 int64_t key) | 4214 int64_t key) |
4180 : is_file_(false), url_(url), key_(key) {} | 4215 : is_file_(false), url_(url), key_(key) {} |
4181 | 4216 |
4182 IndexedDBBackingStore::Transaction::WriteDescriptor::WriteDescriptor( | 4217 IndexedDBBackingStore::Transaction::WriteDescriptor::WriteDescriptor( |
4183 const FilePath& file_path, | 4218 const FilePath& file_path, |
4184 int64_t key) | 4219 int64_t key) |
4185 : is_file_(true), file_path_(file_path), key_(key) {} | 4220 : is_file_(true), file_path_(file_path), key_(key) {} |
4186 | 4221 |
4187 } // namespace content | 4222 } // namespace content |
OLD | NEW |