美文网首页
presto(一)——cli之命令行解析

presto(一)——cli之命令行解析

作者: hello高world | 来源:发表于2017-02-12 22:28 被阅读0次

1、官网给出的启动CLI

presto-cli/target/presto-cli-*-executable.jar

肯定有main方法,于是我们去找presto-cil项目中的main方法。

有两个类有main方法

应该是Presto.java中的那个。

public static void main(String[] args)
            throws Exception
    {
        //利用airline在做cli命令行的解析
        Console console = singleCommand(Console.class).parse(args);

        //如果命令行中的可选项为:--help或者version则跳过
        if (console.helpOption.showHelpIfRequested() ||
                console.versionOption.showVersionIfRequested()) {
            return;
        }

        //启动执行cli
        console.run();
    }

2、airline命令行解析框架

import io.airlift.airline.Command;
import io.airlift.airline.HelpOption;
import io.airlift.airline.Option;
import io.airlift.airline.SingleCommand;

import javax.inject.Inject;

/**
 * Created by gsd on 2017/2/12.
 */
@Command(name = "ping", description = "network test utility")
public class Ping
{
    @Inject
    public HelpOption helpOption;
  // preso就是这么弄的,只不过他封装在ClientOptions类中
    @Option(name = "--server", title = "server", description = "Presto server location (default: localhost:8080)")
    public String server = "localhost:8080";
    @Option(name = {"-c", "--count"}, description = "Send count packets")
    public int count = 1;

    public static void main(String... args)
    {
        Ping ping = SingleCommand.singleCommand(Ping.class).parse(args);
        if (ping.helpOption.showHelpIfRequested()) {
            return;
        }
        ping.run();
    }

    public void run()
    {
        System.out.println("Ping count: " + count);
    }
}

执行: java --help


把presto的cli说明打印部分出来

重要还是run方法

3、presto cli console中的run方法

 public void run()
    {
        //建立连接,通过--server参数来识别127.0.0.1:8080,
        // 如果没有端口号默认会给你80。如下是我们经常敲入的
        // ./presto-cli --server 127.0.0.1:8080 --catalog hive --schema default
        ClientSession session = clientOptions.toClientSession();
        KerberosConfig kerberosConfig = clientOptions.toKerberosConfig();
        //是否带有执行语句
        boolean hasQuery = !Strings.isNullOrEmpty(clientOptions.execute);
        //是否来自文件
        boolean isFromFile = !Strings.isNullOrEmpty(clientOptions.file);

        //既不带有执行语句也不来自文件,对输出流支持ANSI sequences.
        if (!hasQuery && !isFromFile) {
            AnsiConsole.systemInstall();
        }

        //初始化日志
        initializeLogging(clientOptions.logLevelsFile);

        String query = clientOptions.execute;
        //如果带有查询语句
        if (hasQuery) {
            query += ";";
        }
        //如果来自文件
        if (isFromFile) {
            //如果带有查询语句,则抛出异常
            if (hasQuery) {
                throw new RuntimeException("both --execute and --file specified");
            }
            try {
                query = Files.toString(new File(clientOptions.file), UTF_8);
                hasQuery = true;
            }
            catch (IOException e) {
                throw new RuntimeException(format("Error reading from file %s: %s", clientOptions.file, e.getMessage()));
            }
        }

        //默认是false
        AtomicBoolean exiting = new AtomicBoolean();
        //启动一个线程,如果出现异常,则中断主线程
        interruptThreadOnExit(Thread.currentThread(), exiting);

        try (QueryRunner queryRunner = QueryRunner.create(
                session,
                Optional.ofNullable(clientOptions.socksProxy),
                Optional.ofNullable(clientOptions.keystorePath),
                Optional.ofNullable(clientOptions.keystorePassword),
                Optional.ofNullable(clientOptions.truststorePath),
                Optional.ofNullable(clientOptions.truststorePassword),
                Optional.ofNullable(clientOptions.krb5Principal),
                Optional.ofNullable(clientOptions.krb5RemoteServiceName),
                clientOptions.authenticationEnabled,
                kerberosConfig)) {
            if (hasQuery) {
                //执行完语句并退出
                executeCommand(queryRunner, query, clientOptions.outputFormat);
            }
            else {
                //阻塞等待命令行sql语句输入
                runConsole(queryRunner, session, exiting);
            }
        }
    }

4、下一个博文,执行语句。

将基于:executeCommand(queryRunner, query, clientOptions.outputFormat);

相关文章

  • presto(一)——cli之命令行解析

    1、官网给出的启动CLI presto-cli/target/presto-cli-*-executable.ja...

  • 目录

    基于presto0.155,以一条主线 : cli查询presto+hive返回 一、cli与presto通信机制...

  • Presto参考

    0.zepplin中使用presto 1.presto正则表达式 2.解析json 3.presto时间 4.pr...

  • Cordova教程

    Cordova概述Cordova开发前的准备工作使用Cordova命令行界面(CLI)Cordova应用解析Cor...

  • Click

    CLI是“命令行界面”@click.command() 装饰一个函数,就能使之成为命令行@click.option...

  • 浏览器相关流程及优化

    组成 渲染引擎: Trident, Gecko, Presto, Webkit, Blink 流程 **DNS解析...

  • presto(三)——客户端http请求

    接上一篇文章 presto——词法解析process(queryRunner, split.statement()...

  • Squoosh-cli的代码解析

    cli是libsquoosh的命令行工具,可以直接在命令行中直接运行。 Cli的核心流程分析 cli使用comma...

  • 初识终端

    CLI CLI: command line interface 命令行接口,是一个文本命令行界面,只接受文本输入,...

  • Golang下的flag模块使用

    flag模块主要用来解析命令行的参数 一个比较好的第三方模块 cli 常用函数如下: 示例:

网友评论

      本文标题:presto(一)——cli之命令行解析

      本文链接:https://www.haomeiwen.com/subject/eoaaittx.html