ob为什么同时存在两种迭代接口的代码

(cell接口、row接口)

oceanbase的早期版本类似于一个key-value no sql 系统,所以采用的是cell接口,读写是以cell为基本单位。

oceanbase0.4以及后续的版本,才真正可以称作一个数据库,所以cell接口已经不适应当前的设计,所以就采用了row接口,以row为迭代的基本单位。

这也是现在在oceanbase代码中有两套接口并存的原因,以后cell接口会逐渐废弃。

1.cell
struct ObCellInfo
{//完整版
ObString table_name_; //table name
uint64_t table_id_; //table id
ObRowkey row_key_; //rowkey
uint64_t column_id_; //column id
ObString column_name_; //column name
ObObj value_; //value
};

struct ObInnerCellInfo
{//简化版
  uint64_t table_id_;
  ObRowkey row_key_;
  uint64_t column_id_;
  ObObj value_;
};

2.row
class ObRow
{
ObRowkey rowkey_; //rowkey
ObRawRow raw_row_; //row的实际存储数组
const ObRowDesc* row_desc_; //row描述符(table_id,column_id到实际存储数组位置的映射)
}

class ObRowkey
{
    ObObj* obj_ptr_;          //指向rowkey列在raw_row_ array的起始位置
    int64_t obj_cnt_;         //rowkey列的列数
}

class ObRawRow
{
    ObObj cells_[MAX_COLUMNS_COUNT]; //row obj存储array
    int16_t cells_count_; //rowkey cell count
}

class ObRowDesc
{
    Desc cells_desc_[MAX_COLUMNS_COUNT]; //(table_id,column_id)
    int64_t cells_desc_count_; //desc count
    PlacementHashMap<Desc, int64_t> hash_map_; //(table_id, column_id)到存储位置的映射
    int64_t rowkey_cell_count_; //rowkey cell count
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章