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); }