Pergunta

Codifiquei um bot Ruby IRC que está no github (/ninjex/rubot) que está apresentando alguma saída conflitante com o MySQL em um servidor dedicado que acabei de comprar.

Primeiramente temos a conexão com o banco de dados na pasta MySQL (em .gitignore) que se parece com o seguinte bloco de código.

@con = Mysql.new('localhost', 'root', 'pword', 'db_name')

Então temos uma função real para consultar o banco de dados

def db_query
 que = get_message # Grabs query from user i.e,./db_query SELECT * FROM words
 results = @con.query(que) # Send query through the connection i.e, @con.query("SELECT * FROM WORDS")
 results.each {|x| chan_send(x)} # For each row returned, send it to the channel via
end

Na minha máquina local, ao executar o comando:

./db_query SELECT amount, user from words WHERE user = 'Bob' and word = 'hello'

Eu recebo a saída no IRC em um formato semelhante ao Array: ["17", "Bob"] Onde 17 é o valor e Bob é o usuário.

No entanto, usar esta mesma função no meu servidor dedicado resulta em uma saída como: 17Bob Eu tentei muitas alterações no código, bem como tentei analisar os dados em sua própria variável, porém parece que 17Bob está saindo como uma variável única, impossibilitando a análise em algo como um array, que eu poderia usar para enviar os dados corretamente.

Isso me parece estranho tanto na minha máquina local quanto no servidor dedicado, pois eu esperava que a saída enviasse primeiro 17 para o IRC e depois para Bob como:

17
Bob

Para todas as funções e fontes você pode verificar meu github /Ninjex/rubot, porém pode ser necessário instalar algumas joias.

Foi útil?

Solução

Algumas notas:

  1. Certifique-se de limpar a consulta por meio de get_message.Ou você está se abrindo para algo sério problemas de segurança.
  2. Certifique-se de estar usando as mesmas versões do mysql gem, ruby ​​e MySql.Diferenças em qualquer um deles podem alterar o resultado esperado.
  3. Se você estiver perdendo o juízo e não conseguir resolver o problema subjacente, você sempre pode enviar um delimitador personalizado e usá-lo para dividir.Infelizmente, isso estragará o caso que está realmente funcionando e precisará ser removido.

Veja como eu abordaria a depuração do problema na máquina dedicada:

def db_query
 que = get_sanitized_message
 results = @con.query(que)
 require 'pry'
 binding.pry

 results.each {|x| chan_send(x)}
end
  1. Adicione o bisbilhotar joia para o seu Gemfile, ou gem install pry.
  2. Atualize seu código para usar pry:Veja acima
  3. Isso abrirá um console de alavanca quando o binding.pry linha é atingida e você pode interrogar quase tudo em seu aplicativo em execução.
  4. eu daria uma olhada results e veja se é um array.Basta digitar results no console e ele imprimirá o valor.Digite também results.class.É possível que a consulta esteja retornando algum objeto especial do conjunto de resultados que não é um array, mas que possui um método para acessar o array de resultados.
  5. Se results é uma matriz, então o problema provavelmente está em chan_send.Talvez precise usar algo como puts contra print para garantir que haja uma nova linha após cada mensagem.É possível que você tenha diferentes versões de sua base de código implantadas?Eu também acrescentaria um sleep 1 dentro de cada bloco para garantir que isso não esteja relacionado ao tratamento de mensagens que chegam ao mesmo tempo.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top