Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(232)

Side by Side Diff: third_party/WebKit/Source/modules/webdatabase/Database.cpp

Issue 2813433002: Replace ASSERT, ASSERT_NOT_REACHED, and RELEASE_ASSERT in modules/webdatabase (Closed)
Patch Set: Replace ASSERT, ASSERT_NOT_REACHED, and RELEASE_ASSERT in modules/webdatabase Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2013 Apple Inc. All rights reserved. 2 * Copyright (C) 2013 Apple Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
85 // In the case of failure to open the database, the factory methods will 85 // In the case of failure to open the database, the factory methods will
86 // simply discard the newly instantiated database backend when they return. 86 // simply discard the newly instantiated database backend when they return.
87 // The ref counting mechanims will automatically destruct the un-added 87 // The ref counting mechanims will automatically destruct the un-added
88 // (and un-returned) databases instances. 88 // (and un-returned) databases instances.
89 89
90 namespace blink { 90 namespace blink {
91 91
92 // Defines static local variable after making sure that guid lock is held. 92 // Defines static local variable after making sure that guid lock is held.
93 // (We can't use DEFINE_STATIC_LOCAL for this because it asserts thread 93 // (We can't use DEFINE_STATIC_LOCAL for this because it asserts thread
94 // safety, which is externally guaranteed by the guideMutex lock) 94 // safety, which is externally guaranteed by the guideMutex lock)
95 #if DCHECK_IS_ON()
95 #define DEFINE_STATIC_LOCAL_WITH_LOCK(type, name, arguments) \ 96 #define DEFINE_STATIC_LOCAL_WITH_LOCK(type, name, arguments) \
96 ASSERT(GuidMutex().Locked()); \ 97 DCHECK(GuidMutex().Locked()); \
97 static type& name = *new type arguments 98 static type& name = *new type arguments
99 #else
100 #define DEFINE_STATIC_LOCAL_WITH_LOCK(type, name, arguments) \
101 static type& name = *new type arguments
102 #endif
98 103
99 static const char kVersionKey[] = "WebKitDatabaseVersionKey"; 104 static const char kVersionKey[] = "WebKitDatabaseVersionKey";
100 static const char kInfoTableName[] = "__WebKitDatabaseInfoTable__"; 105 static const char kInfoTableName[] = "__WebKitDatabaseInfoTable__";
101 106
102 static String FormatErrorMessage(const char* message, 107 static String FormatErrorMessage(const char* message,
103 int sqlite_error_code, 108 int sqlite_error_code,
104 const char* sqlite_error_message) { 109 const char* sqlite_error_message) {
105 return String::Format("%s (%d %s)", message, sqlite_error_code, 110 return String::Format("%s (%d %s)", message, sqlite_error_code,
106 sqlite_error_message); 111 sqlite_error_message);
107 } 112 }
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
166 171
167 typedef HashMap<DatabaseGuid, String> GuidVersionMap; 172 typedef HashMap<DatabaseGuid, String> GuidVersionMap;
168 static GuidVersionMap& GuidToVersionMap() { 173 static GuidVersionMap& GuidToVersionMap() {
169 DEFINE_STATIC_LOCAL_WITH_LOCK(GuidVersionMap, map, ()); 174 DEFINE_STATIC_LOCAL_WITH_LOCK(GuidVersionMap, map, ());
170 return map; 175 return map;
171 } 176 }
172 177
173 // NOTE: Caller must lock guidMutex(). 178 // NOTE: Caller must lock guidMutex().
174 static inline void UpdateGuidVersionMap(DatabaseGuid guid, String new_version) { 179 static inline void UpdateGuidVersionMap(DatabaseGuid guid, String new_version) {
175 // Ensure the the mutex is locked. 180 // Ensure the the mutex is locked.
176 ASSERT(GuidMutex().Locked()); 181 #if DCHECK_IS_ON()
182 DCHECK(GuidMutex().Locked());
183 #endif
177 184
178 // Note: It is not safe to put an empty string into the guidToVersionMap() 185 // Note: It is not safe to put an empty string into the guidToVersionMap()
179 // map. That's because the map is cross-thread, but empty strings are 186 // map. That's because the map is cross-thread, but empty strings are
180 // per-thread. The copy() function makes a version of the string you can 187 // per-thread. The copy() function makes a version of the string you can
181 // use on the current thread, but we need a string we can keep in a 188 // use on the current thread, but we need a string we can keep in a
182 // cross-thread data structure. 189 // cross-thread data structure.
183 // FIXME: This is a quite-awkward restriction to have to program with. 190 // FIXME: This is a quite-awkward restriction to have to program with.
184 191
185 // Map null string to empty string (see comment above). 192 // Map null string to empty string (see comment above).
186 GuidToVersionMap().Set( 193 GuidToVersionMap().Set(
187 guid, new_version.IsEmpty() ? String() : new_version.IsolatedCopy()); 194 guid, new_version.IsEmpty() ? String() : new_version.IsolatedCopy());
188 } 195 }
189 196
190 static HashCountedSet<DatabaseGuid>& GuidCount() { 197 static HashCountedSet<DatabaseGuid>& GuidCount() {
191 DEFINE_STATIC_LOCAL_WITH_LOCK(HashCountedSet<DatabaseGuid>, guid_count, ()); 198 DEFINE_STATIC_LOCAL_WITH_LOCK(HashCountedSet<DatabaseGuid>, guid_count, ());
192 return guid_count; 199 return guid_count;
193 } 200 }
194 201
195 static DatabaseGuid GuidForOriginAndName(const String& origin, 202 static DatabaseGuid GuidForOriginAndName(const String& origin,
196 const String& name) { 203 const String& name) {
197 // Ensure the the mutex is locked. 204 // Ensure the the mutex is locked.
198 ASSERT(GuidMutex().Locked()); 205 #if DCHECK_IS_ON()
206 DCHECK(GuidMutex().Locked());
207 #endif
199 208
200 String string_id = origin + "/" + name; 209 String string_id = origin + "/" + name;
201 210
202 typedef HashMap<String, int> IDGuidMap; 211 typedef HashMap<String, int> IDGuidMap;
203 DEFINE_STATIC_LOCAL_WITH_LOCK(IDGuidMap, string_identifier_to_guid_map, ()); 212 DEFINE_STATIC_LOCAL_WITH_LOCK(IDGuidMap, string_identifier_to_guid_map, ());
204 DatabaseGuid guid = string_identifier_to_guid_map.at(string_id); 213 DatabaseGuid guid = string_identifier_to_guid_map.at(string_id);
205 if (!guid) { 214 if (!guid) {
206 static int current_new_guid = 1; 215 static int current_new_guid = 1;
207 guid = current_new_guid++; 216 guid = current_new_guid++;
208 string_identifier_to_guid_map.Set(string_id, guid); 217 string_identifier_to_guid_map.Set(string_id, guid);
(...skipping 30 matching lines...) Expand all
239 MutexLocker locker(GuidMutex()); 248 MutexLocker locker(GuidMutex());
240 guid_ = GuidForOriginAndName(GetSecurityOrigin()->ToString(), name); 249 guid_ = GuidForOriginAndName(GetSecurityOrigin()->ToString(), name);
241 GuidCount().insert(guid_); 250 GuidCount().insert(guid_);
242 } 251 }
243 252
244 filename_ = DatabaseManager::Manager().FullPathForDatabase( 253 filename_ = DatabaseManager::Manager().FullPathForDatabase(
245 GetSecurityOrigin(), name_); 254 GetSecurityOrigin(), name_);
246 255
247 database_thread_security_origin_ = 256 database_thread_security_origin_ =
248 context_thread_security_origin_->IsolatedCopy(); 257 context_thread_security_origin_->IsolatedCopy();
249 ASSERT(database_context_->GetDatabaseThread()); 258 DCHECK(database_context_->GetDatabaseThread());
250 ASSERT(database_context_->IsContextThread()); 259 DCHECK(database_context_->IsContextThread());
251 database_task_runner_ = 260 database_task_runner_ =
252 TaskRunnerHelper::Get(TaskType::kDatabaseAccess, GetExecutionContext()); 261 TaskRunnerHelper::Get(TaskType::kDatabaseAccess, GetExecutionContext());
253 } 262 }
254 263
255 Database::~Database() { 264 Database::~Database() {
256 // SQLite is "multi-thread safe", but each database handle can only be used 265 // SQLite is "multi-thread safe", but each database handle can only be used
257 // on a single thread at a time. 266 // on a single thread at a time.
258 // 267 //
259 // For Database, we open the SQLite database on the DatabaseThread, and 268 // For Database, we open the SQLite database on the DatabaseThread, and
260 // hence we should also close it on that same thread. This means that the 269 // hence we should also close it on that same thread. This means that the
261 // SQLite database need to be closed by another mechanism (see 270 // SQLite database need to be closed by another mechanism (see
262 // DatabaseContext::stopDatabases()). By the time we get here, the SQLite 271 // DatabaseContext::stopDatabases()). By the time we get here, the SQLite
263 // database should have already been closed. 272 // database should have already been closed.
264 273
265 ASSERT(!opened_); 274 DCHECK(!opened_);
266 } 275 }
267 276
268 DEFINE_TRACE(Database) { 277 DEFINE_TRACE(Database) {
269 visitor->Trace(database_context_); 278 visitor->Trace(database_context_);
270 visitor->Trace(sqlite_database_); 279 visitor->Trace(sqlite_database_);
271 visitor->Trace(database_authorizer_); 280 visitor->Trace(database_authorizer_);
272 } 281 }
273 282
274 bool Database::OpenAndVerifyVersion(bool set_version_in_new_database, 283 bool Database::OpenAndVerifyVersion(bool set_version_in_new_database,
275 DatabaseError& error, 284 DatabaseError& error,
276 String& error_message) { 285 String& error_message) {
277 WaitableEvent event; 286 WaitableEvent event;
278 if (!GetDatabaseContext()->DatabaseThreadAvailable()) 287 if (!GetDatabaseContext()->DatabaseThreadAvailable())
279 return false; 288 return false;
280 289
281 DatabaseTracker::Tracker().PrepareToOpenDatabase(this); 290 DatabaseTracker::Tracker().PrepareToOpenDatabase(this);
282 bool success = false; 291 bool success = false;
283 std::unique_ptr<DatabaseOpenTask> task = DatabaseOpenTask::Create( 292 std::unique_ptr<DatabaseOpenTask> task = DatabaseOpenTask::Create(
284 this, set_version_in_new_database, &event, error, error_message, success); 293 this, set_version_in_new_database, &event, error, error_message, success);
285 GetDatabaseContext()->GetDatabaseThread()->ScheduleTask(std::move(task)); 294 GetDatabaseContext()->GetDatabaseThread()->ScheduleTask(std::move(task));
286 event.Wait(); 295 event.Wait();
287 296
288 return success; 297 return success;
289 } 298 }
290 299
291 void Database::Close() { 300 void Database::Close() {
292 ASSERT(GetDatabaseContext()->GetDatabaseThread()); 301 DCHECK(GetDatabaseContext()->GetDatabaseThread());
293 ASSERT(GetDatabaseContext()->GetDatabaseThread()->IsDatabaseThread()); 302 DCHECK(GetDatabaseContext()->GetDatabaseThread()->IsDatabaseThread());
294 303
295 { 304 {
296 MutexLocker locker(transaction_in_progress_mutex_); 305 MutexLocker locker(transaction_in_progress_mutex_);
297 306
298 // Clean up transactions that have not been scheduled yet: 307 // Clean up transactions that have not been scheduled yet:
299 // Transaction phase 1 cleanup. See comment on "What happens if a 308 // Transaction phase 1 cleanup. See comment on "What happens if a
300 // transaction is interrupted?" at the top of SQLTransactionBackend.cpp. 309 // transaction is interrupted?" at the top of SQLTransactionBackend.cpp.
301 SQLTransactionBackend* transaction = nullptr; 310 SQLTransactionBackend* transaction = nullptr;
302 while (!transaction_queue_.IsEmpty()) { 311 while (!transaction_queue_.IsEmpty()) {
303 transaction = transaction_queue_.TakeFirst(); 312 transaction = transaction_queue_.TakeFirst();
(...skipping 29 matching lines...) Expand all
333 return transaction_backend; 342 return transaction_backend;
334 } 343 }
335 344
336 void Database::InProgressTransactionCompleted() { 345 void Database::InProgressTransactionCompleted() {
337 MutexLocker locker(transaction_in_progress_mutex_); 346 MutexLocker locker(transaction_in_progress_mutex_);
338 transaction_in_progress_ = false; 347 transaction_in_progress_ = false;
339 ScheduleTransaction(); 348 ScheduleTransaction();
340 } 349 }
341 350
342 void Database::ScheduleTransaction() { 351 void Database::ScheduleTransaction() {
343 ASSERT(!transaction_in_progress_mutex_.TryLock()); // Locked by caller. 352 DCHECK(!transaction_in_progress_mutex_.TryLock()); // Locked by caller.
344 SQLTransactionBackend* transaction = nullptr; 353 SQLTransactionBackend* transaction = nullptr;
345 354
346 if (is_transaction_queue_enabled_ && !transaction_queue_.IsEmpty()) 355 if (is_transaction_queue_enabled_ && !transaction_queue_.IsEmpty())
347 transaction = transaction_queue_.TakeFirst(); 356 transaction = transaction_queue_.TakeFirst();
348 357
349 if (transaction && GetDatabaseContext()->DatabaseThreadAvailable()) { 358 if (transaction && GetDatabaseContext()->DatabaseThreadAvailable()) {
350 std::unique_ptr<DatabaseTransactionTask> task = 359 std::unique_ptr<DatabaseTransactionTask> task =
351 DatabaseTransactionTask::Create(transaction); 360 DatabaseTransactionTask::Create(transaction);
352 STORAGE_DVLOG(1) << "Scheduling DatabaseTransactionTask " << task.get() 361 STORAGE_DVLOG(1) << "Scheduling DatabaseTransactionTask " << task.get()
353 << " for transaction " << task->Transaction(); 362 << " for transaction " << task->Transaction();
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
386 if (!opened_) 395 if (!opened_)
387 return; 396 return;
388 397
389 ReleaseStore(&opened_, 0); 398 ReleaseStore(&opened_, 0);
390 sqlite_database_.Close(); 399 sqlite_database_.Close();
391 // See comment at the top this file regarding calling removeOpenDatabase(). 400 // See comment at the top this file regarding calling removeOpenDatabase().
392 DatabaseTracker::Tracker().RemoveOpenDatabase(this); 401 DatabaseTracker::Tracker().RemoveOpenDatabase(this);
393 { 402 {
394 MutexLocker locker(GuidMutex()); 403 MutexLocker locker(GuidMutex());
395 404
396 ASSERT(GuidCount().Contains(guid_)); 405 DCHECK(GuidCount().Contains(guid_));
397 if (GuidCount().erase(guid_)) { 406 if (GuidCount().erase(guid_)) {
398 GuidToVersionMap().erase(guid_); 407 GuidToVersionMap().erase(guid_);
399 } 408 }
400 } 409 }
401 } 410 }
402 411
403 String Database::version() const { 412 String Database::version() const {
404 // Note: In multi-process browsers the cached value may be accurate, but we 413 // Note: In multi-process browsers the cached value may be accurate, but we
405 // cannot read the actual version from the database without potentially 414 // cannot read the actual version from the database without potentially
406 // inducing a deadlock. 415 // inducing a deadlock.
(...skipping 17 matching lines...) Expand all
424 private: 433 private:
425 CrossThreadPersistent<Database> database_; 434 CrossThreadPersistent<Database> database_;
426 bool open_succeeded_; 435 bool open_succeeded_;
427 }; 436 };
428 437
429 bool Database::PerformOpenAndVerify(bool should_set_version_in_new_database, 438 bool Database::PerformOpenAndVerify(bool should_set_version_in_new_database,
430 DatabaseError& error, 439 DatabaseError& error,
431 String& error_message) { 440 String& error_message) {
432 double call_start_time = WTF::MonotonicallyIncreasingTime(); 441 double call_start_time = WTF::MonotonicallyIncreasingTime();
433 DoneCreatingDatabaseOnExitCaller on_exit_caller(this); 442 DoneCreatingDatabaseOnExitCaller on_exit_caller(this);
434 ASSERT(error_message.IsEmpty()); 443 DCHECK(error_message.IsEmpty());
435 ASSERT(error == DatabaseError::kNone); // Better not have any errors already. 444 DCHECK_EQ(error,
445 DatabaseError::kNone); // Better not have any errors already.
436 // Presumed failure. We'll clear it if we succeed below. 446 // Presumed failure. We'll clear it if we succeed below.
437 error = DatabaseError::kInvalidDatabaseState; 447 error = DatabaseError::kInvalidDatabaseState;
438 448
439 const int kMaxSqliteBusyWaitTime = 30000; 449 const int kMaxSqliteBusyWaitTime = 30000;
440 450
441 if (!sqlite_database_.Open(filename_)) { 451 if (!sqlite_database_.Open(filename_)) {
442 ReportOpenDatabaseResult( 452 ReportOpenDatabaseResult(
443 1, kInvalidStateError, sqlite_database_.LastError(), 453 1, kInvalidStateError, sqlite_database_.LastError(),
444 WTF::MonotonicallyIncreasingTime() - call_start_time); 454 WTF::MonotonicallyIncreasingTime() - call_start_time);
445 error_message = FormatErrorMessage("unable to open database", 455 error_message = FormatErrorMessage("unable to open database",
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
568 ReportOpenDatabaseResult( 578 ReportOpenDatabaseResult(
569 6, kInvalidStateError, 0, 579 6, kInvalidStateError, 0,
570 WTF::MonotonicallyIncreasingTime() - call_start_time); 580 WTF::MonotonicallyIncreasingTime() - call_start_time);
571 error_message = 581 error_message =
572 "unable to open database, version mismatch, '" + expected_version_ + 582 "unable to open database, version mismatch, '" + expected_version_ +
573 "' does not match the currentVersion of '" + current_version + "'"; 583 "' does not match the currentVersion of '" + current_version + "'";
574 sqlite_database_.Close(); 584 sqlite_database_.Close();
575 return false; 585 return false;
576 } 586 }
577 587
578 ASSERT(database_authorizer_); 588 DCHECK(database_authorizer_);
579 sqlite_database_.SetAuthorizer(database_authorizer_.Get()); 589 sqlite_database_.SetAuthorizer(database_authorizer_.Get());
580 590
581 // See comment at the top this file regarding calling addOpenDatabase(). 591 // See comment at the top this file regarding calling addOpenDatabase().
582 DatabaseTracker::Tracker().AddOpenDatabase(this); 592 DatabaseTracker::Tracker().AddOpenDatabase(this);
583 opened_ = 1; 593 opened_ = 1;
584 594
585 // Declare success: 595 // Declare success:
586 error = DatabaseError::kNone; // Clear the presumed error from above. 596 error = DatabaseError::kNone; // Clear the presumed error from above.
587 on_exit_caller.SetOpenSucceeded(); 597 on_exit_caller.SetOpenSucceeded();
588 598
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
674 return GuidToVersionMap().at(guid_).IsolatedCopy(); 684 return GuidToVersionMap().at(guid_).IsolatedCopy();
675 } 685 }
676 686
677 void Database::SetCachedVersion(const String& actual_version) { 687 void Database::SetCachedVersion(const String& actual_version) {
678 // Update the in memory database version map. 688 // Update the in memory database version map.
679 MutexLocker locker(GuidMutex()); 689 MutexLocker locker(GuidMutex());
680 UpdateGuidVersionMap(guid_, actual_version); 690 UpdateGuidVersionMap(guid_, actual_version);
681 } 691 }
682 692
683 bool Database::GetActualVersionForTransaction(String& actual_version) { 693 bool Database::GetActualVersionForTransaction(String& actual_version) {
684 ASSERT(sqlite_database_.TransactionInProgress()); 694 DCHECK(sqlite_database_.TransactionInProgress());
685 // Note: In multi-process browsers the cached value may be inaccurate. So we 695 // Note: In multi-process browsers the cached value may be inaccurate. So we
686 // retrieve the value from the database and update the cached value here. 696 // retrieve the value from the database and update the cached value here.
687 return GetVersionFromDatabase(actual_version, true); 697 return GetVersionFromDatabase(actual_version, true);
688 } 698 }
689 699
690 void Database::DisableAuthorizer() { 700 void Database::DisableAuthorizer() {
691 ASSERT(database_authorizer_); 701 DCHECK(database_authorizer_);
692 database_authorizer_->Disable(); 702 database_authorizer_->Disable();
693 } 703 }
694 704
695 void Database::EnableAuthorizer() { 705 void Database::EnableAuthorizer() {
696 ASSERT(database_authorizer_); 706 DCHECK(database_authorizer_);
697 database_authorizer_->Enable(); 707 database_authorizer_->Enable();
698 } 708 }
699 709
700 void Database::SetAuthorizerPermissions(int permissions) { 710 void Database::SetAuthorizerPermissions(int permissions) {
701 ASSERT(database_authorizer_); 711 DCHECK(database_authorizer_);
702 database_authorizer_->SetPermissions(permissions); 712 database_authorizer_->SetPermissions(permissions);
703 } 713 }
704 714
705 bool Database::LastActionChangedDatabase() { 715 bool Database::LastActionChangedDatabase() {
706 ASSERT(database_authorizer_); 716 DCHECK(database_authorizer_);
707 return database_authorizer_->LastActionChangedDatabase(); 717 return database_authorizer_->LastActionChangedDatabase();
708 } 718 }
709 719
710 bool Database::LastActionWasInsert() { 720 bool Database::LastActionWasInsert() {
711 ASSERT(database_authorizer_); 721 DCHECK(database_authorizer_);
712 return database_authorizer_->LastActionWasInsert(); 722 return database_authorizer_->LastActionWasInsert();
713 } 723 }
714 724
715 void Database::ResetDeletes() { 725 void Database::ResetDeletes() {
716 ASSERT(database_authorizer_); 726 DCHECK(database_authorizer_);
717 database_authorizer_->ResetDeletes(); 727 database_authorizer_->ResetDeletes();
718 } 728 }
719 729
720 bool Database::HadDeletes() { 730 bool Database::HadDeletes() {
721 ASSERT(database_authorizer_); 731 DCHECK(database_authorizer_);
722 return database_authorizer_->HadDeletes(); 732 return database_authorizer_->HadDeletes();
723 } 733 }
724 734
725 void Database::ResetAuthorizer() { 735 void Database::ResetAuthorizer() {
726 if (database_authorizer_) 736 if (database_authorizer_)
727 database_authorizer_->Reset(); 737 database_authorizer_->Reset();
728 } 738 }
729 739
730 unsigned long long Database::MaximumSize() const { 740 unsigned long long Database::MaximumSize() const {
731 return DatabaseTracker::Tracker().GetMaxSizeForDatabase(this); 741 return DatabaseTracker::Tracker().GetMaxSizeForDatabase(this);
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
807 void Database::LogErrorMessage(const String& message) { 817 void Database::LogErrorMessage(const String& message) {
808 GetExecutionContext()->AddConsoleMessage(ConsoleMessage::Create( 818 GetExecutionContext()->AddConsoleMessage(ConsoleMessage::Create(
809 kStorageMessageSource, kErrorMessageLevel, message)); 819 kStorageMessageSource, kErrorMessageLevel, message));
810 } 820 }
811 821
812 ExecutionContext* Database::GetExecutionContext() const { 822 ExecutionContext* Database::GetExecutionContext() const {
813 return GetDatabaseContext()->GetExecutionContext(); 823 return GetDatabaseContext()->GetExecutionContext();
814 } 824 }
815 825
816 void Database::CloseImmediately() { 826 void Database::CloseImmediately() {
817 ASSERT(GetExecutionContext()->IsContextThread()); 827 DCHECK(GetExecutionContext()->IsContextThread());
818 if (GetDatabaseContext()->DatabaseThreadAvailable() && Opened()) { 828 if (GetDatabaseContext()->DatabaseThreadAvailable() && Opened()) {
819 LogErrorMessage("forcibly closing database"); 829 LogErrorMessage("forcibly closing database");
820 GetDatabaseContext()->GetDatabaseThread()->ScheduleTask( 830 GetDatabaseContext()->GetDatabaseThread()->ScheduleTask(
821 DatabaseCloseTask::Create(this, 0)); 831 DatabaseCloseTask::Create(this, 0));
822 } 832 }
823 } 833 }
824 834
825 void Database::changeVersion(const String& old_version, 835 void Database::changeVersion(const String& old_version,
826 const String& new_version, 836 const String& new_version,
827 SQLTransactionCallback* callback, 837 SQLTransactionCallback* callback,
(...skipping 22 matching lines...) Expand all
850 } 860 }
851 861
852 void Database::RunTransaction(SQLTransactionCallback* callback, 862 void Database::RunTransaction(SQLTransactionCallback* callback,
853 SQLTransactionErrorCallback* error_callback, 863 SQLTransactionErrorCallback* error_callback,
854 VoidCallback* success_callback, 864 VoidCallback* success_callback,
855 bool read_only, 865 bool read_only,
856 const ChangeVersionData* change_version_data) { 866 const ChangeVersionData* change_version_data) {
857 if (!GetExecutionContext()) 867 if (!GetExecutionContext())
858 return; 868 return;
859 869
860 ASSERT(GetExecutionContext()->IsContextThread()); 870 DCHECK(GetExecutionContext()->IsContextThread());
861 // FIXME: Rather than passing errorCallback to SQLTransaction and then 871 // FIXME: Rather than passing errorCallback to SQLTransaction and then
862 // sometimes firing it ourselves, this code should probably be pushed down 872 // sometimes firing it ourselves, this code should probably be pushed down
863 // into Database so that we only create the SQLTransaction if we're 873 // into Database so that we only create the SQLTransaction if we're
864 // actually going to run it. 874 // actually going to run it.
865 #if DCHECK_IS_ON() 875 #if DCHECK_IS_ON()
866 SQLTransactionErrorCallback* original_error_callback = error_callback; 876 SQLTransactionErrorCallback* original_error_callback = error_callback;
867 #endif 877 #endif
868 SQLTransaction* transaction = SQLTransaction::Create( 878 SQLTransaction* transaction = SQLTransaction::Create(
869 this, callback, success_callback, error_callback, read_only); 879 this, callback, success_callback, error_callback, read_only);
870 SQLTransactionBackend* transaction_backend = 880 SQLTransactionBackend* transaction_backend =
871 RunTransaction(transaction, read_only, change_version_data); 881 RunTransaction(transaction, read_only, change_version_data);
872 if (!transaction_backend) { 882 if (!transaction_backend) {
873 SQLTransactionErrorCallback* callback = transaction->ReleaseErrorCallback(); 883 SQLTransactionErrorCallback* callback = transaction->ReleaseErrorCallback();
874 ASSERT(callback == original_error_callback); 884 #if DCHECK_IS_ON()
885 DCHECK_EQ(callback, original_error_callback);
886 #endif
875 if (callback) { 887 if (callback) {
876 std::unique_ptr<SQLErrorData> error = SQLErrorData::Create( 888 std::unique_ptr<SQLErrorData> error = SQLErrorData::Create(
877 SQLError::kUnknownErr, "database has been closed"); 889 SQLError::kUnknownErr, "database has been closed");
878 GetDatabaseTaskRunner()->PostTask( 890 GetDatabaseTaskRunner()->PostTask(
879 BLINK_FROM_HERE, 891 BLINK_FROM_HERE,
880 WTF::Bind(&CallTransactionErrorCallback, WrapPersistent(callback), 892 WTF::Bind(&CallTransactionErrorCallback, WrapPersistent(callback),
881 WTF::Passed(std::move(error)))); 893 WTF::Passed(std::move(error))));
882 } 894 }
883 } 895 }
884 } 896 }
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
950 962
951 bool Database::Opened() { 963 bool Database::Opened() {
952 return static_cast<bool>(AcquireLoad(&opened_)); 964 return static_cast<bool>(AcquireLoad(&opened_));
953 } 965 }
954 966
955 WebTaskRunner* Database::GetDatabaseTaskRunner() const { 967 WebTaskRunner* Database::GetDatabaseTaskRunner() const {
956 return database_task_runner_.Get(); 968 return database_task_runner_.Get();
957 } 969 }
958 970
959 } // namespace blink 971 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698