lliure/reattempts

Esse pacote tem como objetivo gerar querys/consultas automaticamente para o teste de retentavivas ao decorrer de um periodo estipulado.

v2.0.0 2025-05-07 17:33 UTC

This package is auto-updated.

Last update: 2025-05-07 17:41:52 UTC


README

Classe utilitária para gerenciar lógicas de retry (tentativas de reprocessamento) com definição de tentativas sequenciais e intervalos programados.

Começando

// 1) Instanciação e configuração
$reattempt = new Reattempts(
    attemptsDefault: 5,
    columnAttempts: 'attempts',
    columnDateNextAttempt: 'nextTry'
);

// 2) Definição de intervalos para tentativas extras
$reattempt
    ->addInterval('PT5H')
    ->addInterval('PT12H')
    ->addInterval('P1D', 2);

// 3) Geração da cláusula WHERE e busca dos registros elegíveis
$where = $reattempt->generateWhereQuery();
$rows  = \dibi::getConnection()
    ->select('*')
    ->from('sua_tabela')
    ->where($where)
    ->fetchAll();

// 4) Processamento e atualização de cada registro
foreach ($rows as $row) {
    $result = $reattempt->update($row);

    if (is_int($result)) {
        // Objeto-model: retorno é número de linhas afetadas
        echo "Registro ID {$row->id} atualizado ({$result} linhas).\n";
    } else {
        // Array: retorno é array de dados para update manual
        \dibi::getConnection()
            ->update('sua_tabela', $result)
            ->where('id = %i', $row['id'])
            ->execute();
    }
}

Este exemplo demonstra todo o ciclo de retry: do cálculo da cláusula WHERE até a aplicação das atualizações, seja via o método interno update() ou manualmente com Dibi.

Nota: Para extrair apenas a cláusula WHERE, use generateWhereQuery(). Para obter os dados de atualização sem persistir, veja computeNextAttemptData(). Para aplicar atualização imediata, use update().

Resumo da classe

class Reattempts
{
    public function __construct(
        int    $attemptsDefault = 4,
        string $columnAttempts = 'attempts',
        string $columnDateNextAttempt = 'nextAttempt'
    );

    public function setAttemptsDefault(int $attemptsDefault): self;
    public function addInterval(string $isoInterval, int $repeat = 1): self;
    public function nextInterval(string $isoInterval, int $repeat = 1): self;
    public function generateWhereQuery(): string;
    public function computeNextAttemptData(array $row): array;
    public function update(mixed $row, string $updateMethod = 'update'): int|array;
    public function __toString(): string;
}

Métodos

__construct(int $attemptsDefault = 4, string $columnAttempts = 'attempts', string $columnDateNextAttempt = 'nextAttempt')

Define o número de tentativas sequenciais e os nomes das colunas de controle.

setAttemptsDefault(int $attemptsDefault): self

Atualiza o máximo de tentativas sequenciais e reinicia o contador interno para começar a partir desse valor.

addInterval(string $isoInterval, int $repeat = 1): self

Adiciona um ou mais DateInterval extras (ISO‑8601) ao fluxo de retry para tentativas além das sequenciais. Exemplo: 'PT5H', 'P1D'.

nextInterval(string $isoInterval, int $repeat = 1): self

Sinônimo de addInterval(), permite encadear múltiplos intervalos de forma fluida.

generateWhereQuery(): string

Gera a cláusula WHERE para filtrar registros prontos para retry:

  • `attempts` < (attemptsDefault + soma de tentativas extras)
  • `nextTry` <= NOW()

computeNextAttemptData(array $row): array

Calcula, sem persistir, os valores para atualizar o registro. Retorna um array:

[
  'attempts'    => int,    // nova contagem de tentativas
  'nextTry'     => string, // data/hora ISO da próxima tentativa
]

update(mixed $row, string $updateMethod = 'update'): int|array

Versão flexível para aplicar a atualização imediatamente:

  • Se $row for um objeto com o método definido em $updateMethod, atribui as colunas e chama $row->{$updateMethod}(), retornando as linhas afetadas.
  • Caso contrário, devolve um array com os campos e valores a serem usados em um UPDATE manual via Dibi ou outro ORM.