extern "C" cps_api_return_code_t cps_api_commit_one(cps_api_operation_types_t type,
        cps_api_object_t obj, size_t retry_count, size_t ms_delay_between) {

    cps_api_transaction_params_t tr;

    if (cps_api_transaction_init(&tr)!=cps_api_ret_code_OK) {
        return cps_api_ret_code_ERR;
    }
    cps_api_transaction_guard tr_g(&tr);

    cps_api_key_set_attr(cps_api_object_key(obj),type);

    if (!cps_api_object_list_append(tr.change_list,obj)) {
        return cps_api_ret_code_ERR;
    }
    bool inf = retry_count==0;

    if (ms_delay_between==0) ms_delay_between = BASIC_WAIT_TIME;
    ms_delay_between = MILLI_TO_MICRO(ms_delay_between);

    cps_api_return_code_t rc = cps_api_ret_code_ERR;
    while (inf || (retry_count >0) ) {
        rc = cps_api_commit(&tr);
        if (rc==cps_api_ret_code_OK) {
            //since this will be erased by the caller remove it from the transaction list
            break;
        }
        if (!inf) --retry_count;
        std_usleep(ms_delay_between);
    }
    cps_api_object_list_remove(tr.change_list,0);
    return rc;
}
void cps_api_key_init(cps_api_key_t * key,
        cps_api_qualifier_t qual,
        cps_api_object_category_types_t cat,
        cps_api_object_subcategory_types_t subcat, size_t number_of_inst, ...) {

    va_list v;

    cps_api_key_set_attr(key,0);
    size_t key_len = 0;

    if (qual!=0) {
        cps_api_key_set(key,CPS_OBJ_KEY_INST_POS,qual);
        ++key_len;
    }

    if ((key_len > CPS_OBJ_KEY_INST_POS) && cat!=0) {
        cps_api_key_set(key,CPS_OBJ_KEY_CAT_POS,cat);
        ++key_len;
    }
    if ((key_len > CPS_OBJ_KEY_CAT_POS) && subcat!=0) {
        cps_api_key_set(key,CPS_OBJ_KEY_SUBCAT_POS,subcat);
        ++key_len;
    }
    if (key_len >CPS_OBJ_KEY_SUBCAT_POS) {
        size_t ix = 0;
        size_t mx = number_of_inst;
        va_start(v,number_of_inst);
        for ( ; ix < mx ; ++ix ) {
            int val = va_arg(v,int);

            cps_api_key_set(key,CPS_OBJ_KEY_APP_INST_POS+ix,val);
            ++key_len;
        }
        va_end(v);
    }