Chromium Code Reviews| 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/appcache/appcache_database.h" | 5 #include "webkit/appcache/appcache_database.h" |
| 6 | 6 |
| 7 #include "base/auto_reset.h" | 7 #include "base/auto_reset.h" |
| 8 #include "base/command_line.h" | |
| 8 #include "base/file_util.h" | 9 #include "base/file_util.h" |
| 9 #include "base/logging.h" | 10 #include "base/logging.h" |
| 10 #include "base/utf_string_conversions.h" | 11 #include "base/utf_string_conversions.h" |
| 11 #include "sql/connection.h" | 12 #include "sql/connection.h" |
| 12 #include "sql/meta_table.h" | 13 #include "sql/meta_table.h" |
| 13 #include "sql/statement.h" | 14 #include "sql/statement.h" |
| 14 #include "sql/transaction.h" | 15 #include "sql/transaction.h" |
| 15 #include "webkit/appcache/appcache_entry.h" | 16 #include "webkit/appcache/appcache_entry.h" |
| 16 #include "webkit/appcache/appcache_histograms.h" | 17 #include "webkit/appcache/appcache_histograms.h" |
| 17 | 18 |
| 19 namespace appcache { | |
| 20 | |
| 18 // Schema ------------------------------------------------------------------- | 21 // Schema ------------------------------------------------------------------- |
| 19 namespace { | 22 namespace { |
| 20 | 23 |
| 21 const int kCurrentVersion = 5; | 24 const int kCurrentVersion = 5; |
| 22 const int kCompatibleVersion = 5; | 25 const int kCompatibleVersion = 5; |
| 23 | 26 |
| 24 // A mechanism to run experiments that may affect in data being persisted | 27 // A mechanism to run experiments that may affect in data being persisted |
| 25 // in different ways such that when the experiment is toggled on/off via | 28 // in different ways such that when the experiment is toggled on/off via |
| 26 // cmd line flags, the database gets reset. The active flags are stored at | 29 // cmd line flags, the database gets reset. The active flags are stored at |
| 27 // the time of database creation and compared when reopening. If different | 30 // the time of database creation and compared when reopening. If different |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 160 else | 163 else |
| 161 sql += "CREATE INDEX "; | 164 sql += "CREATE INDEX "; |
| 162 sql += info.index_name; | 165 sql += info.index_name; |
| 163 sql += " ON "; | 166 sql += " ON "; |
| 164 sql += info.table_name; | 167 sql += info.table_name; |
| 165 sql += info.columns; | 168 sql += info.columns; |
| 166 return db->Execute(sql.c_str()); | 169 return db->Execute(sql.c_str()); |
| 167 } | 170 } |
| 168 | 171 |
| 169 std::string GetActiveExperimentFlags() { | 172 std::string GetActiveExperimentFlags() { |
| 173 if (CommandLine::ForCurrentProcess()->HasSwitch(kEnableExecutableHandlers)) | |
| 174 return std::string("executableHandlersEnabled"); | |
| 170 return std::string(); | 175 return std::string(); |
| 171 } | 176 } |
| 172 | 177 |
| 173 } // anon namespace | 178 } // anon namespace |
| 174 | 179 |
| 175 // AppCacheDatabase ---------------------------------------------------------- | 180 // AppCacheDatabase ---------------------------------------------------------- |
| 176 namespace appcache { | |
| 177 | 181 |
| 178 AppCacheDatabase::GroupRecord::GroupRecord() | 182 AppCacheDatabase::GroupRecord::GroupRecord() |
| 179 : group_id(0) { | 183 : group_id(0) { |
| 180 } | 184 } |
| 181 | 185 |
| 182 AppCacheDatabase::GroupRecord::~GroupRecord() { | 186 AppCacheDatabase::GroupRecord::~GroupRecord() { |
| 183 } | 187 } |
| 184 | 188 |
| 185 AppCacheDatabase::NamespaceRecord::NamespaceRecord() | 189 AppCacheDatabase::NamespaceRecord::NamespaceRecord() |
| 186 : cache_id(0) { | 190 : cache_id(0) { |
| (...skipping 506 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 693 bool AppCacheDatabase::InsertNamespace( | 697 bool AppCacheDatabase::InsertNamespace( |
| 694 const NamespaceRecord* record) { | 698 const NamespaceRecord* record) { |
| 695 if (!LazyOpen(true)) | 699 if (!LazyOpen(true)) |
| 696 return false; | 700 return false; |
| 697 | 701 |
| 698 const char* kSql = | 702 const char* kSql = |
| 699 "INSERT INTO Namespaces" | 703 "INSERT INTO Namespaces" |
| 700 " (cache_id, origin, type, namespace_url, target_url, is_pattern)" | 704 " (cache_id, origin, type, namespace_url, target_url, is_pattern)" |
| 701 " VALUES (?, ?, ?, ?, ?, ?)"; | 705 " VALUES (?, ?, ?, ?, ?, ?)"; |
| 702 | 706 |
| 707 // Note: quick and dirty storage for the 'executable' bit w/o changing | |
| 708 // schemas, we use the high bit of 'type' field. | |
| 709 int type_with_executable_bit = record->namespace_.type; | |
| 710 if (record->namespace_.is_executable) { | |
| 711 type_with_executable_bit |= 0x8000000; | |
| 712 DCHECK(CommandLine::ForCurrentProcess()->HasSwitch( | |
| 713 kEnableExecutableHandlers)); | |
| 714 } | |
| 715 | |
| 703 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); | 716 sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); |
| 704 statement.BindInt64(0, record->cache_id); | 717 statement.BindInt64(0, record->cache_id); |
| 705 statement.BindString(1, record->origin.spec()); | 718 statement.BindString(1, record->origin.spec()); |
| 706 statement.BindInt(2, record->namespace_.type); | 719 statement.BindInt(2, type_with_executable_bit); |
| 707 statement.BindString(3, record->namespace_.namespace_url.spec()); | 720 statement.BindString(3, record->namespace_.namespace_url.spec()); |
| 708 statement.BindString(4, record->namespace_.target_url.spec()); | 721 statement.BindString(4, record->namespace_.target_url.spec()); |
| 709 statement.BindBool(5, record->namespace_.is_pattern); | 722 statement.BindBool(5, record->namespace_.is_pattern); |
| 710 return statement.Run(); | 723 return statement.Run(); |
| 711 } | 724 } |
| 712 | 725 |
| 713 bool AppCacheDatabase::InsertNamespaceRecords( | 726 bool AppCacheDatabase::InsertNamespaceRecords( |
| 714 const std::vector<NamespaceRecord>& records) { | 727 const std::vector<NamespaceRecord>& records) { |
| 715 if (records.empty()) | 728 if (records.empty()) |
| 716 return true; | 729 return true; |
| (...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 940 (type == FALLBACK_NAMESPACE) ? fallbacks : intercepts; | 953 (type == FALLBACK_NAMESPACE) ? fallbacks : intercepts; |
| 941 records->push_back(NamespaceRecord()); | 954 records->push_back(NamespaceRecord()); |
| 942 ReadNamespaceRecord(statement, &records->back()); | 955 ReadNamespaceRecord(statement, &records->back()); |
| 943 } | 956 } |
| 944 } | 957 } |
| 945 | 958 |
| 946 void AppCacheDatabase::ReadNamespaceRecord( | 959 void AppCacheDatabase::ReadNamespaceRecord( |
| 947 const sql::Statement* statement, NamespaceRecord* record) { | 960 const sql::Statement* statement, NamespaceRecord* record) { |
| 948 record->cache_id = statement->ColumnInt64(0); | 961 record->cache_id = statement->ColumnInt64(0); |
| 949 record->origin = GURL(statement->ColumnString(1)); | 962 record->origin = GURL(statement->ColumnString(1)); |
| 950 record->namespace_.type = static_cast<NamespaceType>(statement->ColumnInt(2)); | 963 int type_with_executable_bit = statement->ColumnInt(2); |
|
michaeln
2013/04/16 22:25:11
could make this const to make it more clear we don
| |
| 951 record->namespace_.namespace_url = GURL(statement->ColumnString(3)); | 964 record->namespace_.namespace_url = GURL(statement->ColumnString(3)); |
| 952 record->namespace_.target_url = GURL(statement->ColumnString(4)); | 965 record->namespace_.target_url = GURL(statement->ColumnString(4)); |
| 953 record->namespace_.is_pattern = statement->ColumnBool(5); | 966 record->namespace_.is_pattern = statement->ColumnBool(5); |
| 967 | |
| 968 // Note: quick and dirty storage for the 'executable' bit w/o changing | |
| 969 // schemas, we use the high bit of 'type' field. | |
| 970 record->namespace_.type = static_cast<NamespaceType> | |
| 971 (type_with_executable_bit & 0x7ffffff); | |
| 972 record->namespace_.is_executable = | |
| 973 (type_with_executable_bit & 0x80000000) != 0; | |
| 974 DCHECK(!record->namespace_.is_executable || | |
| 975 CommandLine::ForCurrentProcess()->HasSwitch(kEnableExecutableHandlers)); | |
| 954 } | 976 } |
| 955 | 977 |
| 956 void AppCacheDatabase::ReadOnlineWhiteListRecord( | 978 void AppCacheDatabase::ReadOnlineWhiteListRecord( |
| 957 const sql::Statement& statement, OnlineWhiteListRecord* record) { | 979 const sql::Statement& statement, OnlineWhiteListRecord* record) { |
| 958 record->cache_id = statement.ColumnInt64(0); | 980 record->cache_id = statement.ColumnInt64(0); |
| 959 record->namespace_url = GURL(statement.ColumnString(1)); | 981 record->namespace_url = GURL(statement.ColumnString(1)); |
| 960 record->is_pattern = statement.ColumnBool(2); | 982 record->is_pattern = statement.ColumnBool(2); |
| 961 } | 983 } |
| 962 | 984 |
| 963 bool AppCacheDatabase::LazyOpen(bool create_if_needed) { | 985 bool AppCacheDatabase::LazyOpen(bool create_if_needed) { |
| (...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1175 | 1197 |
| 1176 // So we can't go recursive. | 1198 // So we can't go recursive. |
| 1177 if (is_recreating_) | 1199 if (is_recreating_) |
| 1178 return false; | 1200 return false; |
| 1179 | 1201 |
| 1180 base::AutoReset<bool> auto_reset(&is_recreating_, true); | 1202 base::AutoReset<bool> auto_reset(&is_recreating_, true); |
| 1181 return LazyOpen(true); | 1203 return LazyOpen(true); |
| 1182 } | 1204 } |
| 1183 | 1205 |
| 1184 } // namespace appcache | 1206 } // namespace appcache |
| OLD | NEW |