Repository navigation
fix: OnQueryError entregava os argumentos ao contrário - #56
Merged
Merged
Conversation
O forward e declarado como
OnQueryError(errorid, const error[], const callback[], const query[], connId)
mas o gamemode recebia os cinco valores na ordem inversa. Rodando contra
um servidor de verdade, uma tabela inexistente chegava assim:
errorid = 1 (era o connId)
error[] = SELECT * FROM tabela_inexistente (era a query)
query[] = MySqlError { ERROR 1146 ... } (era a mensagem)
connId = 1146 (era o errorid)
A causa esta no `exec_public!`: o macro empilha os argumentos ao
contrario, que e a convencao da pilha do AMX, entao a ordem listada na
chamada e a ordem em que o public recebe. O codigo listava comecando pelo
`conn_id`, como se precisasse inverter na mao. Agora lista na ordem do
forward, e um comentario registra o porque para nao regredir.
Quem tratava `OnQueryError` estava lendo a query no lugar da mensagem e o
id da conexao no lugar do codigo de erro. Vale conferir gamemodes que
tenham se acostumado com a ordem errada.
Junto, duas coisas da mesma area:
1. A mensagem vinha com as tripas do Rust. `mysql::Error` embrulha a
mensagem do servidor no nome da variante, entao o script recebia
`MySqlError { ERROR 1146 (42S02): Table 'db.t' doesn't exist }`. Para
erro vindo do servidor passa a ser so a mensagem; o resto (IO, TLS,
protocolo) mantem o texto completo, que e todo o detalhe que existe.
2. `mysql_query_file` falhava sem avisar quem disparou. Arquivo ilegivel
ou sem statements virava linha de log e `false` no retorno - que a
forma sem callback, que a propria doc recomenda para schema, nunca ve.
Agora tambem dispara `OnQueryError`, com o caminho no lugar da query
para a mensagem nomear o arquivo. O `errorid` e 0, como a doc ja
promete para falha que nao chegou ao servidor.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Encontrado enquanto eu testava o
mysql_query_filenum servidor SA-MP de verdade. É um bug de comportamento, não de documentação.O bug
O forward é declarado assim:
Mas o gamemode recebia os cinco valores na ordem inversa. Com uma tabela inexistente, medido no servidor:
errorid11461— o connIderror[]Table '…' doesn't existSELECT * FROM tabela_inexistentecallback[]NuncaChamadoquery[]SELECT * FROM tabela_inexistenteMySqlError { ERROR 1146 … }connId11146— o erroridCausa: o
exec_public!empilha os argumentos ao contrário, que é a convenção da pilha do AMX — então a ordem listada na chamada é a ordem em que o public recebe. O código listava começando peloconn_id, como se precisasse inverter na mão. Agora lista na ordem do forward, com um comentário registrando o porquê.Depois da correção, mesmo teste:
Junto, duas coisas da mesma área
1. A mensagem vinha com as tripas do Rust. O
Displaydemysql::Errorembrulha a mensagem do servidor no nome da variante, então o script recebiaMySqlError { ERROR 1146 (42S02): Table 'db.t' doesn't exist }— estrutura interna de Rust dentro de uma string Pawn. Para erro vindo do servidor passa a ser só a mensagem. O resto (IO, TLS, protocolo) mantém o texto completo, que é todo o detalhe que existe.2.
mysql_query_filefalhava sem avisar quem disparou. Arquivo ilegível ou sem statements virava uma linha de log efalseno retorno — que a forma sem callback, recomendada pela própria doc para schema, nunca vê. Eu mesmo caí nisso: apontei parascriptfiles/schema.sql, o caminho é relativo à raiz do servidor, e o gamemode seguiu achando que o schema tinha rodado.Agora também dispara
OnQueryError, com o caminho no lugar da query para a mensagem nomear o arquivo:O
erroridé0porque a doc já promete isso para falha que não chegou ao servidor — inventar um número específico do plugin quebraria o contrato. Omysql_errno(connId)continua reportandoMYSQL_ERROR_QUERY_FAILED. A linha doerroridemdocs/errors.mdfoi ampliada para citar o caso do arquivo.Verificação
Tudo medido num SA-MP 0.3.7 com MariaDB 11.8, não só compilado:
mysql_query_filecom caminho inválido, sem callback, chegando aoOnQueryErrorcargo test— 177 passed, 1 ignoredcargo clippy --all-targets -- -D warnings— limpocargo fmt --check— limpo