void IxManager_Set_Folder_IMP(IndexManager *self, Folder *folder) { IndexManagerIVARS *const ivars = IxManager_IVARS(self); Folder *temp = ivars->folder; ivars->folder = (Folder*)INCREF(folder); DECREF(temp); }
String* IxManager_Make_Snapshot_Filename_IMP(IndexManager *self) { IndexManagerIVARS *const ivars = IxManager_IVARS(self); Folder *folder = (Folder*)CERTIFY(ivars->folder, FOLDER); DirHandle *dh = Folder_Open_Dir(folder, NULL); uint64_t max_gen = 0; if (!dh) { RETHROW(INCREF(Err_get_error())); } while (DH_Next(dh)) { String *entry = DH_Get_Entry(dh); if (Str_Starts_With_Utf8(entry, "snapshot_", 9) && Str_Ends_With_Utf8(entry, ".json", 5) ) { uint64_t gen = IxFileNames_extract_gen(entry); if (gen > max_gen) { max_gen = gen; } } DECREF(entry); } DECREF(dh); uint64_t new_gen = max_gen + 1; char base36[StrHelp_MAX_BASE36_BYTES]; StrHelp_to_base36(new_gen, &base36); return Str_newf("snapshot_%s.json", &base36); }
void IxManager_Set_Merge_Lock_Interval_IMP(IndexManager *self, uint32_t interval) { if (interval > INT32_MAX) { THROW(ERR, "Interval can't be greater than INT32_MAX: %u32", interval); } IxManager_IVARS(self)->merge_lock_interval = interval; }
void IxManager_Set_Merge_Lock_Timeout_IMP(IndexManager *self, uint32_t timeout) { if (timeout > INT32_MAX) { THROW(ERR, "Timeout can't be greater than INT32_MAX: %u32", timeout); } IxManager_IVARS(self)->merge_lock_timeout = timeout; }
void IxManager_Destroy_IMP(IndexManager *self) { IndexManagerIVARS *const ivars = IxManager_IVARS(self); DECREF(ivars->host); DECREF(ivars->folder); SUPER_DESTROY(self, INDEXMANAGER); }
Lock* IxManager_Make_Merge_Lock_IMP(IndexManager *self) { IndexManagerIVARS *const ivars = IxManager_IVARS(self); String *merge_lock_name = SSTR_WRAP_C("merge"); return (Lock*)LFLock_new(ivars->folder, merge_lock_name, ivars->host, (int32_t)ivars->merge_lock_timeout, (int32_t)ivars->merge_lock_interval, true); }
Lock* IxManager_Make_Merge_Lock_IMP(IndexManager *self) { IndexManagerIVARS *const ivars = IxManager_IVARS(self); String *merge_lock_name = SSTR_WRAP_C("merge"); LockFactory *lock_factory = S_obtain_lock_factory(self); return LockFact_Make_Lock(lock_factory, merge_lock_name, ivars->merge_lock_timeout, ivars->merge_lock_interval); }
Lock* IxManager_Make_Deletion_Lock_IMP(IndexManager *self) { IndexManagerIVARS *const ivars = IxManager_IVARS(self); String *lock_name = SSTR_WRAP_C("deletion"); LockFactory *lock_factory = S_obtain_lock_factory(self); return LockFact_Make_Lock(lock_factory, lock_name, (int32_t)ivars->deletion_lock_timeout, (int32_t)ivars->deletion_lock_interval); }
static LockFactory* S_obtain_lock_factory(IndexManager *self) { IndexManagerIVARS *const ivars = IxManager_IVARS(self); if (!ivars->lock_factory) { if (!ivars->folder) { THROW(ERR, "Can't create a LockFactory without a Folder"); } ivars->lock_factory = LockFact_new(ivars->folder, ivars->host); } return ivars->lock_factory; }
void IxManager_Write_Merge_Data_IMP(IndexManager *self, int64_t cutoff) { IndexManagerIVARS *const ivars = IxManager_IVARS(self); String *merge_json = SSTR_WRAP_C("merge.json"); Hash *data = Hash_new(1); bool success; Hash_Store_Utf8(data, "cutoff", 6, (Obj*)Str_newf("%i64", cutoff)); success = Json_spew_json((Obj*)data, ivars->folder, merge_json); DECREF(data); if (!success) { THROW(ERR, "Failed to write to %o", merge_json); } }
IndexManager* IxManager_init(IndexManager *self, String *host) { IndexManagerIVARS *const ivars = IxManager_IVARS(self); ivars->host = host ? Str_Clone(host) : Str_new_from_trusted_utf8("", 0); ivars->folder = NULL; ivars->write_lock_timeout = 1000; ivars->write_lock_interval = 100; ivars->merge_lock_timeout = 0; ivars->merge_lock_interval = 1000; return self; }
IndexManager* IxManager_init(IndexManager *self, String *host, LockFactory *lock_factory) { IndexManagerIVARS *const ivars = IxManager_IVARS(self); ivars->host = host ? Str_Clone(host) : Str_new_from_trusted_utf8("", 0); ivars->lock_factory = (LockFactory*)INCREF(lock_factory); ivars->folder = NULL; ivars->write_lock_timeout = 1000; ivars->write_lock_interval = 100; ivars->merge_lock_timeout = 0; ivars->merge_lock_interval = 1000; ivars->deletion_lock_timeout = 1000; ivars->deletion_lock_interval = 100; return self; }
Hash* IxManager_Read_Merge_Data_IMP(IndexManager *self) { IndexManagerIVARS *const ivars = IxManager_IVARS(self); String *merge_json = SSTR_WRAP_C("merge.json"); if (Folder_Exists(ivars->folder, merge_json)) { Hash *stuff = (Hash*)Json_slurp_json(ivars->folder, merge_json); if (stuff) { CERTIFY(stuff, HASH); return stuff; } else { return Hash_new(0); } } else { return NULL; } }
Lock* IxManager_Make_Snapshot_Lock_IMP(IndexManager *self, String *filename) { IndexManagerIVARS *const ivars = IxManager_IVARS(self); if (!Str_Starts_With_Utf8(filename, "snapshot_", 9) || !Str_Ends_With_Utf8(filename, ".json", 5) ) { THROW(ERR, "Not a snapshot filename: %o", filename); } // Truncate ".json" from end of snapshot file name. size_t lock_name_len = Str_Length(filename) - (sizeof(".json") - 1); String *lock_name = Str_SubString(filename, 0, lock_name_len); Lock *lock = (Lock*)LFLock_new(ivars->folder, lock_name, ivars->host, 1000, 100, false); DECREF(lock_name); return lock; }
bool IxManager_Remove_Merge_Data_IMP(IndexManager *self) { IndexManagerIVARS *const ivars = IxManager_IVARS(self); String *merge_json = SSTR_WRAP_C("merge.json"); return Folder_Delete(ivars->folder, merge_json) != 0; }
Folder* IxManager_Get_Folder_IMP(IndexManager *self) { return IxManager_IVARS(self)->folder; }
void IxManager_Set_Deletion_Lock_Timeout_IMP(IndexManager *self, uint32_t timeout) { IxManager_IVARS(self)->deletion_lock_timeout = timeout; }
void IxManager_Set_Deletion_Lock_Interval_IMP(IndexManager *self, uint32_t interval) { IxManager_IVARS(self)->deletion_lock_interval = interval; }
void IxManager_Set_Merge_Lock_Timeout_IMP(IndexManager *self, uint32_t timeout) { IxManager_IVARS(self)->merge_lock_timeout = timeout; }
void IxManager_Set_Merge_Lock_Interval_IMP(IndexManager *self, uint32_t interval) { IxManager_IVARS(self)->merge_lock_interval = interval; }
uint32_t IxManager_Get_Deletion_Lock_Interval_IMP(IndexManager *self) { return IxManager_IVARS(self)->deletion_lock_interval; }
uint32_t IxManager_Get_Deletion_Lock_Timeout_IMP(IndexManager *self) { return IxManager_IVARS(self)->deletion_lock_timeout; }
uint32_t IxManager_Get_Merge_Lock_Interval_IMP(IndexManager *self) { return IxManager_IVARS(self)->merge_lock_interval; }
uint32_t IxManager_Get_Merge_Lock_Timeout_IMP(IndexManager *self) { return IxManager_IVARS(self)->merge_lock_timeout; }
String* IxManager_Get_Host_IMP(IndexManager *self) { return IxManager_IVARS(self)->host; }