Fix page deletion logic
							parent
							
								
									f838445bed
								
							
						
					
					
						commit
						ebedf5619c
					
				|  | @ -102,7 +102,7 @@ YDB_Error ydb_next_page(YDB_Engine* instance); | ||||||
|  * |  * | ||||||
|  * @todo Possible error codes. |  * @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. |  * @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); | 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. |  * @param instance A YeltsinDB instance. | ||||||
|  * @return Operation status. |  * @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!
 | // 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.
 | // You should write prev_page offset on your own.
 | ||||||
| inline YDB_Error __ydb_read_page(YDB_Engine *inst) { | inline YDB_Error __ydb_read_page(YDB_Engine *inst) { | ||||||
|   THROW_IF_NULL(inst, YDB_ERR_INSTANCE_NOT_INITIALIZED); |   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; |   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, YDB_ERR_INSTANCE_NOT_INITIALIZED); | ||||||
|   THROW_IF_NULL(instance->in_use, YDB_ERR_INSTANCE_NOT_IN_USE); |   THROW_IF_NULL(instance->in_use, YDB_ERR_INSTANCE_NOT_IN_USE); | ||||||
|   THROW_IF_NULL(page, YDB_ERR_PAGE_NOT_INITIALIZED); |   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) { | 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, YDB_ERR_INSTANCE_NOT_INITIALIZED); | ||||||
|   THROW_IF_NULL(instance->in_use, YDB_ERR_INSTANCE_NOT_IN_USE); |   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
 |   // Write last_free_page_offset as the next page for current one
 | ||||||
|   fwrite(&(instance->last_free_page_offset), sizeof(YDB_Offset), 1, instance->fd); |   fwrite(&(instance->last_free_page_offset), sizeof(YDB_Offset), 1, instance->fd); | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
|   // Link the previous page with next one (could be null ptr)
 |   // Link the previous page with next one (could be null ptr)
 | ||||||
|   fseek(instance->fd, instance->prev_page_offset + 1, SEEK_SET); // Skip flags
 |   fseek(instance->fd, instance->prev_page_offset + 1, SEEK_SET); // Skip flags
 | ||||||
|   fwrite(&(instance->next_page_offset), sizeof(YDB_Offset), 1, instance->fd); |   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
 |   // Flush buffer
 | ||||||
|   fflush(instance->fd); |   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; |   return YDB_ERR_SUCCESS; | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue