From: v.irkha@samsung.com Date: Mon, 9 Jul 2018 04:58:23 +0000 (+0300) Subject: SQLite OS specific support (#304) X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=5a456fe3423261d5879a3441f51e65cfdba5882f;p=platform%2Fupstream%2Fiotivity.git SQLite OS specific support (#304) Change SQL requests for WHERE statements with blob params. (Details in [IOT-2775]) https://github.sec.samsung.net/RS7-IOTIVITY/IoTivity/pull/304 (cherry picked from commit 988f01a5cc090ef21dfde89352ceb47dd7be70bc) Change-Id: If87ae5503fb2961601376bfd405c7949c1a5c28a Signed-off-by: Vitalii Irkha Signed-off-by: Amit KS --- diff --git a/resource/csdk/security/provisioning/src/provisioningdatabasemanager.c b/resource/csdk/security/provisioning/src/provisioningdatabasemanager.c index 0bf88e0d9..d502fc293 100644 --- a/resource/csdk/security/provisioning/src/provisioningdatabasemanager.c +++ b/resource/csdk/security/provisioning/src/provisioningdatabasemanager.c @@ -30,6 +30,7 @@ #include "pmutility.h" #include "oic_string.h" #include "utlist.h" +#include "srmutility.h" #define DB_FILE "PDM.db" @@ -43,6 +44,8 @@ #define PDM_BIND_INDEX_SECOND 2 #define PDM_BIND_INDEX_THIRD 3 +#define HEX_UUID_STR_LENGTH (UUID_LENGTH*2 + 4) + #define PDM_CREATE_T_DEVICE_LIST "create table T_DEVICE_LIST(ID INTEGER PRIMARY KEY AUTOINCREMENT,\ UUID BLOB NOT NULL UNIQUE, STATE INT NOT NULL);" @@ -62,7 +65,8 @@ #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_GET_ID "SELECT ID FROM T_DEVICE_LIST WHERE UUID like ?" +#define PDM_SQLITE_GET_ID "SELECT ID FROM T_DEVICE_LIST WHERE UUID = " +#define PDM_SQLITE_GET_ID_SIZE (int)sizeof(PDM_SQLITE_GET_ID) #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 = ?" @@ -75,8 +79,10 @@ (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_DEVICE "UPDATE T_DEVICE_LIST SET STATE = ? WHERE UUID = " +#define PDM_SQLITE_UPDATE_DEVICE_SIZE (int)sizeof(PDM_SQLITE_UPDATE_DEVICE) +#define PDM_SQLITE_GET_DEVICE_STATUS "SELECT STATE FROM T_DEVICE_LIST WHERE UUID = " +#define PDM_SQLITE_GET_DEVICE_STATUS_SIZE (int)sizeof(PDM_SQLITE_GET_DEVICE_STATUS) #define PDM_SQLITE_UPDATE_LINK_STALE_FOR_STALE_DEVICE "UPDATE T_DEVICE_LINK_STATE SET STATE = 1\ WHERE ID = ? or ID2 = ?" @@ -150,6 +156,42 @@ static OCStackResult rollback() return OC_STACK_OK; } +/** + * Function to convert UUID into hex representation + */ +static bool convertUuidToHexString(const OicUuid_t* uuidOfDevice, char* uuidHexString) +{ + if(NULL == uuidOfDevice || NULL == uuidHexString) + { + OIC_LOG(ERROR, TAG, "convertUuidToHexString : Invalid param"); + return false; + } + + char *strUUID = NULL; + OCStackResult ret = ConvertUuidToStr(uuidOfDevice, &strUUID); + if(OC_STACK_OK != ret) + { + OIC_LOG(ERROR, TAG, "SendDeleteCredentialRequest : Failed to canonical UUID encoding"); + return OC_STACK_ERROR; + + } + char* headPtr = strUUID; + strncat(uuidHexString, "x'",2); + while(('\0' != *headPtr)) + { + char tmp = *headPtr; + if('-' != tmp) + { + strncat(uuidHexString, &tmp,1); + } + headPtr++; + } + strncat(uuidHexString, "'",1); + + OICFree(strUUID); + return true; +} + /** * Error log callback called by SQLite stack in case of error */ @@ -262,13 +304,22 @@ static OCStackResult getIdForUUID(const OicUuid_t *UUID , int *id) 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); - PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR); + char sqlStat[PDM_SQLITE_GET_ID_SIZE - 1 + HEX_UUID_STR_LENGTH]; + char hexUUID[HEX_UUID_STR_LENGTH]; + + memset(sqlStat, 0, sizeof(sqlStat)); + strncpy(sqlStat, PDM_SQLITE_GET_ID, PDM_SQLITE_GET_ID_SIZE - 1); + memset(hexUUID, 0, sizeof(hexUUID)); - res = sqlite3_bind_blob(stmt, PDM_BIND_INDEX_FIRST, UUID, UUID_LENGTH, SQLITE_STATIC); + if (!convertUuidToHexString(UUID, hexUUID)) + { + return OC_STACK_ERROR; + } + + strncpy(sqlStat + PDM_SQLITE_GET_ID_SIZE - 1, hexUUID, HEX_UUID_STR_LENGTH); + res = sqlite3_prepare_v2(g_db, sqlStat, (int)sizeof(sqlStat), &stmt, 0); PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR); - OIC_LOG(DEBUG, TAG, "Binding Done"); while (SQLITE_ROW == sqlite3_step(stmt)) { int tempId = sqlite3_column_int(stmt, PDM_FIRST_INDEX); @@ -278,7 +329,10 @@ static OCStackResult getIdForUUID(const OicUuid_t *UUID , int *id) OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__); return OC_STACK_OK; } + sqlite3_finalize(stmt); + OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__); + return OC_STACK_INVALID_PARAM; } @@ -297,13 +351,22 @@ OCStackResult PDMIsDuplicateDevice(const OicUuid_t* UUID, bool *result) } 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); - PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR); + char sqlStat[PDM_SQLITE_GET_ID_SIZE - 1 + HEX_UUID_STR_LENGTH]; + char hexUUID[HEX_UUID_STR_LENGTH]; + + memset(sqlStat, 0, sizeof(sqlStat)); + strncpy(sqlStat, PDM_SQLITE_GET_ID, PDM_SQLITE_GET_ID_SIZE - 1); + memset(hexUUID, 0, sizeof(hexUUID)); + + if (!convertUuidToHexString(UUID, hexUUID)) + { + return OC_STACK_ERROR; + } - res = sqlite3_bind_blob(stmt, PDM_BIND_INDEX_FIRST, UUID, UUID_LENGTH, SQLITE_STATIC); + strncpy(sqlStat + PDM_SQLITE_GET_ID_SIZE - 1, hexUUID, HEX_UUID_STR_LENGTH); + res = sqlite3_prepare_v2(g_db, sqlStat, (int)sizeof(sqlStat), &stmt, 0); PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR); - OIC_LOG(DEBUG, TAG, "Binding Done"); bool retValue = false; while(SQLITE_ROW == sqlite3_step(stmt)) { @@ -902,17 +965,28 @@ OCStackResult PDMIsLinkExists(const OicUuid_t* uuidOfDevice1, const OicUuid_t* u static OCStackResult updateDeviceState(const OicUuid_t *uuid, PdmDeviceState_t state) { OIC_LOG_V(DEBUG, TAG, "IN %s", __func__); + OIC_LOG_V(WARNING, TAG, "UUID is: %s", (char*) uuid); 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, stmt, ERROR, OC_STACK_ERROR); + char sqlStat[PDM_SQLITE_UPDATE_DEVICE_SIZE - 1 + HEX_UUID_STR_LENGTH]; + char hexUUID[HEX_UUID_STR_LENGTH]; - res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_FIRST, state); - PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR); + memset(sqlStat, 0, sizeof(sqlStat)); + strncpy(sqlStat, PDM_SQLITE_UPDATE_DEVICE, PDM_SQLITE_UPDATE_DEVICE_SIZE - 1); + memset(hexUUID, 0, sizeof(hexUUID)); - res = sqlite3_bind_blob(stmt, PDM_BIND_INDEX_SECOND, uuid, UUID_LENGTH, SQLITE_STATIC); + if (!convertUuidToHexString(uuid, hexUUID)) + { + return OC_STACK_ERROR; + } + + strncpy(sqlStat + PDM_SQLITE_UPDATE_DEVICE_SIZE - 1, hexUUID, HEX_UUID_STR_LENGTH); + res = sqlite3_prepare_v2(g_db, sqlStat, + (int)sizeof(sqlStat), &stmt, NULL); + + PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR); + res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_FIRST, state); PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR); if (SQLITE_DONE != sqlite3_step(stmt)) @@ -1011,11 +1085,20 @@ OCStackResult PDMGetDeviceState(const OicUuid_t *uuid, PdmDeviceState_t* result) 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, stmt, ERROR, OC_STACK_ERROR); + char sqlStat[PDM_SQLITE_GET_DEVICE_STATUS_SIZE - 1 + HEX_UUID_STR_LENGTH]; + char hexUUID[HEX_UUID_STR_LENGTH]; + + memset(sqlStat, 0, sizeof(sqlStat)); + strncpy(sqlStat, PDM_SQLITE_GET_DEVICE_STATUS, PDM_SQLITE_GET_DEVICE_STATUS_SIZE - 1); + memset(hexUUID, 0, sizeof(hexUUID)); - res = sqlite3_bind_blob(stmt, PDM_BIND_INDEX_FIRST, uuid, UUID_LENGTH, SQLITE_STATIC); + if (!convertUuidToHexString(uuid, hexUUID)) + { + return OC_STACK_ERROR; + } + + strncpy(sqlStat + PDM_SQLITE_GET_DEVICE_STATUS_SIZE - 1, hexUUID, HEX_UUID_STR_LENGTH); + res = sqlite3_prepare_v2(g_db, sqlStat, (int)sizeof(sqlStat), &stmt, 0); PDM_VERIFY_SQLITE_OK(TAG, res, stmt, ERROR, OC_STACK_ERROR); *result = PDM_DEVICE_UNKNOWN; @@ -1025,8 +1108,10 @@ OCStackResult PDMGetDeviceState(const OicUuid_t *uuid, PdmDeviceState_t* result) OIC_LOG_V(DEBUG, TAG, "Device state is %d", tempStaleStateFromDb); *result = (PdmDeviceState_t)tempStaleStateFromDb; } + sqlite3_finalize(stmt); OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__); + return OC_STACK_OK; }