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"); }); |     ScopeGuard guard([]() { unlink("/tmp/test.db"); }); | ||||||
|     auto heap = SQL::Heap::construct("/tmp/test.db"); |     auto heap = SQL::Heap::construct("/tmp/test.db"); | ||||||
|     EXPECT(!heap->open().is_error()); |     EXPECT(!heap->open().is_error()); | ||||||
|     EXPECT_EQ(heap->version(), 0x00000001u); |     EXPECT_EQ(heap->version(), SQL::Heap::current_version); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| TEST_CASE(create_from_dev_random) | TEST_CASE(create_from_dev_random) | ||||||
|  |  | ||||||
|  | @ -8,6 +8,7 @@ | ||||||
| #include <AK/Format.h> | #include <AK/Format.h> | ||||||
| #include <AK/QuickSort.h> | #include <AK/QuickSort.h> | ||||||
| #include <LibCore/IODevice.h> | #include <LibCore/IODevice.h> | ||||||
|  | #include <LibCore/System.h> | ||||||
| #include <LibSQL/Heap.h> | #include <LibSQL/Heap.h> | ||||||
| #include <LibSQL/Serializer.h> | #include <LibSQL/Serializer.h> | ||||||
| #include <sys/stat.h> | #include <sys/stat.h> | ||||||
|  | @ -58,6 +59,15 @@ ErrorOr<void> Heap::open() | ||||||
|         initialize_zero_block(); |         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()); |     dbgln_if(SQL_DEBUG, "Heap file {} opened. Size = {}", name(), size()); | ||||||
|     return {}; |     return {}; | ||||||
| } | } | ||||||
|  | @ -248,7 +258,7 @@ void Heap::update_zero_block() | ||||||
| 
 | 
 | ||||||
| void Heap::initialize_zero_block() | void Heap::initialize_zero_block() | ||||||
| { | { | ||||||
|     m_version = 0x00000001; |     m_version = current_version; | ||||||
|     m_schemas_root = 0; |     m_schemas_root = 0; | ||||||
|     m_tables_root = 0; |     m_tables_root = 0; | ||||||
|     m_table_columns_root = 0; |     m_table_columns_root = 0; | ||||||
|  |  | ||||||
|  | @ -33,6 +33,8 @@ class Heap : public Core::Object { | ||||||
|     C_OBJECT(Heap); |     C_OBJECT(Heap); | ||||||
| 
 | 
 | ||||||
| public: | public: | ||||||
|  |     static constexpr inline u32 current_version = 1; | ||||||
|  | 
 | ||||||
|     virtual ~Heap() override; |     virtual ~Heap() override; | ||||||
| 
 | 
 | ||||||
|     ErrorOr<void> open(); |     ErrorOr<void> open(); | ||||||
|  | @ -104,7 +106,7 @@ private: | ||||||
|     u32 m_schemas_root { 0 }; |     u32 m_schemas_root { 0 }; | ||||||
|     u32 m_tables_root { 0 }; |     u32 m_tables_root { 0 }; | ||||||
|     u32 m_table_columns_root { 0 }; |     u32 m_table_columns_root { 0 }; | ||||||
|     u32 m_version { 0x00000001 }; |     u32 m_version { current_version }; | ||||||
|     Array<u32, 16> m_user_values { 0 }; |     Array<u32, 16> m_user_values { 0 }; | ||||||
|     HashMap<u32, ByteBuffer> m_write_ahead_log; |     HashMap<u32, ByteBuffer> m_write_ahead_log; | ||||||
| }; | }; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Timothy Flynn
						Timothy Flynn