int save_log_checkpoint()

in Sources/aliyun-log-c-sdk/log_persistent_manager.c [56:101]


int save_log_checkpoint(log_persistent_manager * manager)
{
    log_persistent_checkpoint * checkpoint = &(manager->checkpoint);
    checkpoint->check_sum = checkpoint->start_log_uuid + checkpoint->now_log_uuid +
            checkpoint->start_file_offset + checkpoint->now_file_offset;
    if (manager->checkpoint_file_size >= MAX_CHECKPOINT_FILE_SIZE)
    {
        if (manager->checkpoint_file_ptr != NULL)
        {
            fclose(manager->checkpoint_file_ptr);
            manager->checkpoint_file_ptr = NULL;
        }
        char tmpFilePath[256];
        strcpy(tmpFilePath, manager->checkpoint_file_path);
        strcat(tmpFilePath, ".bak");
        aos_info_log("start switch checkpoint index file %s \n", manager->checkpoint_file_path);
        FILE * tmpFile = fopen(tmpFilePath, "wb+");
        if (tmpFile == NULL)
            return -1;
        if (1 !=
            fwrite((const void *)(&manager->checkpoint), sizeof(log_persistent_checkpoint), 1, tmpFile))
        {
            fclose(tmpFile);
            return -2;
        }
        if (fclose(tmpFile) != 0)
            return -3;
        if (rename(tmpFilePath, manager->checkpoint_file_path) != 0 )
            return -4;
        manager->checkpoint_file_size = sizeof(log_persistent_checkpoint);
        return 0;
    }
    if (manager->checkpoint_file_ptr == NULL)
    {
        manager->checkpoint_file_ptr = fopen(manager->checkpoint_file_path, "ab+");
        if (manager->checkpoint_file_ptr == NULL)
            return -5;
    }
    if (1 !=
        fwrite((const void *)(&manager->checkpoint), sizeof(log_persistent_checkpoint), 1, manager->checkpoint_file_ptr))
        return -6;
    if (fflush(manager->checkpoint_file_ptr) != 0)
        return -7;
    manager->checkpoint_file_size += sizeof(log_persistent_checkpoint);
    return 0;
}