- 行的update核心函数是MOTAdaptor::UpdateRow(MOTFdwStateSt* fdwState, TupleTableSlot* slot, MOT::Row* currRow)方法.今天针对这个函数及相关函数细节展开介绍
函数的三个参数
- MOTFdwStateSt:也就是结构体MOTFdwState_St,它的成员包括有关engine的信息,如TxnManager,table, AccessType等.还有TransactionId,CmdType,AttrNumber,m_attrsUsed,m_attrsModified等信息
- TupleTableSlot:结构体,执行器用来保存tuple的数据结构.包括了slot的描述器,tuple的buffer等信息,每个属性值(Datum* tts_values)以及每个属性为null的flags( bool* tts_isnull).
- currRow:当前更新的Row
函数的执行过程
- 通过fdwState的事务管理者(TxnManager)设置事务ID,并更新行状态(UpdateLastRowState方法)为WR
- 通过curRow的GetData方法获取行数据(uint8_t* rowData)
- 调用PackUpdateRow(slot, fdwState->m_table, fdwState->m_attrsModified, rowData)
1)先定义一个tuple描述器tupdesc(slot->tts_tupleDescriptor)
2) uint8_t* bits=数据地址+偏移量,包括空位的列数cols(table->GetFieldCount() - 1)
3)对每个列:先BITMAP_GET(attrs_used, i), 判断i列的attrs是否为修改,没有修改则直接跳过.修改的话,获取这个列的值,然后调用col的pack方法将值memcpy到rowData. - 新建一个MOT::BitmapSet():modified_column(fdwState->m_attrsModified, fdwState->m_table->GetFieldCount() - 1)
- 最后调用TxnManager的overrite方法,实际的更新重新在上面已经完成了,这里只是更新一下状态
以上就是今天看的源码内容~
明天针对update,设计protobuf的报文
网友评论