/** Le pide al hermano izquierdo una clave cuando se eliminan claves */
static void b_pedir_clave_izquierda(char *, int, char *, int, char *, int, int);
/** Le pasa al hermano derecho del nodo una clave cuando se insertan claves */
-static void b_pasar_clave_a_derecha(char *, int, char *, int, char *, int, int);
+static void b_pasar_clave_a_derecha(INDICE*, char*, int, char*, int, int, B_NodoEntry);
/** Le pasa al hermano izquierdo una clave cuando se insertan claves */
-static void b_pasar_clave_a_izquierda(char *, int, char *, int, char *, int, int);
+static void b_pasar_clave_a_izquierda(INDICE*, char*, int, char*, int, int, B_NodoEntry);
/** Junta 2 nodos y hace uno solo */
static void b_fundir_nodo(char *, int, char *, int, char *, int, int);
i=0;
while ((i<header.cant) && (emufs_indice_es_menor(idx, claves[i].clave, clave))) i++;
if ((i<header.cant) && (emufs_indice_es_igual(idx, claves[i].clave, clave))) {
- /* CLAVE DUPLICADA! */
- return 0;
+ if (idx->tipo == IND_PRIMARIO) {
+ PERR("Indice primario no puede contener claves duplicadas!");
+ return 0;
+ }
+
+ /* TODO : Implementar carga de valor en clave duplicada! */
+
+ return 1;
} else {
if (i == 0) {
nodo = b_leer_nodo(idx, header.hijo_izquierdo);
B_NodoEntry *claves;
char *nodo, *tmp;
+ if (idx->tipo != IND_PRIMARIO) {
+ /* SOLO SE PUEDE BUSCAR CON CLAVE UNICA! */
+ ret.id = ret.bloque = -1;
+ return ret;
+ }
+
/* Leo la raiz */
nodo = b_leer_nodo(idx, 0);
while (nodo) {
b_actualizar_header(nodo, &h_nodo);
}
-static void b_pasar_clave_a_derecha(char *der, int der_id, char *padre, int padre_id, char *nodo, int nodo_id, int pos_clave)
+void b_pasar_clave_a_derecha(INDICE *idx, char *der, int der_id, char *padre, int padre_id, int padre_pos, B_NodoEntry entry)
{
-/* int i;
- B_NodoHeader h_der, h_padre, h_nodo;
- B_NodoEntry *c_der, *c_padre, *c_nodo;
-
- b_leer_header(nodo, &h_nodo);
- c_nodo = b_leer_claves(nodo, &h_nodo);
- b_leer_header(der, &h_der);
- c_der = b_leer_claves(der, &h_der);
- b_leer_header(padre, &h_padre);
- c_padre = b_leer_claves(padre, &h_padre);
-
- c_nodo[h_nodo.cant] = c_padre[pos_clave];
- c_nodo[h_nodo.cant].hijo_derecho = -1; / * XXX * /
-
- c_padre[pos_clave] = c_der[0];
- c_padre[pos_clave].hijo_derecho = der_id;
-
- / * Muevo las claves de derecho * /
- for(i=0; i<h_der.cant; i++) {
- c_der[i] = c_der[i+1];
- }
- h_der.cant++;
-
- b_actualizar_header(der, &h_der);
- b_actualizar_header(nodo, &h_nodo);
-*/
+ B_NodoHeader der_h, padre_h;
+ B_NodoEntry *der_entries, *padre_entries;
+ /* Leo claves y cabecera del nodo de la derecha y del padre */
+ b_leer_header(der, &der_h);
+ der_entries = b_leer_claves(der, &der_h);
+ b_leer_header(padre, &padre_h);
+ padre_entries = b_leer_claves(padre, &padre_h);
+ /* Inserto en el hijo derecho la clave del padre */
+ b_insertar_en_nodo_con_lugar(idx, padre_entries[padre_pos].clave, padre_entries[padre_pos].dato,
+ der_id, der, entry.hijo_derecho, der_h.hijo_izquierdo);
+ /* Reemplazo clave del padre por clave nueva */
+ entry.hijo_derecho = der_id;
+ padre_entries[padre_pos] = entry;
}
-static void b_pedir_clave_izquierda(char *izq, int izq_id, char *padre, int padre_id, char *nodo, int nodo_id, int pos_clave)
+void b_pedir_clave_izquierda(char *izq, int izq_id, char *padre, int padre_id, char *nodo, int nodo_id, int pos_clave)
{
int i;
B_NodoHeader h_izq, h_padre, h_nodo;
b_actualizar_header(nodo, &h_nodo);
}
-static void b_pasar_clave_a_izquierda(char *izq, int izq_id, char *padre, int padre_id, char *nodo, int nodo_id, int pos_clave)
+void b_pasar_clave_a_izquierda(INDICE* idx, char *izq, int izq_id, char *padre, int padre_id, int padre_pos, B_NodoEntry entry)
{
/* int i;
B_NodoHeader h_izq, h_padre, h_nodo;