|
|
Bu makalenin farkl� dillerde bulundu�u adresler: English Castellano ChineseGB Deutsch Francais Nederlands Portugues Russian Turkce Polish |
�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�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:
|
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 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.
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); }
|
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:
|
2003-07-17, generated by lfparser version 2.42