* tomar una idea simimar)
*/
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
+#include <iostream>
+#include <string>
+#include <list>
+#include "common.h"
+#include "clave.h"
+#include "clave_fija.h"
+#include "btree_data.h"
/* alias para codear menos :) */
-typedef unsigned char uchar;
/** Encabezado del archivo BTree */
-typedef struct _btree_file_ {
- unsigned int block_size;
-} BTreeFileHeader;
+struct BTreeFileHeader {
+ uint block_size;
+};
/** Encabezado de un bloque */
-typedef struct _btree_header_ {
+struct BTreeNodeHeader {
/** Indica a que nivel corresponde un bloque
*
* nivel == 0 : una hoja
/** Cantidad de elementos en el nodo */
unsigned int item_count;
-} BTreeHeader;
-
-typedef struct _btree_ {
- char *filename;
- BTreeFileHeader header;
-
- /** Apunta al archivo de datos, asi se abre solo 1 vez
- *
- * \TODO Ver si vale la pena
- */
- FILE *fp;
-} BTree;
+};
/** Crea un nuevo arbol B
*
* \param block_size Tamaño de bloque a utilizar
* \return Un nuevo arbol B creado o NULL en caso de error
*/
-BTree *btree_create (const char *filename, unsigned int block_size);
+class BTree {
+ public:
+ BTree (const std::string &filename, unsigned int block_size, bool create_new_file = false);
+ ~BTree ();
-/** Abre un arbol B existente
- *
- * \param filename Nombre del archivo a abrir
- * \return El arbol abierto o NULL en caso de error
- */
-BTree *btree_open (const char *filename);
+ void AddKey (const Clave &k);
+ void DelKey (const Clave &k);
-/** Agrega una clave en el arbol
- *
- * \TODO Definir parametros
- */
-int btree_add (BTree *);
+ protected:
+ Clave* AddKeyR (const Clave *k, uint node_num, uint &left_child, uint &right_child);
+
+ 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<BTreeData *> ReadKeys (uchar *node, BTreeNodeHeader &node_header);
+ void WriteKeys (uchar *node, BTreeNodeHeader &node_header, std::list<BTreeData *> &keys);
+
+ std::string filename;
+ BTreeFileHeader header;
+
+ /** Apunta al archivo de datos, asi se abre solo 1 vez
+ *
+ * \TODO Ver si vale la pena
+ */
+ FILE *fp;
-/** Borra una clave del arbol
- *
- * \TODO Definir parametros
- */
-int btree_del (BTree *);
-/** Cierra el arbol y libera los recursos */
-int btree_close (BTree *);
+ /* DEBUG */
+ void PrintNode (uint num);
+};
#endif // _B_TREE_H