]> git.llucax.com Git - z.facultad/75.52/treemulator.git/commitdiff
Agrego emision de excepsiones en caso de error.
authorRicardo Markiewicz <rmarkie@fi.uba.ar>
Thu, 27 Oct 2005 23:49:24 +0000 (23:49 +0000)
committerRicardo Markiewicz <rmarkie@fi.uba.ar>
Thu, 27 Oct 2005 23:49:24 +0000 (23:49 +0000)
src/btree.cpp
src/btree.h
src/exception.h [new file with mode: 0644]

index 9fece76b5d46a9977ec0c42655f1fd9290bcb5d0..fff8278ef49ba309790e4946e178214b91086f10 100644 (file)
@@ -54,7 +54,7 @@ void BTree::WriteBlock (uchar *block, uint num)
 void BTree::AddKey (const Clave &k)
 {
        uint left, right;
-       Clave *kout = AddKeyR (&k, 0, left, right);
+       Clave *kout = AddKeyR (k.Clone (), 0, left, right);
 
        if (kout) {
                unsigned short level;
@@ -103,10 +103,19 @@ Clave* BTree::AddKeyR (const Clave *k, uint node_num, uint &left_child, uint &ri
        ReadNodoHeader (node, &node_header);
        delete [] node;
 
-       if (node_header.level == 0)
-               return AddKeyLeafR (k, node_num, left_child, right_child);
+       if (node_header.level == 0) {
+               try {
+                       return AddKeyLeafR (k, node_num, left_child, right_child);
+               } catch (Exception *e) {
+                       throw e;
+               }
+       }
 
-       return AddKeyOtherR (k, node_num, left_child, right_child);
+       try {
+               return AddKeyOtherR (k, node_num, left_child, right_child);
+       } catch (Exception *e) {
+               throw e;
+       }
 }
 
 Clave* BTree::AddKeyLeafR (const Clave *k, uint node_num, uint &left_child, uint &right_child)
@@ -128,6 +137,14 @@ 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) {
+                               /* Verifico que la clave no existea ya en el arbol */
+                               if ((*data) == (*datait)) {
+                                       throw new AddException ();
+                                       return NULL;
+                               }
+                       }
+       
                        if ((*data) < (*datait))
                                /* Me pase, lo agrego aca! */
                                break;
@@ -161,6 +178,13 @@ 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) {
+                               /* Verifico que la clave no existea ya en el arbol */
+                               if ((*data) == (*datait)) {
+                                       throw new AddException ();
+                                       return NULL;
+                               }
+                       }
                        if ((*data) < (*datait))
                                /* Me pase, lo agrego aca! */
                                break;
@@ -254,6 +278,13 @@ 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) {
+                       /* Verifico que la clave no existea ya en el arbol */
+                       if ((*data) == (*(*it))) {
+                               throw new AddException ();
+                               return NULL;
+                       }
+               }
                if ((*data) < (*(*it)))
                        break;
                ultima = it;
@@ -283,6 +314,13 @@ 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) {
+                               /* Verifico que la clave no existea ya en el arbol */
+                               if ((*data) == (*datait)) {
+                                       throw new AddException ();
+                                       return NULL;
+                               }
+                       }
                        if ((*data) < (*datait))
                                /* Me pase, lo agrego aca! */
                                break;
@@ -318,6 +356,13 @@ 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) {
+                               /* Verifico que la clave no existea ya en el arbol */
+                               if ((*data) == (*datait)) {
+                                       throw new AddException ();
+                                       return NULL;
+                               }
+                       }
                        if ((*data) < (*datait))
                                /* Me pase, lo agrego aca! */
                                break;
index 7d640725468cea0d2be9514db16740f675fe71ec..ef9f24232358b9150b5c56e56fed967305e30688 100644 (file)
@@ -73,6 +73,7 @@
 #include "clave_fija.h"
 #include "clave_variable.h"
 #include "btree_data.h"
+#include "exception.h"
 
 /* alias para codear menos :) */
 
diff --git a/src/exception.h b/src/exception.h
new file mode 100644 (file)
index 0000000..133485e
--- /dev/null
@@ -0,0 +1,23 @@
+
+#ifndef _EXCEPTION_H_
+#define _EXCEPTION_H_
+
+#include <string>
+
+class Exception {
+       public:
+               virtual std::string Message () { return "Error desconocido"; }
+};
+
+class AddException : public Exception  {
+       public:
+               virtual std::string Message () { return "No se pudo agregar la clave."; }
+};
+
+class DelException : public Exception {
+       public:
+               virtual std::string Message () { return "No se pudo eliminar la clave."; }
+};
+
+#endif
+