15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/webdata/logins_table.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <limits> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "components/webdata/common/web_database.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sql/statement.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebDatabaseTable::TypeKey GetKey() { 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // We just need a unique constant. Use the address of a static that 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // COMDAT folding won't touch in an optimizing linker. 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static int table_key = 0; 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return reinterpret_cast<void*>(&table_key); 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LoginsTable* LoginsTable::FromWebDatabase(WebDatabase* db) { 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return static_cast<LoginsTable*>(db->GetTable(GetKey())); 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebDatabaseTable::TypeKey LoginsTable::GetTypeKey() const { 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GetKey(); 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 32effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochbool LoginsTable::CreateTablesIfNecessary() { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (db_->DoesTableExist("logins")) { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We don't check for success. It doesn't matter that much. 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we fail we'll just try again later anyway. 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ignore_result(db_->Execute("DROP TABLE logins")); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!db_->DoesTableExist("ie7_logins")) { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!db_->Execute("CREATE TABLE ie7_logins (" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "url_hash VARCHAR NOT NULL, " 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "password_value BLOB, " 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "date_created INTEGER NOT NULL," 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "UNIQUE " 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "(url_hash))")) { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!db_->Execute("CREATE INDEX ie7_logins_hash ON " 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ie7_logins (url_hash)")) { 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool LoginsTable::IsSyncable() { 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LoginsTable::MigrateToVersion(int version, 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool* update_compatible_version) { 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 69