From 2f8042da22b3ac3efc190ab5158fa36b69ce00fe Mon Sep 17 00:00:00 2001 From: Diego Reis Date: Thu, 22 May 2025 20:38:27 -0300 Subject: [PATCH] core/pragma: Add support for update user_version It also changes the type from u32 to i32 since sqlite supports negative values --- core/storage/sqlite3_ondisk.rs | 4 ++-- core/translate/pragma.rs | 23 +++++++++++++++++++++-- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/core/storage/sqlite3_ondisk.rs b/core/storage/sqlite3_ondisk.rs index 19648c9e9..06a9569ab 100644 --- a/core/storage/sqlite3_ondisk.rs +++ b/core/storage/sqlite3_ondisk.rs @@ -141,7 +141,7 @@ pub struct DatabaseHeader { text_encoding: u32, /// The "user version" as read and set by the user_version pragma. - pub user_version: u32, + pub user_version: i32, /// True (non-zero) for incremental-vacuum mode. False (zero) otherwise. incremental_vacuum_enabled: u32, @@ -321,7 +321,7 @@ fn finish_read_database_header( } header.vacuum_mode_largest_root_page = u32::from_be_bytes([buf[52], buf[53], buf[54], buf[55]]); header.text_encoding = u32::from_be_bytes([buf[56], buf[57], buf[58], buf[59]]); - header.user_version = u32::from_be_bytes([buf[60], buf[61], buf[62], buf[63]]); + header.user_version = i32::from_be_bytes([buf[60], buf[61], buf[62], buf[63]]); header.incremental_vacuum_enabled = u32::from_be_bytes([buf[64], buf[65], buf[66], buf[67]]); header.application_id = u32::from_be_bytes([buf[68], buf[69], buf[70], buf[71]]); header.reserved_for_expansion.copy_from_slice(&buf[72..92]); diff --git a/core/translate/pragma.rs b/core/translate/pragma.rs index 0c7889e94..25df086c0 100644 --- a/core/translate/pragma.rs +++ b/core/translate/pragma.rs @@ -142,8 +142,27 @@ fn update_pragma( Ok(()) } PragmaName::UserVersion => { - // TODO: Implement updating user_version - todo!("updating user_version not yet implemented") + let version_value = match value { + ast::Expr::Literal(ast::Literal::Numeric(numeric_value)) => { + numeric_value.parse::()? + } + ast::Expr::Unary(ast::UnaryOperator::Negative, expr) => match *expr { + ast::Expr::Literal(ast::Literal::Numeric(numeric_value)) => { + -numeric_value.parse::()? + } + _ => bail_parse_error!("Not a valid value"), + }, + _ => bail_parse_error!("Not a valid value"), + }; + + // update in-memory + header.lock().user_version = version_value; + + // update in disk + let header_copy = header.lock().clone(); + pager.write_database_header(&header_copy); + + Ok(()) } PragmaName::SchemaVersion => { // TODO: Implement updating schema_version