#CFLAGS=-Wall -g -pedantic -DDEBUG
#LDFLAGS=-lm
-EMUFS_COMMON=emufs.o tipo1.o tipo2.o tipo3.o idx.o did.o fsc.o common.o indices.o indice_b.o indice_bplus.o
+EMUFS_COMMON=emufs.o tipo1.o tipo2.o tipo3.o idx.o did.o fsc.o common.o indices.o indice_b.o indice_bplus.o
-TARGETS=libemufs.a tipo1_main tipo2_main tipo3_main b_plus_test
+TARGETS=libemufs.a tipo1_main tipo2_main tipo3_main b_plus_test tipo1_bplus_main
all: $(TARGETS)
b_plus_test: b_plus_test.o $(EMUFS_COMMON)
+tipo1_bplus_main: tipo1_bplus_main.o $(EMUFS_COMMON)
+
#b_plus_test: b_plus_test.o b_plus.o indices.o emufs.o
#b_test: b_test.o indice_b.o
strcat(name, EMUFS_DID_EXT);
return emufs_common_get_file_size(name, err);
}
-
PERR("NO SE PUDO ABRIR EL ARCHIVO");
return -1;
}
-
+
dummy = (char*)malloc(emu->tam_bloque);
memset(dummy, 0, emu->tam_bloque);
fwrite(dummy, emu->tam_bloque, 1, fp);
+ printf("new_block ftell = %d\n", ftell(fp));
switch(emu->tipo){
- case T1: num = (ftell(fp)-sizeof(EMUFS_Tipo)+sizeof(EMUFS_BLOCK_SIZE))/emu->tam_bloque;
+ case T1: num = (ftell(fp)-sizeof(EMUFS_Tipo)-sizeof(EMUFS_BLOCK_SIZE))/emu->tam_bloque;
break;
- case T3: num = (ftell(fp)-sizeof(EMUFS_Tipo)+sizeof(EMUFS_BLOCK_SIZE)+sizeof(EMUFS_REG_SIZE))/emu->tam_bloque;
+ case T3: num = (ftell(fp)-sizeof(EMUFS_Tipo)-sizeof(EMUFS_BLOCK_SIZE)-sizeof(EMUFS_REG_SIZE))/emu->tam_bloque;
}
fclose(fp);
free(dummy);
- return num;
+ return num-1;
}
/*devuelve un numero de bloque siguiente al ultimo*/
{
FILE *fp;
char name[255];
- EMUFS_BLOCK_ID num;
+ EMUFS_BLOCK_ID num=0;
/* obtengo nombre del archivo */
strcpy(name, emu->nombre);
strcat(name,".dat");
-
- if ( (fp=fopen(name,"a+")) == NULL ){
+ if ( (fp=fopen(name,"r")) == NULL ){
PERR("NO SE PUDO ABRIR EL ARCHIVO");
return -1;
}
+ if ( fseek(fp, 0, SEEK_END)!=0 ){
+ PERR("NO PUDE HACER EL SEEK");
+ return -1;
+ }
switch(emu->tipo){
- case T1: num = (ftell(fp)-sizeof(EMUFS_Tipo)+sizeof(EMUFS_BLOCK_SIZE))/emu->tam_bloque;
+ case T1: num = (ftell(fp)-sizeof(EMUFS_Tipo)-sizeof(EMUFS_BLOCK_SIZE))/emu->tam_bloque;
+ if (ftell(fp) == sizeof(EMUFS_Tipo)+sizeof(EMUFS_BLOCK_SIZE)) num = 0;
+ PERR("PASE");
break;
- case T3: num = (ftell(fp)-sizeof(EMUFS_Tipo)+sizeof(EMUFS_BLOCK_SIZE)+sizeof(EMUFS_REG_SIZE))/emu->tam_bloque;
+ case T3: num = (ftell(fp)-sizeof(EMUFS_Tipo)-sizeof(EMUFS_BLOCK_SIZE)-sizeof(EMUFS_REG_SIZE))/emu->tam_bloque;
+ if (ftell(fp) == sizeof(EMUFS_Tipo)+sizeof(EMUFS_BLOCK_SIZE)+sizeof(EMUFS_REG_SIZE)) num = 0;
}
fclose(fp);
- return num+1;
+ return num;
}
INDICE *emufs_buscar_indice_por_nombre(EMUFS *emu, const char *nombre)
}
return tmp;
}
-
strcat(name, EMUFS_IDX_EXT);
return emufs_common_get_file_size(name, err);
}
-
break;
case IND_B_PLUS:
/* llenar metodos */
+ /* hacer que la cantidad de claves quede par o impar, no me acuerdo (SAGAR)!!!*/
PERR("Creando indice con Arbol B+");
tmp->size_claves = (tmp->tam_bloque - SIZE_B_PLUS_HEADER - sizeof(CLAVE))/2;
tmp->size_hijos = tmp->size_claves + sizeof(CLAVE);
free(leido);
}
}
-
int emufs_tipo1_insertar_ordenado(EMUFS *emu, void *ptr, EMUFS_REG_SIZE size, int *err)
{
CLAVE clave;
- EMUFS_BLOCK_ID num_bloque = emufs_get_new_block_number(emu);
+ EMUFS_BLOCK_ID num_bloque;
EMUFS_TIPO1_REG_HEADER header;
EMUFS_REG_SIZE tam_reg, move_size;
INDEX_DAT query;
int cant_reg, i, result, dif;
/*le asigno un posible numero de bloque para el caso en que no encuentre donde meterlo*/
- query.num_bloque = num_bloque;
+ PERR("LEO EL NUMERO DE BLOQUE SIGUIENTE");
+ num_bloque = emufs_get_new_block_number(emu);
+ query.num_bloque = num_bloque;
+ printf("BLOQUE NUMBER : %d\n", num_bloque);
/*saco la clave del stream*/
query.clave = emufs_indice_generar_clave(emu->indices, ptr);
/*mando a buscar en el arbol el bloque correspondiente a esa clave*/
1 = Error de lectura en algun nodo, abortar operacion en funcion invocante.
*/
result = emufs_b_plus_get_bloque(emu->indices, &query, 0);
+ printf("tengo que guardar en bloque: %d\n", query.num_bloque);
if (result == 1){
PERR("SE PRODUJO UN ERROR EN EL ARBOL.. ABORTANDO");
return -1;
return -1;
}
header.id = emufs_idx_get_new_id(emu, err);
+ if (*err) {
+ PERR("NO SE PUDO OBTENER UN ID");
+ free(bloque);
+ return -1;
+ }
header.size = size;
cant_reg = 1;
/*pongo la cabecera en el registro*/
fs -= (tam_reg+sizeof(EMUFS_TIPO1_REG_HEADER));
} /*aca deberia estar apuntando al final de los registros. espacio libre*/
fs -= sizeof(int); /*footer*/
- if ( fs >= size+sizeof(EMUFS_TIPO1_REG_HEADER) ){ /* puedo meter el registro en este bloque*/
+ if ( fs >= size+sizeof(EMUFS_TIPO1_REG_HEADER) ){ /* puedo meter el registro en este bloque*/
+ PERR("GRABO ORDENADO");
grabar_ordenado_en_bloque(emu, ptr, size, bloque, query.num_bloque, fs, err);
/*en teoria el nuevo registro no debe cambiar el ancla, por lo cual no actualizo el arbol*/
return 0;
}
/*grabo el bloque en el archivo*/
new_bloque = aux; /*apunto al principio del bloque*/
+ memcpy(new_bloque+emu->tam_bloque-sizeof(int), &cant_reg, sizeof(int));
emufs_tipo1_grabar_bloque_fsc(emu, new_bloque, num_bloque, EMUFS_NOT_FOUND, err);
clave = emufs_indice_generar_clave(emu->indices, new_bloque+sizeof(EMUFS_TIPO1_REG_HEADER));
free(new_bloque);
/** \file
*
- * Prueba de archivo \ref tipo3.h "tipo3".
+ * Prueba de archivo \ref tipo1.h "tipo1".
*
*/