32db5524ce1ea9870d360e7e601bb7aa0803f221
[platform/framework/native/installer.git] / src / Manager / DatabaseManager.cpp
1 //
2 // Open Service Platform
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
4 //
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
8 //
9 //     http://www.apache.org/licenses/LICENSE-2.0
10 //
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
16 //
17 /**
18  * @file        DatabaseManager.cpp
19  * @brief       This is the implementation file for %DatabaseManager class.
20  */
21
22 #include <unique_ptr.h>
23
24 #include <FIoDatabase.h>
25 #include <FIoDbStatement.h>
26 #include <FIoDbEnumerator.h>
27 #include <FIoFile.h>
28
29 #include <FAppPkg_PackageManagerImpl.h>
30
31 #include "DatabaseManager.h"
32 #include "SmackManager.h"
33
34 using namespace Tizen::App;
35 using namespace Tizen::App::Package;
36 using namespace Tizen::Base;
37 using namespace Tizen::Base::Collection;
38 using namespace Tizen::Io;
39
40 DatabaseManager::DatabaseManager(void)
41 {
42         CreatePackageTables();
43 }
44
45 DatabaseManager::~DatabaseManager(void)
46 {
47 }
48
49 bool
50 DatabaseManager::RegisterPackageInfo(InstallationContext* pContext) const
51 {
52         bool res = true;
53         Database db;
54         String query;
55
56         result r = db.Construct(PACKAGE_DATABASE_FILE_NAME, "r+");
57         TryReturn(r == E_SUCCESS, false, "db.Construct failed. [%s]", GetErrorMessage(r));
58
59         query.Format(1024, L"INSERT INTO PkgInfo "
60                           "(PKG_ID, PKG_SECRET, PKG_VERSION, PKG_TYPE, PKG_MIMETYPE, PKG_APIVERSION, PKG_NAME, PKG_VENDOR, PKG_DESCRIPTION, PKG_URL, PKG_CID, PKG_READONLY_SIZE, PKG_DATA_SIZE, PKG_PARENT_ID,"
61                           " PKG_ATTRIBUTE, PKG_ROOTPATH, PKG_STORAGE_TYPE, PKG_INSTALLATION_DATE, PKG_STATE, PKG_INITIATOR) "
62                           "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
63
64         std::unique_ptr< DbStatement > pStmt(_PackageManagerImpl::CreateStatementN(db, query));
65         TryReturn(pStmt, false, "CreateStatementN() failed. [%s]", GetErrorMessage(GetLastResult()));
66
67         PackageId packageId = pContext->__packageId;
68         String version = pContext->__version;
69         String apiVersion = pContext->__apiVersion;
70         String name = pContext->__displayName;
71         String rootPath = pContext->__rootPath;
72
73         if (!packageId.IsEmpty())
74         {
75                 r = pStmt.get()->BindString(0, packageId);
76                 TryReturn(r == E_SUCCESS, false, "BindString() failed. [%s]", GetErrorMessage(r));
77         }
78
79         if (!version.IsEmpty())
80         {
81                 r = pStmt->BindString(2, version);
82                 TryReturn(r == E_SUCCESS, false, "BindString() failed. [%s]", GetErrorMessage(r));
83         }
84
85         if (!apiVersion.IsEmpty())
86         {
87                 r = pStmt->BindString(5, apiVersion);
88                 TryReturn(r == E_SUCCESS, false, "BindString() failed. [%s]", GetErrorMessage(r));
89         }
90
91         if (!name.IsEmpty())
92         {
93                 r = pStmt->BindString(6, name);
94                 TryReturn(r == E_SUCCESS, false, "BindString() failed. [%s]", GetErrorMessage(r));
95         }
96
97         if (!rootPath.IsEmpty())
98         {
99                 r = pStmt->BindString(15, rootPath);
100                 TryReturn(r == E_SUCCESS, false, "BindString() failed. [%s]", GetErrorMessage(r));
101         }
102
103         std::unique_ptr< DbEnumerator > pEnum(_PackageManagerImpl::ExecuteStatementN(db, pStmt.get()));
104         TryReturn(!IsFailed(GetLastResult()), false, "ExecuteStatementN() failed. [%s]", GetErrorMessage(GetLastResult()));
105
106         res = RegisterPrivilegeInfo(pContext, db);
107         TryReturn(res == true, false, "RegisterPrivilegeInfo() failed. [%s]", GetErrorMessage(GetLastResult()));
108
109         res = RegisterAppInfoList(pContext, db);
110         TryReturn(res == true, false, "RegisterAppInfoList() failed. [%s]", GetErrorMessage(GetLastResult()));
111
112         return true;
113 }
114
115 bool
116 DatabaseManager::RegisterPrivilegeInfo(InstallationContext* pContext, Database& db) const
117 {
118         result r = E_SUCCESS;
119         String query;
120         PackageId packageId = pContext->__packageId;
121
122         query.Format(1024, L"INSERT INTO PkgPrivileges (ID, PRIVILEGES, HMAC_PPRIVILEGES, CERTIFICATE_TYPE, STR_PRIVILEGES) "
123                         "VALUES ((SELECT PkgInfo.UNIQUE_ID FROM PkgInfo WHERE PkgInfo.PKG_ID = '%ls'), ?, ?, ?, ?)", packageId.GetPointer());
124
125         std::unique_ptr< DbStatement > pStmt(_PackageManagerImpl::CreateStatementN(db, query));
126         TryReturn(pStmt, false, "CreateStatementN() failed. [%s]", GetErrorMessage(GetLastResult()));
127
128         String privileges = pContext->__privileges;
129         String hmacPrivileges = pContext->__hmacPrivileges;
130         int certType = pContext->__certType;
131         ArrayList* pStringPrivilegeList = pContext->__pStringPrivilegeList;
132
133         if (!privileges.IsEmpty())
134         {
135                 r = pStmt->BindString(0, privileges);
136                 TryReturn(r == E_SUCCESS, false, "BindString() failed. [%s]", GetErrorMessage(r));
137         }
138
139         if (!hmacPrivileges.IsEmpty())
140         {
141                 r = pStmt->BindString(1, hmacPrivileges);
142                 TryReturn(r == E_SUCCESS, false, "BindString() failed. [%s]", GetErrorMessage(r));
143         }
144
145         if (certType != 0)
146         {
147                 r = pStmt->BindInt(2, certType);
148                 TryReturn(r == E_SUCCESS, false, "BindInt() failed. [%s]", GetErrorMessage(r));
149         }
150
151         if (pStringPrivilegeList != null)
152         {
153                 IEnumerator* pEnum = pStringPrivilegeList->GetEnumeratorN();
154                 String MergedString;
155                 while(pEnum->MoveNext() == E_SUCCESS)
156                 {
157                         MergedString.Append(*(static_cast<String*>(pEnum->GetCurrent())));
158                         MergedString.Append(L"#");
159                 }
160                 delete pEnum;
161
162                 r = pStmt->BindString(3, MergedString);
163                 TryReturn(r == E_SUCCESS, false, "BindInt() failed. [%s]", GetErrorMessage(r));
164         }
165
166         std::unique_ptr< DbEnumerator > pEnum(_PackageManagerImpl::ExecuteStatementN(db, pStmt.get()));
167         TryReturn(!IsFailed(GetLastResult()), false, "ExecuteStatementN() failed. [%s]", GetErrorMessage(GetLastResult()));
168
169         return true;
170 }
171
172 bool
173 DatabaseManager::RegisterAppInfoList(InstallationContext* pContext, Database& db) const
174 {
175         result r = E_SUCCESS;
176         bool res = true;
177         String query;
178
179         IListT<AppData*>* pAppDataList = pContext->__pAppDataList;
180         TryReturn(pAppDataList, false, "pAppDataList is null");
181
182         int count = pAppDataList->GetCount();
183
184         for (int i = 0; i < count; i++)
185         {
186                 AppData* pAppData = null;
187                 pAppDataList->GetAt(i, pAppData);
188
189                 if (pAppData)
190                 {
191                         String name = pAppData->__name;
192                         String main = pAppData->__main;
193                         String mainmenuIcon = pAppData->__mainmenuIcon;
194                         String settingIcon = pAppData->__settingIcon;
195                         String notificationIcon = pAppData->__notificationIcon;
196                         int feature = pAppData->__feature;
197                         String appId = pAppData->__appId;
198                         String type = pAppData->__type;
199
200                         query.Format(1024, L"INSERT INTO AppInfo "
201                                           "(ID, APP_NAME, APP_DEFAULT, APP_MAINMENU_ICON, APP_SETTING_ICON, APP_TICKER_ICON, APP_QUICKPANEL_ICON, APP_LAUNCHIMAGE_ICON, APP_FEATURE, PACKAGE_NAME, APP_TYPE) "
202                                           "VALUES ((SELECT PkgInfo.UNIQUE_ID FROM PkgInfo WHERE PkgInfo.PKG_ID = '%ls'),?,?,?,?,?,?,?,?,?,?)", pContext->__packageId.GetPointer());
203
204                         std::unique_ptr< DbStatement > pStmt(_PackageManagerImpl::CreateStatementN(db, query));
205                         TryReturn(pStmt, false, "CreateStatementN() failed. [%s]", GetErrorMessage(GetLastResult()));
206
207                         if (!name.IsEmpty())
208                         {
209                                 r = pStmt->BindString(0, name);
210                                 TryReturn(r == E_SUCCESS, false, "BindString() failed. [%s]", GetErrorMessage(r));
211                         }
212
213                         if (!main.IsEmpty())
214                         {
215                                 r = pStmt->BindString(1, main);
216                                 TryReturn(r == E_SUCCESS, false, "BindString() failed. [%s]", GetErrorMessage(r));
217                         }
218
219                         if (!mainmenuIcon.IsEmpty())
220                         {
221                                 r = pStmt->BindString(2, mainmenuIcon);
222                                 TryReturn(r == E_SUCCESS, false, "BindString() failed. [%s]", GetErrorMessage(r));
223                         }
224
225                         if (!settingIcon.IsEmpty())
226                         {
227                                 r = pStmt->BindString(3, settingIcon);
228                                 TryReturn(r == E_SUCCESS, false, "BindString() failed. [%s]", GetErrorMessage(r));
229                         }
230
231                         if (!notificationIcon.IsEmpty())
232                         {
233                                 r = pStmt->BindString(5, notificationIcon);
234                                 TryReturn(r == E_SUCCESS, false, "BindString() failed. [%s]", GetErrorMessage(r));
235                         }
236
237                         if (feature != 0)
238                         {
239                                 r = pStmt->BindInt(7, feature);
240                                 TryReturn(r == E_SUCCESS, false, "BindInt() failed. [%s]", GetErrorMessage(r));
241                         }
242
243                         if (!appId.IsEmpty())
244                         {
245                                 r = pStmt->BindString(8, appId);
246                                 TryReturn(r == E_SUCCESS, false, "BindString() failed. [%s]", GetErrorMessage(r));
247                         }
248
249                         if (!type.IsEmpty())
250                         {
251                                 r = pStmt->BindString(9, type);
252                                 TryReturn(r == E_SUCCESS, false, "BindString() failed. [%s]", GetErrorMessage(r));
253                         }
254
255                         std::unique_ptr< DbEnumerator > pEnum(_PackageManagerImpl::ExecuteStatementN(db, pStmt.get()));
256                         TryReturn(!IsFailed(GetLastResult()), false, "ExecuteStatementN() failed. [%s]", GetErrorMessage(GetLastResult()));
257
258                         if (pAppData->__pLaunchConditionList)
259                         {
260                                 res = RegisterLaunchConditionList(pAppData, db);
261                                 TryReturn(res == true, false, "RegisterLaunchConditionList() failed. [%s]", GetErrorMessage(r));
262                         }
263
264                         if (pAppData->__pFeatureList)
265                         {
266                                 res = RegisterAppFeatureList(pAppData, db);
267                                 TryReturn(res == true, false, "RegisterAppFeatureList() failed. [%s]", GetErrorMessage(r));
268                         }
269
270                         if (pAppData->__pDataControlList)
271                         {
272                                 res = RegisterDataControlList(pAppData, db);
273                                 TryReturn(res == true, false, "RegisterDataControlList() failed. [%s]", GetErrorMessage(r));
274                         }
275                 }
276         }
277
278         return true;
279 }
280
281 bool
282 DatabaseManager::RegisterLaunchConditionList(AppData* pAppData, Database& db) const
283 {
284         TryReturn(pAppData, E_SYSTEM, "pAppData is null.");
285         TryReturn(pAppData->__pLaunchConditionList, E_SYSTEM, "__pLaunchConditionList is null.");
286
287         result r = E_SUCCESS;
288         MultiHashMap* pList = pAppData->__pLaunchConditionList;
289
290         std::unique_ptr< IMapEnumerator > pEnum(pList->GetMapEnumeratorN());
291         TryReturn(pEnum, false, "GetMapEnumeratorN() failed. [%s]", GetErrorMessage(GetLastResult()));
292
293         while (pEnum->MoveNext() == E_SUCCESS)
294         {
295                 String* pKey = static_cast< String* > (pEnum->GetKey());
296                 TryReturn(pEnum, false, "GetKey() failed. [%s]", GetErrorMessage(GetLastResult()));
297
298                 String* pValue = static_cast< String* > (pEnum->GetValue());
299                 TryReturn(pEnum, false, "GetValue() failed. [%s]", GetErrorMessage(GetLastResult()));
300
301                 String query;
302                 query.Format(1024, L"INSERT INTO LaunchCondition (ID, NAME, VALUE) VALUES ((SELECT AppInfo.UNIQUE_ID FROM AppInfo WHERE AppInfo.PACKAGE_NAME = '%ls'),?,?)", pAppData->__appId.GetPointer());
303
304                 std::unique_ptr< DbStatement > pStmt(_PackageManagerImpl::CreateStatementN(db, query));
305                 TryReturn(pStmt, false, "CreateStatementN() failed. [%s]", GetErrorMessage(GetLastResult()));
306
307                 if (!(pKey->IsEmpty()))
308                 {
309                         r = pStmt->BindString(0, *pKey);
310                         TryReturn(r == E_SUCCESS, false, "BindString() failed. [%s]", GetErrorMessage(r));
311                 }
312
313                 if (!(pValue->IsEmpty()))
314                 {
315                         r = pStmt->BindString(1, *pValue);
316                         TryReturn(r == E_SUCCESS, false, "BindString() failed. [%s]", GetErrorMessage(r));
317                 }
318
319                 std::unique_ptr< DbEnumerator > pEnum(_PackageManagerImpl::ExecuteStatementN(db, pStmt.get()));
320                 TryReturn(!IsFailed(GetLastResult()), false, "ExecuteStatementN() failed. [%s]", GetErrorMessage(GetLastResult()));
321         }
322
323         return true;
324 }
325
326 bool
327 DatabaseManager::RegisterAppFeatureList(AppData* pAppData, Database& db) const
328 {
329         TryReturn(pAppData, E_SYSTEM, "pAppData is null.");
330         TryReturn(pAppData->__pFeatureList, E_SYSTEM, "__pFeatureList is null.");
331
332         result r = E_SUCCESS;
333         HashMap* pList = pAppData->__pFeatureList;
334
335         std::unique_ptr< IMapEnumerator > pEnum(pList->GetMapEnumeratorN());
336         TryReturn(pEnum, false, "GetMapEnumeratorN() failed. [%s]", GetErrorMessage(GetLastResult()));
337
338         while (pEnum->MoveNext() == E_SUCCESS)
339         {
340                 String* pKey = static_cast< String* > (pEnum->GetKey());
341                 TryReturn(pEnum, false, "GetKey() failed. [%s]", GetErrorMessage(GetLastResult()));
342
343                 String* pValue = static_cast< String* > (pEnum->GetValue());
344                 TryReturn(pEnum, false, "GetValue() failed. [%s]", GetErrorMessage(GetLastResult()));
345
346                 String query;
347                 query.Format(1024, L"INSERT INTO AppFeature (ID, NAME, VALUE) VALUES ((SELECT AppInfo.UNIQUE_ID FROM AppInfo WHERE AppInfo.PACKAGE_NAME = '%ls'),?,?)", pAppData->__appId.GetPointer());
348
349                 std::unique_ptr< DbStatement > pStmt(_PackageManagerImpl::CreateStatementN(db, query));
350                 TryReturn(pStmt, false, "CreateStatementN() failed. [%s]", GetErrorMessage(GetLastResult()));
351
352                 if (!(pKey->IsEmpty()))
353                 {
354                         r = pStmt->BindString(0, *pKey);
355                         TryReturn(r == E_SUCCESS, false, "BindString() failed. [%s]", GetErrorMessage(r));
356                 }
357
358                 if (!(pValue->IsEmpty()))
359                 {
360                         r = pStmt->BindString(1, *pValue);
361                         TryReturn(r == E_SUCCESS, false, "BindString() failed. [%s]", GetErrorMessage(r));
362                 }
363
364                 std::unique_ptr< DbEnumerator > pEnum(_PackageManagerImpl::ExecuteStatementN(db, pStmt.get()));
365                 TryReturn(!IsFailed(GetLastResult()), false, "ExecuteStatementN() failed. [%s]", GetErrorMessage(GetLastResult()));
366         }
367
368         return true;
369 }
370
371 bool
372 DatabaseManager::RegisterDataControlList(AppData* pAppData, Database& db) const
373 {
374         TryReturn(pAppData, E_SYSTEM, "pAppData is null.");
375         TryReturn(pAppData->__pDataControlList, E_SYSTEM, "__pDataControlList is null.");
376
377         result r = E_SUCCESS;
378
379         IListT<DataControlInfo*>* pDataControlList = pAppData->__pDataControlList;
380         TryReturn(pDataControlList, false, "pDataControlList is null.");
381
382         for (int i = 0; i < pDataControlList->GetCount(); i++)
383         {
384                 DataControlInfo* pDataControlInfo = null;
385                 pDataControlList->GetAt(i, pDataControlInfo);
386                 TryReturn(pDataControlInfo, false, "pDataControlInfo is null.");
387
388                 String providerId = pDataControlInfo->__providerId;
389                 IListT<DataControlType*>* pTypeList = pDataControlInfo->__pControlTypeList;
390                 TryReturn(pTypeList, false, "pTypeList is null.");
391
392                 for (int j = 0; j < pTypeList->GetCount(); j++)
393                 {
394                         DataControlType* pDataControlType = null;
395                         pTypeList->GetAt(j, pDataControlType);
396                         TryReturn(pDataControlType, false, "pDataControlType is null.");
397
398                         String access = pDataControlType->__access;
399                         String type = pDataControlType->__type;
400
401                         String query;
402                         query.Format(1024, L"INSERT INTO DataControl (ID, PROVIDER_ID, TYPE, ACCESS) VALUES ((SELECT AppInfo.UNIQUE_ID FROM AppInfo WHERE AppInfo.PACKAGE_NAME = '%ls'),?,?,?)", pAppData->__appId.GetPointer());
403
404                         std::unique_ptr< DbStatement > pStmt(_PackageManagerImpl::CreateStatementN(db, query));
405                         TryReturn(pStmt, false, "CreateStatementN() failed. [%s]", GetErrorMessage(GetLastResult()));
406
407                         if (!providerId.IsEmpty())
408                         {
409                                 r = pStmt->BindString(0, providerId);
410                                 TryReturn(r == E_SUCCESS, false, "BindString() failed. [%s]", GetErrorMessage(r));
411                         }
412
413                         if (!type.IsEmpty())
414                         {
415                                 r = pStmt->BindString(1, type);
416                                 TryReturn(r == E_SUCCESS, false, "BindString() failed. [%s]", GetErrorMessage(r));
417                         }
418
419                         if (!access.IsEmpty())
420                         {
421                                 r = pStmt->BindString(2, access);
422                                 TryReturn(r == E_SUCCESS, false, "BindString() failed. [%s]", GetErrorMessage(r));
423                         }
424
425                         std::unique_ptr< DbEnumerator > pEnum(_PackageManagerImpl::ExecuteStatementN(db, pStmt.get()));
426                         TryReturn(!IsFailed(GetLastResult()), false, "ExecuteStatementN() failed. [%s]", GetErrorMessage(GetLastResult()));
427                 }
428         }
429
430         return true;
431 }
432
433 bool
434 DatabaseManager::UnregisterPackageInfo(InstallationContext* pContext) const
435 {
436         Database db;
437         String query;
438         PackageId packageId = pContext->__packageId;
439
440         result r = db.Construct(L"/opt/usr/dbspace/.app-package.db", "r+");
441         TryReturn(r == E_SUCCESS, false, "db.Construct failed. [%s]", GetErrorMessage(r));
442
443         // DataControl
444         query.Format(1024, L"DELETE FROM DataControl WHERE DataControl.ID IN "
445                         "(SELECT AppInfo.UNIQUE_ID FROM PkgInfo, AppInfo "
446                         "WHERE AppInfo.ID = PkgInfo.UNIQUE_ID and PkgInfo.PKG_ID = '%ls')", packageId.GetPointer());
447         r = db.ExecuteSql(query, true);
448         if (r != E_SUCCESS)
449         {
450                 AppLog("ExecuteSql() failed. [%ls][%s]", query.GetPointer(), GetErrorMessage(r));
451         }
452         query.Clear();
453
454         // LaunchCondition
455         query.Format(1024, L"DELETE FROM LaunchCondition WHERE LaunchCondition.ID IN "
456                         "(SELECT AppInfo.UNIQUE_ID FROM PkgInfo, AppInfo "
457                         "WHERE AppInfo.ID = PkgInfo.UNIQUE_ID and PkgInfo.PKG_ID = '%ls')", packageId.GetPointer());
458         r = db.ExecuteSql(query, true);
459         if (r != E_SUCCESS)
460         {
461                 AppLog("ExecuteSql() failed. [%ls][%s]", query.GetPointer(), GetErrorMessage(r));
462         }
463         query.Clear();
464
465         // Notification
466         query.Format(1024, L"DELETE FROM Notification WHERE Notification.ID IN "
467                         "(SELECT AppInfo.UNIQUE_ID FROM PkgInfo, AppInfo "
468                         "WHERE AppInfo.ID = PkgInfo.UNIQUE_ID and PkgInfo.PKG_ID = '%ls')", packageId.GetPointer());
469         r = db.ExecuteSql(query, true);
470         if (r != E_SUCCESS)
471         {
472                 AppLog("ExecuteSql() failed. [%ls][%s]", query.GetPointer(), GetErrorMessage(r));
473         }
474         query.Clear();
475
476         // AppFeature
477         query.Format(1024, L"DELETE FROM AppFeature WHERE AppFeature.ID IN "
478                         "(SELECT AppInfo.UNIQUE_ID FROM PkgInfo, AppInfo "
479                         "WHERE AppInfo.ID = PkgInfo.UNIQUE_ID and PkgInfo.PKG_ID = '%ls')", packageId.GetPointer());
480         r = db.ExecuteSql(query, true);
481         if (r != E_SUCCESS)
482         {
483                 AppLog("ExecuteSql() failed. [%ls][%s]", query.GetPointer(), GetErrorMessage(r));
484         }
485         query.Clear();
486
487         // AppInfo
488         query.Format(1024, L"DELETE FROM AppInfo WHERE AppInfo.ID IN "
489                         "(SELECT PkgInfo.UNIQUE_ID FROM PkgInfo, AppInfo "
490                         "WHERE PkgInfo.UNIQUE_ID = AppInfo.ID and PkgInfo.PKG_ID = '%ls')", packageId.GetPointer());
491         r = db.ExecuteSql(query, true);
492         if (r != E_SUCCESS)
493         {
494                 AppLog("ExecuteSql() failed. [%ls][%s]", query.GetPointer(), GetErrorMessage(r));
495         }
496         query.Clear();
497
498         // PkgPrivileges
499         query.Format(1024, L"DELETE FROM PkgPrivileges WHERE PkgPrivileges.ID IN "
500                         "(SELECT PkgInfo.UNIQUE_ID FROM PkgInfo, PkgPrivileges "
501                         "WHERE PkgInfo.UNIQUE_ID = PkgPrivileges.ID and PkgInfo.PKG_ID = '%ls')", packageId.GetPointer());
502         r = db.ExecuteSql(query, true);
503         if (r != E_SUCCESS)
504         {
505                 AppLog("ExecuteSql() failed. [%ls][%s]", query.GetPointer(), GetErrorMessage(r));
506         }
507         query.Clear();
508
509         // PkgInfo
510         query.Format(1024, L"DELETE FROM PkgInfo WHERE PKG_ID = '%ls'", packageId.GetPointer());
511         r = db.ExecuteSql(query, true);
512         if (r != E_SUCCESS)
513         {
514                 AppLog("ExecuteSql() failed. [%ls][%s]", query.GetPointer(), GetErrorMessage(r));
515         }
516         query.Clear();
517
518         return true;
519 }
520
521 bool
522 DatabaseManager::CreatePackageTables(void) const
523 {
524         if (File::IsFileExist(PACKAGE_DATABASE_FILE_NAME) == true)
525         {
526                 return true;
527         }
528
529         result r = E_SUCCESS;
530         Database db;
531         String createQuery;
532
533         r = db.Construct(PACKAGE_DATABASE_FILE_NAME, true);
534         TryReturn(r == E_SUCCESS, false, "db.Construct is failed. [%s]", GetErrorMessage(r));
535
536         // PkgInfo
537         createQuery.Format(1024, L"CREATE TABLE IF NOT EXISTS PkgInfo"
538                                                          "( UNIQUE_ID                                   INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,"
539                                                          "PKG_ID                        TEXT,"
540                                                          "PKG_SECRET                    TEXT,"
541                                                          "PKG_VERSION                   TEXT,"
542                                                          "PKG_TYPE                  TEXT,"
543                                                          "PKG_MIMETYPE              TEXT,"
544                                                          "PKG_APIVERSION                TEXT,"
545                                                          "PKG_NAME                  TEXT,"
546                                                          "PKG_VENDOR                    TEXT,"
547                                                          "PKG_DESCRIPTION           TEXT,"
548                                                          "PKG_URL                       TEXT,"
549                                                          "PKG_CID                       TEXT,"
550                                                          "PKG_READONLY_SIZE             INTEGER,"
551                                                          "PKG_DATA_SIZE                 INTEGER,"
552                                                          "PKG_PARENT_ID                         TEXT,"
553                                                          "PKG_ATTRIBUTE                         INTEGER,"
554                                                          "PKG_ROOTPATH              TEXT,"
555                                                          "PKG_STORAGE_TYPE          INTEGER,"
556                                                          "PKG_INSTALLATION_DATE         TEXT,"
557                                                          "PKG_STATE                     INTEGER,"
558                                                          "PKG_INITIATOR                 INTEGER )");
559         r = db.ExecuteSql(createQuery, true);
560         TryReturn(r == E_SUCCESS, false, "db.ExecuteSql is failed. [%s]", GetErrorMessage(r));
561         createQuery.Clear();
562
563         // PkgPrivileges
564         createQuery.Format(1024, L"CREATE TABLE IF NOT EXISTS PkgPrivileges"
565                                                          "( ID                          INTEGER,"
566                                                          "PRIVILEGES                                    TEXT,"
567                                                          "HMAC_PPRIVILEGES                      TEXT,"
568                                                          "CERTIFICATE_TYPE              INTEGER,"
569                                                          "STR_PRIVILEGES                TEXT )");
570         r = db.ExecuteSql(createQuery, true);
571         TryReturn(r == E_SUCCESS, false, "db.ExecuteSql is failed. [%s]", GetErrorMessage(r));
572         createQuery.Clear();
573
574         // PkgIntegrity
575         createQuery.Format(1024, L"CREATE TABLE IF NOT EXISTS PkgIntegrity"
576                                                          "( ID                          INTEGER,"
577                                                          "HMAC_APPID                                    TEXT,"
578                                                          "HMAC_APPSECRET                                TEXT,"
579                                                          "HMAC_HTB                                              TEXT,"
580                                                          "SLOT_NUM                              INTEGER )");
581         r = db.ExecuteSql(createQuery, true);
582         TryReturn(r == E_SUCCESS, false, "db.ExecuteSql is failed. [%s]", GetErrorMessage(r));
583         createQuery.Clear();
584
585         // AppInfo
586         createQuery.Format(1024, L"CREATE TABLE IF NOT EXISTS AppInfo"
587                                                          "( UNIQUE_ID                                   INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,"
588                                                          "ID                            INTEGER,"
589                                                          "APP_NAME                  TEXT,"
590                                                          "APP_TYPE                  TEXT,"
591                                                          "APP_DEFAULT                   TEXT,"
592                                                          "APP_MAINMENU_ICON             TEXT,"
593                                                          "APP_SETTING_ICON          TEXT,"
594                                                          "APP_TICKER_ICON                               TEXT,"
595                                                          "APP_QUICKPANEL_ICON                   TEXT,"
596                                                          "APP_LAUNCHIMAGE_ICON      TEXT,"
597                                                          "APP_FEATURE               INTEGER,"
598                                                          "PACKAGE_NAME              TEXT )");
599         r = db.ExecuteSql(createQuery, true);
600         TryReturn(r == E_SUCCESS, false, "db.ExecuteSql is failed. [%s]", GetErrorMessage(r));
601         createQuery.Clear();
602
603         // Notification
604         createQuery.Format(1024, L"CREATE TABLE IF NOT EXISTS Notification"
605                                                          "( ID                          INTEGER,"
606                                                          "NAME                      TEXT,"
607                                                          "VALUE                     TEXT )");
608         r = db.ExecuteSql(createQuery, true);
609         TryReturn(r == E_SUCCESS, false, "db.ExecuteSql is failed. [%s]", GetErrorMessage(r));
610         createQuery.Clear();
611
612         // AppFeature
613         createQuery.Format(1024, L"CREATE TABLE IF NOT EXISTS AppFeature"
614                                                          "( ID                          INTEGER,"
615                                                          "NAME                      TEXT,"
616                                                          "VALUE                     TEXT )");
617         r = db.ExecuteSql(createQuery, true);
618         TryReturn(r == E_SUCCESS, false, "db.ExecuteSql is failed. [%s]", GetErrorMessage(r));
619         createQuery.Clear();
620
621         // LaunchCondition
622         createQuery.Format(1024, L"CREATE TABLE IF NOT EXISTS LaunchCondition"
623                                                          "( ID                          INTEGER,"
624                                                          "NAME                      TEXT,"
625                                                          "VALUE                     TEXT )");
626         r = db.ExecuteSql(createQuery, true);
627         TryReturn(r == E_SUCCESS, false, "db.ExecuteSql is failed. [%s]", GetErrorMessage(r));
628         createQuery.Clear();
629
630         // DataControl
631         createQuery.Format(1024, L"CREATE TABLE IF NOT EXISTS DataControl"
632                                                          "( ID INTEGER,"
633                                                          "PROVIDER_ID TEXT,"
634                                                          "TYPE TEXT,"
635                                                          "ACCESS TEXT )");
636         r = db.ExecuteSql(createQuery, true);
637         TryReturn(r == E_SUCCESS, false, "db.ExecuteSql is failed. [%s]", GetErrorMessage(r));
638         createQuery.Clear();
639
640         // Capability
641         createQuery.Format(1024, L"CREATE TABLE IF NOT EXISTS Capability"
642                                                          "( ID                          INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,"
643                                                          "OPERATION_ID                          TEXT )");
644         r = db.ExecuteSql(createQuery, true);
645         TryReturn(r == E_SUCCESS, false, "db.ExecuteSql is failed. [%s]", GetErrorMessage(r));
646         createQuery.Clear();
647
648         // ResolutionUriScheme
649         createQuery.Format(1024, L"CREATE TABLE IF NOT EXISTS ResolutionUriScheme"
650                                                          "( ID                          INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,"
651                                                          "URI_SCHEME                            TEXT )");
652         r = db.ExecuteSql(createQuery, true);
653         TryReturn(r == E_SUCCESS, false, "db.ExecuteSql is failed. [%s]", GetErrorMessage(r));
654         createQuery.Clear();
655
656         // ResolutionMimeType
657         createQuery.Format(1024, L"CREATE TABLE IF NOT EXISTS ResolutionMimeType"
658                                                          "( ID                          INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,"
659                                                          "MIME_TYPE                             TEXT )");
660         r = db.ExecuteSql(createQuery, true);
661         TryReturn(r == E_SUCCESS, false, "db.ExecuteSql is failed. [%s]", GetErrorMessage(r));
662         createQuery.Clear();
663
664         // AppControl
665         createQuery.Format(1024, L"CREATE TABLE IF NOT EXISTS AppControl"
666                                                          "( ID                          INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,"
667                                                          "PROVIDER_ID                   TEXT,"
668                                                          "CATEGORY                                      TEXT )");
669         r = db.ExecuteSql(createQuery, true);
670         TryReturn(r == E_SUCCESS, false, "db.ExecuteSql is failed. [%s]", GetErrorMessage(r));
671         createQuery.Clear();
672
673         // AppInfoLookup
674         createQuery.Format(1024, L"CREATE TABLE IF NOT EXISTS AppInfoLookup"
675                                                          "( AppInfoID                   INTEGER,"
676                                                          "CapabilityID              INTEGER,"
677                                                          "ResolutionUriSchemeID         INTEGER,"
678                                                          "ResolutionMimeTypeID      INTEGER,"
679                                                          "AppControlID                              INTEGER )");
680         r = db.ExecuteSql(createQuery, true);
681         TryReturn(r == E_SUCCESS, false, "db.ExecuteSql is failed. [%s]", GetErrorMessage(r));
682         createQuery.Clear();
683
684         String label("app-package::db");
685         String dbPath("/opt/usr/dbspace/.app-package.db");
686         String dbJournalPath("/opt/usr/dbspace/.app-package.db-journal");
687
688         SmackManager smackManager;
689         smackManager.AddLabelDir(label, dbPath);
690         smackManager.AddLabelDir(label, dbJournalPath);
691
692         return r;
693 }