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

Side by Side Diff: chrome/browser/net/sqlite_persistent_cookie_store.cc

Issue 11112020: Allow multiple sql::Connection error delegates. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 2 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | sql/connection.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/net/sqlite_persistent_cookie_store.h" 5 #include "chrome/browser/net/sqlite_persistent_cookie_store.h"
6 6
7 #include <list> 7 #include <list>
8 #include <map> 8 #include <map>
9 #include <set> 9 #include <set>
10 #include <utility> 10 #include <utility>
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
68 : path_(path), 68 : path_(path),
69 db_(NULL), 69 db_(NULL),
70 num_pending_(0), 70 num_pending_(0),
71 force_keep_session_state_(false), 71 force_keep_session_state_(false),
72 initialized_(false), 72 initialized_(false),
73 restore_old_session_cookies_(restore_old_session_cookies), 73 restore_old_session_cookies_(restore_old_session_cookies),
74 clear_on_exit_policy_(clear_on_exit_policy), 74 clear_on_exit_policy_(clear_on_exit_policy),
75 num_cookies_read_(0), 75 num_cookies_read_(0),
76 num_priority_waiting_(0), 76 num_priority_waiting_(0),
77 total_priority_requests_(0) { 77 total_priority_requests_(0) {
78 error_delegate_ = 78 error_delegate_ = new KillDatabaseErrorDelegate(this);
79 new KillDatabaseErrorDelegate(this, GetErrorHandlerForCookieDb());
80 } 79 }
81 80
82 // Creates or loads the SQLite database. 81 // Creates or loads the SQLite database.
83 void Load(const LoadedCallback& loaded_callback); 82 void Load(const LoadedCallback& loaded_callback);
84 83
85 // Loads cookies for the domain key (eTLD+1). 84 // Loads cookies for the domain key (eTLD+1).
86 void LoadCookiesForKey(const std::string& domain, 85 void LoadCookiesForKey(const std::string& domain,
87 const LoadedCallback& loaded_callback); 86 const LoadedCallback& loaded_callback);
88 87
89 // Batch a cookie addition. 88 // Batch a cookie addition.
(...skipping 12 matching lines...) Expand all
102 // before the object is destructed. 101 // before the object is destructed.
103 void Close(); 102 void Close();
104 103
105 void SetForceKeepSessionState(); 104 void SetForceKeepSessionState();
106 105
107 private: 106 private:
108 friend class base::RefCountedThreadSafe<SQLitePersistentCookieStore::Backend>; 107 friend class base::RefCountedThreadSafe<SQLitePersistentCookieStore::Backend>;
109 108
110 class KillDatabaseErrorDelegate : public sql::ErrorDelegate { 109 class KillDatabaseErrorDelegate : public sql::ErrorDelegate {
111 public: 110 public:
112 KillDatabaseErrorDelegate(Backend* backend, 111 explicit KillDatabaseErrorDelegate(Backend* backend);
113 sql::ErrorDelegate* wrapped_delegate);
114 // ErrorDelegate implementation. 112 // ErrorDelegate implementation.
115 virtual int OnError(int error, 113 virtual int OnError(int error,
116 sql::Connection* connection, 114 sql::Connection* connection,
117 sql::Statement* stmt) OVERRIDE; 115 sql::Statement* stmt) OVERRIDE;
118 116
119 void reset_backend() { 117 void reset_backend() {
120 backend_ = NULL; 118 backend_ = NULL;
121 } 119 }
122 120
123 protected: 121 protected:
124 virtual ~KillDatabaseErrorDelegate() {} 122 virtual ~KillDatabaseErrorDelegate() {}
125 123
126 private: 124 private:
127 125
128 // Do not increment the count on Backend, as that would create a circular 126 // Do not increment the count on Backend, as that would create a circular
129 // reference (Backend -> Connection -> ErrorDelegate -> Backend). Instead, 127 // reference (Backend -> Connection -> ErrorDelegate -> Backend). Instead,
130 // Backend will call reset_backend() when it is going away. 128 // Backend will call reset_backend() when it is going away.
131 Backend* backend_; 129 Backend* backend_;
132 scoped_refptr<sql::ErrorDelegate> wrapped_delegate_;
133 130
134 DISALLOW_COPY_AND_ASSIGN(KillDatabaseErrorDelegate); 131 DISALLOW_COPY_AND_ASSIGN(KillDatabaseErrorDelegate);
135 }; 132 };
136 133
137 // You should call Close() before destructing this object. 134 // You should call Close() before destructing this object.
138 ~Backend() { 135 ~Backend() {
139 if (error_delegate_.get()) { 136 if (error_delegate_.get()) {
140 error_delegate_->reset_backend(); 137 error_delegate_->reset_backend();
141 error_delegate_ = NULL; 138 error_delegate_ = NULL;
142 } 139 }
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
278 // The time when |num_priority_waiting_| incremented to 1. 275 // The time when |num_priority_waiting_| incremented to 1.
279 base::Time current_priority_wait_start_; 276 base::Time current_priority_wait_start_;
280 // The cumulative duration of time when |num_priority_waiting_| was greater 277 // The cumulative duration of time when |num_priority_waiting_| was greater
281 // than 1. 278 // than 1.
282 base::TimeDelta priority_wait_duration_; 279 base::TimeDelta priority_wait_duration_;
283 280
284 DISALLOW_COPY_AND_ASSIGN(Backend); 281 DISALLOW_COPY_AND_ASSIGN(Backend);
285 }; 282 };
286 283
287 SQLitePersistentCookieStore::Backend::KillDatabaseErrorDelegate:: 284 SQLitePersistentCookieStore::Backend::KillDatabaseErrorDelegate::
288 KillDatabaseErrorDelegate(Backend* backend, 285 KillDatabaseErrorDelegate(Backend* backend)
289 sql::ErrorDelegate* wrapped_delegate) 286 : backend_(backend) {
290 : backend_(backend),
291 wrapped_delegate_(wrapped_delegate) {
292 } 287 }
293 288
294 int SQLitePersistentCookieStore::Backend::KillDatabaseErrorDelegate::OnError( 289 int SQLitePersistentCookieStore::Backend::KillDatabaseErrorDelegate::OnError(
295 int error, sql::Connection* connection, sql::Statement* stmt) { 290 int error, sql::Connection* connection, sql::Statement* stmt) {
296 if (wrapped_delegate_.get())
297 error = wrapped_delegate_->OnError(error, connection, stmt);
298
299 bool delete_db = false; 291 bool delete_db = false;
300 292
301 switch (error) { 293 switch (error) {
302 case SQLITE_DONE: 294 case SQLITE_DONE:
303 case SQLITE_OK: 295 case SQLITE_OK:
304 // Theoretically, the wrapped delegate might have resolved the error, and 296 // Theoretically, the wrapped delegate might have resolved the error, and
305 // we would end up here. 297 // we would end up here.
306 break; 298 break;
307 299
308 case SQLITE_CORRUPT: 300 case SQLITE_CORRUPT:
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
367 359
368 if (delete_db && backend_) { 360 if (delete_db && backend_) {
369 // Don't just do the close/delete here, as we are being called by |db| and 361 // Don't just do the close/delete here, as we are being called by |db| and
370 // that seems dangerous. 362 // that seems dangerous.
371 MessageLoop::current()->PostTask( 363 MessageLoop::current()->PostTask(
372 FROM_HERE, base::Bind(&Backend::KillDatabase, backend_)); 364 FROM_HERE, base::Bind(&Backend::KillDatabase, backend_));
373 365
374 // Avoid being called more than once. There should still be a reference to 366 // Avoid being called more than once. There should still be a reference to
375 // this ErrorDelegate in the backend, but just in case don't refer to any 367 // this ErrorDelegate in the backend, but just in case don't refer to any
376 // members from here forward. 368 // members from here forward.
377 connection->set_error_delegate(wrapped_delegate_.get()); 369 connection->remove_error_delegate(this);
378 } 370 }
379 371
380 return error; 372 return error;
381 } 373 }
382 374
383 // Version number of the database. 375 // Version number of the database.
384 // 376 //
385 // Version 5 adds the columns has_expires and is_persistent, so that the 377 // Version 5 adds the columns has_expires and is_persistent, so that the
386 // database can store session cookies as well as persistent cookies. Databases 378 // database can store session cookies as well as persistent cookies. Databases
387 // of version 5 are incompatible with older versions of code. If a database of 379 // of version 5 are incompatible with older versions of code. If a database of
(...skipping 784 matching lines...) Expand 10 before | Expand all | Expand 10 after
1172 } 1164 }
1173 1165
1174 SQLitePersistentCookieStore::~SQLitePersistentCookieStore() { 1166 SQLitePersistentCookieStore::~SQLitePersistentCookieStore() {
1175 if (backend_.get()) { 1167 if (backend_.get()) {
1176 backend_->Close(); 1168 backend_->Close();
1177 // Release our reference, it will probably still have a reference if the 1169 // Release our reference, it will probably still have a reference if the
1178 // background thread has not run Close() yet. 1170 // background thread has not run Close() yet.
1179 backend_ = NULL; 1171 backend_ = NULL;
1180 } 1172 }
1181 } 1173 }
OLDNEW
« no previous file with comments | « no previous file | sql/connection.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698