Fairport
v1.0.38
|
00001 00002 00003 00004 00005 00006 00007 00008 00009 #ifndef FAIRPORT_NDB_DATABASE_IFACE_H 00010 #define FAIRPORT_NDB_DATABASE_IFACE_H 00011 00012 #include <memory> 00013 #ifdef __GNUC__ 00014 #include <tr1/memory> 00015 #endif 00016 00017 #include "fairport/util/util.h" 00018 #include "fairport/util/primitives.h" 00019 00020 namespace fairport 00021 { 00022 00023 class node; 00024 00030 struct block_info 00031 { 00032 block_id id; 00033 ulonglong address; 00034 ushort size; 00035 ushort ref_count; 00036 }; 00037 00041 struct page_info 00042 { 00043 page_id id; 00044 ulonglong address; 00045 }; 00046 00049 struct node_info 00050 { 00051 node_id id; 00052 block_id data_bid; 00053 block_id sub_bid; 00054 node_id parent_id; 00055 }; 00056 00059 struct subnode_info 00060 { 00061 node_id id; 00062 block_id data_bid; 00063 block_id sub_bid; 00064 }; 00065 00066 template<typename K, typename V> 00067 class bt_page; 00068 typedef bt_page<node_id, node_info> nbt_page; 00069 typedef bt_page<block_id, block_info> bbt_page; 00070 00071 template<typename K, typename V> 00072 class bt_nonleaf_page; 00073 typedef bt_nonleaf_page<node_id, node_info> nbt_nonleaf_page; 00074 typedef bt_nonleaf_page<block_id, block_info> bbt_nonleaf_page; 00075 00076 template<typename K, typename V> 00077 class bt_leaf_page; 00078 typedef bt_leaf_page<node_id, node_info> nbt_leaf_page; 00079 typedef bt_leaf_page<block_id, block_info> bbt_leaf_page; 00080 00081 template<typename K, typename V> 00082 class const_btree_node_iter; 00083 00085 00086 typedef const_btree_node_iter<node_id, node_info> const_nodeinfo_iterator; 00087 typedef const_btree_node_iter<node_id, subnode_info> const_subnodeinfo_iterator; 00088 typedef const_btree_node_iter<block_id, block_info> const_blockinfo_iterator; 00090 00091 class block; 00092 class data_block; 00093 class extended_block; 00094 class external_block; 00095 class subnode_block; 00096 class subnode_leaf_block; 00097 class subnode_nonleaf_block; 00098 00099 class db_context; 00100 00102 00103 typedef std::tr1::shared_ptr<db_context> shared_db_ptr; 00104 typedef std::tr1::weak_ptr<db_context> weak_db_ptr; 00106 00109 00118 class db_context : public std::tr1::enable_shared_from_this<db_context> 00119 { 00120 public: 00121 virtual ~db_context() { } 00122 00125 virtual bool is_pst() const = 0; 00126 00128 00129 00130 00131 00132 00133 virtual node lookup_node(node_id nid) = 0; 00138 virtual node_info lookup_node_info(node_id nid) = 0; 00143 virtual block_info lookup_block_info(block_id bid) = 0; 00145 00147 00148 00149 00150 00151 00152 00153 00154 virtual std::tr1::shared_ptr<bbt_page> read_bbt_root() = 0; 00161 virtual std::tr1::shared_ptr<nbt_page> read_nbt_root() = 0; 00168 virtual std::tr1::shared_ptr<bbt_page> read_bbt_page(const page_info& pi) = 0; 00176 virtual std::tr1::shared_ptr<nbt_page> read_nbt_page(const page_info& pi) = 0; 00184 virtual std::tr1::shared_ptr<nbt_leaf_page> read_nbt_leaf_page(const page_info& pi) = 0; 00192 virtual std::tr1::shared_ptr<bbt_leaf_page> read_bbt_leaf_page(const page_info& pi) = 0; 00200 virtual std::tr1::shared_ptr<nbt_nonleaf_page> read_nbt_nonleaf_page(const page_info& pi) = 0; 00208 virtual std::tr1::shared_ptr<bbt_nonleaf_page> read_bbt_nonleaf_page(const page_info& pi) = 0; 00210 00212 00213 00214 00215 00216 00217 00218 00219 std::tr1::shared_ptr<block> read_block(block_id bid) { return read_block(shared_from_this(), bid); } 00226 std::tr1::shared_ptr<data_block> read_data_block(block_id bid) { return read_data_block(shared_from_this(), bid); } 00233 std::tr1::shared_ptr<extended_block> read_extended_block(block_id bid) { return read_extended_block(shared_from_this(), bid); } 00240 std::tr1::shared_ptr<external_block> read_external_block(block_id bid) { return read_external_block(shared_from_this(), bid); } 00247 std::tr1::shared_ptr<subnode_block> read_subnode_block(block_id bid) { return read_subnode_block(shared_from_this(), bid); } 00254 std::tr1::shared_ptr<subnode_leaf_block> read_subnode_leaf_block(block_id bid) { return read_subnode_leaf_block(shared_from_this(), bid); } 00261 std::tr1::shared_ptr<subnode_nonleaf_block> read_subnode_nonleaf_block(block_id bid) { return read_subnode_nonleaf_block(shared_from_this(), bid); } 00269 virtual std::tr1::shared_ptr<block> read_block(const shared_db_ptr& parent, block_id bid) = 0; 00277 virtual std::tr1::shared_ptr<data_block> read_data_block(const shared_db_ptr& parent, block_id bid) = 0; 00285 virtual std::tr1::shared_ptr<extended_block> read_extended_block(const shared_db_ptr& parent, block_id bid) = 0; 00293 virtual std::tr1::shared_ptr<external_block> read_external_block(const shared_db_ptr& parent, block_id bid) = 0; 00301 virtual std::tr1::shared_ptr<subnode_block> read_subnode_block(const shared_db_ptr& parent, block_id bid) = 0; 00309 virtual std::tr1::shared_ptr<subnode_leaf_block> read_subnode_leaf_block(const shared_db_ptr& parent, block_id bid) = 0; 00317 virtual std::tr1::shared_ptr<subnode_nonleaf_block> read_subnode_nonleaf_block(const shared_db_ptr& parent, block_id bid) = 0; 00318 00325 std::tr1::shared_ptr<block> read_block(const block_info& bi) { return read_block(shared_from_this(), bi); } 00332 std::tr1::shared_ptr<data_block> read_data_block(const block_info& bi) { return read_data_block(shared_from_this(), bi); } 00339 std::tr1::shared_ptr<extended_block> read_extended_block(const block_info& bi) { return read_extended_block(shared_from_this(), bi); } 00346 std::tr1::shared_ptr<external_block> read_external_block(const block_info& bi) { return read_external_block(shared_from_this(), bi); } 00353 std::tr1::shared_ptr<subnode_block> read_subnode_block(const block_info& bi) { return read_subnode_block(shared_from_this(), bi); } 00360 std::tr1::shared_ptr<subnode_leaf_block> read_subnode_leaf_block(const block_info& bi) { return read_subnode_leaf_block(shared_from_this(), bi); } 00367 std::tr1::shared_ptr<subnode_nonleaf_block> read_subnode_nonleaf_block(const block_info& bi) { return read_subnode_nonleaf_block(shared_from_this(), bi); } 00375 virtual std::tr1::shared_ptr<block> read_block(const shared_db_ptr& parent, const block_info& bi) = 0; 00383 virtual std::tr1::shared_ptr<data_block> read_data_block(const shared_db_ptr& parent, const block_info& bi) = 0; 00391 virtual std::tr1::shared_ptr<extended_block> read_extended_block(const shared_db_ptr& parent, const block_info& bi) = 0; 00399 virtual std::tr1::shared_ptr<external_block> read_external_block(const shared_db_ptr& parent, const block_info& bi) = 0; 00407 virtual std::tr1::shared_ptr<subnode_block> read_subnode_block(const shared_db_ptr& parent, const block_info& bi) = 0; 00415 virtual std::tr1::shared_ptr<subnode_leaf_block> read_subnode_leaf_block(const shared_db_ptr& parent, const block_info& bi) = 0; 00423 virtual std::tr1::shared_ptr<subnode_nonleaf_block> read_subnode_nonleaf_block(const shared_db_ptr& parent, const block_info& bi) = 0; 00425 }; 00426 00427 } 00428 00429 #endif 00430