Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(282)

Side by Side Diff: chrome/browser/extensions/activity_actions.cc

Issue 12207060: Alter the ActivityLog db table schemas. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: trying the upload again Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 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 <string> 5 #include <string>
6 #include "base/logging.h" 6 #include "base/logging.h"
7 #include "base/stringprintf.h" 7 #include "base/stringprintf.h"
8 #include "chrome/browser/extensions/api_actions.h" 8 #include "chrome/browser/extensions/api_actions.h"
9 #include "content/public/browser/browser_thread.h"
10
11 using content::BrowserThread;
12 9
13 namespace extensions { 10 namespace extensions {
14 11
15 const char* APIAction::kTableName = "activitylog_apis";
16 const char* APIAction::kTableStructure = "("
17 "extension_id LONGVARCHAR NOT NULL, "
18 "time INTEGER NOT NULL, "
19 "api_type LONGVARCHAR NOT NULL, "
20 "api_action_type LONGVARCHAR NOT NULL, "
21 "target_type LONGVARCHAR NOT NULL, "
22 "api_call LONGVARCHAR NOT NULL, "
23 "extra LONGVARCHAR NOT NULL)";
24
25 APIAction::APIAction(const std::string& extension_id,
26 const base::Time& time,
27 const Type type,
28 const Verb verb,
29 const Target target,
30 const std::string& api_call,
31 const std::string& extra)
32 : extension_id_(extension_id),
33 time_(time),
34 type_(type),
35 verb_(verb),
36 target_(target),
37 api_call_(api_call),
38 extra_(extra) { }
39
40 APIAction::~APIAction() {
41 }
42
43 // static 12 // static
44 bool APIAction::InitializeTable(sql::Connection* db) { 13 bool Action::InitializeTableInternal(sql::Connection* db,
45 if (!db->DoesTableExist(kTableName)) { 14 const char* table_name,
15 const char* basic_fields,
16 const char* content_fields[],
17 const int num_content_fields) {
18 if (!db->DoesTableExist(table_name)) {
46 std::string table_creator = base::StringPrintf( 19 std::string table_creator = base::StringPrintf(
47 "CREATE TABLE %s %s", kTableName, kTableStructure); 20 "CREATE TABLE %s (%s", table_name, basic_fields);
21 for (int i = 0; i < num_content_fields; i++) {
22 table_creator += base::StringPrintf(", %s LONGVARCHAR",
23 content_fields[i]);
24 }
25 table_creator += ")";
48 if (!db->Execute(table_creator.c_str())) 26 if (!db->Execute(table_creator.c_str()))
49 return false; 27 return false;
50 } else if (!db->DoesColumnExist(kTableName, "api_type")) { 28 } else {
51 // Old versions of the table lack the api_type column. Add it if 29 // In case we ever want to add new fields, this initializes them to be
52 // needed, with values defaulting to "CALL". 30 // empty strings.
53 // 31 for (int i = 0; i < num_content_fields; i++) {
54 // TODO(mvrable): Remove this update code once we're fairly certain that 32 if (!db->DoesColumnExist(table_name, content_fields[i])) {
55 // everyone will have converted to the new schema. 33 std::string table_updater = base::StringPrintf(
56 std::string table_updater = base::StringPrintf( 34 "ALTER TABLE %s ADD COLUMN %s LONGVARCHAR; ",
57 "ALTER TABLE %s ADD COLUMN api_type LONGVARCHAR; " 35 table_name,
58 "UPDATE %s SET api_type = 'CALL'", 36 content_fields[i]);
59 kTableName, kTableName); 37 if (!db->Execute(table_updater.c_str()))
60 if (!db->Execute(table_updater.c_str())) 38 return false;
61 return false; 39 }
40 }
62 } 41 }
63 return true; 42 return true;
64 } 43 }
65 44
66 void APIAction::Record(sql::Connection* db) {
67 std::string sql_str = "INSERT INTO " + std::string(kTableName)
68 + " (extension_id, time, api_type, api_action_type, target_type,"
69 " api_call, extra) VALUES (?,?,?,?,?,?,?)";
70 sql::Statement statement(db->GetCachedStatement(
71 sql::StatementID(SQL_FROM_HERE), sql_str.c_str()));
72 statement.BindString(0, extension_id_);
73 statement.BindInt64(1, time_.ToInternalValue());
74 statement.BindString(2, TypeAsString());
75 statement.BindString(3, VerbAsString());
76 statement.BindString(4, TargetAsString());
77 statement.BindString(5, api_call_);
78 statement.BindString(6, extra_);
79
80 if (!statement.Run())
81 LOG(ERROR) << "Activity log database I/O failed: " << sql_str;
82 }
83
84 std::string APIAction::PrettyPrintFori18n() {
85 // TODO(felt): implement this for real when the UI is redesigned.
86 return PrettyPrintForDebug();
87 }
88
89 std::string APIAction::PrettyPrintForDebug() {
90 // TODO(felt): implement this for real when the UI is redesigned.
91 return "ID: " + extension_id_ + + ", CATEGORY: " + TypeAsString() +
92 ", VERB: " + VerbAsString() + ", TARGET: " + TargetAsString() +
93 ", API: " + api_call_;
94 }
95
96 std::string APIAction::TypeAsString() const {
97 switch (type_) {
98 case CALL:
99 return "CALL";
100 case EVENT_CALLBACK:
101 return "EVENT_CALLBACK";
102 default:
103 return "UNKNOWN_TYPE";
104 }
105 }
106
107 std::string APIAction::VerbAsString() const {
108 switch (verb_) {
109 case READ:
110 return "READ";
111 case MODIFIED:
112 return "MODIFIED";
113 case DELETED:
114 return "DELETED";
115 case ADDED:
116 return "ADDED";
117 case ENABLED:
118 return "ENABLED";
119 case DISABLED:
120 return "DISABLED";
121 case CREATED:
122 return "CREATED";
123 default:
124 return "UNKNOWN_VERB";
125 }
126 }
127
128 std::string APIAction::TargetAsString() const {
129 switch (target_) {
130 case BOOKMARK:
131 return "BOOKMARK";
132 case TABS:
133 return "TABS";
134 case HISTORY:
135 return "HISTORY";
136 case COOKIES:
137 return "COOKIES";
138 case BROWSER_ACTION:
139 return "BROWSER_ACTION";
140 case NOTIFICATION:
141 return "NOTIFICATION";
142 case OMNIBOX:
143 return "OMNIBOX";
144 default:
145 return "UNKNOWN_TARGET";
146 }
147 }
148
149 APIAction::Type APIAction::StringAsType(
150 const std::string& str) {
151 if (str == "CALL") {
152 return CALL;
153 } else if (str == "EVENT_CALLBACK") {
154 return EVENT_CALLBACK;
155 } else {
156 return UNKNOWN_TYPE;
157 }
158 }
159
160 APIAction::Verb APIAction::StringAsVerb(
161 const std::string& str) {
162 if (str == "READ") {
163 return READ;
164 } else if (str == "MODIFIED") {
165 return MODIFIED;
166 } else if (str == "DELETED") {
167 return DELETED;
168 } else if (str == "ADDED") {
169 return ADDED;
170 } else if (str == "ENABLED") {
171 return ENABLED;
172 } else if (str == "DISABLED") {
173 return DISABLED;
174 } else if (str == "CREATED") {
175 return CREATED;
176 } else {
177 return UNKNOWN_VERB;
178 }
179 }
180
181 // The all-caps strings match the enum names. The lowercase strings match the
182 // actual object names (e.g., cookies.remove(...);).
183 APIAction::Target APIAction::StringAsTarget(
184 const std::string& str) {
185 if (str == "BOOKMARK" || str == "bookmark") {
186 return BOOKMARK;
187 } else if (str == "TABS" || str == "tabs") {
188 return TABS;
189 } else if (str == "HISTORY" || str == "history") {
190 return HISTORY;
191 } else if (str == "COOKIES" || str == "cookies") {
192 return COOKIES;
193 } else if (str == "BROWSER_ACTION" || str == "browser_action") {
194 return BROWSER_ACTION;
195 } else if (str == "NOTIFICATION" || str == "notification") {
196 return NOTIFICATION;
197 } else if (str == "OMNIBOX" || str == "omnibox") {
198 return OMNIBOX;
199 } else {
200 return UNKNOWN_TARGET;
201 }
202 }
203
204 } // namespace extensions 45 } // namespace extensions
OLDNEW
« no previous file with comments | « chrome/browser/extensions/activity_actions.h ('k') | chrome/browser/extensions/activity_database.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698