blob: f4da99ef76b4c3048eec6b4c2798803f775bbb59 [file] [log] [blame]
[email protected]64021042012-02-10 20:02:291// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]e5ffd0e42009-09-11 21:30:562// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
[email protected]f0a54b22011-07-19 18:40:215#include "sql/connection.h"
[email protected]e5ffd0e42009-09-11 21:30:566
avi51ba3e692015-12-26 17:30:507#include <limits.h>
avi0b519202015-12-21 07:25:198#include <stddef.h>
9#include <stdint.h>
[email protected]e5ffd0e42009-09-11 21:30:5610#include <string.h>
mostynbd82cd9952016-04-11 20:05:3411
dchenge48600452015-12-28 02:24:5012#include <utility>
[email protected]e5ffd0e42009-09-11 21:30:5613
shessc9e80ae22015-08-12 21:39:1114#include "base/bind.h"
shessc8cd2a162015-10-22 20:30:4615#include "base/debug/dump_without_crashing.h"
[email protected]57999812013-02-24 05:40:5216#include "base/files/file_path.h"
thestig22dfc4012014-09-05 08:29:4417#include "base/files/file_util.h"
shessc8cd2a162015-10-22 20:30:4618#include "base/format_macros.h"
19#include "base/json/json_file_value_serializer.h"
[email protected]a7ec1292013-07-22 22:02:1820#include "base/lazy_instance.h"
[email protected]e5ffd0e42009-09-11 21:30:5621#include "base/logging.h"
shessc9e80ae22015-08-12 21:39:1122#include "base/message_loop/message_loop.h"
[email protected]bd2ccdb4a2012-12-07 22:14:5023#include "base/metrics/histogram.h"
[email protected]210ce0af2013-05-15 09:10:3924#include "base/metrics/sparse_histogram.h"
[email protected]80abf152013-05-22 12:42:4225#include "base/strings/string_split.h"
[email protected]a4bbc1f92013-06-11 07:28:1926#include "base/strings/string_util.h"
27#include "base/strings/stringprintf.h"
[email protected]906265872013-06-07 22:40:4528#include "base/strings/utf_string_conversions.h"
[email protected]a7ec1292013-07-22 22:02:1829#include "base/synchronization/lock.h"
ssid9f8022f2015-10-12 17:49:0330#include "base/trace_event/memory_dump_manager.h"
ssid3be5b1ec2016-01-13 14:21:5731#include "sql/connection_memory_dump_provider.h"
shess9bf2c672015-12-18 01:18:0832#include "sql/meta_table.h"
[email protected]f0a54b22011-07-19 18:40:2133#include "sql/statement.h"
[email protected]e33cba42010-08-18 23:37:0334#include "third_party/sqlite/sqlite3.h"
[email protected]e5ffd0e42009-09-11 21:30:5635
[email protected]2e1cee762013-07-09 14:40:0036#if defined(OS_IOS) && defined(USE_SYSTEM_SQLITE)
37#include "third_party/sqlite/src/ext/icu/sqliteicu.h"
38#endif
39
[email protected]5b96f3772010-09-28 16:30:5740namespace {
41
42// Spin for up to a second waiting for the lock to clear when setting
43// up the database.
44// TODO(shess): Better story on this. http://crbug.com/56559
[email protected]c68ce172011-11-24 22:30:2745const int kBusyTimeoutSeconds = 1;
[email protected]5b96f3772010-09-28 16:30:5746
47class ScopedBusyTimeout {
48 public:
49 explicit ScopedBusyTimeout(sqlite3* db)
50 : db_(db) {
51 }
52 ~ScopedBusyTimeout() {
53 sqlite3_busy_timeout(db_, 0);
54 }
55
56 int SetTimeout(base::TimeDelta timeout) {
57 DCHECK_LT(timeout.InMilliseconds(), INT_MAX);
58 return sqlite3_busy_timeout(db_,
59 static_cast<int>(timeout.InMilliseconds()));
60 }
61
62 private:
63 sqlite3* db_;
64};
65
[email protected]6d42f152012-11-10 00:38:2466// Helper to "safely" enable writable_schema. No error checking
67// because it is reasonable to just forge ahead in case of an error.
68// If turning it on fails, then most likely nothing will work, whereas
69// if turning it off fails, it only matters if some code attempts to
70// continue working with the database and tries to modify the
71// sqlite_master table (none of our code does this).
72class ScopedWritableSchema {
73 public:
74 explicit ScopedWritableSchema(sqlite3* db)
75 : db_(db) {
76 sqlite3_exec(db_, "PRAGMA writable_schema=1", NULL, NULL, NULL);
77 }
78 ~ScopedWritableSchema() {
79 sqlite3_exec(db_, "PRAGMA writable_schema=0", NULL, NULL, NULL);
80 }
81
82 private:
83 sqlite3* db_;
84};
85
[email protected]7bae5742013-07-10 20:46:1686// Helper to wrap the sqlite3_backup_*() step of Raze(). Return
87// SQLite error code from running the backup step.
88int BackupDatabase(sqlite3* src, sqlite3* dst, const char* db_name) {
89 DCHECK_NE(src, dst);
90 sqlite3_backup* backup = sqlite3_backup_init(dst, db_name, src, db_name);
91 if (!backup) {
92 // Since this call only sets things up, this indicates a gross
93 // error in SQLite.
94 DLOG(FATAL) << "Unable to start sqlite3_backup(): " << sqlite3_errmsg(dst);
95 return sqlite3_errcode(dst);
96 }
97
98 // -1 backs up the entire database.
99 int rc = sqlite3_backup_step(backup, -1);
100 int pages = sqlite3_backup_pagecount(backup);
101 sqlite3_backup_finish(backup);
102
103 // If successful, exactly one page should have been backed up. If
104 // this breaks, check this function to make sure assumptions aren't
105 // being broken.
106 if (rc == SQLITE_DONE)
107 DCHECK_EQ(pages, 1);
108
109 return rc;
110}
111
[email protected]8d409412013-07-19 18:25:30112// Be very strict on attachment point. SQLite can handle a much wider
113// character set with appropriate quoting, but Chromium code should
114// just use clean names to start with.
115bool ValidAttachmentPoint(const char* attachment_point) {
116 for (size_t i = 0; attachment_point[i]; ++i) {
zhongyi23960342016-04-12 23:13:20117 if (!(base::IsAsciiDigit(attachment_point[i]) ||
118 base::IsAsciiAlpha(attachment_point[i]) ||
[email protected]8d409412013-07-19 18:25:30119 attachment_point[i] == '_')) {
120 return false;
121 }
122 }
123 return true;
124}
125
shessc9e80ae22015-08-12 21:39:11126void RecordSqliteMemory10Min() {
avi0b519202015-12-21 07:25:19127 const int64_t used = sqlite3_memory_used();
shessc9e80ae22015-08-12 21:39:11128 UMA_HISTOGRAM_COUNTS("Sqlite.MemoryKB.TenMinutes", used / 1024);
129}
130
131void RecordSqliteMemoryHour() {
avi0b519202015-12-21 07:25:19132 const int64_t used = sqlite3_memory_used();
shessc9e80ae22015-08-12 21:39:11133 UMA_HISTOGRAM_COUNTS("Sqlite.MemoryKB.OneHour", used / 1024);
134}
135
136void RecordSqliteMemoryDay() {
avi0b519202015-12-21 07:25:19137 const int64_t used = sqlite3_memory_used();
shessc9e80ae22015-08-12 21:39:11138 UMA_HISTOGRAM_COUNTS("Sqlite.MemoryKB.OneDay", used / 1024);
139}
140
shess2d48e942015-08-25 17:39:51141void RecordSqliteMemoryWeek() {
avi0b519202015-12-21 07:25:19142 const int64_t used = sqlite3_memory_used();
shess2d48e942015-08-25 17:39:51143 UMA_HISTOGRAM_COUNTS("Sqlite.MemoryKB.OneWeek", used / 1024);
144}
145
[email protected]a7ec1292013-07-22 22:02:18146// SQLite automatically calls sqlite3_initialize() lazily, but
147// sqlite3_initialize() uses double-checked locking and thus can have
148// data races.
149//
150// TODO(shess): Another alternative would be to have
151// sqlite3_initialize() called as part of process bring-up. If this
152// is changed, remove the dynamic_annotations dependency in sql.gyp.
153base::LazyInstance<base::Lock>::Leaky
154 g_sqlite_init_lock = LAZY_INSTANCE_INITIALIZER;
155void InitializeSqlite() {
156 base::AutoLock lock(g_sqlite_init_lock.Get());
shessc9e80ae22015-08-12 21:39:11157 static bool first_call = true;
158 if (first_call) {
159 sqlite3_initialize();
160
161 // Schedule callback to record memory footprint histograms at 10m, 1h, and
162 // 1d. There may not be a message loop in tests.
163 if (base::MessageLoop::current()) {
164 base::MessageLoop::current()->PostDelayedTask(
165 FROM_HERE, base::Bind(&RecordSqliteMemory10Min),
166 base::TimeDelta::FromMinutes(10));
167 base::MessageLoop::current()->PostDelayedTask(
168 FROM_HERE, base::Bind(&RecordSqliteMemoryHour),
169 base::TimeDelta::FromHours(1));
170 base::MessageLoop::current()->PostDelayedTask(
171 FROM_HERE, base::Bind(&RecordSqliteMemoryDay),
172 base::TimeDelta::FromDays(1));
shess2d48e942015-08-25 17:39:51173 base::MessageLoop::current()->PostDelayedTask(
174 FROM_HERE, base::Bind(&RecordSqliteMemoryWeek),
175 base::TimeDelta::FromDays(7));
shessc9e80ae22015-08-12 21:39:11176 }
177
178 first_call = false;
179 }
[email protected]a7ec1292013-07-22 22:02:18180}
181
[email protected]8ada10f2013-12-21 00:42:34182// Helper to get the sqlite3_file* associated with the "main" database.
183int GetSqlite3File(sqlite3* db, sqlite3_file** file) {
184 *file = NULL;
185 int rc = sqlite3_file_control(db, NULL, SQLITE_FCNTL_FILE_POINTER, file);
186 if (rc != SQLITE_OK)
187 return rc;
188
189 // TODO(shess): NULL in file->pMethods has been observed on android_dbg
190 // content_unittests, even though it should not be possible.
191 // http://crbug.com/329982
192 if (!*file || !(*file)->pMethods)
193 return SQLITE_ERROR;
194
195 return rc;
196}
197
shess5dac334f2015-11-05 20:47:42198// Convenience to get the sqlite3_file* and the size for the "main" database.
199int GetSqlite3FileAndSize(sqlite3* db,
200 sqlite3_file** file, sqlite3_int64* db_size) {
201 int rc = GetSqlite3File(db, file);
202 if (rc != SQLITE_OK)
203 return rc;
204
205 return (*file)->pMethods->xFileSize(*file, db_size);
206}
207
shess58b8df82015-06-03 00:19:32208// This should match UMA_HISTOGRAM_MEDIUM_TIMES().
209base::HistogramBase* GetMediumTimeHistogram(const std::string& name) {
210 return base::Histogram::FactoryTimeGet(
211 name,
212 base::TimeDelta::FromMilliseconds(10),
213 base::TimeDelta::FromMinutes(3),
214 50,
215 base::HistogramBase::kUmaTargetedHistogramFlag);
216}
217
erg102ceb412015-06-20 01:38:13218std::string AsUTF8ForSQL(const base::FilePath& path) {
219#if defined(OS_WIN)
220 return base::WideToUTF8(path.value());
221#elif defined(OS_POSIX)
222 return path.value();
223#endif
224}
225
[email protected]5b96f3772010-09-28 16:30:57226} // namespace
227
[email protected]e5ffd0e42009-09-11 21:30:56228namespace sql {
229
[email protected]4350e322013-06-18 22:18:10230// static
231Connection::ErrorIgnorerCallback* Connection::current_ignorer_cb_ = NULL;
232
233// static
[email protected]74cdede2013-09-25 05:39:57234bool Connection::ShouldIgnoreSqliteError(int error) {
[email protected]4350e322013-06-18 22:18:10235 if (!current_ignorer_cb_)
236 return false;
237 return current_ignorer_cb_->Run(error);
238}
239
shessf7e988f2015-11-13 00:41:06240// static
241bool Connection::ShouldIgnoreSqliteCompileError(int error) {
242 // Put this first in case tests need to see that the check happened.
243 if (ShouldIgnoreSqliteError(error))
244 return true;
245
246 // Trim extended error codes.
247 int basic_error = error & 0xff;
248
249 // These errors relate more to the runtime context of the system than to
250 // errors with a SQL statement or with the schema, so they aren't generally
251 // interesting to flag. This list is not comprehensive.
252 return basic_error == SQLITE_BUSY ||
253 basic_error == SQLITE_NOTADB ||
254 basic_error == SQLITE_CORRUPT;
255}
256
shessc8cd2a162015-10-22 20:30:46257void Connection::ReportDiagnosticInfo(int extended_error, Statement* stmt) {
258 AssertIOAllowed();
259
260 std::string debug_info;
261 const int error = (extended_error & 0xFF);
262 if (error == SQLITE_CORRUPT) {
shess874ea1bd2016-02-02 05:15:06263 // CollectCorruptionInfo() is implemented in terms of sql::Connection,
264 // prevent reentrant calls to the error callback.
265 // TODO(shess): Rewrite IntegrityCheckHelper() in terms of raw SQLite.
266 ErrorCallback original_callback = std::move(error_callback_);
267 reset_error_callback();
268
shessc8cd2a162015-10-22 20:30:46269 debug_info = CollectCorruptionInfo();
shess874ea1bd2016-02-02 05:15:06270
271 error_callback_ = std::move(original_callback);
shessc8cd2a162015-10-22 20:30:46272 } else {
273 debug_info = CollectErrorInfo(extended_error, stmt);
274 }
275
276 if (!debug_info.empty() && RegisterIntentToUpload()) {
277 char debug_buf[2000];
278 base::strlcpy(debug_buf, debug_info.c_str(), arraysize(debug_buf));
279 base::debug::Alias(&debug_buf);
280
281 base::debug::DumpWithoutCrashing();
282 }
283}
284
[email protected]4350e322013-06-18 22:18:10285// static
286void Connection::SetErrorIgnorer(Connection::ErrorIgnorerCallback* cb) {
287 CHECK(current_ignorer_cb_ == NULL);
288 current_ignorer_cb_ = cb;
289}
290
291// static
292void Connection::ResetErrorIgnorer() {
293 CHECK(current_ignorer_cb_);
294 current_ignorer_cb_ = NULL;
295}
296
[email protected]e5ffd0e42009-09-11 21:30:56297bool StatementID::operator<(const StatementID& other) const {
298 if (number_ != other.number_)
299 return number_ < other.number_;
300 return strcmp(str_, other.str_) < 0;
301}
302
[email protected]e5ffd0e42009-09-11 21:30:56303Connection::StatementRef::StatementRef(Connection* connection,
[email protected]41a97c812013-02-07 02:35:38304 sqlite3_stmt* stmt,
305 bool was_valid)
[email protected]e5ffd0e42009-09-11 21:30:56306 : connection_(connection),
[email protected]41a97c812013-02-07 02:35:38307 stmt_(stmt),
308 was_valid_(was_valid) {
309 if (connection)
310 connection_->StatementRefCreated(this);
[email protected]e5ffd0e42009-09-11 21:30:56311}
312
313Connection::StatementRef::~StatementRef() {
314 if (connection_)
315 connection_->StatementRefDeleted(this);
[email protected]41a97c812013-02-07 02:35:38316 Close(false);
[email protected]e5ffd0e42009-09-11 21:30:56317}
318
[email protected]41a97c812013-02-07 02:35:38319void Connection::StatementRef::Close(bool forced) {
[email protected]e5ffd0e42009-09-11 21:30:56320 if (stmt_) {
[email protected]35f7e5392012-07-27 19:54:50321 // Call to AssertIOAllowed() cannot go at the beginning of the function
322 // because Close() is called unconditionally from destructor to clean
323 // connection_. And if this is inactive statement this won't cause any
324 // disk access and destructor most probably will be called on thread
325 // not allowing disk access.
326 // TODO([email protected]): This should move to the beginning
327 // of the function. http://crbug.com/136655.
328 AssertIOAllowed();
[email protected]e5ffd0e42009-09-11 21:30:56329 sqlite3_finalize(stmt_);
330 stmt_ = NULL;
331 }
332 connection_ = NULL; // The connection may be getting deleted.
[email protected]41a97c812013-02-07 02:35:38333
334 // Forced close is expected to happen from a statement error
335 // handler. In that case maintain the sense of |was_valid_| which
336 // previously held for this ref.
337 was_valid_ = was_valid_ && forced;
[email protected]e5ffd0e42009-09-11 21:30:56338}
339
340Connection::Connection()
341 : db_(NULL),
342 page_size_(0),
343 cache_size_(0),
344 exclusive_locking_(false),
[email protected]81a2a602013-07-17 19:10:36345 restrict_to_user_(false),
[email protected]e5ffd0e42009-09-11 21:30:56346 transaction_nesting_(0),
[email protected]35f7e5392012-07-27 19:54:50347 needs_rollback_(false),
[email protected]49dc4f22012-10-17 17:41:16348 in_memory_(false),
shess58b8df82015-06-03 00:19:32349 poisoned_(false),
kerz42ff2a012016-04-27 04:50:06350 mmap_disabled_(false),
shess7dbd4dee2015-10-06 17:39:16351 mmap_enabled_(false),
352 total_changes_at_last_release_(0),
shess58b8df82015-06-03 00:19:32353 stats_histogram_(NULL),
354 commit_time_histogram_(NULL),
355 autocommit_time_histogram_(NULL),
356 update_time_histogram_(NULL),
357 query_time_histogram_(NULL),
358 clock_(new TimeSource()) {
[email protected]526b4662013-06-14 04:09:12359}
[email protected]e5ffd0e42009-09-11 21:30:56360
361Connection::~Connection() {
362 Close();
363}
364
shess58b8df82015-06-03 00:19:32365void Connection::RecordEvent(Events event, size_t count) {
366 for (size_t i = 0; i < count; ++i) {
367 UMA_HISTOGRAM_ENUMERATION("Sqlite.Stats", event, EVENT_MAX_VALUE);
368 }
369
370 if (stats_histogram_) {
371 for (size_t i = 0; i < count; ++i) {
372 stats_histogram_->Add(event);
373 }
374 }
375}
376
377void Connection::RecordCommitTime(const base::TimeDelta& delta) {
378 RecordUpdateTime(delta);
379 UMA_HISTOGRAM_MEDIUM_TIMES("Sqlite.CommitTime", delta);
380 if (commit_time_histogram_)
381 commit_time_histogram_->AddTime(delta);
382}
383
384void Connection::RecordAutoCommitTime(const base::TimeDelta& delta) {
385 RecordUpdateTime(delta);
386 UMA_HISTOGRAM_MEDIUM_TIMES("Sqlite.AutoCommitTime", delta);
387 if (autocommit_time_histogram_)
388 autocommit_time_histogram_->AddTime(delta);
389}
390
391void Connection::RecordUpdateTime(const base::TimeDelta& delta) {
392 RecordQueryTime(delta);
393 UMA_HISTOGRAM_MEDIUM_TIMES("Sqlite.UpdateTime", delta);
394 if (update_time_histogram_)
395 update_time_histogram_->AddTime(delta);
396}
397
398void Connection::RecordQueryTime(const base::TimeDelta& delta) {
399 UMA_HISTOGRAM_MEDIUM_TIMES("Sqlite.QueryTime", delta);
400 if (query_time_histogram_)
401 query_time_histogram_->AddTime(delta);
402}
403
404void Connection::RecordTimeAndChanges(
405 const base::TimeDelta& delta, bool read_only) {
406 if (read_only) {
407 RecordQueryTime(delta);
408 } else {
409 const int changes = sqlite3_changes(db_);
410 if (sqlite3_get_autocommit(db_)) {
411 RecordAutoCommitTime(delta);
412 RecordEvent(EVENT_CHANGES_AUTOCOMMIT, changes);
413 } else {
414 RecordUpdateTime(delta);
415 RecordEvent(EVENT_CHANGES, changes);
416 }
417 }
418}
419
[email protected]a3ef4832013-02-02 05:12:33420bool Connection::Open(const base::FilePath& path) {
[email protected]348ac8f52013-05-21 03:27:02421 if (!histogram_tag_.empty()) {
tfarina720d4f32015-05-11 22:31:26422 int64_t size_64 = 0;
[email protected]56285702013-12-04 18:22:49423 if (base::GetFileSize(path, &size_64)) {
[email protected]348ac8f52013-05-21 03:27:02424 size_t sample = static_cast<size_t>(size_64 / 1024);
425 std::string full_histogram_name = "Sqlite.SizeKB." + histogram_tag_;
426 base::HistogramBase* histogram =
427 base::Histogram::FactoryGet(
428 full_histogram_name, 1, 1000000, 50,
429 base::HistogramBase::kUmaTargetedHistogramFlag);
430 if (histogram)
431 histogram->Add(sample);
shess9bf2c672015-12-18 01:18:08432 UMA_HISTOGRAM_COUNTS("Sqlite.SizeKB", sample);
[email protected]348ac8f52013-05-21 03:27:02433 }
434 }
435
erg102ceb412015-06-20 01:38:13436 return OpenInternal(AsUTF8ForSQL(path), RETRY_ON_POISON);
[email protected]765b44502009-10-02 05:01:42437}
[email protected]e5ffd0e42009-09-11 21:30:56438
[email protected]765b44502009-10-02 05:01:42439bool Connection::OpenInMemory() {
[email protected]35f7e5392012-07-27 19:54:50440 in_memory_ = true;
[email protected]fed734a2013-07-17 04:45:13441 return OpenInternal(":memory:", NO_RETRY);
[email protected]e5ffd0e42009-09-11 21:30:56442}
443
[email protected]8d409412013-07-19 18:25:30444bool Connection::OpenTemporary() {
445 return OpenInternal("", NO_RETRY);
446}
447
[email protected]41a97c812013-02-07 02:35:38448void Connection::CloseInternal(bool forced) {
[email protected]4e179ba2012-03-17 16:06:47449 // TODO(shess): Calling "PRAGMA journal_mode = DELETE" at this point
450 // will delete the -journal file. For ChromiumOS or other more
451 // embedded systems, this is probably not appropriate, whereas on
452 // desktop it might make some sense.
453
[email protected]4b350052012-02-24 20:40:48454 // sqlite3_close() needs all prepared statements to be finalized.
[email protected]4b350052012-02-24 20:40:48455
[email protected]41a97c812013-02-07 02:35:38456 // Release cached statements.
457 statement_cache_.clear();
458
459 // With cached statements released, in-use statements will remain.
460 // Closing the database while statements are in use is an API
461 // violation, except for forced close (which happens from within a
462 // statement's error handler).
463 DCHECK(forced || open_statements_.empty());
464
465 // Deactivate any outstanding statements so sqlite3_close() works.
466 for (StatementRefSet::iterator i = open_statements_.begin();
467 i != open_statements_.end(); ++i)
468 (*i)->Close(forced);
469 open_statements_.clear();
[email protected]4b350052012-02-24 20:40:48470
[email protected]e5ffd0e42009-09-11 21:30:56471 if (db_) {
[email protected]35f7e5392012-07-27 19:54:50472 // Call to AssertIOAllowed() cannot go at the beginning of the function
473 // because Close() must be called from destructor to clean
474 // statement_cache_, it won't cause any disk access and it most probably
475 // will happen on thread not allowing disk access.
476 // TODO([email protected]): This should move to the beginning
477 // of the function. http://crbug.com/136655.
478 AssertIOAllowed();
[email protected]73fb8d52013-07-24 05:04:28479
ssid3be5b1ec2016-01-13 14:21:57480 // Reseting acquires a lock to ensure no dump is happening on the database
481 // at the same time. Unregister takes ownership of provider and it is safe
482 // since the db is reset. memory_dump_provider_ could be null if db_ was
483 // poisoned.
484 if (memory_dump_provider_) {
485 memory_dump_provider_->ResetDatabase();
486 base::trace_event::MemoryDumpManager::GetInstance()
487 ->UnregisterAndDeleteDumpProviderSoon(
488 std::move(memory_dump_provider_));
489 }
490
[email protected]73fb8d52013-07-24 05:04:28491 int rc = sqlite3_close(db_);
492 if (rc != SQLITE_OK) {
493 UMA_HISTOGRAM_SPARSE_SLOWLY("Sqlite.CloseFailure", rc);
494 DLOG(FATAL) << "sqlite3_close failed: " << GetErrorMessage();
495 }
[email protected]e5ffd0e42009-09-11 21:30:56496 }
[email protected]fed734a2013-07-17 04:45:13497 db_ = NULL;
[email protected]e5ffd0e42009-09-11 21:30:56498}
499
[email protected]41a97c812013-02-07 02:35:38500void Connection::Close() {
501 // If the database was already closed by RazeAndClose(), then no
502 // need to close again. Clear the |poisoned_| bit so that incorrect
503 // API calls are caught.
504 if (poisoned_) {
505 poisoned_ = false;
506 return;
507 }
508
509 CloseInternal(false);
510}
511
[email protected]e5ffd0e42009-09-11 21:30:56512void Connection::Preload() {
[email protected]35f7e5392012-07-27 19:54:50513 AssertIOAllowed();
514
[email protected]e5ffd0e42009-09-11 21:30:56515 if (!db_) {
[email protected]41a97c812013-02-07 02:35:38516 DLOG_IF(FATAL, !poisoned_) << "Cannot preload null db";
[email protected]e5ffd0e42009-09-11 21:30:56517 return;
518 }
519
[email protected]8ada10f2013-12-21 00:42:34520 // Use local settings if provided, otherwise use documented defaults. The
521 // actual results could be fetching via PRAGMA calls.
522 const int page_size = page_size_ ? page_size_ : 1024;
523 sqlite3_int64 preload_size = page_size * (cache_size_ ? cache_size_ : 2000);
524 if (preload_size < 1)
[email protected]e5ffd0e42009-09-11 21:30:56525 return;
526
[email protected]8ada10f2013-12-21 00:42:34527 sqlite3_file* file = NULL;
[email protected]8ada10f2013-12-21 00:42:34528 sqlite3_int64 file_size = 0;
shess5dac334f2015-11-05 20:47:42529 int rc = GetSqlite3FileAndSize(db_, &file, &file_size);
[email protected]8ada10f2013-12-21 00:42:34530 if (rc != SQLITE_OK)
531 return;
532
533 // Don't preload more than the file contains.
534 if (preload_size > file_size)
535 preload_size = file_size;
536
mostynbd82cd9952016-04-11 20:05:34537 std::unique_ptr<char[]> buf(new char[page_size]);
shessde60c5f12015-04-21 17:34:46538 for (sqlite3_int64 pos = 0; pos < preload_size; pos += page_size) {
[email protected]8ada10f2013-12-21 00:42:34539 rc = file->pMethods->xRead(file, buf.get(), page_size, pos);
shessd90aeea82015-11-13 02:24:31540
541 // TODO(shess): Consider calling OnSqliteError().
[email protected]8ada10f2013-12-21 00:42:34542 if (rc != SQLITE_OK)
543 return;
544 }
[email protected]e5ffd0e42009-09-11 21:30:56545}
546
shess7dbd4dee2015-10-06 17:39:16547// SQLite keeps unused pages associated with a connection in a cache. It asks
548// the cache for pages by an id, and if the page is present and the database is
549// unchanged, it considers the content of the page valid and doesn't read it
550// from disk. When memory-mapped I/O is enabled, on read SQLite uses page
551// structures created from the memory map data before consulting the cache. On
552// write SQLite creates a new in-memory page structure, copies the data from the
553// memory map, and later writes it, releasing the updated page back to the
554// cache.
555//
556// This means that in memory-mapped mode, the contents of the cached pages are
557// not re-used for reads, but they are re-used for writes if the re-written page
558// is still in the cache. The implementation of sqlite3_db_release_memory() as
559// of SQLite 3.8.7.4 frees all pages from pcaches associated with the
560// connection, so it should free these pages.
561//
562// Unfortunately, the zero page is also freed. That page is never accessed
563// using memory-mapped I/O, and the cached copy can be re-used after verifying
564// the file change counter on disk. Also, fresh pages from cache receive some
565// pager-level initialization before they can be used. Since the information
566// involved will immediately be accessed in various ways, it is unclear if the
567// additional overhead is material, or just moving processor cache effects
568// around.
569//
570// TODO(shess): It would be better to release the pages immediately when they
571// are no longer needed. This would basically happen after SQLite commits a
572// transaction. I had implemented a pcache wrapper to do this, but it involved
573// layering violations, and it had to be setup before any other sqlite call,
574// which was brittle. Also, for large files it would actually make sense to
575// maintain the existing pcache behavior for blocks past the memory-mapped
576// segment. I think drh would accept a reasonable implementation of the overall
577// concept for upstreaming to SQLite core.
578//
579// TODO(shess): Another possibility would be to set the cache size small, which
580// would keep the zero page around, plus some pre-initialized pages, and SQLite
581// can manage things. The downside is that updates larger than the cache would
582// spill to the journal. That could be compensated by setting cache_spill to
583// false. The downside then is that it allows open-ended use of memory for
584// large transactions.
585//
586// TODO(shess): The TrimMemory() trick of bouncing the cache size would also
587// work. There could be two prepared statements, one for cache_size=1 one for
588// cache_size=goal.
589void Connection::ReleaseCacheMemoryIfNeeded(bool implicit_change_performed) {
shess644fc8a2016-02-26 18:15:58590 // The database could have been closed during a transaction as part of error
591 // recovery.
592 if (!db_) {
593 DLOG_IF(FATAL, !poisoned_) << "Illegal use of connection without a db";
594 return;
595 }
shess7dbd4dee2015-10-06 17:39:16596
597 // If memory-mapping is not enabled, the page cache helps performance.
598 if (!mmap_enabled_)
599 return;
600
601 // On caller request, force the change comparison to fail. Done before the
602 // transaction-nesting test so that the signal can carry to transaction
603 // commit.
604 if (implicit_change_performed)
605 --total_changes_at_last_release_;
606
607 // Cached pages may be re-used within the same transaction.
608 if (transaction_nesting())
609 return;
610
611 // If no changes have been made, skip flushing. This allows the first page of
612 // the database to remain in cache across multiple reads.
613 const int total_changes = sqlite3_total_changes(db_);
614 if (total_changes == total_changes_at_last_release_)
615 return;
616
617 total_changes_at_last_release_ = total_changes;
618 sqlite3_db_release_memory(db_);
619}
620
shessc8cd2a162015-10-22 20:30:46621base::FilePath Connection::DbPath() const {
622 if (!is_open())
623 return base::FilePath();
624
625 const char* path = sqlite3_db_filename(db_, "main");
626 const base::StringPiece db_path(path);
627#if defined(OS_WIN)
628 return base::FilePath(base::UTF8ToWide(db_path));
629#elif defined(OS_POSIX)
630 return base::FilePath(db_path);
631#else
632 NOTREACHED();
633 return base::FilePath();
634#endif
635}
636
637// Data is persisted in a file shared between databases in the same directory.
638// The "sqlite-diag" file contains a dictionary with the version number, and an
639// array of histogram tags for databases which have been dumped.
640bool Connection::RegisterIntentToUpload() const {
641 static const char* kVersionKey = "version";
642 static const char* kDiagnosticDumpsKey = "DiagnosticDumps";
643 static int kVersion = 1;
644
645 AssertIOAllowed();
646
647 if (histogram_tag_.empty())
648 return false;
649
650 if (!is_open())
651 return false;
652
653 if (in_memory_)
654 return false;
655
656 const base::FilePath db_path = DbPath();
657 if (db_path.empty())
658 return false;
659
660 // Put the collection of diagnostic data next to the databases. In most
661 // cases, this is the profile directory, but safe-browsing stores a Cookies
662 // file in the directory above the profile directory.
663 base::FilePath breadcrumb_path(
664 db_path.DirName().Append(FILE_PATH_LITERAL("sqlite-diag")));
665
666 // Lock against multiple updates to the diagnostics file. This code should
667 // seldom be called in the first place, and when called it should seldom be
668 // called for multiple databases, and when called for multiple databases there
669 // is _probably_ something systemic wrong with the user's system. So the lock
670 // should never be contended, but when it is the database experience is
671 // already bad.
672 base::AutoLock lock(g_sqlite_init_lock.Get());
673
mostynbd82cd9952016-04-11 20:05:34674 std::unique_ptr<base::Value> root;
shessc8cd2a162015-10-22 20:30:46675 if (!base::PathExists(breadcrumb_path)) {
mostynbd82cd9952016-04-11 20:05:34676 std::unique_ptr<base::DictionaryValue> root_dict(
677 new base::DictionaryValue());
shessc8cd2a162015-10-22 20:30:46678 root_dict->SetInteger(kVersionKey, kVersion);
679
mostynbd82cd9952016-04-11 20:05:34680 std::unique_ptr<base::ListValue> dumps(new base::ListValue);
shessc8cd2a162015-10-22 20:30:46681 dumps->AppendString(histogram_tag_);
dchenge48600452015-12-28 02:24:50682 root_dict->Set(kDiagnosticDumpsKey, std::move(dumps));
shessc8cd2a162015-10-22 20:30:46683
dchenge48600452015-12-28 02:24:50684 root = std::move(root_dict);
shessc8cd2a162015-10-22 20:30:46685 } else {
686 // Failure to read a valid dictionary implies that something is going wrong
687 // on the system.
688 JSONFileValueDeserializer deserializer(breadcrumb_path);
mostynbd82cd9952016-04-11 20:05:34689 std::unique_ptr<base::Value> read_root(
shessc8cd2a162015-10-22 20:30:46690 deserializer.Deserialize(nullptr, nullptr));
691 if (!read_root.get())
692 return false;
mostynbd82cd9952016-04-11 20:05:34693 std::unique_ptr<base::DictionaryValue> root_dict =
dchenge48600452015-12-28 02:24:50694 base::DictionaryValue::From(std::move(read_root));
shessc8cd2a162015-10-22 20:30:46695 if (!root_dict)
696 return false;
697
698 // Don't upload if the version is missing or newer.
699 int version = 0;
700 if (!root_dict->GetInteger(kVersionKey, &version) || version > kVersion)
701 return false;
702
703 base::ListValue* dumps = nullptr;
704 if (!root_dict->GetList(kDiagnosticDumpsKey, &dumps))
705 return false;
706
707 const size_t size = dumps->GetSize();
708 for (size_t i = 0; i < size; ++i) {
709 std::string s;
710
711 // Don't upload if the value isn't a string, or indicates a prior upload.
712 if (!dumps->GetString(i, &s) || s == histogram_tag_)
713 return false;
714 }
715
716 // Record intention to proceed with upload.
717 dumps->AppendString(histogram_tag_);
dchenge48600452015-12-28 02:24:50718 root = std::move(root_dict);
shessc8cd2a162015-10-22 20:30:46719 }
720
721 const base::FilePath breadcrumb_new =
722 breadcrumb_path.AddExtension(FILE_PATH_LITERAL("new"));
723 base::DeleteFile(breadcrumb_new, false);
724
725 // No upload if the breadcrumb file cannot be updated.
726 // TODO(shess): Consider ImportantFileWriter::WriteFileAtomically() to land
727 // the data on disk. For now, losing the data is not a big problem, so the
728 // sync overhead would probably not be worth it.
729 JSONFileValueSerializer serializer(breadcrumb_new);
730 if (!serializer.Serialize(*root))
731 return false;
732 if (!base::PathExists(breadcrumb_new))
733 return false;
734 if (!base::ReplaceFile(breadcrumb_new, breadcrumb_path, nullptr)) {
735 base::DeleteFile(breadcrumb_new, false);
736 return false;
737 }
738
739 return true;
740}
741
742std::string Connection::CollectErrorInfo(int error, Statement* stmt) const {
743 // Buffer for accumulating debugging info about the error. Place
744 // more-relevant information earlier, in case things overflow the
745 // fixed-size reporting buffer.
746 std::string debug_info;
747
748 // The error message from the failed operation.
749 base::StringAppendF(&debug_info, "db error: %d/%s\n",
750 GetErrorCode(), GetErrorMessage());
751
752 // TODO(shess): |error| and |GetErrorCode()| should always be the same, but
753 // reading code does not entirely convince me. Remove if they turn out to be
754 // the same.
755 if (error != GetErrorCode())
756 base::StringAppendF(&debug_info, "reported error: %d\n", error);
757
758 // System error information. Interpretation of Windows errors is different
759 // from posix.
760#if defined(OS_WIN)
761 base::StringAppendF(&debug_info, "LastError: %d\n", GetLastErrno());
762#elif defined(OS_POSIX)
763 base::StringAppendF(&debug_info, "errno: %d\n", GetLastErrno());
764#else
765 NOTREACHED(); // Add appropriate log info.
766#endif
767
768 if (stmt) {
769 base::StringAppendF(&debug_info, "statement: %s\n",
770 stmt->GetSQLStatement());
771 } else {
772 base::StringAppendF(&debug_info, "statement: NULL\n");
773 }
774
775 // SQLITE_ERROR often indicates some sort of mismatch between the statement
776 // and the schema, possibly due to a failed schema migration.
777 if (error == SQLITE_ERROR) {
778 const char* kVersionSql = "SELECT value FROM meta WHERE key = 'version'";
779 sqlite3_stmt* s;
780 int rc = sqlite3_prepare_v2(db_, kVersionSql, -1, &s, nullptr);
781 if (rc == SQLITE_OK) {
782 rc = sqlite3_step(s);
783 if (rc == SQLITE_ROW) {
784 base::StringAppendF(&debug_info, "version: %d\n",
785 sqlite3_column_int(s, 0));
786 } else if (rc == SQLITE_DONE) {
787 debug_info += "version: none\n";
788 } else {
789 base::StringAppendF(&debug_info, "version: error %d\n", rc);
790 }
791 sqlite3_finalize(s);
792 } else {
793 base::StringAppendF(&debug_info, "version: prepare error %d\n", rc);
794 }
795
796 debug_info += "schema:\n";
797
798 // sqlite_master has columns:
799 // type - "index" or "table".
800 // name - name of created element.
801 // tbl_name - name of element, or target table in case of index.
802 // rootpage - root page of the element in database file.
803 // sql - SQL to create the element.
804 // In general, the |sql| column is sufficient to derive the other columns.
805 // |rootpage| is not interesting for debugging, without the contents of the
806 // database. The COALESCE is because certain automatic elements will have a
807 // |name| but no |sql|,
808 const char* kSchemaSql = "SELECT COALESCE(sql, name) FROM sqlite_master";
809 rc = sqlite3_prepare_v2(db_, kSchemaSql, -1, &s, nullptr);
810 if (rc == SQLITE_OK) {
811 while ((rc = sqlite3_step(s)) == SQLITE_ROW) {
812 base::StringAppendF(&debug_info, "%s\n", sqlite3_column_text(s, 0));
813 }
814 if (rc != SQLITE_DONE)
815 base::StringAppendF(&debug_info, "error %d\n", rc);
816 sqlite3_finalize(s);
817 } else {
818 base::StringAppendF(&debug_info, "prepare error %d\n", rc);
819 }
820 }
821
822 return debug_info;
823}
824
825// TODO(shess): Since this is only called in an error situation, it might be
826// prudent to rewrite in terms of SQLite API calls, and mark the function const.
827std::string Connection::CollectCorruptionInfo() {
828 AssertIOAllowed();
829
830 // If the file cannot be accessed it is unlikely that an integrity check will
831 // turn up actionable information.
832 const base::FilePath db_path = DbPath();
avi0b519202015-12-21 07:25:19833 int64_t db_size = -1;
shessc8cd2a162015-10-22 20:30:46834 if (!base::GetFileSize(db_path, &db_size) || db_size < 0)
835 return std::string();
836
837 // Buffer for accumulating debugging info about the error. Place
838 // more-relevant information earlier, in case things overflow the
839 // fixed-size reporting buffer.
840 std::string debug_info;
841 base::StringAppendF(&debug_info, "SQLITE_CORRUPT, db size %" PRId64 "\n",
842 db_size);
843
844 // Only check files up to 8M to keep things from blocking too long.
avi0b519202015-12-21 07:25:19845 const int64_t kMaxIntegrityCheckSize = 8192 * 1024;
shessc8cd2a162015-10-22 20:30:46846 if (db_size > kMaxIntegrityCheckSize) {
847 debug_info += "integrity_check skipped due to size\n";
848 } else {
849 std::vector<std::string> messages;
850
851 // TODO(shess): FullIntegrityCheck() splits into a vector while this joins
852 // into a string. Probably should be refactored.
853 const base::TimeTicks before = base::TimeTicks::Now();
854 FullIntegrityCheck(&messages);
855 base::StringAppendF(
856 &debug_info,
857 "integrity_check %" PRId64 " ms, %" PRIuS " records:\n",
858 (base::TimeTicks::Now() - before).InMilliseconds(),
859 messages.size());
860
861 // SQLite returns up to 100 messages by default, trim deeper to
862 // keep close to the 2000-character size limit for dumping.
863 const size_t kMaxMessages = 20;
864 for (size_t i = 0; i < kMaxMessages && i < messages.size(); ++i) {
865 base::StringAppendF(&debug_info, "%s\n", messages[i].c_str());
866 }
867 }
868
869 return debug_info;
870}
871
shessd90aeea82015-11-13 02:24:31872size_t Connection::GetAppropriateMmapSize() {
873 AssertIOAllowed();
874
shessd90aeea82015-11-13 02:24:31875#if defined(OS_IOS)
876 // iOS SQLite does not support memory mapping.
877 return 0;
878#endif
879
shess9bf2c672015-12-18 01:18:08880 // How much to map if no errors are found. 50MB encompasses the 99th
881 // percentile of Chrome databases in the wild, so this should be good.
882 const size_t kMmapEverything = 256 * 1024 * 1024;
883
884 // If the database doesn't have a place to track progress, assume the best.
885 // This will happen when new databases are created, or if a database doesn't
886 // use a meta table. sql::MetaTable::Init() will preload kMmapSuccess.
887 // TODO(shess): Databases not using meta include:
888 // DOMStorageDatabase (localstorage)
889 // ActivityDatabase (extensions activity log)
890 // PredictorDatabase (prefetch and autocomplete predictor data)
891 // SyncDirectory (sync metadata storage)
892 // For now, these all have mmap disabled to allow other databases to get the
893 // default-enable path. sqlite-diag could be an alternative for all but
894 // DOMStorageDatabase, which creates many small databases.
895 // http://crbug.com/537742
896 if (!MetaTable::DoesTableExist(this)) {
shessd90aeea82015-11-13 02:24:31897 RecordOneEvent(EVENT_MMAP_META_MISSING);
shess9bf2c672015-12-18 01:18:08898 return kMmapEverything;
shessd90aeea82015-11-13 02:24:31899 }
900
shess9bf2c672015-12-18 01:18:08901 int64_t mmap_ofs = 0;
902 if (!MetaTable::GetMmapStatus(this, &mmap_ofs)) {
903 RecordOneEvent(EVENT_MMAP_META_FAILURE_READ);
904 return 0;
shessd90aeea82015-11-13 02:24:31905 }
906
907 // Database read failed in the past, don't memory map.
shess9bf2c672015-12-18 01:18:08908 if (mmap_ofs == MetaTable::kMmapFailure) {
shessd90aeea82015-11-13 02:24:31909 RecordOneEvent(EVENT_MMAP_FAILED);
910 return 0;
shess9bf2c672015-12-18 01:18:08911 } else if (mmap_ofs != MetaTable::kMmapSuccess) {
shessd90aeea82015-11-13 02:24:31912 // Continue reading from previous offset.
913 DCHECK_GE(mmap_ofs, 0);
914
915 // TODO(shess): Could this reading code be shared with Preload()? It would
916 // require locking twice (this code wouldn't be able to access |db_size| so
917 // the helper would have to return amount read).
918
919 // Read more of the database looking for errors. The VFS interface is used
920 // to assure that the reads are valid for SQLite. |g_reads_allowed| is used
921 // to limit checking to 20MB per run of Chromium.
922 sqlite3_file* file = NULL;
923 sqlite3_int64 db_size = 0;
924 if (SQLITE_OK != GetSqlite3FileAndSize(db_, &file, &db_size)) {
925 RecordOneEvent(EVENT_MMAP_VFS_FAILURE);
926 return 0;
927 }
928
929 // Read the data left, or |g_reads_allowed|, whichever is smaller.
930 // |g_reads_allowed| limits the total amount of I/O to spend verifying data
931 // in a single Chromium run.
932 sqlite3_int64 amount = db_size - mmap_ofs;
933 if (amount < 0)
934 amount = 0;
935 if (amount > 0) {
936 base::AutoLock lock(g_sqlite_init_lock.Get());
937 static sqlite3_int64 g_reads_allowed = 20 * 1024 * 1024;
938 if (g_reads_allowed < amount)
939 amount = g_reads_allowed;
940 g_reads_allowed -= amount;
941 }
942
943 // |amount| can be <= 0 if |g_reads_allowed| ran out of quota, or if the
944 // database was truncated after a previous pass.
945 if (amount <= 0 && mmap_ofs < db_size) {
946 DCHECK_EQ(0, amount);
947 RecordOneEvent(EVENT_MMAP_SUCCESS_NO_PROGRESS);
948 } else {
949 static const int kPageSize = 4096;
950 char buf[kPageSize];
951 while (amount > 0) {
952 int rc = file->pMethods->xRead(file, buf, sizeof(buf), mmap_ofs);
953 if (rc == SQLITE_OK) {
954 mmap_ofs += sizeof(buf);
955 amount -= sizeof(buf);
956 } else if (rc == SQLITE_IOERR_SHORT_READ) {
957 // Reached EOF for a database with page size < |kPageSize|.
958 mmap_ofs = db_size;
959 break;
960 } else {
961 // TODO(shess): Consider calling OnSqliteError().
shess9bf2c672015-12-18 01:18:08962 mmap_ofs = MetaTable::kMmapFailure;
shessd90aeea82015-11-13 02:24:31963 break;
964 }
965 }
966
967 // Log these events after update to distinguish meta update failure.
968 Events event;
969 if (mmap_ofs >= db_size) {
shess9bf2c672015-12-18 01:18:08970 mmap_ofs = MetaTable::kMmapSuccess;
shessd90aeea82015-11-13 02:24:31971 event = EVENT_MMAP_SUCCESS_NEW;
972 } else if (mmap_ofs > 0) {
973 event = EVENT_MMAP_SUCCESS_PARTIAL;
974 } else {
shess9bf2c672015-12-18 01:18:08975 DCHECK_EQ(MetaTable::kMmapFailure, mmap_ofs);
shessd90aeea82015-11-13 02:24:31976 event = EVENT_MMAP_FAILED_NEW;
977 }
978
shess9bf2c672015-12-18 01:18:08979 if (!MetaTable::SetMmapStatus(this, mmap_ofs)) {
shessd90aeea82015-11-13 02:24:31980 RecordOneEvent(EVENT_MMAP_META_FAILURE_UPDATE);
981 return 0;
982 }
983
984 RecordOneEvent(event);
985 }
986 }
987
shess9bf2c672015-12-18 01:18:08988 if (mmap_ofs == MetaTable::kMmapFailure)
shessd90aeea82015-11-13 02:24:31989 return 0;
shess9bf2c672015-12-18 01:18:08990 if (mmap_ofs == MetaTable::kMmapSuccess)
991 return kMmapEverything;
shessd90aeea82015-11-13 02:24:31992 return mmap_ofs;
993}
994
[email protected]be7995f12013-07-18 18:49:14995void Connection::TrimMemory(bool aggressively) {
996 if (!db_)
997 return;
998
999 // TODO(shess): investigate using sqlite3_db_release_memory() when possible.
1000 int original_cache_size;
1001 {
1002 Statement sql_get_original(GetUniqueStatement("PRAGMA cache_size"));
1003 if (!sql_get_original.Step()) {
1004 DLOG(WARNING) << "Could not get cache size " << GetErrorMessage();
1005 return;
1006 }
1007 original_cache_size = sql_get_original.ColumnInt(0);
1008 }
1009 int shrink_cache_size = aggressively ? 1 : (original_cache_size / 2);
1010
1011 // Force sqlite to try to reduce page cache usage.
1012 const std::string sql_shrink =
1013 base::StringPrintf("PRAGMA cache_size=%d", shrink_cache_size);
1014 if (!Execute(sql_shrink.c_str()))
1015 DLOG(WARNING) << "Could not shrink cache size: " << GetErrorMessage();
1016
1017 // Restore cache size.
1018 const std::string sql_restore =
1019 base::StringPrintf("PRAGMA cache_size=%d", original_cache_size);
1020 if (!Execute(sql_restore.c_str()))
1021 DLOG(WARNING) << "Could not restore cache size: " << GetErrorMessage();
1022}
1023
[email protected]8e0c01282012-04-06 19:36:491024// Create an in-memory database with the existing database's page
1025// size, then backup that database over the existing database.
1026bool Connection::Raze() {
[email protected]35f7e5392012-07-27 19:54:501027 AssertIOAllowed();
1028
[email protected]8e0c01282012-04-06 19:36:491029 if (!db_) {
[email protected]41a97c812013-02-07 02:35:381030 DLOG_IF(FATAL, !poisoned_) << "Cannot raze null db";
[email protected]8e0c01282012-04-06 19:36:491031 return false;
1032 }
1033
1034 if (transaction_nesting_ > 0) {
1035 DLOG(FATAL) << "Cannot raze within a transaction";
1036 return false;
1037 }
1038
1039 sql::Connection null_db;
1040 if (!null_db.OpenInMemory()) {
1041 DLOG(FATAL) << "Unable to open in-memory database.";
1042 return false;
1043 }
1044
[email protected]6d42f152012-11-10 00:38:241045 if (page_size_) {
1046 // Enforce SQLite restrictions on |page_size_|.
1047 DCHECK(!(page_size_ & (page_size_ - 1)))
1048 << " page_size_ " << page_size_ << " is not a power of two.";
1049 const int kSqliteMaxPageSize = 32768; // from sqliteLimit.h
1050 DCHECK_LE(page_size_, kSqliteMaxPageSize);
[email protected]7d3cbc92013-03-18 22:33:041051 const std::string sql =
1052 base::StringPrintf("PRAGMA page_size=%d", page_size_);
[email protected]69c58452012-08-06 19:22:421053 if (!null_db.Execute(sql.c_str()))
1054 return false;
1055 }
1056
[email protected]6d42f152012-11-10 00:38:241057#if defined(OS_ANDROID)
1058 // Android compiles with SQLITE_DEFAULT_AUTOVACUUM. Unfortunately,
1059 // in-memory databases do not respect this define.
1060 // TODO(shess): Figure out a way to set this without using platform
1061 // specific code. AFAICT from sqlite3.c, the only way to do it
1062 // would be to create an actual filesystem database, which is
1063 // unfortunate.
1064 if (!null_db.Execute("PRAGMA auto_vacuum = 1"))
1065 return false;
1066#endif
[email protected]8e0c01282012-04-06 19:36:491067
1068 // The page size doesn't take effect until a database has pages, and
1069 // at this point the null database has none. Changing the schema
1070 // version will create the first page. This will not affect the
1071 // schema version in the resulting database, as SQLite's backup
1072 // implementation propagates the schema version from the original
1073 // connection to the new version of the database, incremented by one
1074 // so that other readers see the schema change and act accordingly.
1075 if (!null_db.Execute("PRAGMA schema_version = 1"))
1076 return false;
1077
[email protected]6d42f152012-11-10 00:38:241078 // SQLite tracks the expected number of database pages in the first
1079 // page, and if it does not match the total retrieved from a
1080 // filesystem call, treats the database as corrupt. This situation
1081 // breaks almost all SQLite calls. "PRAGMA writable_schema" can be
1082 // used to hint to SQLite to soldier on in that case, specifically
1083 // for purposes of recovery. [See SQLITE_CORRUPT_BKPT case in
1084 // sqlite3.c lockBtree().]
1085 // TODO(shess): With this, "PRAGMA auto_vacuum" and "PRAGMA
1086 // page_size" can be used to query such a database.
1087 ScopedWritableSchema writable_schema(db_);
1088
[email protected]7bae5742013-07-10 20:46:161089 const char* kMain = "main";
1090 int rc = BackupDatabase(null_db.db_, db_, kMain);
1091 UMA_HISTOGRAM_SPARSE_SLOWLY("Sqlite.RazeDatabase",rc);
[email protected]8e0c01282012-04-06 19:36:491092
1093 // The destination database was locked.
1094 if (rc == SQLITE_BUSY) {
1095 return false;
1096 }
1097
[email protected]7bae5742013-07-10 20:46:161098 // SQLITE_NOTADB can happen if page 1 of db_ exists, but is not
1099 // formatted correctly. SQLITE_IOERR_SHORT_READ can happen if db_
1100 // isn't even big enough for one page. Either way, reach in and
1101 // truncate it before trying again.
1102 // TODO(shess): Maybe it would be worthwhile to just truncate from
1103 // the get-go?
1104 if (rc == SQLITE_NOTADB || rc == SQLITE_IOERR_SHORT_READ) {
1105 sqlite3_file* file = NULL;
[email protected]8ada10f2013-12-21 00:42:341106 rc = GetSqlite3File(db_, &file);
[email protected]7bae5742013-07-10 20:46:161107 if (rc != SQLITE_OK) {
1108 DLOG(FATAL) << "Failure getting file handle.";
1109 return false;
[email protected]7bae5742013-07-10 20:46:161110 }
1111
1112 rc = file->pMethods->xTruncate(file, 0);
1113 if (rc != SQLITE_OK) {
1114 UMA_HISTOGRAM_SPARSE_SLOWLY("Sqlite.RazeDatabaseTruncate",rc);
1115 DLOG(FATAL) << "Failed to truncate file.";
1116 return false;
1117 }
1118
1119 rc = BackupDatabase(null_db.db_, db_, kMain);
1120 UMA_HISTOGRAM_SPARSE_SLOWLY("Sqlite.RazeDatabase2",rc);
1121
1122 if (rc != SQLITE_DONE) {
1123 DLOG(FATAL) << "Failed retrying Raze().";
1124 }
1125 }
1126
[email protected]8e0c01282012-04-06 19:36:491127 // The entire database should have been backed up.
1128 if (rc != SQLITE_DONE) {
[email protected]7bae5742013-07-10 20:46:161129 // TODO(shess): Figure out which other cases can happen.
[email protected]8e0c01282012-04-06 19:36:491130 DLOG(FATAL) << "Unable to copy entire null database.";
1131 return false;
1132 }
1133
[email protected]8e0c01282012-04-06 19:36:491134 return true;
1135}
1136
1137bool Connection::RazeWithTimout(base::TimeDelta timeout) {
1138 if (!db_) {
[email protected]41a97c812013-02-07 02:35:381139 DLOG_IF(FATAL, !poisoned_) << "Cannot raze null db";
[email protected]8e0c01282012-04-06 19:36:491140 return false;
1141 }
1142
1143 ScopedBusyTimeout busy_timeout(db_);
1144 busy_timeout.SetTimeout(timeout);
1145 return Raze();
1146}
1147
[email protected]41a97c812013-02-07 02:35:381148bool Connection::RazeAndClose() {
1149 if (!db_) {
1150 DLOG_IF(FATAL, !poisoned_) << "Cannot raze null db";
1151 return false;
1152 }
1153
1154 // Raze() cannot run in a transaction.
[email protected]8d409412013-07-19 18:25:301155 RollbackAllTransactions();
[email protected]41a97c812013-02-07 02:35:381156
1157 bool result = Raze();
1158
1159 CloseInternal(true);
1160
1161 // Mark the database so that future API calls fail appropriately,
1162 // but don't DCHECK (because after calling this function they are
1163 // expected to fail).
1164 poisoned_ = true;
1165
1166 return result;
1167}
1168
[email protected]8d409412013-07-19 18:25:301169void Connection::Poison() {
1170 if (!db_) {
1171 DLOG_IF(FATAL, !poisoned_) << "Cannot poison null db";
1172 return;
1173 }
1174
1175 RollbackAllTransactions();
1176 CloseInternal(true);
1177
1178 // Mark the database so that future API calls fail appropriately,
1179 // but don't DCHECK (because after calling this function they are
1180 // expected to fail).
1181 poisoned_ = true;
1182}
1183
[email protected]8d2e39e2013-06-24 05:55:081184// TODO(shess): To the extent possible, figure out the optimal
1185// ordering for these deletes which will prevent other connections
1186// from seeing odd behavior. For instance, it may be necessary to
1187// manually lock the main database file in a SQLite-compatible fashion
1188// (to prevent other processes from opening it), then delete the
1189// journal files, then delete the main database file. Another option
1190// might be to lock the main database file and poison the header with
1191// junk to prevent other processes from opening it successfully (like
1192// Gears "SQLite poison 3" trick).
1193//
1194// static
1195bool Connection::Delete(const base::FilePath& path) {
1196 base::ThreadRestrictions::AssertIOAllowed();
1197
1198 base::FilePath journal_path(path.value() + FILE_PATH_LITERAL("-journal"));
1199 base::FilePath wal_path(path.value() + FILE_PATH_LITERAL("-wal"));
1200
erg102ceb412015-06-20 01:38:131201 std::string journal_str = AsUTF8ForSQL(journal_path);
1202 std::string wal_str = AsUTF8ForSQL(wal_path);
1203 std::string path_str = AsUTF8ForSQL(path);
[email protected]8d2e39e2013-06-24 05:55:081204
shess702467622015-09-16 19:04:551205 // Make sure sqlite3_initialize() is called before anything else.
1206 InitializeSqlite();
1207
erg102ceb412015-06-20 01:38:131208 sqlite3_vfs* vfs = sqlite3_vfs_find(NULL);
1209 CHECK(vfs);
1210 CHECK(vfs->xDelete);
1211 CHECK(vfs->xAccess);
1212
1213 // We only work with unix, win32 and mojo filesystems. If you're trying to
1214 // use this code with any other VFS, you're not in a good place.
1215 CHECK(strncmp(vfs->zName, "unix", 4) == 0 ||
1216 strncmp(vfs->zName, "win32", 5) == 0 ||
1217 strcmp(vfs->zName, "mojo") == 0);
1218
1219 vfs->xDelete(vfs, journal_str.c_str(), 0);
1220 vfs->xDelete(vfs, wal_str.c_str(), 0);
1221 vfs->xDelete(vfs, path_str.c_str(), 0);
1222
1223 int journal_exists = 0;
1224 vfs->xAccess(vfs, journal_str.c_str(), SQLITE_ACCESS_EXISTS,
1225 &journal_exists);
1226
1227 int wal_exists = 0;
1228 vfs->xAccess(vfs, wal_str.c_str(), SQLITE_ACCESS_EXISTS,
1229 &wal_exists);
1230
1231 int path_exists = 0;
1232 vfs->xAccess(vfs, path_str.c_str(), SQLITE_ACCESS_EXISTS,
1233 &path_exists);
1234
1235 return !journal_exists && !wal_exists && !path_exists;
[email protected]8d2e39e2013-06-24 05:55:081236}
1237
[email protected]e5ffd0e42009-09-11 21:30:561238bool Connection::BeginTransaction() {
1239 if (needs_rollback_) {
[email protected]88563f62011-03-13 22:13:331240 DCHECK_GT(transaction_nesting_, 0);
[email protected]e5ffd0e42009-09-11 21:30:561241
1242 // When we're going to rollback, fail on this begin and don't actually
1243 // mark us as entering the nested transaction.
1244 return false;
1245 }
1246
1247 bool success = true;
1248 if (!transaction_nesting_) {
1249 needs_rollback_ = false;
1250
1251 Statement begin(GetCachedStatement(SQL_FROM_HERE, "BEGIN TRANSACTION"));
shess58b8df82015-06-03 00:19:321252 RecordOneEvent(EVENT_BEGIN);
[email protected]eff1fa522011-12-12 23:50:591253 if (!begin.Run())
[email protected]e5ffd0e42009-09-11 21:30:561254 return false;
1255 }
1256 transaction_nesting_++;
1257 return success;
1258}
1259
1260void Connection::RollbackTransaction() {
1261 if (!transaction_nesting_) {
[email protected]41a97c812013-02-07 02:35:381262 DLOG_IF(FATAL, !poisoned_) << "Rolling back a nonexistent transaction";
[email protected]e5ffd0e42009-09-11 21:30:561263 return;
1264 }
1265
1266 transaction_nesting_--;
1267
1268 if (transaction_nesting_ > 0) {
1269 // Mark the outermost transaction as needing rollback.
1270 needs_rollback_ = true;
1271 return;
1272 }
1273
1274 DoRollback();
1275}
1276
1277bool Connection::CommitTransaction() {
1278 if (!transaction_nesting_) {
shess90244e12015-11-09 22:08:181279 DLOG_IF(FATAL, !poisoned_) << "Committing a nonexistent transaction";
[email protected]e5ffd0e42009-09-11 21:30:561280 return false;
1281 }
1282 transaction_nesting_--;
1283
1284 if (transaction_nesting_ > 0) {
1285 // Mark any nested transactions as failing after we've already got one.
1286 return !needs_rollback_;
1287 }
1288
1289 if (needs_rollback_) {
1290 DoRollback();
1291 return false;
1292 }
1293
1294 Statement commit(GetCachedStatement(SQL_FROM_HERE, "COMMIT"));
shess58b8df82015-06-03 00:19:321295
1296 // Collect the commit time manually, sql::Statement would register it as query
1297 // time only.
1298 const base::TimeTicks before = Now();
1299 bool ret = commit.RunWithoutTimers();
1300 const base::TimeDelta delta = Now() - before;
1301
1302 RecordCommitTime(delta);
1303 RecordOneEvent(EVENT_COMMIT);
1304
shess7dbd4dee2015-10-06 17:39:161305 // Release dirty cache pages after the transaction closes.
1306 ReleaseCacheMemoryIfNeeded(false);
1307
shess58b8df82015-06-03 00:19:321308 return ret;
[email protected]e5ffd0e42009-09-11 21:30:561309}
1310
[email protected]8d409412013-07-19 18:25:301311void Connection::RollbackAllTransactions() {
1312 if (transaction_nesting_ > 0) {
1313 transaction_nesting_ = 0;
1314 DoRollback();
1315 }
1316}
1317
1318bool Connection::AttachDatabase(const base::FilePath& other_db_path,
1319 const char* attachment_point) {
1320 DCHECK(ValidAttachmentPoint(attachment_point));
1321
1322 Statement s(GetUniqueStatement("ATTACH DATABASE ? AS ?"));
1323#if OS_WIN
1324 s.BindString16(0, other_db_path.value());
1325#else
1326 s.BindString(0, other_db_path.value());
1327#endif
1328 s.BindString(1, attachment_point);
1329 return s.Run();
1330}
1331
1332bool Connection::DetachDatabase(const char* attachment_point) {
1333 DCHECK(ValidAttachmentPoint(attachment_point));
1334
1335 Statement s(GetUniqueStatement("DETACH DATABASE ?"));
1336 s.BindString(0, attachment_point);
1337 return s.Run();
1338}
1339
shess58b8df82015-06-03 00:19:321340// TODO(shess): Consider changing this to execute exactly one statement. If a
1341// caller wishes to execute multiple statements, that should be explicit, and
1342// perhaps tucked into an explicit transaction with rollback in case of error.
[email protected]eff1fa522011-12-12 23:50:591343int Connection::ExecuteAndReturnErrorCode(const char* sql) {
[email protected]35f7e5392012-07-27 19:54:501344 AssertIOAllowed();
[email protected]41a97c812013-02-07 02:35:381345 if (!db_) {
1346 DLOG_IF(FATAL, !poisoned_) << "Illegal use of connection without a db";
1347 return SQLITE_ERROR;
1348 }
shess58b8df82015-06-03 00:19:321349 DCHECK(sql);
1350
1351 RecordOneEvent(EVENT_EXECUTE);
1352 int rc = SQLITE_OK;
1353 while ((rc == SQLITE_OK) && *sql) {
1354 sqlite3_stmt *stmt = NULL;
1355 const char *leftover_sql;
1356
1357 const base::TimeTicks before = Now();
1358 rc = sqlite3_prepare_v2(db_, sql, -1, &stmt, &leftover_sql);
1359 sql = leftover_sql;
1360
1361 // Stop if an error is encountered.
1362 if (rc != SQLITE_OK)
1363 break;
1364
1365 // This happens if |sql| originally only contained comments or whitespace.
1366 // TODO(shess): Audit to see if this can become a DCHECK(). Having
1367 // extraneous comments and whitespace in the SQL statements increases
1368 // runtime cost and can easily be shifted out to the C++ layer.
1369 if (!stmt)
1370 continue;
1371
1372 // Save for use after statement is finalized.
1373 const bool read_only = !!sqlite3_stmt_readonly(stmt);
1374
1375 RecordOneEvent(Connection::EVENT_STATEMENT_RUN);
1376 while ((rc = sqlite3_step(stmt)) == SQLITE_ROW) {
1377 // TODO(shess): Audit to see if this can become a DCHECK. I think PRAGMA
1378 // is the only legitimate case for this.
1379 RecordOneEvent(Connection::EVENT_STATEMENT_ROWS);
1380 }
1381
1382 // sqlite3_finalize() returns SQLITE_OK if the most recent sqlite3_step()
1383 // returned SQLITE_DONE or SQLITE_ROW, otherwise the error code.
1384 rc = sqlite3_finalize(stmt);
1385 if (rc == SQLITE_OK)
1386 RecordOneEvent(Connection::EVENT_STATEMENT_SUCCESS);
1387
1388 // sqlite3_exec() does this, presumably to avoid spinning the parser for
1389 // trailing whitespace.
1390 // TODO(shess): Audit to see if this can become a DCHECK.
brettwb3413062015-06-24 00:39:021391 while (base::IsAsciiWhitespace(*sql)) {
shess58b8df82015-06-03 00:19:321392 sql++;
1393 }
1394
1395 const base::TimeDelta delta = Now() - before;
1396 RecordTimeAndChanges(delta, read_only);
1397 }
shess7dbd4dee2015-10-06 17:39:161398
1399 // Most calls to Execute() modify the database. The main exceptions would be
1400 // calls such as CREATE TABLE IF NOT EXISTS which could modify the database
1401 // but sometimes don't.
1402 ReleaseCacheMemoryIfNeeded(true);
1403
shess58b8df82015-06-03 00:19:321404 return rc;
[email protected]eff1fa522011-12-12 23:50:591405}
1406
1407bool Connection::Execute(const char* sql) {
[email protected]41a97c812013-02-07 02:35:381408 if (!db_) {
1409 DLOG_IF(FATAL, !poisoned_) << "Illegal use of connection without a db";
1410 return false;
1411 }
1412
[email protected]eff1fa522011-12-12 23:50:591413 int error = ExecuteAndReturnErrorCode(sql);
[email protected]473ad792012-11-10 00:55:001414 if (error != SQLITE_OK)
[email protected]2f496b42013-09-26 18:36:581415 error = OnSqliteError(error, NULL, sql);
[email protected]473ad792012-11-10 00:55:001416
[email protected]28fe0ff2012-02-25 00:40:331417 // This needs to be a FATAL log because the error case of arriving here is
1418 // that there's a malformed SQL statement. This can arise in development if
[email protected]4350e322013-06-18 22:18:101419 // a change alters the schema but not all queries adjust. This can happen
1420 // in production if the schema is corrupted.
[email protected]eff1fa522011-12-12 23:50:591421 if (error == SQLITE_ERROR)
[email protected]28fe0ff2012-02-25 00:40:331422 DLOG(FATAL) << "SQL Error in " << sql << ", " << GetErrorMessage();
[email protected]eff1fa522011-12-12 23:50:591423 return error == SQLITE_OK;
[email protected]e5ffd0e42009-09-11 21:30:561424}
1425
[email protected]5b96f3772010-09-28 16:30:571426bool Connection::ExecuteWithTimeout(const char* sql, base::TimeDelta timeout) {
[email protected]41a97c812013-02-07 02:35:381427 if (!db_) {
1428 DLOG_IF(FATAL, !poisoned_) << "Illegal use of connection without a db";
[email protected]5b96f3772010-09-28 16:30:571429 return false;
[email protected]41a97c812013-02-07 02:35:381430 }
[email protected]5b96f3772010-09-28 16:30:571431
1432 ScopedBusyTimeout busy_timeout(db_);
1433 busy_timeout.SetTimeout(timeout);
[email protected]eff1fa522011-12-12 23:50:591434 return Execute(sql);
[email protected]5b96f3772010-09-28 16:30:571435}
1436
[email protected]e5ffd0e42009-09-11 21:30:561437bool Connection::HasCachedStatement(const StatementID& id) const {
1438 return statement_cache_.find(id) != statement_cache_.end();
1439}
1440
1441scoped_refptr<Connection::StatementRef> Connection::GetCachedStatement(
1442 const StatementID& id,
1443 const char* sql) {
1444 CachedStatementMap::iterator i = statement_cache_.find(id);
1445 if (i != statement_cache_.end()) {
1446 // Statement is in the cache. It should still be active (we're the only
1447 // one invalidating cached statements, and we'll remove it from the cache
1448 // if we do that. Make sure we reset it before giving out the cached one in
1449 // case it still has some stuff bound.
1450 DCHECK(i->second->is_valid());
1451 sqlite3_reset(i->second->stmt());
1452 return i->second;
1453 }
1454
1455 scoped_refptr<StatementRef> statement = GetUniqueStatement(sql);
1456 if (statement->is_valid())
1457 statement_cache_[id] = statement; // Only cache valid statements.
1458 return statement;
1459}
1460
1461scoped_refptr<Connection::StatementRef> Connection::GetUniqueStatement(
1462 const char* sql) {
[email protected]35f7e5392012-07-27 19:54:501463 AssertIOAllowed();
1464
[email protected]41a97c812013-02-07 02:35:381465 // Return inactive statement.
[email protected]e5ffd0e42009-09-11 21:30:561466 if (!db_)
[email protected]41a97c812013-02-07 02:35:381467 return new StatementRef(NULL, NULL, poisoned_);
[email protected]e5ffd0e42009-09-11 21:30:561468
1469 sqlite3_stmt* stmt = NULL;
[email protected]473ad792012-11-10 00:55:001470 int rc = sqlite3_prepare_v2(db_, sql, -1, &stmt, NULL);
1471 if (rc != SQLITE_OK) {
[email protected]eff1fa522011-12-12 23:50:591472 // This is evidence of a syntax error in the incoming SQL.
shessf7e988f2015-11-13 00:41:061473 if (!ShouldIgnoreSqliteCompileError(rc))
shess193bfb622015-04-10 22:30:021474 DLOG(FATAL) << "SQL compile error " << GetErrorMessage();
[email protected]473ad792012-11-10 00:55:001475
1476 // It could also be database corruption.
[email protected]2f496b42013-09-26 18:36:581477 OnSqliteError(rc, NULL, sql);
[email protected]41a97c812013-02-07 02:35:381478 return new StatementRef(NULL, NULL, false);
[email protected]e5ffd0e42009-09-11 21:30:561479 }
[email protected]41a97c812013-02-07 02:35:381480 return new StatementRef(this, stmt, true);
[email protected]e5ffd0e42009-09-11 21:30:561481}
1482
shessf7e988f2015-11-13 00:41:061483// TODO(shess): Unify this with GetUniqueStatement(). The only difference that
1484// seems legitimate is not passing |this| to StatementRef.
[email protected]2eec0a22012-07-24 01:59:581485scoped_refptr<Connection::StatementRef> Connection::GetUntrackedStatement(
1486 const char* sql) const {
[email protected]41a97c812013-02-07 02:35:381487 // Return inactive statement.
[email protected]2eec0a22012-07-24 01:59:581488 if (!db_)
[email protected]41a97c812013-02-07 02:35:381489 return new StatementRef(NULL, NULL, poisoned_);
[email protected]2eec0a22012-07-24 01:59:581490
1491 sqlite3_stmt* stmt = NULL;
1492 int rc = sqlite3_prepare_v2(db_, sql, -1, &stmt, NULL);
1493 if (rc != SQLITE_OK) {
1494 // This is evidence of a syntax error in the incoming SQL.
shessf7e988f2015-11-13 00:41:061495 if (!ShouldIgnoreSqliteCompileError(rc))
shess193bfb622015-04-10 22:30:021496 DLOG(FATAL) << "SQL compile error " << GetErrorMessage();
[email protected]41a97c812013-02-07 02:35:381497 return new StatementRef(NULL, NULL, false);
[email protected]2eec0a22012-07-24 01:59:581498 }
[email protected]41a97c812013-02-07 02:35:381499 return new StatementRef(NULL, stmt, true);
[email protected]2eec0a22012-07-24 01:59:581500}
1501
[email protected]92cd00a2013-08-16 11:09:581502std::string Connection::GetSchema() const {
1503 // The ORDER BY should not be necessary, but relying on organic
1504 // order for something like this is questionable.
1505 const char* kSql =
1506 "SELECT type, name, tbl_name, sql "
1507 "FROM sqlite_master ORDER BY 1, 2, 3, 4";
1508 Statement statement(GetUntrackedStatement(kSql));
1509
1510 std::string schema;
1511 while (statement.Step()) {
1512 schema += statement.ColumnString(0);
1513 schema += '|';
1514 schema += statement.ColumnString(1);
1515 schema += '|';
1516 schema += statement.ColumnString(2);
1517 schema += '|';
1518 schema += statement.ColumnString(3);
1519 schema += '\n';
1520 }
1521
1522 return schema;
1523}
1524
[email protected]eff1fa522011-12-12 23:50:591525bool Connection::IsSQLValid(const char* sql) {
[email protected]35f7e5392012-07-27 19:54:501526 AssertIOAllowed();
[email protected]41a97c812013-02-07 02:35:381527 if (!db_) {
1528 DLOG_IF(FATAL, !poisoned_) << "Illegal use of connection without a db";
1529 return false;
1530 }
1531
[email protected]eff1fa522011-12-12 23:50:591532 sqlite3_stmt* stmt = NULL;
1533 if (sqlite3_prepare_v2(db_, sql, -1, &stmt, NULL) != SQLITE_OK)
1534 return false;
1535
1536 sqlite3_finalize(stmt);
1537 return true;
1538}
1539
[email protected]1ed78a32009-09-15 20:24:171540bool Connection::DoesTableExist(const char* table_name) const {
[email protected]e2cadec82011-12-13 02:00:531541 return DoesTableOrIndexExist(table_name, "table");
1542}
1543
1544bool Connection::DoesIndexExist(const char* index_name) const {
1545 return DoesTableOrIndexExist(index_name, "index");
1546}
1547
1548bool Connection::DoesTableOrIndexExist(
1549 const char* name, const char* type) const {
shess92a2ab12015-04-09 01:59:471550 const char* kSql =
1551 "SELECT name FROM sqlite_master WHERE type=? AND name=? COLLATE NOCASE";
[email protected]2eec0a22012-07-24 01:59:581552 Statement statement(GetUntrackedStatement(kSql));
shess92a2ab12015-04-09 01:59:471553
1554 // This can happen if the database is corrupt and the error is being ignored
1555 // for testing purposes.
1556 if (!statement.is_valid())
1557 return false;
1558
[email protected]e2cadec82011-12-13 02:00:531559 statement.BindString(0, type);
1560 statement.BindString(1, name);
[email protected]28fe0ff2012-02-25 00:40:331561
[email protected]e5ffd0e42009-09-11 21:30:561562 return statement.Step(); // Table exists if any row was returned.
1563}
1564
1565bool Connection::DoesColumnExist(const char* table_name,
[email protected]1ed78a32009-09-15 20:24:171566 const char* column_name) const {
[email protected]e5ffd0e42009-09-11 21:30:561567 std::string sql("PRAGMA TABLE_INFO(");
1568 sql.append(table_name);
1569 sql.append(")");
1570
[email protected]2eec0a22012-07-24 01:59:581571 Statement statement(GetUntrackedStatement(sql.c_str()));
shess92a2ab12015-04-09 01:59:471572
1573 // This can happen if the database is corrupt and the error is being ignored
1574 // for testing purposes.
1575 if (!statement.is_valid())
1576 return false;
1577
[email protected]e5ffd0e42009-09-11 21:30:561578 while (statement.Step()) {
brettw8a800902015-07-10 18:28:331579 if (base::EqualsCaseInsensitiveASCII(statement.ColumnString(1),
1580 column_name))
[email protected]e5ffd0e42009-09-11 21:30:561581 return true;
1582 }
1583 return false;
1584}
1585
tfarina720d4f32015-05-11 22:31:261586int64_t Connection::GetLastInsertRowId() const {
[email protected]e5ffd0e42009-09-11 21:30:561587 if (!db_) {
[email protected]41a97c812013-02-07 02:35:381588 DLOG_IF(FATAL, !poisoned_) << "Illegal use of connection without a db";
[email protected]e5ffd0e42009-09-11 21:30:561589 return 0;
1590 }
1591 return sqlite3_last_insert_rowid(db_);
1592}
1593
[email protected]1ed78a32009-09-15 20:24:171594int Connection::GetLastChangeCount() const {
1595 if (!db_) {
[email protected]41a97c812013-02-07 02:35:381596 DLOG_IF(FATAL, !poisoned_) << "Illegal use of connection without a db";
[email protected]1ed78a32009-09-15 20:24:171597 return 0;
1598 }
1599 return sqlite3_changes(db_);
1600}
1601
[email protected]e5ffd0e42009-09-11 21:30:561602int Connection::GetErrorCode() const {
1603 if (!db_)
1604 return SQLITE_ERROR;
1605 return sqlite3_errcode(db_);
1606}
1607
[email protected]767718e52010-09-21 23:18:491608int Connection::GetLastErrno() const {
1609 if (!db_)
1610 return -1;
1611
1612 int err = 0;
1613 if (SQLITE_OK != sqlite3_file_control(db_, NULL, SQLITE_LAST_ERRNO, &err))
1614 return -2;
1615
1616 return err;
1617}
1618
[email protected]e5ffd0e42009-09-11 21:30:561619const char* Connection::GetErrorMessage() const {
1620 if (!db_)
1621 return "sql::Connection has no connection.";
1622 return sqlite3_errmsg(db_);
1623}
1624
[email protected]fed734a2013-07-17 04:45:131625bool Connection::OpenInternal(const std::string& file_name,
1626 Connection::Retry retry_flag) {
[email protected]35f7e5392012-07-27 19:54:501627 AssertIOAllowed();
1628
[email protected]9cfbc922009-11-17 20:13:171629 if (db_) {
[email protected]eff1fa522011-12-12 23:50:591630 DLOG(FATAL) << "sql::Connection is already open.";
[email protected]9cfbc922009-11-17 20:13:171631 return false;
1632 }
1633
[email protected]a7ec1292013-07-22 22:02:181634 // Make sure sqlite3_initialize() is called before anything else.
1635 InitializeSqlite();
1636
shess58b8df82015-06-03 00:19:321637 // Setup the stats histograms immediately rather than allocating lazily.
1638 // Connections which won't exercise all of these probably shouldn't exist.
1639 if (!histogram_tag_.empty()) {
1640 stats_histogram_ =
1641 base::LinearHistogram::FactoryGet(
1642 "Sqlite.Stats." + histogram_tag_,
1643 1, EVENT_MAX_VALUE, EVENT_MAX_VALUE + 1,
1644 base::HistogramBase::kUmaTargetedHistogramFlag);
1645
1646 // The timer setup matches UMA_HISTOGRAM_MEDIUM_TIMES(). 3 minutes is an
1647 // unreasonable time for any single operation, so there is not much value to
1648 // knowing if it was 3 minutes or 5 minutes. In reality at that point
1649 // things are entirely busted.
1650 commit_time_histogram_ =
1651 GetMediumTimeHistogram("Sqlite.CommitTime." + histogram_tag_);
1652
1653 autocommit_time_histogram_ =
1654 GetMediumTimeHistogram("Sqlite.AutoCommitTime." + histogram_tag_);
1655
1656 update_time_histogram_ =
1657 GetMediumTimeHistogram("Sqlite.UpdateTime." + histogram_tag_);
1658
1659 query_time_histogram_ =
1660 GetMediumTimeHistogram("Sqlite.QueryTime." + histogram_tag_);
1661 }
1662
[email protected]41a97c812013-02-07 02:35:381663 // If |poisoned_| is set, it means an error handler called
1664 // RazeAndClose(). Until regular Close() is called, the caller
1665 // should be treating the database as open, but is_open() currently
1666 // only considers the sqlite3 handle's state.
1667 // TODO(shess): Revise is_open() to consider poisoned_, and review
1668 // to see if any non-testing code even depends on it.
1669 DLOG_IF(FATAL, poisoned_) << "sql::Connection is already open.";
[email protected]7bae5742013-07-10 20:46:161670 poisoned_ = false;
[email protected]41a97c812013-02-07 02:35:381671
[email protected]765b44502009-10-02 05:01:421672 int err = sqlite3_open(file_name.c_str(), &db_);
1673 if (err != SQLITE_OK) {
[email protected]73fb8d52013-07-24 05:04:281674 // Extended error codes cannot be enabled until a handle is
1675 // available, fetch manually.
1676 err = sqlite3_extended_errcode(db_);
1677
[email protected]bd2ccdb4a2012-12-07 22:14:501678 // Histogram failures specific to initial open for debugging
1679 // purposes.
[email protected]73fb8d52013-07-24 05:04:281680 UMA_HISTOGRAM_SPARSE_SLOWLY("Sqlite.OpenFailure", err);
[email protected]bd2ccdb4a2012-12-07 22:14:501681
[email protected]2f496b42013-09-26 18:36:581682 OnSqliteError(err, NULL, "-- sqlite3_open()");
[email protected]fed734a2013-07-17 04:45:131683 bool was_poisoned = poisoned_;
[email protected]64021042012-02-10 20:02:291684 Close();
[email protected]fed734a2013-07-17 04:45:131685
1686 if (was_poisoned && retry_flag == RETRY_ON_POISON)
1687 return OpenInternal(file_name, NO_RETRY);
[email protected]765b44502009-10-02 05:01:421688 return false;
1689 }
1690
[email protected]81a2a602013-07-17 19:10:361691 // TODO(shess): OS_WIN support?
1692#if defined(OS_POSIX)
1693 if (restrict_to_user_) {
1694 DCHECK_NE(file_name, std::string(":memory"));
1695 base::FilePath file_path(file_name);
1696 int mode = 0;
1697 // TODO(shess): Arguably, failure to retrieve and change
1698 // permissions should be fatal if the file exists.
[email protected]b264eab2013-11-27 23:22:081699 if (base::GetPosixFilePermissions(file_path, &mode)) {
1700 mode &= base::FILE_PERMISSION_USER_MASK;
1701 base::SetPosixFilePermissions(file_path, mode);
[email protected]81a2a602013-07-17 19:10:361702
1703 // SQLite sets the permissions on these files from the main
1704 // database on create. Set them here in case they already exist
1705 // at this point. Failure to set these permissions should not
1706 // be fatal unless the file doesn't exist.
1707 base::FilePath journal_path(file_name + FILE_PATH_LITERAL("-journal"));
1708 base::FilePath wal_path(file_name + FILE_PATH_LITERAL("-wal"));
[email protected]b264eab2013-11-27 23:22:081709 base::SetPosixFilePermissions(journal_path, mode);
1710 base::SetPosixFilePermissions(wal_path, mode);
[email protected]81a2a602013-07-17 19:10:361711 }
1712 }
1713#endif // defined(OS_POSIX)
1714
[email protected]affa2da2013-06-06 22:20:341715 // SQLite uses a lookaside buffer to improve performance of small mallocs.
1716 // Chromium already depends on small mallocs being efficient, so we disable
1717 // this to avoid the extra memory overhead.
1718 // This must be called immediatly after opening the database before any SQL
1719 // statements are run.
1720 sqlite3_db_config(db_, SQLITE_DBCONFIG_LOOKASIDE, NULL, 0, 0);
1721
[email protected]73fb8d52013-07-24 05:04:281722 // Enable extended result codes to provide more color on I/O errors.
1723 // Not having extended result codes is not a fatal problem, as
1724 // Chromium code does not attempt to handle I/O errors anyhow. The
1725 // current implementation always returns SQLITE_OK, the DCHECK is to
1726 // quickly notify someone if SQLite changes.
1727 err = sqlite3_extended_result_codes(db_, 1);
1728 DCHECK_EQ(err, SQLITE_OK) << "Could not enable extended result codes";
1729
[email protected]bd2ccdb4a2012-12-07 22:14:501730 // sqlite3_open() does not actually read the database file (unless a
1731 // hot journal is found). Successfully executing this pragma on an
1732 // existing database requires a valid header on page 1.
1733 // TODO(shess): For now, just probing to see what the lay of the
1734 // land is. If it's mostly SQLITE_NOTADB, then the database should
1735 // be razed.
1736 err = ExecuteAndReturnErrorCode("PRAGMA auto_vacuum");
1737 if (err != SQLITE_OK)
[email protected]73fb8d52013-07-24 05:04:281738 UMA_HISTOGRAM_SPARSE_SLOWLY("Sqlite.OpenProbeFailure", err);
[email protected]658f8332010-09-18 04:40:431739
[email protected]2e1cee762013-07-09 14:40:001740#if defined(OS_IOS) && defined(USE_SYSTEM_SQLITE)
1741 // The version of SQLite shipped with iOS doesn't enable ICU, which includes
1742 // REGEXP support. Add it in dynamically.
1743 err = sqlite3IcuInit(db_);
1744 DCHECK_EQ(err, SQLITE_OK) << "Could not enable ICU support";
1745#endif // OS_IOS && USE_SYSTEM_SQLITE
1746
[email protected]5b96f3772010-09-28 16:30:571747 // If indicated, lock up the database before doing anything else, so
1748 // that the following code doesn't have to deal with locking.
1749 // TODO(shess): This code is brittle. Find the cases where code
1750 // doesn't request |exclusive_locking_| and audit that it does the
1751 // right thing with SQLITE_BUSY, and that it doesn't make
1752 // assumptions about who might change things in the database.
1753 // http://crbug.com/56559
1754 if (exclusive_locking_) {
[email protected]4350e322013-06-18 22:18:101755 // TODO(shess): This should probably be a failure. Code which
1756 // requests exclusive locking but doesn't get it is almost certain
1757 // to be ill-tested.
1758 ignore_result(Execute("PRAGMA locking_mode=EXCLUSIVE"));
[email protected]5b96f3772010-09-28 16:30:571759 }
1760
[email protected]4e179ba2012-03-17 16:06:471761 // http://www.sqlite.org/pragma.html#pragma_journal_mode
1762 // DELETE (default) - delete -journal file to commit.
1763 // TRUNCATE - truncate -journal file to commit.
1764 // PERSIST - zero out header of -journal file to commit.
shess2c21ecf2015-06-02 01:31:091765 // TRUNCATE should be faster than DELETE because it won't need directory
1766 // changes for each transaction. PERSIST may break the spirit of using
1767 // secure_delete.
1768 ignore_result(Execute("PRAGMA journal_mode = TRUNCATE"));
[email protected]4e179ba2012-03-17 16:06:471769
[email protected]c68ce172011-11-24 22:30:271770 const base::TimeDelta kBusyTimeout =
1771 base::TimeDelta::FromSeconds(kBusyTimeoutSeconds);
1772
[email protected]765b44502009-10-02 05:01:421773 if (page_size_ != 0) {
[email protected]5b96f3772010-09-28 16:30:571774 // Enforce SQLite restrictions on |page_size_|.
1775 DCHECK(!(page_size_ & (page_size_ - 1)))
1776 << " page_size_ " << page_size_ << " is not a power of two.";
[email protected]6d42f152012-11-10 00:38:241777 const int kSqliteMaxPageSize = 32768; // from sqliteLimit.h
[email protected]5b96f3772010-09-28 16:30:571778 DCHECK_LE(page_size_, kSqliteMaxPageSize);
[email protected]7d3cbc92013-03-18 22:33:041779 const std::string sql =
1780 base::StringPrintf("PRAGMA page_size=%d", page_size_);
[email protected]4350e322013-06-18 22:18:101781 ignore_result(ExecuteWithTimeout(sql.c_str(), kBusyTimeout));
[email protected]765b44502009-10-02 05:01:421782 }
1783
1784 if (cache_size_ != 0) {
[email protected]7d3cbc92013-03-18 22:33:041785 const std::string sql =
1786 base::StringPrintf("PRAGMA cache_size=%d", cache_size_);
[email protected]4350e322013-06-18 22:18:101787 ignore_result(ExecuteWithTimeout(sql.c_str(), kBusyTimeout));
[email protected]765b44502009-10-02 05:01:421788 }
1789
[email protected]6e0b1442011-08-09 23:23:581790 if (!ExecuteWithTimeout("PRAGMA secure_delete=ON", kBusyTimeout)) {
[email protected]fed734a2013-07-17 04:45:131791 bool was_poisoned = poisoned_;
[email protected]6e0b1442011-08-09 23:23:581792 Close();
[email protected]fed734a2013-07-17 04:45:131793 if (was_poisoned && retry_flag == RETRY_ON_POISON)
1794 return OpenInternal(file_name, NO_RETRY);
[email protected]6e0b1442011-08-09 23:23:581795 return false;
1796 }
1797
shess5dac334f2015-11-05 20:47:421798 // Set a reasonable chunk size for larger files. This reduces churn from
1799 // remapping memory on size changes. It also reduces filesystem
1800 // fragmentation.
1801 // TODO(shess): It may make sense to have this be hinted by the client.
1802 // Database sizes seem to be bimodal, some clients have consistently small
1803 // databases (<20k) while other clients have a broad distribution of sizes
1804 // (hundreds of kilobytes to many megabytes).
1805 sqlite3_file* file = NULL;
1806 sqlite3_int64 db_size = 0;
1807 int rc = GetSqlite3FileAndSize(db_, &file, &db_size);
1808 if (rc == SQLITE_OK && db_size > 16 * 1024) {
1809 int chunk_size = 4 * 1024;
1810 if (db_size > 128 * 1024)
1811 chunk_size = 32 * 1024;
1812 sqlite3_file_control(db_, NULL, SQLITE_FCNTL_CHUNK_SIZE, &chunk_size);
1813 }
1814
shess2f3a814b2015-11-05 18:11:101815 // Enable memory-mapped access. The explicit-disable case is because SQLite
shessd90aeea82015-11-13 02:24:311816 // can be built to default-enable mmap. GetAppropriateMmapSize() calculates a
1817 // safe range to memory-map based on past regular I/O. This value will be
1818 // capped by SQLITE_MAX_MMAP_SIZE, which could be different between 32-bit and
1819 // 64-bit platforms.
1820 size_t mmap_size = mmap_disabled_ ? 0 : GetAppropriateMmapSize();
1821 std::string mmap_sql =
1822 base::StringPrintf("PRAGMA mmap_size = %" PRIuS, mmap_size);
1823 ignore_result(Execute(mmap_sql.c_str()));
shess2f3a814b2015-11-05 18:11:101824
1825 // Determine if memory-mapping has actually been enabled. The Execute() above
1826 // can succeed without changing the amount mapped.
1827 mmap_enabled_ = false;
1828 {
1829 Statement s(GetUniqueStatement("PRAGMA mmap_size"));
1830 if (s.Step() && s.ColumnInt64(0) > 0)
1831 mmap_enabled_ = true;
1832 }
1833
ssid3be5b1ec2016-01-13 14:21:571834 DCHECK(!memory_dump_provider_);
1835 memory_dump_provider_.reset(
1836 new ConnectionMemoryDumpProvider(db_, histogram_tag_));
1837 base::trace_event::MemoryDumpManager::GetInstance()->RegisterDumpProvider(
1838 memory_dump_provider_.get(), "sql::Connection", nullptr);
1839
[email protected]765b44502009-10-02 05:01:421840 return true;
1841}
1842
[email protected]e5ffd0e42009-09-11 21:30:561843void Connection::DoRollback() {
1844 Statement rollback(GetCachedStatement(SQL_FROM_HERE, "ROLLBACK"));
shess58b8df82015-06-03 00:19:321845
1846 // Collect the rollback time manually, sql::Statement would register it as
1847 // query time only.
1848 const base::TimeTicks before = Now();
1849 rollback.RunWithoutTimers();
1850 const base::TimeDelta delta = Now() - before;
1851
1852 RecordUpdateTime(delta);
1853 RecordOneEvent(EVENT_ROLLBACK);
1854
shess7dbd4dee2015-10-06 17:39:161855 // The cache may have been accumulating dirty pages for commit. Note that in
1856 // some cases sql::Transaction can fire rollback after a database is closed.
1857 if (is_open())
1858 ReleaseCacheMemoryIfNeeded(false);
1859
[email protected]44ad7d902012-03-23 00:09:051860 needs_rollback_ = false;
[email protected]e5ffd0e42009-09-11 21:30:561861}
1862
1863void Connection::StatementRefCreated(StatementRef* ref) {
1864 DCHECK(open_statements_.find(ref) == open_statements_.end());
1865 open_statements_.insert(ref);
1866}
1867
1868void Connection::StatementRefDeleted(StatementRef* ref) {
1869 StatementRefSet::iterator i = open_statements_.find(ref);
1870 if (i == open_statements_.end())
[email protected]eff1fa522011-12-12 23:50:591871 DLOG(FATAL) << "Could not find statement";
[email protected]e5ffd0e42009-09-11 21:30:561872 else
1873 open_statements_.erase(i);
1874}
1875
shess58b8df82015-06-03 00:19:321876void Connection::set_histogram_tag(const std::string& tag) {
1877 DCHECK(!is_open());
1878 histogram_tag_ = tag;
1879}
1880
[email protected]210ce0af2013-05-15 09:10:391881void Connection::AddTaggedHistogram(const std::string& name,
1882 size_t sample) const {
1883 if (histogram_tag_.empty())
1884 return;
1885
1886 // TODO(shess): The histogram macros create a bit of static storage
1887 // for caching the histogram object. This code shouldn't execute
1888 // often enough for such caching to be crucial. If it becomes an
1889 // issue, the object could be cached alongside histogram_prefix_.
1890 std::string full_histogram_name = name + "." + histogram_tag_;
1891 base::HistogramBase* histogram =
1892 base::SparseHistogram::FactoryGet(
1893 full_histogram_name,
1894 base::HistogramBase::kUmaTargetedHistogramFlag);
1895 if (histogram)
1896 histogram->Add(sample);
1897}
1898
[email protected]2f496b42013-09-26 18:36:581899int Connection::OnSqliteError(int err, sql::Statement *stmt, const char* sql) {
[email protected]210ce0af2013-05-15 09:10:391900 UMA_HISTOGRAM_SPARSE_SLOWLY("Sqlite.Error", err);
1901 AddTaggedHistogram("Sqlite.Error", err);
[email protected]c088e3a32013-01-03 23:59:141902
1903 // Always log the error.
[email protected]2f496b42013-09-26 18:36:581904 if (!sql && stmt)
1905 sql = stmt->GetSQLStatement();
1906 if (!sql)
1907 sql = "-- unknown";
shessf7e988f2015-11-13 00:41:061908
1909 std::string id = histogram_tag_;
1910 if (id.empty())
1911 id = DbPath().BaseName().AsUTF8Unsafe();
1912 LOG(ERROR) << id << " sqlite error " << err
[email protected]c088e3a32013-01-03 23:59:141913 << ", errno " << GetLastErrno()
[email protected]2f496b42013-09-26 18:36:581914 << ": " << GetErrorMessage()
1915 << ", sql: " << sql;
[email protected]c088e3a32013-01-03 23:59:141916
[email protected]c3881b372013-05-17 08:39:461917 if (!error_callback_.is_null()) {
[email protected]98cf3002013-07-12 01:38:561918 // Fire from a copy of the callback in case of reentry into
1919 // re/set_error_callback().
1920 // TODO(shess): <http://crbug.com/254584>
1921 ErrorCallback(error_callback_).Run(err, stmt);
[email protected]c3881b372013-05-17 08:39:461922 return err;
1923 }
1924
[email protected]faa604e2009-09-25 22:38:591925 // The default handling is to assert on debug and to ignore on release.
[email protected]74cdede2013-09-25 05:39:571926 if (!ShouldIgnoreSqliteError(err))
[email protected]4350e322013-06-18 22:18:101927 DLOG(FATAL) << GetErrorMessage();
[email protected]faa604e2009-09-25 22:38:591928 return err;
1929}
1930
[email protected]579446c2013-12-16 18:36:521931bool Connection::FullIntegrityCheck(std::vector<std::string>* messages) {
1932 return IntegrityCheckHelper("PRAGMA integrity_check", messages);
1933}
1934
1935bool Connection::QuickIntegrityCheck() {
1936 std::vector<std::string> messages;
1937 if (!IntegrityCheckHelper("PRAGMA quick_check", &messages))
1938 return false;
1939 return messages.size() == 1 && messages[0] == "ok";
1940}
1941
[email protected]80abf152013-05-22 12:42:421942// TODO(shess): Allow specifying maximum results (default 100 lines).
[email protected]579446c2013-12-16 18:36:521943bool Connection::IntegrityCheckHelper(
1944 const char* pragma_sql,
1945 std::vector<std::string>* messages) {
[email protected]80abf152013-05-22 12:42:421946 messages->clear();
1947
[email protected]4658e2a02013-06-06 23:05:001948 // This has the side effect of setting SQLITE_RecoveryMode, which
1949 // allows SQLite to process through certain cases of corruption.
1950 // Failing to set this pragma probably means that the database is
1951 // beyond recovery.
1952 const char kWritableSchema[] = "PRAGMA writable_schema = ON";
1953 if (!Execute(kWritableSchema))
1954 return false;
1955
1956 bool ret = false;
1957 {
[email protected]579446c2013-12-16 18:36:521958 sql::Statement stmt(GetUniqueStatement(pragma_sql));
[email protected]4658e2a02013-06-06 23:05:001959
1960 // The pragma appears to return all results (up to 100 by default)
1961 // as a single string. This doesn't appear to be an API contract,
1962 // it could return separate lines, so loop _and_ split.
1963 while (stmt.Step()) {
1964 std::string result(stmt.ColumnString(0));
brettw83dc1612015-08-12 07:31:181965 *messages = base::SplitString(result, "\n", base::TRIM_WHITESPACE,
1966 base::SPLIT_WANT_ALL);
[email protected]4658e2a02013-06-06 23:05:001967 }
1968 ret = stmt.Succeeded();
[email protected]80abf152013-05-22 12:42:421969 }
[email protected]4658e2a02013-06-06 23:05:001970
1971 // Best effort to put things back as they were before.
1972 const char kNoWritableSchema[] = "PRAGMA writable_schema = OFF";
1973 ignore_result(Execute(kNoWritableSchema));
1974
1975 return ret;
[email protected]80abf152013-05-22 12:42:421976}
1977
shess58b8df82015-06-03 00:19:321978base::TimeTicks TimeSource::Now() {
1979 return base::TimeTicks::Now();
1980}
1981
[email protected]e5ffd0e42009-09-11 21:30:561982} // namespace sql