(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
}