Fairport  v1.0.38
fairport/ndb/database_iface.h
Go to the documentation of this file.
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