Opened 8 years ago

Closed 8 years ago

Last modified 6 years ago

#159 closed улучшение (fixed)

Отсутствие диагностики при ошибке подключения к базе данных

Reported by: alx Owned by: dimag
Priority: major Milestone: 2 очередь
Component: ПО MC04-Dispatcher. Пульт диспетчера/техника Keywords:
Cc: san

Description

Когда при подключении к базе данных возникает ошибка, программа выдает пользователю сообщение "Ошибка соединения с базой данных", и все. Какая именно возникла ошибка, видимо, предлагается угадать. :)

Необходимо кроме уведомления о самом факте возникновения ошибки также сообщать, какая именно ошибка возникла. Например: "Ошибка соединения с базой данных: Access denied for user 'john'@'heaven.org'".

Change History (10)

comment:1 by dimag, 8 years ago

Resolution: fixed
Status: newclosed

rev 227

comment:2 by alx, 8 years ago

Resolution: fixed
Status: closedreopened

??? Нет ревизии r227 в репозитории.

comment:3 by alx, 8 years ago

Появился вывод ошибки соединения с базой данных, но работает он странно. При соединении с базой и получении от нее отказа в доступе программа пишет "имя пользователя или пароль неверны". Пока все хорошо. Теперь пробуем соединиться в ситуации, когда сервер mysql не запущен и... опять получаем ошибку "имя пользователя или пароль неверны"... При чем тут имя пользователя и пароль, если программа даже подключиться к базе не смогла? Она получила Connection Refused, а вовсе не отказ в доступе...

Надо разобраться с кодом, формирующим сообщения об ошибках, чтобы выводимые ошибки соответствовали действительности.

comment:4 by dimag, 8 years ago

Resolution: fixed
Status: reopenedclosed

Тогда будет сообщение "Ошибка соединения с базой данных, невозможно инициализировать MySQL"

comment:5 by alx, 8 years ago

Когда "тогда"? Должна выводиться та ошибка, которая действительно имела место. Если программа не смогла инициализировать MySQL (что бы это не означало), она должна сказать "не могу инициализировать MySQL". Если случилось что-то другое - должна вывести что-то другое. Говорить надо правду. По-моему так.

comment:6 by alx, 8 years ago

Resolution: fixed
Status: closedreopened

Только что проведен эксперимент, при котором сервер вообще ничего не отвечал программе. Результат - все то же "имя пользователя или пароль неверны". Сообщение совершенно не соответствует действительности. Это уж точно явный баг, тикет переоткрываю.

comment:7 by dimag, 8 years ago

В случае когда сервер не работает и в случае когда введены неверное имя пользователя или пароль, функция
MYSQL * STDCALL mysql_real_connect(MYSQL *mysql, const char *host,
const char *user,
const char *passwd,
const char *db,
unsigned int port,
const char *unix_socket,
unsigned long clientflag);
вернёт NULL. Как распознать ситуацию когда сервер не отвечает и когда имя пользователя и пароль не верен?

in reply to:  7 comment:8 by alx, 8 years ago

Replying to dimag:

Как распознать ситуацию когда сервер не отвечает и когда имя пользователя и пароль не верен?

Согласно документации mysql, ошибку, возникшую при выполнении любой операции можно получить с помощью mysql_error():

mysql_error()

const char *mysql_error(MYSQL *mysql)
Description

For the connection specified by mysql, mysql_error() returns a null-terminated
string containing the error message for the most recently invoked API function
that failed.

А в описании использованной Вами mysql_real_connect() есть пример ее использования:

MYSQL mysql;

mysql_init(&mysql);
mysql_options(&mysql,MYSQL_READ_DEFAULT_GROUP,"your_prog_name");
if (!mysql_real_connect(&mysql,"host","user","passwd","database",0,NULL,0))
{
    fprintf(stderr, "Failed to connect to database: Error: %s\n",
          mysql_error(&mysql));
}

comment:9 by dimag, 8 years ago

Resolution: fixed
Status: reopenedclosed

r233
Сейчас текст ошибки возвращаемой mysql_error будет выводиться в строке состояния и лог программы.

comment:10 by san, 6 years ago

Milestone: Текущее2 очередь

Milestone renamed

Note: See TracTickets for help on using tickets.