OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "chrome/browser/android/history_report/delta_file_backend_leveldb.h" | 5 #include "chrome/browser/android/history_report/delta_file_backend_leveldb.h" |
6 | 6 |
7 #include <inttypes.h> | 7 #include <inttypes.h> |
8 #include "base/files/file_util.h" | 8 #include "base/files/file_util.h" |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/strings/string_number_conversions.h" | 10 #include "base/strings/string_number_conversions.h" |
11 #include "base/strings/stringprintf.h" | 11 #include "base/strings/stringprintf.h" |
12 #include "chrome/browser/android/history_report/delta_file_commons.h" | 12 #include "chrome/browser/android/history_report/delta_file_commons.h" |
13 #include "third_party/leveldatabase/src/include/leveldb/comparator.h" | 13 #include "third_party/leveldatabase/src/include/leveldb/comparator.h" |
14 #include "third_party/leveldatabase/src/include/leveldb/db.h" | 14 #include "third_party/leveldatabase/src/include/leveldb/db.h" |
15 #include "third_party/leveldatabase/src/include/leveldb/iterator.h" | 15 #include "third_party/leveldatabase/src/include/leveldb/iterator.h" |
16 #include "third_party/leveldatabase/src/include/leveldb/options.h" | 16 #include "third_party/leveldatabase/src/include/leveldb/options.h" |
17 #include "third_party/leveldatabase/src/include/leveldb/slice.h" | 17 #include "third_party/leveldatabase/src/include/leveldb/slice.h" |
18 #include "third_party/leveldatabase/src/include/leveldb/status.h" | 18 #include "third_party/leveldatabase/src/include/leveldb/status.h" |
19 #include "third_party/leveldatabase/src/include/leveldb/write_batch.h" | 19 #include "third_party/leveldatabase/src/include/leveldb/write_batch.h" |
20 #include "url/gurl.h" | 20 #include "url/gurl.h" |
21 | 21 |
22 namespace { | 22 namespace { |
23 const base::FilePath::CharType kDbFileName[] = | 23 const base::FilePath::CharType kDbFileName[] = |
24 FILE_PATH_LITERAL("DeltaFileLevelDb"); | 24 FILE_PATH_LITERAL("DeltaFileLevelDb"); |
25 | 25 |
26 int64 GetLastSeqNo(leveldb::DB* db) { | 26 int64_t GetLastSeqNo(leveldb::DB* db) { |
27 leveldb::ReadOptions options; | 27 leveldb::ReadOptions options; |
28 scoped_ptr<leveldb::Iterator> db_iter(db->NewIterator(options)); | 28 scoped_ptr<leveldb::Iterator> db_iter(db->NewIterator(options)); |
29 db_iter->SeekToLast(); | 29 db_iter->SeekToLast(); |
30 int64 seq_no = 0; | 30 int64_t seq_no = 0; |
31 if (db_iter->Valid()) { | 31 if (db_iter->Valid()) { |
32 history_report::DeltaFileEntry last_entry; | 32 history_report::DeltaFileEntry last_entry; |
33 leveldb::Slice value_slice = db_iter->value(); | 33 leveldb::Slice value_slice = db_iter->value(); |
34 if (last_entry.ParseFromArray(value_slice.data(), value_slice.size())) | 34 if (last_entry.ParseFromArray(value_slice.data(), value_slice.size())) |
35 seq_no = last_entry.seq_no(); | 35 seq_no = last_entry.seq_no(); |
36 } | 36 } |
37 return seq_no; | 37 return seq_no; |
38 } | 38 } |
39 | 39 |
40 void SaveChange(leveldb::DB* db, | 40 void SaveChange(leveldb::DB* db, |
41 const std::string& url, | 41 const std::string& url, |
42 const std::string& type) { | 42 const std::string& type) { |
43 int64 seq_no = GetLastSeqNo(db) + 1; | 43 int64_t seq_no = GetLastSeqNo(db) + 1; |
44 history_report::DeltaFileEntry entry; | 44 history_report::DeltaFileEntry entry; |
45 entry.set_seq_no(seq_no); | 45 entry.set_seq_no(seq_no); |
46 entry.set_type(type); | 46 entry.set_type(type); |
47 entry.set_url(url); | 47 entry.set_url(url); |
48 leveldb::WriteOptions writeOptions; | 48 leveldb::WriteOptions writeOptions; |
49 std::string key; | 49 std::string key; |
50 base::SStringPrintf(&key, "%" PRId64, seq_no); | 50 base::SStringPrintf(&key, "%" PRId64, seq_no); |
51 leveldb::Status status = db->Put( | 51 leveldb::Status status = db->Put( |
52 writeOptions, | 52 writeOptions, |
53 leveldb::Slice(key), | 53 leveldb::Slice(key), |
54 leveldb::Slice(entry.SerializeAsString())); | 54 leveldb::Slice(entry.SerializeAsString())); |
55 if (!status.ok()) | 55 if (!status.ok()) |
56 LOG(WARNING) << "Save Change failed " << status.ToString(); | 56 LOG(WARNING) << "Save Change failed " << status.ToString(); |
57 } | 57 } |
58 | 58 |
59 } // namespace | 59 } // namespace |
60 | 60 |
61 namespace history_report { | 61 namespace history_report { |
62 | 62 |
63 // Comparator used in leveldb. | 63 // Comparator used in leveldb. |
64 class DeltaFileBackend::DigitsComparator : public leveldb::Comparator { | 64 class DeltaFileBackend::DigitsComparator : public leveldb::Comparator { |
65 public: | 65 public: |
66 int Compare(const leveldb::Slice& a, | 66 int Compare(const leveldb::Slice& a, |
67 const leveldb::Slice& b) const override { | 67 const leveldb::Slice& b) const override { |
68 int64 first; | 68 int64_t first; |
69 int64 second; | 69 int64_t second; |
70 // Keys which can't be parsed go to the end. | 70 // Keys which can't be parsed go to the end. |
71 if (!base::StringToInt64(a.ToString(), &first)) return 1; | 71 if (!base::StringToInt64(a.ToString(), &first)) return 1; |
72 if (!base::StringToInt64(b.ToString(), &second)) return -1; | 72 if (!base::StringToInt64(b.ToString(), &second)) return -1; |
73 if (first < second) return -1; | 73 if (first < second) return -1; |
74 if (first > second) return 1; | 74 if (first > second) return 1; |
75 return 0; | 75 return 0; |
76 } | 76 } |
77 const char* Name() const override { return "DigitsComparator"; } | 77 const char* Name() const override { return "DigitsComparator"; } |
78 void FindShortestSeparator(std::string*, | 78 void FindShortestSeparator(std::string*, |
79 const leveldb::Slice&) const override { } | 79 const leveldb::Slice&) const override { } |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
118 void DeltaFileBackend::PageAdded(const GURL& url) { | 118 void DeltaFileBackend::PageAdded(const GURL& url) { |
119 if (!EnsureInitialized()) return; | 119 if (!EnsureInitialized()) return; |
120 SaveChange(db_.get(), url.spec().c_str(), "add"); | 120 SaveChange(db_.get(), url.spec().c_str(), "add"); |
121 } | 121 } |
122 | 122 |
123 void DeltaFileBackend::PageDeleted(const GURL& url) { | 123 void DeltaFileBackend::PageDeleted(const GURL& url) { |
124 if (!EnsureInitialized()) return; | 124 if (!EnsureInitialized()) return; |
125 SaveChange(db_.get(), url.spec().c_str(), "del"); | 125 SaveChange(db_.get(), url.spec().c_str(), "del"); |
126 } | 126 } |
127 | 127 |
128 int64 DeltaFileBackend::Trim(int64 lower_bound) { | 128 int64_t DeltaFileBackend::Trim(int64_t lower_bound) { |
129 if (!EnsureInitialized()) return -1; | 129 if (!EnsureInitialized()) return -1; |
130 leveldb::ReadOptions read_options; | 130 leveldb::ReadOptions read_options; |
131 scoped_ptr<leveldb::Iterator> db_iter(db_->NewIterator(read_options)); | 131 scoped_ptr<leveldb::Iterator> db_iter(db_->NewIterator(read_options)); |
132 db_iter->SeekToFirst(); | 132 db_iter->SeekToFirst(); |
133 if (!db_iter->Valid()) | 133 if (!db_iter->Valid()) |
134 return -1; | 134 return -1; |
135 history_report::DeltaFileEntry first_entry; | 135 history_report::DeltaFileEntry first_entry; |
136 leveldb::Slice value_slice = db_iter->value(); | 136 leveldb::Slice value_slice = db_iter->value(); |
137 if (!first_entry.ParseFromArray(value_slice.data(), value_slice.size())) | 137 if (!first_entry.ParseFromArray(value_slice.data(), value_slice.size())) |
138 return -1; | 138 return -1; |
139 int64 min_seq_no = first_entry.seq_no(); | 139 int64_t min_seq_no = first_entry.seq_no(); |
140 db_iter->SeekToLast(); | 140 db_iter->SeekToLast(); |
141 if (!db_iter->Valid()) | 141 if (!db_iter->Valid()) |
142 return -1; | 142 return -1; |
143 history_report::DeltaFileEntry last_entry; | 143 history_report::DeltaFileEntry last_entry; |
144 value_slice = db_iter->value(); | 144 value_slice = db_iter->value(); |
145 if (!last_entry.ParseFromArray(value_slice.data(), value_slice.size())) | 145 if (!last_entry.ParseFromArray(value_slice.data(), value_slice.size())) |
146 return -1; | 146 return -1; |
147 int64 max_seq_no = last_entry.seq_no(); | 147 int64_t max_seq_no = last_entry.seq_no(); |
148 // We want to have at least one entry in delta file left to know | 148 // We want to have at least one entry in delta file left to know |
149 // last sequence number in SaveChange. | 149 // last sequence number in SaveChange. |
150 if (max_seq_no <= lower_bound) | 150 if (max_seq_no <= lower_bound) |
151 lower_bound = max_seq_no - 1; | 151 lower_bound = max_seq_no - 1; |
152 leveldb::WriteBatch updates; | 152 leveldb::WriteBatch updates; |
153 for (int64 seq_no = min_seq_no; seq_no <= lower_bound; ++seq_no) { | 153 for (int64_t seq_no = min_seq_no; seq_no <= lower_bound; ++seq_no) { |
154 std::string key; | 154 std::string key; |
155 base::SStringPrintf(&key, "%" PRId64, seq_no); | 155 base::SStringPrintf(&key, "%" PRId64, seq_no); |
156 updates.Delete(leveldb::Slice(key)); | 156 updates.Delete(leveldb::Slice(key)); |
157 } | 157 } |
158 | 158 |
159 leveldb::WriteOptions write_options; | 159 leveldb::WriteOptions write_options; |
160 leveldb::Status status = db_->Write(write_options, &updates); | 160 leveldb::Status status = db_->Write(write_options, &updates); |
161 if (status.ok()) | 161 if (status.ok()) |
162 return max_seq_no; | 162 return max_seq_no; |
163 LOG(WARNING) << "Trim failed: " << status.ToString(); | 163 LOG(WARNING) << "Trim failed: " << status.ToString(); |
164 return -1; | 164 return -1; |
165 } | 165 } |
166 | 166 |
167 bool DeltaFileBackend::Recreate(const std::vector<std::string>& urls) { | 167 bool DeltaFileBackend::Recreate(const std::vector<std::string>& urls) { |
168 if (!EnsureInitialized()) return false; | 168 if (!EnsureInitialized()) return false; |
169 Clear(); | 169 Clear(); |
170 int64 seq_no = 1; | 170 int64_t seq_no = 1; |
171 leveldb::WriteBatch updates; | 171 leveldb::WriteBatch updates; |
172 for (std::vector<std::string>::const_iterator it = urls.begin(); | 172 for (std::vector<std::string>::const_iterator it = urls.begin(); |
173 it != urls.end(); | 173 it != urls.end(); |
174 ++it) { | 174 ++it) { |
175 DeltaFileEntry entry; | 175 DeltaFileEntry entry; |
176 entry.set_seq_no(seq_no); | 176 entry.set_seq_no(seq_no); |
177 entry.set_url(*it); | 177 entry.set_url(*it); |
178 entry.set_type("add"); | 178 entry.set_type("add"); |
179 std::string key; | 179 std::string key; |
180 base::SStringPrintf(&key, "%" PRId64, seq_no); | 180 base::SStringPrintf(&key, "%" PRId64, seq_no); |
181 updates.Put(leveldb::Slice(key), | 181 updates.Put(leveldb::Slice(key), |
182 leveldb::Slice(entry.SerializeAsString())); | 182 leveldb::Slice(entry.SerializeAsString())); |
183 ++seq_no; | 183 ++seq_no; |
184 } | 184 } |
185 leveldb::WriteOptions options; | 185 leveldb::WriteOptions options; |
186 leveldb::Status status = db_->Write(options, &updates); | 186 leveldb::Status status = db_->Write(options, &updates); |
187 if (status.ok()) | 187 if (status.ok()) |
188 return true; | 188 return true; |
189 LOG(WARNING) << "Recreate failed: " << status.ToString(); | 189 LOG(WARNING) << "Recreate failed: " << status.ToString(); |
190 return false; | 190 return false; |
191 } | 191 } |
192 | 192 |
193 scoped_ptr<std::vector<DeltaFileEntryWithData> > DeltaFileBackend::Query( | 193 scoped_ptr<std::vector<DeltaFileEntryWithData>> DeltaFileBackend::Query( |
194 int64 last_seq_no, | 194 int64_t last_seq_no, |
195 int32 limit) { | 195 int32_t limit) { |
196 if (!EnsureInitialized()) | 196 if (!EnsureInitialized()) |
197 return make_scoped_ptr(new std::vector<DeltaFileEntryWithData>()); | 197 return make_scoped_ptr(new std::vector<DeltaFileEntryWithData>()); |
198 std::string start; | 198 std::string start; |
199 base::SStringPrintf(&start, "%" PRId64, last_seq_no + 1); | 199 base::SStringPrintf(&start, "%" PRId64, last_seq_no + 1); |
200 leveldb::ReadOptions options; | 200 leveldb::ReadOptions options; |
201 scoped_ptr<leveldb::Iterator> db_it(db_->NewIterator(options)); | 201 scoped_ptr<leveldb::Iterator> db_it(db_->NewIterator(options)); |
202 scoped_ptr<std::vector<DeltaFileEntryWithData> > result( | 202 scoped_ptr<std::vector<DeltaFileEntryWithData> > result( |
203 new std::vector<DeltaFileEntryWithData>()); | 203 new std::vector<DeltaFileEntryWithData>()); |
204 int32 count = 0; | 204 int32_t count = 0; |
205 for (db_it->Seek(start); db_it->Valid() && count < limit; db_it->Next()) { | 205 for (db_it->Seek(start); db_it->Valid() && count < limit; db_it->Next()) { |
206 DeltaFileEntry entry; | 206 DeltaFileEntry entry; |
207 leveldb::Slice value_slice = db_it->value(); | 207 leveldb::Slice value_slice = db_it->value(); |
208 if (!entry.ParseFromArray(value_slice.data(), value_slice.size())) | 208 if (!entry.ParseFromArray(value_slice.data(), value_slice.size())) |
209 continue; | 209 continue; |
210 result->push_back(DeltaFileEntryWithData(entry)); | 210 result->push_back(DeltaFileEntryWithData(entry)); |
211 ++count; | 211 ++count; |
212 } | 212 } |
213 return result.Pass(); | 213 return result.Pass(); |
214 } | 214 } |
(...skipping 15 matching lines...) Expand all Loading... |
230 leveldb::ReadOptions options; | 230 leveldb::ReadOptions options; |
231 scoped_ptr<leveldb::Iterator> db_it(db_->NewIterator(options)); | 231 scoped_ptr<leveldb::Iterator> db_it(db_->NewIterator(options)); |
232 int num_entries = 0; | 232 int num_entries = 0; |
233 for (db_it->SeekToFirst(); db_it->Valid(); db_it->Next()) num_entries++; | 233 for (db_it->SeekToFirst(); db_it->Valid(); db_it->Next()) num_entries++; |
234 dump.append(base::IntToString(num_entries)); | 234 dump.append(base::IntToString(num_entries)); |
235 dump.append("]"); | 235 dump.append("]"); |
236 return dump; | 236 return dump; |
237 } | 237 } |
238 | 238 |
239 } // namespace history_report | 239 } // namespace history_report |
OLD | NEW |