560 likes | 675 Views
MySQL C API Izbor tipova i funkcija sa primerima. Miloš Kralj Zoran Jakšić. C API (Application Programming Interface) kod se distribuira zajedno sa MySQL-om, u okviru biblioteke pod nazivom mysqlclient , i omogućava programima pisanim na programskom jeziku C pristup bazama podataka.
E N D
MySQL C APIIzbor tipova i funkcija sa primerima Miloš Kralj Zoran Jakšić
C API (Application Programming Interface) kod se distribuira zajedno sa MySQL-om, u okviru biblioteke pod nazivom mysqlclient, i omogućava programima pisanim na programskom jeziku C pristup bazama podataka. • Takođe, mnogi klijenti u samom izvornom kodu MySQL-a pisani su na programskom jeziku C. • Većina ostalih klijentskih API-ja takođe koristi biblioteku mysqlclient za komunikaciju sa MySQL serverom.
Klijent ima određenu maksimalnu veličinu komunikacionog bafera. • Veličina ovog bafera, koja inicijalno ima vrednost 16Kb, automatski se podešava u zavisnosti od potreba programa. Manuelno podešavanje maksimalne vrednosti bafera na neku veliku vrednost ne uzrokuje samo po sebi povećanje potrošnje resursa, jer se veličina bafera povećava jedino po potrebi. • Ovaj bafer mora biti dovoljno veliki kako bi mogao da sadrži jedan SQL iskaz (za komunikaciju između klijenta i servera), i jedan red podataka koji su vraćeni nazad kao rezultat upita.
Na primer: Ukoliko imamo BLOB (BinaryLargeOBject) polja koja mogu sadržati do 16Mb podataka, onda komunikacioni bafer mora biti veličine bar 16Mb i na strani servera i na strani klijenta. • Na strani klijenta maksimalna vrednost ovog bafera inicijalno je podešena na 16Mb, dok kod servera ta vrednost iznosi 1Mb i može se po potrebi promeniti menjanjem vrednosti parametra max_allowed_packet. • Nakon svakog upita, radi bezbednosti, server sam smanjuje veličinu komunikacionog bafera na vrednost iz parametra net_buffer_length. Klijent, s druge strane čuva podešenu veličinu dok god je veza uspostavljena.
MySQL C API strukture i tipovi podataka • MYSQL • Predstavlja “handle” za jednu uspostavljenu vezu sa bazom podataka. Nije sigurno praviti kopije ovakvih struktura jer ne postoji garancija da će takva kopija moći da se koristi. • MYSQL_RES • Ova struktura treba da sadrži podatke vraćene kao rezultat posle izvršenog upita koji vraća redove. (SELECT, SHOW, DESCRIBE, EXPLAIN).
typedef struct st_mysql { NET net; /* Parametri komunikacije */ gptr connector_fd; /* ConnectorFd ili SSL enkripcija*/ 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; /* Identifikacioni broj veze na serveru */ my_ulonglong affected_rows; my_ulonglong insert_id; my_ulonglong extra_info; unsigned long packet_length; enum mysql_status status; MYSQL_FIELD *fields; MEM_ROOT field_alloc; my_bool free_me; /* brisanje pri pozivu mysql_close() */ my_bool reconnect; /* automatski reconnect */ struct st_mysql_options options; char scramble_buff[9]; struct charset_info_st *charset; unsigned int server_language; } MYSQL;
typedef struct st_mysql_res { my_ulonglong row_count;/* broj redova */ unsigned int field_count, current_field; MYSQL_FIELD *fields; /* informacije o poljima */ MYSQL_DATA *data; /* podaci */ MYSQL_ROWS *data_cursor; MEM_ROOT field_alloc; MYSQL_ROW row; /* za nebaferisano čitanje */ MYSQL_ROW current_row; /* bafer za tekući red */ unsigned long *lengths; /* dužine kolona tekućeg reda*/ MYSQL *handle; /* za nebaferisano čitanje */ my_bool eof; } MYSQL_RES;
MYSQL_ROW • Može da sadrži jedan red podataka. Potpuno bezbedno po pitanju tipova. Implementirana je kao niz stringova. (Ukoliko vrednosti polja mogu da sadrže binarne podatke, ne smeju se tretirati kao niske terminisane nulom, jer binarni podaci mogu sadržati nula bajtove) • Redovi se uzimaju pozivima mysql_fetch_row() • MYSQL_FIELD • Ova struktura sadrži informacije o poljima, kao što su na primer: ime polja, tip, veličina, itd. Podaci za svako pojedinačno polje pohranjuju se u strukturu uzastopnim pozivima funkcije mysql_fetch_field().
my_ulonglong • Tip podatka koji se koristi kako bi se izrazio broj redova neke tabele ili rezultata upita, kao i u funkcijama mysql_affected_rows(), mysql_num_rows() i mysql_insert_id(). • Naime, radi se o neoznačenom celobrojnom tipu veličine 64bit-a pa ima opseg od 0 do 1.84467 x1019 • Na nekim sistemima pokušaj štampanja vrednosti ovog tipa korišćenjem f-je printf() rezultuje greškom. Ona se mora konvertovati u vretnost tipa unsigned long i onda pozvati printf() sa parametrom %lu za format. • my_bool • Bulovski tip. Sadrži vrednosti true (ne-nula) i false (nula).
Struktura MYSQL_FIELD typedef struct st_mysql_field { char *name; char *org_name; char *table; char *org_table; char *db; char *catalog; char *def; unsigned long length; unsigned long max_length; unsigned int name_length; unsigned int org_name_length; unsigned int table_length; unsigned int org_table_length; unsigned int db_length; unsigned int catalog_length; unsigned int def_length; unsigned int flags; unsigned int decimals; unsigned int charsetnr; enum enum_field_types type; } MYSQL_FIELD;
char *name • Predstavlja ime polja i to je string terminisan nulom. Ukoliko je nekom polju pridodat alias pomoću AS, vrednost ovog člana je taj alias. • char *org_name • Ime polja kao string terminisan nulom. Aliasi su ignorisani. • char *table • Ime tabele koja sadrži konkretno polje. Za polja koja su rezultat izračunavanja ova vrednost je prazna, a ukoliko je kolona izabrana iz pogleda ona sadrži ime pogleda. Takođe u slučaju postojanja aliasa, prikazuje se njegovo ime.
char *org_table • Slično kao malopre, aliasi se ignorišu. U slučaju upita nad pogledom, vrednost sadrži ime tabele nad kojom je pogled definisan. • char *db • Ime baze podataka iz koje je konkretno polje. Ako je polje rezultat izračunavanja, ova vrednost je prazna. • char *catalog • Ime kataloga. Podrazumevana vrednost je “def”. • unsigned long length • Širina polja - odgovara širini prikaza u bajtovima.
unsigned long max_length • Maksimalna širina polja za čitav rezultat. Ovo predstavlja dužinu u bajtovima najšireg polja u rezultatu. Na primer, ukoliko najšire polje ima vrednost “-12.345”, vrednost ovog člana strukture biće 7. • unsigned int name_length, org_name_length, table_length, org_table_length, db_length, catalog_length, def_length • Predstavljaju dužine odgovarajućih stringova, onako kako ih vraća strlen(). • unsigned int flags • Zastavice za različite namene... Neoznačeni ceo broj koji može biti 0 ili sledeći bitovi mogu biti uključeni.
Primer: • if (field->flags && PRI_KEY_FLAG) • printf (“Ovo polje je deo primarnog ključa”); • Napomena: • Korišćenje zastavica BLOB_FLAG, ENUM_FLAG, SET_FLAG i TIMESTAMP_FLAG je u dokumentaciji označeno kao zastarelo iz razloga što se one više odnose na tip polja, a ne na atribute polja. Preporučuje se poređenje vrednosti člana field->type sa konstantama MYSQL_TYPE_BLOB, MYSQL_TYPE_ENUM, MYSQL_TYPE_SET, MYSQL_TYPE_TIMESTAMP. • Primer: • if (field->type == MYSQL_TYPE_BLOB) • printf (“Ovo polje je BLOB”);
unsigned int charsetnr • Broj karakterskog skupa datog polja. Može se koristiti za razlikovanje binarnih i ne-binarnih podataka za podatke tipa stringova. Ukoliko je vrednost atributa 63 onda se radi o binarnim podacima. Na ovaj način se pravi razlika između BINARY i CHAR, VARBINARY i VARCHAR kao i razlika između BLOB i TEXT tipova. • unsigned int decimals • Broj cifara koje se koriste kod polja numeričkog tipa • enum enum_field_types type • Predefinisane vrednosti za tip polja. U sledećoj tabeli se nalaze konstante koje se koriste u ovu svrhu.
MySQL C API Pregled funkcija • Programi koji koriste MySQL C API trebalo bi da prate sledeći opšti okvir prilikom interakcije sa MySQL-om: • 1. Inicijalizacija MySQL biblioteke pozivanjem funkcije mysql_library_init(). • 2. Inicijalizacija “connection handler”-a pozivanjem funkcijemysql_init() i uspostavljanje veze sa serverom pozivanjem funkcije mysql_real_connect() • 3. Izvršavanje SQL upita i rad sa rezultatima • 4. Prekidanje veze sa MySQL serverom pozivom mysql_close() • 5. Završetak rada sa bibliotekom - mysql_library_end()
Svrha pozivanja mysql_library_init() i mysql_library_end() je da se obezbedi valjana inicijalizacija i finalizacija MySQL biblioteke. • Ukoliko se ne pozove mysql_library_end(), jedan blok memorije ostaće alociran, i van dalje kontrole. • U okruženju koje ne koristi višenitno programiranje, poziv za inicijalizaciju biblioteke može se propustiti jer će mysql_init() pozvati funkciju mysql_library_init(). U svakom slučaju mysql_library_init() nije “thread-safe” kao ni mysql_init(), upravo zbog pozivanja ove funkcije.
Za povezivanje na server poziva se funkcija mysql_init() za inicijalizaciju “connection handler”-a, pa se nakon toga poziva mysql_real_connect() korišćenjem dobijenog “handle”-a kao parametra, pored ostalih parametara kao što su ime hosta, korisničko ime, lozinka... • Nakon uspostavljanja veze, mysql_real_connect() podešava fleg reconnect (u okviru MYSQL strukture) na 1 u verzijama MySQL starijim od 5.0.3, ili na 0 u novijim verzijama. Vrednost 1 znači da ukoliko iskaz nije izvršen usled gubitka veze, pre odustajanja i ispisa poruke o grešci pokušaće se ponovno uspostavljanje veze. • Kada veza više nije potrebna pozivamo mysql_close()
Dok je veza aktivna klijent može da šalje SQL iskaze serveru korišćenjem funkcije mysql_query() ili mysql_real_query(). Razlika između ove dve funkcije je u tome što prva očekuje da je iskaz zadat kao string terminisan nulom, dok druga funkcija očekuje odbrojani string. Ovo je posebno pogodno ako string sadrži binarne podatke u kojima se mogu naći nula bajtovi. • Za svaki ne SELECT upit (kao što su INSERT, UPDATE, DELETE), može se saznati koliko redova je promenjeno pozivom funkcije mysql_affected_rows(). • Za SELECT upite, rezultat se dobija u obliku skupa rezultata - struktura MYSQL_RES
Postoje dva načina za procesiranje rezultata. • Prvi je da prvo učitamo sve rezultate u klijentovu memoriju korišćenjem funkcije mysql_store_result(), pa da ih obrađujemo. • Drugi način je da, korišćenjem funkcije mysql_use_result(), inicijalizujemo memoriju za rezultat, pa da u nju ubacujemo red po red. Taj način je nešto brži i koristi manje memorije.
U oba slučaja redovima pristupamo korišćenjem funkcije mysql_fetch_row(). • Prednost mysql_store_result() je što omogućuje korišćenje funkcija za pretragu i prebrojavanje redova, ali zato koristi znatno više memorije. • Prednost mysql_use_rseult() je u tome što koristi manje memorije, ali zato ne znamo koliko redova ima naš rezultat dok ih sve ne preuzmemo i moramo ih preuzeti sve čak i ako nađemo traženi red pre nego što ih sve izlistamo.
Posle korišćenja bilo kog od ova dva načina za iščitavanje rezultata treba pozvati mysql_free_result() da bi oslobodili memoriju. • API omogućava da proverimo da li je naš upit uspešan korišćenjem funkcije mysql_field_count(). Ukoliko posle svakog upita odradimo mysql_store_result() možemo saznati da li je upit bio uspešan ne znajući da li smo radili SELECT, INSERT, DELETE ili neki drugi upit. • Naime ukoliko je upit vratio MYSQL_RES strukturu znači da smo odradili SELECT upit koji je uspeo i možemo iščitati rezultat.
Ukoliko nismo dobili MYSQL_RES strukturu korišćenjem mysql_field_count() možemo znati da li je upit bio uspešan. • Ukoliko je njena povratna vrednost nula znači da smo odradili uspešan upit koji ne vraća rezultat (npr. INSERT ili DELETE). • Druga mogućnost je da smo kao povratnu vrednost dobili neki ne-nula broj. To nam ukazuje da je upit bio SELECT tipa koji je napravio grešku.
mysql_library_init() • int mysql_library_init(int argc, char **argv, char **groups) • Opis: • Ovu funkciju treba pozvati da bi se inicijalizovala MySQL biblioteka pre korišćenja bilo koje druge MySQL funkcije. • Argumenti argc i argv su analogni istoimenim argumentima main() funkcije. • Argument groups je niz stringova koji sadrže imena grupa u opcionim fajlovima čije opcije pozivamo. Poslednji u nizu bi trebao da bude NULL. • Povratne vrednosti: • Nula ukoliko je uspešno izvršena, ne nula u suprotnom. • Greške: • Nema.
mysql_library_end() • void mysql_librarz_end(void) • Opis: • Ova funkcija finalizuje MySQL biblioteku. Treba je pozvati kada završimo sa korišćenjem biblioteke(npr. kada se diskonektujemo sa servera). • Povratne vrednosti: • Nema. • Greške: • Nema.
mysql_init() • MYSQL *mysql_init(MYSQL *mysql) • Opis: • Alocira i inicijaliyuje MYSQL strukturu koju možemo koristiti za mysql_real_connect(). Ukoliko je mysql NULL pokazivač funkcija će alocirati, inicijalizovati i vratiti novu strukturu. U tom slučaju memoriju možemo osloboditi pomoću mysql_close() funkcije. • Povratne vrednosti: • Inicijalizovani MYSQL pokazivač. NULL ukoliko nije bilo dovoljno memorije za alokaciju. • Greške: • U slučaju nedostatka memorije NULL je povratna vrednost funkcije.
mysql_close() • void mysql_close(MYSQL *mysql) • Opis: • Zatvara, prethodno otvorenu, konekciju. • Povratne vrednosti: • Nema. • Greške: • Nema.
mysql_connect() • MYSQL *mysql_connect(MYSQL *mysql, const char *host, const char *user, const char *password) • Opis: • Ova funkcija je zastarela. Koristite mysql_real_connect() umesto nje. • Povratne vrednosti: • Iste kao i za mysql_real_connect(). • Greške: • Iste kao i za mysql_real_connect().
mysql_real_connect() • MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *password, const char *db, unsigned int port, const char *unix_socket, unsigned long client_flag) • Opis: • mysql_real_connect() pokušava da uspostavi konekciju sa MYSQL bazom podataka koja je pokrenuta na host-u.mysql_real_connect() mora uspešno da se izvrši pre nego što možemo izvršavati bilo koje druge API funkcije koje zahtevaju validnu MYSQL konekciju. • Argumenti funkcije su sledeci: • Prvi parametar je adresa postojeće MYSQL strukture. Pre pozivanja mysql_real_connect() mora se pozvati mysql_init() da bi inicijalizovali MYSQL strukturu. • Vrednost host može biti ime host-a ili njegova IP adresa. Ukoliko je host NULL ili string “localhost” konektujemo se na lokalnog host-a. • user argument sadrži MySQL login ID korisnika. Ukoliko jeuser NULL ili prazan string podrazumeva se trenutni korisnik. • password argument sadrži šifru za korisnika. • db je ime baze podataka koju želimo da koristimo po defaultu.
Ukoliko port nije 0 to će biti port za TCP/IP konekciju. • Ukoliko unix_socket nije NULL, string specificira socket ili imenovani pajp koji će se koristiti. • client_flag je uglavnom 0, ali može biti i kombinacija nekih od flagova (npr. CLIENT_NO_SCHEMA, CLIENT_COMPRESS, CLIENT_SSL…) • Povratne vrednosti: • Pokazivač na MYSQL konekciju, ukoliko je konektovanje bilo uspešno, odnosno NULL ukoliko je bilo neuspešno. Kod uspešnog konektovanja povratna vrednost je ista kao i prvi argument. • Greške: • CR_CONN_HOST_ERROR Nije uspeo da se konektuje na MySQL server. • CR_CONNECTION_ERROR Nije uspeo da se konektuje na lokalni MySQL server. • CR_IPSOCK_ERROR Nije uspeo da napravi IP socket. • CR_OUT_OF_MEMORY Nedostatak memorije.
CR_CREATE_SOCKET_ERROR Nije uspeo da napravi Unix socket. • CR_UNKNOWN_HOST Nije uspeo da nađe IP za zadat hostname. • CR_VERSION_ERROR Greška prouzrokovana pokušajem da se konektuje na server koji koristi drugačiji protokol od biblioteke klijenta. • CR_NAMEDPIPEOPEN_ERROR Nije uspeo da napravi imenovani pajp pod Windowsom. • CR_NAMEDPIPEWAIT_ERROR Nije uspeo da sačeka imenovani pajp pod Windowsom. • CR_NAMEDPIPESETSTATE_ERROR Nije uspeo da dobije pokazivač na imenovani pajp po Windowsom. • CR_SERVER_LOST Ukoliko je connect_timeout > 0 i bilo je potrebno više od connect_timeout sekundi da bi se konektovao na server, odnosno ukoliko je server umro.
mysql_change_user() • my_bool mysql_change_user(MYSQL *mysql, const char *user, const char *password, const char *db) • Opis: • Menja korisnika i čini da baza, specifikovana pomoću db, postane trenutna baza na konekciji specificiranoj pomoću mysql. U narednim upitima ova baza se podrazumeva ukoliko ne specificiramo drugačije. mysql_change_user() ne uspeva ukoliko korisnik nemože biti identifikovan, odnosno ukoliko nema pristup bazi. U tom slučaju se korisnik i baza ne menjaju. db parametar se može postaviti na NULL ukoliko ne želimo da imamo default bazu. • Ova komanda resetuje stanje kao da je urađen novi connect. • Povratne vrednosti: • Nula ukoliko je uspelo, ne-nula ukoliko se desila greška. • Greške: • Iste kao i za mysql_real_connect().
mysql_select_db() • int mysql_select_db(MYSQL *mysql, const char *db) • Opis: • Čini da baza koja je specificirana stringom na koji pokazuje db postane default baza za zadatu konekciju. mysql_select_db() neće uspeti ukoliko korisnik nema prava nad zadatom bazom. • Povratne vrednosti: • Nula za uspeh, ne nula ukoliko se javila neka greška. • Greške: • Iste kao i kod mysql_real_query().
mysql_query() • int mysql_query(MYSQL *mysql, const char *stmt_str) • Opis: • Ova funkcija je zastarela. Koristite mysql_real_query() umesto nje. • Povratne vrednosti: • Iste kao i kod mysql_real_query(). • Greške: • Iste kao i kod mysql_real_query().
mysql_real_query() • int mysql_real_query(MYSQL *mysql, const char *stmt_str, unsigned long length) • Opis: • Izvršava SQL upit na koji ukazuje stmt_str koji je string čija je dužina length. String se mora sastojati od jednog upita i ne treba stavljati “;” na kraj upita. mysql_query nemožemo koristiti za upite koji sadrže binarne podatke(jer binarni podaci mogu sadržati “\0” karakter koji bi mysql_query() interpretirao kao kraj stringa). • Povratne vrednosti: • Nula ukoliko je upit uspešan. Ne nula ukoliko nije. • Greške: • CR_COMMANDS_OUT_OF_SYNC Komande su izvršavane pogrešnim redosledom. • CR_SERVER_GONE_ERROR MySQL server je nestao. • CR_SERVER_LOST Konekcija ka serveru je izgubljena za vreme izvršavanja upita. • CR_UNKNOWN_ERROR Nepoznata greška.
mysql_store_result() • MYSQL_RES *mysql_store_result(MYSQL *mysql) • Opis: • Posle pozivanja funkcija mysql_query() ili mysql_real_query() moramo pozvati mysql_store_result() ili mysql_use_result() za svaki upit koji vraća podatke (npr. SELECT, SHOW, DESCRIBE…). Takođe, moramo pozvati mysql_free_result() kada završimo sa obradom rezultata. • mysql_store_result() iščitava čitav rezultat, alocira klijentovu memoriju za MYSQL_RES strukturu, i u nju upisuje rezultat. mysql_store_result() vraća NULL pokazivač ukoliko upit nije vratio rezultat (npr. UPDATE upit). Takođe, vraća NULL pokazivač i kada se desi greška. Da bi proverili da li je došlo do greške možemo koristiti mysql_error() ili mysql_errno(). Ukoliko naš SELECT upit nema rezultat, povratna vrednost mysql_store_result() funkcije će biti prazna MYSQL_RES struktura.
Povratne vrednosti: • MYSQL_RES struktura koja sadrži rezultat ukoliko nema gerške, odnosno NULL ukoliko se desila greška. • Greške: • CR_COMMANDS_OUT_OF_SYNC Komande su izvršavane pogrešnim redosledom. • CR_OUT_OF_MEMORY Nedostatak memorije. • CR_SERVER_GONE_ERROR MySQL server je nestao. • CR_SERVER_LOST Konekcija ka serveru je izgubljena za vreme izvršavanja upita. • CR_UNKNOWN_ERROR Nepoznata greška.
mysql_use_result() • MYSQL_RES *mysql_use_result(MYSQL *mysql) • Opis: • Da bi pročitali rezultat upita koji smo napravili moramo koristiti ili mysql_store_result() funkciju ili mysql_use_result() funkciju. • mysql_use_result() inicijalizuje rezultat, ali ga, za razliku od mysql_store_result(), ne učitava u klijenta. Zato, kada koristimo mysql_use_result(), moramo učitavati red po red korišćenjem funkcije mysql_fetch_row(). Ovaj način iščitavanja rezultata je nešto brži i koristi znatno manje memorije od mysql_store_result() jer ne koristi lokalni bafer. Sa druge strane ovaj način ne bi trebali da koristimo ukoliko ćemo mnogo procesirati svaki red na klijentskoj strani jer na taj način onemogućavamo server da update-uje bilo koju tabelu iz koje iščitavamo rezultat. • Kada korisitmo mysql_use_result() moramo izvršavati mysql_fetch_row() dok ne dobijemo NULL jer će nam u suprotnom ne-preuzeti redovi sa servera stići sa sledećim upitom. Uz ovu funkciju nemožemo koristiti neke funkcije (kao npr. mysql_num_rows() ili mysql_affected_rows()). • Kada završimo sa iščitavanjem rezultata trebamo pozvati mysql_free_result().
Povratne vrednosti: • MYSQL_RES struktura u slučaju uspeha, NULL u suprotnom slučaju. • Greške: • CR_COMMANDS_OUT_OF_SYNC Komande su izvršavane pogrešnim redosledom. • CR_OUT_OF_MEMORY Nedostatak memorije. • CR_SERVER_GONE_ERROR MySQL server je nestao. • CR_SERVER_LOST Konekcija ka serveru je izgubljena za vreme izvršavanja upita. • CR_UNKNOWN_ERROR Nepoznata greška.
mysql_errno() • unsigned int mysql_errno(MYSQL *mysql) • Opis: • Za konekciju, specificiranu pomoću mysql argumenta, ova funkcija će vratiti kod greške za poslednju korišćenu funkciju koja može da vrati grešku. Ukoliko je povratna vrednost nula znači da do greške nije ni došlo. Kodovi grešaka nastalih kod klijenta se nalaze u errmsg.h header-u, a kodovi serverskih grešaka se nalaze u mysql_error.h header-u. • Povratne vrednosti: • Kod greške ukoliko poslednja mysql_***() funkcija nije uspela, odnosno nula ukoliko jeste uspela. • Greške: • Nema.
mysql_error() • const char *mysql_error(MYSQL *mysql) • Opis: • Za konekciju, specificiranu pomoću mysql argumenta, ova funkcija će vratiti string koji sadrži opis greške koja se desila kod poslednje API funkcije koja nije uspela. Ukoliko funkcija nije bila neuspešna povratna vrednost mysql_error() može biti prethodna greška ili prazan string koji ukazuje na to da nije bilo greške. • Povratne vrednosti: • String koji opisuje grešku ili prazan string. • Greške: • Nema.
mysql_affected_rows() • my_ulonglong mysql_affected_rows(MYSQL *mysql) • Opis: • Posle izvršenog upita pomoću mysql_query() ili mysql_real_query(), vraća broj redova koji su promenjeni (za UPDATE), izbrisani (za DELETE) ili ubačeni (za INSERT). U slučaju da smo izvšili SELECT upit vraća istu vrednost kao i mysql_num_rows(). • Povratne vrednosti: • Integer veći od nule označava broj redova koji su promenjeni, izbrisani, ubačeni ili izabrani. Nula nam govori da nijedan red nije promenjen u slučaju UPDATE upita, da nijedan red nije odgovarao WHERE klauzuli upita ili da nijedan upit još uvek nije izvršen. -1 označava da je query vratio geršku ili da je, za SELECT upit, mysql_affected_rows() pozvan pre mysql_store_result(). Pošto mysql_affected_rows() vraća unsigned integer, da bi proverili da li je vratio -1, rezultat moramo porediti sa (my_ulonglong) – 1. • Greške: • Nema.
Primer: char *poskupljenje = "UPDATE proizvodi SET cena=cena*1.25 WHERE grupa=10"; mysql_real_query(&mysql,poskupljenje,strlen(poskupljenje)); Printf(“Broj poskupelih proizvoda: %ld", (long) mysql_affected_rows(&mysql));
mysql_fetch_row() • MYSQL_ROW mysql_fetch_row(MYSQL_RES *result) • Opis: • Vraća sledeći red iz rezultata. Ukoliko ga koristimo posle mysql_store_result(), ova funkcija će vratiti NULL kada više ne bude redova. Ukoliko ga koristimo posle mysql_use_result(), ova funkcija vraća NULL kada više nema redova ili ukoliko je došlo do greške. • Povratne vrednosti: • MYSQL_ROW struktura, ukoliko postoji, odnosno NULL ukoliko ne postoji sledeći red ili ukoliko se desila greška. • Greške: • Obratiti pažnju na to da se greške ne resetuju između poziva ove funkcije. • CR_SERVER_LOST Konekcija prema serveru je izgubljena za vreme izvršavanja upita. • CR_UNKNOWN_ERROR Nepoznata greška.
mysql_fetch_field() • MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result) • Opis: • Vraća jednu kolonu rezultata u obliku MYSQL_FIELD strukture. Ovom funkcijom možemo dobiti informacije o svim kolonama ukoliko je pozivamo više puta na istom rezultatu. Vratiće NULL ukoliko nema više kolona. Postavlja se da vraća informaciju o prvoj koloni svaki put kad izvršimo novi SELECT upit. • Povratne vrednosti: • MYSQL_FIELD struktura za trenutnu kolonu, NULL ukoliko nema više kolona. • Greške: • Nema.
Primer: MYSQL_FIELD *field; while((field = mysql_fetch_field(result))) { printf("field name %s\n", field->name); }
mysql_fetch_lengths() • unsigned long *mysql_fetch_lengths(MYSQL_RES *result) • Opis: • Vraća dužine kolona trenutnog reda iz rezultata. Ukoliko planiramo da kopiramo vrednosti polja ova informacija je korisna jer pomoću nje možemo izbeći korišćenje strlen() funkcije. Takođe, ukoliko rezultat sadrži binarne podatke, moramo koristiti ovu funkciju da bi saznali veličinu podataka jer srtlen() neće vratiti tačnu vrednost za bilo koje polje koje sadrži NULL karaktere. • Povratne vrednosti: • Niz unsigned long integera koji predstavljaju dužinu svake kolone. NULL ukoliko je došlo do greške. • Greške: • mysql_fetch_lengths() je validan samo za trenutni red rezultata. Vraća NULL ukoliko ga pozovemo pre poziva mysql_fetch_row() ili ako ga pozovemo posle uzimanja svih redova u rezultat.
mysql_field_count() • unsigned int mysql_field_count(MYSQL *mysql) • Opis: • Vraća broj kolona za poslednji upit na konekciji. • Povratne vrednosti: • Unsigned integer koji predstavlja broj kolona u rezultatu. • Greške: • Nema.