From: SukhyungKang Date: Thu, 24 Apr 2025 08:04:22 +0000 (+0900) Subject: Add internal api to upgrade notification db X-Git-Tag: accepted/tizen/9.0/unified/20250429.162850~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f472c7e612940dcab6cf9a09e7bb7e9bd8b13b99;p=platform%2Fcore%2Fapi%2Fnotification.git Add internal api to upgrade notification db Change-Id: I3f799b71478b3b0699f7be56e48fe7e7f584407c Signed-off-by: SukhyungKang --- diff --git a/notification/include/notification_db.h b/notification/include/notification_db.h index 86936daa..f938debb 100644 --- a/notification/include/notification_db.h +++ b/notification/include/notification_db.h @@ -37,6 +37,8 @@ char *notification_db_column_text(sqlite3_stmt *stmt, int col); bundle *notification_db_column_bundle(sqlite3_stmt *stmt, int col); int notification_db_init(void); +int notification_upgrade_db(void); + #ifdef __cplusplus } #endif diff --git a/notification/src/notification_db.c b/notification/src/notification_db.c index 2c94516f..d7eb6702 100644 --- a/notification/src/notification_db.c +++ b/notification/src/notification_db.c @@ -227,3 +227,174 @@ bundle *notification_db_column_bundle(sqlite3_stmt *stmt, int col) return bundle_decode(col_bundle, strlen((char *)col_bundle)); } +/* db upgrade sequece*/ +static int __check_db_version(sqlite3 *db) { + int ret; + int result; + sqlite3_stmt *stmt = NULL; + + WARN("@@ __check_db_version"); + + ret = sqlite3_prepare_v2(db, "PRAGMA user_version", -1, &stmt, NULL); + if (ret != SQLITE_OK) { + ERR("@@ Failed to sqlite3_prepare_v2[%d][%s]", + ret, sqlite3_errmsg(db)); + return -1; + } + + ret = sqlite3_step(stmt); + if (ret == SQLITE_ROW) + result = sqlite3_column_int(stmt, 0); + else + result = 0; + + WARN("@@ db version : %d", result); + + if (stmt) + sqlite3_finalize(stmt); + + if (result != DB_VERSION) { + WARN("@@ db is not latest version"); + return -1; + } + + return 0; +} + +static int __upgrade_noti_table(sqlite3 *db) { + int ret; + char *errmsg = NULL; + + WARN("@@ upgrade noti list"); + + ret = sqlite3_table_column_metadata(db, NULL, "noti_list", + "b_event_handler_click_on_button_7", NULL, NULL, NULL, NULL, NULL); + if (ret != SQLITE_OK) { + WARN("@@ btn column not exist"); + goto upgrade; + } + + ret = sqlite3_table_column_metadata(db, NULL, "noti_list", + "check_box", NULL, NULL, NULL, NULL, NULL); + if (ret == SQLITE_OK) { + WARN("@@ columns are exist"); + return NOTIFICATION_ERROR_NONE; + } + +upgrade: + ret = sqlite3_exec(db, NOTIFICATION_UPGRADE_DB, NULL, NULL, &errmsg); + if (ret != SQLITE_OK) { + ERR("@@ Failed to upgrade noti db[%d][%s]", ret, errmsg); + ret = NOTIFICATION_ERROR_FROM_DB; + } else { + ret = NOTIFICATION_ERROR_NONE; + } + + if (errmsg) + sqlite3_free(errmsg); + + WARN("@@ upgrade noti list done"); + + return ret; +} + +static int __upgrade_noti_template_table(sqlite3 *db) { + int ret; + char *errmsg = NULL; + + WARN("@@ upgrade noti templage"); + + ret = sqlite3_table_column_metadata(db, NULL, "noti_template", + "b_event_handler_click_on_button_7", NULL, NULL, NULL, NULL, NULL); + if (ret != SQLITE_OK) { + WARN("@@ btn column not exist"); + goto upgrade; + } + + ret = sqlite3_table_column_metadata(db, NULL, "noti_template", + "check_box", NULL, NULL, NULL, NULL, NULL); + if (ret == SQLITE_OK) { + WARN("@@ columns are exist"); + return NOTIFICATION_ERROR_NONE; + } + +upgrade: + ret = sqlite3_exec(db, NOTIFICATION_UPGRADE_TEMPLATE_DB, NULL, NULL, &errmsg); + if (ret != SQLITE_OK) { + ERR("@@ Failed to upgrade noti db[%d][%s]", ret, errmsg); + ret = NOTIFICATION_ERROR_FROM_DB; + } else { + ret = NOTIFICATION_ERROR_NONE; + } + + if (errmsg) + sqlite3_free(errmsg); + + WARN("@@ upgrade noti templage done"); + + return ret; +} + +EXPORT_API int notification_upgrade_db(void) +{ + sqlite3 *db; + int ret = NOTIFICATION_ERROR_NONE; + char *errmsg = NULL; + char *query = NULL; + + WARN("@@ upgrade db"); + + ret = sqlite3_open_v2(DBPATH, &db, SQLITE_OPEN_READWRITE, NULL); + if (ret != SQLITE_OK) { + ERR("@@ Failed to open db"); + ret = NOTIFICATION_ERROR_FROM_DB; + goto out; + } + + // 1. check version + if (__check_db_version(db) == 0) { + WARN("@@ db is latest version"); + ret = NOTIFICATION_ERROR_NONE; + goto out; + } + + // 2. run upgrade query + ret = __upgrade_noti_table(db); + if (ret != NOTIFICATION_ERROR_NONE) { + ERR("@@ Failed to upgrade noti table"); + goto out; + } + + ret = __upgrade_noti_template_table(db); + if (ret != NOTIFICATION_ERROR_NONE) { + ERR("@@ Failed to upgrade noti template table"); + goto out; + } + + // 3. set new version + query = sqlite3_mprintf("PRAGMA user_version=%d", DB_VERSION); + if (query == NULL) { + ERR("@@ Failed to set verion query"); + ret = NOTIFICATION_ERROR_OUT_OF_MEMORY; + goto out; + } + + ret = sqlite3_exec(db, query, NULL, NULL, &errmsg); + if (ret != SQLITE_OK) { + ERR("@@ Failed to ser user version[%d][%s]", ret, errmsg); + ret = NOTIFICATION_ERROR_FROM_DB; + } + WARN("@@ upgrade db done"); + +out: + if (errmsg) + sqlite3_free(errmsg); + + if (query) + sqlite3_free(query); + + if (db) + notification_db_close(&db); + + return NOTIFICATION_ERROR_NONE; +} diff --git a/notification/src/notification_db_query.h b/notification/src/notification_db_query.h index 9b0fd967..b7d340a3 100644 --- a/notification/src/notification_db_query.h +++ b/notification/src/notification_db_query.h @@ -18,6 +18,7 @@ #define NOTIFICATION_SETTING_DB_TABLE "notification_setting" #define NOTIFICATION_SYSTEM_SETTING_DB_TABLE "notification_system_setting" #define NOTIFICATION_DND_ALLOW_EXCEPTION "dnd_allow_exception" +#define DB_VERSION 2 #define CREATE_NOTIFICATION_TABLE \ "PRAGMA journal_mode = PERSIST;\n" \ @@ -319,6 +320,162 @@ "dnd_schedule_day, dnd_start_hour, dnd_start_min, dnd_end_hour, " \ "dnd_end_min, lock_screen_content_level" +#define NOTIFICATION_UPGRADE_DB \ + "DROP TABLE IF EXISTS noti_list_temp;\n" \ + "CREATE TABLE noti_list_temp (\n" \ + " type INTEGER NOT NULL,\n" \ + " layout INTEGER NOT NULL default 0,\n" \ + " pkg_id TEXT NOT NULL,\n" \ + " caller_app_id TEXT NOT NULL,\n" \ + " launch_app_id TEXT,\n" \ + " app_label TEXT,\n" \ + " image_path TEXT,\n" \ + " priv_image_path TEXT,\n" \ + " group_id INTEGER default 0,\n" \ + " internal_group_id INTEGER default 0,\n" \ + " priv_id INTEGER PRIMARY KEY AUTOINCREMENT,\n" \ + " title_key TEXT,\n" \ + " b_text TEXT,\n" \ + " b_key TEXT,\n" \ + " tag TEXT,\n" \ + " b_format_args TEXT,\n" \ + " num_format_args INTEGER default 0,\n" \ + " text_domain TEXT,\n" \ + " text_dir TEXT,\n" \ + " time INTEGER default 0,\n" \ + " insert_time INTEGER default 0,\n" \ + " args TEXT,\n" \ + " group_args TEXT,\n" \ + " b_execute_option TEXT,\n" \ + " b_service_responding TEXT,\n" \ + " b_service_single_launch TEXT,\n" \ + " b_service_multi_launch TEXT,\n" \ + " b_event_handler_click_on_button_1 TEXT,\n" \ + " b_event_handler_click_on_button_2 TEXT,\n" \ + " b_event_handler_click_on_button_3 TEXT,\n" \ + " b_event_handler_click_on_button_4 TEXT,\n" \ + " b_event_handler_click_on_button_5 TEXT,\n" \ + " b_event_handler_click_on_button_6 TEXT,\n" \ + " b_event_handler_click_on_icon TEXT,\n" \ + " b_event_handler_click_on_thumbnail TEXT,\n" \ + " b_event_handler_click_on_text_input_button TEXT,\n" \ + " b_event_handler_click_on_button_7 TEXT,\n" \ + " b_event_handler_click_on_button_8 TEXT,\n" \ + " b_event_handler_click_on_button_9 TEXT,\n" \ + " b_event_handler_click_on_button_10 TEXT,\n" \ + " sound_type INTEGER default 0,\n" \ + " sound_path TEXT,\n" \ + " priv_sound_path TEXT,\n" \ + " vibration_type INTEGER default 0,\n" \ + " vibration_path TEXT,\n" \ + " priv_vibration_path TEXT,\n" \ + " led_operation INTEGER default 0,\n" \ + " led_argb INTEGER default 0,\n" \ + " led_on_ms INTEGER default -1,\n" \ + " led_off_ms INTEGER default -1,\n" \ + " flags_for_property INTEGER default 0,\n" \ + " flag_simmode INTEGER default 0,\n" \ + " display_applist INTEGER,\n" \ + " progress_size DOUBLE default 0,\n" \ + " progress_percentage DOUBLE default 0,\n" \ + " ongoing_flag INTEGER default 0,\n" \ + " ongoing_value_type INTEGER default 0,\n" \ + " ongoing_current INTEGER default 0,\n" \ + " ongoing_duration INTEGER default 0,\n" \ + " auto_remove INTEGER default 1,\n" \ + " default_button_index INTEGER default 0,\n" \ + " hide_timeout INTEGER default 0,\n" \ + " delete_timeout INTEGER default 0,\n" \ + " text_input_max_length INTEGER default 0,\n" \ + " event_flag INTEGER default 0,\n" \ + " extension_image_size INTEGER default 0,\n" \ + " uid INTEGER,\n" \ + " check_box INTEGER DEFAULT 0,\n" \ + " check_box_value INTEGER DEFAULT 0 );\n" \ + " INSERT INTO noti_list_temp (type, layout, pkg_id, caller_app_id, launch_app_id, image_path, priv_image_path, group_id, internal_group_id, priv_id, title_key, b_text, b_key, tag, b_format_args, num_format_args, text_domain, text_dir, time, insert_time, args, group_args, b_execute_option, b_service_responding, b_service_single_launch, b_service_multi_launch, b_event_handler_click_on_button_1, b_event_handler_click_on_button_2, b_event_handler_click_on_button_3, b_event_handler_click_on_button_4, b_event_handler_click_on_button_5, b_event_handler_click_on_button_6, b_event_handler_click_on_icon, b_event_handler_click_on_thumbnail, b_event_handler_click_on_text_input_button, sound_type, sound_path, priv_sound_path, vibration_type, vibration_path, priv_vibration_path, led_operation, led_argb, led_on_ms, led_off_ms, flags_for_property, flag_simmode, display_applist, progress_size, progress_percentage, ongoing_flag, ongoing_value_type, ongoing_current, ongoing_duration, auto_remove, default_button_index, hide_timeout, delete_timeout, text_input_max_length, event_flag, extension_image_size, uid) \n" \ + " SELECT type, layout, pkg_id, caller_app_id, launch_app_id, image_path, priv_image_path, group_id, internal_group_id, priv_id, title_key, b_text, b_key, tag, b_format_args, num_format_args, text_domain, text_dir, time, insert_time, args, group_args, b_execute_option, b_service_responding, b_service_single_launch, b_service_multi_launch, b_event_handler_click_on_button_1, b_event_handler_click_on_button_2, b_event_handler_click_on_button_3, b_event_handler_click_on_button_4, b_event_handler_click_on_button_5, b_event_handler_click_on_button_6, b_event_handler_click_on_icon, b_event_handler_click_on_thumbnail, b_event_handler_click_on_text_input_button, sound_type, sound_path, priv_sound_path, vibration_type, vibration_path, priv_vibration_path, led_operation, led_argb, led_on_ms, led_off_ms, flags_for_property, flag_simmode, display_applist, progress_size, progress_percentage, ongoing_flag, ongoing_value_type, ongoing_current, ongoing_duration, auto_remove, default_button_index, hide_timeout, delete_timeout, text_input_max_length, event_flag, extension_image_size, uid FROM noti_list;\n" \ + " DROP TABLE noti_list;\n" \ + " ALTER TABLE noti_list_temp RENAME TO noti_list;\n" + +#define NOTIFICATION_UPGRADE_TEMPLATE_DB \ + "DROP TABLE IF EXISTS noti_template_temp;\n" \ + "CREATE TABLE noti_template_temp (\n" \ + " type INTEGER NOT NULL,\n" \ + " layout INTEGER NOT NULL default 0,\n" \ + " pkg_id TEXT NOT NULL,\n" \ + " caller_app_id TEXT NOT NULL,\n" \ + " launch_app_id TEXT,\n" \ + " app_label TEXT,\n" \ + " image_path TEXT,\n" \ + " priv_image_path TEXT,\n" \ + " group_id INTEGER default 0,\n" \ + " internal_group_id INTEGER default 0,\n" \ + " priv_id INTEGER PRIMARY KEY AUTOINCREMENT,\n" \ + " title_key TEXT,\n" \ + " b_text TEXT,\n" \ + " b_key TEXT,\n" \ + " tag TEXT,\n" \ + " b_format_args TEXT,\n" \ + " num_format_args INTEGER default 0,\n" \ + " text_domain TEXT,\n" \ + " text_dir TEXT,\n" \ + " time INTEGER default 0,\n" \ + " insert_time INTEGER default 0,\n" \ + " args TEXT,\n" \ + " group_args TEXT,\n" \ + " b_execute_option TEXT,\n" \ + " b_service_responding TEXT,\n" \ + " b_service_single_launch TEXT,\n" \ + " b_service_multi_launch TEXT,\n" \ + " b_event_handler_click_on_button_1 TEXT,\n" \ + " b_event_handler_click_on_button_2 TEXT,\n" \ + " b_event_handler_click_on_button_3 TEXT,\n" \ + " b_event_handler_click_on_button_4 TEXT,\n" \ + " b_event_handler_click_on_button_5 TEXT,\n" \ + " b_event_handler_click_on_button_6 TEXT,\n" \ + " b_event_handler_click_on_icon TEXT,\n" \ + " b_event_handler_click_on_thumbnail TEXT,\n" \ + " b_event_handler_click_on_text_input_button TEXT,\n" \ + " b_event_handler_click_on_button_7 TEXT,\n" \ + " b_event_handler_click_on_button_8 TEXT,\n" \ + " b_event_handler_click_on_button_9 TEXT,\n" \ + " b_event_handler_click_on_button_10 TEXT,\n" \ + " sound_type INTEGER default 0,\n" \ + " sound_path TEXT,\n" \ + " priv_sound_path TEXT,\n" \ + " vibration_type INTEGER default 0,\n" \ + " vibration_path TEXT,\n" \ + " priv_vibration_path TEXT,\n" \ + " led_operation INTEGER default 0,\n" \ + " led_argb INTEGER default 0,\n" \ + " led_on_ms INTEGER default -1,\n" \ + " led_off_ms INTEGER default -1,\n" \ + " flags_for_property INTEGER default 0,\n" \ + " flag_simmode INTEGER default 0,\n" \ + " display_applist INTEGER,\n" \ + " progress_size DOUBLE default 0,\n" \ + " progress_percentage DOUBLE default 0,\n" \ + " ongoing_flag INTEGER default 0,\n" \ + " ongoing_value_type INTEGER default 0,\n" \ + " ongoing_current INTEGER default 0,\n" \ + " ongoing_duration INTEGER default 0,\n" \ + " auto_remove INTEGER default 1,\n" \ + " default_button_index INTEGER default 0,\n" \ + " hide_timeout INTEGER default 0,\n" \ + " delete_timeout INTEGER default 0,\n" \ + " text_input_max_length INTEGER default 0,\n" \ + " event_flag INTEGER default 0,\n" \ + " extension_image_size INTEGER default 0,\n" \ + " uid INTEGER,\n" \ + " check_box INTEGER DEFAULT 0,\n" \ + " check_box_value INTEGER DEFAULT 0,\n" \ + " template_name TEXT,\n" \ + " UNIQUE (caller_app_id, template_name) );\n" \ + " INSERT INTO noti_template_temp (type, layout, pkg_id, caller_app_id, launch_app_id, image_path, priv_image_path, group_id, internal_group_id, priv_id, title_key, b_text, b_key, tag, b_format_args, num_format_args, text_domain, text_dir, time, insert_time, args, group_args, b_execute_option, b_service_responding, b_service_single_launch, b_service_multi_launch, b_event_handler_click_on_button_1, b_event_handler_click_on_button_2, b_event_handler_click_on_button_3, b_event_handler_click_on_button_4, b_event_handler_click_on_button_5, b_event_handler_click_on_button_6, b_event_handler_click_on_icon, b_event_handler_click_on_thumbnail, b_event_handler_click_on_text_input_button, sound_type, sound_path, priv_sound_path, vibration_type, vibration_path, priv_vibration_path, led_operation, led_argb, led_on_ms, led_off_ms, flags_for_property, flag_simmode, display_applist, progress_size, progress_percentage, ongoing_flag, ongoing_value_type, ongoing_current, ongoing_duration, auto_remove, default_button_index, hide_timeout, delete_timeout, text_input_max_length, event_flag, extension_image_size, uid) \n" \ + " SELECT type, layout, pkg_id, caller_app_id, launch_app_id, image_path, priv_image_path, group_id, internal_group_id, priv_id, title_key, b_text, b_key, tag, b_format_args, num_format_args, text_domain, text_dir, time, insert_time, args, group_args, b_execute_option, b_service_responding, b_service_single_launch, b_service_multi_launch, b_event_handler_click_on_button_1, b_event_handler_click_on_button_2, b_event_handler_click_on_button_3, b_event_handler_click_on_button_4, b_event_handler_click_on_button_5, b_event_handler_click_on_button_6, b_event_handler_click_on_icon, b_event_handler_click_on_thumbnail, b_event_handler_click_on_text_input_button, sound_type, sound_path, priv_sound_path, vibration_type, vibration_path, priv_vibration_path, led_operation, led_argb, led_on_ms, led_off_ms, flags_for_property, flag_simmode, display_applist, progress_size, progress_percentage, ongoing_flag, ongoing_value_type, ongoing_current, ongoing_duration, auto_remove, default_button_index, hide_timeout, delete_timeout, text_input_max_length, event_flag, extension_image_size, uid FROM noti_template;\n" \ + " DROP TABLE noti_template;\n" \ + " ALTER TABLE noti_template_temp RENAME TO noti_template;\n" + #define __BIND_TEXT(db, stmt, i, text, ret, label) \ do { \ ret = sqlite3_bind_text(stmt, i, text, -1, SQLITE_TRANSIENT); \