DdengxuyueMisc bugfixes
3d79c591创建于 2021年3月6日历史提交
/*
 * Copyright (c) 2020 Huawei Technologies Co.,Ltd.
 *
 * openGauss is licensed under Mulan PSL v2.
 * You can use this software according to the terms and conditions of the Mulan PSL v2.
 * You may obtain a copy of Mulan PSL v2 at:
 *
 *          http://license.coscl.org.cn/MulanPSL2
 *
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 * See the Mulan PSL v2 for more details.
 * ---------------------------------------------------------------------------------------
 *
 * build_query.cpp
 *      functions used by cm_ctl and gs_ctl to display build progress
 *
 * Portions Copyright (c) 2012-2015, Huawei Tech. Co., Ltd.
 * Portions Copyright (c) 2010-2012, Postgres-XC Development Group
 * Portions Copyright (c) 1996-2011, PostgreSQL Global Development Group
 *
 * IDENTIFICATION
 *        src/lib/build_query/build_query.cpp
 *
 * ---------------------------------------------------------------------------------------
 */

#include "common/build_query/build_query.h"
#include "securec.h"
#include "securec_check.h"

/*
 * strdup() replacements that prints an error and exits
 * if something goes wrong. Can never return NULL.
 */
static char* xstrdup(const char* s)
{
    char* result = NULL;

    result = strdup(s);
    if (result == NULL) {
        printf("out of memory\n");
        exit(1);
    }
    return result;
}

char* show_estimated_time(int estimated_time)
{
    char time_string[MAXPGPATH] = {0};
    int hour = 0;
    int min = 0;
    int sec = 0;
    int nRet = 0;

    if (estimated_time == -1)
        return xstrdup("--:--:--");

    hour = estimated_time / S_PER_H;
    min = (estimated_time % S_PER_H) / S_PER_MIN;
    sec = (estimated_time % S_PER_H) % S_PER_MIN;

    nRet = snprintf_s(time_string, MAXPGPATH, MAXPGPATH - 1, "%.2d:%.2d:%.2d", hour, min, sec);
    securec_check_ss_c(nRet, "\0", "\0");

    return xstrdup(time_string);
}

char* show_datasize(uint64 size)
{
    char size_string[MAXPGPATH] = {0};
    float showsize = 0;
    const char* unit = NULL;
    int nRet = 0;

    if (size / KB_PER_TB != 0) {
        showsize = (float)size / KB_PER_TB;
        unit = "TB";
    } else if (size / KB_PER_GB != 0) {
        showsize = (float)size / KB_PER_GB;
        unit = "GB";
    } else if (size / KB_PER_MB != 0) {
        showsize = (float)size / KB_PER_MB;
        unit = "MB";
    } else {
        showsize = (float)size;
        unit = "kB";
    }

    nRet = snprintf_s(size_string, MAXPGPATH, MAXPGPATH - 1, "%.2f%s", showsize, unit);
    securec_check_ss_c(nRet, "\0", "\0");

    return xstrdup(size_string);
}

void UpdateDBStateFile(char* path, GaussState* state)
{
    FILE* statef = NULL;
    char temppath[MAXPGPATH] = {0};
    int ret;

    if (NULL == state || path == NULL) {
        return;
    }

    ret = snprintf_s(temppath, MAXPGPATH, MAXPGPATH - 1, "%s.temp", path);
    securec_check_ss_c(ret, "\0", "\0");

    canonicalize_path(path);
    statef = fopen(temppath, "w");
    if (statef == NULL) {
        return;
    }
    if (chmod(temppath, S_IRUSR | S_IWUSR) == -1) {
        /* Close file and Nullify the pointer for retry */
        fclose(statef);
        statef = NULL;
        return;
    }
    if (0 == (fwrite(state, 1, sizeof(GaussState), statef))) {
        fclose(statef);
        statef = NULL;
        return;
    }
    fclose(statef);

    (void)rename(temppath, path);
}