From: Nicolás Dimov Date: Thu, 13 May 2004 23:46:19 +0000 (+0000) Subject: subo lo que hice con Alan hasta que mi disco se quedo sin lugar otra vez X-Git-Tag: svn_import_r684~249 X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/commitdiff_plain/51ed490d1caf11b5645abef4dd473e5a5b520856?ds=inline subo lo que hice con Alan hasta que mi disco se quedo sin lugar otra vez --- diff --git a/emufs/b_plus.c b/emufs/b_plus.c index 51a77e9..e69de29 100644 --- a/emufs/b_plus.c +++ b/emufs/b_plus.c @@ -1,4 +0,0 @@ -/** Arbol B+ */ -#include "b_plus.h" - - diff --git a/emufs/b_plus.h b/emufs/b_plus.h index 0b6d035..e69de29 100644 --- a/emufs/b_plus.h +++ b/emufs/b_plus.h @@ -1,37 +0,0 @@ -#ifndef _B_PLUS_H_ -#define _B_PLUS_H_ -#include -#include -#include "emufs.h" -typedef union _clave_b_plus { - int num; - /*fixme*/ -}CLAVE_B_PLUS; - -typedef struct nodo_b_plus { - int nivel; /** Nivel del nodo */ - int cant; /** Cantidad de items en el nodo */ - int right /** Referencia al nodo derecho */ - int left; /** Referencia al nodo izquierdo */ - CLAVE_B_PLUS clave; /** Clave de busqueda e insercion */ -} NODO_B_PLUS; - -typedef struct nodo_b_plus_hoja { - int nivel; /** Nivel del nodo */ - int cant; /** Cantidad de claves en el nodo */ - int offset; /** Distancia hasta el comiezo de la clave */ - EMUFS_BLOCK_ID bloque; /** Referencia al bloque */ - EMUFS_REG_ID id_reg; /** Identificador del registro */ - EMUFS_FREE free_space; /** Espacio libre del bloque */ - void *dato; /** Cadena contenedora del dato */ -} NODO_B_PLUS_HOJA; - -/** TODO */ -int b_plus_crear(); -int b_plus_insertar(); -int b_plus_eliminar(); -int b_plus_buscar(); -int b_plus_destuir(); - - -#endif diff --git a/emufs/emufs.h b/emufs/emufs.h index 790fdea..e69de29 100644 --- a/emufs/emufs.h +++ b/emufs/emufs.h @@ -1,179 +0,0 @@ -/* vim: set noexpandtab tabstop=4 shiftwidth=4 wrap: - *---------------------------------------------------------------------------- - * emufs - *---------------------------------------------------------------------------- - * This file is part of emufs. - * - * emufs is free software; you can redistribute it and/or modify it under the - * terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. - * - * emufs is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. - * - * You should have received a copy of the GNU General Public License along - * with emufs; if not, write to the Free Software Foundation, Inc., 59 Temple - * Place, Suite 330, Boston, MA 02111-1307 USA - *---------------------------------------------------------------------------- - * Creado: mié mar 31 17:26:46 ART 2004 - * Autores: Nicolás Dimov - * Ricardo Markiewicz - * Leandro Lucarella - *---------------------------------------------------------------------------- - * - * $Id$ - * - */ - -/** \file - * - * Estructura general de un archivo abstracto de emufs. - * - * Interfaz de la estructura abstracta que representa cualquiera de los tipos - * de archivo implementados. - * - */ - -#ifndef _EMUFS_H_ -#define _EMUFS_H_ - -#include -#include -#include - -#include "indices.h" - -/** Tipo de archivo. */ -typedef enum { - T1, /**< Archivo de bloque parametrizado y registro variable. */ - T2, /**< Archivo sin bloques y registros variables. */ - T3 /**< Archivo de bloque parametrizado y registro fijo. */ -} EMUFS_Tipo; - -/** Tipo de identificador de registro. */ -typedef unsigned long EMUFS_REG_ID; - -/** Tipo de tamaño de registro. */ -typedef unsigned long EMUFS_REG_SIZE; - -/** Tipo de identificador de bloque. */ -typedef unsigned long EMUFS_BLOCK_ID; - -/** Tipo de tamaño de bloque. */ -typedef unsigned long EMUFS_BLOCK_SIZE; - -/** Tipo de espacio libre. */ -typedef unsigned long EMUFS_FREE; - -/** Tipo de offset. */ -typedef unsigned long EMUFS_OFFSET; - -/** Constante para indicar el valor especial de un ID inválido. - * - * El uso típico es para indicar que no se encontró el ID en una búsqueda. - */ -#define EMUFS_NOT_FOUND -1ul - -/** Estadisticas de archivo. */ -typedef struct _emufs_est_t { - unsigned long tam_archivo;/**< Tamaño en bytes del archivo .dat */ - unsigned long tam_archivos_aux;/**< Tamaño en bytes de los archivos auxiliares sumados */ - unsigned long tam_info_control_dat;/**< Cantidad de bytes en info de control del .dat */ - unsigned long media_fs;/**< Media del espacio libre en el archivo de datos */ - unsigned long total_fs;/**< Cantidad total de espacio libre en el archivo de datos */ - unsigned long max_fs;/**< Cantidad de maxima libre (gap o fs en bloque) en el archivo de datos */ - unsigned long min_fs;/**< Cantidad de minima libre (gap o fs en bloque) en el archivo de datos */ - unsigned long cant_bloques; /**< Cantidad de bloques en el archivo de datos */ - unsigned long cant_registros; /**< Cantidad de Registros en el archivo */ -} EMUFS_Estadisticas; - -/** Tipo Abstracto para menajo de archivos. - * - * Esta estructura es utilizada para acceder a cualquier tipo de archivo. - * - * Cuando se requiere abrir o crear un nuevo archivo, esta estrucura contendrá los - * punteros a los métodos de dicho archivo, por lo que desde el código que utilice - * esta estructura no deberá ser modificado por cada tipo de archivo. - * - * Por ejemplo: - * \code - * EMUFS *fs = emufs_abrir("archivo"); - * fs->leer_registro(id, ptr, size); - * \endcode - * - * Este ejemplo funcionará sin importar de que tipo de archivo se trate, sin - * la necesidad de que el usuario tenga que hacer una selección previa del tipo - * para llamar al método correspondiente a cada tipo de archivo. - */ -struct _emu_fs_t { - EMUFS_Tipo tipo; - EMUFS_BLOCK_SIZE tam_bloque; /**< Tamaño de bloque. 0 Si no tiene bloques */ - EMUFS_REG_SIZE tam_reg; /**< Tamaño de registro. 0 Si son registros variables */ - void* (*leer_bloque)(struct _emu_fs_t*, EMUFS_BLOCK_ID, int*); /**< Método para leer un bloque */ - void (*leer_bloque_raw)(struct _emu_fs_t*, EMUFS_BLOCK_ID, char **, char **, char **, EMUFS_BLOCK_SIZE *, EMUFS_BLOCK_SIZE *, EMUFS_BLOCK_SIZE *); /**< Método para leer un bloque, el anterior y el siguiente */ - void* (*leer_registro)(struct _emu_fs_t*, CLAVE, EMUFS_REG_SIZE*, int*); /**< Método para leer un registro */ - void* (*leer_registro_raw)(struct _emu_fs_t*, EMUFS_REG_ID, EMUFS_REG_SIZE*, int *); /**< Método para leer un registro con todo su bloque asociado */ - EMUFS_REG_ID (*grabar_registro)(struct _emu_fs_t*, void*, EMUFS_REG_SIZE, int*); /**< Método para grabar un registro */ - EMUFS_REG_ID (*modificar_registro)(struct _emu_fs_t*, EMUFS_REG_ID, void*, EMUFS_REG_SIZE, int*); /**< Método para modificar un registro */ - int (*borrar_registro)(struct _emu_fs_t*, EMUFS_REG_ID); /**< Método para borrar un registro */ - EMUFS_Estadisticas (*leer_estadisticas)(struct _emu_fs_t *); /**< Método para obtener estádisticas sobre el archivo */ - void (*compactar)(struct _emu_fs_t *); /**< Método para compactar el archivo reorganizándolo físicamente */ - char *nombre; /**< Nombre del archivo */ - - INDICE *indices; -}; - -/** Crea un archivo auxiliar. */ -int emufs_crear_archivo_auxiliar(const char*, const char*); - -/** Crea un nuevo archivo EMUFS. - * - * Un archivo EMUFS está compuesto por 4 archivos a nivel del SO. - * Un archivo principal con extensión .dat y 3 archivos auxiliares para - * manejo interno. - * - * El parámetro filename que recive esta función en el nombre virtual que se - * utilizará, ya que las extensiones serán puestas automáticamente for EMUFS. - * - * Un ejemplo: - * \code - * EMUFS *fp emufs_crear("archivo", T3, 100, 100); - * \endcode - * - * En el ejemplo anterior se tiene que nuestro filesystem virtual se llamará - * archivo. - * - * Los últimos 2 parámetros serán ignorados si el tipo de archivo no utiliza - * dicho parámetro. - * - * \param filename Nombre del archivo virtual. - * \param tipo Tipo de archivo. - * \param tam_bloque Tamaño del bloque. - * \param tam_reg Tamaño del registro. - */ -EMUFS *emufs_crear(const char *filename, EMUFS_Tipo tipo,EMUFS_BLOCK_SIZE tam_bloque, EMUFS_REG_SIZE tam_reg); - -/** Abre un archivo EMUFS. - * - * Abre un archivo, determinando de que tipo se trata. - * - * \param filename Nombre del archivo virtual. - */ -EMUFS *emufs_abrir(const char *filename); - -/** Libera un archivo virtual */ -int emufs_destruir(EMUFS *e); - -/** mustra archivos auxiliares, para debug. */ -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_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/indices.h b/emufs/indices.h index 53c4c28..e69de29 100644 --- a/emufs/indices.h +++ b/emufs/indices.h @@ -1,105 +0,0 @@ - -#ifndef _INDICES_H_ -#define _INDICES_H_ - -#include -#include - -#include "common.h" - -#define STRUCT_OFFSET(x, y) ((int)(&(x->y))-(int)(x)) - -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; - -/** Clave de indice */ -typedef union _data_ { - float f_clave; - int i_clave; -} CLAVE; - -/** Manejo de Indices independiente */ -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, 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 - */ - 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 */ - - struct _indices_h_ *sig; /**< Siguiente indice */ -} INDICE; - -/** Crea un nuevo indice - * - * \param emu EMUFS a quien pertenece - * \param nombre Nombre del indice - * \param tipo Tipo de indice - * \param tipo_dato Tipo de dato de la clave - * \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_FUNCION funcion, INDICE_TIPO tipo, INDICE_TIPO_DATO tipo_dato, unsigned int offset, unsigned tam_bloque); - -/** Destruye un indice - * - * \todo hacer/revisar - */ -void emufs_indice_destruir(EMUFS *emu, INDICE *i); - -/** Agrega una clave en los indices - * - * Agrega la clave en todos los indice, dependiendo de su tipo - * de dato, tipo de arboo, offset, etc - * - * \param primer Primer indice a agregar - * \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, INDICE_DATO dato); - -INDICE_DATO emufs_indice_buscar(INDICE *primero, char *data); - -CLAVE emufs_indice_generar_clave(INDICE *idx, char *data); -CLAVE emufs_indice_generar_clave_desde_valor(INDICE *idx, char *data); -/** Compara 2 claves de la forma c1 < c2 */ -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); -#endif -