]> git.llucax.com Git - z.facultad/75.52/treemulator.git/blobdiff - src/btree.cpp
Recuperacion de nodos eliminados.
[z.facultad/75.52/treemulator.git] / src / btree.cpp
index fff8278ef49ba309790e4946e178214b91086f10..81af642041af8670b6d9105e016af3cae521eee5 100644 (file)
@@ -54,7 +54,13 @@ void BTree::WriteBlock (uchar *block, uint num)
 void BTree::AddKey (const Clave &k)
 {
        uint left, right;
-       Clave *kout = AddKeyR (k.Clone (), 0, left, right);
+       Clave *kout;
+
+       try {
+               kout = AddKeyR (k.Clone (), 0, left, right);
+       } catch (Exception *e) {
+               throw e;
+       }
 
        if (kout) {
                unsigned short level;
@@ -137,7 +143,7 @@ Clave* BTree::AddKeyLeafR (const Clave *k, uint node_num, uint &left_child, uint
 
                while (it != node_keys.end ()) {
                        datait = (*it);
-                       if (tree_type == TYPE_UNIQUE) {
+                       if (tree_type == TYPE_IDENTIFICACION) {
                                /* Verifico que la clave no existea ya en el arbol */
                                if ((*data) == (*datait)) {
                                        throw new AddException ();
@@ -178,7 +184,7 @@ Clave* BTree::AddKeyLeafR (const Clave *k, uint node_num, uint &left_child, uint
                while (it != node_keys.end ()) {
                        BTreeData *datait;
                        datait = (*it);
-                       if (tree_type == TYPE_UNIQUE) {
+                       if (tree_type == TYPE_IDENTIFICACION) {
                                /* Verifico que la clave no existea ya en el arbol */
                                if ((*data) == (*datait)) {
                                        throw new AddException ();
@@ -278,7 +284,7 @@ Clave* BTree::AddKeyOtherR (const Clave *k, uint node_num, uint &left_child, uin
        posterior = it;
 
        while (it != node_keys.end ()) {
-               if (tree_type == TYPE_UNIQUE) {
+               if (tree_type == TYPE_IDENTIFICACION) {
                        /* Verifico que la clave no existea ya en el arbol */
                        if ((*data) == (*(*it))) {
                                throw new AddException ();
@@ -314,7 +320,7 @@ Clave* BTree::AddKeyOtherR (const Clave *k, uint node_num, uint &left_child, uin
 
                while (it != node_keys.end ()) {
                        datait = (*it);
-                       if (tree_type == TYPE_UNIQUE) {
+                       if (tree_type == TYPE_IDENTIFICACION) {
                                /* Verifico que la clave no existea ya en el arbol */
                                if ((*data) == (*datait)) {
                                        throw new AddException ();
@@ -356,7 +362,7 @@ Clave* BTree::AddKeyOtherR (const Clave *k, uint node_num, uint &left_child, uin
                while (it != node_keys.end ()) {
                        BTreeData *datait;
                        datait = (*it);
-                       if (tree_type == TYPE_UNIQUE) {
+                       if (tree_type == TYPE_IDENTIFICACION) {
                                /* Verifico que la clave no existea ya en el arbol */
                                if ((*data) == (*datait)) {
                                        throw new AddException ();
@@ -708,13 +714,15 @@ void BTree::JoinNodes (uint node1, uint node2, uint padre, int tipohermano)
                WriteNodoHeader (npadre, &nhp);
                WriteBlock (npadre, padre);
 
-        /* TODO: Recuperar nodo1 y nodo2 */
+               deleted_nodes.push_back (node1);
+               deleted_nodes.push_back (node2);
        } else {
                WriteKeys (n1, nh1, newkeys);
                WriteNodoHeader (n1, &nh1);
                WriteBlock (n1, node1);
 
-               /* TODO : Recuperar node2 */
+               deleted_nodes.push_back (node2);
+
                /* Actualizo punero al padre */
                (*anterior)->SetChild (node1);
        
@@ -1129,11 +1137,18 @@ uchar *BTree::NewBlock (uint &num)
        uchar *node;
        BTreeNodeHeader nh;
 
-       fseek (fp, 0, SEEK_END);
-       filelen = ftell (fp);
+       std::list<uint>::iterator it;
+       it = deleted_nodes.begin ();
 
-       num = filelen/header.block_size - 1;
+       if (it != deleted_nodes.end ()) {
+               num = *it;
+               deleted_nodes.erase (it);
+       } else {
+               fseek (fp, 0, SEEK_END);
+               filelen = ftell (fp);
 
+               num = filelen/header.block_size - 1;
+       }
        node = new uchar[header.block_size];
        ReadNodoHeader (node, &nh);
        nh.level = 0;
@@ -1229,3 +1244,8 @@ void BTree::DeleteKeys (std::list<BTreeData *> &keys)
                it++;
        }
 }
+
+int BTree::type () const
+{
+       return key_type;
+}