#define PDM_BIND_INDEX_THIRD 3
#define PDM_CREATE_T_DEVICE_LIST "create table T_DEVICE_LIST(ID INTEGER PRIMARY KEY AUTOINCREMENT,\
- UUID BLOB NOT NULL UNIQUE);"
+ UUID BLOB NOT NULL UNIQUE, STATE INT NOT NULL);"
#define PDM_CREATE_T_DEVICE_LINK "create table T_DEVICE_LINK_STATE(ID INT NOT NULL, ID2 INT NOT \
NULL,STATE INT NOT NULL, PRIMARY KEY (ID, ID2));"
#define PDM_SQLITE_TRANSACTION_COMMIT "COMMIT;"
#define PDM_SQLITE_TRANSACTION_ROLLBACK "ROLLBACK;"
#define PDM_SQLITE_GET_STALE_INFO "SELECT ID,ID2 FROM T_DEVICE_LINK_STATE WHERE STATE = ?"
-#define PDM_SQLITE_INSERT_T_DEVICE_LIST "INSERT INTO T_DEVICE_LIST VALUES(?,?)"
+#define PDM_SQLITE_INSERT_T_DEVICE_LIST "INSERT INTO T_DEVICE_LIST VALUES(?,?,?)"
#define PDM_SQLITE_GET_ID "SELECT ID FROM T_DEVICE_LIST WHERE UUID like ?"
#define PDM_SQLITE_INSERT_LINK_DATA "INSERT INTO T_DEVICE_LINK_STATE VALUES(?,?,?)"
#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_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"
-#define PDM_SQLITE_GET_UUID "SELECT UUID FROM T_DEVICE_LIST WHERE ID = ?"
-#define PDM_SQLITE_GET_LINKED_DEVICES "SELECT ID,ID2 FROM T_DEVICE_LINK_STATE WHERE ID = ? or ID2 = ?"
-#define PDM_SQLITE_GET_DEVICE_LINKS "SELECT ID,ID2 FROM T_DEVICE_LINK_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 = ?"
+#define PDM_SQLITE_GET_LINKED_DEVICES "SELECT ID,ID2 FROM T_DEVICE_LINK_STATE WHERE \
+ (ID = ? or ID2 = ?) and state = 0"
+#define PDM_SQLITE_GET_DEVICE_LINKS "SELECT ID,ID2 FROM T_DEVICE_LINK_STATE WHERE \
+ ID = ? and ID2 = ? and state = 0"
+#define PDM_SQLITE_UPDATE_DEVICE "UPDATE T_DEVICE_LIST SET STATE = ? WHERE UUID like ?"
+#define PDM_SQLITE_GET_DEVICE_STATUS "SELECT STATE FROM T_DEVICE_LIST WHERE UUID like ?"
+#define PDM_SQLITE_UPDATE_LINK_STALE_FOR_STALE_DEVICE "UPDATE T_DEVICE_LINK_STATE SET STATE = 1\
+ WHERE ID = ? or ID2 = ?"
#define ASCENDING_ORDER(id1, id2) do{if( (id1) > (id2) )\
{ int temp; temp = id1; id1 = id2; id2 = temp; }}while(0)
res = sqlite3_bind_blob(stmt, PDM_BIND_INDEX_SECOND, UUID, UUID_LENGTH, SQLITE_STATIC);
PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
+ res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_THIRD, PDM_ACTIVE_STATE);
+ PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
+
res = sqlite3_step(stmt);
if (SQLITE_DONE != res)
{
}
/**
+ * Function to check whether device is stale or not
+ */
+static OCStackResult isDeviceStale(const OicUuid_t *uuid, bool *result)
+{
+ if (NULL == uuid || NULL == result)
+ {
+ OC_LOG(ERROR, TAG, "UUID or result is NULL");
+ return OC_STACK_INVALID_PARAM;
+ }
+
+ sqlite3_stmt *stmt = 0;
+ int res = 0;
+ res = sqlite3_prepare_v2(g_db, PDM_SQLITE_GET_DEVICE_STATUS, strlen(PDM_SQLITE_GET_DEVICE_STATUS) + 1,
+ &stmt, NULL);
+ PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
+
+ res = sqlite3_bind_blob(stmt, PDM_BIND_INDEX_FIRST, uuid, UUID_LENGTH, SQLITE_STATIC);
+ PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
+
+ bool retValue = false;
+ while(SQLITE_ROW == sqlite3_step(stmt))
+ {
+ int tempStaleStateFromDb = sqlite3_column_int(stmt, PDM_FIRST_INDEX);
+ OC_LOG_V(DEBUG, TAG, "Stale state is %d", tempStaleStateFromDb);
+ if (PDM_STALE_STATE == tempStaleStateFromDb)
+ {
+ OC_LOG(INFO, TAG, "Device is stale");
+ retValue = true;
+ }
+ }
+ *result = retValue;
+ sqlite3_finalize(stmt);
+ return OC_STACK_OK;
+}
+
+/**
*function to get Id for given UUID
*/
static OCStackResult getIdForUUID(const OicUuid_t *UUID , int *id)
OC_LOG(ERROR, TAG, "Invalid PARAM");
return OC_STACK_INVALID_PARAM;
}
+
+ bool result = false;
+ if (OC_STACK_OK != isDeviceStale(UUID1, &result))
+ {
+ OC_LOG(ERROR, TAG, "Internal error occured");
+ return OC_STACK_ERROR;
+ }
+ if (result)
+ {
+ OC_LOG(ERROR, TAG, "UUID1:Stale device");
+ return OC_STACK_INVALID_PARAM;
+ }
+ result = false;
+ if (OC_STACK_OK != isDeviceStale(UUID2, &result))
+ {
+ OC_LOG(ERROR, TAG, "Internal error occured");
+ return OC_STACK_ERROR;
+ }
+ if (result)
+ {
+ OC_LOG(ERROR, TAG, "UUID2:Stale device");
+ return OC_STACK_INVALID_PARAM;
+ }
+
int id1 = 0;
if (OC_STACK_OK != getIdForUUID(UUID1, &id1))
{
OC_LOG(ERROR, TAG, "Requested value not found");
return OC_STACK_INVALID_PARAM;
}
+
ASCENDING_ORDER(id1, id2);
return addlink(id1, id2);
}
int counter = 0;
while (SQLITE_ROW == sqlite3_step(stmt))
{
-
const void *ptr = sqlite3_column_blob(stmt, PDM_FIRST_INDEX);
OicUuid_t *uid = (OicUuid_t *)ptr;
OCUuidList_t *temp = (OCUuidList_t *) OICCalloc(1,sizeof(OCUuidList_t));
return OC_STACK_OK;
}
-static OCStackResult getUUIDforId(int id, OicUuid_t *uid)
+static OCStackResult getUUIDforId(int id, OicUuid_t *uid, bool *result)
{
sqlite3_stmt *stmt = 0;
int res = 0;
{
const void *ptr = sqlite3_column_blob(stmt, PDM_FIRST_INDEX);
memcpy(uid, ptr, sizeof(OicUuid_t));
+
+ int temp = sqlite3_column_int(stmt, PDM_SECOND_INDEX);
+ if(PDM_STALE_STATE == temp)
+ {
+ if(result)
+ {
+ *result = true;
+ }
+ }
+ else
+ {
+ if(result)
+ {
+ *result = false;
+ }
+ }
+ sqlite3_finalize(stmt);
+ return OC_STACK_OK;
}
sqlite3_finalize(stmt);
- return OC_STACK_OK;
+ return OC_STACK_INVALID_PARAM;
}
OCStackResult PDMGetLinkedDevices(const OicUuid_t *UUID, OCUuidList_t **UUIDLIST, size_t *numOfDevices)
{
return OC_STACK_INVALID_PARAM;
}
+ bool result = false;
+ OCStackResult ret = isDeviceStale(UUID, &result);
+ if (OC_STACK_OK != ret)
+ {
+ OC_LOG(ERROR, TAG, "Internal error occured");
+ return OC_STACK_ERROR;
+ }
+ if (result)
+ {
+ OC_LOG(ERROR, TAG, "Device is stale");
+ return OC_STACK_INVALID_PARAM;
+ }
int id = 0;
if (OC_STACK_OK != getIdForUUID(UUID, &id))
{
return OC_STACK_INVALID_PARAM;
}
+
sqlite3_stmt *stmt = 0;
int res = 0;
res = sqlite3_prepare_v2(g_db, PDM_SQLITE_GET_LINKED_DEVICES,
OicUuid_t temp = {{0,}};
if (i1 != id)
{
- getUUIDforId(i1, &temp);
+ getUUIDforId(i1, &temp, NULL);
}
if (i2 != id)
{
- getUUIDforId(i2, &temp);
+ getUUIDforId(i2, &temp, NULL);
}
OCUuidList_t *tempNode = (OCUuidList_t *) OICCalloc(1,sizeof(OCUuidList_t));
int i2 = sqlite3_column_int(stmt, PDM_SECOND_INDEX);
OicUuid_t temp1 = {{0,}};
OicUuid_t temp2 = {{0,}};;
- getUUIDforId(i1, &temp1);
- getUUIDforId(i2, &temp2);
+ getUUIDforId(i1, &temp1, NULL);
+ getUUIDforId(i2, &temp2, NULL);
OCPairList_t *tempNode = (OCPairList_t *) OICCalloc(1, sizeof(OCPairList_t));
if (NULL == tempNode)
return OC_STACK_INVALID_PARAM;
}
+ bool isStale = false;
+ if (OC_STACK_OK != isDeviceStale(uuidOfDevice1, &isStale))
+ {
+ OC_LOG(ERROR, TAG, "uuidOfDevice1:Internal error occured");
+ return OC_STACK_ERROR;
+ }
+ if (isStale)
+ {
+ OC_LOG(ERROR, TAG, "uuidOfDevice1:Device is stale");
+ return OC_STACK_INVALID_PARAM;
+ }
+
+ isStale = false;
+ if (OC_STACK_OK != isDeviceStale(uuidOfDevice2, &isStale))
+ {
+ OC_LOG(ERROR, TAG, "uuidOfDevice2:Internal error occured");
+ return OC_STACK_ERROR;
+ }
+ if (isStale)
+ {
+ OC_LOG(ERROR, TAG, "uuidOfDevice2:Device is stale");
+ return OC_STACK_INVALID_PARAM;
+ }
+
ASCENDING_ORDER(id1, id2);
sqlite3_stmt *stmt = 0;
*result = ret;
return OC_STACK_OK;
}
+
+static OCStackResult updateDeviceState(const OicUuid_t *uuid, int state)
+{
+ sqlite3_stmt *stmt = 0;
+ int res = 0 ;
+ res = sqlite3_prepare_v2(g_db, PDM_SQLITE_UPDATE_DEVICE,
+ strlen(PDM_SQLITE_UPDATE_DEVICE) + 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);
+
+ res = sqlite3_bind_blob(stmt, PDM_BIND_INDEX_SECOND, uuid, UUID_LENGTH, SQLITE_STATIC);
+ PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
+
+ if (SQLITE_DONE != sqlite3_step(stmt))
+ {
+ OC_LOG_V(ERROR, TAG, "Error message: %s", sqlite3_errmsg(g_db));
+ sqlite3_finalize(stmt);
+ return OC_STACK_ERROR;
+ }
+ sqlite3_finalize(stmt);
+ return OC_STACK_OK;
+}
+
+static OCStackResult updateLinkForStaleDevice(const OicUuid_t *devUuid)
+{
+ sqlite3_stmt *stmt = 0;
+ int res = 0 ;
+
+ int id = 0;
+ if (OC_STACK_OK != getIdForUUID(devUuid, &id))
+ {
+ OC_LOG(ERROR, TAG, "Requested value not found");
+ return OC_STACK_INVALID_PARAM;
+ }
+
+ res = sqlite3_prepare_v2(g_db, PDM_SQLITE_UPDATE_LINK_STALE_FOR_STALE_DEVICE,
+ strlen(PDM_SQLITE_UPDATE_LINK_STALE_FOR_STALE_DEVICE) + 1,
+ &stmt, NULL);
+ PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
+
+ res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_FIRST, id);
+ PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
+
+ res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_SECOND, id);
+ PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
+
+ if (SQLITE_DONE != sqlite3_step(stmt))
+ {
+ OC_LOG_V(ERROR, TAG, "Error message: %s", sqlite3_errmsg(g_db));
+ sqlite3_finalize(stmt);
+ return OC_STACK_ERROR;
+ }
+ sqlite3_finalize(stmt);
+ return OC_STACK_OK;
+}
+
+OCStackResult PDMSetDeviceStale(const OicUuid_t* uuidOfDevice)
+{
+ CHECK_PDM_INIT(TAG);
+ if (NULL == uuidOfDevice)
+ {
+ OC_LOG(ERROR, TAG, "Invalid PARAM");
+ return OC_STACK_INVALID_PARAM;
+ }
+ begin();
+ OCStackResult res = updateLinkForStaleDevice(uuidOfDevice);
+ if (OC_STACK_OK != res)
+ {
+ rollback();
+ OC_LOG(ERROR, TAG, "unable to update links");
+ return res;
+ }
+ res = updateDeviceState(uuidOfDevice, PDM_STALE_STATE);
+ if (OC_STACK_OK != res)
+ {
+ rollback();
+ OC_LOG(ERROR, TAG, "unable to update device state");
+ return res;
+ }
+ commit();
+ return OC_STACK_OK;
+}
#include "gtest/gtest.h"
#include "provisioningdatabasemanager.h"
-const char ID_1[] = "1111111111111111";
-const char ID_2[] = "2111111111111111";
-const char ID_3[] = "3111111111111111";
-const char ID_4[] = "4111111111111111";
-const char ID_5[] = "5111111111111111";
-const char ID_6[] = "6111111111111111";
-const char ID_7[] = "7777777777777777";
-const char ID_8[] = "8777777777777777";
+const char ID_1 [] = "1111111111111111";
+const char ID_2 [] = "2111111111111111";
+const char ID_3 [] = "3111111111111111";
+const char ID_4 [] = "4111111111111111";
+const char ID_5 [] = "5111111111111111";
+const char ID_6 [] = "6111111111111111";
+const char ID_7 [] = "7111111111111111";
+const char ID_8 [] = "8111111111111111";
+const char ID_9 [] = "9111111111111111";
+const char ID_10[] = "1222222222222222";
+const char ID_11[] = "2222222222222222";
+const char ID_12[] = "3222222222222222";
+const char ID_13[] = "4222222222222222";
+
TEST(CallPDMAPIbeforeInit, BeforeInit)
{
EXPECT_EQ(OC_STACK_OK, res);
EXPECT_FALSE(linkExisits);
}
+
+TEST(PDMSetDeviceStaleTest, NULLUUID)
+{
+ EXPECT_EQ(OC_STACK_OK, PDMInit(NULL));
+ EXPECT_EQ(OC_STACK_INVALID_PARAM, PDMSetDeviceStale(NULL));
+}
+
+TEST(PDMSetDeviceStaleTest, VALIDUUID)
+{
+ EXPECT_EQ(OC_STACK_OK, PDMInit(NULL));
+ OicUuid_t uid1 = {{0,}};
+ memcpy(&uid1.id, ID_9, sizeof(uid1.id));
+ EXPECT_EQ(OC_STACK_OK, PDMAddDevice(&uid1));
+ EXPECT_EQ(OC_STACK_OK,PDMSetDeviceStale(&uid1));
+}
+
+TEST(PDMSetDeviceStaleTest, StaleDeviceNotinDeviceList)
+{
+ EXPECT_EQ(OC_STACK_OK, PDMInit(NULL));
+ OicUuid_t uid1 = {{0,}};
+ memcpy(&uid1.id, ID_10, sizeof(uid1.id));
+ EXPECT_EQ(OC_STACK_OK, PDMAddDevice(&uid1));
+ EXPECT_EQ(OC_STACK_OK,PDMSetDeviceStale(&uid1));
+
+ OCUuidList_t *list = NULL;
+ size_t noOfDevcies = 0;
+ EXPECT_EQ(OC_STACK_OK, PDMGetOwnedDevices(&list, &noOfDevcies));
+
+ while (list)
+ {
+ EXPECT_FALSE(0 == memcmp(list->dev.id, uid1.id,sizeof(uid1.id)));
+ list = list->next;
+ }
+}
+
+TEST(PDMSetDeviceStaleTest, StaleDeviceNotinLinkedDevice)
+{
+ EXPECT_EQ(OC_STACK_OK, PDMInit(NULL));
+ OicUuid_t uid1 = {{0,}};
+ memcpy(&uid1.id, ID_11, sizeof(uid1.id));
+
+ OicUuid_t uid2 = {{0,}};
+ memcpy(&uid2.id, ID_12, sizeof(uid2.id));
+
+ OicUuid_t uid3 = {{0,}};
+ memcpy(&uid3.id, ID_13, sizeof(uid3.id));
+
+ EXPECT_EQ(OC_STACK_OK, PDMAddDevice(&uid1));
+ EXPECT_EQ(OC_STACK_OK, PDMAddDevice(&uid2));
+ EXPECT_EQ(OC_STACK_OK, PDMAddDevice(&uid3));
+
+ EXPECT_EQ(OC_STACK_OK, PDMLinkDevices(&uid1, &uid2));
+ EXPECT_EQ(OC_STACK_OK, PDMLinkDevices(&uid2, &uid3));
+ EXPECT_EQ(OC_STACK_OK, PDMLinkDevices(&uid1, &uid3));
+
+ EXPECT_EQ(OC_STACK_OK,PDMSetDeviceStale(&uid1));
+
+ OCUuidList_t *list1 = NULL;
+ size_t noOfDevices1 = 0;
+ EXPECT_EQ(OC_STACK_INVALID_PARAM, PDMGetLinkedDevices(&uid1, &list1, &noOfDevices1));
+
+ OCUuidList_t *list2 = NULL;
+ size_t noOfDevices2 = 0;
+ EXPECT_EQ(OC_STACK_OK, PDMGetLinkedDevices(&uid2, &list2, &noOfDevices2));
+ OCUuidList_t *ptr = list2;
+ while(ptr)
+ {
+ EXPECT_FALSE(0 == memcmp(ptr->dev.id, uid1.id,sizeof(uid1.id)));
+ ptr = ptr->next;
+ }
+ ptr = list2;
+ while(ptr)
+ {
+ EXPECT_TRUE(0 == memcmp(ptr->dev.id, uid3.id,sizeof(uid3.id)));
+ ptr = ptr->next;
+ }
+
+ OCUuidList_t *list3 = NULL;
+ size_t noOfDevices3 = 0;
+ EXPECT_EQ(OC_STACK_OK, PDMGetLinkedDevices(&uid3, &list3, &noOfDevices3));
+ ptr = list3;
+ while(ptr)
+ {
+ EXPECT_FALSE(0 == memcmp(ptr->dev.id, uid1.id,sizeof(uid1.id)));
+ ptr = ptr->next;
+ }
+
+ ptr = list3;
+ while(ptr)
+ {
+ EXPECT_TRUE(0 == memcmp(ptr->dev.id, uid2.id,sizeof(uid2.id)));
+ ptr = ptr->next;
+ }
+}
\ No newline at end of file