mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 16:52:43 +00:00 
			
		
		
		
	LibSQL: Ungracefully handle database version incompatibilities
In the long run, this is obviously a bad way to handle version changes to the SQL database files. We will want to migrate old databases to new formats. Until we figure out a good way to do that, wipe old databases so that we don't crash trying to read incompatible data.
This commit is contained in:
		
							parent
							
								
									d5ed07fdc4
								
							
						
					
					
						commit
						b5fd96b7ac
					
				
					 3 changed files with 15 additions and 3 deletions
				
			
		|  | @ -110,7 +110,7 @@ TEST_CASE(create_heap) | |||
|     ScopeGuard guard([]() { unlink("/tmp/test.db"); }); | ||||
|     auto heap = SQL::Heap::construct("/tmp/test.db"); | ||||
|     EXPECT(!heap->open().is_error()); | ||||
|     EXPECT_EQ(heap->version(), 0x00000001u); | ||||
|     EXPECT_EQ(heap->version(), SQL::Heap::current_version); | ||||
| } | ||||
| 
 | ||||
| TEST_CASE(create_from_dev_random) | ||||
|  |  | |||
|  | @ -8,6 +8,7 @@ | |||
| #include <AK/Format.h> | ||||
| #include <AK/QuickSort.h> | ||||
| #include <LibCore/IODevice.h> | ||||
| #include <LibCore/System.h> | ||||
| #include <LibSQL/Heap.h> | ||||
| #include <LibSQL/Serializer.h> | ||||
| #include <sys/stat.h> | ||||
|  | @ -58,6 +59,15 @@ ErrorOr<void> Heap::open() | |||
|         initialize_zero_block(); | ||||
|     } | ||||
| 
 | ||||
|     // FIXME: We should more gracefully handle version incompatibilities. For now, we drop the database.
 | ||||
|     if (m_version != current_version) { | ||||
|         dbgln_if(SQL_DEBUG, "Heap file {} opened has incompatible version {}. Deleting for version {}.", name(), m_version, current_version); | ||||
|         m_file = nullptr; | ||||
| 
 | ||||
|         TRY(Core::System::unlink(name())); | ||||
|         return open(); | ||||
|     } | ||||
| 
 | ||||
|     dbgln_if(SQL_DEBUG, "Heap file {} opened. Size = {}", name(), size()); | ||||
|     return {}; | ||||
| } | ||||
|  | @ -248,7 +258,7 @@ void Heap::update_zero_block() | |||
| 
 | ||||
| void Heap::initialize_zero_block() | ||||
| { | ||||
|     m_version = 0x00000001; | ||||
|     m_version = current_version; | ||||
|     m_schemas_root = 0; | ||||
|     m_tables_root = 0; | ||||
|     m_table_columns_root = 0; | ||||
|  |  | |||
|  | @ -33,6 +33,8 @@ class Heap : public Core::Object { | |||
|     C_OBJECT(Heap); | ||||
| 
 | ||||
| public: | ||||
|     static constexpr inline u32 current_version = 1; | ||||
| 
 | ||||
|     virtual ~Heap() override; | ||||
| 
 | ||||
|     ErrorOr<void> open(); | ||||
|  | @ -104,7 +106,7 @@ private: | |||
|     u32 m_schemas_root { 0 }; | ||||
|     u32 m_tables_root { 0 }; | ||||
|     u32 m_table_columns_root { 0 }; | ||||
|     u32 m_version { 0x00000001 }; | ||||
|     u32 m_version { current_version }; | ||||
|     Array<u32, 16> m_user_values { 0 }; | ||||
|     HashMap<u32, ByteBuffer> m_write_ahead_log; | ||||
| }; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Timothy Flynn
						Timothy Flynn