|
|
Özcan Güngör <ozcangungor(at)netscape.net> O Autorze: Używam Linux'a od 1997 roku. Wolność, możliwości i opensource. To właśnie lubię. Translated to Polish by: Mariusz Kozlowski <sp3fxc(at)linuxfocus.org> Zawartość: |
API MySQL CNotka: W tym artykule nauczymy się jak używać C API (Application Programming Interfaces) dostarczone z MySQL. Aby zrozumieć zawartość tego artykułu potrzebna będzie wiedza z zakresu:
|
MYSQL
Następująca struktura jest komunikacyjnym "pośrednikiem" używanym do połączenia się z bazą danych.
typedef struct st_mysql { NET net; /* Communication parameters */ gptr connector_fd; /* ConnectorFd for SSL */ char *host,*user,*passwd,*unix_socket, *server_version,*host_info,*info,*db; unsigned int port,client_flag,server_capabilities; unsigned int protocol_version; unsigned int field_count; unsigned int server_status; unsigned long thread_id; /* Id for connection in server */ my_ulonglong affected_rows; my_ulonglong insert_id; /* id if insert on table with NEXTNR */ my_ulonglong extra_info; /* Used by mysqlshow */ unsigned long packet_length; enum mysql_status status; MYSQL_FIELD *fields; MEM_ROOT field_alloc; my_bool free_me; /* If free in mysql_close */ my_bool reconnect; /* set to 1 if automatic reconnect */ struct st_mysql_options options; char scramble_buff[9]; struct charset_info_st *charset; unsigned int server_language; } MYSQL;
MYSQL_RES
Ta struktura reprezentuje rezultaty zapytania, które zwraca krotki. Zwrócony zestaw danych zwany jest: result-set.
typedef struct st_mysql_res { my_ulonglong row_count; unsigned int field_count, current_field; MYSQL_FIELD *fields; MYSQL_DATA *data; MYSQL_ROWS *data_cursor; MEM_ROOT field_alloc; MYSQL_ROW row; /* If unbuffered read */ MYSQL_ROW current_row; /* buffer to current row */ unsigned long *lengths; /* column lengths of current row */ MYSQL *handle; /* for unbuffered reads */ my_bool eof; /* Used my mysql_fetch_row */ } MYSQL_RES;
MYSQL_ROW
Ta struktura to typ bezpiecznej reprezentacji danych w krotce.
Nie możesz używać tego jako string, ktróry kończy się znakiem NULL ponieważ dane w tym stringu mogą być typu
binarnego i mogą zawierać właśnie znak NULL.
typedef struct st_mysql_field { char *name; /* Name of column */ char *table; /* Table of column if column was a field */ char *def; /* Default value (set by mysql_list_fields) */ enum enum_field_types type; /* Type of field. Se mysql_com.h for types */ unsigned int length; /* Width of column */ unsigned int max_length; /* Max width of selected set */ unsigned int flags; /* Div flags */ unsigned int decimals; /* Number of decimals in field */ } MYSQL_FIELD;
my_ulonglong
Jest to typ użytwany dla liczby krotek i dla
mysql_affected_rows(), mysql_num_rows(), and mysql_insert_id().
Typ ten dostarcza zakres od 0 do 1.84e19. W niektórych systemach próba wypisania wartości my_ulonglong nie powiedzie się.
Aby wypisać taką watość należy ją przekonwertować do unsigned long i użyć formatu %lu (printf). Przykład:
printf(Number of rows: %lu\n", (unsigned long)
mysql_num_rows(result));
typedef unsigned long my_ulonglong;
Jak wcześniej powiedziałem biblioteki MySQL są w bibliotece mysqlclient. Więc podczas kompilacji programu korzystającego z MySQL konieczne jest dodanie flagi kompilatora -lmysqlclient. Pliki nagłówkowe MySQL można znaleźć w /usr/include/mysql (może to zależeć od dystrybucji Linux'a). Nagłówek twojego programu powinien wyglądać tak:
#include <mysql/mysql.h>
Zmienne typy i funkcje MySQL są zawarte w tym pliku nagłówkowym.
Następnie musimy stworzyć zmienną, która będzie używana do połączenia się z bazą danych. Jest to bardzo prosto robione poprzez:
MYSQL *mysql;
Przed połączeniem z bazą danycg musimy wywołać następującą funkcję aby zainicjować zmienną mysql:
mysql_init(MYSQL *mysql)
Następnie
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 int clientflag);
Funkcja ta jest wołana aby połączyć się z bazą danych. host to nazwa serwera MySQL. user to użytkownik, jako który chcemy się do niej podłączyć. passwd ot hasło. db to baza danych do jakiej chcemy się podłączyć. port to numer portu TCP/IP serwera MySQL. unix_socket to typ połączenia. clientflag to flaga powodująca pracę MySQL jako ODBC. W tym artykule jest ona ustawiona na 0. Funkcja ta zwraca 0 gdy połączenie zostanie ustanowione.
Teraz łączymy się z bazą danych i robimy zapytanie:
char *query;
Używając tego stringu możemy skonstruować jakie kolwiek zdania SQL i robić zapytania. Funkcja wykonująca zapytanie to:
int STDCALL mysql_real_query(MYSQL *mysql, const char *q, unsigned int length);mysql to zmienna jakjiej użyliśmy powyżej. q to łańcuch zapytania SQL. length to dłogość tego łańcucha. Jeśli zapytanie zakończy się bez błędów funkcja zwróci 0.
Po zrobieniu zapytania potrzebujemy zmiennej w MYSQL_RES aby móc użyć wyników zapytania. Następująca linia tworzy tą zmienną:
MYSQL_RES *res;Następnie
mysql_use_result(MYSQL *query)Ta funkcja jest używana do odczytania rezultatów.
Jakoże można robić zapytania bardzo łatwo, potrzebujemy nowych funkcji aby użyć rezultatów tych zapytań. Pierwsza to:
MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result);Funkcja ta konwertuje rezultaty w krotki. Jak można zauważyć, funkcja zwraca zmienną typu MYSQL_ROW. Następująca linia tworzy taką zmienną:
MYSQL_ROW row;Jak wyjaśniłem powyżej zmienna row to tablica łańcuchów. To znaczy, że row[0] jest pierwszą kolumną pierwszego rzędu, row[1] jest drugą kolumną pierwszego rzędu.... Gdy używamy mysql_fetch_row wtedy do zmiennej row są zapisywane dane następnej krotki jako rezultat. Gdy dotrzemy do końca rezultatu zapytania funkcja zwraca wartość ujemną. Na koniec zamykamy połączenie:
mysql_close(MYSQL *mysql)
unsigned int STDCALL mysql_num_fields(MYSQL *mysql);Ta funkcja zwraca ilość atrybutów w tabeli.
Aby uzyskać ilość krotek zapytania należy użyć:
my_ulonglong STDCALL mysql_num_rows(MYSQL_RES *res);
my_ulonglong STDCALL mysql_affected_rows(MYSQL *mysql);
Funkcja ta jest używana aby sprawdzić ilość krotek biorących udział przy wywoływaniu zapytań typu: INSERT, DELETE, UPDATE. Zauważ, że funkcja ta zwraca typ my_ulonglong.Na koniec przykładowy kod:
#include <mysql/mysql.h> #include <stdio.h> void main(){ MYSQL *mysql; MYSQL_RES *res; MYSQL_ROW row; char *query; int t,r; mysql_init(mysql); if (!mysql_real_connect(mysql,"localhost","mysql", "mysql","deneme",0,NULL,0)) { printf( "Error connecting to database: %s\n",mysql_error(mysql)); } else printf("Connected...\n"); query="select * from Deneme"; t=mysql_real_query(mysql,query,(unsigned int) strlen(query)); if (t) { printf("Error making query: %s\n", mysql_error(mysql)); } else printf("Query made...\n"); res=mysql_use_result(mysql); for(r=0;r<=mysql_field_count(mysql);r++){ row=mysql_fetch_row(res); if(row<0) break; for(t=0;t<mysql_num_fields(res);t++){ printf("%s ",row[t]); } printf("\n"); } mysql_close(mysql); }
|
Strona prowadzona przez redakcję LinuxFocus
© Özcan Güngör, FDL LinuxFocus.org |
tłumaczenie:
|
2003-09-13, generated by lfparser version 2.43