]> git.llucax.com Git - z.facultad/75.06/emufs.git/commitdiff
Agrego codigo para indices selectivos (si la clave es nula la ignora y no
authorRicardo Markiewicz <gazer.arg@gmail.com>
Sun, 30 May 2004 05:46:17 +0000 (05:46 +0000)
committerRicardo Markiewicz <gazer.arg@gmail.com>
Sun, 30 May 2004 05:46:17 +0000 (05:46 +0000)
 guarda nada)

emufs/indice_b.c
emufs/indices.c
emufs/indices.h

index dfd4ff34eeb533839d8ded8b9ed870ad02db2c9f..ef051127b5e2f86a039efd3782fa935c4fbc3c50 100644 (file)
@@ -105,8 +105,9 @@ int emufs_indice_b_insertar(INDICE *idx, CLAVE clave, INDICE_DATO dato)
                                PERR(idx->nombre);
                                return 0;
                        }
-                       
-                       b_insertar_dup_en_pos(idx, claves[i].dato, dato);
+       
+                       if ((idx->funcion == IND_SELECCION) && (!emufs_indice_es_clave_nula(idx, clave)))
+                               b_insertar_dup_en_pos(idx, claves[i].dato, dato);
                
                        if (idx->tipo_dato == IDX_STRING) {
                                /* Tengo que sacar el texto repetido del archivo de textos */
@@ -132,6 +133,11 @@ int emufs_indice_b_insertar(INDICE *idx, CLAVE clave, INDICE_DATO dato)
                /* Agrego el DATO real al archivo de claves repetiras
                 * y me guardo el ID para poner en el indice
                 */
+               if ((idx->funcion == IND_SELECCION) && (emufs_indice_es_clave_nula(idx, clave)))
+                       /* UPS!, la clave que se va a insertar por primera vez es nula
+                        * y soy un indice selectivo!, no lo puedo permitir, ciao!!
+                        */
+                       return 1;
                dummy.id = -1;
                dato.id = b_insertar_dup_en_pos(idx, dummy, dato);
        }
index 83dd5f6536a3eeba47b2deeeab28c97b1999dbe3..fdb6c4b8ca248b7a18b5d73e9329d9f5d4c03266 100644 (file)
@@ -282,3 +282,25 @@ void emufs_indice_borrar(INDICE *primero, CLAVE k, INDICE_DATO dato)
                iter = iter->sig;
        }
 }
+
+int emufs_indice_es_clave_nula(INDICE *idx, CLAVE k)
+{
+       char *sc1;
+       EMUFS_REG_SIZE dummy; /* No me interesa el tamaƱo del string aca! */
+       int error=0;
+
+       switch (idx->tipo_dato) {
+               case IDX_FLOAT:
+                       return k.f_clave == -1 ;
+               case IDX_INT:
+                       return k.i_clave == -1;
+               case IDX_STRING:
+                       error = 0;
+                       sc1 = idx->emu_string->leer_registro(idx->emu_string, k, &dummy, &error);
+                       error = strlen(sc1);
+                       free(sc1);
+                       return error==0;
+       }
+       return 0;
+}
+
index d043ab70f6e894aa8a22ef8001786c3f28efc440..543e879ffcb3e2d20060ec2f7ae1a16e54eccf12 100644 (file)
@@ -143,4 +143,5 @@ int emufs_indice_es_menor(INDICE *idx, CLAVE c1, CLAVE c2);
 
 /** Compara 2 claves de la forma c1 == c2 */
 int emufs_indice_es_igual(INDICE *idx, CLAVE c1, CLAVE c2);
+int emufs_indice_es_clave_nula(INDICE *idx, CLAVE k);
 #endif