int emufs_tipo1_insertar_ordenado(EMUFS *emu, void *ptr, EMUFS_REG_SIZE size, int *err)
{
- CLAVE clave;
+ CLAVE clave, menor_clave_bloque_nuevo;
EMUFS_BLOCK_ID num_bloque;
EMUFS_TIPO1_REG_HEADER header;
EMUFS_REG_SIZE tam_reg, move_size;
int cant_reg, i, result, dif;
/*le asigno un posible numero de bloque para el caso en que no encuentre donde meterlo*/
- 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;
/*en teoria el nuevo registro no debe cambiar el ancla, por lo cual no actualizo el arbol*/
free(bloque);
return 0;
- /*aca va lo que saque*/
} else { /* el registro no entra en el bloque, hay que crear uno nuevo y desparramar */
PERR(" COMO NO ENTRA DEBO DIVIDIR LOS REGISTROS EN 2 BLOQUES");
new_bloque = (char*)malloc(emu->tam_bloque);
move_size=0;
+ aux = bloque;
for(i=0; i<cant_reg/2; i++){ /*copio mitad aca y mitad en el nuevo*/
/*avanzo*/
memcpy(&tam_reg, aux+sizeof(EMUFS_REG_ID), sizeof(EMUFS_REG_SIZE));
move_size += sizeof(EMUFS_TIPO1_REG_HEADER)+tam_reg;
}
PERR("ME MOVI LA MITAD DE LOS REGISTROS");
- /*copio el resto del bloque al nuevo bloque*/
- memcpy(new_bloque, aux, emu->tam_bloque-move_size);
+ /*copio el resto del bloque al nuevo bloque*/ /*footer ¿?*/
+ memcpy(new_bloque, aux, emu->tam_bloque-move_size/*-sizeof(int)*/);
/*borro lo que sobra en el bloque original, guardando el footer*/
memset(aux, 0, emu->tam_bloque - move_size - sizeof(int));
- /*actualizo la cant de registros (footer)*/
+ /*actualizo la cant de registros del bloque original (footer)*/
+ i++; /* 0 a n hay n+1 */
memcpy(bloque+emu->tam_bloque-sizeof(int), &i, sizeof(int));
- PERR("PASE");
- /*grabo el bloque original*/
- printf("voya a grabar en bloque: %d\n", num_bloque);
- emufs_tipo1_grabar_bloque_fsc(emu, bloque, num_bloque, EMUFS_NOT_FOUND, err);
- PERR("GRABE EL BLOQUE 1 de 2");
/*actualizo el footer del nuevo bloque*/
dif = cant_reg - i; /*por las dudas*/
- memcpy(new_bloque+emu->tam_bloque, &dif, sizeof(int));
- /*genero un nuevo espacio para un bloque en el archivo y lo cargo en query
- la clave ya estaba en query desde antes*/
- query.num_bloque = emufs_create_new_block(emu);
- /*inserto el nuevo registro en el nuevo bloque y obtengo la clave del menor*/
- clave = grabar_ordenado_en_bloque(emu,ptr,size,new_bloque,query.num_bloque, emu->tam_bloque-move_size,err);
+ memcpy(new_bloque+emu->tam_bloque-sizeof(int), &dif, sizeof(int));
+ menor_clave_bloque_nuevo = emufs_indice_generar_clave(emu->indices, new_bloque+sizeof(EMUFS_TIPO1_REG_HEADER));
+ /* TENGO QUE VER EN CUAL DE LOS DOS BLOQUES METO EL REGISTRO NUEVO */
+ if ( emufs_indice_es_menor(emu->indices, menor_clave_bloque_nuevo, clave) ){
+ /*genero un nuevo espacio para un bloque en el archivo y lo cargo en queryla clave ya estaba en query desde antes*/
+ query.num_bloque = emufs_create_new_block(emu);
+ printf("numero de bloque nuevo: %d\n", query.num_bloque);
+ /*inserto el nuevo registro en el nuevo bloque y obtengo la clave del menor*/
+ clave = grabar_ordenado_en_bloque(emu,ptr,size,new_bloque,query.num_bloque, emu->tam_bloque-move_size,err);
+ /*actualizo el arbol con la nueva clave*/
+ query.clave = clave;
+ emufs_b_plus_insertar(emu->indices, &query);
+ /*grabo el bloque original*/
+ printf("numero de bloque viejo: %d\n", num_bloque);
+ emufs_tipo1_grabar_bloque_fsc(emu, bloque, num_bloque, EMUFS_NOT_FOUND, err);
+ } else {
+ /*grabo el bloque nuevo*/
+ query.num_bloque = emufs_create_new_block(emu);
+ printf("numero de bloque nuevo: %d\n", query.num_bloque);
+ emufs_tipo1_grabar_bloque_fsc(emu, new_bloque, emufs_create_new_block(emu), EMUFS_NOT_FOUND, err);
+ printf("numero de bloque viejo %d\n", num_bloque);
+ grabar_ordenado_en_bloque(emu,ptr,size,bloque,query.num_bloque, fs-move_size,err);
+
+ }
if(*err != 0){
PERR("NO SE PUDO GRABAR ORDENADO");
free(new_bloque);
free(bloque);
return -1;
}
- /*actualizo el arbol con la nueva clave*/
- emufs_b_plus_insertar(emu->indices, &query);
free(new_bloque);
free(bloque);
return 0;
EMUFS_REG_SIZE len;
int err=0;
- texto="PARTE CONSTANTE, clave =";
-
emu = emufs_crear("test",T1,512,0);
emufs_agregar_indice(emu,"claveidx",IND_PRIMARIO,IND_B_PLUS,IDX_INT,strlen(texto),tam_nodo);
+
+ texto = "PARTE COSNSTANTE, clave =";
/*REGISTRO 1*/
clave.i_clave = 77;
texto2="termina el texto re bonito CLAVE = 77";
PERR("REGISTRO 2 GRABADO");
free(r);
-/*REGISTRO 3*/
+/*REGISTRO 3
texto2="Este es el fin del registro tres, puse tres en numero para que sea mas largo el texto CLAVE = 95";
clave.i_clave = 95;
r = cargar_registro(texto, strlen(texto), clave, texto2, strlen(texto2));
PERR("REGISTRO 3 GRABADO");
free(r);
-/*REGISTRO 4*/
+/*REGISTRO 4
texto2="REGISTRO CUATRO CLAVE = 99";
clave.i_clave = 99;
r = cargar_registro(texto, strlen(texto), clave, texto2, strlen(texto2));
PERR("REGISTRO 4 GRABADO");
free(r);
-/*REGISTRO 5*/
+/*REGISTRO 5
texto2="el quinto registro tiene un largo promedio como para entrar en el bloque CLAVE = 102";
clave.i_clave = 102;
r = cargar_registro(texto, strlen(texto), clave, texto2, strlen(texto2));
free(r);
/*REGISTRO 6*/
- texto2="El registro 6 no entra CLAVE = 106";
+/* texto2="El registro 6 no entra CLAVE = 106";
clave.i_clave = 106;
r = cargar_registro(texto, strlen(texto), clave, texto2, strlen(texto2));
imprimir_reg(r, strlen(texto), strlen(texto)+strlen(texto2)+sizeof(CLAVE));
PERR("REGISTRO 6 GRABADO");
free(r);
emufs_destruir(emu);
-
+*/
return 0;
}