Welcome to Scribd, the world's digital library. Read, publish, and share books and documents. See more
Download
Standard view
Full view
of .
Save to My Library
Look up keyword
Like this
1Activity
0 of .
Results for:
No results containing your search query
P. 1
mysql 250

mysql 250

Ratings: (0)|Views: 27 |Likes:
Published by Lupu Adrian

More info:

Published by: Lupu Adrian on Mar 18, 2011
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as DOC, PDF, TXT or read online from Scribd
See more
See less

03/18/2011

pdf

text

original

 
250 Partea a ll-a Utilizarea interfeţelor de programare ale sistemului MySQLVersiunea modificată a funcţiei do_connect () este similară cu versiunea anterioară^ toate punctele de vedere, cudouă excepţii:• Nu transferă un parametru db_name formei mai vechi a funcţiei mysql_real_c(j nect (), deoarece versiunearespectivă nu dispune de un atare parametru.• Dacă numele bazei de date nu este NULL, funcţia do_connect () ape funcţia mysql_select_db() pentru atransforma baza de date denumit bază de date curentă. (Acest procedeu simulează efectul paramet db_name, carelipseşte.) Dacă baza de date nu poate fi selectată, do_connec afişează un mesaj de eroare, închide conexiunea sireturnează NULL pent indica eşecul operaţiei.• Exemplul 2. Acest exemplu se bazează pe modificările aduse funcţiei do_connect( j primul exemplu. Acestemodificări au ca rezultat trei seturi de apeluri la funcţiilfl eroare mysql_errno() şi mysql_error() şi este chiar obositor să scrii funcţiile res|| tive de fiecare dată când programul trebuie să „protesteze" la apariţia unei prob| Deasemenea, programul de afişare a erorii este agresiv din punct de vedere vizt dificil de citit. Este mai uşor să citiţiceva de genul acesta: print_error(conn, "mysql_real_connect() failed"); Deci, haideţi să încapsulăm scriereaerorilor într-o funcţie print_error (). Putem : funcţia astfel încât să efectueze o anumită operaţie chiar si în situaţiacând conn este l Astfel, putem folosi print_error() dacă apelul la funcţia mysql_init() eşuează ! avem ocombinaţie de apeluri (unele pentru fprintf () şi altele pentru print_erroC|Parcă aud pe cineva din spate care obiectează: „Păi nu sunteţi obligat să apelaţi; funcţii de eroare de fiecare datăcând trebuie să raportaţi o eroare, deci intenţiei: faceţi programul dificil de citit, pentru ca exempluldumneavoastră cu încapsula arate mai bine. Şi de fapt nici măcar nu veţi scrie tot programul de afişare a eroriiscrieţi o singură dată şi apoi folosiţi copierea şi lipirea dacă mai aveţi nevoie de Acestea sunt observaţii corecte,la care voi răspunde astfel:Chiar dacă folosiţi copierea şi lipirea, aceste operaţii sunt mai simplu i tuat cu secţiuni mai scurte de program.• Indiferent dacă preferaţi sau nu să invocaţi ambele funcţii de eroare la i raportare a unei erori, scrierea integralăa programului de raportare a i în „varianta lungă" duce la tentaţia de a folosi scurtături şi de a fi inconsa laraportarea erorilor. Plasarea codului de raportare a erorilor într-o container care este simplu de invocatatenuează această tentat îmbunătăţeşte consecvenţa programului.• Dacă vă decideţi vreodată să modificaţi formatul mesajelor dumneavc eroare, este mult mai uşor dacă trebuiesă efectuaţi modificarea într-un! loc, decât în tot programul. Sau, dacă vă decideţi să scrieţi mesajele de < într-unfişier jurnal în loc de (sau în afară de) a le scrie în stderr, este i piu dacă trebuie să modificaţi numai funcţiaprint_error(). Această flfl este mai puţin expusă la erori si, din nou, reduce tentaţia de a face jumătate de treabă şide a fi inconsecvent. *1Capitolul 6 Interfaţa API MySQL pentru C 251• Dacă folosiţi un utilitar de depanare atunci când vă testaţi programele, inserţia unui punct de întrerupere înfuncţia de raportare a erorilor este o modalitate convenabilă de a determina programul să se întrerupă atunci cânddepanatorul detectează o condiţie de eroare.Iată funcţia noastră print_error( ) de afişare a erorilor: void print_error (MYSQL *conn, char "message){fprintf (stderr, "%s\n", message); if (conn != NULL){fprintf (stderr, Error %u (%s)\n", mysql_errno(conn) , mysql_error(conn)) ;Funcţia print_error ( ) se află în fişierul common . c, deci vom adăuga un prototip al acesteia în fişierul common .h:voidprint_error(MYSQL *conn, char "message); Acum, funcţia do_connect ( ) poate fi modificată pentru a folosifuncţia print_er ror ( ) :MYSQL *do_connect(char *host_natne, char *user_name, char "password, char *db_name, unsigned int portjium, char *socket_name, unsigned int flags){MYSQL *conn /* pointer spre variabila de tratare a conexiunii */conn = mysql_init (NULL); /* aloca, iniţializează variabilade tratare a conexiunii */ if (conn == NULL){print_error(NULLj "mysql_init()f ailed (probably out of memory)"); return (NULL);} #if defined(MYSQL_VERSION_ID) && MYSQL_VERSION_ID >= 32200/* versiunea 3.22 si versiunile ulterioare */ if (mysql_real_connect (conn, host_name, user_name, password,db_name, port_num, socket_name, flags) == NULL){print_error(conn, "mysql_real_connect() failed"); return (NULL);
 
#else/* pentru MySQL anterior versiunii 3.22 */Continuare252 Partea a ll-a Utilizarea interfeţelor de programare ale sistemului MySQLContinuareif (mysql_real_connect (conn, nost_name, user_name, password, port_num, socket_name, flags) == NULL)print_error(conn, "mysql_real_connect() failed"); return(NULL);if (db_name != NULL) /* simularea efectului parametrului db_name */J if (mysql_select_db (conn, db_name) !=0)print_error(conn, "mysql_select_db() failed");mysql_close(conn);return(NULL);#endif return (conn);/* conexiunea a fost stabilita */Fişierul nostru sursă principal, clients.c, este asemănător cu client2.c, dar auj| eliminate toate liniile de programde conexiune şi întrerupere a conexiunii, f^ înlocuite cu apeluri la funcţiile container. Deci, fişierul sursă seprezintă astfel: /* clienta.c */tfinclude <stdio.h> #include <mysql.h> tfinclude "common.h"tfdefine def_host_name NULL tfdefine def_user_name NULL#define def_password NULL ^define def_db_name NULLMYSQL *conn;intmain (int argc, char *argv[])/* gazda la care se va stabili conexinea(valoare prestabilita = localhos /* nume utilizator (valoare prestabil= numele dumneavoastră de deschidea sesiunii de lucru) */ /* parola (valoare prestabilita =nici una) */ /* baza de date de utilizat (valoare Jprestabilita = nici una) *//* pointer spre variabila de tratare conexiunii */Capitolul 6 Interfaţa API MySQL pentru C 253conn = do_connect(def_host_name, def_user_name, def_password,def_db_name, def_port_num, def_socket_name, 0); if (conn == NULL) exit(1);/* aici are loc activitatea aplicaţiei */do_disconnect(conn); exit(O);Client 4 - Obţinerea parametrilor de conexiune la rulareAcum, când dispunem de un program de conexiune uşor de modificat si „blindat" în cazul apariţiei erorilor,suntem pregătiţi să aflăm cum putem face lucruri mai inteligente decât să folosim parametri de conexiuneNULL, ca de exemplu să permitem utilizatorului să specifice aceste valori la rulare.Clientul anterior, clients, continuă să prezinte un dezavantaj semnificativ, în sensul că parametrii de conexiunesunt codaţi în program. Pentru a modifica oricare dintre aceste valori, trebuie să editaţi fişierul sursă şi să-1recompilaţi, ceea ce nu este foarte convenabil, mai ales dacă doriţi să puneţi programul la dispoziţia altor persoane.O modalitate frecvent folosită de specificare a parametrilor de conexiune la rulare este de a folosi opţiunile dinlinia de comandă. Programele din distribuţia sistemului MySQL acceptă parametrii de conexiune într-una dincele două forme specificate în tabelul 6.1.Tabelul 6.1 Opţiuni standard din linia de comandă pentru MySQLParametruNumele gazdei Numele de utilizator ParolaNumărul portului Numele socluluiFormă scurtă-h nume_gazda-u nume_utilizator -p sau -pparola_dv-P numar_port -S nume socluFormă lungă- - host=mj/ne_gazc/a- -user=nume_i/tilizator --password sau
 
--password=parola_dv- -port=/iu/nar_port --socket=nume socluLPentru consecvenţa cu programele client MySQL standard, clientul nostru va accepta aceleaşi formate, ceea ceeste simplu de realizat, deoarece biblioteca client include o 'Vineţie pentru analiza opţiunilor.h plus, clientul nostru va putea să extragă informaţiile din fişierele cu opţiuni. Aceasta yă permite să plasaţiparametrii de conexiune în fişierul - /. my. cnf (adică fişierul . my. cnf din catalogul dumneavoastră de bază),astfel încât să nu fie necesară specificarea lor în de comandă. Biblioteca client facilitează căutarea fişierelor cuopţiuni MySQL şi extragerea din acestea a tuturor valorilor relevante. Prin adăugarea a numai câteva linii254 Partea a ll-a Utilizarea interfeţelor de programare ale sistemului MySQLîn programul dumneavoastră, puteţi determina programul să recunoască fişiere!^ J opţiuni si nu trebuie săreinventaţi roata prin scrierea propriilor dumneavoastră p| grame pentru aceasta. Sintaxa fişierelor cu opţiuni estedescrisă în Anexa E, „Refer* de programe MySQL".Accesul la conţinutul fişierelor cu opţiuniPentru a citi fişierele cu opţiuni în căutarea valorilor parametrilor de conexiune, folc funcţia load-def aults().Această funcţie caută fişierele cu opţiuni, le analizează cont tul pentru a descoperi orice grupuri de opţiuni carevă interesează si rescrie vector argumente al programului dumneavoastră (tabloul argv[ ]) pentru a insera infor din aceste grupuri sub formă de opţiuni ale liniei de comandă la începutul table argv [ ]. Astfel, opţiunile apar caşi cum ar fi fost specificate în linia de comandă. Ca; când analizaţi opţiunile comenzii, obţineţi parametrii deconexiune ca parte a cif normal de analiză a opţiunilor. Opţiunile sunt adăugate la începutul tabloului argv(ţ nu lasfârşit, astfel încât, dacă parametrii de conexiune sunt într-adevăr specificaţi îrn de comandă, aceştia să apară maitârziu (si implicit să redefinească) orice opţiuni adăt de funcţia load_def aults ().J"Iată un mic program, show_argv, care prezintă modul de utilizare a funcţiei load_def aurţ şi care ilustreazămodificarea vectorului cu argumente prin acest procedeu: /* show_argv.c */^include <stdio.h> ^include <mysql.h>char *groupsl] = { "client", NULL };intmain(int argc, char *argv[]){int i;my_init();printf("Vector cu argumente original:\n"); for(i = 0; i < argc; i++)printf("arg %d: %s\n", i, argvţi]);load_defaults("my", groups, &argc, &argv);printf("Vector cu argumente modificat:\n"); for(i = 0; i < argc; i++)prirvtf ("arg %d: %s\n", i, argv[i]);exit(O);Capitolul 6 Interfaţa API MySQL pentru C 255Programul de prelucrare a fişierului cu opţiuni implică următoarele:• groups [] este un tablou şir de caractere care indică grupurile din fişierele cu opţiuni care vă interesează. Pentruprogramele client, specificaţi întotdeauna cel puţin menţiunea "client" (pentru grupul [client]). Ultimul elemental tabloului trebuie să fie NULL.• my_init () este o rutină de iniţializare care execută unele operaţii de pornire impuse de funcţia load_defaults().• Funcţia load_def aults () preia patru argumente: prefixul fişierelor dumneavoastră cu opţiuni (acesta trebuie săfie întotdeauna "my"), tabloul care menţionează grupurile de opţiuni care vă interesează, respectiv adresanumărului de argumente şi a vectorului de argumente ale programului dumneavoastră. Nu transferaţi valorilenumărului de argumente şi ale vectorului; transmiteţi în schimb adresele lor, deoarece funcţia load_def aults ()trebuie să le modifice valorile. Reţineţi, mai ales, că deşi argv este un pointer, trebuie să transferaţi &argv, adresapointerului respectiv.Funcţia show_argv îşi afişează argumentele de două ori: prima dată aşa cum le-aţi specificat în linia de comandă,apoi în urma modificărilor efectuate de load_defaults(). Pentru a vedea efectele funcţiei load_def aults (),asiguraţi-vă că aveţi un fişier .my. cnf în catalogul dumneavoastră de bază, cu unii parametri specificaţi pentrugrupul [client]. Să presupunem că fişierul .my .cnf se prezintă astfel:[client]user=paulpassword=secrethost=o_gazda în această situaţie, prin executarea programului show_argv se obţine următorul rezultat:% show_argv a bVector cu argumente original:

You're Reading a Free Preview

Download
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->