static cps_api_return_code_t db_read_function (void * context, cps_api_get_params_t * param, size_t key_ix) {
    cps_api_return_code_t rc = cps_api_ret_code_OK;
    cps_api_key_t key;
    cps_api_key_init(&key,cps_api_qualifier_TARGET,
            cps_api_obj_cat_ROUTE, cps_api_route_obj_ROUTE, 0);
    if (cps_api_key_matches(&param->keys[key_ix], &key,false)!=0) {
        return cps_api_ret_code_OK;
    }

    route_filter_t rf;
    memset(&rf,0,sizeof(rf));
    //!TODO need to handle the filter requests (using the received key)
    read_all_routes(param->list,&rf);

    return rc;
}
static cps_api_return_code_t _write_function(void * context, cps_api_transaction_params_t * param,size_t ix) {
    cps_api_object_t obj = cps_api_object_list_get(param->change_list,ix);
    if (obj==NULL) return cps_api_ret_code_ERR;
    cps_api_operation_types_t op = cps_api_object_type_operation(cps_api_object_key(obj));

    cps_api_object_t prev = cps_api_object_create();
    if (prev==NULL) return cps_api_ret_code_ERR;
    if (!cps_api_object_list_append(param->prev,prev)) {
        cps_api_object_delete(prev);
        return cps_api_ret_code_ERR;
    }

    cps_api_key_t _local_key;
    cps_api_key_init(&_local_key,cps_api_qualifier_TARGET,cps_api_obj_cat_ROUTE,cps_api_route_obj_EVENT,0);
    if (cps_api_key_matches(&_local_key,cps_api_object_key(obj),true)) {
        os_send_refresh(nas_nl_sock_T_ROUTE);
    } else {
        return _op(op,context,obj,prev);
    }
    return cps_api_ret_code_OK;
}
cps_api_return_code_t ds_api_linux_interface_get_function (void * context, cps_api_get_params_t * param, size_t ix) {
    cps_api_return_code_t rc = cps_api_ret_code_OK;
    cps_api_key_t key;
    cps_api_int_if_key_create(&key,false,0,0);

    if (cps_api_key_matches(&(param->keys[ix]),&key,false)==0) {
        if (cps_api_key_get_len(&param->keys[ix])<=CPS_OBJ_KEY_APP_INST_POS) {
            return get_all_interfaces(param->list);
        } else {
            uint32_t ifix = cps_api_key_element_at(&param->keys[ix],CPS_API_INT_IF_OBJ_KEY_IFIX);
            char if_name[HAL_IF_NAME_SZ+1];
            if (cps_api_interface_if_index_to_name(ifix,if_name,
                    sizeof(if_name))==NULL) {
                return cps_api_ret_code_OK;
            }
            rc = get_interface(if_name,param,&ix);
            //toss rc on a query unless it fails due to some sw err
        }
    }

    return rc;
}
TEST(cps_api_key,key_compare) {
    char buff1[1024];
    char buff2[1024];

    cps_api_key_t key;
    memset(&key,0,sizeof(key));
    cps_api_key_set(&key,0,1);
    cps_api_key_set(&key,1,3);
    cps_api_key_set(&key,2,1);
    cps_api_key_set(&key,3,1);
    cps_api_key_set_len(&key,4);

    cps_api_key_t key2;
    memset(&key2,0,sizeof(key2));
    cps_api_key_set(&key2,0,1);
    cps_api_key_set(&key2,1,3);
    cps_api_key_set(&key2,2,1);
    cps_api_key_set(&key2,3,1);
    cps_api_key_set_len(&key2,4);
    ASSERT_TRUE(cps_api_key_matches(&key,&key2,false)==0);

    cps_api_key_set(&key2,1,4);
    ASSERT_TRUE(cps_api_key_matches(&key,&key2,false)!=0);

    cps_api_key_set(&key2,1,3);
    cps_api_key_set(&key2,4,2);
    cps_api_key_set_len(&key2,3);
    ASSERT_TRUE(cps_api_key_matches(&key,&key2,false)==0);

    cps_api_key_set(&key2,1,2);
    cps_api_key_set_len(&key2,4);
    ASSERT_TRUE(cps_api_key_matches(&key,&key2,false)!=0);

    cps_api_key_t key3;
    memset(&key3,0,sizeof(key3));
    cps_api_key_set(&key3,0,1);
    cps_api_key_set(&key3,1,3);
    cps_api_key_set(&key3,2,1);
    cps_api_key_set_len(&key3,3);

    ASSERT_TRUE(cps_api_key_matches(&key,&key3,true)!=0);
    cps_api_key_set_len(&key3,1);
    ASSERT_TRUE(cps_api_key_matches(&key,&key3,false)==0);
    cps_api_key_set_len(&key3,2);
    ASSERT_TRUE(cps_api_key_matches(&key,&key3,false)==0);

    cps_api_key_set(&key2,1,3);
    ASSERT_TRUE(cps_api_key_matches(&key,&key2,true)==0);
    printf("Key 1 %s, Key 2 %s\n",cps_api_key_print(&key,buff1,sizeof(buff1)),
            cps_api_key_print(&key2,buff2,sizeof(buff2)));

    cps_api_key_set_len(&key2,2);
    cps_api_key_set(&key2,2,4);

    ASSERT_TRUE(cps_api_key_matches(&key,&key2,false)==0);
    printf("Key 1 %s, Key 2 %s\n",cps_api_key_print(&key,buff1,sizeof(buff1)),
            cps_api_key_print(&key2,buff2,sizeof(buff2)));

    ASSERT_TRUE(cps_api_key_matches(&key2,&key,false)!=0);

    cps_api_key_set(&key2,2,2);
    cps_api_key_set(&key,2,0);

    ASSERT_TRUE(cps_api_key_matches(&key,&key2,false)==0);

    printf("Key 1 %s, Key 2 %s\n",cps_api_key_print(&key,buff1,sizeof(buff1)),
            cps_api_key_print(&key2,buff2,sizeof(buff2)));

    memset(&key2,0,sizeof(key2));
    cps_api_key_copy(&key2,&key);

    ASSERT_TRUE(cps_api_key_matches(&key,&key2,true)==0);

    printf("Final\nKey 1 %s, Key 2 %s\n",cps_api_key_print(&key,buff1,sizeof(buff1)),
            cps_api_key_print(&key2,buff2,sizeof(buff2)));
}