Skip to content

docs: deixa explícito que o callback é opcional, e corrige a promessa de ordem - #55

Merged
NullSablex merged 1 commit into
masterfrom
docs/callback-opcional-e-ordem
Sep 26, 2026
Merged

NullSablex merged 1 commit into
masterfrom
docs/callback-opcional-e-ordem

Conversation

@NullSablex

Copy link
Copy Markdown
Owner

Duas coisas que a documentação dizia mal. As duas foram verificadas rodando um gamemode de teste num servidor SA-MP com MariaDB de verdade, não por leitura de código.

1. O callback é opcional — e ninguém percebia

Não-bloqueante não obriga a escrever callback para tudo. As oito natives que aceitam callback aceitam com padrão "", e sem ele a query roda e o resultado é descartado:

mysql_query(g_mysql, "UPDATE players SET last_login = NOW() WHERE id = 1");

Uma linha, sem forward, sem public, e o servidor não trava. Verificado: o UPDATE rodou e o banco ficou com o valor novo.

As duas exceções são mysql_hash_password e mysql_verify_password: callback obrigatório, sem valor padrão, e já recusado em runtime com aviso no log — o hash só existe através dele.

O problema não era falta de informação, era onde ela estava. Havia uma subseção ### Fire and forget no fim da página de queries, enquanto:

  • a primeira linha da página dizia "o callback é invocado num tick posterior", como se sempre houvesse um;
  • nenhum dos onze exemplos mostrava a forma sem callback, nem nos UPDATE;
  • o README destacava "All queries are non-blocking" sem dizer o que isso implica para quem escreve.

Quem lia saía convencido do contrário. É a origem da reclamação de que o plugin "obriga a encher o código de callback".

2. A garantia de ordem é de callback, não de execução

mysql_query é FIFO na entrega dos callbacks. A execução não é ordenada: submit_query faz thread::spawn por query, cada uma pegando uma conexão do pool na hora. Duas submetidas em sequência rodam ao mesmo tempo no servidor.

O teste deixou isso claro:

4 comandos de schema disparados sem callback
ERRO em [INSERT INTO t_ordem...]: Table 'cbtest.t_ordem' doesn't exist
ERRO em [UPDATE t_ordem...]:      Table 'cbtest.t_ordem' doesn't exist

E a tabela comparativa ainda recomendava mysql_query para "SELECT chains that depend on order" — exatamente o uso que quebra.

A página agora diz qual ferramenta serializa de verdade, as duas confirmadas no mesmo teste:

Necessidade Ferramenta Verificado
Schema, migrações, .sql mysql_query_file id=1 v=20, ordem correta
Escritas dependentes mysql_transaction_* id=1 v=60, ordem correta
Leitura que depende de escrita callback da escrita —

Mudanças

  • README.md — o destaque de "non-blocking" agora diz que o callback é opcional; o quick start mostra as duas formas lado a lado.
  • docs/queries.md — abertura reescrita, seção de ordem com o exemplo que quebra e a tabela de alternativas, e a linha enganosa da tabela comparativa corrigida (mais uma linha nova, "Execution order: not ordered").
  • include/mysql_samp.inc.in — @param callback agora diz "Optional" ou "REQUIRED" em cada caso. Vem do template, então chega aos dois includes gerados e ao hover do PawnPro.
  • examples/12_no_callback.pwn — fire-and-forget, e o lembrete de que OnQueryError continua chegando.
  • examples/13_ordering.pwn — o que é ordenado, o que não é, e o que usar no lugar.
  • examples/README.md — os dois na tabela, mais uma nota no topo.

Verificação

  • cargo test — 177 passed, 1 ignored
  • mkdocs build --strict — sem links quebrados
  • Guarda de codificação — OK, 21 arquivos
  • Os dois exemplos novos compilam no pawncc sem erro

… de ordem

Duas coisas que a documentacao dizia mal, as duas confirmadas rodando um
gamemode de teste contra um servidor SA-MP e um MariaDB de verdade.

1. O callback e opcional, e ninguem percebia

Nao-bloqueante nao obriga a escrever callback para tudo: as oito natives
que aceitam `callback` aceitam com valor padrao `""`, e sem ele a query
roda e o resultado e descartado. Uma escrita e uma linha, sem forward e
sem public. As unicas excecoes sao `mysql_hash_password` e
`mysql_verify_password`, cujo callback e obrigatorio - o hash so existe
atraves dele - e que ja recusam callback vazio com aviso no log.

Isso estava documentado em uma subsecao no fim da pagina de queries,
enquanto a primeira linha dizia "o callback e invocado num tick
posterior" e nenhum dos onze exemplos mostrava a forma sem callback.
Quem lia saia convencido do contrario, e era a origem da reclamacao de
que o plugin "obriga a encher o codigo de callback".

2. A garantia de ordem e de callback, nao de execucao

`mysql_query` e FIFO na ENTREGA DOS CALLBACKS. A execucao nao e ordenada:
cada query ganha uma thread e uma conexao do pool no momento em que e
submetida, entao duas submetidas em sequencia rodam ao mesmo tempo no
servidor. Um `CREATE TABLE` seguido de `INSERT` falha com "table doesn't
exist" - foi o que o teste mostrou.

A tabela comparativa ainda sugeria `mysql_query` para "SELECT chains that
depend on order", que e exatamente o uso que quebra. Agora a pagina diz
qual ferramenta serializa de verdade: `mysql_query_file` para schema e
transacao para escritas dependentes, ambas verificadas no mesmo teste.

Mudancas: README (destaque e quick start com as duas formas), pagina de
queries (abertura, secao de ordem e tabela), `@param callback` do template
do include - que alimenta o hover do PawnPro e chega aos dois includes
gerados - e dois exemplos novos, 12_no_callback e 13_ordering.
@NullSablex
NullSablex merged commit 5ed7ce7 into master Sep 26, 2026
11 checks passed
@NullSablex
NullSablex deleted the docs/callback-opcional-e-ordem branch September 26, 2026 09:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant