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 b_event_handler_click_on_text_input_button TEXT, \
69 sound_type INTEGER default 0, \
71 vibration_type INTEGER default 0, \
72 vibration_path TEXT, \
73 led_operation INTEGER default 0, \
74 led_argb INTEGER default 0, \
75 led_on_ms INTEGER default -1, \
76 led_off_ms INTEGER default -1, \
77 flags_for_property INTEGER default 0, \
78 flag_simmode INTEGER default 0, \
79 display_applist INTEGER, \
80 progress_size DOUBLE default 0, \
81 progress_percentage DOUBLE default 0, \
82 ongoing_flag INTEGER default 0, \
83 ongoing_value_type INTEGER default 0, \
84 ongoing_current INTEGER default 0, \
85 ongoing_duration INTEGER default 0, \
86 auto_remove INTEGER default 1, \
87 default_button_index INTEGER default 0, \
88 hide_timeout INTEGER default 0, \
89 delete_timeout INTEGER default 0, \
90 text_input_max_length INTEGER default 0, \
91 event_flag INTEGER default 0, \
92 extentsion_image_size INTEGER default 0, \
95 create table if not exists noti_group_data ( \
96 caller_pkgname TEXT NOT NULL, \
97 group_id INTEGER default 0, \
98 badge INTEGER default 0, \
103 count_display_title INTEGER, \
104 count_display_content INTEGER, \
105 rowid INTEGER PRIMARY KEY AUTOINCREMENT, \
106 UNIQUE (caller_pkgname, group_id) \
108 create table if not exists ongoing_list ( \
109 caller_pkgname TEXT NOT NULL, \
110 launch_pkgname TEXT, \
112 group_id INTEGER default 0, \
113 internal_group_id INTEGER default 0, \
114 priv_id INTERGER NOT NULL, \
117 default_content TEXT, \
120 loc_default_content TEXT, \
125 flag INTEGER default 0, \
126 progress_size DOUBLE default 0, \
127 progress_percentage DOUBLE default 0, \
128 rowid INTEGER PRIMARY KEY AUTOINCREMENT, \
129 UNIQUE (caller_pkgname, priv_id) \
131 CREATE TABLE IF NOT EXISTS notification_setting ( \
133 package_name TEXT NOT NULL, \
134 appid TEXT NOT NULL, \
135 allow_to_notify INTEGER DEFAULT 1, \
136 do_not_disturb_except INTEGER DEFAULT 0, \
137 visibility_class INTEGER DEFAULT 0, \
138 pop_up_notification INTEGER DEFAULT 1, \
139 lock_screen_content_level INTEGER DEFAULT 0, \
140 app_disabled INTEGER DEFAULT 0, \
141 UNIQUE (uid, package_name, appid) \
143 CREATE TABLE IF NOT EXISTS notification_system_setting ( \
145 do_not_disturb INTEGER DEFAULT 0, \
146 visibility_class INTEGER DEFAULT 0, \
147 dnd_schedule_enabled INTEGER DEFAULT 0, \
148 dnd_schedule_day INTEGER DEFAULT 62, \
149 dnd_start_hour INTEGER DEFAULT 22, \
150 dnd_start_min INTEGER DEFAULT 0, \
151 dnd_end_hour INTEGER DEFAULT 8, \
152 dnd_end_min INTEGER DEFAULT 0, \
153 lock_screen_content_level INTEGER DEFAULT 0, \
156 CREATE TABLE IF NOT EXISTS dnd_allow_exception ( \
158 type INTEGER DEFAULT 0, \
159 value INTEGER DEFAULT 0, \
162 CREATE TABLE IF NOT EXISTS noti_template ( \
163 type INTEGER NOT NULL, \
164 layout INTEGER NOT NULL default 0, \
165 caller_pkgname TEXT NOT NULL, \
166 launch_pkgname TEXT, \
168 group_id INTEGER default 0, \
169 internal_group_id INTEGER default 0, \
170 priv_id INTEGER PRIMARY KEY AUTOINCREMENT, \
175 b_format_args TEXT, \
176 num_format_args INTEGER default 0, \
179 time INTEGER default 0, \
180 insert_time INTEGER default 0, \
183 b_execute_option TEXT, \
184 b_service_responding TEXT, \
185 b_service_single_launch TEXT, \
186 b_service_multi_launch TEXT, \
187 b_event_handler_click_on_button_1 TEXT, \
188 b_event_handler_click_on_button_2 TEXT, \
189 b_event_handler_click_on_button_3 TEXT, \
190 b_event_handler_click_on_button_4 TEXT, \
191 b_event_handler_click_on_button_5 TEXT, \
192 b_event_handler_click_on_button_6 TEXT, \
193 b_event_handler_click_on_icon TEXT, \
194 b_event_handler_click_on_thumbnail TEXT, \
195 b_event_handler_click_on_text_input_button TEXT, \
196 sound_type INTEGER default 0, \
198 vibration_type INTEGER default 0, \
199 vibration_path TEXT, \
200 led_operation INTEGER default 0, \
201 led_argb INTEGER default 0, \
202 led_on_ms INTEGER default -1, \
203 led_off_ms INTEGER default -1, \
204 flags_for_property INTEGER default 0, \
205 flag_simmode INTEGER default 0, \
206 display_applist INTEGER, \
207 progress_size DOUBLE default 0, \
208 progress_percentage DOUBLE default 0, \
209 ongoing_flag INTEGER default 0, \
210 ongoing_value_type INTEGER default 0, \
211 ongoing_current INTEGER default 0, \
212 ongoing_duration INTEGER default 0, \
213 auto_remove INTEGER default 1, \
214 default_button_index INTEGER default 0, \
215 hide_timeout INTEGER default 0, \
216 delete_timeout INTEGER default 0, \
217 text_input_max_length INTEGER default 0, \
218 event_flag INTEGER default 0, \
219 extension_image_size INTEGER default 0, \
221 template_name TEXT, \
222 UNIQUE (caller_pkgname, template_name) \
226 EXPORT_API int notification_db_init()
231 char defname[FILENAME_MAX];
233 const char *db_path = tzplatform_getenv(TZ_SYS_DB);
234 if (db_path == NULL) {
235 NOTIFICATION_ERR("fail to get db_path"); /* LCOV_EXCL_LINE */
236 return NOTIFICATION_ERROR_OUT_OF_MEMORY;
238 snprintf(defname, sizeof(defname), "%s/%s", db_path, NOTIFICATION_DB_NAME);
240 NOTIFICATION_DBG("db path : %s", defname);
241 r = sqlite3_open_v2(defname, &db, SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE, NULL);
243 /* LCOV_EXCL_START */
245 NOTIFICATION_ERR("fail to open notification db %d", r);
246 return NOTIFICATION_ERROR_IO_ERROR;
249 query = sqlite3_mprintf(CREATE_NOTIFICATION_TABLE, tzplatform_getuid(TZ_SYS_DEFAULT_USER));
250 NOTIFICATION_DBG("@@@ query : %s", query);
252 r = sqlite3_exec(db, CREATE_NOTIFICATION_TABLE, NULL, NULL, &errmsg);
255 if (r != SQLITE_OK) {
256 /* LCOV_EXCL_START */
257 NOTIFICATION_ERR("query error(%d)(%s)", r, errmsg);
258 sqlite3_free(errmsg);
260 return NOTIFICATION_ERROR_IO_ERROR;
265 return NOTIFICATION_ERROR_NONE;
268 sqlite3 *notification_db_open(const char *dbfile)
273 ret = db_util_open(dbfile, &db, 0);
274 if (ret != SQLITE_OK) {
275 /* LCOV_EXCL_START */
276 if (ret == SQLITE_PERM)
277 set_last_result(NOTIFICATION_ERROR_PERMISSION_DENIED);
279 set_last_result(NOTIFICATION_ERROR_FROM_DB);
288 int notification_db_close(sqlite3 **db)
292 if (db == NULL || *db == NULL)
293 return NOTIFICATION_ERROR_INVALID_PARAMETER;
295 ret = db_util_close(*db);
296 if (ret != SQLITE_OK) {
297 /* LCOV_EXCL_START */
298 NOTIFICATION_ERR("DB close error(%d)", ret);
299 return NOTIFICATION_ERROR_FROM_DB;
305 return NOTIFICATION_ERROR_NONE;
308 int notification_db_exec(sqlite3 *db, const char *query, int *num_changes)
311 sqlite3_stmt *stmt = NULL;
314 return NOTIFICATION_ERROR_INVALID_PARAMETER;
317 return NOTIFICATION_ERROR_INVALID_PARAMETER;
319 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
320 if (ret != SQLITE_OK) {
321 /* LCOV_EXCL_START */
322 NOTIFICATION_ERR("DB err(%d) : %s", ret,
324 return NOTIFICATION_ERROR_FROM_DB;
329 ret = sqlite3_step(stmt);
330 if (ret == SQLITE_OK || ret == SQLITE_DONE) {
331 if (num_changes != NULL)
332 *num_changes = sqlite3_changes(db);
334 sqlite3_finalize(stmt);
336 /* LCOV_EXCL_START */
337 NOTIFICATION_ERR("DB err(%d) : %s", ret,
339 sqlite3_finalize(stmt);
340 return NOTIFICATION_ERROR_FROM_DB;
344 return NOTIFICATION_ERROR_FROM_DB;
347 return NOTIFICATION_ERROR_NONE;
350 char *notification_db_column_text(sqlite3_stmt * stmt, int col)
352 const unsigned char *col_text = NULL;
354 col_text = sqlite3_column_text(stmt, col);
355 if (col_text == NULL || col_text[0] == '\0')
358 return strdup((char *)col_text);
361 bundle *notification_db_column_bundle(sqlite3_stmt * stmt, int col)
363 const unsigned char *col_bundle = NULL;
365 col_bundle = sqlite3_column_text(stmt, col);
366 if (col_bundle == NULL || col_bundle[0] == '\0')
369 return bundle_decode(col_bundle, strlen((char *)col_bundle));