]> git.llucax.com Git - z.facultad/75.06/emufs.git/commitdiff
* Agrego abreviaturas para claves de texto usadas en indices.
authorRicardo Markiewicz <gazer.arg@gmail.com>
Mon, 24 May 2004 04:04:43 +0000 (04:04 +0000)
committerRicardo Markiewicz <gazer.arg@gmail.com>
Mon, 24 May 2004 04:04:43 +0000 (04:04 +0000)
emufs/indice_b.c
emufs/tipo2.c

index 30d0658222b34fbfeac53d353d9af6d2936e0766..9f3e4114e3c15160d88c663d09e99eda626f18cb 100644 (file)
@@ -56,6 +56,9 @@ static void b_fundir_nodo(char *, int, char *, int, char *, int, int);
                        
 static EMUFS_REG_ID b_insertar_dup_en_pos(INDICE *idx, INDICE_DATO pos, INDICE_DATO nuevo);
 
+static void abreviar_claves(INDICE *idx, B_NodoEntry *array, B_NodoHeader *header);
+static void desabreviar_claves(INDICE *idx, B_NodoEntry *array, B_NodoHeader *header);
+
 void emufs_indice_b_crear(INDICE *idx)
 {
        FILE *fp;
@@ -142,7 +145,6 @@ int emufs_indice_b_insertar(INDICE *idx, CLAVE clave, INDICE_DATO dato)
                 */
                dummy.id = -1;
                dato.id = b_insertar_dup_en_pos(idx, dummy, dato);
-               fprintf(stderr, "Agrege un coso duplicado por primera vez en id=%d\n", dato.id);
        }
 
        b_insertar_en_nodo(idx, clave, dato, nodo_id, nodo, -1, -1);
@@ -266,6 +268,8 @@ static char *b_leer_nodo(INDICE *idx, int id)
 {
        FILE *fp;
        char *out;
+       B_NodoHeader header;
+       B_NodoEntry *claves;
 
        if (id < 0) return NULL;
 
@@ -287,6 +291,12 @@ static char *b_leer_nodo(INDICE *idx, int id)
                return NULL;
        }
 
+       /* Si estoy manejando string tengo que sacar las abreviaturas */
+       if (idx->tipo_dato == IDX_STRING) {
+               b_leer_header(out, &header);
+               claves = b_leer_claves(out, &header);
+               desabreviar_claves(idx, claves, &header);
+       }
        fclose(fp);
        return out;
 }
@@ -294,24 +304,15 @@ static char *b_leer_nodo(INDICE *idx, int id)
 static void b_grabar_nodo(INDICE *idx, int id, char *data)
 {
        FILE *fp;
+       B_NodoHeader header;
+       B_NodoEntry *claves;
 
-/*     if (id > b_ultimo_id()) {
-               printf("AGREGANDO AL FINAL\n");
-               fp = fopen(FILENAME, "a");
-               if (fp == NULL) {
-               _("No se pudo abrir archivo\n");
-                       return;
-               }
-       } else {
-               fp = fopen(FILENAME, "w");
-               if (fp == NULL) {
-               _("No se pudo abrir archivo\n");
-                       return;
-               }
-               fseek(fp, id*BLOCK_SIZE, SEEK_SET);
-               printf("SOLO GUARDO DATA\n");
-       }*/
-
+       /* Si las claves son de tipo string debo abreviar antes de guardar */
+       if (idx->tipo_dato == IDX_STRING) {
+               b_leer_header(data, &header);
+               claves = b_leer_claves(data, &header);
+               abreviar_claves(idx, claves, &header);
+       }
        fp = fopen(idx->filename, "r+");
        fseek(fp, id*idx->tam_bloque, SEEK_SET);
        fwrite(data, 1, idx->tam_bloque, fp);
@@ -562,7 +563,6 @@ INDICE_DATO *emufs_indice_b_buscar_muchos(INDICE *idx, CLAVE clave, int *cant)
 
        /* Leo el contenido actual */
        k.i_clave = dato.id;
-       fprintf(stderr, "TENGO DATOS EN ID=%d\n", dato.id);
        error = 0;
        leido = (char *)idx->emu_mult->leer_registro(idx->emu_mult, k, &tam, &error);
 
@@ -861,3 +861,76 @@ static EMUFS_REG_ID b_insertar_dup_en_pos(INDICE *idx, INDICE_DATO pos, INDICE_D
        return k.i_clave;
 }
 
+char *abreviar(char *primera, char *actual, int *iguales)
+{
+       (*iguales) = 0;
+       while (((*primera) != '\0') && ((*actual) != '\0')) {
+               if ((*primera) == (*actual)) {
+                       primera++;
+                       actual++;
+                       (*iguales)++;
+               } else {
+                       /* No coinciden mas! */
+                       break;
+               }
+       }
+
+       return actual;
+}
+
+static void abreviar_claves(INDICE *idx, B_NodoEntry *array, B_NodoHeader *header)
+{
+       char *primera, *actual, *resto, salvar[100];
+       EMUFS_REG_SIZE size;
+       int error, i;
+       int iguales;
+
+       /* Agarro la primer clave entera como referencia */
+       primera = (char *)idx->emu_string->leer_registro(idx->emu_string, array[0].clave, &size, &error);
+       for(i=1; i<header->cant; i++) {
+               actual = (char *)idx->emu_string->leer_registro(idx->emu_string, array[i].clave, &size, &error);
+               resto = abreviar(primera, actual, &iguales);
+               /* Para que tenga sentido abreviar tengo que tener
+                * mas de 2 letras iguales, si no no gano nada y complica las cosas
+                */
+               if (iguales > 1) {
+                       sprintf(salvar, "%d%s", iguales, resto);
+                       free(actual);
+                       error = 0;
+                       idx->emu_string->modificar_registro(idx->emu_string, array[i].clave.i_clave, salvar, strlen(salvar)+1, &error);
+               } else {
+                       free(primera);
+                       primera = actual;
+               }
+       }
+       
+       free(primera);
+}
+
+static void desabreviar_claves(INDICE *idx, B_NodoEntry *array, B_NodoHeader *header)
+{
+       char *primera, *actual, *resto, salvar[100];
+       EMUFS_REG_SIZE size;
+       int error, i;
+       int iguales;
+
+       /* Agarro la primer clave entera como referencia */
+       primera = (char *)idx->emu_string->leer_registro(idx->emu_string, array[0].clave, &size, &error);
+       for(i=1; i<header->cant; i++) {
+               actual = (char *)idx->emu_string->leer_registro(idx->emu_string, array[i].clave, &size, &error);
+               iguales = strtol(actual, &resto, 10);
+               if (iguales > 0) {
+                       strncpy(salvar, primera, iguales);
+                       salvar[iguales] = '\0';
+                       strcat(salvar, resto);
+                       idx->emu_string->modificar_registro(idx->emu_string, array[i].clave.i_clave, salvar, strlen(salvar)+1, &error);
+                       free(actual);
+               } else {
+                       free(primera);
+                       primera = actual;
+               }
+       }
+       
+       free(primera);
+}
+
index ad179bd28b443a6b8e15e199fb81196c61f6f16f..d9105b5967cff0905e95971daf3b147d8b662d29 100644 (file)
@@ -83,7 +83,6 @@ void *emufs_tipo2_leer_registro(EMUFS* efs, CLAVE clave, EMUFS_REG_SIZE* reg_siz
                reg_offset = dato.bloque;
                id_reg = dato.id;
        } else {
-               PERR("HAGO LECTURA DIRECTA");
                id_reg = clave.i_clave;
                reg_offset = emufs_idx_buscar_registro(efs, id_reg);
                (*err) = 0;
@@ -133,7 +132,6 @@ EMUFS_REG_ID emufs_tipo2_grabar_registro(EMUFS *efs, void *ptr, EMUFS_REG_SIZE r
        /* de manera segura (habra espacio suficiente) */
        fisic_size = sizeof(EMUFS_REG_ID)+sizeof(EMUFS_REG_SIZE)+reg_size;
        wrt_offset = emufs_fsc_buscar_lugar(efs,fisic_size,&freespace);
-       fprintf(stderr, "tipo2.c >> Recording Reg > Searching FSC: Offset = %lu FSpace: %lu\n", wrt_offset, freespace);
        
        /* Si no encontre un gap, entonces escribo el registro al final */
        if (wrt_offset == -1) {                
@@ -174,14 +172,11 @@ EMUFS_REG_ID emufs_tipo2_grabar_registro(EMUFS *efs, void *ptr, EMUFS_REG_SIZE r
        }
                
        /* Finalmente, actualizamos el indice de registros (offsets) */
-       PERR("REGISTRO GRABADO; AGREGANDO A IDX");
        emufs_idx_agregar(efs,id_reg,reg_offset);
        idx_data.id = id_reg;
        idx_data.bloque = reg_offset;
-       PERR("AGREGANDO A INDICES");
        emufs_indice_agregar(efs->indices, (char *)ptr, idx_data);
 
-       PERR("LISTO");
        return id_reg;
 }