OIC_LOG_V(ERROR, TAG, "SQLLite Error: %s : %d", errMsg, errCode);
}
+static bool stringArgumentNonNullAndWithinBounds(const char* argument)
+{
+ return ((NULL != argument) && (strlen(argument) <= INT_MAX));
+}
+
static bool stringArgumentWithinBounds(const char* argument)
{
return ((NULL == argument) || (strlen(argument) <= INT_MAX));
static int storeResourceTypes(const char **resourceTypes, size_t size, sqlite3_int64 rowid)
{
- int res = 1;
+ int res = SQLITE_ERROR;
sqlite3_stmt *stmt = NULL;
if (!stringArgumentsWithinBounds(resourceTypes, size))
{
int deleteRTSize = (int)sizeof(deleteRT);
int insertRTSize = (int)sizeof(insertRT);
-
VERIFY_SQLITE(sqlite3_prepare_v2(gRDDB, deleteRT, deleteRTSize, &stmt, NULL));
VERIFY_SQLITE(sqlite3_bind_int64(stmt, sqlite3_bind_parameter_index(stmt, "@id"), rowid));
res = sqlite3_step(stmt);
static int storeInterfaces(const char **interfaces, size_t size, sqlite3_int64 rowid)
{
- int res = 1;
+ int res = SQLITE_ERROR;
sqlite3_stmt *stmt = NULL;
if (!stringArgumentsWithinBounds(interfaces, size))
{
return res;
}
-static int storeLinkPayload(const OCRepPayload *rdPayload, sqlite3_int64 rowid)
+static OCRepPayloadValue *getLinks(const OCRepPayload *rdPayload)
{
- int res = SQLITE_OK;
-
/*
* Iterate over the properties manually rather than OCRepPayloadGetPropObjectArray to avoid
* the clone since we want to insert the 'ins' values into the payload.
*/
- OCRepPayloadValue *links;
- for (links = rdPayload->values; links; links = links->next)
+ OCRepPayloadValue *links = NULL;
+ if (rdPayload)
{
- if (0 == strcmp(links->name, OC_RSRVD_LINKS))
+ for (links = rdPayload->values; links; links = links->next)
{
- if (links->type != OCREP_PROP_ARRAY || links->arr.type != OCREP_PROP_OBJECT)
+ if (0 == strcmp(links->name, OC_RSRVD_LINKS))
{
- links = NULL;
+ if (links->type != OCREP_PROP_ARRAY || links->arr.type != OCREP_PROP_OBJECT)
+ {
+ links = NULL;
+ }
+ break;
}
- break;
}
}
- if (links != NULL)
- {
- sqlite3_stmt *stmt = NULL;
- char *uri = NULL;
- char *anchor = NULL;
- OCRepPayload *p = NULL;
- char **rt = NULL;
- size_t rtDim[MAX_REP_ARRAY_DEPTH] = {0};
- char **itf = NULL;
- size_t itfDim[MAX_REP_ARRAY_DEPTH] = {0};
- OCRepPayload** eps = NULL;
- size_t epsDim[MAX_REP_ARRAY_DEPTH] = {0};
-
- static const char insertDeviceLLList[] = "INSERT OR IGNORE INTO RD_DEVICE_LINK_LIST (ins, href, DEVICE_ID) "
- "VALUES((SELECT ins FROM RD_DEVICE_LINK_LIST WHERE DEVICE_ID=@id AND href=@uri),@uri,@id)";
- static const char updateDeviceLLList[] = "UPDATE RD_DEVICE_LINK_LIST SET anchor=@anchor,bm=@bm "
- "WHERE DEVICE_ID=@id AND href=@uri";
- int insertDeviceLLListSize = (int)sizeof(insertDeviceLLList);
- int updateDeviceLLListSize = (int)sizeof(updateDeviceLLList);
-
- for (size_t i = 0; (SQLITE_OK == res) && (i < links->arr.dimensions[0]); i++)
- {
- VERIFY_SQLITE(sqlite3_exec(gRDDB, "SAVEPOINT storeLinkPayload", NULL, NULL, NULL));
+ return links;
+}
- VERIFY_SQLITE(sqlite3_prepare_v2(gRDDB, insertDeviceLLList,
- insertDeviceLLListSize, &stmt, NULL));
+static int storeLinkPayload(OCRepPayloadValue *links, sqlite3_int64 rowid)
+{
+ int res = SQLITE_OK;
- OCRepPayload *link = links->arr.objArray[i];
- VERIFY_SQLITE(sqlite3_bind_int64(stmt, sqlite3_bind_parameter_index(stmt, "@id"), rowid));
- if (OCRepPayloadGetPropString(link, OC_RSRVD_HREF, &uri))
- {
- if (!stringArgumentWithinBounds(uri))
- {
- return res;
- }
- VERIFY_SQLITE(sqlite3_bind_text(stmt, sqlite3_bind_parameter_index(stmt, "@uri"),
- uri, (int)strlen(uri), SQLITE_STATIC));
- }
- res = sqlite3_step(stmt);
- if (SQLITE_DONE != res)
+ sqlite3_stmt *stmt = NULL;
+ char *uri = NULL;
+ char *anchor = NULL;
+ OCRepPayload *p = NULL;
+ char **rt = NULL;
+ size_t rtDim[MAX_REP_ARRAY_DEPTH] = {0};
+ char **itf = NULL;
+ size_t itfDim[MAX_REP_ARRAY_DEPTH] = {0};
+ OCRepPayload** eps = NULL;
+ size_t epsDim[MAX_REP_ARRAY_DEPTH] = {0};
+
+ static const char insertDeviceLLList[] = "INSERT OR IGNORE INTO RD_DEVICE_LINK_LIST (ins, href, DEVICE_ID) "
+ "VALUES((SELECT ins FROM RD_DEVICE_LINK_LIST WHERE DEVICE_ID=@id AND href=@uri),@uri,@id)";
+ static const char updateDeviceLLList[] = "UPDATE RD_DEVICE_LINK_LIST SET anchor=@anchor,bm=@bm "
+ "WHERE DEVICE_ID=@id AND href=@uri";
+ int insertDeviceLLListSize = (int)sizeof(insertDeviceLLList);
+ int updateDeviceLLListSize = (int)sizeof(updateDeviceLLList);
+
+ assert(links);
+ for (size_t i = 0; (SQLITE_OK == res) && (i < links->arr.dimensions[0]); i++)
+ {
+ VERIFY_SQLITE(sqlite3_exec(gRDDB, "SAVEPOINT storeLinkPayload", NULL, NULL, NULL));
+
+ VERIFY_SQLITE(sqlite3_prepare_v2(gRDDB, insertDeviceLLList,
+ insertDeviceLLListSize, &stmt, NULL));
+
+ OCRepPayload *link = links->arr.objArray[i];
+ VERIFY_SQLITE(sqlite3_bind_int64(stmt, sqlite3_bind_parameter_index(stmt, "@id"), rowid));
+ if (OCRepPayloadGetPropString(link, OC_RSRVD_HREF, &uri))
+ {
+ if (!stringArgumentWithinBounds(uri))
{
- goto exit;
+ return SQLITE_ERROR;
}
- VERIFY_SQLITE(sqlite3_finalize(stmt));
- stmt = NULL;
+ VERIFY_SQLITE(sqlite3_bind_text(stmt, sqlite3_bind_parameter_index(stmt, "@uri"),
+ uri, (int)strlen(uri), SQLITE_STATIC));
+ }
+ res = sqlite3_step(stmt);
+ if (SQLITE_DONE != res)
+ {
+ goto exit;
+ }
+ VERIFY_SQLITE(sqlite3_finalize(stmt));
+ stmt = NULL;
- VERIFY_SQLITE(sqlite3_prepare_v2(gRDDB, updateDeviceLLList,
- updateDeviceLLListSize, &stmt, NULL));
- VERIFY_SQLITE(sqlite3_bind_int64(stmt, sqlite3_bind_parameter_index(stmt, "@id"), rowid));
- if (uri)
- {
- VERIFY_SQLITE(sqlite3_bind_text(stmt, sqlite3_bind_parameter_index(stmt, "@uri"),
- uri, (int)strlen(uri), SQLITE_STATIC));
- }
- if (OCRepPayloadGetPropString(link, OC_RSRVD_URI, &anchor))
- {
- if (!stringArgumentWithinBounds(anchor))
- {
- goto exit;
- }
- VERIFY_SQLITE(sqlite3_bind_text(stmt, sqlite3_bind_parameter_index(stmt, "@anchor"),
- anchor, (int)strlen(anchor), SQLITE_STATIC));
- }
- if (OCRepPayloadGetPropObject(link, OC_RSRVD_POLICY, &p))
+ VERIFY_SQLITE(sqlite3_prepare_v2(gRDDB, updateDeviceLLList,
+ updateDeviceLLListSize, &stmt, NULL));
+ VERIFY_SQLITE(sqlite3_bind_int64(stmt, sqlite3_bind_parameter_index(stmt, "@id"), rowid));
+ if (uri)
+ {
+ VERIFY_SQLITE(sqlite3_bind_text(stmt, sqlite3_bind_parameter_index(stmt, "@uri"),
+ uri, (int)strlen(uri), SQLITE_STATIC));
+ }
+ if (OCRepPayloadGetPropString(link, OC_RSRVD_URI, &anchor))
+ {
+ if (!stringArgumentWithinBounds(anchor))
{
- sqlite3_int64 bm = 0;
- if (OCRepPayloadGetPropInt(p, OC_RSRVD_BITMAP, (int64_t *) &bm))
- {
- VERIFY_SQLITE(sqlite3_bind_int64(stmt, sqlite3_bind_parameter_index(stmt, "@bm"), bm));
- }
+ goto exit;
}
- res = sqlite3_step(stmt);
- if (SQLITE_DONE != res)
+ VERIFY_SQLITE(sqlite3_bind_text(stmt, sqlite3_bind_parameter_index(stmt, "@anchor"),
+ anchor, (int)strlen(anchor), SQLITE_STATIC));
+ }
+ if (OCRepPayloadGetPropObject(link, OC_RSRVD_POLICY, &p))
+ {
+ sqlite3_int64 bm = 0;
+ if (OCRepPayloadGetPropInt(p, OC_RSRVD_BITMAP, (int64_t *) &bm))
{
- goto exit;
+ VERIFY_SQLITE(sqlite3_bind_int64(stmt, sqlite3_bind_parameter_index(stmt, "@bm"), bm));
}
- VERIFY_SQLITE(sqlite3_finalize(stmt));
- stmt = NULL;
+ }
+ res = sqlite3_step(stmt);
+ if (SQLITE_DONE != res)
+ {
+ goto exit;
+ }
+ VERIFY_SQLITE(sqlite3_finalize(stmt));
+ stmt = NULL;
- static const char input[] = "SELECT ins FROM RD_DEVICE_LINK_LIST WHERE DEVICE_ID=@id AND href=@uri";
- int inputSize = (int)sizeof(input);
+ static const char input[] = "SELECT ins FROM RD_DEVICE_LINK_LIST WHERE DEVICE_ID=@id AND href=@uri";
+ int inputSize = (int)sizeof(input);
- VERIFY_SQLITE(sqlite3_prepare_v2(gRDDB, input, inputSize, &stmt, NULL));
- VERIFY_SQLITE(sqlite3_bind_int64(stmt, sqlite3_bind_parameter_index(stmt, "@id"), rowid));
- if (uri)
- {
- VERIFY_SQLITE(sqlite3_bind_text(stmt, sqlite3_bind_parameter_index(stmt, "@uri"),
- uri, (int)strlen(uri), SQLITE_STATIC));
- }
- res = sqlite3_step(stmt);
- if (res == SQLITE_ROW || res == SQLITE_DONE)
- {
- sqlite3_int64 ins = sqlite3_column_int64(stmt, 0);
- VERIFY_SQLITE(sqlite3_finalize(stmt));
- stmt = NULL;
- if (!OCRepPayloadSetPropInt(link, OC_RSRVD_INS, ins))
- {
- OIC_LOG_V(ERROR, TAG, "Error setting 'ins' value");
- return OC_STACK_ERROR;
- }
- OCRepPayloadGetStringArray(link, OC_RSRVD_RESOURCE_TYPE, &rt, rtDim);
- OCRepPayloadGetStringArray(link, OC_RSRVD_INTERFACE, &itf, itfDim);
- OCRepPayloadGetPropObjectArray(link, OC_RSRVD_ENDPOINTS, &eps, epsDim);
- VERIFY_SQLITE(storeResourceTypes((const char **) rt, rtDim[0], ins));
- VERIFY_SQLITE(storeInterfaces((const char **) itf, itfDim[0], ins));
- VERIFY_SQLITE(storeEndpoints(eps, epsDim[0], ins));
- }
- else
+ VERIFY_SQLITE(sqlite3_prepare_v2(gRDDB, input, inputSize, &stmt, NULL));
+ VERIFY_SQLITE(sqlite3_bind_int64(stmt, sqlite3_bind_parameter_index(stmt, "@id"), rowid));
+ if (uri)
+ {
+ VERIFY_SQLITE(sqlite3_bind_text(stmt, sqlite3_bind_parameter_index(stmt, "@uri"),
+ uri, (int)strlen(uri), SQLITE_STATIC));
+ }
+ res = sqlite3_step(stmt);
+ if (res == SQLITE_ROW || res == SQLITE_DONE)
+ {
+ sqlite3_int64 ins = sqlite3_column_int64(stmt, 0);
+ VERIFY_SQLITE(sqlite3_finalize(stmt));
+ stmt = NULL;
+ if (!OCRepPayloadSetPropInt(link, OC_RSRVD_INS, ins))
{
- VERIFY_SQLITE(sqlite3_finalize(stmt));
- stmt = NULL;
+ OIC_LOG_V(ERROR, TAG, "Error setting 'ins' value");
+ return SQLITE_ERROR;
}
+ OCRepPayloadGetStringArray(link, OC_RSRVD_RESOURCE_TYPE, &rt, rtDim);
+ OCRepPayloadGetStringArray(link, OC_RSRVD_INTERFACE, &itf, itfDim);
+ OCRepPayloadGetPropObjectArray(link, OC_RSRVD_ENDPOINTS, &eps, epsDim);
+ VERIFY_SQLITE(storeResourceTypes((const char **) rt, rtDim[0], ins));
+ VERIFY_SQLITE(storeInterfaces((const char **) itf, itfDim[0], ins));
+ VERIFY_SQLITE(storeEndpoints(eps, epsDim[0], ins));
+ }
+ else
+ {
+ VERIFY_SQLITE(sqlite3_finalize(stmt));
+ stmt = NULL;
+ }
- VERIFY_SQLITE(sqlite3_exec(gRDDB, "RELEASE storeLinkPayload", NULL, NULL, NULL));
- res = SQLITE_OK;
+ VERIFY_SQLITE(sqlite3_exec(gRDDB, "RELEASE storeLinkPayload", NULL, NULL, NULL));
+ res = SQLITE_OK;
- exit:
- if (eps)
- {
- for (size_t j = 0; j < epsDim[0]; j++)
- {
- OCRepPayloadDestroy(eps[j]);
- }
- OICFree(eps);
- eps = NULL;
- }
- if (itf)
+ exit:
+ if (eps)
+ {
+ for (size_t j = 0; j < epsDim[0]; j++)
{
- for (size_t j = 0; j < itfDim[0]; j++)
- {
- OICFree(itf[j]);
- }
- OICFree(itf);
- itf = NULL;
+ OCRepPayloadDestroy(eps[j]);
}
- if (rt)
+ OICFree(eps);
+ eps = NULL;
+ }
+ if (itf)
+ {
+ for (size_t j = 0; j < itfDim[0]; j++)
{
- for (size_t j = 0; j < rtDim[0]; j++)
- {
- OICFree(rt[j]);
- }
- OICFree(rt);
- rt = NULL;
+ OICFree(itf[j]);
}
- OCPayloadDestroy((OCPayload *)p);
- p = NULL;
- OICFree(anchor);
- anchor = NULL;
- OICFree(uri);
- uri = NULL;
- sqlite3_finalize(stmt);
- stmt = NULL;
- if (SQLITE_OK != res)
+ OICFree(itf);
+ itf = NULL;
+ }
+ if (rt)
+ {
+ for (size_t j = 0; j < rtDim[0]; j++)
{
- sqlite3_exec(gRDDB, "ROLLBACK TO storeLinkPayload", NULL, NULL, NULL);
+ OICFree(rt[j]);
}
+ OICFree(rt);
+ rt = NULL;
+ }
+ OCPayloadDestroy((OCPayload *)p);
+ p = NULL;
+ OICFree(anchor);
+ anchor = NULL;
+ OICFree(uri);
+ uri = NULL;
+ sqlite3_finalize(stmt);
+ stmt = NULL;
+ if (SQLITE_OK != res)
+ {
+ sqlite3_exec(gRDDB, "ROLLBACK TO storeLinkPayload", NULL, NULL, NULL);
}
}
static int storeResources(const OCRepPayload *payload, bool externalHost)
{
- char *deviceId = NULL;
sqlite3_stmt *stmt = NULL;
+
+ /* di is a required property */
+ char *deviceId = NULL;
OCRepPayloadGetPropString(payload, OC_RSRVD_DEVICE_ID, &deviceId);
- if (!stringArgumentWithinBounds(deviceId))
+ if (!stringArgumentNonNullAndWithinBounds(deviceId))
{
- return OC_STACK_ERROR;
+ return SQLITE_ERROR;
}
+ /* ttl is a required property */
int64_t tmp = 0;
- OCRepPayloadGetPropInt(payload, OC_RSRVD_DEVICE_TTL, &tmp);
+ if (!OCRepPayloadGetPropInt(payload, OC_RSRVD_DEVICE_TTL, &tmp))
+ {
+ return SQLITE_ERROR;
+ }
sqlite3_int64 ttl = tmp;
+ /* links is a required property */
+ OCRepPayloadValue *links = getLinks(payload);
+ if (!links)
+ {
+ return SQLITE_ERROR;
+ }
+
int res;
VERIFY_SQLITE(sqlite3_exec(gRDDB, "BEGIN TRANSACTION", NULL, NULL, NULL));
sqlite3_int64 rowid = sqlite3_column_int64(stmt, 0);
VERIFY_SQLITE(sqlite3_finalize(stmt));
stmt = NULL;
- VERIFY_SQLITE(storeLinkPayload(payload, rowid));
+ VERIFY_SQLITE(storeLinkPayload(links, rowid));
}
else
{
if (!stringArgumentWithinBounds(deviceId))
{
OIC_LOG_V(ERROR, TAG, "Query longer than %d: \n%s", INT_MAX, deviceId);
- return OC_STACK_ERROR;
+ return SQLITE_ERROR;
}
int res;