blob: 836e78dfbf849bbd5c62dd76f83869b6f5a5f428 [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/payments/content/payment_method_manifest_table.h"
#include <time.h>
#include "base/logging.h"
#include "base/time/time.h"
#include "components/webdata/common/web_database.h"
#include "sql/statement.h"
#include "sql/transaction.h"
namespace payments {
namespace {
// Data valid duration in seconds.
const time_t PAYMENT_METHOD_MANIFEST_VALID_TIME_IN_SECONDS = 90 * 24 * 60 * 60;
WebDatabaseTable::TypeKey GetPaymentMethodManifestKey() {
// We just need a unique constant. Use the address of a static that
// COMDAT folding won't touch in an optimizing linker.
static int table_key = 0;
return reinterpret_cast<void*>(&table_key);
}
} // namespace
PaymentMethodManifestTable::PaymentMethodManifestTable() {}
PaymentMethodManifestTable::~PaymentMethodManifestTable() {}
PaymentMethodManifestTable* PaymentMethodManifestTable::FromWebDatabase(
WebDatabase* db) {
return static_cast<PaymentMethodManifestTable*>(
db->GetTable(GetPaymentMethodManifestKey()));
}
WebDatabaseTable::TypeKey PaymentMethodManifestTable::GetTypeKey() const {
return GetPaymentMethodManifestKey();
}
bool PaymentMethodManifestTable::CreateTablesIfNecessary() {
if (!db_->Execute("CREATE TABLE IF NOT EXISTS payment_method_manifest ( "
"expire_date INTEGER NOT NULL DEFAULT 0, "
"method_name VARCHAR, "
"web_app_id VARCHAR) ")) {
NOTREACHED();
return false;
}
return true;
}
bool PaymentMethodManifestTable::IsSyncable() {
return false;
}
bool PaymentMethodManifestTable::MigrateToVersion(
int version,
bool* update_compatible_version) {
return true;
}
void PaymentMethodManifestTable::RemoveExpiredData() {
const time_t now_date_in_seconds = base::Time::NowFromSystemTime().ToTimeT();
sql::Statement s(db_->GetUniqueStatement(
"DELETE FROM payment_method_manifest WHERE expire_date < ? "));
s.BindInt64(0, now_date_in_seconds);
s.Run();
}
bool PaymentMethodManifestTable::AddManifest(
const std::string& payment_method,
const std::vector<std::string>& web_app_ids) {
sql::Transaction transaction(db_);
if (!transaction.Begin())
return false;
sql::Statement s1(db_->GetUniqueStatement(
"DELETE FROM payment_method_manifest WHERE method_name=? "));
s1.BindString(0, payment_method);
if (!s1.Run())
return false;
sql::Statement s2(
db_->GetUniqueStatement("INSERT INTO payment_method_manifest "
"(expire_date, method_name, web_app_id) "
"VALUES (?, ?, ?) "));
const time_t expire_date_in_seconds =
base::Time::NowFromSystemTime().ToTimeT() +
PAYMENT_METHOD_MANIFEST_VALID_TIME_IN_SECONDS;
for (const auto& id : web_app_ids) {
int index = 0;
s2.BindInt64(index++, expire_date_in_seconds);
s2.BindString(index++, payment_method);
s2.BindString(index, id);
if (!s2.Run())
return false;
s2.Reset(true);
}
if (!transaction.Commit())
return false;
return true;
}
std::vector<std::string> PaymentMethodManifestTable::GetManifest(
const std::string& payment_method) {
std::vector<std::string> web_app_ids;
sql::Statement s(
db_->GetUniqueStatement("SELECT web_app_id "
"FROM payment_method_manifest "
"WHERE method_name=?"));
s.BindString(0, payment_method);
while (s.Step()) {
web_app_ids.emplace_back(s.ColumnString(0));
}
return web_app_ids;
}
} // namespace payments