int read_pc_from_file()

in AzureEnhancedMonitor/clib/src/azureperf.c [166:285]


int read_pc_from_file(ap_handler* handler, FILE *fp)
{
    int ret = MATCH_FAILED;
    perf_counter *pc;

    if(handler->len == PERF_COUNT_MAX)
    {
        handler->err = AP_ERR_PC_BUF_OVERFLOW; 
        goto EXIT; 
    }
    pc = &handler->buf[handler->len];

    ret = read_int(fp, &pc->counter_typer);
    if(ret == MATCH_EOF)
    {
        goto EXIT; 
    }
    if(ret != MATCH_SUCCESS)
    {
        set_handler_err(handler, AP_ERR_INVALID_COUNTER_TYPE);
        goto EXIT;
    }

    ret = read_str(fp, pc->type_name, TYPE_NAME_MAX);
    if(ret != MATCH_SUCCESS)
    {
        set_handler_err(handler, AP_ERR_INVALID_TYPE_NAME);
        goto EXIT;
    }

    ret = read_str(fp, pc->property_name, PROPERTY_NAME_MAX);
    if(ret != MATCH_SUCCESS)
    {
        set_handler_err(handler, AP_ERR_INVALID_PROPERTY_NAME);
        goto EXIT;
    }

    ret = read_str(fp, pc->instance_name, INSTANCE_NAME_MAX);
    if(ret != MATCH_SUCCESS)
    {
        set_handler_err(handler, AP_ERR_INVALID_INSTANCE_NAME);
        goto EXIT;
    }
    
    ret = read_int(fp, &pc->is_empty);
    if(ret != MATCH_SUCCESS)
    {
        set_handler_err(handler, AP_ERR_INVALID_IS_EMPTY_FLAG);
        goto EXIT;
    }

    if(!pc->is_empty)
    {
        switch(pc->counter_typer)
        {
            case PERF_COUNTER_TYPE_INT:
               ret = read_int(fp, &pc->val_int);
               break;
            case PERF_COUNTER_TYPE_LARGE:
               ret = read_int64(fp, &pc->val_large);
               break;
            case PERF_COUNTER_TYPE_DOUBLE:
               ret = read_double(fp, &pc->val_double);
               break;
            case PERF_COUNTER_TYPE_STRING:
               ret = read_str(fp, pc->val_str, STRING_VALUE_MAX);
               break;
        }
        if(ret != MATCH_SUCCESS)
        {
            set_handler_err(handler, AP_ERR_INVALID_VALUE);
            goto EXIT;
        }
    }
    else
    {
        ret = read_sperator(fp, NON_STRICT_MATCH);
        if(ret != MATCH_SUCCESS)
        {
            set_handler_err(handler, AP_ERR_INVALID_VALUE);
            goto EXIT;
        }
    }
    
    ret = read_str(fp, pc->unit_name, UNIT_NAME_MAX);
    if(ret != MATCH_SUCCESS)
    {
        set_handler_err(handler, AP_ERR_INVALID_UNIT_NAME);
        goto EXIT;
    }

    ret = read_int(fp, &pc->refresh_interval);
    if(ret != MATCH_SUCCESS)
    {
        set_handler_err(handler, AP_ERR_INVALID_REFRESH_INTERVAL);
        goto EXIT;
    }

    ret = read_int64(fp, &pc->timestamp);
    if(ret != MATCH_SUCCESS)
    {
        set_handler_err(handler, AP_ERR_INVALID_TIMESTAMP);
        goto EXIT;
    }

    ret = read_str(fp, pc->machine_name, MACHINE_NAME_MAX);
    if(ret != MATCH_SUCCESS)
    {
        set_handler_err(handler, AP_ERR_INVALID_MACHINE_NAME);
        goto EXIT;
    }

    handler->len++;

    //Discard line end if exits.
    fscanf(fp, "\n");
    
EXIT:
    return ret;
}