From 746ac7548ce420d4d5db3347546e1f8c0934161a Mon Sep 17 00:00:00 2001 From: Hwankyu Jhun Date: Mon, 18 Oct 2021 16:34:14 +0900 Subject: [PATCH] Add appsvc db upgrade script To upgrade database files properly, the user version is added to database files. From Tizen 6.5, the schema of the appsvc was changed. The invalid foreign key was removed. The 1_appsvc_db_upgrade.sh file is for upgrading the appsvc db file. Adds: - 501.appsvc_db_upgrade.sh - 1_appsvc_db_upgrade.sh Change-Id: I173929f757799d9e7bc25361a37b4a6e3847b9fd Signed-off-by: Hwankyu Jhun --- CMakeLists.txt | 12 +- data/{appsvc_db.sql => appsvc_db.sql.in} | 1 + packaging/aul.spec | 6 + parser/component/CMakeLists.txt | 6 + .../data/{component_db.sql => component_db.sql.in} | 1 + ...component-add.post => 14_component-add.post.in} | 1 + ...nent_upgrade.sh => 501.component_upgrade.sh.in} | 1 + scripts/501.appsvc_db_upgrade.sh.in | 79 +++++++++++ scripts/upgrade/1_appsvc_db_upgrade.sh.in | 144 +++++++++++++++++++++ tool/recovery/appsvc_db_recovery.c | 1 + tool/recovery/component_db_recovery.c | 1 + 11 files changed, 252 insertions(+), 1 deletion(-) rename data/{appsvc_db.sql => appsvc_db.sql.in} (95%) rename parser/component/data/{component_db.sql => component_db.sql.in} (93%) rename parser/component/script/{14_component-add.post => 14_component-add.post.in} (97%) rename parser/component/script/{501.component_upgrade.sh => 501.component_upgrade.sh.in} (97%) create mode 100755 scripts/501.appsvc_db_upgrade.sh.in create mode 100755 scripts/upgrade/1_appsvc_db_upgrade.sh.in diff --git a/CMakeLists.txt b/CMakeLists.txt index bc0e00a..4bc441d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,6 +10,9 @@ SET(EXEC_PREFIX "\${prefix}") ADD_DEFINITIONS("-DSHARE_PREFIX=\"${SHARE_INSTALL_PREFIX}/aul\"") +ADD_DEFINITIONS("-DAPPSVC_DB_VERSION=\"${APPSVC_DB_VERSION}\"") +ADD_DEFINITIONS("-DCOMPONENT_DB_VERSION=\"${COMPONENT_DB_VERSION}\"") + ## Compile flags SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wl,-zdefs -fvisibility=hidden -g -Wall -Werror -fpic ") SET(CMAKE_C_FLAGS_DEBUG "-O0 -g") @@ -116,7 +119,14 @@ INSTALL(TARGETS ${TARGET_AUL} DESTINATION ${LIB_INSTALL_DIR} COMPONENT RuntimeLi # pkgconfig file CONFIGURE_FILE(aul.pc.in aul.pc @ONLY) CONFIGURE_FILE(feature/preexec_list.txt.in feature/preexec_list.txt @ONLY) - +CONFIGURE_FILE(data/appsvc_db.sql.in data/appsvc_db.sql @ONLY) +CONFIGURE_FILE(scripts/501.appsvc_db_upgrade.sh.in scripts/501.appsvc_db_upgrade.sh @ONLY) +CONFIGURE_FILE(scripts/upgrade/1_appsvc_db_upgrade.sh.in scripts/upgrade/1_appsvc_db_upgrade.sh @ONLY) + +INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/scripts/501.appsvc_db_upgrade.sh + DESTINATION /usr/share/upgrade/scripts) +INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/scripts/upgrade/1_appsvc_db_upgrade.sh + DESTINATION /etc/aul/upgrade/scripts) INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/aul.pc DESTINATION ${LIB_INSTALL_DIR}/pkgconfig) INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/feature/preexec_list.txt DESTINATION ${SHARE_INSTALL_PREFIX}/aul ) INSTALL(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/data/miregex DESTINATION ${SHARE_INSTALL_PREFIX}/aul ) diff --git a/data/appsvc_db.sql b/data/appsvc_db.sql.in similarity index 95% rename from data/appsvc_db.sql rename to data/appsvc_db.sql.in index d7dbbc9..55713c4 100755 --- a/data/appsvc_db.sql +++ b/data/appsvc_db.sql.in @@ -1,4 +1,5 @@ PRAGMA journal_mode = PERSIST; +PRAGMA user_version = @APPSVC_DB_VERSION@; CREATE TABLE IF NOT EXISTS appsvc ( operation TEXT, diff --git a/packaging/aul.spec b/packaging/aul.spec index f569be2..fb1b658 100644 --- a/packaging/aul.spec +++ b/packaging/aul.spec @@ -111,6 +111,8 @@ Application Utility Library (devel) %endif %define _aulresdir /opt/usr/home/owner/share/aul/res +%define appsvc_db_version 1 +%define component_db_version 1 %prep %setup -q @@ -140,6 +142,8 @@ MAJORVER=`echo %{version} | awk 'BEGIN {FS="."}{print $1}'` -DMAJORVER=${MAJORVER} \ -D_TIZEN_FEATURE_PRELINK:BOOL=${_TIZEN_FEATURE_PRELINK} \ -DAUL_RES_DIR=%{_aulresdir} \ + -DAPPSVC_DB_VERSION=%{appsvc_db_version} \ + -DCOMPONENT_DB_VERSION=%{component_db_version} \ . %__make %{?_smp_mflags} @@ -242,6 +246,8 @@ chmod +x %{_aulresdir}/tpk/install.sh %attr(0755,root,root) %{_sysconfdir}/gumd/useradd.d/* %attr(0755,root,root) %{_datadir}/upgrade/scripts/501.component_upgrade.sh +%attr(0755,root,root) %{_datadir}/upgrade/scripts/501.appsvc_db_upgrade.sh +%attr(0755,root,root) %{_sysconfdir}/aul/upgrade/scripts/* %files exec-checker-plugin %manifest %{name}-exec-checker-plugin.manifest diff --git a/parser/component/CMakeLists.txt b/parser/component/CMakeLists.txt index 2f93677..82c297f 100644 --- a/parser/component/CMakeLists.txt +++ b/parser/component/CMakeLists.txt @@ -23,6 +23,12 @@ APPLY_PKG_CONFIG(${TARGET_COMPONENT_PLUGIN_PARSER} PUBLIC SQLITE3_DEPS ) +CONFIGURE_FILE(data/component_db.sql.in data/component_db.sql @ONLY) +CONFIGURE_FILE(script/14_component-add.post.in + script/14_component-add.post @ONLY) +CONFIGURE_FILE(script/501.component_upgrade.sh.in + script/501.component_upgrade.sh @ONLY) + INSTALL(TARGETS ${TARGET_COMPONENT_PLUGIN_PARSER} DESTINATION ${SYSCONF_INSTALL_DIR}/package-manager/parserlib) INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/data/component.info diff --git a/parser/component/data/component_db.sql b/parser/component/data/component_db.sql.in similarity index 93% rename from parser/component/data/component_db.sql rename to parser/component/data/component_db.sql.in index 8dfa36a..4b83645 100644 --- a/parser/component/data/component_db.sql +++ b/parser/component/data/component_db.sql.in @@ -1,4 +1,5 @@ PRAGMA journal_mode = PERSIST; +PRAGMA user_version = @COMPONENT_DB_VERSION@; CREATE TABLE IF NOT EXISTS component_info ( package TEXT NOT NULL, diff --git a/parser/component/script/14_component-add.post b/parser/component/script/14_component-add.post.in similarity index 97% rename from parser/component/script/14_component-add.post rename to parser/component/script/14_component-add.post.in index 236bc55..b71d6d2 100755 --- a/parser/component/script/14_component-add.post +++ b/parser/component/script/14_component-add.post.in @@ -16,6 +16,7 @@ chown $TZ_USER_NAME:system_share /opt/dbspace/user/$2 # Create DB sqlite3 /opt/dbspace/user/$2/.component.db << EOF PRAGMA journal_mode = PERSIST; +PAAGMA user_version = @COMPONENT_DB_VERSION@; CREATE TABLE IF NOT EXISTS component_info ( package TEXT NOT NULL, diff --git a/parser/component/script/501.component_upgrade.sh b/parser/component/script/501.component_upgrade.sh.in similarity index 97% rename from parser/component/script/501.component_upgrade.sh rename to parser/component/script/501.component_upgrade.sh.in index 1bc73c0..b636991 100755 --- a/parser/component/script/501.component_upgrade.sh +++ b/parser/component/script/501.component_upgrade.sh.in @@ -13,6 +13,7 @@ DEFAULT_USER_DB=/opt/dbspace/user/5001/.component.db # Create DB sqlite3 $GLOBAL_USER_DB << EOF PRAGMA journal_mode = PERSIST; +PRAGMA user_version = @COMPONENT_DB_VERSION@; CREATE TABLE IF NOT EXISTS component_info ( package TEXT NOT NULL, diff --git a/scripts/501.appsvc_db_upgrade.sh.in b/scripts/501.appsvc_db_upgrade.sh.in new file mode 100755 index 0000000..63ad671 --- /dev/null +++ b/scripts/501.appsvc_db_upgrade.sh.in @@ -0,0 +1,79 @@ +#!/bin/sh +PATH="/usr/bin:/bin:/usr/sbin:/sbin" + +DB_VERSION="@APPSVC_DB_VERSION@" + +FILE_DB=".appsvc.db" +PATH_SYS_DB="/opt/dbspace/${FILE_DB}" +PATH_USER_DB_DIR="/opt/dbspace/user" +PATH_UPGRADE_SCRIPT_DIR="/etc/aul/upgrade/scripts" +NAME_UPGRADE_SCRIPT="appsvc_db_upgrade.sh" +CURRENT_DB_VERSION=0 + +CompareDBVersion() { + PATH_DB=$1 + CURRENT_DB_VERSION=`sqlite3 ${PATH_DB} 'PRAGMA user_version;'` + + echo "## Compare DB version" + echo " - Path: ${PATH_DB}" + echo " - Current DB version: ${CURRENT_DB_VERSION}" + + if [ "${DB_VERSION}" -eq "${CURRENT_DB_VERSION}" ]; then + echo " - DB version[${DB_VERSION}] is equal to current DB version[${CURRENT_DB_VERSION}]" + return 0 + elif [ "${DB_VERSION}" -gt "${CURRENT_DB_VERSION}" ]; then + echo " - DB version[${DB_VERSION}] is greater than current DB version[${CURRENT_DB_VERSION}]" + return 1 + else + echo " - DB version[${DB_VERSION}] is less than current DB version[${CURRENT_DB_VERSION}]" + return 0 + fi + echo "## Compare DB version [Done]" +} + +UpgradeDB() { + PATH_DB=$1 + VERSION=$2 + echo "## UpgradeDB Path[${PATH_DB}] Version[${VERSION}]" + i=${VERSION} + while [ ${i} -le ${DB_VERSION} ]; do + FILE_SCRIPT="${i}_${NAME_UPGRADE_SCRIPT}" + PATH_SCRIPT="${PATH_UPGRADE_SCRIPT_DIR}/${FILE_SCRIPT}" + if [ -e "${PATH_SCRIPT}" ]; then + echo " - Script: ${PATH_SCRIPT}" + ${PATH_SCRIPT} ${PATH_DB} + fi + + i=`expr ${i} + 1` + done + echo "## UpgradeDB Path[${PATH_DB}] Version[${VERSION}] [Done]" +} + +CheckAndUpgradeDB() { + echo "### Check and upgrade DB" + + CompareDBVersion ${PATH_SYS_DB} + RESULT=$? + if [ "${RESULT}" -eq 1 ]; then + VERSION=`expr ${CURRENT_DB_VERSION} + 1` + UpgradeDB ${PATH_SYS_DB} ${VERSION} + fi + + for DIR in ${PATH_USER_DB_DIR}/*; do + echo " - Directory: ${DIR}" + if [ -d "${DIR}" ]; then + PATH_DB="${DIR}/${FILE_DB}" + CompareDBVersion ${PATH_DB} + RESULT=$? + if [ "${RESULT}" -eq 1 ]; then + VERSION=`expr ${CURRENT_DB_VERSION} + 1` + UpgradeDB ${PATH_DB} ${VERSION} + fi + fi + done + echo "### Check and upgrade DB [Done]" +} + +echo "#### Upgrade appsvc db ####" +CheckAndUpgradeDB +echo "#### Upgrade appsvc db [Done] ####" diff --git a/scripts/upgrade/1_appsvc_db_upgrade.sh.in b/scripts/upgrade/1_appsvc_db_upgrade.sh.in new file mode 100755 index 0000000..22789ae --- /dev/null +++ b/scripts/upgrade/1_appsvc_db_upgrade.sh.in @@ -0,0 +1,144 @@ +#!/bin/sh + +#------------------------------------------# +# appsvc db upgrade ver.1 # +#------------------------------------------# + +# Macro +PATH=/bin:/usr/bin:/sbin:/usr/sbin + +PATH_DB="$1" +PATH_NEW_DB="${PATH_DB}.new" +PATH_BACKUP_DB="${PATH_DB}.bak" + +Init() { + echo "### Initialize" + cp ${PATH_DB} ${PATH_BACKUP_DB} + cp ${PATH_DB}-journal ${PATH_BACKUP_DB}-journal + + if [ -e "${PATH_NEW_DB}" ]; then + rm ${PATH_NEW_DB} + fi + + if [ -e "${PATH_NEW_DB}-journal" ]; then + rm ${PATH_NEW_DB}-journal + fi +} + +# Create new DB +CreateNewDB() { + echo " - Create new DB: ${PATH_NEW_DB}" + +sqlite3 ${PATH_NEW_DB} << EOF +PRAGMA journal_mode = PERSIST; +PRAGMA user_version = 1; + +CREATE TABLE IF NOT EXISTS appsvc ( + operation TEXT, + mime_type TEXT DEFAULT 'NULL', + uri TEXT DEFAULT 'NULL', + pkg_name TEXT, + PRIMARY KEY (operation,mime_type,uri) +); + +CREATE TABLE IF NOT EXISTS alias_info ( + alias_appid TEXT NOT NULL, + appid TEXT NOT NULL, + enable TEXT NOT NULL DEFAULT 'true', + PRIMARY KEY (alias_appid) +); + +CREATE TABLE IF NOT EXISTS alias_info_for_uid ( + appid TEXT NOT NULL, + uid INTEGER NOT NULL, + is_enabled TEXT NOT NULL DEFAULT 'false', + PRIMARY KEY (appid, uid) +); + +CREATE TRIGGER IF NOT EXISTS update_alias_info_for_uid + AFTER UPDATE ON alias_info_for_uid + BEGIN + DELETE FROM alias_info_for_uid + WHERE is_enabled='true'; + END; + +CREATE TABLE IF NOT EXISTS allowed_info ( + appid TEXT NOT NULL, + allowed_appid TEXT NOT NULL, + PRIMARY KEY (appid, allowed_appid) +); +EOF +} + +# Insert old data into new DB +InsertAppsvc() { + echo " - Insert appsvc" + TABLE=`sqlite3 ${PATH_DB} 'SELECT operation, mime_type, uri, pkg_name FROM appsvc;'` + for ROW in ${TABLE}; do + IFS='|' read -ra VALUE <<< "${ROW}"; + QUERY="INSERT INTO appsvc(operation, mime_type, uri, pkg_name) VALUES('${VALUE[0]}', '${VALUE[1]}', '${VALUE[2]}', '${VALUE[3]}');" + echo " + Query: ${QUERY}" + sqlite3 ${PATH_NEW_DB} "${QUERY}" + done +} + +InsertAliasInfo() { + echo " - Insert alias_info" + TABLE=`sqlite3 ${PATH_DB} 'SELECT alias_appid, appid, enable FROM alias_info;'` + for ROW in ${TABLE}; do + IFS='|' read -ra VALUE <<< "${ROW}"; + QUERY="INSERT INTO alias_info(alias_appid, appid, enable) VALUES('${VALUE[0]}', '${VALUE[1]}', '${VALUE[2]}');" + echo " + Query: ${QUERY}" + sqlite3 ${PATH_NEW_DB} "${QUERY}" + done +} + +InsertAliasInfoForUid() { + echo " - Insert alias_info_for_uid" + TABLE=`sqlite3 ${PATH_DB} 'SELECT appid, uid, is_enabled FROM alias_info_for_uid;'` + for ROW in ${TABLE}; do + IFS='|' read -ra VALUE <<< "${ROW}"; + QUERY="INSERT INTO alias_info_for_uid(appid, uid, is_enabled) VALUES('${VALUE[0]}', '${VALUE[1]}', '${VALUE[2]}');" + echo " + Query: ${QUERY}" + sqlite3 ${PATH_NEW_DB} "${QUERY}" + done +} + +InsertAllowedInfo() { + echo " - Insert allowed_info" + TABLE=`sqlite3 ${PATH_DB} 'SELECT appid, allowed_appid FROM allowed_info;'` + for ROW in ${TABLE}; do + IFS='|' read -ra VALUE <<< "${ROW}"; + QUERY="INSERT INTO allowed_info(appid, allowed_appid) VALUES('${VALUE[0]}', '${VALUE[1]}');" + echo " + Query: ${QUERY}" + sqlite3 ${PATH_NEW_DB} "${QUERY}" + done +} + +Upgrade() { + echo "### Upgrade" + CreateNewDB + + InsertAppsvc + InsertAliasInfo + InsertAliasInfoForUid + InsertAllowedInfo + + cp ${PATH_NEW_DB} ${PATH_DB} + cp ${PATH_NEW_DB}-journal ${PATH_DB}-journal +} + +Fini() { + echo "### Finish" + rm ${PATH_NEW_DB} + rm ${PATH_NEW_DB}-journal + + rm ${PATH_BACKUP_DB} + rm ${PATH_BACKUP_DB}-journal +} + +echo "#### 1. Upgrade appsvc db ####" +Init +Upgrade +Fini +echo "#### 1. Upgrade appsvc db [Done] ####" diff --git a/tool/recovery/appsvc_db_recovery.c b/tool/recovery/appsvc_db_recovery.c index 20cd07c..481111d 100644 --- a/tool/recovery/appsvc_db_recovery.c +++ b/tool/recovery/appsvc_db_recovery.c @@ -26,6 +26,7 @@ #define QUERY_CREATE_APPSVC \ "PRAGMA journal_mode = PERSIST;\n" \ + "PRAGMA user_version = " APPSVC_DB_VERSION ";\n" \ "CREATE TABLE IF NOT EXISTS appsvc (\n" \ " operation TEXT,\n" \ " mime_type TEXT DEFAULT 'NULL',\n" \ diff --git a/tool/recovery/component_db_recovery.c b/tool/recovery/component_db_recovery.c index 69dbe42..da63aec 100644 --- a/tool/recovery/component_db_recovery.c +++ b/tool/recovery/component_db_recovery.c @@ -26,6 +26,7 @@ #define QUERY_CREATE_COMPONENT \ "PRAGMA journal_mode = PERSIST;\n" \ + "PRAGMA user_version = " COMPONENT_DB_VERSION ";\n" \ "CREATE TABLE IF NOT EXISTS component_info (\n" \ " package TEXT NOT NULL,\n" \ " app_id TEXT NOT NULL,\n" \ -- 2.7.4