scaling_bloom_t *new_scaling_bloom(unsigned int capacity, double error_rate, const char *filename) { scaling_bloom_t *bloom; counting_bloom_t *cur_bloom; int fd; if ((fd = open(filename, O_RDWR | O_CREAT | O_TRUNC, (mode_t)0600)) < 0) { perror("Error, Opening File Failed"); fprintf(stderr, " %s \n", filename); return NULL; } bloom = scaling_bloom_init(capacity, error_rate, filename, fd); if (!(cur_bloom = new_counting_bloom_from_scale(bloom))) { fprintf(stderr, "Error, Could not create counting bloom\n"); free_scaling_bloom(bloom); return NULL; } cur_bloom->header->count = 0; cur_bloom->header->id = 0; bloom->header->mem_seqnum = 1; return bloom; }
scaling_bloom_t *new_scaling_bloom_from_file(unsigned int capacity, double error_rate, const char *filename) { int fd; off_t size; uint64_t id; unsigned int count, offset; scaling_bloom_t *bloom; counting_bloom_t *cur_bloom; if ((fd = open(filename, O_RDWR, (mode_t)0600)) < 0) { fprintf(stderr, "Error, Could not open file %s with open: \n", filename); perror(""); return NULL; } if ((size = lseek(fd, 0, SEEK_END)) < 0) { perror("Error, calling lseek() to tell file size"); close(fd); return NULL; } if (size == 0) { fprintf(stderr, "Error, File size zero\n"); } bloom = scaling_bloom_init(capacity, error_rate, filename, fd); offset = sizeof(scaling_bloom_header_t); size -= offset; while (size) { id = ((counting_bloom_header_t *)(bloom->bitmap->array + offset))->id; count = ((counting_bloom_header_t *)(bloom->bitmap->array + offset))->count; cur_bloom = new_counting_bloom_from_scale(bloom, id, count); size -= cur_bloom->num_bytes; offset += cur_bloom->num_bytes; if (size < 0) { free_scaling_bloom(bloom); fprintf(stderr, "Error, Actual filesize and expected filesize are not equal\n"); return NULL; } } return bloom; }
scaling_bloom_t *new_scaling_bloom_from_file(unsigned int capacity, double error_rate, const char *filename) { int fd; off_t size; scaling_bloom_t *bloom; counting_bloom_t *cur_bloom; if ((fd = open(filename, O_RDWR, (mode_t)0600)) < 0) { fprintf(stderr, "Error, Could not open file %s: %s\n", filename, strerror(errno)); return NULL; } if ((size = lseek(fd, 0, SEEK_END)) < 0) { perror("Error, calling lseek() to tell file size"); close(fd); return NULL; } if (size == 0) { fprintf(stderr, "Error, File size zero\n"); } bloom = scaling_bloom_init(capacity, error_rate, filename, fd); size -= sizeof(scaling_bloom_header_t); while (size) { cur_bloom = new_counting_bloom_from_scale(bloom); // leave count and id as they were set in the file size -= cur_bloom->num_bytes; if (size < 0) { free_scaling_bloom(bloom); fprintf(stderr, "Error, Actual filesize and expected filesize are not equal\n"); return NULL; } } return bloom; }