]> git.llucax.com Git - z.facultad/75.52/treemulator.git/commitdiff
Cambio constructor por metodo estatico.
authorRicardo Markiewicz <rmarkie@fi.uba.ar>
Wed, 23 Nov 2005 04:17:51 +0000 (04:17 +0000)
committerRicardo Markiewicz <rmarkie@fi.uba.ar>
Wed, 23 Nov 2005 04:17:51 +0000 (04:17 +0000)
Cambio el constructor de "abrir" por un metodo estatico Open. Esto
tiene la ventaja que si el archivo a abrir no es un arbol B no se crea
un arbol inconsistente y se elimina posible error de uso.

src/btree.cpp
src/btree.h

index ae68316e256a790dee91e9a888856b044310fe51..2701b3a270aa3864346edf05525ef9c035471573 100644 (file)
@@ -36,41 +36,54 @@ BTree::BTree (const std::string &name, unsigned int block_size, int tt, int kt,
        delete [] node;
 }
 
-BTree::BTree (const std::string &name)
+BTree* BTree::Open (const std::string &name)
 {
        /* Leo los bloques recuperables */
-       std::string del = filename + ".del";
+       FILE *fp;
+       BTree *tree = new BTree ();
+
+       std::string del = name + ".del";
 
        fp = fopen (del.c_str (), "wb");
        if (fp != NULL) {
                uint i;
 
                while (fread (&i, 1, sizeof (uint), fp)) {
-                       deleted_nodes.push_back (i);
+                       tree->deleted_nodes.push_back (i);
                }
 
                fclose (fp);
        }
 
-       del = filename + ".blockdel";
+       del = name + ".blockdel";
 
        fp = fopen (del.c_str (), "wb");
        if (fp != NULL) {
                uint i;
 
                while (fread (&i, 1, sizeof (uint), fp)) {
-                       deleted_block_data.push_back (i);
+                       tree->deleted_block_data.push_back (i);
                }
 
                fclose (fp);
        }
 
-       fp = fopen (name.c_str(), "rb+");
+       tree->filename = name;
+       tree->fp = fopen (name.c_str(), "rb+");
        if (!fp) {
                /* TODO : mandar una exception ? */
-               return;
+               delete tree;
+               return NULL;
        }
-       ReadFileHeader ();
+       tree->ReadFileHeader ();
+
+       if (strcmp ("DILUMA", tree->header.magic)) {
+               /* Arbol no tiene magic!! */
+               delete tree;
+               return NULL;
+       }
+
+       return tree;
 }
 
 BTree::~BTree ()
index 9e492139317a15351162c43f5c3637fc42a767cf..526b428dac7953ecfa459338f38607b16481796e 100644 (file)
@@ -251,7 +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);
+
+               static BTree *Open (const std::string &filename);
 
                ~BTree ();
 
@@ -333,6 +334,9 @@ class BTree {
 
 
                /* DEBUG */
+       private:
+               BTree () {}
+
        public:
                void PrintNode (uint num);
 };