OLD | NEW |
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 "webkit/common/database/database_connections.h" | 5 #include "storage/common/database/database_connections.h" |
6 | 6 |
7 #include "base/auto_reset.h" | 7 #include "base/auto_reset.h" |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
11 #include "base/message_loop/message_loop_proxy.h" | 11 #include "base/message_loop/message_loop_proxy.h" |
12 | 12 |
13 namespace webkit_database { | 13 namespace webkit_database { |
14 | 14 |
15 DatabaseConnections::DatabaseConnections() { | 15 DatabaseConnections::DatabaseConnections() { |
(...skipping 16 matching lines...) Expand all Loading... |
32 return false; | 32 return false; |
33 const DBConnections& origin_connections = origin_it->second; | 33 const DBConnections& origin_connections = origin_it->second; |
34 return (origin_connections.find(database_name) != origin_connections.end()); | 34 return (origin_connections.find(database_name) != origin_connections.end()); |
35 } | 35 } |
36 | 36 |
37 bool DatabaseConnections::IsOriginUsed( | 37 bool DatabaseConnections::IsOriginUsed( |
38 const std::string& origin_identifier) const { | 38 const std::string& origin_identifier) const { |
39 return (connections_.find(origin_identifier) != connections_.end()); | 39 return (connections_.find(origin_identifier) != connections_.end()); |
40 } | 40 } |
41 | 41 |
42 bool DatabaseConnections::AddConnection( | 42 bool DatabaseConnections::AddConnection(const std::string& origin_identifier, |
43 const std::string& origin_identifier, | 43 const base::string16& database_name) { |
44 const base::string16& database_name) { | |
45 int& count = connections_[origin_identifier][database_name].first; | 44 int& count = connections_[origin_identifier][database_name].first; |
46 return ++count == 1; | 45 return ++count == 1; |
47 } | 46 } |
48 | 47 |
49 bool DatabaseConnections::RemoveConnection( | 48 bool DatabaseConnections::RemoveConnection( |
50 const std::string& origin_identifier, | 49 const std::string& origin_identifier, |
51 const base::string16& database_name) { | 50 const base::string16& database_name) { |
52 return RemoveConnectionsHelper(origin_identifier, database_name, 1); | 51 return RemoveConnectionsHelper(origin_identifier, database_name, 1); |
53 } | 52 } |
54 | 53 |
55 void DatabaseConnections::RemoveAllConnections() { | 54 void DatabaseConnections::RemoveAllConnections() { |
56 connections_.clear(); | 55 connections_.clear(); |
57 } | 56 } |
58 | 57 |
59 void DatabaseConnections::RemoveConnections( | 58 void DatabaseConnections::RemoveConnections( |
60 const DatabaseConnections& connections, | 59 const DatabaseConnections& connections, |
61 std::vector<std::pair<std::string, base::string16> >* closed_dbs) { | 60 std::vector<std::pair<std::string, base::string16> >* closed_dbs) { |
62 for (OriginConnections::const_iterator origin_it = | 61 for (OriginConnections::const_iterator origin_it = |
63 connections.connections_.begin(); | 62 connections.connections_.begin(); |
64 origin_it != connections.connections_.end(); | 63 origin_it != connections.connections_.end(); |
65 origin_it++) { | 64 origin_it++) { |
66 const DBConnections& db_connections = origin_it->second; | 65 const DBConnections& db_connections = origin_it->second; |
67 for (DBConnections::const_iterator db_it = db_connections.begin(); | 66 for (DBConnections::const_iterator db_it = db_connections.begin(); |
68 db_it != db_connections.end(); db_it++) { | 67 db_it != db_connections.end(); |
69 if (RemoveConnectionsHelper(origin_it->first, db_it->first, | 68 db_it++) { |
70 db_it->second.first)) | 69 if (RemoveConnectionsHelper( |
| 70 origin_it->first, db_it->first, db_it->second.first)) |
71 closed_dbs->push_back(std::make_pair(origin_it->first, db_it->first)); | 71 closed_dbs->push_back(std::make_pair(origin_it->first, db_it->first)); |
72 } | 72 } |
73 } | 73 } |
74 } | 74 } |
75 | 75 |
76 int64 DatabaseConnections::GetOpenDatabaseSize( | 76 int64 DatabaseConnections::GetOpenDatabaseSize( |
77 const std::string& origin_identifier, | 77 const std::string& origin_identifier, |
78 const base::string16& database_name) const { | 78 const base::string16& database_name) const { |
79 DCHECK(IsDatabaseOpened(origin_identifier, database_name)); | 79 DCHECK(IsDatabaseOpened(origin_identifier, database_name)); |
80 return connections_[origin_identifier][database_name].second; | 80 return connections_[origin_identifier][database_name].second; |
81 } | 81 } |
82 | 82 |
83 void DatabaseConnections::SetOpenDatabaseSize( | 83 void DatabaseConnections::SetOpenDatabaseSize( |
84 const std::string& origin_identifier, | 84 const std::string& origin_identifier, |
85 const base::string16& database_name, | 85 const base::string16& database_name, |
86 int64 size) { | 86 int64 size) { |
87 DCHECK(IsDatabaseOpened(origin_identifier, database_name)); | 87 DCHECK(IsDatabaseOpened(origin_identifier, database_name)); |
88 connections_[origin_identifier][database_name].second = size; | 88 connections_[origin_identifier][database_name].second = size; |
89 } | 89 } |
90 | 90 |
91 void DatabaseConnections::ListConnections( | 91 void DatabaseConnections::ListConnections( |
92 std::vector<std::pair<std::string, base::string16> > *list) const { | 92 std::vector<std::pair<std::string, base::string16> >* list) const { |
93 for (OriginConnections::const_iterator origin_it = | 93 for (OriginConnections::const_iterator origin_it = connections_.begin(); |
94 connections_.begin(); | |
95 origin_it != connections_.end(); | 94 origin_it != connections_.end(); |
96 origin_it++) { | 95 origin_it++) { |
97 const DBConnections& db_connections = origin_it->second; | 96 const DBConnections& db_connections = origin_it->second; |
98 for (DBConnections::const_iterator db_it = db_connections.begin(); | 97 for (DBConnections::const_iterator db_it = db_connections.begin(); |
99 db_it != db_connections.end(); db_it++) { | 98 db_it != db_connections.end(); |
| 99 db_it++) { |
100 list->push_back(std::make_pair(origin_it->first, db_it->first)); | 100 list->push_back(std::make_pair(origin_it->first, db_it->first)); |
101 } | 101 } |
102 } | 102 } |
103 } | 103 } |
104 | 104 |
105 bool DatabaseConnections::RemoveConnectionsHelper( | 105 bool DatabaseConnections::RemoveConnectionsHelper( |
106 const std::string& origin_identifier, | 106 const std::string& origin_identifier, |
107 const base::string16& database_name, | 107 const base::string16& database_name, |
108 int num_connections) { | 108 int num_connections) { |
109 OriginConnections::iterator origin_iterator = | 109 OriginConnections::iterator origin_iterator = |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
155 } | 155 } |
156 | 156 |
157 void DatabaseConnectionsWrapper::RemoveOpenConnection( | 157 void DatabaseConnectionsWrapper::RemoveOpenConnection( |
158 const std::string& origin_identifier, | 158 const std::string& origin_identifier, |
159 const base::string16& database_name) { | 159 const base::string16& database_name) { |
160 // But only remove from the collection on the main thread | 160 // But only remove from the collection on the main thread |
161 // so we can handle the waiting_for_dbs_to_close_ case. | 161 // so we can handle the waiting_for_dbs_to_close_ case. |
162 if (!main_thread_->BelongsToCurrentThread()) { | 162 if (!main_thread_->BelongsToCurrentThread()) { |
163 main_thread_->PostTask( | 163 main_thread_->PostTask( |
164 FROM_HERE, | 164 FROM_HERE, |
165 base::Bind(&DatabaseConnectionsWrapper::RemoveOpenConnection, this, | 165 base::Bind(&DatabaseConnectionsWrapper::RemoveOpenConnection, |
166 origin_identifier, database_name)); | 166 this, |
| 167 origin_identifier, |
| 168 database_name)); |
167 return; | 169 return; |
168 } | 170 } |
169 base::AutoLock auto_lock(open_connections_lock_); | 171 base::AutoLock auto_lock(open_connections_lock_); |
170 open_connections_.RemoveConnection(origin_identifier, database_name); | 172 open_connections_.RemoveConnection(origin_identifier, database_name); |
171 if (waiting_for_dbs_to_close_ && open_connections_.IsEmpty()) | 173 if (waiting_for_dbs_to_close_ && open_connections_.IsEmpty()) |
172 base::MessageLoop::current()->Quit(); | 174 base::MessageLoop::current()->Quit(); |
173 } | 175 } |
174 | 176 |
175 } // namespace webkit_database | 177 } // namespace webkit_database |
OLD | NEW |