]> git.llucax.com Git - z.facultad/75.06/emufs.git/blobdiff - emufs/indices.c
tree view
[z.facultad/75.06/emufs.git] / emufs / indices.c
index f7a0ff2f03b7b009cb275d769fcc2457fac04787..438aea86a789ec41d828511a8aa26d309916e80f 100644 (file)
@@ -4,7 +4,7 @@
 #include "indice_b.h"
 #include "indice_bplus.h"
 
-INDICE *emufs_indice_crear(EMUFS *emu, char *nombre, INDICE_FUNCION funcion, INDICE_TIPO tipo, INDICE_TIPO_DATO tipo_dato, unsigned int offset, unsigned int tam_bloque)
+INDICE *emufs_indice_crear(EMUFS *emu, char *nombre, INDICE_FUNCION funcion, INDICE_TIPO tipo, INDICE_TIPO_DATO tipo_dato, unsigned int offset, unsigned int tam_bloque, int str_offset)
 {
        int len;
        INDICE *tmp;
@@ -49,6 +49,7 @@ INDICE *emufs_indice_crear(EMUFS *emu, char *nombre, INDICE_FUNCION funcion, IND
        }
 
        tmp->offset = offset;
+       tmp->str_offset = str_offset;
        tmp->sig = NULL;
        tmp->size_claves = 0;
        tmp->size_hijos = 0;
@@ -68,7 +69,14 @@ INDICE *emufs_indice_crear(EMUFS *emu, char *nombre, INDICE_FUNCION funcion, IND
                case IND_B_ASC:
                        /* llenar metodos */
                        PERR("Creando indice con Arbol B*");
-                       PERR("AÚN NO IMPLEMENTADO!!!!!!!!");
+                       emufs_indice_b_crear(tmp);
+                       tmp->agregar_entrada = emufs_indice_b_asc_insertar;
+                       tmp->borrar_entrada = emufs_indice_b_borrar;
+                       tmp->existe_entrada = emufs_indice_b_buscar;
+                       tmp->buscar_entradas = emufs_indice_b_buscar_muchos;
+                       tmp->obtener_menor_clave = emufs_indice_b_obtener_menor_clave;
+                       tmp->obtener_mayor_clave = emufs_indice_b_obtener_mayor_clave;
+                       tmp->obtener_sig_clave = emufs_indice_b_obtener_sig_clave;
                        break;
                case IND_B_PLUS:
                        /* llenar metodos */
@@ -150,6 +158,8 @@ CLAVE emufs_indice_generar_clave(INDICE *idx, char *data)
 {
        CLAVE k;
        int error;
+       int c;
+       char *ptr;
 
        switch (idx->tipo_dato) {
                case IDX_FLOAT:
@@ -159,12 +169,19 @@ CLAVE emufs_indice_generar_clave(INDICE *idx, char *data)
                        k.i_clave = *((int *)(data+idx->offset));
                break;
                case IDX_STRING:
+                       /* Tengo que buscar donde empieza el campo */
+                       ptr = data + idx->offset;
+                       c = idx->str_offset;
+
+                       while (c) {
+                               if ((*ptr) == '\0') c--;
+                               ptr++;
+                       }
                        error = 0;
-                       PERR(idx->nombre);
-                       PERR(data+idx->offset);
+                       fprintf(stderr, "%s: ========> %s\n", idx->nombre, ptr);
                        k.i_clave = idx->emu_string->grabar_registro(idx->emu_string,
-                               data+idx->offset,
-                               strlen(data+idx->offset)+1,
+                               ptr,
+                               strlen(ptr)+1,
                                &error
                        );
        }
@@ -214,8 +231,13 @@ int emufs_indice_es_igual(INDICE *idx, CLAVE c1, CLAVE c2)
                case IDX_STRING:
                        error = 0;
                        sc1 = idx->emu_string->leer_registro(idx->emu_string, c1, &dummy, &error);
+                       if (sc1 == NULL) return 0;
                        error = 0;
                        sc2 = idx->emu_string->leer_registro(idx->emu_string, c2, &dummy, &error);
+                       if (sc2 == NULL) {
+                               free(sc2);
+                               return 0;
+                       }
                        /* Salteo el caracter que indica si la clave en temporal */
                        a = b = 0;
                        if (*sc1 == '*') a=1;