Update snapshot(2017-12-06)
[platform/upstream/iotivity.git] / resource / csdk / resource-directory / src / internal / rd_database.c
index 8be91e9..c178b36 100644 (file)
@@ -279,16 +279,20 @@ static int storeLinkPayload(OCRepPayload *rdPayload, int64_t rowid)
             char **itf = NULL;
             OCRepPayloadGetStringArray(link, OC_RSRVD_INTERFACE, &itf, itfDim);
 
-            if (SQLITE_DONE != sqlite3_step(stmt))
+            int sqlRet = sqlite3_step(stmt);
+            if (SQLITE_DONE != sqlRet)
             {
                 sqlite3_finalize(stmt);
-                return res;
             }
-            VERIFY_SQLITE(sqlite3_exec(gRDDB, "COMMIT", NULL, NULL, NULL));
+            else
+            {
+                VERIFY_SQLITE(sqlite3_exec(gRDDB, "COMMIT", NULL, NULL, NULL));
+
+                int64_t ins = sqlite3_last_insert_rowid(gRDDB);
+                VERIFY_SQLITE(storeResourceType(rt, rtDim[0], ins));
+                VERIFY_SQLITE(storeInterfaceType(itf, itfDim[0], ins));
+            }
 
-            int64_t ins = sqlite3_last_insert_rowid(gRDDB);
-            VERIFY_SQLITE(storeResourceType(rt, rtDim[0], ins));
-            VERIFY_SQLITE(storeInterfaceType(itf, itfDim[0], ins));
             OICFree(uri);
             OCPayloadDestroy((OCPayload *)p);
             for (j = 0; j < mtDim[0]; j++)
@@ -309,10 +313,30 @@ static int storeLinkPayload(OCRepPayload *rdPayload, int64_t rowid)
             }
             OICFree(itf);
 
+            if (SQLITE_DONE != sqlRet)
+            {
+                // Free links
+                size_t count = calcDimTotal(dimensions);
+                for (size_t k = 0; k < count; k++)
+                {
+                    OCRepPayloadDestroy(links[k]);
+                }
+                OICFree(links);
+
+                return res;
+            }
         }
 
         VERIFY_SQLITE(sqlite3_finalize(stmt));
         res = SQLITE_OK;
+
+        // Free links
+        size_t count = calcDimTotal(dimensions);
+        for (size_t k = 0; k < count; k++)
+        {
+            OCRepPayloadDestroy(links[k]);
+        }
+        OICFree(links);
     }
     return res;
 }
@@ -346,6 +370,7 @@ OCStackResult OCRDDatabaseStoreResources(OCRepPayload *payload, const OCDevAddr
     if (SQLITE_DONE != sqlite3_step(stmt))
     {
         sqlite3_finalize(stmt);
+        OICFree(deviceid);
         return OC_STACK_ERROR;
     }
     VERIFY_SQLITE(sqlite3_finalize(stmt));