X-Git-Url: https://git.llucax.com/z.facultad/75.52/treemulator.git/blobdiff_plain/8c5f74464a5708bc7f7013f28a408af762344803..HEAD:/src/btree.h?ds=inline diff --git a/src/btree.h b/src/btree.h index 2d9ca6a..9e49213 100644 --- a/src/btree.h +++ b/src/btree.h @@ -82,9 +82,7 @@ * * Para saber si hay que romper en dos un nodo, se debe ver si la clave * a agregar entra en el espacio libre del nodo encontrado como "lugar - * de inserción". Ahora, un problema a resolver es cuando se debe - * juntar nodos, ya que el árbol B este es particular (Preguntar a - * Cerveto?). + * de inserción". * * \section page_model_op Operaciones Básicas * @@ -165,6 +163,23 @@ * al algoritmo de borrado en una hoja. De acá en más todo sigue como fue descripto * en el borrado en una hoja. * + * \subsubsection page_model_problema El problema de la Clave Mayor. + * + * Este es un problema que hemos encontrado en la actual implementación de árbol + * B con claves variables. + * + * Este puede ocurrir únicamente cuando sucede una junta de nodos. Lo que ocurre + * se ejemplifica a continuación. Supongamos por un momento que tenemos dos + * nodos a unir cuya suma de tamaños ocupados es N. Ahora supongamos que la clave + * del padre, que debe ser unida con los nodos es de tamaño M. + * + * Si por algun caso particular de las claves N+M es mayor al tamaño del bloque, + * la junta no podrá ser realizada. + * + * Hemos detectado este problema seguido en árboles con bloques de 128 o 256, y muy + * rara vez en nodos de 512 o superiores, por lo que no hemos tomado medida alguna + * más que documentar su existencia. + * * \subsection page_model_find Búsqueda de una Clave. * * Esta operación se realiza haciendo una búsqueda en profundidad en el árbol. @@ -192,7 +207,11 @@ * ocupe block_size de tamaño. */ struct BTreeFileHeader { + char magic[7]; uint block_size; + int tree_type; + int key_type; + uint block_data_counter; }; /** Encabezado de un bloque */ @@ -232,6 +251,8 @@ struct BTreeFindResult { class BTree { public: BTree (const std::string &filename, unsigned int block_size, int t_t = TYPE_IDENTIFICACION, int k_t = KEY_FIXED, bool create_new_file = false); + BTree (const std::string &filename); + ~BTree (); /** Tipos de clave a usar */ @@ -277,6 +298,7 @@ class BTree { /* Funciones de manejo de archivo */ void WriteFileHeader (); + void ReadFileHeader (); /* Manejo de Bloques */ void WriteBlock (uchar *block, uint num); @@ -298,14 +320,16 @@ class BTree { std::string filename; BTreeFileHeader header; - int key_type; - int tree_type; + + uint GetNextBlockData (); /** Apunta al archivo de datos, asi se abre solo 1 vez * * \todo Ver si vale la pena */ FILE *fp; + std::list deleted_nodes; + std::list deleted_block_data; /* DEBUG */