]> git.llucax.com Git - z.facultad/75.52/treemulator.git/blobdiff - src/btree.h
Agrego clave variable.
[z.facultad/75.52/treemulator.git] / src / btree.h
index 40261fb1aa70d241c3f26036cfc1930e70016d89..a67fa4c4b9d1e086458f80e2cd367869411f448d 100644 (file)
@@ -1,5 +1,5 @@
 
-#ifdef _B_TREE_H
+#ifndef _B_TREE_H
 #define _B_TREE_H
 
 /**
  *    tomar una idea simimar)
  */
 
+#include <iostream>
+#include <string>
+#include <list>
+#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 */
-typedef struct _btree_file_ {
-       unsigned int block_sise;
-} 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
@@ -66,18 +77,7 @@ typedef struct _btree_header_ {
 
        /** 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
  *
@@ -85,29 +85,51 @@ typedef struct _btree_ {
  *  \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, int k_t = KEY_FIXED, 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 *breee_open (const char *filename);
+               /** Tipos de clave a usar */
+               enum {
+                       KEY_FIXED,
+                       KEY_VARIABLE
+               };
 
-/** Agrega una clave en el arbol
- *
- *  \TODO Definir parametros
- */
-int btree_add (BTree *);
+               void AddKey (const Clave &k);
+               void DelKey (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);
+
+               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;
+               int key_type;
+
+               /** 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