Remove inactive users' corresponding job information if a global app is uninstalled 05/143105/1
authorMu-Woong Lee <muwoong.lee@samsung.com>
Tue, 8 Aug 2017 11:56:30 +0000 (20:56 +0900)
committerMu-Woong Lee <muwoong.lee@samsung.com>
Tue, 8 Aug 2017 11:56:30 +0000 (20:56 +0900)
Change-Id: I9ca13f466f1cb36f3f76a23839992eb2effdbcc3
Signed-off-by: Mu-Woong Lee <muwoong.lee@samsung.com>
include/private/JobSchedulerService.h
src/server/JobInfoDatabase.cpp
src/server/JobInfoDatabase.h
src/server/JobSchedulerService.cpp
src/server/OrphanedJobCleaner.cpp

index 31af550f69d8ad37f70003e13509cc56eaad95c4..86eeef7588739cd301585ef5e25f627fc34ffca1 100644 (file)
@@ -46,7 +46,7 @@ namespace ctx {
 
                // Own members
                JobManager* getJobManager(uid_t uid);
-               std::vector<JobManager*> getAllJobManager();
+               std::vector<JobManager*> getUserJobManagers();
 
        private:
                IServiceRunner* __serviceRunner;
index c36e36dd33f53bb24db018a0c9cd7ecf021f061f..e763ce357aee207e246eff3266ee5eeb49c899d7 100644 (file)
@@ -185,3 +185,28 @@ bool JobInfoDatabase::getUsedIds(std::vector<std::shared_ptr<Tuple>>* usedIds)
                        "SELECT jobId FROM " USED_ID_TABLE " ORDER BY jobID ASC",
                        COL_INT64, &columns, usedIds);
 }
+
+void JobInfoDatabase::purgeJobOf(const std::string& owner)
+{
+       IF_FAIL_VOID(__database);
+
+       std::vector<std::shared_ptr<Tuple>> tableNames;
+       // Select all user job info table names
+       __database->execute(
+                       "SELECT name FROM sqlite_master " \
+                       " WHERE type='table'" \
+                       " AND name != '" JOB_INFO_TABLE "_0'" \
+                       " AND name LIKE '" JOB_INFO_TABLE "_%'",
+                       &tableNames);
+
+       for (auto& tuple : tableNames) {
+               const char* name = NULL;
+
+               if (!tuple->getAt(0, &name))
+                       continue;
+
+               char* query = sqlite3_mprintf("DELETE FROM [%s] WHERE owner='%s'", name, owner.c_str());
+               __database->execute(query, NULL);
+               sqlite3_free(query);
+       }
+}
index 46e1232fa166f870f5e1780d14ea6334a218e9d9..0900968f22526a0f8b063acf3f7733fa853fcc9d 100644 (file)
@@ -35,6 +35,9 @@ namespace ctx {
 
                bool getUsedIds(std::vector<std::shared_ptr<Tuple>>* usedIds);
 
+               // Remove all the jobs owned by the given owner from all users
+               static void purgeJobOf(const std::string& owner);
+
        private:
                uid_t __uid;
        };
index d23bcb98f2af1f0423c7033e68c536b86fbc1fee..868b82eb0aeedb4df5b3a72a6e87b9962fb4bdf8 100644 (file)
@@ -105,12 +105,13 @@ JobManager* JobSchedulerService::getJobManager(uid_t uid)
        return it->second;
 }
 
-std::vector<JobManager*> JobSchedulerService::getAllJobManager()
+std::vector<JobManager*> JobSchedulerService::getUserJobManagers()
 {
        std::vector<JobManager*> managers;
 
        for (auto& it : __jobManagers) {
-               managers.push_back(it.second);
+               if (!util::is_system(it.first))
+                       managers.push_back(it.second);
        }
 
        return managers;
index 66eabe902e40df5df82ab74132019cf43911035d..1d9e56ecef285f6639984027b2a944a815c9c7d0 100644 (file)
@@ -18,6 +18,7 @@
 #include <SharedUtil.h>
 #include <JobSchedulerService.h>
 #include "JobManager.h"
+#include "JobInfoDatabase.h"
 #include "OrphanedJobCleaner.h"
 
 #define GLOBAL_APP_UID 376
@@ -55,9 +56,12 @@ void OrphanedJobCleaner::onSignal(const std::string& sender, const std::string&
                return;
        }
 
-       std::vector<JobManager*> managers = __hostService->getAllJobManager();
+       std::vector<JobManager*> managers = __hostService->getUserJobManagers();
 
        for (auto& manager : managers) {
                manager->purgeJobOf(pkgId);
        }
+
+       // Remove all jobs owned by pkgId from all tables (inc. inactive users)
+       JobInfoDatabase::purgeJobOf(pkgId);
 }