Conn2Flow
Navegação das docs

SDD

req-086: Preservação de 'data_modificacao' no Sincronizador de Banco de Dados

Quando o sincronizador atualiza uma linha (por exemplo, porque o html ou outro campo mudou) e a data_modificacao do JSON é idêntica à do banco de dados, essa coluna é omitida do…

Descrição do Problema / Contexto

Durante deploys e atualizações de banco de dados (atualizacoes-banco-de-dados.php), o sincronizador de banco de dados (sincronizarTabela()) compara os registros do JSON com os do banco. As colunas de modificação (data_modificacao) possuem a regra ON UPDATE CURRENT_TIMESTAMP no MySQL.

Quando o sincronizador atualiza uma linha (por exemplo, porque o html ou outro campo mudou) e a data_modificacao do JSON é idêntica à do banco de dados, essa coluna é omitida do array $diff (e, portanto, da consulta UPDATE gerada). Como o MySQL executa um UPDATE sem especificar a coluna data_modificacao, o gatilho automático ON UPDATE CURRENT_TIMESTAMP é acionado e a data de modificação é sobrescrita com a hora atual (NOW()), ignorando o valor customizado/histórico presente no JSON.

Proposta de Alterações Detalhada

1. Forçar inclusão de data_modificacao no Sincronizador (atualizacoes-banco-de-dados.php)

No arquivo gestor/controladores/atualizacoes/atualizacoes-banco-de-dados.php, dentro da função sincronizarTabela(), devemos interceptar a verificação de $diff nos 3 pontos onde o UPDATE é gerado (Modo PK, Modo Chave Natural e modo Fallback Chave Natural).

Se houver qualquer divergência que acione o update (ou seja, $diff não é vazio) e a coluna data_modificacao estiver presente no registro de entrada e no schema da tabela, devemos forçar sua inclusão no $diff para que seja explicitamente enviada no UPDATE, prevenindo o gatilho automático do MySQL de sobrescrevê-la com a hora atual.

Lógica a ser inserida:

if ($diff) {
    // Se data_modificacao está no JSON e no schema, mas não no diff, forçar a sua inclusão para evitar que o MySQL a atualize com o timestamp atual via trigger ON UPDATE
    if (isset($row['data_modificacao']) && is_array($allowedCols) && isset($allowedCols['data_modificacao']) && !isset($diff['data_modificacao'])) {
        $diff['data_modificacao'] = $row['data_modificacao'];
        $oldVals['data_modificacao'] = $exist['data_modificacao'] ?? null;
    }

Pontos de inserção em atualizacoes-banco-de-dados.php:

  1. Modo PK (dentro do laço de comparação por PK, logo após o fechamento da checagem de reset de user_modified e antes de if ($diff)).

  2. Modo Chave Natural (dentro do laço de comparação por chave natural, logo antes de if ($diff)).

  3. Modo Fallback Chave Natural (dentro do bloco de fallback de chave natural, logo antes de if ($diff)).


Validação e Testes

  1. Verificação Estática:

    • Rodar php -l gestor/controladores/atualizacoes/atualizacoes-banco-de-dados.php para garantir sintaxe válida.

  2. Validação Funcional:

    • Executar uma sincronização de teste (com registros alterados no HTML mas com data_modificacao idênticos no JSON) e certificar que a data de modificação gravada no banco respeita o valor original do JSON (sem ser atualizada para NOW()).

  3. Regressão:

    • Rodar composer test completo e certificar que todos os testes existentes da suíte continuam passando normalmente.

O Futuro é Híbrido: Humano + IA.

O Conn2Flow é a ferramenta. Se você precisa do Arquiteto para desenhar a estratégia da sua empresa usando essa tecnologia...

Contrate Consultoria Especializada