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 */
/* 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);
}
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;
+}
+
/** 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