Discussão do artigo "Trabalhando com as funções de rede ou MySQL sem DLL: Parte II - Programa para monitorar as alterações nas propriedades do sinal" - página 2

 
SysFX:

Estou apenas tentando usar a parte MySQL do sistema, mas continuo recebendo o erro "No database selected" (Nenhum banco de dados selecionado), mesmo que eu emita um comando "use `mytable`".

Você tem alguma ideia de por que isso está acontecendo?

No seu caso, `mytable` é o nome da base ou da tabela? USE deve ser seguido do nome do banco de dados, mas não da tabela.
 

Estou usando o nome do banco de dados na consulta "USE".

Também notei o seguinte ao remover o EA:

2021.08.20 01:20:24.248 Sync (EURUSD,H1) 6 undeleted objects left
2021.08.20 01:20:24.248 Sync (EURUSD,H1) 1 object of type CMySQLTransaction left
2021.08.20 01:20:24.248 Sync (EURUSD,H1) 1 object of type CMySQLPacket left
2021.08.20 01:20:24.248 Sync (EURUSD,H1) 1 object of type CData left
2021.08.20 01:20:24.248 Sync (EURUSD,H1) 1 object of type CMySQLLoginRequest left
2021.08.20 01:20:24.248 Sync (EURUSD,H1) 2 objects of type CMySQLPacketReader left
2021.08.20 01:20:24.248 Sync (EURUSD,H1) 1024 bytes of leaked memory


Gostaria muito de fazer a biblioteca funcionar, pois quero evitar as DLLs usadas por outras soluções do MySQL.

 

Não tenho certeza do que isso significa:

Erro de transação: MYSQL_ERR_AUTHORIZATION_TIMEOUT

Aqui

ENUM_TRANSACTION_STATE res = Incoming(buf,rsp_len);

Recebo IN_PROGRESS e ainda não há autorização para o tempo limite. Os dados estão exatamente corretos.

Aqui, o resultado é ...IN_PROGRESS o tempo todo. Onde procurar?

ENUM_TRANSACTION_STATE CMySQLTransaction::Incoming(uchar &data[], uint len)
{
 ....
 //--- Pacote "Data".
                     m_packet.type = MYSQL_PACKET_DATA;
                     if((result = PacketDataHandler(&m_packet))==MYSQL_TRANSACTION_ERROR)
                        break;
}

 
leonerd #:

Não sei o que isso significa:

Erro de transação: MYSQL_ERR_AUTHORIZATION_TIMEOUT

Aqui está

ENUM_TRANSACTION_STATE res = Incoming(buf,rsp_len);

Recebo IN_PROGRESS e ainda não há autorização para o tempo limite. Os dados estão exatamente corretos.

Aqui, o resultado é ...IN_PROGRESS o tempo todo. Onde procurar?


Algo deu errado depois de enviar ao servidor o login e a senha.

Se os dados estivessem incorretos, haveria um erro, não um tempo limite. Portanto, ou o servidor não respondeu, ou respondeu com algo que a biblioteca não entende.

Há alguma maneira de ver a captura de pacotes de rede? Qual é a versão do servidor MySQL?

 
Serhii Shevchuk #:

Algo deu errado depois de enviar ao servidor o login e a senha.

Se os dados estivessem incorretos, teria havido um erro, não um tempo limite. Mas ou o servidor não respondeu, ou respondeu com algo que a biblioteca não entendeu.

Há alguma maneira de ver a captura de pacotes de rede? Qual é a versão do servidor MySQL?

"Variable_name" "Value"
"admin_tls_version"     "TLSv1,TLSv1.1,TLSv1.2,TLSv1.3"
"immediate_server_version"      "999999"
"innodb_version"        "8.0.26"
"original_server_version"       "999999"
"protocol_version"      "10"
"replica_type_conversions"      ""
"slave_type_conversions"        ""
"tls_version"   "TLSv1.2"
"version"       "8.0.26-0ubuntu0.20.04.2"
"version_comment"       "(Ubuntu)"
"version_compile_machine"       "x86_64"
"version_compile_os"    "Linux"
"version_compile_zlib"  "1.2.11"
 
Есть возможность посмотреть перехват сетевых пакетов?
wireshark ou algo do gênero? Bem, isso vai demorar um pouco. Talvez amanhã.
 
leonerd wireshark ou algo do gênero? Bem, isso vai demorar um pouco. Talvez amanhã.

Infelizmente, sem isso, será difícil determinar a causa.

 
A propósito, tudo funcionou no mysql 5.7. Não funciona na versão 8.0.
 
leonerd #:
A propósito, tudo funcionou no mysql 5.7. Não funciona na versão 8.0.
Portanto, é por aí que você deveria ter começado. Obrigado pela mensagem, vou dar uma olhada.
 

E em uma instância em execução (mysql antigo), isso acontece de tempos em tempos:

2021.09.09 16:57:18.818 prices_to_mysql array out of range in 'MySQLTransaction.mqh' (367,37)

Here on data[ptr]:

ENUM_TRANSACTION_STATE CMySQLTransaction::Incoming(uchar &data[], uint len)
  {
   int ptr=0; // índice do byte atual no buffer de dados
   ENUM_TRANSACTION_STATE result=MYSQL_TRANSACTION_IN_PROGRESS; // resultado do processamento dos dados recebidos
   while(len>0)
     {
      if(m_packet.total_length==0)
        {
         //--- Se o número de dados no pacote for desconhecido
         while(m_rcv_len<4 && len>0)
           {
            m_hdr[m_rcv_len] = data[ptr];
            m_rcv_len++;
            ptr++;
            len--;
           }