From a1146fe4177661c121dddaa5c8d60d9620967949 Mon Sep 17 00:00:00 2001 From: Ricardo Markiewicz Date: Sun, 30 May 2004 05:46:17 +0000 Subject: [PATCH] Agrego codigo para indices selectivos (si la clave es nula la ignora y no guarda nada) --- emufs/indice_b.c | 10 ++++++++-- emufs/indices.c | 22 ++++++++++++++++++++++ emufs/indices.h | 1 + 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/emufs/indice_b.c b/emufs/indice_b.c index dfd4ff3..ef05112 100644 --- a/emufs/indice_b.c +++ b/emufs/indice_b.c @@ -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); } diff --git a/emufs/indices.c b/emufs/indices.c index 83dd5f6..fdb6c4b 100644 --- a/emufs/indices.c +++ b/emufs/indices.c @@ -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; +} + diff --git a/emufs/indices.h b/emufs/indices.h index d043ab7..543e879 100644 --- a/emufs/indices.h +++ b/emufs/indices.h @@ -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 -- 2.43.0