Mycat源码阅读(五)执行sql及存储过程

在FrontendAuthenticator类的handle方法中,定义了对jdbc握手回应消息的处理和验证。
当验证成功,将handler赋值为FrontendCommandHandler,用于对sql语句的分发处理。

@Override
public void handle(byte[] data)
{
    if(source.getLoadDataInfileHandler()!=null&&source.getLoadDataInfileHandler().isStartLoadData())
    {
        MySQLMessage mm = new MySQLMessage(data);
        int packetLength = mm.readUB3();
        if(packetLength+4==data.length)
        {
            source.loadDataInfileData(data);
        }
        return;
    }
    switch (data[4])
    {
        case MySQLPacket.COM_INIT_DB:
            commands.doInitDB();
            source.initDB(data);
            break;
        case MySQLPacket.COM_QUERY:
            commands.doQuery();
            source.query(data);
            break;
        case MySQLPacket.COM_PING:
            commands.doPing();
            source.ping();
            break;
        case MySQLPacket.COM_QUIT:
            commands.doQuit();
            source.close("quit cmd");
            break;
        case MySQLPacket.COM_PROCESS_KILL:
            commands.doKill();
            source.kill(data);
            break;
        case MySQLPacket.COM_STMT_PREPARE:
            commands.doStmtPrepare();
            source.stmtPrepare(data);
            break;
        case MySQLPacket.COM_STMT_SEND_LONG_DATA:
        	commands.doStmtSendLongData();
        	source.stmtSendLongData(data);
        	break;
        case MySQLPacket.COM_STMT_RESET:
        	commands.doStmtReset();
        	source.stmtReset(data);
        	break;
        case MySQLPacket.COM_STMT_EXECUTE:
            commands.doStmtExecute();
            source.stmtExecute(data);
            break;
        case MySQLPacket.COM_STMT_CLOSE:
            commands.doStmtClose();
            source.stmtClose(data);
            break;
        case MySQLPacket.COM_HEARTBEAT:
            commands.doHeartbeat();
            source.heartbeat(data);
            break;
        default:
                 commands.doOther();
                 source.writeErrMessage(ErrorCode.ER_UNKNOWN_COM_ERROR,
                         "Unknown command");

    }
}

查看query方法,将byte数组提取出sql

/**
 * [简要描述]:二进制数组 解析成 SQL</br>
 * [详细描述]</br>
 * [作者]:zhaog(2019510)</br>
 * @param data
 */
public void query(byte[] data) {
	
	// 取得语句
	String sql = null;		
	try {
		MySQLMessage mm = new MySQLMessage(data);
		mm.position(5);
		sql = mm.readString(charset);
	} catch (UnsupportedEncodingException e) {
		writeErrMessage(ErrorCode.ER_UNKNOWN_CHARACTER_SET, "Unknown charset '" + charset + "'");
		return;
	}		
	
	this.query( sql );
}

一直追溯下去,会发现SQL记录、防火墙策略(sql黑名单/注入攻击)、DML权限检查等
当追溯到ServerConnection的execute(String sql, int type)方法时,就是便是执行sql的操作了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值