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 17 matching lines...) Expand all Loading... |
28 #include "content/browser/indexed_db/leveldb/leveldb_iterator.h" | 28 #include "content/browser/indexed_db/leveldb/leveldb_iterator.h" |
29 #include "content/browser/indexed_db/leveldb/leveldb_transaction.h" | 29 #include "content/browser/indexed_db/leveldb/leveldb_transaction.h" |
30 #include "content/common/indexed_db/indexed_db_key.h" | 30 #include "content/common/indexed_db/indexed_db_key.h" |
31 #include "content/common/indexed_db/indexed_db_key_path.h" | 31 #include "content/common/indexed_db/indexed_db_key_path.h" |
32 #include "content/common/indexed_db/indexed_db_key_range.h" | 32 #include "content/common/indexed_db/indexed_db_key_range.h" |
33 #include "content/public/browser/browser_thread.h" | 33 #include "content/public/browser/browser_thread.h" |
34 #include "net/url_request/url_request_context.h" | 34 #include "net/url_request/url_request_context.h" |
35 #include "third_party/WebKit/public/platform/WebIDBTypes.h" | 35 #include "third_party/WebKit/public/platform/WebIDBTypes.h" |
36 #include "third_party/WebKit/public/web/WebSerializedScriptValueVersion.h" | 36 #include "third_party/WebKit/public/web/WebSerializedScriptValueVersion.h" |
37 #include "third_party/leveldatabase/env_chromium.h" | 37 #include "third_party/leveldatabase/env_chromium.h" |
38 #include "webkit/browser/blob/blob_data_handle.h" | 38 #include "storage/browser/blob/blob_data_handle.h" |
39 #include "webkit/browser/fileapi/file_stream_writer.h" | 39 #include "storage/browser/fileapi/file_stream_writer.h" |
40 #include "webkit/browser/fileapi/file_writer_delegate.h" | 40 #include "storage/browser/fileapi/file_writer_delegate.h" |
41 #include "webkit/browser/fileapi/local_file_stream_writer.h" | 41 #include "storage/browser/fileapi/local_file_stream_writer.h" |
42 #include "webkit/common/database/database_identifier.h" | 42 #include "storage/common/database/database_identifier.h" |
43 | 43 |
44 using base::FilePath; | 44 using base::FilePath; |
45 using base::StringPiece; | 45 using base::StringPiece; |
46 using fileapi::FileWriterDelegate; | 46 using storage::FileWriterDelegate; |
47 | 47 |
48 namespace content { | 48 namespace content { |
49 | 49 |
50 namespace { | 50 namespace { |
51 | 51 |
52 FilePath GetBlobDirectoryName(const FilePath& pathBase, int64 database_id) { | 52 FilePath GetBlobDirectoryName(const FilePath& pathBase, int64 database_id) { |
53 return pathBase.AppendASCII(base::StringPrintf("%" PRIx64, database_id)); | 53 return pathBase.AppendASCII(base::StringPrintf("%" PRIx64, database_id)); |
54 } | 54 } |
55 | 55 |
56 FilePath GetBlobDirectoryNameForKey(const FilePath& pathBase, | 56 FilePath GetBlobDirectoryNameForKey(const FilePath& pathBase, |
(...skipping 1837 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1894 *new_version_number = version; | 1894 *new_version_number = version; |
1895 return s; | 1895 return s; |
1896 } | 1896 } |
1897 | 1897 |
1898 leveldb::Status IndexedDBBackingStore::PutRecord( | 1898 leveldb::Status IndexedDBBackingStore::PutRecord( |
1899 IndexedDBBackingStore::Transaction* transaction, | 1899 IndexedDBBackingStore::Transaction* transaction, |
1900 int64 database_id, | 1900 int64 database_id, |
1901 int64 object_store_id, | 1901 int64 object_store_id, |
1902 const IndexedDBKey& key, | 1902 const IndexedDBKey& key, |
1903 IndexedDBValue* value, | 1903 IndexedDBValue* value, |
1904 ScopedVector<webkit_blob::BlobDataHandle>* handles, | 1904 ScopedVector<storage::BlobDataHandle>* handles, |
1905 RecordIdentifier* record_identifier) { | 1905 RecordIdentifier* record_identifier) { |
1906 IDB_TRACE("IndexedDBBackingStore::PutRecord"); | 1906 IDB_TRACE("IndexedDBBackingStore::PutRecord"); |
1907 if (!KeyPrefix::ValidIds(database_id, object_store_id)) | 1907 if (!KeyPrefix::ValidIds(database_id, object_store_id)) |
1908 return InvalidDBKeyStatus(); | 1908 return InvalidDBKeyStatus(); |
1909 DCHECK(key.IsValid()); | 1909 DCHECK(key.IsValid()); |
1910 | 1910 |
1911 LevelDBTransaction* leveldb_transaction = transaction->transaction(); | 1911 LevelDBTransaction* leveldb_transaction = transaction->transaction(); |
1912 int64 version = -1; | 1912 int64 version = -1; |
1913 leveldb::Status s = GetNewVersionNumber( | 1913 leveldb::Status s = GetNewVersionNumber( |
1914 leveldb_transaction, database_id, object_store_id, &version); | 1914 leveldb_transaction, database_id, object_store_id, &version); |
(...skipping 392 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2307 ReportWriteCompletion, | 2307 ReportWriteCompletion, |
2308 chained_blob_writer_, | 2308 chained_blob_writer_, |
2309 write_status == FileWriterDelegate::SUCCESS_COMPLETED, | 2309 write_status == FileWriterDelegate::SUCCESS_COMPLETED, |
2310 bytes_written_)); | 2310 bytes_written_)); |
2311 } | 2311 } |
2312 | 2312 |
2313 void writeBlobToFileOnIOThread(const FilePath& file_path, | 2313 void writeBlobToFileOnIOThread(const FilePath& file_path, |
2314 const GURL& blob_url, | 2314 const GURL& blob_url, |
2315 net::URLRequestContext* request_context) { | 2315 net::URLRequestContext* request_context) { |
2316 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); | 2316 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
2317 scoped_ptr<fileapi::FileStreamWriter> writer( | 2317 scoped_ptr<storage::FileStreamWriter> writer( |
2318 fileapi::FileStreamWriter::CreateForLocalFile( | 2318 storage::FileStreamWriter::CreateForLocalFile( |
2319 task_runner_, file_path, 0, | 2319 task_runner_, |
2320 fileapi::FileStreamWriter::CREATE_NEW_FILE)); | 2320 file_path, |
| 2321 0, |
| 2322 storage::FileStreamWriter::CREATE_NEW_FILE)); |
2321 scoped_ptr<FileWriterDelegate> delegate( | 2323 scoped_ptr<FileWriterDelegate> delegate( |
2322 new FileWriterDelegate(writer.Pass(), | 2324 new FileWriterDelegate(writer.Pass(), |
2323 FileWriterDelegate::FLUSH_ON_COMPLETION)); | 2325 FileWriterDelegate::FLUSH_ON_COMPLETION)); |
2324 | 2326 |
2325 DCHECK(blob_url.is_valid()); | 2327 DCHECK(blob_url.is_valid()); |
2326 scoped_ptr<net::URLRequest> blob_request(request_context->CreateRequest( | 2328 scoped_ptr<net::URLRequest> blob_request(request_context->CreateRequest( |
2327 blob_url, net::DEFAULT_PRIORITY, delegate.get(), NULL)); | 2329 blob_url, net::DEFAULT_PRIORITY, delegate.get(), NULL)); |
2328 | 2330 |
2329 delegate->Start(blob_request.Pass(), | 2331 delegate->Start(blob_request.Pass(), |
2330 base::Bind(&LocalWriteClosure::Run, this)); | 2332 base::Bind(&LocalWriteClosure::Run, this)); |
(...skipping 1863 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4194 } | 4196 } |
4195 | 4197 |
4196 void IndexedDBBackingStore::BlobChangeRecord::SetBlobInfo( | 4198 void IndexedDBBackingStore::BlobChangeRecord::SetBlobInfo( |
4197 std::vector<IndexedDBBlobInfo>* blob_info) { | 4199 std::vector<IndexedDBBlobInfo>* blob_info) { |
4198 blob_info_.clear(); | 4200 blob_info_.clear(); |
4199 if (blob_info) | 4201 if (blob_info) |
4200 blob_info_.swap(*blob_info); | 4202 blob_info_.swap(*blob_info); |
4201 } | 4203 } |
4202 | 4204 |
4203 void IndexedDBBackingStore::BlobChangeRecord::SetHandles( | 4205 void IndexedDBBackingStore::BlobChangeRecord::SetHandles( |
4204 ScopedVector<webkit_blob::BlobDataHandle>* handles) { | 4206 ScopedVector<storage::BlobDataHandle>* handles) { |
4205 handles_.clear(); | 4207 handles_.clear(); |
4206 if (handles) | 4208 if (handles) |
4207 handles_.swap(*handles); | 4209 handles_.swap(*handles); |
4208 } | 4210 } |
4209 | 4211 |
4210 scoped_ptr<IndexedDBBackingStore::BlobChangeRecord> | 4212 scoped_ptr<IndexedDBBackingStore::BlobChangeRecord> |
4211 IndexedDBBackingStore::BlobChangeRecord::Clone() const { | 4213 IndexedDBBackingStore::BlobChangeRecord::Clone() const { |
4212 scoped_ptr<IndexedDBBackingStore::BlobChangeRecord> record( | 4214 scoped_ptr<IndexedDBBackingStore::BlobChangeRecord> record( |
4213 new BlobChangeRecord(key_, object_store_id_)); | 4215 new BlobChangeRecord(key_, object_store_id_)); |
4214 record->blob_info_ = blob_info_; | 4216 record->blob_info_ = blob_info_; |
4215 | 4217 |
4216 ScopedVector<webkit_blob::BlobDataHandle>::const_iterator iter; | 4218 ScopedVector<storage::BlobDataHandle>::const_iterator iter; |
4217 for (iter = handles_.begin(); iter != handles_.end(); ++iter) | 4219 for (iter = handles_.begin(); iter != handles_.end(); ++iter) |
4218 record->handles_.push_back(new webkit_blob::BlobDataHandle(**iter)); | 4220 record->handles_.push_back(new storage::BlobDataHandle(**iter)); |
4219 return record.Pass(); | 4221 return record.Pass(); |
4220 } | 4222 } |
4221 | 4223 |
4222 leveldb::Status IndexedDBBackingStore::Transaction::PutBlobInfoIfNeeded( | 4224 leveldb::Status IndexedDBBackingStore::Transaction::PutBlobInfoIfNeeded( |
4223 int64 database_id, | 4225 int64 database_id, |
4224 int64 object_store_id, | 4226 int64 object_store_id, |
4225 const std::string& object_store_data_key, | 4227 const std::string& object_store_data_key, |
4226 std::vector<IndexedDBBlobInfo>* blob_info, | 4228 std::vector<IndexedDBBlobInfo>* blob_info, |
4227 ScopedVector<webkit_blob::BlobDataHandle>* handles) { | 4229 ScopedVector<storage::BlobDataHandle>* handles) { |
4228 if (!blob_info || blob_info->empty()) { | 4230 if (!blob_info || blob_info->empty()) { |
4229 blob_change_map_.erase(object_store_data_key); | 4231 blob_change_map_.erase(object_store_data_key); |
4230 incognito_blob_map_.erase(object_store_data_key); | 4232 incognito_blob_map_.erase(object_store_data_key); |
4231 | 4233 |
4232 BlobEntryKey blob_entry_key; | 4234 BlobEntryKey blob_entry_key; |
4233 StringPiece leveldb_key_piece(object_store_data_key); | 4235 StringPiece leveldb_key_piece(object_store_data_key); |
4234 if (!BlobEntryKey::FromObjectStoreDataKey(&leveldb_key_piece, | 4236 if (!BlobEntryKey::FromObjectStoreDataKey(&leveldb_key_piece, |
4235 &blob_entry_key)) { | 4237 &blob_entry_key)) { |
4236 NOTREACHED(); | 4238 NOTREACHED(); |
4237 return InternalInconsistencyStatus(); | 4239 return InternalInconsistencyStatus(); |
(...skipping 14 matching lines...) Expand all Loading... |
4252 | 4254 |
4253 // This is storing an info, even if empty, even if the previous key had no blob | 4255 // This is storing an info, even if empty, even if the previous key had no blob |
4254 // info that we know of. It duplicates a bunch of information stored in the | 4256 // info that we know of. It duplicates a bunch of information stored in the |
4255 // leveldb transaction, but only w.r.t. the user keys altered--we don't keep the | 4257 // leveldb transaction, but only w.r.t. the user keys altered--we don't keep the |
4256 // changes to exists or index keys here. | 4258 // changes to exists or index keys here. |
4257 void IndexedDBBackingStore::Transaction::PutBlobInfo( | 4259 void IndexedDBBackingStore::Transaction::PutBlobInfo( |
4258 int64 database_id, | 4260 int64 database_id, |
4259 int64 object_store_id, | 4261 int64 object_store_id, |
4260 const std::string& object_store_data_key, | 4262 const std::string& object_store_data_key, |
4261 std::vector<IndexedDBBlobInfo>* blob_info, | 4263 std::vector<IndexedDBBlobInfo>* blob_info, |
4262 ScopedVector<webkit_blob::BlobDataHandle>* handles) { | 4264 ScopedVector<storage::BlobDataHandle>* handles) { |
4263 DCHECK_GT(object_store_data_key.size(), 0UL); | 4265 DCHECK_GT(object_store_data_key.size(), 0UL); |
4264 if (database_id_ < 0) | 4266 if (database_id_ < 0) |
4265 database_id_ = database_id; | 4267 database_id_ = database_id; |
4266 DCHECK_EQ(database_id_, database_id); | 4268 DCHECK_EQ(database_id_, database_id); |
4267 | 4269 |
4268 BlobChangeMap::iterator it = blob_change_map_.find(object_store_data_key); | 4270 BlobChangeMap::iterator it = blob_change_map_.find(object_store_data_key); |
4269 BlobChangeRecord* record = NULL; | 4271 BlobChangeRecord* record = NULL; |
4270 if (it == blob_change_map_.end()) { | 4272 if (it == blob_change_map_.end()) { |
4271 record = new BlobChangeRecord(object_store_data_key, object_store_id); | 4273 record = new BlobChangeRecord(object_store_data_key, object_store_id); |
4272 blob_change_map_[object_store_data_key] = record; | 4274 blob_change_map_[object_store_data_key] = record; |
(...skipping 19 matching lines...) Expand all Loading... |
4292 int64_t size, | 4294 int64_t size, |
4293 base::Time last_modified) | 4295 base::Time last_modified) |
4294 : is_file_(true), | 4296 : is_file_(true), |
4295 file_path_(file_path), | 4297 file_path_(file_path), |
4296 key_(key), | 4298 key_(key), |
4297 size_(size), | 4299 size_(size), |
4298 last_modified_(last_modified) { | 4300 last_modified_(last_modified) { |
4299 } | 4301 } |
4300 | 4302 |
4301 } // namespace content | 4303 } // namespace content |
OLD | NEW |