Fix page deletion logic
							parent
							
								
									f838445bed
								
							
						
					
					
						commit
						ebedf5619c
					
				|  | @ -102,7 +102,7 @@ YDB_Error ydb_next_page(YDB_Engine* instance); | |||
|  * | ||||
|  * @todo Possible error codes. | ||||
|  */ | ||||
| YDB_Error ydb_replace_page(YDB_Engine* instance, YDB_TablePage* page); | ||||
| YDB_Error ydb_replace_current_page(YDB_Engine* instance, YDB_TablePage* page); | ||||
| 
 | ||||
| /**
 | ||||
|  * @brief Appends a page to a table. | ||||
|  | @ -124,7 +124,7 @@ YDB_Error ydb_append_page(YDB_Engine* instance, YDB_TablePage* page); | |||
| YDB_TablePage* ydb_get_current_page(YDB_Engine* instance); | ||||
| 
 | ||||
| /**
 | ||||
|  * Delete current page. | ||||
|  * Delete current page and seek to the previous one. | ||||
|  * @param instance A YeltsinDB instance. | ||||
|  * @return Operation status. | ||||
|  */ | ||||
|  |  | |||
							
								
								
									
										12
									
								
								src/ydb.c
								
								
								
								
							
							
						
						
									
										12
									
								
								src/ydb.c
								
								
								
								
							|  | @ -46,7 +46,7 @@ void ydb_terminate_instance(YDB_Engine *instance) { | |||
| } | ||||
| 
 | ||||
| // Internal usage only!
 | ||||
| // Its only purpose to read page data and set next_page offset.
 | ||||
| // Its only purpose to read current page data and set next_page offset.
 | ||||
| // You should write prev_page offset on your own.
 | ||||
| inline YDB_Error __ydb_read_page(YDB_Engine *inst) { | ||||
|   THROW_IF_NULL(inst, YDB_ERR_INSTANCE_NOT_INITIALIZED); | ||||
|  | @ -308,7 +308,7 @@ YDB_Error ydb_append_page(YDB_Engine* instance, YDB_TablePage* page) { | |||
|   return YDB_ERR_SUCCESS; | ||||
| } | ||||
| 
 | ||||
| YDB_Error ydb_replace_page(YDB_Engine *instance, YDB_TablePage *page) { | ||||
| YDB_Error ydb_replace_current_page(YDB_Engine *instance, YDB_TablePage *page) { | ||||
|   THROW_IF_NULL(instance, YDB_ERR_INSTANCE_NOT_INITIALIZED); | ||||
|   THROW_IF_NULL(instance->in_use, YDB_ERR_INSTANCE_NOT_IN_USE); | ||||
|   THROW_IF_NULL(page, YDB_ERR_PAGE_NOT_INITIALIZED); | ||||
|  | @ -341,6 +341,7 @@ YDB_Error ydb_replace_page(YDB_Engine *instance, YDB_TablePage *page) { | |||
| } | ||||
| 
 | ||||
| YDB_Error ydb_delete_current_page(YDB_Engine *instance) { | ||||
|   // TODO check if it's only page in table
 | ||||
|   THROW_IF_NULL(instance, YDB_ERR_INSTANCE_NOT_INITIALIZED); | ||||
|   THROW_IF_NULL(instance->in_use, YDB_ERR_INSTANCE_NOT_IN_USE); | ||||
| 
 | ||||
|  | @ -351,7 +352,6 @@ YDB_Error ydb_delete_current_page(YDB_Engine *instance) { | |||
|   // Write last_free_page_offset as the next page for current one
 | ||||
|   fwrite(&(instance->last_free_page_offset), sizeof(YDB_Offset), 1, instance->fd); | ||||
| 
 | ||||
| 
 | ||||
|   // Link the previous page with next one (could be null ptr)
 | ||||
|   fseek(instance->fd, instance->prev_page_offset + 1, SEEK_SET); // Skip flags
 | ||||
|   fwrite(&(instance->next_page_offset), sizeof(YDB_Offset), 1, instance->fd); | ||||
|  | @ -369,5 +369,11 @@ YDB_Error ydb_delete_current_page(YDB_Engine *instance) { | |||
|   // Flush buffer
 | ||||
|   fflush(instance->fd); | ||||
| 
 | ||||
|   // Set previous page
 | ||||
|   int64_t ind = --(instance->current_page_index); | ||||
|   if (ydb_seek_page(instance, ind + 1)) { | ||||
|     return YDB_ERR_UNKNOWN; | ||||
|   } | ||||
| 
 | ||||
|   return YDB_ERR_SUCCESS; | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue