[LinuxFocus-icon]
<--  | Ev  | Eri�imd�zeni  | ��indekiler  | Arama

Duyumlar | Belgelikler | Ba�lant�lar | LF Nedir
Bu makalenin farkl� dillerde bulundu�u adresler: English  Castellano  ChineseGB  Deutsch  Francais  Nederlands  Portugues  Russian  Turkce  Polish  

Ozcan Gungor
�zcan G�ng�r
<ozcangungor(at)netscape.net>

Yazar hakk�nda:
1997'den beri Linux kullan�yorum. �zg�rl�k, esneklik ve a��k-kod Linux'ta en sevdi�im �zelliklerdir.
��erik:

 

MySQL C Uygulama Geli�tirme Aray�zleri

mysql logo

�zet:

Bu makalede, MySQL ile birlikte gelen C Uygulama Geli�tirme Aray�zlerinin (UGA) (API=Application Programming Interface) nas�l kullanabilece�imizi ��renece�iz. Bu makaleyi anlayabilmek i�in C programlama dilinde �u konular�n bilimesi gerekmektedir:

  • De�i�kenler
  • Fonksiyonlar
  • ��aret�iler (Pointers)

_________________ _________________ _________________

 

Giri�

C UGA kodlar� MySQL ile birlikte da��t�l�r.mysqlclient k�t�phanesinde bulunur ve C programlar�yla veritaban�na ula�mam�z� sa�lar.Bir�ok �rne�i MySQL'in kaynak kodlar� i�indeki clients dizininde bulabilirsiniz.  

MySQL C De�i�ken Tipleri

A�a��da MySQL k�t�phaesinde tam�mlanm�� de�i�ken tipleri vard�r.MySQL fonksiyonlar�n� kullanabilmek i�in bu de�i�kenlere gereksinimimiz var.Her de�i�kenin ayr�nt�lar� mevcut ancak progmlama yaparken bu ayr�nt�lar�n �o�unu kullanmayaca��z.

MYSQL
Bu yap�, bir veritaban�na ba�lanmak i�in kullanlan bir de�i�kendir.Hemen hemen her MySQL fonksiyonu taraf�ndan kullan�l�r.

typedef struct st_mysql {
  NET           net;           /* Ba�lant� parametreleri*/
  gptr          connector_fd;  /* SSL i�in ba�lay�c� alan ta�mlay�c�s� */
  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;     /* Sunucudaki ba�lan�t�n�n tan�mlay�c�s�(ID) */
  my_ulonglong affected_rows;
  my_ulonglong insert_id;      /* NEXTNR ile tabloya giri�
                                yap�ld��� zaman ki tan�mlay�c� */
  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;       /* mysql_close i�inde serbest ise*/
  my_bool       reconnect;     /* 1'e e�itle e�er otomatik yeniden
                                  ba�lanma isteniyorsa */
  struct st_mysql_options options;
  char          scramble_buff[9];
  struct charset_info_st *charset;
  unsigned int  server_language;
} MYSQL;

MYSQL_RES
Bu yap� sat�r d�nd�ren (SELECT, SHOW, DESCRIBE, EXPLAIN) sorgular�n sonu�lar�n� temsil eder.Bir sorgudan d�nen bilgi sonu� k�mesi olarak adland�r�l�r.

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;              /* tamponlanmam�� okuma varsa*/
  MYSQL_ROW     current_row;      /* �u anki sat�r�n tamponu*/
  unsigned long *lengths;         /* �u anki s�ran�n s�tun uzunluklar�*/
  MYSQL         *handle;          /* tamponlanmam�� okumalar i�in*/
  my_bool       eof;              /* mysql_fetch_row taraf�ndan kullan�l�r */
} MYSQL_RES;

MYSQL_ROW
Bu de�i�ken, varinin bir sat�r�n�n g�venli-tip g�sterimidir ve say�l� byte katarlar�n�n(string) bir dizisidir yani bu dizinin elemanlar�n� sonu \0(null) karakteriyle biten bir katar olarak kullamazs�n�z ��nk� bu bilgiler ikilik sistem(binary) bilgiler olabilir ve i�inde \0 karakterini i�erebilir.

typedef char **MYSQL_ROW;   /* verileri bir katar dizisi olarak d�nd�r�r. */

MYSQL_FIELD
Bu yap� bir alan hakk�ndaki bilgileri tutar.�ren�in; alan ad�, tipi ve uzunlu�u...).mysql_fetch_field() fonksiyonunu ardarda �a��rarak her alana ula�abilirsiniz.

typedef struct st_mysql_field {
  char *name;                   /* s�tunun ismi */
  char *table;                  /* s�tun bir alan ise s�t�nun tablosu*/
  char *def;                    /* Varsay�lan de�er (mysql_list_fields taraf�ndan atan�r)*/
  enum enum_field_types type;   /* Alan tipi mysql_com.h'a bak�n*/
  unsigned int length;          /* S�tunun uzunlu�u*/
  unsigned int max_length;      /* Se�ilen k�menin maksimum geni�li�i*/
  unsigned int flags;           /* Div bayraklar�*/
  unsigned int decimals;        /* Alandaki numaralar�n say�s�*/
} MYSQL_FIELD;

my_ulonglong
Bu tip, sat�rlar�n say�s�n� ve mysql_affected_rows(), mysql_num_rows ve mysql_insert_id() fonksiyonlar� i�in kullan�l�r.0-1.84e19 aral���ndad�r.Bu de�eri yazd�rabilmek i�in, bu tipi �nce unsigned long tipine d�n��t�r�p sonra %lu bi�imini kullanmal�s�n�z.�rne�in
printf (S�tun say�s�: %lu\n", (unsigned long) mysql_num_rows(result));

typedef unsigned long my_ulonglong;

 

MySQL'e Ba�lanma ve Bir Sorgulama Yapma

�u anda, makinan�zda MySQL'in y�kl� oldu�unu, bir kullan�c� ve bir veritaban� i�inde bir tablonun olu�turuldu�unu vasrsay�yorum.E�er bu istenenlerle ilgili bir sorun varsa l�tfen www.mysql.com adresine bak�n�z.

MySQL C UGA'lerini mysqlclient k�t�phanesinin i�inde oldu�unu daha �nce s�ylemi�tik.Bu nedenle MySQL kodlar�n� derlerken gcc komutuna -lmysqlclient arg�man�n� eklememiz gerkmektedir.MySQL ba�l�k dosyalar� ise /usr/include/mysql (bu yol sistemden sisteme de�i�ebilir) alt�nda bulunmaktad�r.Kodumuza MySQL'in ana ba�l�k dosyas�n� eklemek i�in a�a��daki sat�r gerklidir:

#include <mysql/mysql.h>

Bu ba�l�k dosyas�nda MySQL de��ken tipleri ve temel fonksiyonlar bulunmaktad�r.

Daha sonra yapmam�z gereken MYSQL tipinde istedi�imiz veritaban�na ba�lanmakta kullanaca��m�z bir de�i�ken olu�turmak.Bunun i�in basit�e

MYSQL *mysql;

sat�r� yeterlidir.

Veritaban�na ba�lanmadan �nce

mysql_init(MYSQL *mysql)

fonksiyonunu �a��rarak mysql de�i�kenimizi ba�latal�m.Daha sonra

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);

fonksiyonu ile ba�lat� ger�ekle�ir.Buradaki mysql de�i�keni, mysql_init i�inde kulland���m�z mysql ile ayn�d�r.host, MySQL'in �zerinde �al��t��� makinan�n ad�; user, MySQL'e ba�lan�rken kullanaca��m�z kullan�c� ad�; passwd, bu kulan�c�ya ait �ifre; db, kullanca��m�z veritaban�n�n ad�; port, TCP/IP ba�lants� i�in port numaras�; unix_socket, ba�lant� tipi; clientflag, mysqld'nin daha ODBC'ye benzer �al��mas� i�in gerekli bayraklar.�imdilik 0 de�erini kullanaca��z.E�er ba�lant� ge�ekle�irse, bu fonksiyon 0 de�erini d�ner.

Art�k veritaban�na ba�land�k ve sorgulama yapabiliriz.Bunun i�in bir query katar�(string) olu�tural�m:

char *query;

Bu katar� kullanarak istedi�imiz SQL c�mleci�ini kurabilir ve sorgualamay� yapabiliriz.Sorgulama yapan fonksiyon:

int STDCALL mysql_real_query(MYSQL *mysql,
		             const char *q,
                             unsigned int length);
Burada mysql, daha �nce kulland���m�z de�er ile ayn�.q, yapacak oldu�umuz sorguya ait SQL c�mleci�i.Bu de�er i�in oluturmu� oldu�umuz query de�erini kullanaca��z.length ise sorgu c�mleci�inin uzunlu�udur.E�er bir sorun ��kmaz ise fonksiyon 0 de�erini d�ner.

Sorgu yap�ld�ktan sonra sonu�lar� kullanabilmemiz i�in �ncelikle MYSQL_RES tipinde bir de�i�kene gereksinim vard�r.A�a��daki sat�r bu de�i�keni olu�turur:

MYSQL_RES *res;
Daha sonra
mysql_use_result(MYSQL *query)
fonksiyonu ile sorgudan ��kan sonu�lar� kullanabiliriz.

Sorgular� kolayca yapabiliyoruz ancak onlar� kullanabilme i�in birka� fonksiyona daha ihtiyac�m�z var.Bunlardan ilki

MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result);
Bu fonksiyon ile elde etti�imiz sonucu sat�rlar halinde alabiliyoruz.Ama farkedece�iniz gibi bu fonksiyon MYSQL_ROW tipinde bir de�i�ken d�nd�r�yor.B�yle bir de�i�ken olu�turabilmek i�in
MYSQL_ROW row;
sat�r� yeterlidir.B�ylece sonucun ilk sat�r�n� row de�i�kenine atm�� oluyoruz.Yukar�da da a��klad���m gibi bu row de�i�keni katar dizisidir.Yani �lk sat�r�n ilk s�tununu row[0], ikinci s�tununu row[1],... tutmaktad�r.mysql_fetch_row fonksiyonunu her kullan���m�zda bir sonraki sat�ra ge�eriz.E�er son sat�ra gelmi� isek fonksiyon negatif de�er �retir. ��imiz bittikten sonra yapaca��m�z tek �ey ba�lant�y� kaptmakt�r.Bunu i�in
mysql_close(MYSQL *mysql)
fonksiyonunu kullan�r�z.  

Bir Ka� �zellik

Yap�lan sorgulamadan elde etti�imiz sonu�lar hakk�nda biraz bilgi edinmeye �al��al�m."Yap�lan sorgulamadan ka� alan elde ettik ?" sorusu ile ba�layal�m:Bu sorunun yan�t�n�
unsigned int STDCALL mysql_num_fields(MYSQL *mysql);
fonksiyonu vermektedir.Fonsiyon yap�lan sorgudan ��kan alan say�s�n vermektedir.Asl�nda fonksiyon, hangi tabloda arama yapt�ysak o tablonun alan say�s�n� verir.

Ayn� �ekilde elde etti�imiz sonu�ta ka� tane sat�r oldu�unu ��renmek i�in

my_ulonglong STDCALL mysql_num_rows(MYSQL_RES *res);

fonksiyonunu kullan�r�z.

my_ulonglong STDCALL mysql_affected_rows(MYSQL *mysql);

fonksiyonu ekleme, silme, de�i�tirme i�lemlerinden etkilenen sat�r say�s�n� verir.Fonksiyonun my_ulonglong tipinde veri d�nd�rd���ne dikkat edin.

�rnek bir kod ile bitirelim:

#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( "Veritaban�na ba�lan�rken hata olu�tu.Hata kodu: %s\n",
                       mysql_error(mysql));
        }
        else printf("Ba�land�...\n");

        query="select * from Deneme";

        t=mysql_real_query(mysql,query,(unsigned int) strlen(query));
        if (t)
        {
           printf("Sorgulama yaparken hata olu�tu.Hata kodu: %s\n",
                   mysql_error(mysql));
        }
        else printf("Sorgulad�...\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);
}
 

�nerilen Kaynaklar

 

Bu yaz� i�in g�r�� bildiriminde bulunabilirsiniz

Her yaz� kendi g�r�� bildirim sayfas�na sahiptir. Bu sayfaya yorumlar�n�z� yazabilir ve di�er okuyucular�n yorumlar�na bakabilirsiniz.
 talkback page 

<--, Bu say�n�n ana sayfas�na gider

G�rsely�re sayfalar�n�n bak�m�, LinuxFocus Edit�rleri taraf�ndan yap�lmaktad�r
© �zcan G�ng�r, FDL
LinuxFocus.org
�eviri bilgisi:
tr --> -- : �zcan G�ng�r <ozcangungor(at)netscape.net>
tr --> en: �zcan G�ng�r <ozcangungor(at)netscape.net>

2003-07-17, generated by lfparser version 2.42