Fix broken instance state after table read failure
Also fix memory leak in the same casemaster
							parent
							
								
									ebedf5619c
								
							
						
					
					
						commit
						31c5b08f6a
					
				
							
								
								
									
										10
									
								
								src/ydb.c
								
								
								
								
							
							
						
						
									
										10
									
								
								src/ydb.c
								
								
								
								
							|  | @ -135,15 +135,12 @@ YDB_Error ydb_load_table(YDB_Engine *instance, const char *path) { | |||
|   THROW_IF_NULL(instance, YDB_ERR_INSTANCE_NOT_INITIALIZED); | ||||
|   THROW_IF_NULL(!instance->in_use, YDB_ERR_INSTANCE_IN_USE); | ||||
| 
 | ||||
|   instance->in_use = -1; // unsigned value overflow to fill all the bits
 | ||||
|   instance->filename = strdup(path); | ||||
| 
 | ||||
|   if (access(instance->filename, F_OK) == -1) { | ||||
|   if (access(path, F_OK) == -1) { | ||||
|     // TODO: Windows does not check W_OK correctly, use other methods.
 | ||||
|     // TODO: if can't read/write, throw other error
 | ||||
|     return YDB_ERR_TABLE_NOT_EXIST; | ||||
|   } | ||||
|   instance->fd = fopen(instance->filename, "rb+"); | ||||
|   instance->fd = fopen(path, "rb+"); | ||||
|   THROW_IF_NULL(instance->fd, YDB_ERR_UNKNOWN); // TODO file open error
 | ||||
| 
 | ||||
|   char signature[4]; | ||||
|  | @ -165,6 +162,9 @@ YDB_Error ydb_load_table(YDB_Engine *instance, const char *path) { | |||
|   fread(&(instance->last_free_page_offset), sizeof(YDB_Offset), 1, instance->fd); | ||||
|   // TODO check offsets
 | ||||
| 
 | ||||
|   instance->in_use = -1; // unsigned value overflow to fill all the bits
 | ||||
|   instance->filename = strdup(path); | ||||
| 
 | ||||
|   instance->curr_page_offset = instance->first_page_offset; | ||||
|   return __ydb_read_page(instance); | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue