1 /* *****************************************************************
3 * Copyright 2015 Samsung Electronics All Rights Reserved.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
19 * *****************************************************************/
29 #include "oic_malloc.h"
30 #include "provisioningdatabasemanager.h"
31 #include "pmutility.h"
32 #include "oic_string.h"
36 #define DB_FILE "PDM.db"
40 #define PDM_STALE_STATE 1
41 #define PDM_ACTIVE_STATE 0
43 #define PDM_FIRST_INDEX 0
44 #define PDM_SECOND_INDEX 1
46 #define PDM_BIND_INDEX_FIRST 1
47 #define PDM_BIND_INDEX_SECOND 2
48 #define PDM_BIND_INDEX_THIRD 3
50 #define PDM_CREATE_T_DEVICE_LIST "create table T_DEVICE_LIST(ID INTEGER PRIMARY KEY AUTOINCREMENT,\
51 UUID BLOB NOT NULL UNIQUE);"
53 #define PDM_CREATE_T_DEVICE_LINK "create table T_DEVICE_LINK_STATE(ID INT NOT NULL, ID2 INT NOT \
54 NULL,STATE INT NOT NULL, PRIMARY KEY (ID, ID2));"
56 * Macro to verify sqlite success.
57 * eg: VERIFY_NON_NULL(TAG, ptrData, ERROR,OC_STACK_ERROR);
59 #define PDM_VERIFY_SQLITE_OK(tag, arg, logLevel, retValue) do{ if (SQLITE_OK != (arg)) \
60 { OC_LOG_V((logLevel), tag, ("Error in " #arg ", Error Message: %s"), \
61 sqlite3_errmsg(g_db)); return retValue; }}while(0)
63 #define PDM_SQLITE_TRANSACTION_BEGIN "BEGIN TRANSACTION;"
64 #define PDM_SQLITE_TRANSACTION_COMMIT "COMMIT;"
65 #define PDM_SQLITE_TRANSACTION_ROLLBACK "ROLLBACK;"
66 #define PDM_SQLITE_GET_STALE_INFO "SELECT ID,ID2 FROM T_DEVICE_LINK_STATE WHERE STATE = ?"
67 #define PDM_SQLITE_INSERT_T_DEVICE_LIST "INSERT INTO T_DEVICE_LIST VALUES(?,?)"
68 #define PDM_SQLITE_GET_ID "SELECT ID FROM T_DEVICE_LIST WHERE UUID like ?"
69 #define PDM_SQLITE_INSERT_LINK_DATA "INSERT INTO T_DEVICE_LINK_STATE VALUES(?,?,?)"
70 #define PDM_SQLITE_DELETE_LINK "DELETE FROM T_DEVICE_LINK_STATE WHERE ID = ? and ID2 = ?"
71 #define PDM_SQLITE_DELETE_DEVICE_LINK "DELETE FROM T_DEVICE_LINK_STATE WHERE ID = ? or ID2 = ?"
72 #define PDM_SQLITE_DELETE_DEVICE "DELETE FROM T_DEVICE_LIST WHERE ID = ?"
73 #define PDM_SQLITE_UPDATE_LINK "UPDATE T_DEVICE_LINK_STATE SET STATE = ? WHERE ID = ? and ID2 = ?"
74 #define PDM_SQLITE_LIST_ALL_UUID "SELECT UUID FROM T_DEVICE_LIST"
75 #define PDM_SQLITE_GET_UUID "SELECT UUID FROM T_DEVICE_LIST WHERE ID = ?"
76 #define PDM_SQLITE_GET_LINKED_DEVICES "SELECT ID,ID2 FROM T_DEVICE_LINK_STATE WHERE ID = ? or ID2 = ?"
78 #define ASCENDING_ORDER(id1, id2) do{if( (id1) > (id2) )\
79 { int temp; temp = id1; id1 = id2; id2 = temp; }}while(0)
81 static sqlite3 *g_db = NULL;
84 * function to create DB in case DB doesn't exists
86 static OCStackResult createDB(const char* path)
90 result = sqlite3_open_v2(path, &g_db, SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE, NULL);
91 PDM_VERIFY_SQLITE_OK(TAG, result, ERROR, OC_STACK_ERROR);
93 result = sqlite3_exec(g_db, PDM_CREATE_T_DEVICE_LIST, NULL, NULL, NULL);
94 PDM_VERIFY_SQLITE_OK(TAG, result, ERROR, OC_STACK_ERROR);
96 OC_LOG(INFO, TAG, "Created T_DEVICE_LIST");
97 result = sqlite3_exec(g_db, PDM_CREATE_T_DEVICE_LINK, NULL, NULL, NULL);
98 PDM_VERIFY_SQLITE_OK(TAG, result, ERROR, OC_STACK_ERROR);
100 OC_LOG(INFO, TAG, "Created T_DEVICE_LINK_STATE");
106 * Function to begin any transaction
108 static OCStackResult begin()
111 res = sqlite3_exec(g_db, PDM_SQLITE_TRANSACTION_BEGIN, NULL, NULL, NULL);
112 PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
117 * Function to commit any transaction
119 static OCStackResult commit()
122 res = sqlite3_exec(g_db, PDM_SQLITE_TRANSACTION_COMMIT, NULL, NULL, NULL);
123 PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
128 * Function to rollback any transaction
130 static OCStackResult rollback()
133 res = sqlite3_exec(g_db, PDM_SQLITE_TRANSACTION_ROLLBACK, NULL, NULL, NULL);
134 PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
139 * Error log callback called by SQLite stack in case of error
141 void errLogCallback(void *pArg, int iErrCode, const char *zMsg)
146 OC_LOG_V(DEBUG,TAG, "(%d) %s", iErrCode, zMsg);
149 OCStackResult PDMInit(const char *path)
152 const char *dbPath = NULL;
153 if (SQLITE_OK != sqlite3_config(SQLITE_CONFIG_LOG, errLogCallback, NULL))
155 OC_LOG(INFO, TAG, "Unable to enable debug log of sqlite");
158 if (NULL == path || !*path)
166 rc = sqlite3_open_v2(dbPath, &g_db, SQLITE_OPEN_READWRITE, NULL);
169 OC_LOG_V(INFO, TAG, "ERROR: Can't open database: %s", sqlite3_errmsg(g_db));
170 return createDB(dbPath);
176 OCStackResult PDMAddDevice(const OicUuid_t *UUID)
180 return OC_STACK_INVALID_PARAM;
183 sqlite3_stmt *stmt = 0;
185 res = sqlite3_prepare_v2(g_db, PDM_SQLITE_INSERT_T_DEVICE_LIST,
186 strlen(PDM_SQLITE_INSERT_T_DEVICE_LIST) + 1, &stmt, NULL);
187 PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
189 res = sqlite3_bind_blob(stmt, PDM_BIND_INDEX_SECOND, UUID, UUID_LENGTH, SQLITE_STATIC);
190 PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
192 res = sqlite3_step(stmt);
193 if (SQLITE_DONE != res)
195 if (SQLITE_CONSTRAINT == res)
197 //new OCStack result code
198 OC_LOG_V(ERROR, TAG, "Error Occured: %s",sqlite3_errmsg(g_db));
199 sqlite3_finalize(stmt);
200 return OC_STACK_DUPLICATE_UUID;
202 OC_LOG_V(ERROR, TAG, "Error Occured: %s",sqlite3_errmsg(g_db));
203 sqlite3_finalize(stmt);
204 return OC_STACK_ERROR;
206 sqlite3_finalize(stmt);
211 *function to get Id for given UUID
213 static OCStackResult getIdForUUID(const OicUuid_t *UUID , int *id)
215 sqlite3_stmt *stmt = 0;
217 res = sqlite3_prepare_v2(g_db, PDM_SQLITE_GET_ID, strlen(PDM_SQLITE_GET_ID) + 1, &stmt, NULL);
218 PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
220 res = sqlite3_bind_blob(stmt, PDM_BIND_INDEX_FIRST, UUID, UUID_LENGTH, SQLITE_STATIC);
221 PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
223 OC_LOG(DEBUG, TAG, "Binding Done");
224 while (SQLITE_ROW == sqlite3_step(stmt))
226 int tempId = sqlite3_column_int(stmt, PDM_FIRST_INDEX);
227 OC_LOG_V(DEBUG, TAG, "ID is %d", tempId);
230 sqlite3_finalize(stmt);
235 * Function to check duplication of device's Device ID.
237 bool PDMIsDuplicateDevice(const OicUuid_t* UUID)
241 OC_LOG(ERROR, TAG, "UUID is NULL");
245 sqlite3_stmt *stmt = 0;
247 res = sqlite3_prepare_v2(g_db, PDM_SQLITE_GET_ID, strlen(PDM_SQLITE_GET_ID) + 1, &stmt, NULL);
248 PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
250 res = sqlite3_bind_blob(stmt, PDM_BIND_INDEX_FIRST, UUID, UUID_LENGTH, SQLITE_STATIC);
251 PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
253 OC_LOG(DEBUG, TAG, "Binding Done");
255 while (SQLITE_ROW == sqlite3_step(stmt))
257 OC_LOG(ERROR, TAG, "UUID is duplicated");
258 sqlite3_finalize(stmt);
261 sqlite3_finalize(stmt);
266 * Function to add link in sqlite
268 static OCStackResult addlink(int id1, int id2)
270 sqlite3_stmt *stmt = 0;
272 res = sqlite3_prepare_v2(g_db, PDM_SQLITE_INSERT_LINK_DATA,
273 strlen(PDM_SQLITE_INSERT_LINK_DATA) + 1, &stmt, NULL);
274 PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
276 res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_FIRST, id1);
277 PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
279 res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_SECOND, id2);
280 PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
282 res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_THIRD, PDM_ACTIVE_STATE);
283 PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
285 if (sqlite3_step(stmt) != SQLITE_DONE)
287 OC_LOG_V(ERROR, TAG, "Error Occured: %s",sqlite3_errmsg(g_db));
288 sqlite3_finalize(stmt);
289 return OC_STACK_ERROR;
291 sqlite3_finalize(stmt);
295 OCStackResult PDMLinkDevices(const OicUuid_t *UUID1, const OicUuid_t *UUID2)
298 if (NULL == UUID1 || NULL == UUID2)
300 OC_LOG(ERROR, TAG, "Invalid PARAM");
301 return OC_STACK_INVALID_PARAM;
304 if (OC_STACK_OK != getIdForUUID(UUID1, &id1))
306 OC_LOG(ERROR, TAG, "Requested value not found");
307 return OC_STACK_INVALID_PARAM;
310 if (OC_STACK_OK != getIdForUUID(UUID2, &id2))
312 OC_LOG(ERROR, TAG, "Requested value not found");
313 return OC_STACK_INVALID_PARAM;
315 ASCENDING_ORDER(id1, id2);
316 return addlink(id1, id2);
320 * Function to remove created link
322 static OCStackResult removeLink(int id1, int id2)
325 sqlite3_stmt *stmt = 0;
326 res = sqlite3_prepare_v2(g_db, PDM_SQLITE_DELETE_LINK, strlen(PDM_SQLITE_DELETE_LINK) + 1, &stmt, NULL);
327 PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
329 res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_FIRST, id1);
330 PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
332 res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_SECOND, id2);
333 PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
335 if (SQLITE_DONE != sqlite3_step(stmt))
337 OC_LOG_V(ERROR, TAG, "Error message: %s", sqlite3_errmsg(g_db));
338 sqlite3_finalize(stmt);
339 return OC_STACK_ERROR;
341 sqlite3_finalize(stmt);
345 OCStackResult PDMUnlinkDevices(const OicUuid_t *UUID1, const OicUuid_t *UUID2)
347 if (NULL == UUID1 || NULL == UUID2)
349 OC_LOG(ERROR, TAG, "Invalid PARAM");
350 return OC_STACK_INVALID_PARAM;
354 if (OC_STACK_OK != getIdForUUID(UUID1, &id1))
356 OC_LOG(ERROR, TAG, "Requested value not found");
357 return OC_STACK_INVALID_PARAM;
361 if (OC_STACK_OK != getIdForUUID(UUID2, &id2))
363 OC_LOG(ERROR, TAG, "Requested value not found");
364 return OC_STACK_INVALID_PARAM;
366 ASCENDING_ORDER(id1, id2);
367 return removeLink(id1, id2);
370 static OCStackResult removeFromDeviceList(int id)
372 sqlite3_stmt *stmt = 0;
374 res = sqlite3_prepare_v2(g_db, PDM_SQLITE_DELETE_DEVICE,
375 strlen(PDM_SQLITE_DELETE_DEVICE) + 1, &stmt, NULL);
376 PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
378 res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_FIRST, id);
379 PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
381 if (sqlite3_step(stmt) != SQLITE_DONE)
383 OC_LOG_V(ERROR, TAG, "Error message: %s", sqlite3_errmsg(g_db));
384 sqlite3_finalize(stmt);
385 return OC_STACK_ERROR;
387 sqlite3_finalize(stmt);
391 OCStackResult PDMDeleteDevice(const OicUuid_t *UUID)
395 return OC_STACK_INVALID_PARAM;
398 if (OC_STACK_OK != getIdForUUID(UUID, &id))
400 OC_LOG(ERROR, TAG, "Requested value not found");
401 return OC_STACK_INVALID_PARAM;
404 if(OC_STACK_OK != removeFromDeviceList(id))
407 OC_LOG(ERROR, TAG, "Requested value not found");
408 return OC_STACK_ERROR;
415 OCStackResult updateLinkState(int id1, int id2, int state)
417 sqlite3_stmt *stmt = 0;
419 res = sqlite3_prepare_v2(g_db, PDM_SQLITE_UPDATE_LINK,
420 strlen(PDM_SQLITE_UPDATE_LINK) + 1, &stmt, NULL);
421 PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
423 res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_FIRST, state);
424 PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
426 res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_SECOND, id1);
427 PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
429 res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_THIRD, id2);
430 PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
432 if (SQLITE_DONE != sqlite3_step(stmt))
434 OC_LOG_V(ERROR, TAG, "Error message: %s", sqlite3_errmsg(g_db));
435 sqlite3_finalize(stmt);
438 sqlite3_finalize(stmt);
442 OCStackResult PDMSetLinkStale(const OicUuid_t* uuidOfDevice1, const OicUuid_t* uuidOfDevice2)
444 if (NULL == uuidOfDevice1 || NULL == uuidOfDevice2)
446 OC_LOG(ERROR, TAG, "Invalid PARAM");
447 return OC_STACK_INVALID_PARAM;
451 if (OC_STACK_OK != getIdForUUID(uuidOfDevice1, &id1))
453 OC_LOG(ERROR, TAG, "Requested value not found");
454 return OC_STACK_INVALID_PARAM;
458 if (OC_STACK_OK != getIdForUUID(uuidOfDevice2, &id2))
460 OC_LOG(ERROR, TAG, "Requested value not found");
461 return OC_STACK_INVALID_PARAM;
463 ASCENDING_ORDER(id1, id2);
464 return updateLinkState(id1, id2, PDM_STALE_STATE);
468 OCStackResult PDMGetOwnedDevices(OCUuidList_t **uuidList, size_t *numOfDevices)
470 if (NULL != *uuidList)
472 OC_LOG(ERROR, TAG, "Not null list will cause memory leak");
473 return OC_STACK_INVALID_PARAM;
475 sqlite3_stmt *stmt = 0;
477 res = sqlite3_prepare_v2(g_db, PDM_SQLITE_LIST_ALL_UUID,
478 strlen(PDM_SQLITE_LIST_ALL_UUID) + 1, &stmt, NULL);
479 PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
482 while (SQLITE_ROW == sqlite3_step(stmt))
485 const void *ptr = sqlite3_column_blob(stmt, PDM_FIRST_INDEX);
486 OicUuid_t *uid = (OicUuid_t *)ptr;
487 OCUuidList_t *temp = (OCUuidList_t *) OICCalloc(1,sizeof(OCUuidList_t));
490 OC_LOG_V(ERROR, TAG, "Memory allocation problem");
491 sqlite3_finalize(stmt);
492 return OC_STACK_NO_MEMORY;
494 memcpy(&temp->dev.id, uid->id, UUID_LENGTH);
495 LL_PREPEND(*uuidList,temp);
498 *numOfDevices = counter;
499 sqlite3_finalize(stmt);
503 static OCStackResult getUUIDforId(int id, OicUuid_t *uid)
505 sqlite3_stmt *stmt = 0;
507 res = sqlite3_prepare_v2(g_db, PDM_SQLITE_GET_UUID,
508 strlen(PDM_SQLITE_GET_UUID) + 1, &stmt, NULL);
509 PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
511 res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_FIRST, id);
512 PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
514 while (SQLITE_ROW == sqlite3_step(stmt))
516 const void *ptr = sqlite3_column_blob(stmt, PDM_FIRST_INDEX);
517 memcpy(uid, ptr, sizeof(OicUuid_t));
519 sqlite3_finalize(stmt);
523 OCStackResult PDMGetLinkedDevices(const OicUuid_t *UUID, OCUuidList_t **UUIDLIST, size_t *numOfDevices)
525 if (NULL != *UUIDLIST)
527 OC_LOG(ERROR, TAG, "Not null list will cause memory leak");
528 return OC_STACK_INVALID_PARAM;
532 return OC_STACK_INVALID_PARAM;
535 if (OC_STACK_OK != getIdForUUID(UUID, &id))
537 OC_LOG(ERROR, TAG, "Requested value not found");
538 return OC_STACK_INVALID_PARAM;
541 sqlite3_stmt *stmt = 0;
543 res = sqlite3_prepare_v2(g_db, PDM_SQLITE_GET_LINKED_DEVICES,
544 strlen(PDM_SQLITE_GET_LINKED_DEVICES) + 1, &stmt, NULL);
545 PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
547 res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_FIRST, id);
548 PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
550 res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_SECOND, id);
551 PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
554 while (SQLITE_ROW == sqlite3_step(stmt))
556 int i1 = sqlite3_column_int(stmt, PDM_FIRST_INDEX);
557 int i2 = sqlite3_column_int(stmt, PDM_SECOND_INDEX);
559 OicUuid_t temp = {{0,}};
562 getUUIDforId(i1, &temp);
566 getUUIDforId(i2, &temp);
569 OCUuidList_t *tempNode = (OCUuidList_t *) OICCalloc(1,sizeof(OCUuidList_t));
570 if (NULL == tempNode)
572 OC_LOG(ERROR, TAG, "No Memory");
573 sqlite3_finalize(stmt);
574 return OC_STACK_NO_MEMORY;
576 memcpy(&tempNode->dev.id, &temp.id, UUID_LENGTH);
577 LL_PREPEND(*UUIDLIST,tempNode);
580 *numOfDevices = counter;
581 sqlite3_finalize(stmt);
585 OCStackResult PDMGetToBeUnlinkedDevices(OCPairList_t **staleDevList, size_t *numOfDevices)
587 if (NULL != *staleDevList)
589 OC_LOG(ERROR, TAG, "Not null list will cause memory leak");
590 return OC_STACK_INVALID_PARAM;
593 sqlite3_stmt *stmt = 0;
595 res = sqlite3_prepare_v2(g_db, PDM_SQLITE_GET_STALE_INFO,
596 strlen(PDM_SQLITE_GET_STALE_INFO) + 1, &stmt, NULL);
597 PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
599 res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_FIRST, PDM_STALE_STATE);
600 PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
603 while (SQLITE_ROW == sqlite3_step(stmt))
605 int i1 = sqlite3_column_int(stmt, PDM_FIRST_INDEX);
606 int i2 = sqlite3_column_int(stmt, PDM_SECOND_INDEX);
607 OicUuid_t temp1 = {{0,}};
608 OicUuid_t temp2 = {{0,}};;
609 getUUIDforId(i1, &temp1);
610 getUUIDforId(i2, &temp2);
612 OCPairList_t *tempNode = (OCPairList_t *) OICCalloc(1, sizeof(OCPairList_t));
613 if (NULL == tempNode)
615 OC_LOG(ERROR, TAG, "No Memory");
616 sqlite3_finalize(stmt);
617 return OC_STACK_NO_MEMORY;
619 memcpy(&tempNode->dev.id, &temp1.id, UUID_LENGTH);
620 memcpy(&tempNode->dev2.id, &temp2.id, UUID_LENGTH);
621 LL_PREPEND(*staleDevList, tempNode);
624 *numOfDevices = counter;
625 sqlite3_finalize(stmt);
629 OCStackResult PDMClose()
632 res = sqlite3_close(g_db);
633 PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
637 OCStackResult PDMDestoryOicUuidLinkList(OCUuidList_t* ptr)
639 OCUuidList_t *tmp1 = NULL,*tmp2=NULL;
640 LL_FOREACH_SAFE(ptr, tmp1, tmp2)
642 LL_DELETE(ptr, tmp1);
648 OCStackResult PDMDestoryStaleLinkList(OCPairList_t* ptr)
650 OCPairList_t *tmp1 = NULL,*tmp2=NULL;
651 LL_FOREACH_SAFE(ptr, tmp1, tmp2)
653 LL_DELETE(ptr, tmp1);