From: Ricardo Markiewicz Date: Wed, 12 May 2004 03:15:35 +0000 (+0000) Subject: Algunos cambios que se van a necesitar. X-Git-Tag: svn_import_r684~256 X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/commitdiff_plain/63f9cc2172df9d346457685096b4de200c084e9e?ds=sidebyside Algunos cambios que se van a necesitar. --- diff --git a/emufs/emufs.c b/emufs/emufs.c index 14fcafb..ad14955 100644 --- a/emufs/emufs.c +++ b/emufs/emufs.c @@ -342,10 +342,41 @@ int debug_ver_estadisticas(EMUFS* efs) return 0; } -int emufs_agregar_indice(EMUFS *emu, char *nombre, INDICE_TIPO tipo, INDICE_TIPO_DATO tipo_dato, unsigned int offset, unsigned int tam_bloque) +int emufs_agregar_indice(EMUFS *emu, char *nombre, INDICE_FUNCION funcion, INDICE_TIPO tipo, INDICE_TIPO_DATO tipo_dato, unsigned int offset, unsigned int tam_bloque) { INDICE *tmp; - tmp = emufs_indice_crear(emu, nombre, tipo, tipo_dato, offset, tam_bloque); + int error=0; + + /* Verifico que no existe un indice con el mismo nombre */ + /* y que no exista un indice primario */ + tmp = emu->indices; + while (tmp) { + if (strcmp(tmp->nombre, nombre)==0) { + error = 1; + break; + } + if ((funcion == IND_PRIMARIO) && (tmp->funcion == funcion)) { + error = 2; + break; + } + } + + if (tmp != NULL) { + switch (error) { + case 1: + PERR("Ya existe un indice con el mismo nombre!"); + break; + case 2: + PERR("EMUFS ya tiene indice primario!!"); + break; + default: + PERR("Error no esperado!!"); + } + return 0; + } + + /* Creo el nuevo indice */ + tmp = emufs_indice_crear(emu, nombre, funcion, tipo, tipo_dato, offset, tam_bloque); if (tmp == NULL) return 0; @@ -358,3 +389,20 @@ int emufs_agregar_indice(EMUFS *emu, char *nombre, INDICE_TIPO tipo, INDICE_TIPO return 1; } +INDICE_DATO *emufs_buscar_registros(EMUFS *emu, char *indice, CLAVE clave, int *cant) +{ + INDICE *tmp; + tmp = emu->indices; + while (tmp) { + if (strcmp(tmp->nombre, indice) == 0) break; + } + + if (tmp == NULL) { + PERR("NO EXISTE EL INDICE"); + cant = 0; + return NULL; + } + + return tmp->buscar_entradas(tmp, clave, cant); +} + diff --git a/emufs/emufs.h b/emufs/emufs.h index fcbd9b7..a44548c 100644 --- a/emufs/emufs.h +++ b/emufs/emufs.h @@ -173,6 +173,7 @@ int ver_archivo_FS(EMUFS *emu); /** muestra estadisticas, para debug. */ int debug_ver_estadisticas(EMUFS *emu); -int emufs_agregar_indice(EMUFS *emu, char *nombre, INDICE_TIPO tipo, INDICE_TIPO_DATO tipo_dato, unsigned int offset, unsigned int tam_bloque); +int emufs_agregar_indice(EMUFS *emu, char *nombre, INDICE_FUNCION funcion, INDICE_TIPO tipo, INDICE_TIPO_DATO tipo_dato, unsigned int offset, unsigned int tam_bloque); +INDICE_DATO *emufs_buscar_registros(EMUFS *emu, char *indice, CLAVE clave, int *cant); #endif /* _EMUFS_H_ */ diff --git a/emufs/indice_b.c b/emufs/indice_b.c index f3fd08f..abbdfbc 100644 --- a/emufs/indice_b.c +++ b/emufs/indice_b.c @@ -14,7 +14,7 @@ static char *b_crear_nodo(INDICE *idx, int *i); static void b_leer_header(char *src, B_NodoHeader *header); static void b_actualizar_header(char *src, B_NodoHeader *header); static B_NodoEntry *b_leer_claves(char *src, B_NodoHeader *header); -static void b_insertar_en_nodo(INDICE *idx, CLAVE clave, int ubicacion, int nodo_id, char *nodo, int hijo1, int hijo2); +static void b_insertar_en_nodo(INDICE *idx, CLAVE clave, INDICE_DATO dato, int nodo_id, char *nodo, int hijo1, int hijo2); const int b_elegir_izquierdo(INDICE *idx, int a, int b); void emufs_indice_b_crear(INDICE *idx) @@ -40,7 +40,7 @@ void emufs_indice_b_crear(INDICE *idx) fclose(fp); } -int emufs_indice_b_insertar(INDICE *idx, CLAVE clave, int ubicacion) +int emufs_indice_b_insertar(INDICE *idx, CLAVE clave, INDICE_DATO dato) { int i, nodo_id, padre_id; B_NodoHeader header; @@ -73,8 +73,8 @@ int emufs_indice_b_insertar(INDICE *idx, CLAVE clave, int ubicacion) } } else { if (header.nivel != 0) { - nodo = b_leer_nodo(idx, claves[i-1].ubicacion); - nodo_id = claves[i-1].ubicacion; + nodo = b_leer_nodo(idx, claves[i-1].dato.bloque); + nodo_id = claves[i-1].dato.bloque; } else { nodo = NULL; nodo_id = -1; @@ -86,13 +86,14 @@ int emufs_indice_b_insertar(INDICE *idx, CLAVE clave, int ubicacion) if (nodo) free(nodo); nodo = padre; nodo_id = padre_id; - b_insertar_en_nodo(idx, clave, ubicacion, nodo_id, nodo, -1, -1); + b_insertar_en_nodo(idx, clave, dato, nodo_id, nodo, -1, -1); return 1; /* Agregar OK! */ } -int emufs_indice_b_buscar(INDICE *idx, CLAVE clave) +INDICE_DATO emufs_indice_b_buscar(INDICE *idx, CLAVE clave) { - int i, ret; + int i; + INDICE_DATO ret; B_NodoHeader header; B_NodoEntry *claves; char *nodo, *tmp; @@ -105,7 +106,7 @@ int emufs_indice_b_buscar(INDICE *idx, CLAVE clave) i=0; while ((ifuncion == IND_PRIMARIO) { + *cant = 0; + return NULL; + } + + /* TODO Implementar indices con repeticion */ + return NULL; +} + diff --git a/emufs/indice_b.h b/emufs/indice_b.h index f1f6714..6101afc 100644 --- a/emufs/indice_b.h +++ b/emufs/indice_b.h @@ -27,18 +27,19 @@ typedef struct _b_nodo_entry_ { * Si el nivel != 0, es el siguiente bloque dentro * del archivo de indice donde buscar */ - long ubicacion; + INDICE_DATO dato; } B_NodoEntry; /* Crea un arbol */ void emufs_indice_b_crear(INDICE *idx); /* Inserta un par clave-ubicacion */ -int emufs_indice_b_insertar(INDICE *idx, CLAVE clave, int ubicacion); +int emufs_indice_b_insertar(INDICE *idx, CLAVE clave, INDICE_DATO dato); /* Busca una clave, retorna ubicacion o -1 si no existe */ -int emufs_indice_b_buscar(INDICE *idx, CLAVE clave); +INDICE_DATO emufs_indice_b_buscar(INDICE *idx, CLAVE clave); +INDICE_DATO *emufs_indice_b_buscar_muchos(INDICE *idx, CLAVE clave, int *cant); #endif diff --git a/emufs/indices.c b/emufs/indices.c index a099e13..4b97972 100644 --- a/emufs/indices.c +++ b/emufs/indices.c @@ -4,8 +4,9 @@ #include "indice_b.h" static CLAVE obtenet_clave(INDICE *idx, char *data); +static CLAVE obtenet_clave_desde_valor(INDICE *idx, char *data); -INDICE *emufs_indice_crear(EMUFS *emu, char *nombre, 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 len; INDICE *tmp; @@ -27,6 +28,7 @@ INDICE *emufs_indice_crear(EMUFS *emu, char *nombre, INDICE_TIPO tipo, INDICE_TI tmp->tipo = tipo; tmp->tipo_dato = tipo_dato; tmp->tam_bloque = tam_bloque; + tmp->funcion = funcion; tmp->offset = offset; tmp->sig = NULL; @@ -36,6 +38,7 @@ INDICE *emufs_indice_crear(EMUFS *emu, char *nombre, INDICE_TIPO tipo, INDICE_TI tmp->agregar_entrada = emufs_indice_b_insertar; tmp->borrar_entrada = NULL; tmp->existe_entrada = emufs_indice_b_buscar; + tmp->buscar_entradas = NULL; break; case IND_B_ASC: /* llenar metodos */ @@ -54,16 +57,35 @@ void emufs_indice_destruir(EMUFS *emu, INDICE *i) free(i); } -void emufs_indice_agregar(INDICE *primero, char *data, int ubicacion) +void emufs_indice_agregar(INDICE *primero, char *data, INDICE_DATO dato) { INDICE *iter = primero; while (iter) { - iter->agregar_entrada(iter, obtenet_clave(iter, data), ubicacion); + iter->agregar_entrada(iter, obtenet_clave(iter, data), dato); iter = iter->sig; } } +INDICE_DATO emufs_indice_buscar(INDICE *primero, char *data) +{ + return primero->existe_entrada(primero, obtenet_clave_desde_valor(primero, data)); +} + +static CLAVE obtenet_clave_desde_valor(INDICE *idx, char *data) +{ + CLAVE k; + switch (idx->tipo_dato) { + case IDX_FLOAT: + k.f_clave= *((float *)(data)); + break; + case IDX_INT: + k.i_clave = *((int *)(data)); + } + + return k; +} + static CLAVE obtenet_clave(INDICE *idx, char *data) { CLAVE k; diff --git a/emufs/indices.h b/emufs/indices.h index 9d40d51..7123f63 100644 --- a/emufs/indices.h +++ b/emufs/indices.h @@ -9,12 +9,23 @@ typedef struct _emu_fs_t EMUFS; +typedef struct _reg_def_ { + unsigned long id; + unsigned long bloque; +} INDICE_DATO; + /** Tipos de Indices conocidos */ typedef enum { IND_B, /**< Utilizacion de Arboles B */ IND_B_ASC /**< Utilizacion de Arboles B* */ } INDICE_TIPO; +typedef enum { + IND_PRIMARIO, + IND_SELECCION, + IND_EXAHUSTIVO +} INDICE_FUNCION; + /** Tipos de datos soportados para las claves */ typedef enum {IDX_FLOAT, IDX_INT} INDICE_TIPO_DATO; @@ -28,19 +39,22 @@ typedef union _data_ { typedef struct _indices_h_ { INDICE_TIPO tipo; /**< Tipo de indice */ INDICE_TIPO_DATO tipo_dato; /**< Tipo de dato a manejar */ + INDICE_FUNCION funcion; /**< Funcion del indice */ int offset; /**< Offset desde el inicio del dato hasta el lugar donde esta la clave */ unsigned int tam_bloque; /**< Tamaño del bloque (nodo). Deber set multiplo de 512! */ /** Agrega la clave k de posicion location en el * indice de forma ordenada */ - int (*agregar_entrada)(struct _indices_h_ *idx, CLAVE k, int location); + int (*agregar_entrada)(struct _indices_h_ *idx, CLAVE k, INDICE_DATO dato); /** Borra del indice la clave k */ int (*borrar_entrada)(struct _indices_h_ *idx, CLAVE k); /** Determina si existe la clave k retornando su posicion o -1 * en caso fallido */ - int (*existe_entrada)(struct _indices_h_ *idx, CLAVE k); + INDICE_DATO (*existe_entrada)(struct _indices_h_ *idx, CLAVE k); + + INDICE_DATO *(*buscar_entradas)(struct _indices_h_ *idx, CLAVE k, int *cant); char *nombre; /**< Nombre único de busqueda del indice */ char *filename; /**< nombre del archivo de indice */ @@ -57,7 +71,7 @@ typedef struct _indices_h_ { * \param offset Desplazamiento de la clave dentro del dato * \param tam_bloque Tamaño del bloque (nodo) del arbol */ -INDICE *emufs_indice_crear(EMUFS *emu, char *nombre, INDICE_TIPO tipo, INDICE_TIPO_DATO tipo_dato, unsigned int offset, unsigned 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 tam_bloque); /** Destruye un indice * @@ -74,7 +88,9 @@ void emufs_indice_destruir(EMUFS *emu, INDICE *i); * \param data Array de datos desde donde tomar las claves * \param ubicacion Dato a guardar asociado a la clave */ -void emufs_indice_agregar(INDICE *primero, char *data, int ubicacion); +void emufs_indice_agregar(INDICE *primero, char *data, INDICE_DATO dato); + +INDICE_DATO emufs_indice_buscar(INDICE *primero, char *data); /** Compara 2 claves de la forma c1 < c2 */ int emufs_indice_es_menor(INDICE *idx, CLAVE c1, CLAVE c2);