X-Git-Url: https://git.llucax.com/z.facultad/75.52/treemulator.git/blobdiff_plain/78d8bc6c001cb877d8c7daf3868835815a97ce21..ee619d18f5d688c5ea2f630a80a3560de36a99ed:/src/btree.h?ds=sidebyside diff --git a/src/btree.h b/src/btree.h index b001bef..e67c7cf 100644 --- a/src/btree.h +++ b/src/btree.h @@ -50,11 +50,16 @@ #include "common.h" #include "clave.h" #include "clave_fija.h" +#include "clave_variable.h" #include "btree_data.h" /* alias para codear menos :) */ -/** Encabezado del archivo BTree */ +/** Encabezado del archivo BTree + * + * Esta estructura es para comodidad de manejo, aunque en disco + * ocupe block_size de tamaño. + */ struct BTreeFileHeader { uint block_size; }; @@ -78,40 +83,67 @@ struct BTreeNodeHeader { unsigned int item_count; }; -/** Crea un nuevo arbol B +/** Modelo del árbol B * * \param filename Nombre del archivo a crear * \param block_size Tamaño de bloque a utilizar + * \param k_t Tipo de clave a utilizar * \return Un nuevo arbol B creado o NULL en caso de error */ class BTree { public: - BTree (const std::string &filename, unsigned int block_size, bool create_new_file = false); + BTree (const std::string &filename, unsigned int block_size, int k_t = KEY_FIXED, bool create_new_file = false); ~BTree (); + /** Tipos de clave a usar */ + enum { + KEY_FIXED, + KEY_VARIABLE + }; + + /** Agrega una nueva clave al árbol. */ void AddKey (const Clave &k); + /** Elimina una clave del árbol. */ void DelKey (const Clave &k); + /** Busca si existe una clave en el árbol + * + * \TODO : Deberia retornar algun tipo de dato + */ + bool FindKey (const Clave &k); + + protected: + Clave* AddKeyR (const Clave *k, uint node_num, uint &left_child, uint &right_child); + Clave* AddKeyOtherR (const Clave *k, uint node_num, uint &left_child, uint &right_child); + Clave* AddKeyLeafR (const Clave *k, uint node_num, uint &left_child, uint &right_child); + bool FindKeyR (const Clave *k, uint node); - private: void WriteFileHeader (); void WriteBlock (uchar *block, uint num); uchar *ReadBlock (uint num); + uchar *NewBlock (uint &num); void ReadNodoHeader (uchar *node, BTreeNodeHeader *header); void WriteNodoHeader (uchar *node, BTreeNodeHeader *header); - std::list ReadKeys (uchar *node, BTreeNodeHeader &node_header); - void WriteKeys (uchar *node, BTreeNodeHeader &node_header, std::list &keys); + std::list ReadKeys (uchar *node, BTreeNodeHeader &node_header); + void WriteKeys (uchar *node, BTreeNodeHeader &node_header, std::list &keys); + + void DeleteKeys (std::list &keys); std::string filename; BTreeFileHeader header; + int key_type; /** Apunta al archivo de datos, asi se abre solo 1 vez * * \TODO Ver si vale la pena */ FILE *fp; + + + /* DEBUG */ + void PrintNode (uint num); }; #endif // _B_TREE_H