6 * La estructura general del archivo seria :
7 * +----------+----------+----------+-----+----------+
8 * |FileHeader| Bloque 0 | Bloque 1 | ... | Bloque N |
9 * +----------+----------+----------+-----+----------+
11 * Cada bloque tiene su propio encabezado siguiendo la siguiente
13 * +--------------+-----------------------------------+
14 * | BloqueHeader | Area de Claves |
15 * +--------------+-----------------------------------+
17 * El area de claves depende del tipo de arbol (INDICE o EXAHUSTIVO)
18 * y del tipo de clave (Longitud fija o variable).
20 * Los nodos que "hojas" (es decir, aquellos que no tienen hijos) no
21 * tienen "punteros", por lo que el area de datos seria algo como :
22 * +--------------+--------------+--------------+--------------+
23 * | clave1,dato1 | clave2,dato2 | ............ | claveN,datoN |
24 * +--------------+--------------+--------------+--------------+
26 * Ahora, los bloques intermedios tienen punteros a los hijos, y
27 * quedaria algo como :
28 * +---------+----------------------+-------+----------------------+
29 * | HijoIzq | clave1,dato1,HijoDer | ..... | claveN,datoN,HijoDer |
30 * +---------+----------------------+-------+----------------------+
32 * El tamaño de la clave es variable, por lo que la cantidad de claves
33 * que puede almacenar se basa en la cantidad de espacio libre.
35 * Para saber si hay que romper en dos un nodo, se debe ver si la clave
36 * a agregar entra en el espacio libre del nodo encontrado como "lugar
37 * de insercion". Ahora, un problema a resolver es cuando se debe
38 * juntar nodos, ya que el arbol B este es particular (Preguntar a Cerveto?).
42 * * Ver como manejar las claves de manera transparente a las APIs de
43 * agregar y de borrar (EMUFS lo solucionaba bastante bien, se puede
44 * tomar una idea simimar)
52 #include "clave_fija.h"
53 #include "clave_variable.h"
54 #include "btree_data.h"
56 /* alias para codear menos :) */
58 /** Encabezado del archivo BTree
60 * Esta estructura es para comodidad de manejo, aunque en disco
61 * ocupe block_size de tamaño.
63 struct BTreeFileHeader {
67 /** Encabezado de un bloque */
68 struct BTreeNodeHeader {
69 /** Indica a que nivel corresponde un bloque
71 * nivel == 0 : una hoja
72 * nivel != 0 : nodo intermedio
76 /** Espacio libre en el bloque
78 * El nodo empieza con free_space = block_size - sizeof (BTreeHeader)
80 unsigned int free_space;
82 /** Cantidad de elementos en el nodo */
83 unsigned int item_count;
86 /** Modelo del árbol B
88 * \param filename Nombre del archivo a crear
89 * \param block_size Tamaño de bloque a utilizar
90 * \param k_t Tipo de clave a utilizar
91 * \return Un nuevo arbol B creado o NULL en caso de error
95 BTree (const std::string &filename, unsigned int block_size, int k_t = KEY_FIXED, bool create_new_file = false);
98 /** Tipos de clave a usar */
104 /** Agrega una nueva clave al árbol. */
105 void AddKey (const Clave &k);
106 /** Elimina una clave del árbol. */
107 void DelKey (const Clave &k);
108 /** Busca si existe una clave en el árbol
110 * \TODO : Deberia retornar algun tipo de dato
112 bool FindKey (const Clave &k);
115 Clave* AddKeyR (const Clave *k, uint node_num, uint &left_child, uint &right_child);
116 Clave* AddKeyOtherR (const Clave *k, uint node_num, uint &left_child, uint &right_child);
117 Clave* AddKeyLeafR (const Clave *k, uint node_num, uint &left_child, uint &right_child);
118 bool FindKeyR (const Clave *k, uint node);
120 void WriteFileHeader ();
122 void WriteBlock (uchar *block, uint num);
123 uchar *ReadBlock (uint num);
124 uchar *NewBlock (uint &num);
126 void ReadNodoHeader (uchar *node, BTreeNodeHeader *header);
127 void WriteNodoHeader (uchar *node, BTreeNodeHeader *header);
129 std::list<BTreeData *> ReadKeys (uchar *node, BTreeNodeHeader &node_header);
130 void WriteKeys (uchar *node, BTreeNodeHeader &node_header, std::list<BTreeData *> &keys);
132 void DeleteKeys (std::list<BTreeData *> &keys);
134 std::string filename;
135 BTreeFileHeader header;
138 /** Apunta al archivo de datos, asi se abre solo 1 vez
140 * \TODO Ver si vale la pena
146 void PrintNode (uint num);