1// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/webdata/logins_table.h"
6
7#include "app/sql/statement.h"
8#include "base/logging.h"
9#include "base/time.h"
10#include "base/utf_string_conversions.h"
11#include "chrome/browser/password_manager/ie7_password.h"
12
13bool LoginsTable::AddIE7Login(const IE7PasswordInfo& info) {
14  sql::Statement s(db_->GetUniqueStatement(
15      "INSERT OR REPLACE INTO ie7_logins "
16      "(url_hash, password_value, date_created) "
17      "VALUES (?,?,?)"));
18  if (!s) {
19    NOTREACHED() << db_->GetErrorMessage();
20    return false;
21  }
22
23  s.BindString(0, WideToUTF8(info.url_hash));
24  s.BindBlob(1, &info.encrypted_data.front(),
25             static_cast<int>(info.encrypted_data.size()));
26  s.BindInt64(2, info.date_created.ToTimeT());
27  if (!s.Run()) {
28    NOTREACHED();
29    return false;
30  }
31  return true;
32}
33
34bool LoginsTable::RemoveIE7Login(const IE7PasswordInfo& info) {
35  // Remove a login by UNIQUE-constrained fields.
36  sql::Statement s(db_->GetUniqueStatement(
37      "DELETE FROM ie7_logins WHERE url_hash = ?"));
38  if (!s) {
39    NOTREACHED() << db_->GetErrorMessage();
40    return false;
41  }
42  s.BindString(0, WideToUTF8(info.url_hash));
43
44  if (!s.Run()) {
45    NOTREACHED();
46    return false;
47  }
48  return true;
49}
50
51bool LoginsTable::GetIE7Login(const IE7PasswordInfo& info,
52                              IE7PasswordInfo* result) {
53  DCHECK(result);
54  sql::Statement s(db_->GetUniqueStatement(
55      "SELECT password_value, date_created FROM ie7_logins "
56      "WHERE url_hash == ? "));
57  if (!s) {
58    NOTREACHED() << db_->GetErrorMessage();
59    return false;
60  }
61
62  s.BindString(0, WideToUTF8(info.url_hash));
63  if (s.Step()) {
64    s.ColumnBlobAsVector(0, &result->encrypted_data);
65    result->date_created = base::Time::FromTimeT(s.ColumnInt64(1));
66    result->url_hash = info.url_hash;
67  }
68  return s.Succeeded();
69}
70