replace : iotivity -> iotivity-sec
[platform/upstream/iotivity.git] / resource / csdk / security / provisioning / src / provisioningdatabasemanager.c
index 68c8ece..359b510 100644 (file)
@@ -66,6 +66,7 @@
 #define PDM_SQLITE_DELETE_LINK "DELETE FROM T_DEVICE_LINK_STATE WHERE ID = ? and ID2 = ?"
 #define PDM_SQLITE_DELETE_DEVICE_LINK "DELETE FROM T_DEVICE_LINK_STATE WHERE ID = ? or ID2 = ?"
 #define PDM_SQLITE_DELETE_DEVICE "DELETE FROM T_DEVICE_LIST  WHERE ID = ?"
+#define PDM_SQLITE_DELETE_DEVICE_WITH_STATE "DELETE FROM T_DEVICE_LIST  WHERE STATE= ?"
 #define PDM_SQLITE_UPDATE_LINK "UPDATE T_DEVICE_LINK_STATE SET STATE = ?  WHERE ID = ? and ID2 = ?"
 #define PDM_SQLITE_LIST_ALL_UUID "SELECT UUID FROM T_DEVICE_LIST WHERE STATE = 0"
 #define PDM_SQLITE_GET_UUID "SELECT UUID,STATE FROM T_DEVICE_LIST WHERE ID = ?"
@@ -93,6 +94,7 @@ static bool gInit = false;  /* Only if we can open sqlite db successfully, gInit
  */
 static OCStackResult createDB(const char* path)
 {
+    OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
 
     int result = 0;
     result = sqlite3_open_v2(path, &g_db, SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE, NULL);
@@ -107,6 +109,9 @@ static OCStackResult createDB(const char* path)
 
     OIC_LOG(INFO, TAG, "Created T_DEVICE_LINK_STATE");
     gInit = true;
+
+    OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
+
     return OC_STACK_OK;
 }
 
@@ -152,11 +157,13 @@ void errLogCallback(void *pArg, int iErrCode, const char *zMsg)
     (void) pArg;
     (void) iErrCode;
     (void) zMsg;
-    OIC_LOG_V(DEBUG,TAG, "(%d) %s", iErrCode, zMsg);
+    OIC_LOG_V(DEBUG,TAG, "%s : (%d) %s", __func__, iErrCode, zMsg);
 }
 
 OCStackResult PDMInit(const char *path)
 {
+    OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
+
     int rc;
     const char *dbPath = NULL;
     if (SQLITE_OK !=  sqlite3_config(SQLITE_CONFIG_LOG, errLogCallback, NULL))
@@ -176,15 +183,37 @@ OCStackResult PDMInit(const char *path)
     if (SQLITE_OK != rc)
     {
         OIC_LOG_V(INFO, TAG, "ERROR: Can't open database: %s", sqlite3_errmsg(g_db));
-        return createDB(dbPath);
+        sqlite3_close(g_db);
+        OCStackResult ret = createDB(dbPath);
+        if (OC_STACK_OK != ret)
+        {
+            sqlite3_close(g_db);
+        }
+        return ret;
     }
     gInit = true;
+
+    /*
+     * Remove PDM_DEVICE_INIT status devices.
+     * PDM_DEVICE_INIT means that the OTM process is in progress.
+     * PDM_DEVICE_INIT state device can be existed when the program is terminated during the OTM process in progress.
+     * For this reason, PDM_DEVICE_INIT devices should be removed at PDM initialization time.
+     */
+    if(OC_STACK_OK != PDMDeleteDeviceWithState(PDM_DEVICE_INIT))
+    {
+        OIC_LOG_V(WARNING, TAG, "Failed to delete init state devices.");
+    }
+
+    OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
+
     return OC_STACK_OK;
 }
 
 
 OCStackResult PDMAddDevice(const OicUuid_t *UUID)
 {
+    OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
+
     CHECK_PDM_INIT(TAG);
     if (NULL == UUID)
     {
@@ -218,6 +247,8 @@ OCStackResult PDMAddDevice(const OicUuid_t *UUID)
         return OC_STACK_ERROR;
     }
     sqlite3_finalize(stmt);
+
+    OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
     return OC_STACK_OK;
 }
 
@@ -226,6 +257,8 @@ OCStackResult PDMAddDevice(const OicUuid_t *UUID)
  */
 static OCStackResult getIdForUUID(const OicUuid_t *UUID , int *id)
 {
+    OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
+
     sqlite3_stmt *stmt = 0;
     int res = 0;
     res = sqlite3_prepare_v2(g_db, PDM_SQLITE_GET_ID, strlen(PDM_SQLITE_GET_ID) + 1, &stmt, NULL);
@@ -241,6 +274,7 @@ static OCStackResult getIdForUUID(const OicUuid_t *UUID , int *id)
         OIC_LOG_V(DEBUG, TAG, "ID is %d", tempId);
         *id = tempId;
         sqlite3_finalize(stmt);
+        OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
         return OC_STACK_OK;
     }
     sqlite3_finalize(stmt);
@@ -252,6 +286,7 @@ static OCStackResult getIdForUUID(const OicUuid_t *UUID , int *id)
  */
 OCStackResult PDMIsDuplicateDevice(const OicUuid_t* UUID, bool *result)
 {
+    OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
 
     CHECK_PDM_INIT(TAG);
     if (NULL == UUID || NULL == result)
@@ -277,6 +312,8 @@ OCStackResult PDMIsDuplicateDevice(const OicUuid_t* UUID, bool *result)
 
     sqlite3_finalize(stmt);
     *result = retValue;
+
+    OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
     return OC_STACK_OK;
 }
 
@@ -285,6 +322,8 @@ OCStackResult PDMIsDuplicateDevice(const OicUuid_t* UUID, bool *result)
  */
 static OCStackResult addlink(int id1, int id2)
 {
+    OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
+
     sqlite3_stmt *stmt = 0;
     int res = 0;
     res = sqlite3_prepare_v2(g_db, PDM_SQLITE_INSERT_LINK_DATA,
@@ -307,11 +346,14 @@ static OCStackResult addlink(int id1, int id2)
         return OC_STACK_ERROR;
     }
     sqlite3_finalize(stmt);
+    OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
     return OC_STACK_OK;
 }
 
 OCStackResult PDMLinkDevices(const OicUuid_t *UUID1, const OicUuid_t *UUID2)
 {
+    OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
+
     CHECK_PDM_INIT(TAG);
     if (NULL == UUID1 || NULL == UUID2)
     {
@@ -357,6 +399,7 @@ OCStackResult PDMLinkDevices(const OicUuid_t *UUID1, const OicUuid_t *UUID2)
     }
 
     ASCENDING_ORDER(id1, id2);
+    OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
     return addlink(id1, id2);
 }
 
@@ -365,6 +408,8 @@ OCStackResult PDMLinkDevices(const OicUuid_t *UUID1, const OicUuid_t *UUID2)
  */
 static OCStackResult removeLink(int id1, int id2)
 {
+    OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
+
     int res = 0;
     sqlite3_stmt *stmt = 0;
     res = sqlite3_prepare_v2(g_db, PDM_SQLITE_DELETE_LINK, strlen(PDM_SQLITE_DELETE_LINK) + 1, &stmt, NULL);
@@ -383,11 +428,14 @@ static OCStackResult removeLink(int id1, int id2)
         return OC_STACK_ERROR;
     }
     sqlite3_finalize(stmt);
+    OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
     return OC_STACK_OK;
 }
 
 OCStackResult PDMUnlinkDevices(const OicUuid_t *UUID1, const OicUuid_t *UUID2)
 {
+    OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
+
     CHECK_PDM_INIT(TAG);
     if (NULL == UUID1 || NULL == UUID2)
     {
@@ -409,11 +457,14 @@ OCStackResult PDMUnlinkDevices(const OicUuid_t *UUID1, const OicUuid_t *UUID2)
         return OC_STACK_INVALID_PARAM;
     }
     ASCENDING_ORDER(id1, id2);
+    OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
     return removeLink(id1, id2);
 }
 
 static OCStackResult removeFromDeviceList(int id)
 {
+    OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
+
     sqlite3_stmt *stmt = 0;
     int res = 0;
     res = sqlite3_prepare_v2(g_db, PDM_SQLITE_DELETE_DEVICE,
@@ -430,11 +481,14 @@ static OCStackResult removeFromDeviceList(int id)
         return OC_STACK_ERROR;
     }
     sqlite3_finalize(stmt);
+    OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
     return OC_STACK_OK;
 }
 
 OCStackResult PDMDeleteDevice(const OicUuid_t *UUID)
 {
+    OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
+
     CHECK_PDM_INIT(TAG);
     if (NULL == UUID)
     {
@@ -454,12 +508,15 @@ OCStackResult PDMDeleteDevice(const OicUuid_t *UUID)
         return OC_STACK_ERROR;
     }
     commit();
+    OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
     return OC_STACK_OK;
 }
 
 
 static OCStackResult updateLinkState(int id1, int id2, int state)
 {
+    OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
+
     sqlite3_stmt *stmt = 0;
     int res = 0 ;
     res = sqlite3_prepare_v2(g_db, PDM_SQLITE_UPDATE_LINK,
@@ -482,11 +539,14 @@ static OCStackResult updateLinkState(int id1, int id2, int state)
         return OC_STACK_ERROR;
     }
     sqlite3_finalize(stmt);
+    OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
     return OC_STACK_OK;
 }
 
 OCStackResult PDMSetLinkStale(const OicUuid_t* uuidOfDevice1, const OicUuid_t* uuidOfDevice2)
 {
+    OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
+
     CHECK_PDM_INIT(TAG);
     if (NULL == uuidOfDevice1 || NULL == uuidOfDevice2)
     {
@@ -508,11 +568,14 @@ OCStackResult PDMSetLinkStale(const OicUuid_t* uuidOfDevice1, const OicUuid_t* u
         return OC_STACK_INVALID_PARAM;
     }
     ASCENDING_ORDER(id1, id2);
+    OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
     return updateLinkState(id1, id2, PDM_DEVICE_STALE);
 }
 
 OCStackResult PDMGetOwnedDevices(OCUuidList_t **uuidList, size_t *numOfDevices)
 {
+    OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
+
     CHECK_PDM_INIT(TAG);
     if (NULL != *uuidList)
     {
@@ -543,11 +606,14 @@ OCStackResult PDMGetOwnedDevices(OCUuidList_t **uuidList, size_t *numOfDevices)
     }
     *numOfDevices = counter;
     sqlite3_finalize(stmt);
+    OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
     return OC_STACK_OK;
 }
 
 static OCStackResult getUUIDforId(int id, OicUuid_t *uid, bool *result)
 {
+    OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
+
     sqlite3_stmt *stmt = 0;
     int res = 0;
     res = sqlite3_prepare_v2(g_db, PDM_SQLITE_GET_UUID,
@@ -581,11 +647,14 @@ static OCStackResult getUUIDforId(int id, OicUuid_t *uid, bool *result)
         return OC_STACK_OK;
     }
     sqlite3_finalize(stmt);
+    OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
     return OC_STACK_INVALID_PARAM;
 }
 
 OCStackResult PDMGetLinkedDevices(const OicUuid_t *UUID, OCUuidList_t **UUIDLIST, size_t *numOfDevices)
 {
+    OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
+
     CHECK_PDM_INIT(TAG);
     if (NULL == UUID || NULL == numOfDevices || !UUIDLIST)
     {
@@ -657,11 +726,14 @@ OCStackResult PDMGetLinkedDevices(const OicUuid_t *UUID, OCUuidList_t **UUIDLIST
     }
     *numOfDevices = counter;
      sqlite3_finalize(stmt);
+     OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
      return OC_STACK_OK;
 }
 
 OCStackResult PDMGetToBeUnlinkedDevices(OCPairList_t **staleDevList, size_t *numOfDevices)
 {
+    OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
+
     CHECK_PDM_INIT(TAG);
     if (NULL != *staleDevList)
     {
@@ -702,20 +774,26 @@ OCStackResult PDMGetToBeUnlinkedDevices(OCPairList_t **staleDevList, size_t *num
     }
     *numOfDevices = counter;
     sqlite3_finalize(stmt);
+    OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
     return OC_STACK_OK;
 }
 
 OCStackResult PDMClose()
 {
+    OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
+
     CHECK_PDM_INIT(TAG);
     int res = 0;
     res = sqlite3_close(g_db);
     PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
+    OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
     return OC_STACK_OK;
 }
 
 void PDMDestoryOicUuidLinkList(OCUuidList_t* ptr)
 {
+    OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
+
     if(ptr)
     {
         OCUuidList_t *tmp1 = NULL,*tmp2=NULL;
@@ -725,10 +803,14 @@ void PDMDestoryOicUuidLinkList(OCUuidList_t* ptr)
             OICFree(tmp1);
         }
     }
+
+    OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
 }
 
 void PDMDestoryStaleLinkList(OCPairList_t* ptr)
 {
+    OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
+
     if(ptr)
     {
         OCPairList_t *tmp1 = NULL,*tmp2=NULL;
@@ -738,11 +820,15 @@ void PDMDestoryStaleLinkList(OCPairList_t* ptr)
             OICFree(tmp1);
         }
     }
+
+    OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
 }
 
 OCStackResult PDMIsLinkExists(const OicUuid_t* uuidOfDevice1, const OicUuid_t* uuidOfDevice2,
                                bool* result)
 {
+    OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
+
     CHECK_PDM_INIT(TAG);
     if (NULL == uuidOfDevice1 || NULL == uuidOfDevice2 || NULL == result)
     {
@@ -808,11 +894,14 @@ OCStackResult PDMIsLinkExists(const OicUuid_t* uuidOfDevice1, const OicUuid_t* u
     }
     sqlite3_finalize(stmt);
     *result = ret;
+    OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
     return OC_STACK_OK;
 }
 
 static OCStackResult updateDeviceState(const OicUuid_t *uuid, PdmDeviceState_t state)
 {
+    OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
+
     sqlite3_stmt *stmt = 0;
     int res = 0 ;
     res = sqlite3_prepare_v2(g_db, PDM_SQLITE_UPDATE_DEVICE,
@@ -832,11 +921,14 @@ static OCStackResult updateDeviceState(const OicUuid_t *uuid, PdmDeviceState_t s
         return OC_STACK_ERROR;
     }
     sqlite3_finalize(stmt);
+    OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
     return OC_STACK_OK;
 }
 
 static OCStackResult updateLinkForStaleDevice(const OicUuid_t *devUuid)
 {
+    OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
+
     sqlite3_stmt *stmt = 0;
     int res = 0 ;
 
@@ -865,11 +957,14 @@ static OCStackResult updateLinkForStaleDevice(const OicUuid_t *devUuid)
         return OC_STACK_ERROR;
     }
     sqlite3_finalize(stmt);
+    OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
     return OC_STACK_OK;
 }
 
 OCStackResult PDMSetDeviceState(const OicUuid_t* uuid, PdmDeviceState_t state)
 {
+    OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
+
     OCStackResult res = OC_STACK_ERROR;
 
     CHECK_PDM_INIT(TAG);
@@ -899,11 +994,14 @@ OCStackResult PDMSetDeviceState(const OicUuid_t* uuid, PdmDeviceState_t state)
         return res;
     }
     commit();
+    OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
     return OC_STACK_OK;
 }
 
 OCStackResult PDMGetDeviceState(const OicUuid_t *uuid, PdmDeviceState_t* result)
 {
+    OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
+
     if (NULL == uuid || NULL == result)
     {
         OIC_LOG(ERROR, TAG, "UUID or result is NULL");
@@ -927,6 +1025,37 @@ OCStackResult PDMGetDeviceState(const OicUuid_t *uuid, PdmDeviceState_t* result)
         *result = (PdmDeviceState_t)tempStaleStateFromDb;
     }
     sqlite3_finalize(stmt);
+    OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
     return OC_STACK_OK;
 }
 
+OCStackResult PDMDeleteDeviceWithState(const PdmDeviceState_t state)
+{
+    OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
+
+    CHECK_PDM_INIT(TAG);
+    if (PDM_DEVICE_ACTIVE != state && PDM_DEVICE_STALE != state &&
+        PDM_DEVICE_INIT != state && PDM_DEVICE_UNKNOWN != state)
+    {
+        return OC_STACK_INVALID_PARAM;
+    }
+
+    sqlite3_stmt *stmt = 0;
+    int res =0;
+    res = sqlite3_prepare_v2(g_db, PDM_SQLITE_DELETE_DEVICE_WITH_STATE,
+                              strlen(PDM_SQLITE_DELETE_DEVICE_WITH_STATE) + 1, &stmt, NULL);
+    PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
+
+    res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_FIRST, state);
+    PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
+
+    if (SQLITE_DONE != sqlite3_step(stmt))
+    {
+        OIC_LOG_V(ERROR, TAG, "Error message: %s", sqlite3_errmsg(g_db));
+        sqlite3_finalize(stmt);
+        return OC_STACK_ERROR;
+    }
+    sqlite3_finalize(stmt);
+    OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
+    return OC_STACK_OK;
+}