Exemple #1
0
c_iter
v_resolveMMFGroups(
    c_set groups,
    const c_char *partitionExpr,
    const c_char *topicExpr)
{
    c_collection q;
    q_expr expr;
    c_iter list;
    c_value params[2];

    assert(groups != NULL);

    expr = (q_expr)q_parse("partition.name like %0 and topic.name like %1");
    if (expr == NULL) {
        assert(expr != NULL);
        return NULL;
    }
    params[0] = c_stringValue((c_string)partitionExpr);
    params[1] = c_stringValue((c_string)topicExpr);
    q = c_queryNew(groups, expr, params);
    if (q == NULL) {
        list = NULL;
    } else {
        list = ospl_c_select(q,0);
    }
    assert(q != NULL);
    c_free(q);
    q_dispose(expr);

    return list;
}
Exemple #2
0
void
v_participantDeleteHistoricalData(
    v_participant participant,
    const c_char* partitionExpr,
    const c_char* topicExpr)
{
    c_iter matchingGroups;
    v_group group;
    c_time t;
    c_value params[2];
    C_STRUCT(v_event) event;
    C_STRUCT(v_historyDeleteEventData) hde;

    assert(participant != NULL);
    assert(C_TYPECHECK(participant, v_participant));
    assert(partitionExpr);
    assert(topicExpr);

    if(partitionExpr && topicExpr){
        params[0]  = c_stringValue((c_string)partitionExpr);
        params[1]  = c_stringValue((c_string)topicExpr);

        c_lockRead(&participant->lock);
        t = v_timeGet();
        matchingGroups = v_groupSetSelect(
                                v_objectKernel(participant)->groupSet,
                                "partition.name like %0 AND topic.name like %1",
                                params);
        c_lockUnlock(&participant->lock);

        group = v_group(c_iterTakeFirst(matchingGroups));
        while(group){
            v_groupDeleteHistoricalData(group, t);
            c_free(group);
            group = v_group(c_iterTakeFirst(matchingGroups));
        }
        c_iterFree(matchingGroups);


        hde.partitionExpression = (c_char *)partitionExpr;
        hde.topicExpression = (c_char *)topicExpr;
        hde.deleteTime = t;
        event.kind = V_EVENT_HISTORY_DELETE;
        event.source = v_publicHandle(v_public(participant));
        event.userData = &hde;
        v_observableNotify(v_observable(v_objectKernel(participant)),&event);
    }
    return;
}
d_groupInfo
d_storeMMFKernelGetGroupInfo(
    d_storeMMFKernel _this,
    const char *partition,
    const char *topic )
{
    d_groupInfo result;
    c_value keyValues[2];

    keyValues[0] = c_stringValue((c_string)partition);
    keyValues[1] = c_stringValue((c_string)topic);
    result = c_tableFind(_this->groups, keyValues); /* c_tableFind already performs keep. */

    return result;
}
static c_bool
v_partitionAdminRemoveExpression(
    v_partitionAdmin da,
    const char *partitionExpr)
{
    c_bool result = FALSE;
    v_partitionInterest partitionInterest, found;
    q_expr expr;
    c_collection q;
    c_iter list;
    c_value params[1];

    assert(!v_partitionExpressionIsAbsolute(partitionExpr));

    expr = (q_expr)q_parse("expression like %0");
    params[0] = c_stringValue((char *)partitionExpr);
    q = c_queryNew(da->partitionInterests, expr, params);
    q_dispose(expr);
    list = ospl_c_select(q,0);
    assert(c_iterLength(list) <= 1);
    partitionInterest = v_partitionInterest(c_iterTakeFirst(list));
    while (partitionInterest) {
        result = TRUE;
        found = c_tableRemove(da->partitionInterests, partitionInterest, NULL, NULL);
        c_free(partitionInterest);
        c_free(found);
        partitionInterest = v_partitionInterest(c_iterTakeFirst(list));
    }
    c_free(q);
    c_iterFree(list);

    return result;
}
d_storeResult
d_storeMMFKernelIsNameSpaceComplete(
    d_storeMMFKernel kernel,
    const d_nameSpace nameSpace,
    c_bool* isComplete)
{
    d_nameSpaceInfo nsInfo;
    c_char* name;
    d_storeResult result;
    c_value keyValues[1];

    if(kernel && nameSpace){
        name = d_nameSpaceGetName(nameSpace);
        keyValues[0] = c_stringValue((c_string)name);
        nsInfo = c_tableFind(kernel->nameSpaces, keyValues);

        if(nsInfo){
            *isComplete = nsInfo->complete;
            result = D_STORE_RESULT_OK;
        } else {
            *isComplete = FALSE;
            result = D_STORE_RESULT_OK;
        }
    } else {
        result = D_STORE_RESULT_ILL_PARAM;
    }
    return result;
}
Exemple #6
0
c_bool
u_cfValueScan(
    c_value value,
    c_valueKind valueKind,
    c_value *valuePtr)
{
    int i;
    c_bool result = FALSE;

    if (value.kind == V_STRING) {
        switch (valueKind) {
        __CASE__(CHAR,c_char);
        __CASE__(SHORT,c_short);
        __CASE__(USHORT,c_ushort);
        __CASE__(LONG,c_long);
        __CASE__(ULONG,c_ulong);
        __CASE__(LONGLONG,c_longlong);
        __CASE__(ULONGLONG,c_ulonglong);
        __CASE__(FLOAT,c_float);
        case V_BOOLEAN:
        {
            c_bool dest;
            result = u_cfValueScanBoolean(value.is.String, &dest);
            if (result) {
                *valuePtr = c_boolValue(dest);
            }
        }
        break;
        case V_STRING:
        {
             c_char *str;
             c_ulong length;

             length = (c_ulong)strlen(value.is.String);
             str = os_malloc(length + 1U);
             os_strncpy(str, value.is.String, length);
             str[length] = 0;
             *valuePtr = c_stringValue(str);
             result = TRUE;
        }
        break;
        case V_OCTET:
        case V_DOUBLE:
        default:
            result = FALSE;
            assert(0); /* Catch unhandled case */
        break;
        }
    } else {
        result = FALSE;
    }

    return result;
}
static d_topicInfo
d_storeMMFKernelGetTopicInfo(
    d_storeMMFKernel _this,
    const char* topic)
{
    d_topicInfo result;
    c_value keyValue;

    keyValue = c_stringValue((c_string)topic);
    result = c_tableFind(_this->topics, &keyValue); /* c_tableFind already performs keep. */

    return result;
}
static d_topicInfo
d_storeMMFKernelGetTopicInfo(
    d_storeMMFKernel _this,
    const char* topic)
{
    d_topicInfo result;
    c_value keyValue;

    keyValue = c_stringValue((c_string)topic);
    result = c_tableFind(_this->topics, &keyValue);

    return c_keep(result);
}
d_storeResult
d_storeMMFKernelMarkNameSpaceComplete(
    d_storeMMFKernel kernel,
    const d_nameSpace nameSpace,
    const c_bool isComplete)
{
    d_nameSpaceInfo nsInfo;
    c_type type;
    c_char* name;
    c_value keyValues[1];
    d_storeResult result;

    if(kernel && nameSpace){
        name = d_nameSpaceGetName(nameSpace);
        keyValues[0] = c_stringValue((c_string)name);
        nsInfo = c_tableFind(kernel->nameSpaces, keyValues);

        if(nsInfo){
            nsInfo->complete = isComplete;
            result = D_STORE_RESULT_OK;
        } else {
            type = c_resolve(c_getBase(kernel),
                    "durabilityModule2::d_nameSpaceInfo");
            nsInfo = (d_nameSpaceInfo)c_new(type);
            c_free(type);

            if (nsInfo) {
                nsInfo->name = c_stringNew(c_getBase(kernel), name);
                nsInfo->complete = isComplete;
                c_tableInsert(kernel->nameSpaces, nsInfo);
                c_free(nsInfo);
                result = D_STORE_RESULT_OK;
            } else {
                OS_REPORT(OS_ERROR,
                      "d_storeMMFKernelMarkNameSpaceComplete",0,
                      "Failed to allocate nameSpaceInfo.");
                result = D_STORE_RESULT_OUT_OF_RESOURCES;
            }
        }
    } else {
        result = D_STORE_RESULT_ILL_PARAM;
    }
    return result;
}
Exemple #10
0
static c_iter
v_resolveMMFNameSpaces(
    d_storeMMFKernel kernel,
    const c_char *name)
{
    c_iter list;
    c_collection q;
    q_expr expr;
    c_value params[1];

    assert(kernel != NULL);
    assert(C_TYPECHECK(kernel,v_kernel));

    expr = (q_expr)q_parse("name like %0");
    params[0] = c_stringValue((char *)name);
    q = c_queryNew(kernel->nameSpaces,expr,params);
    q_dispose(expr);
    list = ospl_c_select(q,0);
    c_free(q);
    return list;
}
Exemple #11
0
c_iter
v_resolveTopics(
    v_kernel kernel,
    const c_char *name)
{
    c_iter list;
    c_collection q;
    q_expr expr;
    c_value params[1];

    assert(kernel != NULL);
    assert(C_TYPECHECK(kernel,v_kernel));

    expr = (q_expr)q_parse("name like %0");
    params[0] = c_stringValue((char *)name);
    q = c_queryNew(kernel->topics,expr,params);
    q_dispose(expr);
    c_lockRead(&kernel->lock);
    list = c_select(q,0);
    c_lockUnlock(&kernel->lock);
    c_free(q);
    return list;
}
static c_bool
v__partitionAdminRemove(
    v_partitionAdmin da,
    const char *partitionName,
    v_partition *partitionRemoved)
{
    c_bool result;
    v_partition partition, found;
    q_expr expr;
    c_collection q;
    c_iter list;
    c_value params[1];

    assert(v_partitionExpressionIsAbsolute(partitionName));

    expr = (q_expr)q_parse("name like %0");
    params[0] = c_stringValue((char *)partitionName);
    q = c_queryNew(da->partitions, expr, params);
    q_dispose(expr);
    list = ospl_c_select(q,0);
    assert(c_iterLength(list) <= 1);
    partition = v_partition(c_iterTakeFirst(list));
    if (partition) {
        found = c_tableRemove(da->partitions, partition, NULL, NULL);
        *partitionRemoved = found;
        c_free(partition);
        result = TRUE;
    } else {
        *partitionRemoved = NULL;
        result = FALSE;
    }
    c_free(q);
    c_iterFree(list);

    return result;
}
Exemple #13
0
DDS::ReturnCode_t
DDS::OpenSplice::DataReader::nlReq_init (
    DDS::OpenSplice::Subscriber *subscriber,
    const DDS::DataReaderQos &qos,
    DDS::OpenSplice::TopicDescription *a_topic,
    const char *name)
{
    DDS::OpenSplice::ContentFilteredTopic *contentFilteredTopic;
    DDS::ULong i = 0;
    DDS::ULong length = 0;
    DDS::ULong bytes = 0;
    DDS::ReturnCode_t result = DDS::RETCODE_OK;
    u_readerQos uReaderQos = NULL;
    u_dataReader uReader = NULL;
    const char *expression = NULL;
    c_value *uParameters = NULL;

    assert (subscriber != NULL);
    /* Only check for QoS consistency here in debug builds. It's unnecessary to
       to verify it twice in release builds. */
    assert (DDS::OpenSplice::Utils::qosIsConsistent (qos) == DDS::RETCODE_OK);
    assert (a_topic != NULL);
    assert (name != NULL);

    uReaderQos = u_readerQosNew (NULL);
    if (uReaderQos != NULL) {
        result = DDS::OpenSplice::Utils::copyQosIn (qos, uReaderQos);
    } else {
        result = DDS::RETCODE_OUT_OF_RESOURCES;
        CPP_REPORT(result, "Could not copy DataReaderQos.");
    }

    if (result == DDS::RETCODE_OK) {
        result = this->pimpl->views->init();
    }

    if (result == DDS::RETCODE_OK) {
        result = this->pimpl->conditions->init();
    }

    if (result == DDS::RETCODE_OK) {
        result = a_topic->write_lock();
        if (result == DDS::RETCODE_OK) {
            expression = a_topic->rlReq_get_topic_expression ();
            assert(expression);
            switch (a_topic->rlReq_get_kind()) {
                case DDS::OpenSplice::CONTENTFILTEREDTOPIC:
                    contentFilteredTopic =
                        dynamic_cast<DDS::OpenSplice::ContentFilteredTopic *>(a_topic);
                    if (contentFilteredTopic != NULL) {
                        length = contentFilteredTopic->filterParameters.length ();
                        if(length > 0) {
                            bytes = length * sizeof (struct c_value);
                            uParameters = (c_value *)os_malloc (bytes);
                            for (i = 0; i < length; i++) {
                                const c_string param = (const c_string) contentFilteredTopic->filterParameters[i].in();
                                uParameters[i] = c_stringValue(param);
                            }
                        }
                    } else {
                        result = DDS::RETCODE_BAD_PARAMETER;
                        CPP_REPORT(result, "a_topic invalid, not of type '%s'",
                            "DDS::OpenSplice::ContentFilteredTopic");
                    }
                    break;
                case DDS::OpenSplice::TOPIC:
                default:
                    uParameters = NULL;
                    break;
            }
        }

        if (result == DDS::RETCODE_OK) {
            uReader = u_dataReaderNew (
                u_subscriber (subscriber->rlReq_get_user_entity ()),
                name,
                expression,
                uParameters,
                length,
                uReaderQos);
            if (uReader == NULL) {
                result = DDS::RETCODE_OUT_OF_RESOURCES;
                CPP_REPORT(result, "Could not create DataReader.");
            }
        }

        if (result == DDS::RETCODE_OK) {
            result = DDS::OpenSplice::Entity::nlReq_init (u_entity (uReader));
            if (result == DDS::RETCODE_OK) {
                (void) DDS::Subscriber::_duplicate(subscriber);
                this->pimpl->subscriber = subscriber;
                (void) DDS::TopicDescription::_duplicate(a_topic);
                this->pimpl->topic = a_topic;
                a_topic->wlReq_incrNrUsers();
                setDomainId(subscriber->getDomainId());

            }
        }

        a_topic->unlock();
    }

    if (uReaderQos) {
        u_readerQosFree (uReaderQos);
    }
    if (uParameters) {
        os_free (uParameters);
    }

    return result;
}
static in_result
in_ddsiStreamReaderImplDerializePayloadByKeyHash(
	in_ddsiStreamReaderImpl _this,
	in_ddsiSubmessageData submessage,
	in_connectivityPeerWriter peerWriter,
	v_topic topic,
	v_message *messageObject,
	c_octet* keyHash)
{
	in_result result;
	c_long nrOfKeys, i, bytesCopied;
	c_array messageKeyList;
	c_value value;
	c_base base;

	assert(_this);
	assert(submessage);
	assert(peerWriter);
	assert(topic);
	assert(*messageObject);

	messageKeyList = v_topicMessageKeyList(topic);
	nrOfKeys = c_arraySize(messageKeyList);
	bytesCopied = 0;
	base = c_getBase(topic);
	result = IN_RESULT_OK;

	/*TODO: In case key is larger then 16 bytes, MD5 must be used*/
	for (i=0;(i<nrOfKeys) && (result == IN_RESULT_OK);i++)
	{
		switch(c_fieldValueKind(messageKeyList[i]))
		{
		case V_BOOLEAN:
			value = c_boolValue(*((c_bool*)&(keyHash[bytesCopied])));
			bytesCopied += sizeof(c_bool);
		break;
		case V_OCTET:
			value = c_octetValue(*((c_octet*)&(keyHash[bytesCopied])));
			bytesCopied += sizeof(c_octet);
		break;
		case V_SHORT:
#ifdef PA_BIG_ENDIAN
			value = c_shortValue(*((c_short*)&(keyHash[bytesCopied])));
#else
			value = c_shortValue(IN_UINT16_SWAP_LE_BE(*((c_short*)&(keyHash[bytesCopied]))));
#endif
			bytesCopied += sizeof(c_short);
		break;
		case V_USHORT:
#ifdef PA_BIG_ENDIAN
			value = c_ushortValue(*((c_ushort*)&(keyHash[bytesCopied])));
#else
			value = c_ushortValue(IN_UINT16_SWAP_LE_BE(*((c_ushort*)&(keyHash[bytesCopied]))));
#endif
			bytesCopied += sizeof(c_ushort);
		break;
		case V_LONG:
#ifdef PA_BIG_ENDIAN
			value = c_longValue(*((c_long*)&(keyHash[bytesCopied])));
#else
			value = c_longValue(IN_UINT32_SWAP_LE_BE(*((c_long*)&(keyHash[bytesCopied]))));
#endif
			bytesCopied += sizeof(c_long);
		break;

		case V_ULONG:
#ifdef PA_BIG_ENDIAN
			value = c_ulongValue(*((c_ulong*)&(keyHash[bytesCopied])));
#else
			value = c_ulongValue(IN_UINT32_SWAP_LE_BE(*((c_ulong*)&(keyHash[bytesCopied]))));
#endif
			bytesCopied += sizeof(c_long);
		break;
		case V_CHAR:
			value = c_charValue(*((c_char*)&(keyHash[bytesCopied])));
			bytesCopied += sizeof(c_char);
		break;
		case V_STRING:
#ifdef PA_BIG_ENDIAN
			value = c_ulongValue(*((c_ulong*)&(keyHash[bytesCopied])));
#else
			value = c_ulongValue(IN_UINT32_SWAP_LE_BE(*((c_ulong*)&(keyHash[bytesCopied]))));
#endif
			bytesCopied += 4;
			/*TODO: validate the string copy algorithm*/
			if(value.is.ULong != 0)
			{
				value = c_stringValue(
					c_stringNew(base,((c_string)(&(keyHash[bytesCopied])))));
				bytesCopied += strlen(value.is.String) + 1;
			} else
			{
				value = c_stringValue(c_stringNew(base, ""));
				bytesCopied += 1;
			}
		break;
		case V_DOUBLE:
			value = c_undefinedValue();
			bytesCopied += sizeof(c_double);
			result = IN_RESULT_PRECONDITION_NOT_MET;
		break;
		case V_FLOAT:
			value = c_undefinedValue();
			bytesCopied += sizeof(c_float);
			result = IN_RESULT_PRECONDITION_NOT_MET;
		break;
		case V_ULONGLONG:
			value = c_undefinedValue();
			bytesCopied += sizeof(c_ulonglong);
			result = IN_RESULT_PRECONDITION_NOT_MET;
		break;
		case V_LONGLONG:
			value = c_undefinedValue();
			bytesCopied += sizeof(c_longlong);
			result = IN_RESULT_PRECONDITION_NOT_MET;
		break;
		default:
			value = c_undefinedValue();
			assert(FALSE);
			result = IN_RESULT_ERROR;
		break;
		}
		c_fieldAssign(messageKeyList[i],*messageObject, value);
		c_valueFreeRef(value);
	}

	return result;
}