Primer intento de compactar(). Parece andar bien lo que esta implementado. Falta
truncar el archivo a los bloques realmente usados y manejar los registros
multibloque.
Para esto se crea grabar_registro_con_id() que es igual a grabar_registro() pero
se le puede pasar un id arbitrario (para conservar el id). grabar_registro() es
ahora un wrapper a grabar_registro_con_id().
Tambien se hace una funcion para obtener la longitud del archivo, aunque al
final la usa solo leer_estadisticas().
Impelentacion de compactar terminada pero NO ESTA TESTEADA del todo..
hice solo un par de pruebas.
En esta misma funcion tuve un quilombo con un fclose, que se me hace que es porque el archivo ya estaba cerrado, asi que lo saque y le dejo la tarea al sistema operativo :-P
me voy a poner a testear lo mas que pueda para despues empezar a documentar.
- Se agrega leer_estadisticas().
- Se agrega chequeo en emufs_crear() para que no se pueda crear un archivo con
bloque mas chico que 2 * sizeof(cabecera de registro).
* BUGFIX : cuando se recreaba con otro formato el archivo de
articulos faltaba cambiar el campo nombre para que quede
consistente. Ahora se puede pasar de un tipo a otro y a otro
tantas veces que se quiera.
* BUGFIX : EN idx_get faltaba un sizeof(EMUFS_REG_ID) (aunque el valgrind se sigue quejando)
* tipo_leer_raw retocada.
* Algunas cosa en GUI que no recuerdo
Se implementa borrar_registro en tipo1. Soporta registros mas grandes que el
bloque. Lo unico que falta es alinear a izquiera los registros del bloque
modificado (si hubiera registros a la derecha del registro borrado).
Hay algo en leer que falla y ademas hay un if ( cant_bloques == 0 ) que no me gusta, porque tendria que ser 1, pero con cero anda mejor ... ademas con bloques de 54 para abajo se cuelga, ni idea por que.. busco..
Bueno, por lo pronto parece que anda todo bien...
Faltaria dedicarle un tiempo de testing pero lo probe en la gui y se ve bastante cariñoso.
Espero que no falle.
Puede ser que queden cosas raras en el archivo de espacios libres. Pero en los otros queda todo pipon.
* Bugfix : se rellena con * antes de leer un registro de tipo
variable, asi cuando se pasa a registro fijo se ve lindo.
Prueba que hice con existo :
#> gui articulos.xml 1 333 2> /dev/null
Ir a Ver Registros
Ir a Mantenimiento -> Cambiar Archivo Articulos
Elejir tipo 3 (Tamaño de boque 222)
Ir a Ver Registros.
* Bugfix en tipo1 leer_raw que se estaba usando una variable
block_size salida de la galera y sin inicializar. Vuelve a andar
(falta agregar soporte multiples bloques)
* Bugfix en idx_get para saltar los registros no utilizados
* Bugfix en tipo 3 para mandar mensajes por stderr
* Agrego "compactar" en EMUFS
* Agrego en GUI menu mantenimiento, que implementa el compactar y
cambio de organizacion en archivos.
Este ultimo no esta andando bien, fallan los leer de todos los tipos de datos.
Como se puede ver en los archivos temporales, los .idx suelen quedar
vacios en algunos casos! ... hay que revisar bien esas cosas.
Se generaliza el algoritmo de leer_registro(). Ahora, al igual que
grabar_registro() no necesita tratar distinto un registro que ocupa mas de un
bloque.
Alan Kennedy [Fri, 16 Apr 2004 06:50:06 +0000 (06:50 +0000)]
Recompactacion Tipo 2 al 80%. Ya recompacta y toda la bola, lo unico que le falta es modificar los offsets en el indice (.idx), donde quedan los regs luego de la recompactacion. TODO tomorrow apenas toque casa.
hice unos pequeños cambios en fsc e idx pero no creo que afecte en nada a los otros tipos
-en fsc el agregar primero se fija si el bloque existe y si no existe lo agrega al final
-en idx... ya no me acuerdo que cambie.. puede ser que haya quedado igual..
* Al procesar se truncaba el tamaño del bloque para tipo1. Ahora
muestra el bloque entero como debe ser. Probe hasta con bloques de
5000 y al parece anda.
* Para tipo3 hay algo raro que no anda bien. No puedo poner bloques
de mas de 500, y siempre me aparece alguna basura luego de cada registro (tal
vez por la alineacion de memoria ?!)
por lo pronto parece que anda, hice un par de pruebas y anduvo jamon, pero me queda la duda si me esta devovliendo bien un nuevo id despues de haber borrado un registro, pero como en la gui anda no debe estar mal
* BUGFIXES en tipo3 :
- En grabar registro se estaba agregando a IDX el numero de bloque del ultimo
bloque ocupado en lugar del primero (para el caso de reg > block)
- El caso de cant_bloques == 1 decia cant_bloques == 0
* Se actualiza tipo3_leer_raw para leer registros de muchos bloques
* La GUI se pone al dia con tipo3 y ahora en pantalla se muestran correctamente
los registros que ocupan mas de 1 bloque (se pone <> para indicar el cambio de bloque)
Alan Kennedy [Thu, 15 Apr 2004 05:37:43 +0000 (05:37 +0000)]
emufs.h comente los campos de stats en doxy, fsc.h/c agregue la funcion para obtener la media de FSC (Nico usa esa y saca lo tuyo interno) y tambien la descomente/probe la funcion get_max_min_fsc que hizo nico. Me faltan de stats solo cantidad de registros y bytes de info de control (sale con la cant de registros). Pendiente porque cambia el API de IDX y al pedo hacerlo con lo de ahora.
Soporte para bloques pequeños en leer y guardar, falta borrar pero como estoy quemado lo dejo para mañana. Ademas mañana supongo que tendre que arreglar los cambios que se produzcan en idx y los demas, si es que hay. Por ahora no funciona con la gui el tema de los bloques chicos asi que no se molesten en probarlo, pero si en revisarlo. Adios
* Muestro el tipo de archivo que se esta mirando en Ver Registros
* Agrego otro parametro a la GUI : el tamaño de bloque. Ahora
si el archivo es T1 o T3 la GUI obliga a pasar por parametro
el tamaño de registro que se desea para la creacion del archivo.
* Se inicializa bloque en \0's al crear un nuevo bloque en tipo1
* Ver registros ahora sirve tanto para tipo1 como para tipo3 (tipo1 no puede
modificar ni borrar hasta que borrar_registro sea implementada)
* Ver registros completo!!. Ya se puede :
- hace altas, bajas y modificaciones del registro actualmente selecciondo
- Resalta el registro actual dentro del bloque al que pertenece
- Tiene GUI autoexplicada
* Agrego leer_registro_raw en EMUFS y para tipo3
* En tipo3 hago que cuando se crea un nuevo bloque se lo pone
todo en 0 (asi la GUI se ve mejor). Tambien arreglo un bug
en el que al borrar se estaba haciendo un desplazamiento de mas.
* Agrego un msg de advertencia a la GUI si se compila con -DDEBUG, para prevenir
al usuario de redirigir el flujo stderr a un archivo por posibles problemas
entre curses y fprintf
* Mejoro parser de opciones
* Se agregan a tipo123 los metodos emufs_tipoX_modificar_registro
* Se ajustan punteros dentro de EMUFS en los inicializar
* TODO : Tipo1 modificar no anda por faltante de tipo1_borrar!!
(lo pongo para que no esten como yo 1 hora sin saber por que
se cuelga :-D)
* Se hace una reestructuracion de algunas funciones para facilitar la edicion
de registros desde distintos puntos.
* Ahora se pueden modificar registros desde "Ver Registros" (y cambia on-the-fly!)
y desde Articulos->Modificar
* Si se esta en "Ver registro" y se presiona "e" se abre la ventana para editar los datos
de ese registro :-) ... claro que no guarda nada, porque ahora recien voy a editar
los tipo1,2,3 para agregarle un modificar_registro que solo llama a borrar y luego
a agregar.
* Ver Registro ahora desplaza y resalta los registros, valida movimiento
* GUI ahora toma algo de marametros :
-h Muestra ayuda
archivo.xml tipo <-- genera articulos a partir del XML y el archivo es de tipo "tipo"
NADA <- trata de leer el archivo existente.
Miren los registros para distintos tipo de archivos. Claro que tipo1 y 2 ni
se notan que son distintos, pero el tipo3 si hay muchos ***** :-D
* Agrego '*' al espacio no utilizado en los campos de los articulos cuando
grabo en tipo3, asi en el Ver registro no se mete basura y se ve mucho
mas lindo.
* Ver Registros muestra el primer registro de articulos en pantalla (con scrol!! Ojo, no valido!!).
Los campos numericos los transforma en string y los pone entre ( y ) y ademas
pone el caracter | como separador de campos.
Alan Kennedy [Mon, 12 Apr 2004 03:48:18 +0000 (03:48 +0000)]
Normalizacion de nomenclatura en FSC.c y TIPO2.c, ergo cambios requeridos en emufs.c que lo utiliza directo en ver archivo. Also fix a tipo1.c y tipo3.c dado el cambio del tipo EMUFS_TYPE a EMUFS_Tipo, para que compilen.
Alan Kennedy [Sun, 11 Apr 2004 20:27:01 +0000 (20:27 +0000)]
- emufs.c: Utilizacion de emufs_tipo2_inicializar, idem a lo que hizo luca con su tipo.
- tipo2.c | .h: Added funcion emufs_tipo2_leer_registro, por lo cual el tipo 2 ya se encuentra terminado. Also Added inicializador de punteros a funciones para la estructura EMUFS*, mencionado arriba.
- tipo2_main.c: Se agregaron algunos tests de leer registro, espacio libre, etc.
- Uso tipos EMUFS_XXX en los nuevos emufs_idx_xxx().
- Vuelvo a agregar chequeo de error sobre emufs_did_get_last().
- Agrego algunas 'b' al fopen() para compatibilidad ANSI.
- Saco (*err) = 0; en funciones (para la polémica). Inicializo variable error en
la GUI para que ande.
Ricky, el ultimo punto es para que veas como habia pensado yo lo de los errores.
Si sigue sin convencerte, lo dejamos como vos queres, no tengo ganas de seguir
peleando por esta boludez.
* BUGFIX : error de typo
* Ahora la GUI puede abrir archivos existentes. Si gui se ejecuta sin
parámetros va a abrir el archivo existente. Si se ejecuta pasandole
el parametro articulos.xml genera desde 0 el archivo de articulos.