int main(int argc, char* argv[]){ MODE mode = WRITE; TArchivo* arch; if(argc >= 2){ if(!strcmp(argv[1], "-r")) mode = READ; } arch = Archivo_crear(TEST_PATH, BLOQUE_SIZE); switch(mode){ case READ:{ Archivo_bloque_leer(arch); uint8_t *buf; size_t size; while((buf = Archivo_get_buf(arch, &size))){ printf("%u '%s'\n", size, (char*) buf); free(buf); } break; } default:{ printf("Escribiendo\n"); int i = 0; for(i=0;i<TEST_STRING_LENGTH; i++){ if(! Archivo_agregar_buf(arch, (uint8_t*) strings[i], strlen(strings[i])+1)) printf("%d Pude agregar\n", i); } Archivo_flush(arch); break; } } Archivo_destruir(arch); return 0; }
int listado(int argc, char* argv[]) { uint8_t *buf; size_t size; TArchivo* arch; char path[512]; TEntidad* entidad; strcpy(path, argv[2]); strcat(path, ".dat"); arch = Archivo_crear(path, SIZE_BLOQUE); Archivo_bloque_leer(arch); while((buf = Archivo_get_buf(arch, &size))) { entidad = (TEntidad*) buf; printf("%u '%d,%s'\n", size, entidad->id, entidad->entidad); free(buf); } Archivo_destruir(arch); return 0; }
int busqueda(int argc, char* argv[]) { uint8_t *buf; size_t size; TArchivo* arch; char path[512]; TEntidad* entidad; int id; if(argc < 4) { printf("Argumentos invalidos\n"); return 1; } id = (int) atoi(argv[2]); strcpy(path, argv[3]); strcat(path, ".dat"); arch = Archivo_crear(path, SIZE_BLOQUE); Archivo_bloque_leer(arch); while((buf = Archivo_get_buf(arch, &size))) { entidad = (TEntidad*) buf; if(entidad->id == id) { printf("%u '%d,%s'\n", size, entidad->id, entidad->entidad); free(buf); break; } free(buf); } Archivo_destruir(arch); return 0; }
int replacememt_selection(char* in_file, char* tmp_name, size_t block_size, size_t array_size, TSortExternFunction cmp){ TArchivo *in, *arch_tmp; void** tmp_array; unsigned int pasada = 0; uint8_t *buf; size_t buf_size=0, largo_actual = 0, offset = 0;; char path[255] = {0}; //TArchivoReg* arch_tmp; TSortHelper *last = NULL; if(!in_file || !tmp_name || !block_size || !array_size) return 1; tmp_array = (void**) calloc(array_size, sizeof(void*)); sprintf(path, tmp_name, pasada); //arch_tmp = ArchivoReg_crear(path); arch_tmp = Archivo_crear(path, block_size); in = Archivo_crear(in_file, block_size); Archivo_bloque_leer(in); while( (buf = Archivo_get_buf(in, &buf_size)) ){ TSortHelper* tmp_sort = (TSortHelper*) calloc(1, sizeof(TSortHelper)); tmp_sort->size = buf_size; tmp_sort->buf = buf; tmp_sort->cmp = cmp; if(largo_actual >= array_size - offset){ if(last){ free(last->buf); free(last); } // El orden que se genera es de mayor a menor heapsort(tmp_array, largo_actual, &sort_helper_cmp); last = tmp_array[largo_actual-1]; //ArchivoReg_escribir(arch_tmp, last->buf, last->size); Archivo_agregar_buf(arch_tmp, last->buf, last->size); tmp_array[largo_actual-1] = NULL; largo_actual--; } if(last != NULL && cmp(last->buf, last->size, tmp_sort->buf, tmp_sort->size) < 0 ){ //El ultimo que se escribio en archivo es mayor al que se quiere escribir offset++; tmp_array[array_size-offset] = tmp_sort; if(offset == array_size){ //Ya esta todo dormido. Creo archivo nuevo //ArchivoReg_destruir(arch_tmp); Archivo_flush(arch_tmp); Archivo_destruir(arch_tmp); sprintf(path, tmp_name, ++pasada); //arch_tmp = ArchivoReg_crear(path); arch_tmp = Archivo_crear(path, block_size); offset = 0; largo_actual = array_size; } }else tmp_array[largo_actual++] = tmp_sort; } Archivo_destruir(in); free(last->buf); free(last); // Escribir las cosas que qedaron en el buffer a disco if(largo_actual){ size_t largo = largo_actual; heapsort(tmp_array, largo, &sort_helper_cmp); while(largo){ last = tmp_array[--largo]; //ArchivoReg_escribir(arch_tmp, last->buf, last->size); Archivo_agregar_buf(arch_tmp, last->buf, last->size); free(last->buf); free(last); } } //ArchivoReg_destruir(arch_tmp); Archivo_flush(arch_tmp); Archivo_destruir(arch_tmp); // Escribo los que quedaron dormidos en un nuevo archivo if(offset){ //void **offset_array = tmp_array + sizeof(void*) * largo_actual; void **offset_array = tmp_array + largo_actual; sprintf(path, tmp_name, ++pasada); //arch_tmp = ArchivoReg_crear(path); arch_tmp = Archivo_crear(path, block_size); heapsort(offset_array, offset, &sort_helper_cmp); while(offset){ last = offset_array[--offset]; //ArchivoReg_escribir(arch_tmp, last->buf, last->size); Archivo_agregar_buf(arch_tmp, last->buf, last->size); free(last->buf); free(last); } //ArchivoReg_destruir(arch_tmp); Archivo_flush(arch_tmp); Archivo_destruir(arch_tmp); } free(tmp_array); return pasada; }