Add internal api to upgrade notification db 19/323219/1
authorSukhyungKang <shine.kang@samsung.com>
Thu, 24 Apr 2025 08:04:22 +0000 (17:04 +0900)
committerSukhyungKang <shine.kang@samsung.com>
Thu, 24 Apr 2025 08:04:22 +0000 (17:04 +0900)
Change-Id: I3f799b71478b3b0699f7be56e48fe7e7f584407c
Signed-off-by: SukhyungKang <shine.kang@samsung.com>
notification/include/notification_db.h
notification/src/notification_db.c
notification/src/notification_db_query.h

index 86936daabed64d3649a2f7179208ada8a7c1508d..f938debb358ca2f18353bd50b156a4c2740ef939 100644 (file)
@@ -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
index 2c94516f4e6a36f164a17a3ffb2078b059d17fe6..d7eb67028af0c8729f4d1ea522d08f1fb862fc5f 100644 (file)
@@ -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;
+}
index 9b0fd96791be2faca357eb9138e2f95a02df07dc..b7d340a34769f1540ce5fd8e13d1696faba9cea1 100644 (file)
@@ -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" \
        "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); \