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 * *****************************************************************/
28 #include "oic_malloc.h"
29 #include "provisioningdatabasemanager.h"
30 #include "pmutility.h"
31 #include "oic_string.h"
33 #include "srmutility.h"
36 #define DB_FILE "PDM.db"
40 #define PDM_FIRST_INDEX 0
41 #define PDM_SECOND_INDEX 1
43 #define PDM_BIND_INDEX_FIRST 1
44 #define PDM_BIND_INDEX_SECOND 2
45 #define PDM_BIND_INDEX_THIRD 3
47 #define HEX_UUID_STR_LENGTH (UUID_LENGTH*2 + 4)
49 #define PDM_CREATE_T_DEVICE_LIST "create table T_DEVICE_LIST(ID INTEGER PRIMARY KEY AUTOINCREMENT,\
50 UUID BLOB NOT NULL UNIQUE, STATE INT NOT NULL);"
52 #define PDM_CREATE_T_DEVICE_LINK "create table T_DEVICE_LINK_STATE(ID INT NOT NULL, ID2 INT NOT \
53 NULL,STATE INT NOT NULL, PRIMARY KEY (ID, ID2));"
55 * Macro to verify sqlite success.
56 * eg: VERIFY_NON_NULL(TAG, ptrData, ERROR,OC_STACK_ERROR);
58 #define PDM_VERIFY_SQLITE_OK(tag, arg, stmt, logLevel, retValue) do{ if (SQLITE_OK != (arg)) \
59 { OIC_LOG_V((logLevel), tag, "Error in " #arg ", Error Message: %s", \
60 sqlite3_errmsg(g_db)); sqlite3_finalize(stmt); 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 = "
69 #define PDM_SQLITE_GET_ID_SIZE (int)sizeof(PDM_SQLITE_GET_ID)
70 #define PDM_SQLITE_INSERT_LINK_DATA "INSERT INTO T_DEVICE_LINK_STATE VALUES(?,?,?)"
71 #define PDM_SQLITE_DELETE_LINK "DELETE FROM T_DEVICE_LINK_STATE WHERE ID = ? and ID2 = ?"
72 #define PDM_SQLITE_DELETE_DEVICE_LINK "DELETE FROM T_DEVICE_LINK_STATE WHERE ID = ? or ID2 = ?"
73 #define PDM_SQLITE_DELETE_DEVICE "DELETE FROM T_DEVICE_LIST WHERE ID = ?"
74 #define PDM_SQLITE_DELETE_DEVICE_WITH_STATE "DELETE FROM T_DEVICE_LIST WHERE STATE= ?"
75 #define PDM_SQLITE_UPDATE_LINK "UPDATE T_DEVICE_LINK_STATE SET STATE = ? WHERE ID = ? and ID2 = ?"
76 #define PDM_SQLITE_LIST_ALL_UUID "SELECT UUID FROM T_DEVICE_LIST WHERE STATE = 0"
77 #define PDM_SQLITE_GET_UUID "SELECT UUID,STATE FROM T_DEVICE_LIST WHERE ID = ?"
78 #define PDM_SQLITE_GET_LINKED_DEVICES "SELECT ID,ID2 FROM T_DEVICE_LINK_STATE WHERE \
79 (ID = ? or ID2 = ?) and state = 0"
80 #define PDM_SQLITE_GET_DEVICE_LINKS "SELECT ID,ID2 FROM T_DEVICE_LINK_STATE WHERE \
81 ID = ? and ID2 = ? and state = 0"
82 #define PDM_SQLITE_UPDATE_DEVICE "UPDATE T_DEVICE_LIST SET STATE = ? WHERE UUID = "
83 #define PDM_SQLITE_UPDATE_DEVICE_SIZE (int)sizeof(PDM_SQLITE_UPDATE_DEVICE)
84 #define PDM_SQLITE_GET_DEVICE_STATUS "SELECT STATE FROM T_DEVICE_LIST WHERE UUID = "
85 #define PDM_SQLITE_GET_DEVICE_STATUS_SIZE (int)sizeof(PDM_SQLITE_GET_DEVICE_STATUS)
86 #define PDM_SQLITE_UPDATE_LINK_STALE_FOR_STALE_DEVICE "UPDATE T_DEVICE_LINK_STATE SET STATE = 1\
87 WHERE ID = ? or ID2 = ?"
88 #define OTM_CREATE_TABLE "CREATE TABLE IF NOT EXISTS otm(\
89 id INTEGER PRIMARY KEY AUTOINCREMENT,\
91 uuid TEXT NOT NULL UNIQUE,\
92 state INT DEFAULT(1) NOT NULL,\
93 time TIMESTAMP DEFAULT(datetime(\'now\',\'localtime\')) NOT NULL);"
95 #define OTM_INSERT "INSERT INTO otm(owner,uuid) VALUES(?,?)"
96 #define OTM_UPDATE "UPDATE otm SET state=? WHERE uuid=?"
97 #define OTM_GET_STATE "SELECT state FROM otm WHERE uuid=?"
99 #define ASCENDING_ORDER(id1, id2) do{if( (id1) > (id2) )\
100 { int temp; temp = id1; id1 = id2; id2 = temp; }}while(0)
102 #define CHECK_PDM_INIT(tag) do{if(true != gInit)\
103 { OIC_LOG(ERROR, (tag), "PDB is not initialized"); \
104 return OC_STACK_PDM_IS_NOT_INITIALIZED; }}while(0)
106 static sqlite3 *g_db = NULL;
107 static bool gInit = false; /* Only if we can open sqlite db successfully, gInit is true. */
110 * function to create DB in case DB doesn't exists
112 static OCStackResult createDB(const char* path)
114 OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
117 result = sqlite3_open_v2(path, &g_db, SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE, NULL);
118 PDM_VERIFY_SQLITE_OK(TAG, result, NULL, ERROR, OC_STACK_ERROR);
120 result = sqlite3_exec(g_db, PDM_CREATE_T_DEVICE_LIST, NULL, NULL, NULL);
121 PDM_VERIFY_SQLITE_OK(TAG, result, NULL, ERROR, OC_STACK_ERROR);
123 OIC_LOG(INFO, TAG, "Created T_DEVICE_LIST");
124 result = sqlite3_exec(g_db, PDM_CREATE_T_DEVICE_LINK, NULL, NULL, NULL);
125 PDM_VERIFY_SQLITE_OK(TAG, result, NULL, ERROR, OC_STACK_ERROR);
127 OIC_LOG(INFO, TAG, "Created T_DEVICE_LINK_STATE");
129 result = sqlite3_exec(g_db, OTM_CREATE_TABLE, NULL, NULL, NULL);
130 PDM_VERIFY_SQLITE_OK(TAG, result, NULL, ERROR, OC_STACK_ERROR);
134 OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
141 * Function to begin any transaction
143 static OCStackResult begin()
146 res = sqlite3_exec(g_db, PDM_SQLITE_TRANSACTION_BEGIN, NULL, NULL, NULL);
147 PDM_VERIFY_SQLITE_OK(TAG, res, NULL, ERROR, OC_STACK_ERROR);
152 * Function to commit any transaction
154 static OCStackResult commit()
157 res = sqlite3_exec(g_db, PDM_SQLITE_TRANSACTION_COMMIT, NULL, NULL, NULL);
158 PDM_VERIFY_SQLITE_OK(TAG, res, NULL, ERROR, OC_STACK_ERROR);
163 * Function to rollback any transaction
165 static OCStackResult rollback()
168 res = sqlite3_exec(g_db, PDM_SQLITE_TRANSACTION_ROLLBACK, NULL, NULL, NULL);
169 PDM_VERIFY_SQLITE_OK(TAG, res, NULL, ERROR, OC_STACK_ERROR);
174 * Function to convert UUID into hex representation
176 static bool convertUuidToHexString(const OicUuid_t* uuidOfDevice, char* uuidHexString)
178 if(NULL == uuidOfDevice || NULL == uuidHexString)
180 OIC_LOG(ERROR, TAG, "convertUuidToHexString : Invalid param");
184 char *strUUID = NULL;
185 OCStackResult ret = ConvertUuidToStr(uuidOfDevice, &strUUID);
186 if(OC_STACK_OK != ret)
188 OIC_LOG(ERROR, TAG, "SendDeleteCredentialRequest : Failed to canonical UUID encoding");
189 return OC_STACK_ERROR;
192 char* headPtr = strUUID;
193 strncat(uuidHexString, "x'",2);
194 while(('\0' != *headPtr))
199 strncat(uuidHexString, &tmp,1);
203 strncat(uuidHexString, "'",1);
210 * Error log callback called by SQLite stack in case of error
212 void errLogCallback(void *pArg, int iErrCode, const char *zMsg)
217 OIC_LOG_V(DEBUG,TAG, "%s : (%d) %s", __func__, iErrCode, zMsg);
220 OCStackResult PDMInit(const char *path)
222 OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
225 const char *dbPath = NULL;
226 if (SQLITE_OK != sqlite3_config(SQLITE_CONFIG_LOG, errLogCallback, NULL))
228 OIC_LOG(INFO, TAG, "Unable to enable debug log of sqlite");
231 if (NULL == path || !*path)
239 rc = sqlite3_open_v2(dbPath, &g_db, SQLITE_OPEN_READWRITE, NULL);
242 OIC_LOG_V(INFO, TAG, "ERROR: Can't open database: %s", sqlite3_errmsg(g_db));
244 OCStackResult ret = createDB(dbPath);
245 if (OC_STACK_OK != ret)
252 rc = sqlite3_exec(g_db, OTM_CREATE_TABLE, NULL, NULL, NULL);
253 PDM_VERIFY_SQLITE_OK(TAG, rc, NULL, ERROR, OC_STACK_ERROR);
258 * Remove PDM_DEVICE_INIT status devices.
259 * PDM_DEVICE_INIT means that the OTM process is in progress.
260 * PDM_DEVICE_INIT state device can be existed when the program is terminated during the OTM process in progress.
261 * For this reason, PDM_DEVICE_INIT devices should be removed at PDM initialization time.
263 if(OC_STACK_OK != PDMDeleteDeviceWithState(PDM_DEVICE_INIT))
265 OIC_LOG_V(WARNING, TAG, "Failed to delete init state devices.");
268 OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
273 OCStackResult OTMStart(const OicUuid_t *uuid, const OicUuid_t *owner)
275 OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
279 if (NULL == uuid || NULL == owner)
281 return OC_STACK_INVALID_PARAM;
284 sqlite3_stmt *stmt = 0;
286 char *uuidStr = NULL;
287 OCStackResult ret = OC_STACK_OK;
289 res = sqlite3_prepare_v2(g_db, OTM_INSERT, strlen(OTM_INSERT) + 1, &stmt, NULL);
290 PDM_VERIFY_SQLITE_OK(TAG, res, NULL, ERROR, OC_STACK_ERROR);
292 ConvertUuidToStr(owner, &uuidStr);
294 res = sqlite3_bind_text(stmt, 1, uuidStr, strlen(uuidStr), SQLITE_TRANSIENT);
295 PDM_VERIFY_SQLITE_OK(TAG, res, NULL, ERROR, OC_STACK_ERROR);
299 ConvertUuidToStr(uuid, &uuidStr);
301 res = sqlite3_bind_text(stmt, 2, uuidStr, strlen(uuidStr), SQLITE_TRANSIENT);
302 PDM_VERIFY_SQLITE_OK(TAG, res, NULL, ERROR, OC_STACK_ERROR);
306 res = sqlite3_step(stmt);
307 if (SQLITE_DONE != res)
309 if (SQLITE_CONSTRAINT == res)
312 if(OC_STACK_OK == OTMGetState(uuid, &state) && 1 == state)
314 OIC_LOG_V(WARNING, TAG, "%s OTM already started", __func__);
315 ret = OC_STACK_DUPLICATE_UUID;
320 ret = OC_STACK_ERROR;
323 sqlite3_finalize(stmt);
325 OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
329 OCStackResult OTMSetState(const OicUuid_t *uuid, int state)
331 OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
337 return OC_STACK_INVALID_PARAM;
340 sqlite3_stmt *stmt = 0;
342 char *uuidStr = NULL;
344 res = sqlite3_prepare_v2(g_db, OTM_UPDATE, strlen(OTM_UPDATE) + 1, &stmt, NULL);
345 PDM_VERIFY_SQLITE_OK(TAG, res, NULL, ERROR, OC_STACK_ERROR);
347 res = sqlite3_bind_int(stmt, 1, state);
348 PDM_VERIFY_SQLITE_OK(TAG, res, NULL, ERROR, OC_STACK_ERROR);
350 ConvertUuidToStr(uuid, &uuidStr);
352 res = sqlite3_bind_text(stmt, 2, uuidStr, strlen(uuidStr), SQLITE_TRANSIENT);
353 PDM_VERIFY_SQLITE_OK(TAG, res, NULL, ERROR, OC_STACK_ERROR);
357 if (SQLITE_DONE != sqlite3_step(stmt))
359 OIC_LOG_V(ERROR, TAG, "Error message: %s", sqlite3_errmsg(g_db));
360 sqlite3_finalize(stmt);
361 return OC_STACK_ERROR;
363 sqlite3_finalize(stmt);
364 OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
368 OCStackResult OTMStop(const OicUuid_t *uuid)
370 return OTMSetState(uuid, 2);
373 OCStackResult OTMGetState(const OicUuid_t *uuid, int *state)
375 OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
381 return OC_STACK_INVALID_PARAM;
384 sqlite3_stmt *stmt = 0;
386 char *uuidStr = NULL;
387 OCStackResult ret = OC_STACK_ERROR;
389 res = sqlite3_prepare_v2(g_db, OTM_GET_STATE, strlen(OTM_GET_STATE) + 1, &stmt, NULL);
390 PDM_VERIFY_SQLITE_OK(TAG, res, NULL, ERROR, OC_STACK_ERROR);
392 ConvertUuidToStr(uuid, &uuidStr);
393 res = sqlite3_bind_text(stmt, 1, uuidStr, strlen(uuidStr), SQLITE_TRANSIENT);
394 PDM_VERIFY_SQLITE_OK(TAG, res, NULL, ERROR, OC_STACK_ERROR);
396 while (SQLITE_ROW == sqlite3_step(stmt))
398 *state = sqlite3_column_int(stmt, 1);
399 OIC_LOG_V(DEBUG, TAG, "%s state is %d", uuidStr, *state);
405 sqlite3_finalize(stmt);
406 OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
410 OCStackResult PDMAddDevice(const OicUuid_t *UUID)
412 OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
417 return OC_STACK_INVALID_PARAM;
420 sqlite3_stmt *stmt = 0;
422 res = sqlite3_prepare_v2(g_db, PDM_SQLITE_INSERT_T_DEVICE_LIST,
423 strlen(PDM_SQLITE_INSERT_T_DEVICE_LIST) + 1, &stmt, NULL);
424 PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR);
426 res = sqlite3_bind_blob(stmt, PDM_BIND_INDEX_SECOND, UUID, UUID_LENGTH, SQLITE_STATIC);
427 PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR);
429 res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_THIRD, PDM_DEVICE_INIT);
430 PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR);
432 res = sqlite3_step(stmt);
433 if (SQLITE_DONE != res)
435 if (SQLITE_CONSTRAINT == res)
437 //new OCStack result code
438 OIC_LOG_V(ERROR, TAG, "Error Occured: %s",sqlite3_errmsg(g_db));
439 sqlite3_finalize(stmt);
440 return OC_STACK_DUPLICATE_UUID;
442 OIC_LOG_V(ERROR, TAG, "Error Occured: %s",sqlite3_errmsg(g_db));
443 sqlite3_finalize(stmt);
444 return OC_STACK_ERROR;
446 sqlite3_finalize(stmt);
448 OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
453 *function to get Id for given UUID
455 static OCStackResult getIdForUUID(const OicUuid_t *UUID , int *id)
457 OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
459 sqlite3_stmt *stmt = 0;
461 char sqlStat[PDM_SQLITE_GET_ID_SIZE - 1 + HEX_UUID_STR_LENGTH];
462 char hexUUID[HEX_UUID_STR_LENGTH];
464 memset(sqlStat, 0, sizeof(sqlStat));
465 strncpy(sqlStat, PDM_SQLITE_GET_ID, PDM_SQLITE_GET_ID_SIZE - 1);
466 memset(hexUUID, 0, sizeof(hexUUID));
468 if (!convertUuidToHexString(UUID, hexUUID))
470 return OC_STACK_ERROR;
473 strncpy(sqlStat + PDM_SQLITE_GET_ID_SIZE - 1, hexUUID, HEX_UUID_STR_LENGTH);
474 res = sqlite3_prepare_v2(g_db, sqlStat, (int)sizeof(sqlStat), &stmt, 0);
475 PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR);
477 while (SQLITE_ROW == sqlite3_step(stmt))
479 int tempId = sqlite3_column_int(stmt, PDM_FIRST_INDEX);
480 OIC_LOG_V(DEBUG, TAG, "ID is %d", tempId);
482 sqlite3_finalize(stmt);
483 OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
487 sqlite3_finalize(stmt);
488 OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
490 return OC_STACK_INVALID_PARAM;
494 * Function to check duplication of device's Device ID.
496 OCStackResult PDMIsDuplicateDevice(const OicUuid_t* UUID, bool *result)
498 OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
501 if (NULL == UUID || NULL == result)
503 OIC_LOG(ERROR, TAG, "UUID or result is NULL");
504 return OC_STACK_INVALID_PARAM;
506 sqlite3_stmt *stmt = 0;
508 char sqlStat[PDM_SQLITE_GET_ID_SIZE - 1 + HEX_UUID_STR_LENGTH];
509 char hexUUID[HEX_UUID_STR_LENGTH];
511 memset(sqlStat, 0, sizeof(sqlStat));
512 strncpy(sqlStat, PDM_SQLITE_GET_ID, PDM_SQLITE_GET_ID_SIZE - 1);
513 memset(hexUUID, 0, sizeof(hexUUID));
515 if (!convertUuidToHexString(UUID, hexUUID))
517 return OC_STACK_ERROR;
520 strncpy(sqlStat + PDM_SQLITE_GET_ID_SIZE - 1, hexUUID, HEX_UUID_STR_LENGTH);
521 res = sqlite3_prepare_v2(g_db, sqlStat, (int)sizeof(sqlStat), &stmt, 0);
522 PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR);
524 bool retValue = false;
525 while(SQLITE_ROW == sqlite3_step(stmt))
527 OIC_LOG(INFO, TAG, "Duplicated UUID");
531 sqlite3_finalize(stmt);
534 OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
539 * Function to add link in sqlite
541 static OCStackResult addlink(int id1, int id2)
543 OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
545 sqlite3_stmt *stmt = 0;
547 res = sqlite3_prepare_v2(g_db, PDM_SQLITE_INSERT_LINK_DATA,
548 strlen(PDM_SQLITE_INSERT_LINK_DATA) + 1, &stmt, NULL);
549 PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR);
551 res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_FIRST, id1);
552 PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR);
554 res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_SECOND, id2);
555 PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR);
557 res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_THIRD, PDM_DEVICE_ACTIVE);
558 PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR);
560 if (sqlite3_step(stmt) != SQLITE_DONE)
562 OIC_LOG_V(ERROR, TAG, "Error Occured: %s",sqlite3_errmsg(g_db));
563 sqlite3_finalize(stmt);
564 return OC_STACK_ERROR;
566 sqlite3_finalize(stmt);
567 OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
571 OCStackResult PDMLinkDevices(const OicUuid_t *UUID1, const OicUuid_t *UUID2)
573 OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
576 if (NULL == UUID1 || NULL == UUID2)
578 OIC_LOG(ERROR, TAG, "Invalid PARAM");
579 return OC_STACK_INVALID_PARAM;
582 PdmDeviceState_t state = PDM_DEVICE_UNKNOWN;
583 if (OC_STACK_OK != PDMGetDeviceState(UUID1, &state))
585 OIC_LOG(ERROR, TAG, "Internal error occured");
586 return OC_STACK_ERROR;
588 if (PDM_DEVICE_ACTIVE != state)
590 OIC_LOG_V(ERROR, TAG, "UUID1: Device state is not active : %d", state);
591 return OC_STACK_INVALID_PARAM;
594 state = PDM_DEVICE_UNKNOWN;
595 if (OC_STACK_OK != PDMGetDeviceState(UUID2, &state))
597 OIC_LOG(ERROR, TAG, "Internal error occured");
598 return OC_STACK_ERROR;
600 if (PDM_DEVICE_ACTIVE != state)
602 OIC_LOG_V(ERROR, TAG, "UUID2: Device state is not active : %d", state);
603 return OC_STACK_INVALID_PARAM;
607 if (OC_STACK_OK != getIdForUUID(UUID1, &id1))
609 OIC_LOG(ERROR, TAG, "Requested value not found");
610 return OC_STACK_INVALID_PARAM;
613 if (OC_STACK_OK != getIdForUUID(UUID2, &id2))
615 OIC_LOG(ERROR, TAG, "Requested value not found");
616 return OC_STACK_INVALID_PARAM;
619 ASCENDING_ORDER(id1, id2);
620 OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
621 return addlink(id1, id2);
625 * Function to remove created link
627 static OCStackResult removeLink(int id1, int id2)
629 OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
632 sqlite3_stmt *stmt = 0;
633 res = sqlite3_prepare_v2(g_db, PDM_SQLITE_DELETE_LINK, strlen(PDM_SQLITE_DELETE_LINK) + 1, &stmt, NULL);
634 PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR);
636 res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_FIRST, id1);
637 PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR);
639 res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_SECOND, id2);
640 PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR);
642 if (SQLITE_DONE != sqlite3_step(stmt))
644 OIC_LOG_V(ERROR, TAG, "Error message: %s", sqlite3_errmsg(g_db));
645 sqlite3_finalize(stmt);
646 return OC_STACK_ERROR;
648 sqlite3_finalize(stmt);
649 OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
653 OCStackResult PDMUnlinkDevices(const OicUuid_t *UUID1, const OicUuid_t *UUID2)
655 OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
658 if (NULL == UUID1 || NULL == UUID2)
660 OIC_LOG(ERROR, TAG, "Invalid PARAM");
661 return OC_STACK_INVALID_PARAM;
665 if (OC_STACK_OK != getIdForUUID(UUID1, &id1))
667 OIC_LOG(ERROR, TAG, "Requested value not found");
668 return OC_STACK_INVALID_PARAM;
672 if (OC_STACK_OK != getIdForUUID(UUID2, &id2))
674 OIC_LOG(ERROR, TAG, "Requested value not found");
675 return OC_STACK_INVALID_PARAM;
677 ASCENDING_ORDER(id1, id2);
678 OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
679 return removeLink(id1, id2);
682 static OCStackResult removeFromDeviceList(int id)
684 OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
686 sqlite3_stmt *stmt = 0;
688 res = sqlite3_prepare_v2(g_db, PDM_SQLITE_DELETE_DEVICE,
689 strlen(PDM_SQLITE_DELETE_DEVICE) + 1, &stmt, NULL);
690 PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR);
692 res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_FIRST, id);
693 PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR);
695 if (sqlite3_step(stmt) != SQLITE_DONE)
697 OIC_LOG_V(ERROR, TAG, "Error message: %s", sqlite3_errmsg(g_db));
698 sqlite3_finalize(stmt);
699 return OC_STACK_ERROR;
701 sqlite3_finalize(stmt);
702 OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
706 OCStackResult PDMDeleteDevice(const OicUuid_t *UUID)
708 OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
713 return OC_STACK_INVALID_PARAM;
716 if (OC_STACK_OK != getIdForUUID(UUID, &id))
718 OIC_LOG(ERROR, TAG, "Requested value not found");
719 return OC_STACK_INVALID_PARAM;
722 if(OC_STACK_OK != removeFromDeviceList(id))
725 OIC_LOG(ERROR, TAG, "Requested value not found");
726 return OC_STACK_ERROR;
729 OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
734 static OCStackResult updateLinkState(int id1, int id2, int state)
736 OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
738 sqlite3_stmt *stmt = 0;
740 res = sqlite3_prepare_v2(g_db, PDM_SQLITE_UPDATE_LINK,
741 strlen(PDM_SQLITE_UPDATE_LINK) + 1, &stmt, NULL);
742 PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR);
744 res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_FIRST, state);
745 PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR);
747 res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_SECOND, id1);
748 PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR);
750 res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_THIRD, id2);
751 PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR);
753 if (SQLITE_DONE != sqlite3_step(stmt))
755 OIC_LOG_V(ERROR, TAG, "Error message: %s", sqlite3_errmsg(g_db));
756 sqlite3_finalize(stmt);
757 return OC_STACK_ERROR;
759 sqlite3_finalize(stmt);
760 OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
764 OCStackResult PDMSetLinkStale(const OicUuid_t* uuidOfDevice1, const OicUuid_t* uuidOfDevice2)
766 OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
769 if (NULL == uuidOfDevice1 || NULL == uuidOfDevice2)
771 OIC_LOG(ERROR, TAG, "Invalid PARAM");
772 return OC_STACK_INVALID_PARAM;
776 if (OC_STACK_OK != getIdForUUID(uuidOfDevice1, &id1))
778 OIC_LOG(ERROR, TAG, "Requested value not found");
779 return OC_STACK_INVALID_PARAM;
783 if (OC_STACK_OK != getIdForUUID(uuidOfDevice2, &id2))
785 OIC_LOG(ERROR, TAG, "Requested value not found");
786 return OC_STACK_INVALID_PARAM;
788 ASCENDING_ORDER(id1, id2);
789 OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
790 return updateLinkState(id1, id2, PDM_DEVICE_STALE);
793 OCStackResult PDMGetOwnedDevices(OCUuidList_t **uuidList, size_t *numOfDevices)
795 OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
798 if (NULL != *uuidList)
800 OIC_LOG(ERROR, TAG, "Not null list will cause memory leak");
801 return OC_STACK_INVALID_PARAM;
803 sqlite3_stmt *stmt = 0;
805 res = sqlite3_prepare_v2(g_db, PDM_SQLITE_LIST_ALL_UUID,
806 strlen(PDM_SQLITE_LIST_ALL_UUID) + 1, &stmt, NULL);
807 PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR);
810 while (SQLITE_ROW == sqlite3_step(stmt))
812 const void *ptr = sqlite3_column_blob(stmt, PDM_FIRST_INDEX);
813 OicUuid_t *uid = (OicUuid_t *)ptr;
814 OCUuidList_t *temp = (OCUuidList_t *) OICCalloc(1,sizeof(OCUuidList_t));
817 OIC_LOG_V(ERROR, TAG, "Memory allocation problem");
818 sqlite3_finalize(stmt);
819 return OC_STACK_NO_MEMORY;
821 memcpy(&temp->dev.id, uid->id, UUID_LENGTH);
822 LL_PREPEND(*uuidList,temp);
825 *numOfDevices = counter;
826 sqlite3_finalize(stmt);
827 OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
831 static OCStackResult getUUIDforId(int id, OicUuid_t *uid, bool *result)
833 OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
835 sqlite3_stmt *stmt = 0;
837 res = sqlite3_prepare_v2(g_db, PDM_SQLITE_GET_UUID,
838 strlen(PDM_SQLITE_GET_UUID) + 1, &stmt, NULL);
839 PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR);
841 res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_FIRST, id);
842 PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR);
844 while (SQLITE_ROW == sqlite3_step(stmt))
846 const void *ptr = sqlite3_column_blob(stmt, PDM_FIRST_INDEX);
847 memcpy(uid, ptr, sizeof(OicUuid_t));
849 int temp = sqlite3_column_int(stmt, PDM_SECOND_INDEX);
850 if(PDM_DEVICE_STALE == temp)
864 sqlite3_finalize(stmt);
867 sqlite3_finalize(stmt);
868 OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
869 return OC_STACK_INVALID_PARAM;
872 OCStackResult PDMGetLinkedDevices(const OicUuid_t *UUID, OCUuidList_t **UUIDLIST, size_t *numOfDevices)
874 OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
877 if (NULL == UUID || NULL == numOfDevices || !UUIDLIST)
879 return OC_STACK_INVALID_PARAM;
881 if (NULL != *UUIDLIST )
883 OIC_LOG(ERROR, TAG, "Not null list will cause memory leak");
884 return OC_STACK_INVALID_PARAM;
886 PdmDeviceState_t state = PDM_DEVICE_UNKNOWN;
887 OCStackResult ret = PDMGetDeviceState(UUID, &state);
888 if (OC_STACK_OK != ret)
890 OIC_LOG(ERROR, TAG, "Internal error occured");
891 return OC_STACK_ERROR;
893 if (PDM_DEVICE_ACTIVE != state)
895 OIC_LOG_V(ERROR, TAG, "Device state is not active : %d", state);
896 return OC_STACK_INVALID_PARAM;
899 if (OC_STACK_OK != getIdForUUID(UUID, &id))
901 OIC_LOG(ERROR, TAG, "Requested value not found");
902 return OC_STACK_INVALID_PARAM;
906 sqlite3_stmt *stmt = 0;
908 res = sqlite3_prepare_v2(g_db, PDM_SQLITE_GET_LINKED_DEVICES,
909 strlen(PDM_SQLITE_GET_LINKED_DEVICES) + 1, &stmt, NULL);
910 PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR);
912 res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_FIRST, id);
913 PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR);
915 res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_SECOND, id);
916 PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR);
919 while (SQLITE_ROW == sqlite3_step(stmt))
921 int i1 = sqlite3_column_int(stmt, PDM_FIRST_INDEX);
922 int i2 = sqlite3_column_int(stmt, PDM_SECOND_INDEX);
924 OicUuid_t temp = {{0,}};
927 getUUIDforId(i1, &temp, NULL);
931 getUUIDforId(i2, &temp, NULL);
934 OCUuidList_t *tempNode = (OCUuidList_t *) OICCalloc(1,sizeof(OCUuidList_t));
935 if (NULL == tempNode)
937 OIC_LOG(ERROR, TAG, "No Memory");
938 sqlite3_finalize(stmt);
939 return OC_STACK_NO_MEMORY;
941 memcpy(&tempNode->dev.id, &temp.id, UUID_LENGTH);
942 LL_PREPEND(*UUIDLIST,tempNode);
945 *numOfDevices = counter;
946 sqlite3_finalize(stmt);
947 OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
951 OCStackResult PDMGetToBeUnlinkedDevices(OCPairList_t **staleDevList, size_t *numOfDevices)
953 OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
956 if (NULL != *staleDevList)
958 OIC_LOG(ERROR, TAG, "Not null list will cause memory leak");
959 return OC_STACK_INVALID_PARAM;
962 sqlite3_stmt *stmt = 0;
964 res = sqlite3_prepare_v2(g_db, PDM_SQLITE_GET_STALE_INFO,
965 strlen(PDM_SQLITE_GET_STALE_INFO) + 1, &stmt, NULL);
966 PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR);
968 res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_FIRST, PDM_DEVICE_STALE);
969 PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR);
972 while (SQLITE_ROW == sqlite3_step(stmt))
974 int i1 = sqlite3_column_int(stmt, PDM_FIRST_INDEX);
975 int i2 = sqlite3_column_int(stmt, PDM_SECOND_INDEX);
976 OicUuid_t temp1 = {{0,}};
977 OicUuid_t temp2 = {{0,}};;
978 getUUIDforId(i1, &temp1, NULL);
979 getUUIDforId(i2, &temp2, NULL);
981 OCPairList_t *tempNode = (OCPairList_t *) OICCalloc(1, sizeof(OCPairList_t));
982 if (NULL == tempNode)
984 OIC_LOG(ERROR, TAG, "No Memory");
985 sqlite3_finalize(stmt);
986 return OC_STACK_NO_MEMORY;
988 memcpy(&tempNode->dev.id, &temp1.id, UUID_LENGTH);
989 memcpy(&tempNode->dev2.id, &temp2.id, UUID_LENGTH);
990 LL_PREPEND(*staleDevList, tempNode);
993 *numOfDevices = counter;
994 sqlite3_finalize(stmt);
995 OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
999 OCStackResult PDMClose()
1001 OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
1003 CHECK_PDM_INIT(TAG);
1005 res = sqlite3_close(g_db);
1006 PDM_VERIFY_SQLITE_OK(TAG, res, NULL, ERROR, OC_STACK_ERROR);
1007 OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
1011 void PDMDestoryOicUuidLinkList(OCUuidList_t* ptr)
1013 OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
1017 OCUuidList_t *tmp1 = NULL,*tmp2=NULL;
1018 LL_FOREACH_SAFE(ptr, tmp1, tmp2)
1020 LL_DELETE(ptr, tmp1);
1025 OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
1028 void PDMDestoryStaleLinkList(OCPairList_t* ptr)
1030 OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
1034 OCPairList_t *tmp1 = NULL,*tmp2=NULL;
1035 LL_FOREACH_SAFE(ptr, tmp1, tmp2)
1037 LL_DELETE(ptr, tmp1);
1042 OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
1045 OCStackResult PDMIsLinkExists(const OicUuid_t* uuidOfDevice1, const OicUuid_t* uuidOfDevice2,
1048 OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
1050 CHECK_PDM_INIT(TAG);
1051 if (NULL == uuidOfDevice1 || NULL == uuidOfDevice2 || NULL == result)
1053 return OC_STACK_INVALID_PARAM;
1057 if (OC_STACK_OK != getIdForUUID(uuidOfDevice1, &id1))
1059 OIC_LOG(ERROR, TAG, "Requested value not found");
1060 return OC_STACK_INVALID_PARAM;
1063 if (OC_STACK_OK != getIdForUUID(uuidOfDevice2, &id2))
1065 OIC_LOG(ERROR, TAG, "Requested value not found");
1066 return OC_STACK_INVALID_PARAM;
1069 PdmDeviceState_t state = PDM_DEVICE_UNKNOWN;
1070 if (OC_STACK_OK != PDMGetDeviceState(uuidOfDevice1, &state))
1072 OIC_LOG(ERROR, TAG, "uuidOfDevice1:Internal error occured");
1073 return OC_STACK_ERROR;
1075 if (PDM_DEVICE_ACTIVE != state)
1077 OIC_LOG_V(ERROR, TAG, "uuidOfDevice1:Device state is not active : %d", state);
1078 return OC_STACK_INVALID_PARAM;
1081 state = PDM_DEVICE_UNKNOWN;
1082 if (OC_STACK_OK != PDMGetDeviceState(uuidOfDevice2, &state))
1084 OIC_LOG(ERROR, TAG, "uuidOfDevice2:Internal error occured");
1085 return OC_STACK_ERROR;
1087 if (PDM_DEVICE_ACTIVE != state)
1089 OIC_LOG_V(ERROR, TAG, "uuidOfDevice2:Device state is not active : %d", state);
1090 return OC_STACK_INVALID_PARAM;
1093 ASCENDING_ORDER(id1, id2);
1095 sqlite3_stmt *stmt = 0;
1097 res = sqlite3_prepare_v2(g_db, PDM_SQLITE_GET_DEVICE_LINKS,
1098 strlen(PDM_SQLITE_GET_DEVICE_LINKS) + 1, &stmt, NULL);
1099 PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR);
1101 res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_FIRST, id1);
1102 PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR);
1104 res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_SECOND, id2);
1105 PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR);
1108 while(SQLITE_ROW == sqlite3_step(stmt))
1110 OIC_LOG(INFO, TAG, "Link already exists between devices");
1113 sqlite3_finalize(stmt);
1115 OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
1119 static OCStackResult updateDeviceState(const OicUuid_t *uuid, PdmDeviceState_t state)
1121 OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
1122 OIC_LOG_V(WARNING, TAG, "UUID is: %s", (char*) uuid);
1124 sqlite3_stmt *stmt = 0;
1126 char sqlStat[PDM_SQLITE_UPDATE_DEVICE_SIZE - 1 + HEX_UUID_STR_LENGTH];
1127 char hexUUID[HEX_UUID_STR_LENGTH];
1129 memset(sqlStat, 0, sizeof(sqlStat));
1130 strncpy(sqlStat, PDM_SQLITE_UPDATE_DEVICE, PDM_SQLITE_UPDATE_DEVICE_SIZE - 1);
1131 memset(hexUUID, 0, sizeof(hexUUID));
1133 if (!convertUuidToHexString(uuid, hexUUID))
1135 return OC_STACK_ERROR;
1138 strncpy(sqlStat + PDM_SQLITE_UPDATE_DEVICE_SIZE - 1, hexUUID, HEX_UUID_STR_LENGTH);
1139 res = sqlite3_prepare_v2(g_db, sqlStat,
1140 (int)sizeof(sqlStat), &stmt, NULL);
1142 PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR);
1143 res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_FIRST, state);
1144 PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR);
1146 if (SQLITE_DONE != sqlite3_step(stmt))
1148 OIC_LOG_V(ERROR, TAG, "Error message: %s", sqlite3_errmsg(g_db));
1149 sqlite3_finalize(stmt);
1150 return OC_STACK_ERROR;
1152 sqlite3_finalize(stmt);
1153 OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
1157 static OCStackResult updateLinkForStaleDevice(const OicUuid_t *devUuid)
1159 OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
1161 sqlite3_stmt *stmt = 0;
1165 if (OC_STACK_OK != getIdForUUID(devUuid, &id))
1167 OIC_LOG(ERROR, TAG, "Requested value not found");
1168 return OC_STACK_INVALID_PARAM;
1171 res = sqlite3_prepare_v2(g_db, PDM_SQLITE_UPDATE_LINK_STALE_FOR_STALE_DEVICE,
1172 strlen(PDM_SQLITE_UPDATE_LINK_STALE_FOR_STALE_DEVICE) + 1,
1174 PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR);
1176 res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_FIRST, id);
1177 PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR);
1179 res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_SECOND, id);
1180 PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR);
1182 if (SQLITE_DONE != sqlite3_step(stmt))
1184 OIC_LOG_V(ERROR, TAG, "Error message: %s", sqlite3_errmsg(g_db));
1185 sqlite3_finalize(stmt);
1186 return OC_STACK_ERROR;
1188 sqlite3_finalize(stmt);
1189 OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
1193 OCStackResult PDMSetDeviceState(const OicUuid_t* uuid, PdmDeviceState_t state)
1195 OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
1197 OCStackResult res = OC_STACK_ERROR;
1199 CHECK_PDM_INIT(TAG);
1202 OIC_LOG(ERROR, TAG, "Invalid PARAM");
1203 return OC_STACK_INVALID_PARAM;
1207 if(PDM_DEVICE_STALE == state)
1209 res = updateLinkForStaleDevice(uuid);
1210 if (OC_STACK_OK != res)
1213 OIC_LOG(ERROR, TAG, "unable to update links");
1218 res = updateDeviceState(uuid, state);
1219 if (OC_STACK_OK != res)
1222 OIC_LOG(ERROR, TAG, "unable to update device state");
1226 OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
1230 OCStackResult PDMGetDeviceState(const OicUuid_t *uuid, PdmDeviceState_t* result)
1232 OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
1234 if (NULL == uuid || NULL == result)
1236 OIC_LOG(ERROR, TAG, "UUID or result is NULL");
1237 return OC_STACK_INVALID_PARAM;
1240 sqlite3_stmt *stmt = 0;
1242 char sqlStat[PDM_SQLITE_GET_DEVICE_STATUS_SIZE - 1 + HEX_UUID_STR_LENGTH];
1243 char hexUUID[HEX_UUID_STR_LENGTH];
1245 memset(sqlStat, 0, sizeof(sqlStat));
1246 strncpy(sqlStat, PDM_SQLITE_GET_DEVICE_STATUS, PDM_SQLITE_GET_DEVICE_STATUS_SIZE - 1);
1247 memset(hexUUID, 0, sizeof(hexUUID));
1249 if (!convertUuidToHexString(uuid, hexUUID))
1251 return OC_STACK_ERROR;
1254 strncpy(sqlStat + PDM_SQLITE_GET_DEVICE_STATUS_SIZE - 1, hexUUID, HEX_UUID_STR_LENGTH);
1255 res = sqlite3_prepare_v2(g_db, sqlStat, (int)sizeof(sqlStat), &stmt, 0);
1256 PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR);
1258 *result = PDM_DEVICE_UNKNOWN;
1259 while(SQLITE_ROW == sqlite3_step(stmt))
1261 int tempStaleStateFromDb = sqlite3_column_int(stmt, PDM_FIRST_INDEX);
1262 OIC_LOG_V(DEBUG, TAG, "Device state is %d", tempStaleStateFromDb);
1263 *result = (PdmDeviceState_t)tempStaleStateFromDb;
1266 sqlite3_finalize(stmt);
1267 OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
1272 OCStackResult PDMDeleteDeviceWithState(const PdmDeviceState_t state)
1274 OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
1276 CHECK_PDM_INIT(TAG);
1277 if (PDM_DEVICE_ACTIVE != state && PDM_DEVICE_STALE != state &&
1278 PDM_DEVICE_INIT != state && PDM_DEVICE_UNKNOWN != state)
1280 return OC_STACK_INVALID_PARAM;
1283 sqlite3_stmt *stmt = 0;
1285 res = sqlite3_prepare_v2(g_db, PDM_SQLITE_DELETE_DEVICE_WITH_STATE,
1286 strlen(PDM_SQLITE_DELETE_DEVICE_WITH_STATE) + 1, &stmt, NULL);
1287 PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR);
1289 res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_FIRST, state);
1290 PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR);
1292 if (SQLITE_DONE != sqlite3_step(stmt))
1294 OIC_LOG_V(ERROR, TAG, "Error message: %s", sqlite3_errmsg(g_db));
1295 sqlite3_finalize(stmt);
1296 return OC_STACK_ERROR;
1298 sqlite3_finalize(stmt);
1299 OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);