[C] MySQL sprawdzenie połączenia

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
marcin0x02
Piegowaty Guziec
Piegowaty Guziec
Posty: 19
Rejestracja: 22 lis 2008, 15:51
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: GNOME
Architektura: x86_64

Re: [C] MySQL sprawdzenie połączenia

Post autor: marcin0x02 »

Flaga po to, że jak nie ma połączenia to dane mają być zapisane do pliku. Zapisany do pliku tez ma być fakt że wystąpił błąd z połączeniem. Na początku w funkcji miałem taki kod:

Kod: Zaznacz cały

if (mysql_real_connect(conn, pConf->cServer, pConf->cUser, pConf->cPass, pConf->cBase, 0, NULL, 0) == NULL) {
		printf("Error %u: %s\n", mysql_errno(conn), mysql_error(conn));
		//exit(1);
		*statusMySQL = 0;
	}
	else *statusMySQL = 1;
ale nie działa to poprawnie.
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

Re: [C] MySQL sprawdzenie połączenia

Post autor: ethanak »

nawet gdyby działało, masz potężnego buraka w założeniach.
Awatar użytkownika
liftboy syndrome
Wytworny Kaczor
Wytworny Kaczor
Posty: 336
Rejestracja: 05 maja 2012, 21:48
Płeć: Mężczyzna

Re: [C] MySQL sprawdzenie połączenia

Post autor: liftboy syndrome »

Kod: Zaznacz cały

#include <stdio.h>
#include <mysql/mysql.h>

MYSQL mysql;
int main(void) {
	mysql_init(&mysql);
	mysql_options(&mysql, MYSQL_READ_DEFAULT_GROUP, "prog");
	if (mysql_real_connect(&mysql, "ensembldb.ensembl.org", "anonymous", NULL, NULL, 3306, NULL, 0) == NULL) {
		printf("Error %u, %s\n", mysql_errno(&mysql), mysql_error(&mysql));
		return 1;
	}
	printf("break something (or not)\n");
	getc(stdin);
	printf("%d\n", mysql_ping(&mysql));
	printf("%d\n", mysql_query(&mysql, "select 1"));
	return 0;
}
U mnie działa idealnie. Jeżeli nie rozłączę się z siecią obie funkcje zwrócą 0. Jeżeli się rozłączę (np. ustawiając sobie adres docelowego serwera jako alias na własnym interfejsie) zwrócą 1.
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

Re: [C] MySQL sprawdzenie połączenia

Post autor: ethanak »

rozumiem, że nie dopuszczasz sytuacji, kiedy ping przejdzie a query nie?
dalej: wyjaśnij po co ping.
marcin0x02
Piegowaty Guziec
Piegowaty Guziec
Posty: 19
Rejestracja: 22 lis 2008, 15:51
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: GNOME
Architektura: x86_64

Re: [C] MySQL sprawdzenie połączenia

Post autor: marcin0x02 »

ping próbowałem użyć po tym jak, nie mogłem wykryć zerwanego połączenia za pomocą query. Jaki to błąd mam w założeniach?
Awatar użytkownika
liftboy syndrome
Wytworny Kaczor
Wytworny Kaczor
Posty: 336
Rejestracja: 05 maja 2012, 21:48
Płeć: Mężczyzna

Re: [C] MySQL sprawdzenie połączenia

Post autor: liftboy syndrome »

marcin0x02 pisze:ping próbowałem użyć po tym, jak nie mogłem wykryć zerwanego połączenia za pomocą query
Query nie może się udać, jeżeli nie ma połączenia z serwerem. Cudów nie ma.
Awatar użytkownika
jacekalex
Gibki Gibbon
Gibki Gibbon
Posty: 4707
Rejestracja: 17 cze 2007, 02:54
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: MATE
Architektura: x86_64

Re: [C] MySQL sprawdzenie połączenia

Post autor: jacekalex »

A nie prościej zajrzeć do kodu klienta mysql - który też jest napisany w C?

I najwyraźniej czai bazę:
MariaDB [(none)]> use vpopmail;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [vpopmail]> show tables;
+--------------------+
| Tables_in_vpopmail |
+--------------------+
| dir_control |
| lastauth |
| limits |
| valias |
| vlog |
| vpopmail |
+--------------------+
6 rows in set (0.00 sec)

MariaDB [vpopmail]> show tables;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
ERROR: Can't connect to the server


unknown [vpopmail]>
unknown [vpopmail]> show tables;
No connection. Trying to reconnect...
Connection id: 1
Current database: vpopmail

+--------------------+
| Tables_in_vpopmail |
+--------------------+
| dir_control |
| lastauth |
| limits |
| valias |
| vlog |
| vpopmail |
+--------------------+
6 rows in set (0.00 sec)

MariaDB [vpopmail]>
Także najwyraźniej ktoś ładuje z trepa w otwarte drzwi, albo próbuje trzasnąć drzwiami obrotowymi ;)

Za uwagę dziękuje:
MariaDB [vpopmail]> \s;
--------------
mysql Ver 15.1 Distrib 5.5.23-MariaDB, for Linux (x86_64) using readline 5.1

Connection id: 1
Current database: vpopmail
Current user: root@localhost
SSL: Cipher in use is DHE-RSA-AES256-SHA
Current pager: /usr/bin/less
Using outfile: ''
Using delimiter: ;
Server: MariaDB
Server version: 5.5.23-MariaDB-log Source distribution

Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: utf8
Db characterset: utf8
Client characterset: utf8
Conn. characterset: utf8
UNIX socket: /var/run/mysqld/mysqld.sock
Uptime: 6 min 4 sec

Kod: Zaznacz cały

qlist -ICvUq mariadb
dev-db/mariadb-5.5.23 berkdb community extraengine oqgraph pbxt perl profiling selinux sphinx ssl
To by było na tyle
:craz:
Problemy rozwiązujemy na forum nie na PW -> Niech inni na tym skorzystają.
Komputer jest jak klimatyzacja - gdy otworzysz okna, robi się bezużyteczny...
Linux User #499936
Inny OS: Gentoo Linux :)
marcin0x02
Piegowaty Guziec
Piegowaty Guziec
Posty: 19
Rejestracja: 22 lis 2008, 15:51
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: GNOME
Architektura: x86_64

Re: [C] MySQL sprawdzenie połączenia

Post autor: marcin0x02 »

Klienta mysql nie mogę użyć, ponieważ program uruchamiam na linuks embedded.
Awatar użytkownika
jacekalex
Gibki Gibbon
Gibki Gibbon
Posty: 4707
Rejestracja: 17 cze 2007, 02:54
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: MATE
Architektura: x86_64

Re: [C] MySQL sprawdzenie połączenia

Post autor: jacekalex »

A zajrzeć do źródel biblioteki libmysqlclient też nie możesz?
I poszukać odpowiedniego kawałka kodu, np na podstawie komunikatów wyświetlanych przez oryginalnego klienta przy połączeniu z oryginalnym serwerem?

Taką sztukę to nawet ja potrafię, np (kombinując z kodem łatki chkuser do Qmaila) wylączyłem 2 niepotrzebne akcje, choć w ogóle w C nie programuję, nawet programistą w ogóle nie jestem.
Problemy rozwiązujemy na forum nie na PW -> Niech inni na tym skorzystają.
Komputer jest jak klimatyzacja - gdy otworzysz okna, robi się bezużyteczny...
Linux User #499936
Inny OS: Gentoo Linux :)
marcin0x02
Piegowaty Guziec
Piegowaty Guziec
Posty: 19
Rejestracja: 22 lis 2008, 15:51
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: GNOME
Architektura: x86_64

Re: [C] MySQL sprawdzenie połączenia

Post autor: marcin0x02 »

Oczywiście że mogę, ale czy to nie jest przerost formy nad treścią? Potrzebuje sprawdzić tylko czy istnieje połączenie internetowe.
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

Re: [C] MySQL sprawdzenie połączenia

Post autor: ethanak »

a co ma wspólnego istnienie połączenia w momencie sprawdzania z istnieniem takowego w momencie wykonania query?
marcin0x02
Piegowaty Guziec
Piegowaty Guziec
Posty: 19
Rejestracja: 22 lis 2008, 15:51
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: GNOME
Architektura: x86_64

Re: [C] MySQL sprawdzenie połączenia

Post autor: marcin0x02 »

na początku chce sprawdzić czy istnieje fizyczne połączenie, następnie czy można do bazy wysłać zapytanie, jeśli jest ok to wysyła dane do bazy danych.
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

Re: [C] MySQL sprawdzenie połączenia

Post autor: ethanak »

a skąd pewność, że jeśli połączenie istnieje w momencie sprawdzania, istnieje również jakiś czas później - czyli w momencie wysyłania danych?
marcin0x02
Piegowaty Guziec
Piegowaty Guziec
Posty: 19
Rejestracja: 22 lis 2008, 15:51
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: GNOME
Architektura: x86_64

Re: [C] MySQL sprawdzenie połączenia

Post autor: marcin0x02 »

chce to zrobić tak, że za każdym razem jak chce wysłać dane, to sprawdzam czy połączenie z internetem istnieje, następnie czy istnieje dostęp do bazy danych, jeśli te warunki są spełnione to program ma wystać dane do bazy. Dodam ze dane będą wysyłane nie częściej niż raz na sekundę, a czasem rzadziej.
Awatar użytkownika
liftboy syndrome
Wytworny Kaczor
Wytworny Kaczor
Posty: 336
Rejestracja: 05 maja 2012, 21:48
Płeć: Mężczyzna

Re: [C] MySQL sprawdzenie połączenia

Post autor: liftboy syndrome »

marcin0x02: ethanak próbuje Ci delikatnie dać do zrozumienia, że sprawdzenie poprawności połączenia w momencie t0 nie zagwarantuje Ci, że to połączenie będzie istniało w momencie t1, kiedy będziesz chciał wysyłać dane "po sprawdzeniu". Ja Ci natomiast usiłuję dać do zrozumienia, że zarówno mysql_ping jak i mysql_query jak najbardziej pozwalają wykryć awarię połączenia, a jeżeli to u Ciebie nie działa to znaczy że popełniasz jakiś trywialny błąd (wyciągasz nie ten kabel co trzeba bądź ustawiasz nie tę flagę o którą chodzi).
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Google [Bot] i 9 gości