This commit is contained in:
FelipeCN
2026-03-03 13:51:26 -03:00
parent a5605de6a3
commit 2c96e99ccc
7 changed files with 166 additions and 27 deletions
+26 -7
View File
@@ -1,7 +1,7 @@
use rusqlite::{Connection, Result};
/// Versão atual do schema do banco de dados.
const VERSAO_SCHEMA_ATUAL: i64 = 1;
const VERSAO_SCHEMA_ATUAL: i64 = 2;
/// Aplica todas as migrations necessárias para atualizar o banco
/// para a versão mais recente.
@@ -21,15 +21,34 @@ pub fn aplicar_migrations(conn: &Connection) -> Result<()> {
)
.unwrap_or(0);
if versao_atual < VERSAO_SCHEMA_ATUAL {
if versao_atual < 1 {
migration_v1(conn)?;
if versao_atual == 0 {
conn.execute("INSERT INTO schema_version (versao) VALUES (?1);", [VERSAO_SCHEMA_ATUAL])?;
} else {
conn.execute("UPDATE schema_version SET versao = ?1;", [VERSAO_SCHEMA_ATUAL])?;
}
}
if versao_atual < 2 {
migration_v2(conn)?;
}
if versao_atual == 0 {
conn.execute("INSERT INTO schema_version (versao) VALUES (?1);", [VERSAO_SCHEMA_ATUAL])?;
} else if versao_atual < VERSAO_SCHEMA_ATUAL {
conn.execute("UPDATE schema_version SET versao = ?1;", [VERSAO_SCHEMA_ATUAL])?;
}
Ok(())
}
/// Migration v2: adicionar índice único em layouts.nome.
/// Renomeia duplicatas (sufixo com id) antes de criar o índice para não falhar
/// em bancos que já possuem nomes repetidos.
fn migration_v2(conn: &Connection) -> Result<()> {
conn.execute_batch(
"UPDATE layouts
SET nome = nome || ' (' || id || ')'
WHERE id NOT IN (
SELECT MIN(id) FROM layouts GROUP BY nome
);
CREATE UNIQUE INDEX IF NOT EXISTS idx_layouts_nome ON layouts (nome);",
)?;
Ok(())
}