[LinuxFocus-icon]
<--  | Strona G³ówna  | Mapa Serwisu  | Indeks  | Szukaj

Nowo¶ci | Archiwum | Linki | O Nas
[an error occurred while processing this directive]
Ozcan Gungor
Ö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 C

mysql logo

Notka:

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:

  • Zmienne w C
  • Funkcje w C
  • Wska¼niki w C

_________________ _________________ _________________

 

Introduction

C APIs s± rozprowadzane wraz ze ¼ród³em MySQL i zawarte w mysqlclient bibliotece. S± u¿ywane do po³±czenia siê z baz± danych i wykonywania zapytañ. S± równie¿ przyk³ady u¿ycia C API w katalogu clients drzewa kodu ¼ród³owego MySQL.  

Typy zmiennych MySQL C

Nastêpuj±ce typy zmiennych s± zdefiniowane w bibliotece MySQL. Potrzebujemy tych zmiennych aby u¿ywaæ funkcji MySQL. Zmienne s± opisane szczegó³owo jednak¿e te szczegó³y nie s± tak istotne aby napisaæ kod.

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;

 

Pod³±czanie siê do MySQL i zapytania

Teraz zak³adam, ¿e MySQL jest zainstalowane, a uzytkownik i tabela w badzie danych s± stworzeni. W razie jakich kolwiek problemów informacji mo¿na zasiêgn±æ tutaj www.mysql.com.

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)
 

Niektóre u¿yteczne funkcje

Zobaczmy jak otrzymaæ ilo¶æ atrybutów w tabeli. Nastêpuj±ca funkcja jest za to odpowiedzialna:
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);
}
 

Warto przeczytaæ

 

Dyskusja dotycz±ca tego artyku³u

Komentarze do dyskusji:
 Strona talkback 

<--, back to the index of this issue

Strona prowadzona przez redakcjê LinuxFocus
© Özcan Güngör, FDL
LinuxFocus.org
t³umaczenie:
tr --> -- : Özcan Güngör <ozcangungor(at)netscape.net>
tr --> en: Özcan Güngör <ozcangungor(at)netscape.net>
en --> pl: Mariusz Kozlowski <sp3fxc(at)linuxfocus.org>

2003-09-13, generated by lfparser version 2.43