mirror of
https://github.com/SerenityOS/serenity
synced 2024-09-06 00:51:33 +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
|
@ -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…
Reference in a new issue