2 * Copyright (c) 2000 - 2016 Samsung Electronics Co., Ltd. All rights reserved.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
25 #include <tzplatform_config.h>
27 #include <notification_error.h>
28 #include <notification_debug.h>
29 #include <notification_db.h>
31 #define NOTIFICATION_DB_NAME ".notification.db"
32 #define CREATE_NOTIFICATION_TABLE " \
33 PRAGMA journal_mode = PERSIST; \
34 PRAGMA synchronous = FULL; \
35 create table if not exists noti_list ( \
36 type INTEGER NOT NULL, \
37 layout INTEGER NOT NULL default 0, \
38 caller_pkgname TEXT NOT NULL, \
39 launch_pkgname TEXT, \
41 group_id INTEGER default 0, \
42 internal_group_id INTEGER default 0, \
43 priv_id INTEGER PRIMARY KEY AUTOINCREMENT, \
49 num_format_args INTEGER default 0, \
52 time INTEGER default 0, \
53 insert_time INTEGER default 0, \
56 b_execute_option TEXT, \
57 b_service_responding TEXT, \
58 b_service_single_launch TEXT, \
59 b_service_multi_launch TEXT, \
60 b_event_handler_click_on_button_1 TEXT, \
61 b_event_handler_click_on_button_2 TEXT, \
62 b_event_handler_click_on_button_3 TEXT, \
63 b_event_handler_click_on_button_4 TEXT, \
64 b_event_handler_click_on_button_5 TEXT, \
65 b_event_handler_click_on_button_6 TEXT, \
66 b_event_handler_click_on_icon TEXT, \
67 b_event_handler_click_on_thumbnail TEXT, \
68 sound_type INTEGER default 0, \
70 vibration_type INTEGER default 0, \
71 vibration_path TEXT, \
72 led_operation INTEGER default 0, \
73 led_argb INTEGER default 0, \
74 led_on_ms INTEGER default -1, \
75 led_off_ms INTEGER default -1, \
76 flags_for_property INTEGER default 0, \
77 flag_simmode INTEGER default 0, \
78 display_applist INTEGER, \
79 progress_size DOUBLE default 0, \
80 progress_percentage DOUBLE default 0, \
81 ongoing_flag INTEGER default 0, \
82 ongoing_value_type INTEGER default 0, \
83 ongoing_current INTEGER default 0, \
84 ongoing_duration INTEGER default 0, \
85 auto_remove INTEGER default 1, \
86 default_button_index INTEGER default 0, \
87 timeout INTEGER default 0, \
88 text_input_max_length INTEGER default 0, \
91 create table if not exists noti_group_data ( \
92 caller_pkgname TEXT NOT NULL, \
93 group_id INTEGER default 0, \
94 badge INTEGER default 0, \
99 count_display_title INTEGER, \
100 count_display_content INTEGER, \
101 rowid INTEGER PRIMARY KEY AUTOINCREMENT, \
102 UNIQUE (caller_pkgname, group_id) \
104 create table if not exists ongoing_list ( \
105 caller_pkgname TEXT NOT NULL, \
106 launch_pkgname TEXT, \
108 group_id INTEGER default 0, \
109 internal_group_id INTEGER default 0, \
110 priv_id INTERGER NOT NULL, \
113 default_content TEXT, \
116 loc_default_content TEXT, \
121 flag INTEGER default 0, \
122 progress_size DOUBLE default 0, \
123 progress_percentage DOUBLE default 0, \
124 rowid INTEGER PRIMARY KEY AUTOINCREMENT, \
125 UNIQUE (caller_pkgname, priv_id) \
127 CREATE TABLE IF NOT EXISTS notification_setting ( \
129 package_name TEXT NOT NULL, \
130 allow_to_notify INTEGER DEFAULT 1, \
131 do_not_disturb_except INTEGER DEFAULT 0, \
132 visibility_class INTEGER DEFAULT 0, \
133 pop_up_notification INTEGER DEFAULT 1, \
134 lock_screen_content_level INTEGER DEFAULT 0, \
135 UNIQUE (uid, package_name) \
137 CREATE TABLE IF NOT EXISTS notification_system_setting ( \
139 do_not_disturb INTEGER DEFAULT 0, \
140 visibility_class INTEGER DEFAULT 0, \
141 dnd_schedule_enabled INTEGER DEFAULT 0, \
142 dnd_schedule_day INTEGER DEFAULT 62, \
143 dnd_start_hour INTEGER DEFAULT 22, \
144 dnd_start_min INTEGER DEFAULT 0, \
145 dnd_end_hour INTEGER DEFAULT 8, \
146 dnd_end_min INTEGER DEFAULT 0, \
147 lock_screen_content_level INTEGER DEFAULT 0, \
150 CREATE TABLE IF NOT EXISTS dnd_allow_exception ( \
152 type INTEGER DEFAULT 0, \
153 value INTEGER DEFAULT 0, \
156 CREATE TABLE IF NOT EXISTS noti_template ( \
157 type INTEGER NOT NULL, \
158 layout INTEGER NOT NULL default 0, \
159 caller_pkgname TEXT NOT NULL, \
160 launch_pkgname TEXT, \
162 group_id INTEGER default 0, \
163 internal_group_id INTEGER default 0, \
164 priv_id INTEGER PRIMARY KEY AUTOINCREMENT, \
169 b_format_args TEXT, \
170 num_format_args INTEGER default 0, \
173 time INTEGER default 0, \
174 insert_time INTEGER default 0, \
177 b_execute_option TEXT, \
178 b_service_responding TEXT, \
179 b_service_single_launch TEXT, \
180 b_service_multi_launch TEXT, \
181 b_event_handler_click_on_button_1 TEXT, \
182 b_event_handler_click_on_button_2 TEXT, \
183 b_event_handler_click_on_button_3 TEXT, \
184 b_event_handler_click_on_button_4 TEXT, \
185 b_event_handler_click_on_button_5 TEXT, \
186 b_event_handler_click_on_button_6 TEXT, \
187 b_event_handler_click_on_icon TEXT, \
188 b_event_handler_click_on_thumbnail TEXT, \
189 sound_type INTEGER default 0, \
191 vibration_type INTEGER default 0, \
192 vibration_path TEXT, \
193 led_operation INTEGER default 0, \
194 led_argb INTEGER default 0, \
195 led_on_ms INTEGER default -1, \
196 led_off_ms INTEGER default -1, \
197 flags_for_property INTEGER default 0, \
198 flag_simmode INTEGER default 0, \
199 display_applist INTEGER, \
200 progress_size DOUBLE default 0, \
201 progress_percentage DOUBLE default 0, \
202 ongoing_flag INTEGER default 0, \
203 ongoing_value_type INTEGER default 0, \
204 ongoing_current INTEGER default 0, \
205 ongoing_duration INTEGER default 0, \
206 auto_remove INTEGER default 1, \
207 default_button_index INTEGER default 0, \
208 timeout INTEGER default 0, \
209 text_input_max_length INTEGER default 0, \
211 template_name TEXT, \
212 UNIQUE (caller_pkgname, template_name) \
216 EXPORT_API int notification_db_init()
221 char defname[FILENAME_MAX];
223 const char *db_path = tzplatform_getenv(TZ_SYS_DB);
224 if (db_path == NULL) {
225 NOTIFICATION_ERR("fail to get db_path"); /* LCOV_EXCL_LINE */
226 return NOTIFICATION_ERROR_OUT_OF_MEMORY;
228 snprintf(defname, sizeof(defname), "%s/%s", db_path, NOTIFICATION_DB_NAME);
230 NOTIFICATION_DBG("db path : %s", defname);
231 r = sqlite3_open_v2(defname, &db, SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE, NULL);
233 /* LCOV_EXCL_START */
235 NOTIFICATION_ERR("fail to open notification db %d", r);
236 return NOTIFICATION_ERROR_IO_ERROR;
239 query = sqlite3_mprintf(CREATE_NOTIFICATION_TABLE, tzplatform_getuid(TZ_SYS_DEFAULT_USER));
240 NOTIFICATION_DBG("@@@ query : %s", query);
242 r = sqlite3_exec(db, CREATE_NOTIFICATION_TABLE, NULL, NULL, &errmsg);
245 if (r != SQLITE_OK) {
246 /* LCOV_EXCL_START */
247 NOTIFICATION_ERR("query error(%d)(%s)", r, errmsg);
248 sqlite3_free(errmsg);
250 return NOTIFICATION_ERROR_IO_ERROR;
255 return NOTIFICATION_ERROR_NONE;
258 sqlite3 *notification_db_open(const char *dbfile)
263 ret = db_util_open(dbfile, &db, 0);
264 if (ret != SQLITE_OK) {
265 /* LCOV_EXCL_START */
266 if (ret == SQLITE_PERM)
267 set_last_result(NOTIFICATION_ERROR_PERMISSION_DENIED);
269 set_last_result(NOTIFICATION_ERROR_FROM_DB);
278 int notification_db_close(sqlite3 **db)
282 if (db == NULL || *db == NULL)
283 return NOTIFICATION_ERROR_INVALID_PARAMETER;
285 ret = db_util_close(*db);
286 if (ret != SQLITE_OK) {
287 /* LCOV_EXCL_START */
288 NOTIFICATION_ERR("DB close error(%d)", ret);
289 return NOTIFICATION_ERROR_FROM_DB;
295 return NOTIFICATION_ERROR_NONE;
298 int notification_db_exec(sqlite3 *db, const char *query, int *num_changes)
301 sqlite3_stmt *stmt = NULL;
304 return NOTIFICATION_ERROR_INVALID_PARAMETER;
307 return NOTIFICATION_ERROR_INVALID_PARAMETER;
309 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
310 if (ret != SQLITE_OK) {
311 /* LCOV_EXCL_START */
312 NOTIFICATION_ERR("DB err(%d) : %s", ret,
314 return NOTIFICATION_ERROR_FROM_DB;
319 ret = sqlite3_step(stmt);
320 if (ret == SQLITE_OK || ret == SQLITE_DONE) {
321 if (num_changes != NULL)
322 *num_changes = sqlite3_changes(db);
324 sqlite3_finalize(stmt);
326 /* LCOV_EXCL_START */
327 NOTIFICATION_ERR("DB err(%d) : %s", ret,
329 sqlite3_finalize(stmt);
330 return NOTIFICATION_ERROR_FROM_DB;
334 return NOTIFICATION_ERROR_FROM_DB;
337 return NOTIFICATION_ERROR_NONE;
340 char *notification_db_column_text(sqlite3_stmt * stmt, int col)
342 const unsigned char *col_text = NULL;
344 col_text = sqlite3_column_text(stmt, col);
345 if (col_text == NULL || col_text[0] == '\0')
348 return strdup((char *)col_text);
351 bundle *notification_db_column_bundle(sqlite3_stmt * stmt, int col)
353 const unsigned char *col_bundle = NULL;
355 col_bundle = sqlite3_column_text(stmt, col);
356 if (col_bundle == NULL || col_bundle[0] == '\0')
359 return bundle_decode(col_bundle, strlen((char *)col_bundle));