feat(lsm): implement basic remove
							parent
							
								
									51e4a203e9
								
							
						
					
					
						commit
						b40389bbe2
					
				|  | @ -20,18 +20,13 @@ int main() { | |||
| 
 | ||||
|   lsm_str *attr; | ||||
|   lsm_str_init_copy(&attr, "some attribute value"); | ||||
|   lsm_entry_attr_insert(handle, lsm_attr_type_content_type, attr); | ||||
|   lsm_entry_attr_insert(handle, 1, attr); | ||||
| 
 | ||||
|   lsm_str *data; | ||||
|   lsm_str_init_copy(&data, "hello"); | ||||
| 
 | ||||
|   for (int i = 0; i < 50; i++) { | ||||
|     lsm_entry_data_append(store, handle, data); | ||||
|   } | ||||
| 
 | ||||
|   if (lsm_entry_sync(store, handle) != lsm_error_ok) { | ||||
|     printf("godver"); | ||||
|     return 1; | ||||
|     lsm_entry_data_append(handle, data); | ||||
|   } | ||||
|   lsm_entry_close(handle); | ||||
| 
 | ||||
|  | @ -50,4 +45,12 @@ int main() { | |||
|     total += read; | ||||
|   } | ||||
|   printf("\n%lu", total); | ||||
| 
 | ||||
|   lsm_entry_close(handle); | ||||
| 
 | ||||
|   assert(lsm_store_open_write(&handle, store, key) == lsm_error_ok); | ||||
|   lsm_entry_remove(handle); | ||||
|   lsm_entry_close(handle); | ||||
| 
 | ||||
|   assert(lsm_store_open_read(&handle, store, key) == lsm_error_not_found); | ||||
| } | ||||
|  |  | |||
|  | @ -176,6 +176,13 @@ void lsm_entry_close(lsm_entry_handle *handle); | |||
| lsm_error lsm_store_insert(lsm_entry_handle **out, lsm_store *store, | ||||
|                            lsm_str *key); | ||||
| 
 | ||||
| /**
 | ||||
|  * Mark the entry as removed. | ||||
|  * | ||||
|  * @param handle handle to entry to remove | ||||
|  */ | ||||
| void lsm_entry_remove(lsm_entry_handle *handle); | ||||
| 
 | ||||
| /**
 | ||||
|  * Append new data to the given entry, which is expected to be in the store. | ||||
|  * | ||||
|  |  | |||
|  | @ -40,6 +40,13 @@ typedef struct lsm_entry { | |||
|  */ | ||||
| lsm_error lsm_entry_init(lsm_entry **ptr); | ||||
| 
 | ||||
| /**
 | ||||
|  * Deallocate an existing entry | ||||
|  * | ||||
|  * @param entry pointer to entry | ||||
|  */ | ||||
| void lsm_entry_free(lsm_entry *entry); | ||||
| 
 | ||||
| /**
 | ||||
|  * Deallocate an existing lsm_entry object. | ||||
|  * | ||||
|  |  | |||
|  | @ -158,6 +158,10 @@ lsm_error lsm_store_insert(lsm_entry_handle **out, lsm_store *store, | |||
|   return lsm_error_ok; | ||||
| } | ||||
| 
 | ||||
| void lsm_entry_remove(lsm_entry_handle *handle) { | ||||
|   handle->states |= lsm_entry_handle_state_removed; | ||||
| } | ||||
| 
 | ||||
| lsm_error lsm_entry_data_append(lsm_entry_handle *handle, lsm_str *data) { | ||||
|   if (lsm_str_len(data) == 0) { | ||||
|     return lsm_error_ok; | ||||
|  |  | |||
|  | @ -124,3 +124,28 @@ lsm_error lsm_entry_disk_insert(lsm_entry_handle *handle) { | |||
| 
 | ||||
|   return res; | ||||
| } | ||||
| 
 | ||||
| // Marking an entry as removed in the idx file is simply setting the length of
 | ||||
| // its entry to zero
 | ||||
| lsm_error lsm_entry_disk_remove(lsm_entry_handle *handle) { | ||||
|   lsm_store *store = handle->store; | ||||
|   lsm_entry *entry = handle->wrapper->entry; | ||||
| 
 | ||||
|   pthread_mutex_lock(&store->idx.lock); | ||||
| 
 | ||||
|   lsm_error res = | ||||
|       lsm_fseek(store->idx.f, entry->idx_file_offset + sizeof(uint64_t)); | ||||
| 
 | ||||
|   if (res != lsm_error_ok) { | ||||
|     pthread_mutex_unlock(&store->idx.lock); | ||||
| 
 | ||||
|     return res; | ||||
|   } | ||||
| 
 | ||||
|   uint64_t val = 0; | ||||
|   res = lsm_fwrite(NULL, store->idx.f, sizeof(uint64_t), 1, &val); | ||||
| 
 | ||||
|   pthread_mutex_unlock(&store->idx.lock); | ||||
| 
 | ||||
|   return res; | ||||
| } | ||||
|  |  | |||
|  | @ -19,6 +19,14 @@ lsm_error lsm_entry_init(lsm_entry **ptr) { | |||
|   return lsm_error_ok; | ||||
| } | ||||
| 
 | ||||
| void lsm_entry_free(lsm_entry *entry) { | ||||
|   if (entry->attrs.count > 0) { | ||||
|     free(entry->attrs.items); | ||||
|   } | ||||
| 
 | ||||
|   free(entry); | ||||
| } | ||||
| 
 | ||||
| lsm_error lsm_entry_wrapper_init(lsm_entry_wrapper **ptr) { | ||||
|   lsm_entry_wrapper *wrap = calloc(1, sizeof(lsm_entry_wrapper)); | ||||
| 
 | ||||
|  | @ -58,7 +66,10 @@ void lsm_entry_close(lsm_entry_handle *handle) { | |||
|     lsm_entry_disk_insert(handle); | ||||
|   } else if ((handle->states & lsm_entry_handle_state_removed) && | ||||
|              !(handle->states & lsm_entry_handle_state_new)) { | ||||
|     /* lsm_entry_disk_remove(handle); */ | ||||
|     lsm_entry_disk_remove(handle); | ||||
| 
 | ||||
|     lsm_entry_free(handle->wrapper->entry); | ||||
|     handle->wrapper->entry = NULL; | ||||
|   } else if (handle->states & lsm_entry_handle_state_updated) { | ||||
|     /* lsm_entry_disk_update(handle); */ | ||||
|   } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue