我去,今天读了一下ob的源码,感觉有点乱啊!!!好吧,当作练手,我重构了一个函数

void* ObMySQLCallback::decode(easy_message_t* m)
{
uint32_t pkt_len = ;
uint8_t pkt_seq = ;
uint8_t pkt_type = ;
ObMySQLCommandPacket* packet = NULL;
char* buffer = NULL;
int32_t len = ; if (NULL == m)
{
TBSYS_LOG(ERROR, "invalid argument m is %p", m);
}
else if (NULL == m->input)
{
TBSYS_LOG(ERROR, "invalide argument m->input is %p", m->input);
}
else
{
if ((len = static_cast<int32_t>(m->input->last - m->input->pos)) >= OB_MYSQL_PACKET_HEADER_SIZE)
{
//1. decode length from net buffer
//2. decode seq from net buffer
ObMySQLUtil::get_uint3(m->input->pos, pkt_len);
ObMySQLUtil::get_uint1(m->input->pos, pkt_seq); //message has enough buffer
if (pkt_len <= m->input->last - m->input->pos)
{
ObMySQLUtil::get_uint1(m->input->pos, pkt_type);
//利用message带的pool进行应用层内存的分配
buffer = reinterpret_cast<char*>(easy_pool_alloc(m->pool,
static_cast<uint32_t>(sizeof(ObMySQLCommandPacket) + pkt_len)));
if (NULL == buffer)
{
TBSYS_LOG(ERROR, "alloc packet buffer(length=%lu) from m->pool failed", sizeof(ObMySQLCommandPacket) + pkt_len);
}
else
{
TBSYS_LOG(DEBUG, "alloc packet buffer length = %lu", sizeof(ObMySQLCommandPacket) + pkt_len);
packet = new(buffer)ObMySQLCommandPacket();
packet->set_header(pkt_len, pkt_seq);
packet->set_type(pkt_type);
packet->set_receive_ts(tbsys::CTimeUtil::getTime());
memcpy(buffer + sizeof(ObMySQLCommandPacket), m->input->pos, pkt_len - );
packet->get_command().assign(buffer + sizeof(ObMySQLCommandPacket), pkt_len - );
TBSYS_LOG(DEBUG, "decode comand packet command is \"%.*s\"", packet->get_command().length(),
packet->get_command().ptr());
if (PACKET_RECORDER_FLAG)
{
// record the packet to FIFO stream if required
ObMySQLServer* server = reinterpret_cast<ObMySQLServer*>(m->c->handler->user_data);
ObMySQLCommandPacketRecord record;
record.socket_fd_ = m->c->fd;
record.cseq_ = m->c->seq;
record.addr_ = m->c->addr;
record.pkt_length_ = pkt_len;
record.pkt_seq_ = pkt_seq;
record.cmd_type_ = pkt_type;
struct iovec buffers[];
buffers[].iov_base = &record;
buffers[].iov_len = sizeof(record);
buffers[].iov_base = m->input->pos;
buffers[].iov_len = pkt_len - ;
int err = OB_SUCCESS;
if (OB_SUCCESS != (err = server->get_packet_recorder().push(buffers, )))
{ TBSYS_LOG(WARN, "failed to record MySQL packet, err=%d", err);
}
}
m->input->pos += pkt_len - ;
}
}
else
{
m->next_read_len = static_cast<int>(pkt_len - (m->input->last - m->input->pos));
TBSYS_LOG(DEBUG, "not enough data in message, packet length = %u, data in message is %ld",
pkt_len, m->input->last - m->input->pos);
m->input->pos -= OB_MYSQL_PACKET_HEADER_SIZE;
}
}
}
return packet;
}

问题:代码好长。。。嵌套太深。。。

ObMySQLCommandPacket* ObMySQLCallback::make_packet(easy_message_t* m, uint32_t *pkt_len, uint8_t *pkt_seq, uint8_t *pkt_type)
{
ObMySQLUtil::get_uint1(m->input->pos, *pkt_type);
//利用message带的pool进行应用层内存的分配
char* buffer = reinterpret_cast<char*>(easy_pool_alloc(m->pool,
static_cast<uint32_t>(sizeof(ObMySQLCommandPacket) + *pkt_len))); if (NULL == buffer)
{
TBSYS_LOG(ERROR, "alloc packet buffer(length=%lu) from m->pool failed", sizeof(ObMySQLCommandPacket) + *pkt_len);
return NULL;
} TBSYS_LOG(DEBUG, "alloc packet buffer length = %lu", sizeof(ObMySQLCommandPacket) + *pkt_len);
ObMySQLCommandPacket* packet = new(buffer)ObMySQLCommandPacket();
packet->set_header(*pkt_len, *pkt_seq);
packet->set_type(*pkt_type);
packet->set_receive_ts(tbsys::CTimeUtil::getTime());
memcpy(buffer + sizeof(ObMySQLCommandPacket), m->input->pos, *pkt_len - );
packet->get_command().assign(buffer + sizeof(ObMySQLCommandPacket), *pkt_len - );
TBSYS_LOG(DEBUG, "decode comand packet command is \"%.*s\"", packet->get_command().length(),
packet->get_command().ptr());
return packet;
} void ObMySQLCallback::record_packet(easy_message_t* m, uint32_t *pkt_len, uint8_t *pkt_seq, uint8_t *pkt_type)
{
// record the packet to FIFO stream if required
ObMySQLServer* server = reinterpret_cast<ObMySQLServer*>(m->c->handler->user_data);
ObMySQLCommandPacketRecord record;
record.socket_fd_ = m->c->fd;
record.cseq_ = m->c->seq;
record.addr_ = m->c->addr;
record.pkt_length_ = *pkt_len;
record.pkt_seq_ = *pkt_seq;
record.cmd_type_ = *pkt_type;
struct iovec buffers[];
buffers[].iov_base = &record;
buffers[].iov_len = sizeof(record);
buffers[].iov_base = m->input->pos;
buffers[].iov_len = pkt_len - ;
int err = OB_SUCCESS;
if (OB_SUCCESS != (err = server->get_packet_recorder().push(buffers, )))
{
TBSYS_LOG(WARN, "failed to record MySQL packet, err=%d", err);
}
} void ObMySQLCallback::init_pkt_variables(uint32_t *pkt_len, uint8_t *pkt_seq)
{
//1. decode length from net buffer
//2. decode seq from net buffer ObMySQLUtil::get_uint3(m->input->pos, *pkt_len);
ObMySQLUtil::get_uint1(m->input->pos, *pkt_seq);
} void* ObMySQLCallback::decode(easy_message_t* m)
{
uint32_t pkt_len = , pkt_seq = , pkt_type = ; if (NULL == m || NULL == m->input)
{
TBSYS_LOG(ERROR, "invalid argument m %p", m);
return NULL;
} int32_t msg_buffer_size = static_cast<int32_t>(m->input->last - m->input->pos);
if ( msg_buffer_size < OB_MYSQL_PACKET_HEADER_SIZE)
{
return NULL;
} init_pkt_variables(&pkt_len, &pkt_seq);
if (pkt_len > msg_buffer_size) //message has not enough buffer
{
m->next_read_len = static_cast<int>(pkt_len - msg_buffer_size);
TBSYS_LOG(DEBUG, "not enough data in message, packet length = %u, data in message is %ld",pkt_len, msg_buffer_size);
m->input->pos -= OB_MYSQL_PACKET_HEADER_SIZE;
return NULL;
} ObMySQLCommandPacket* packet = make_packet(m, &pkt_len, &pkt_seq , &pkt_type);
if (PACKET_RECORDER_FLAG)
{
record_packet(m, &pkt_len, &pkt_seq , &pkt_type);
}
m->input->pos += pkt_len - ;
return packet;
}

重构oceanbase的一个函数的更多相关文章

  1. ytu 1050:写一个函数,使给定的一个二维数组(3×3)转置,即行列互换(水题)

    1050: 写一个函数,使给定的一个二维数组(3×3)转置,即行列互换 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 154  Solved: 112[ ...

  2. 假如现在有一堆长度大于3小于9的电话号码,用座机呼叫,如果出现这样的号码【123和12345】那么12345将永远不会被拨出,因为拨到123的时候电话已经呼出了,试写一个函数输出所有不能被呼出的电话号码(java实现)

    解题: 假如现在有一堆长度大于3小于9的电话号码,用座机呼叫,如果出现这样的号码[123和12345]那么12345将永远不会被拨出,因为拨到123的时候电话已经呼出了,试写一个函数输出所有不能被呼出 ...

  3. Java-集合(没做出来)第四题 (List)写一个函数reverseList,该函数能够接受一个List,然后把该List 倒序排列。 例如: List list = new ArrayList(); list.add(“Hello”); list.add(“World”); list.add(“Learn”); //此时list 为Hello World Learn reverseL

    没做出来 第四题 (List)写一个函数reverseList,该函数能够接受一个List,然后把该List 倒序排列. 例如: List list = new ArrayList(); list.a ...

  4. 面试题-->写一个函数,返回一个数组中所有元素被第一个元素除的结果

    package com.rui.test; import java.util.Random; /** * @author poseidon * @version 1.0 * @date:2015年10 ...

  5. PHP很有用的一个函数ignore_user_abort ()

    PHP很有用的一个函数ignore_user_abort () 2013-01-16 14:21:31|  分类: PHP |  标签:php  函数  |举报|字号 订阅     ignore_us ...

  6. php 设置一个函数的最大运行时间

    如何防止一个函数执行时间过长呢?在PHP里可以用pcntl时钟信号+异常来实现 declare(ticks = 1); function a() { sleep(10); echo "a f ...

  7. javascript 在一个函数参数中包含另一个函数的引用

    javascript函数的参数包含另一个函数的情形: <script> //b函数的参数func为另一个函数 function b(a, func) {  alert(a); //调用参数 ...

  8. 给定一个函数rand()能产生0到n-1之间的等概率随机数,问如何产生0到m-1之间等概率的随机数?

    题目:给定一个函数rand()能产生1到n之间的等概率随机数,问如何产生1到m之间等概率的随机数? 先把问题特殊化,例如原题变为给定一个函数rand5(),该函数可以随机生成1-5的整数,且生成概率一 ...

  9. 用JAVA写一个函数,功能例如以下: 随意给定一组数, 找出随意数相加之后的结果为35(随意设定)的情况

    用JAVA写一个函数.功能例如以下:随意给定一组数,比如{12,60,-8,99,15,35,17,18},找出随意数相加之后的结果为35(随意设定)的情况. 能够递归算法来解: package te ...

随机推荐

  1. php判断是不是ajax访问

    <?php // php 判断是否为 ajax 请求 if(isset($_SERVER["HTTP_X_REQUESTED_WITH"]) && strto ...

  2. 不区分大小写的in_array实现 thinkphp框架

    // 不区分大小写的in_array实现 function in_array_case($value,$array) { return in_array(strtolower($value),arra ...

  3. c#基础语言编程-按值类型和引用类型传递参数

    引言 在介绍传递参数介绍前,请明白参数类型和传递方式是不同的.传递方式分为按值类型和引用类型传递参数.参数类型有值类型和引用类型,这个和C++是不同的.这里的传递方式对应c++中的深复制和浅复制. 两 ...

  4. 从客户端(MuliteTextBox2="<a href="http://www....")中检测到有潜在危险的 Request.Form 值

    由于在.net中,Request时出现有HTML或Javascript等字符串时,系统会认为是危险性值.立马报出“从客户端 中检测到有潜在危险的Request.Form值”这样的错.   解决方案一: ...

  5. DSPack各种使用方法

    1. DSPack 2.3.4 安装   一. 下载由于sourceforge最近不能访问,所以可以去 http://www.progdigy.com/ 下载.下载 http://www.progdi ...

  6. android 20 Intnet类重要的成员变量

    Intnet类重要的成员变量: <intent-filter> <action android:name="android.intent.action.MAIN" ...

  7. AlgorithmVisualizer

    http://jasonpark.me/AlgorithmVisualizer/#path=graph_search/floyd_warshall/shortest_paths

  8. Vector/Arraylist与Linklist的区别

        SDK提供了有序集合接口java.util.List的几种实现,其中三种最为人们熟知的是Vector.ArrayList和    LinkedList.有关这些List类的性能差别是一个经常被 ...

  9. 关于javascript dom扩展:Selector API

    众多javascript库中最常用的一项功能,就是根据css选择符选择与某个模式匹配的DOM元素.之前由于对javascript的认识较低,对javascript对DOM操作还停留在getElemen ...

  10. CakePHP之请求与响应对象

    请求与响应对象 请求与响应对象在 CakePHP 2.0 是新增加的.在之前的版本中,这两个对象是由数组表示的,而相关的方法是分散在RequestHandlerComponent,Router,Dis ...