| Index: chrome/browser/extensions/activity_actions.cc
|
| ===================================================================
|
| --- chrome/browser/extensions/activity_actions.cc (revision 181016)
|
| +++ chrome/browser/extensions/activity_actions.cc (working copy)
|
| @@ -6,199 +6,40 @@
|
| #include "base/logging.h"
|
| #include "base/stringprintf.h"
|
| #include "chrome/browser/extensions/api_actions.h"
|
| -#include "content/public/browser/browser_thread.h"
|
|
|
| -using content::BrowserThread;
|
| -
|
| namespace extensions {
|
|
|
| -const char* APIAction::kTableName = "activitylog_apis";
|
| -const char* APIAction::kTableStructure = "("
|
| - "extension_id LONGVARCHAR NOT NULL, "
|
| - "time INTEGER NOT NULL, "
|
| - "api_type LONGVARCHAR NOT NULL, "
|
| - "api_action_type LONGVARCHAR NOT NULL, "
|
| - "target_type LONGVARCHAR NOT NULL, "
|
| - "api_call LONGVARCHAR NOT NULL, "
|
| - "extra LONGVARCHAR NOT NULL)";
|
| -
|
| -APIAction::APIAction(const std::string& extension_id,
|
| - const base::Time& time,
|
| - const Type type,
|
| - const Verb verb,
|
| - const Target target,
|
| - const std::string& api_call,
|
| - const std::string& extra)
|
| - : extension_id_(extension_id),
|
| - time_(time),
|
| - type_(type),
|
| - verb_(verb),
|
| - target_(target),
|
| - api_call_(api_call),
|
| - extra_(extra) { }
|
| -
|
| -APIAction::~APIAction() {
|
| -}
|
| -
|
| // static
|
| -bool APIAction::InitializeTable(sql::Connection* db) {
|
| - if (!db->DoesTableExist(kTableName)) {
|
| +bool Action::InitializeTableInternal(sql::Connection* db,
|
| + const char* table_name,
|
| + const char* basic_fields,
|
| + const char* content_fields[],
|
| + const int num_content_fields) {
|
| + if (!db->DoesTableExist(table_name)) {
|
| std::string table_creator = base::StringPrintf(
|
| - "CREATE TABLE %s %s", kTableName, kTableStructure);
|
| + "CREATE TABLE %s (%s", table_name, basic_fields);
|
| + for (int i = 0; i < num_content_fields; i++) {
|
| + table_creator += base::StringPrintf(", %s LONGVARCHAR",
|
| + content_fields[i]);
|
| + }
|
| + table_creator += ")";
|
| if (!db->Execute(table_creator.c_str()))
|
| return false;
|
| - } else if (!db->DoesColumnExist(kTableName, "api_type")) {
|
| - // Old versions of the table lack the api_type column. Add it if
|
| - // needed, with values defaulting to "CALL".
|
| - //
|
| - // TODO(mvrable): Remove this update code once we're fairly certain that
|
| - // everyone will have converted to the new schema.
|
| - std::string table_updater = base::StringPrintf(
|
| - "ALTER TABLE %s ADD COLUMN api_type LONGVARCHAR; "
|
| - "UPDATE %s SET api_type = 'CALL'",
|
| - kTableName, kTableName);
|
| - if (!db->Execute(table_updater.c_str()))
|
| - return false;
|
| + } else {
|
| + // In case we ever want to add new fields, this initializes them to be
|
| + // empty strings.
|
| + for (int i = 0; i < num_content_fields; i++) {
|
| + if (!db->DoesColumnExist(table_name, content_fields[i])) {
|
| + std::string table_updater = base::StringPrintf(
|
| + "ALTER TABLE %s ADD COLUMN %s LONGVARCHAR; ",
|
| + table_name,
|
| + content_fields[i]);
|
| + if (!db->Execute(table_updater.c_str()))
|
| + return false;
|
| + }
|
| + }
|
| }
|
| return true;
|
| }
|
|
|
| -void APIAction::Record(sql::Connection* db) {
|
| - std::string sql_str = "INSERT INTO " + std::string(kTableName)
|
| - + " (extension_id, time, api_type, api_action_type, target_type,"
|
| - " api_call, extra) VALUES (?,?,?,?,?,?,?)";
|
| - sql::Statement statement(db->GetCachedStatement(
|
| - sql::StatementID(SQL_FROM_HERE), sql_str.c_str()));
|
| - statement.BindString(0, extension_id_);
|
| - statement.BindInt64(1, time_.ToInternalValue());
|
| - statement.BindString(2, TypeAsString());
|
| - statement.BindString(3, VerbAsString());
|
| - statement.BindString(4, TargetAsString());
|
| - statement.BindString(5, api_call_);
|
| - statement.BindString(6, extra_);
|
| -
|
| - if (!statement.Run())
|
| - LOG(ERROR) << "Activity log database I/O failed: " << sql_str;
|
| -}
|
| -
|
| -std::string APIAction::PrettyPrintFori18n() {
|
| - // TODO(felt): implement this for real when the UI is redesigned.
|
| - return PrettyPrintForDebug();
|
| -}
|
| -
|
| -std::string APIAction::PrettyPrintForDebug() {
|
| - // TODO(felt): implement this for real when the UI is redesigned.
|
| - return "ID: " + extension_id_ + + ", CATEGORY: " + TypeAsString() +
|
| - ", VERB: " + VerbAsString() + ", TARGET: " + TargetAsString() +
|
| - ", API: " + api_call_;
|
| -}
|
| -
|
| -std::string APIAction::TypeAsString() const {
|
| - switch (type_) {
|
| - case CALL:
|
| - return "CALL";
|
| - case EVENT_CALLBACK:
|
| - return "EVENT_CALLBACK";
|
| - default:
|
| - return "UNKNOWN_TYPE";
|
| - }
|
| -}
|
| -
|
| -std::string APIAction::VerbAsString() const {
|
| - switch (verb_) {
|
| - case READ:
|
| - return "READ";
|
| - case MODIFIED:
|
| - return "MODIFIED";
|
| - case DELETED:
|
| - return "DELETED";
|
| - case ADDED:
|
| - return "ADDED";
|
| - case ENABLED:
|
| - return "ENABLED";
|
| - case DISABLED:
|
| - return "DISABLED";
|
| - case CREATED:
|
| - return "CREATED";
|
| - default:
|
| - return "UNKNOWN_VERB";
|
| - }
|
| -}
|
| -
|
| -std::string APIAction::TargetAsString() const {
|
| - switch (target_) {
|
| - case BOOKMARK:
|
| - return "BOOKMARK";
|
| - case TABS:
|
| - return "TABS";
|
| - case HISTORY:
|
| - return "HISTORY";
|
| - case COOKIES:
|
| - return "COOKIES";
|
| - case BROWSER_ACTION:
|
| - return "BROWSER_ACTION";
|
| - case NOTIFICATION:
|
| - return "NOTIFICATION";
|
| - case OMNIBOX:
|
| - return "OMNIBOX";
|
| - default:
|
| - return "UNKNOWN_TARGET";
|
| - }
|
| -}
|
| -
|
| -APIAction::Type APIAction::StringAsType(
|
| - const std::string& str) {
|
| - if (str == "CALL") {
|
| - return CALL;
|
| - } else if (str == "EVENT_CALLBACK") {
|
| - return EVENT_CALLBACK;
|
| - } else {
|
| - return UNKNOWN_TYPE;
|
| - }
|
| -}
|
| -
|
| -APIAction::Verb APIAction::StringAsVerb(
|
| - const std::string& str) {
|
| - if (str == "READ") {
|
| - return READ;
|
| - } else if (str == "MODIFIED") {
|
| - return MODIFIED;
|
| - } else if (str == "DELETED") {
|
| - return DELETED;
|
| - } else if (str == "ADDED") {
|
| - return ADDED;
|
| - } else if (str == "ENABLED") {
|
| - return ENABLED;
|
| - } else if (str == "DISABLED") {
|
| - return DISABLED;
|
| - } else if (str == "CREATED") {
|
| - return CREATED;
|
| - } else {
|
| - return UNKNOWN_VERB;
|
| - }
|
| -}
|
| -
|
| -// The all-caps strings match the enum names. The lowercase strings match the
|
| -// actual object names (e.g., cookies.remove(...);).
|
| -APIAction::Target APIAction::StringAsTarget(
|
| - const std::string& str) {
|
| - if (str == "BOOKMARK" || str == "bookmark") {
|
| - return BOOKMARK;
|
| - } else if (str == "TABS" || str == "tabs") {
|
| - return TABS;
|
| - } else if (str == "HISTORY" || str == "history") {
|
| - return HISTORY;
|
| - } else if (str == "COOKIES" || str == "cookies") {
|
| - return COOKIES;
|
| - } else if (str == "BROWSER_ACTION" || str == "browser_action") {
|
| - return BROWSER_ACTION;
|
| - } else if (str == "NOTIFICATION" || str == "notification") {
|
| - return NOTIFICATION;
|
| - } else if (str == "OMNIBOX" || str == "omnibox") {
|
| - return OMNIBOX;
|
| - } else {
|
| - return UNKNOWN_TARGET;
|
| - }
|
| -}
|
| -
|
| } // namespace extensions
|
|
|