MBArray * mbarray_Copy_Template(MBArray * src, char * filename, int perms) { int header_len = mbarray_HeaderLen(src); char * header; if (header_len < 0) { return NULL; } if (!strcmp(filename, src->filename)) { errno = EINVAL; return NULL; } header = (char *)malloc(header_len + 1); if (header == NULL) { errno = ENOMEM; return NULL; } if (mbarray_Header(header, src, header_len) == NULL) { free(header); return NULL; } return mbarray_Create( src->bits, filename, header, header_len, O_CREAT | O_RDWR, perms); }
int bloomfilter_Update(BloomFilter * bf, char * data, int size) { MBArray * array = bf->array; int retval = mbarray_Update(bf->array, data, size); if (retval) { return retval; } if (mbarray_Header((char *)bf, array, sizeof(BloomFilter)) == NULL) { return 1; } bf->array = array; return 0; }
BloomFilter *bloomfilter_Create(size_t max_num_elem, double error_rate, const char * file, BTYPE num_bits, int oflags, int perms, int *hash_seeds, int num_hashes) { BloomFilter * bf = (BloomFilter *)malloc(sizeof(BloomFilter)); MBArray * array; if (!bf) { return NULL; } bf->max_num_elem = max_num_elem; bf->error_rate = error_rate; bf->num_hashes = num_hashes; bf->count_correct = 1; bf->bf_version = BF_CURRENT_VERSION; bf->elem_count = 0; memset(bf->reserved, sizeof(uint32_t) * 32, 0); memset(bf->hash_seeds, sizeof(uint32_t) * 256, 0); memcpy(bf->hash_seeds, hash_seeds, sizeof(uint32_t) * num_hashes); array = mbarray_Create(num_bits, file, (char *)bf, sizeof(BloomFilter), oflags, perms); if (!array) { bloomfilter_Destroy(bf); return NULL; } /* After we create the new array object, this array may already have all of the bloom filter data from the file in the header info. By calling mbarray_Header, we copy that header data back into this BloomFilter object. */ if (mbarray_Header((char *)bf, array, sizeof(BloomFilter)) == NULL) { bloomfilter_Destroy(bf); mbarray_Destroy(array); return NULL; } /* Since we just initialized from a file, we have to fix our pointers */ bf->array = array; return bf; }
BloomFilter * bloomfilter_Copy_Template(BloomFilter * src, char * filename, int perms) { BloomFilter * bf = (BloomFilter *)malloc(sizeof(BloomFilter)); MBArray * array; if (bf == NULL) { return NULL; } array = mbarray_Copy_Template(src->array, filename, perms); if (array == NULL) { free(bf); return NULL; } if (mbarray_Header((char *)bf, array, sizeof(BloomFilter)) == NULL) { bloomfilter_Destroy(bf); mbarray_Destroy(array); return NULL; } bf->array = array; return bf; }