Sunteți pe pagina 1din 29

250 Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL

Versiunea modificat a funciei do!connect "# este similar cu $ersiunea anterioar% toate punctele de $edere& cu
dou e'cepii(
) *u transfer un parametru d+!name formei mai $ec,i a funciei mys-l!real!c". nect "#& deoarece $ersiunea
respecti$ nu dispune de un atare parametru/
) 0ac numele +azei de date nu este *ULL& funcia do!connect "# ape funcia mys-l!select!d+"# pentru a
transforma +aza de date denumit +az de date curent/ "1cest procedeu simuleaz efectul paramet d+!name& care
lipse2te/# 0ac +aza de date nu poate fi selectat& do!connec afi2eaz un mesa. de eroare& 3nc,ide cone'iunea si
returneaz *ULL pent indica e2ecul operaiei/
) 4'emplul 2/ 1cest e'emplu se +azeaz pe modificrile aduse funciei do!connect" . primul e'emplu/ 1ceste
modificri au ca rezultat trei seturi de apeluri la funciilfl eroare mys-l!errno"# 2i mys-l!error"# 2i este c,iar
o+ositor s scrii funciile res55 ti$e de fiecare dat c6nd programul tre+uie s 7protesteze8 la apariia unei pro+5 0e
asemenea& programul de afi2are a erorii este agresi$ din punct de $edere $izt dificil de citit/ 4ste mai u2or s citii
ce$a de genul acesta( print!error"conn& 8mys-l!real!connect"# failed8#9 0eci& ,aidei s 3ncapsulm scrierea
erorilor 3ntr-o funcie print!error "#/ Putem ( funcia astfel 3nc6t s efectueze o anumit operaie c,iar si 3n situaia
c6nd conn este l 1stfel& putem folosi print!error"# dac apelul la funcia mys-l!init"# e2ueaz : a$em o
com+inaie de apeluri "unele pentru fprintf "# 2i altele pentru print!erro;5
Parc aud pe cine$a din spate care o+iecteaz( 7Pi nu suntei o+ligat s apelai9 funcii de eroare de fiecare dat
c6nd tre+uie s raportai o eroare& deci inteniei( facei programul dificil de citit& pentru ca e'emplul
dumnea$oastr cu 3ncapsula arate mai +ine/ <i de fapt nici mcar nu $ei scrie tot programul de afi2are a erorii
scriei o singur dat 2i apoi folosii copierea 2i lipirea dac mai a$ei ne$oie de 1cestea sunt o+ser$aii corecte&
la care $oi rspunde astfel(
) ;,iar dac folosii copierea 2i lipirea& aceste operaii sunt mai simplu i tuat cu seciuni mai scurte de program/
) =ndiferent dac preferai sau nu s in$ocai am+ele funcii de eroare la i raportare a unei erori& scrierea integral
a programului de raportare a i 3n 7$arianta lung8 duce la tentaia de a folosi scurtturi 2i de a fi inconsa la
raportarea erorilor/ Plasarea codului de raportare a erorilor 3ntr-o container care este simplu de in$ocat
atenueaz aceast tentat 3m+unte2te consec$ena programului/
) 0ac $ decidei $reodat s modificai formatul mesa.elor dumnea$c eroare& este mult mai u2or dac tre+uie
s efectuai modificarea 3ntr-un: loc& dec6t 3n tot programul/ Sau& dac $ decidei s scriei mesa.ele de > 3ntr-un
fi2ier .urnal 3n loc de "sau 3n afar de# a le scrie 3n stderr& este i piu dac tre+uie s modificai numai funcia
print!error"#/ 1ceast flfl este mai puin e'pus la erori si& din nou& reduce tentaia de a face .umtate de trea+ 2i
de a fi inconsec$ent/ ?@
;apitolul A =nterfaa 1P= MySQL pentru ; 25@
) 0ac folosii un utilitar de depanare atunci c6nd $ testai programele& inseria unui punct de 3ntrerupere 3n
funcia de raportare a erorilor este o modalitate con$ena+il de a determina programul s se 3ntrerup atunci c6nd
depanatorul detecteaz o condiie de eroare/
=at funcia noastr print!error" # de afi2are a erorilor( $oid print!error "MBSQL ?conn& c,ar 8message#
C
fprintf "stderr& 8DsEn8& message#9 if "conn :F *ULL#
C
fprintf "stderr& 4rror Du "Ds#En8& mys-l!errno"conn# & mys-l!error"conn## 9
Guncia print!error " # se afl 3n fi2ierul common / c& deci $om aduga un prototip al acesteia 3n fi2ierul common /
,(
$oid
print!error"MBSQL ?conn& c,ar 8message#9 1cum& funcia do!connect " # poate fi modificat pentru a folosi
funcia print!er ror " # (
MBSQL ?
do!connect"c,ar ?,ost!natne& c,ar ?user!name& c,ar 8passHord& c,ar ?d+!name& unsigned int port.ium& c,ar
?socIet!name& unsigned int flags#
C
MBSQL ?conn J? pointer spre $aria+ila de tratare a cone'iunii ?J
conn F mys-l!init "*ULL#9 J? aloca& iniializeaz $aria+ila
de tratare a cone'iunii ?J if "conn FF *ULL#
C
print!error"*ULL. 8mys-l!init"#f ailed "pro+a+ly out of memory#8#9 return "*ULL#9
K Lif defined"MBSQL!V4MS=N*!=0# OO MBSQL!V4MS=N*!=0 PF Q2200
J? $ersiunea Q/22 si $ersiunile ulterioare ?J if "mys-l!real!connect "conn& ,ost!name& user!name& passHord&
d+!name& port!num& socIet!name& flags# FF *ULL#
C
print!error"conn& 8mys-l!real!connect"# failed8#9 return "*ULL#9
Lelse
J? pentru MySQL anterior $ersiunii Q/22 ?J
;ontinuare
252 Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
;ontinuare
if "mys-l!real!connect "conn& nost!name& user!name& passHord& port!num& socIet!name& flags# FF *ULL#
print!error"conn& 8mys-l!real!connect"# failed8#9 return"*ULL#9
if "d+!name :F *ULL# J? simularea efectului parametrului d+!name ?JR if "mys-l!select!d+ "conn& d+!name# :F
0#
print!error"conn& 8mys-l!select!d+"# failed8#9
mys-l!close"conn#9
return"*ULL#9
Lendif
return "conn#9
J? cone'iunea a fost sta+ilita ?J
Gi2ierul nostru surs principal& clients/c& este asemntor cu client2/c& dar au.5 eliminate toate liniile de program
de cone'iune 2i 3ntrerupere a cone'iunii& f% 3nlocuite cu apeluri la funciile container/ 0eci& fi2ierul surs se
prezint astfel( J? clienta/c ?J
tfinclude >stdio/,P Linclude >mys-l/,P tfinclude 8common/,8
tfdefine def!,ost!name *ULL tfdefine def!user!name *ULL
Ldefine def!passHord *ULL %define def!d+!name *ULL
MBSQL ?conn9
int
main "int argc& c,ar ?arg$ST#
J? gazda la care se $a sta+ili cone'i
nea"$aloare presta+ilita F local,os J? nume utilizator "$aloare presta+il
F numele dumnea$oastr de desc,ide
a sesiunii de lucru# ?J J? parola "$aloare presta+ilita F
nici una# ?J J? +aza de date de utilizat "$aloare R
presta+ilita F nici una# ?J
J? pointer spre $aria+ila de tratare cone'iunii ?J
;apitolul A =nterfaa 1P= MySQL pentru ; 25Q
conn F do!connect"def!,ost!name& def!user!name& def!passHord&
def!d+!name& def!port!num& def!socIet!name& 0#9 if "conn FF *ULL# e'it"@#9
J? aici are loc acti$itatea aplicaiei ?J
do!disconnect"conn#9 e'it"N#9
;lient U - N+inerea parametrilor de cone'iune la rulare
1cum& c6nd dispunem de un program de cone'iune u2or de modificat si 7+lindat8 3n cazul apariiei erorilor&
suntem pregtii s aflm cum putem face lucruri mai inteligente dec6t s folosim parametri de cone'iune
*ULL& ca de e'emplu s permitem utilizatorului s specifice aceste $alori la rulare/
;lientul anterior& clients& continu s prezinte un deza$anta. semnificati$& 3n sensul c parametrii de cone'iune
sunt codai 3n program/ Pentru a modifica oricare dintre aceste $alori& tre+uie s editai fi2ierul surs 2i s-@
recompilai& ceea ce nu este foarte con$ena+il& mai ales dac dorii s punei programul la dispoziia altor
persoane/
N modalitate frec$ent folosit de specificare a parametrilor de cone'iune la rulare este de a folosi opiunile din
linia de comand/ Programele din distri+uia sistemului MySQL accept parametrii de cone'iune 3ntr-una din
cele dou forme specificate 3n ta+elul A/@/
Va+elul A/@ Npiuni standard din linia de comand pentru MySQL
Parametru
*umele gazdei *umele de utilizator Parola
*umrul portului *umele soclului
Gorm scurt
-, nume!gazda
-u nume!utilizator
-p sau -pparola!d$
-P numar!port -S nume soclu
Gorm lung
- - ,ostFm.Jne!gazcJa
- -userFnume!iJtilizator
--passHord sau
--passHordFparola!d$
- -portFJiuJnar!port --socIetFnume soclu
L
Pentru consec$ena cu programele client MySQL standard& clientul nostru $a accepta acelea2i formate& ceea ce
este simplu de realizat& deoarece +i+lioteca client include o WVineie pentru analiza opiunilor/
, plus& clientul nostru $a putea s e'trag informaiile din fi2ierele cu opiuni/ 1ceasta y permite s plasai
parametrii de cone'iune 3n fi2ierul - J/ my/ cnf "adic fi2ierul / my/ cnf din catalogul dumnea$oastr de +az#&
astfel 3nc6t s nu fie necesar specificarea lor 3n de comand/ Xi+lioteca client faciliteaz cutarea fi2ierelor cu
opiuni MySQL 2i e'tragerea din acestea a tuturor $alorilor rele$ante/ Prin adugarea a numai c6te$a linii
25U Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
3n programul dumnea$oastr& putei determina programul s recunoasc fi2iere:% R opiuni si nu tre+uie s
rein$entai roata prin scrierea propriilor dumnea$oastr p5 grame pentru aceasta/ Sinta'a fi2ierelor cu opiuni este
descris 3n 1ne'a 4& 7Mefer? de programe MySQL8/
1ccesul la coninutul fi2ierelor cu opiuni
Pentru a citi fi2ierele cu opiuni 3n cutarea $alorilor parametrilor de cone'iune& folc funcia load-def aults"#/
1ceast funcie caut fi2ierele cu opiuni& le analizeaz cont tul pentru a descoperi orice grupuri de opiuni care
$ intereseaz si rescrie $ector argumente al programului dumnea$oastr "ta+loul arg$S T# pentru a insera infor
din aceste grupuri su+ form de opiuni ale liniei de comand la 3nceputul ta+le arg$ S T/ 1stfel& opiunile apar ca
2i cum ar fi fost specificate 3n linia de comand/ ;a9 c6nd analizai opiunile comenzii& o+inei parametrii de
cone'iune ca parte a cif normal de analiz a opiunilor/ Npiunile sunt adugate la 3nceputul ta+loului arg$" nu la
sf6r2it& astfel 3nc6t& dac parametrii de cone'iune sunt 3ntr-ade$r specificai 3rn de comand& ace2tia s apar mai
t6rziu "si implicit s redefineasc# orice opiuni adt de funcia load!def aults "#/
R8
=at un mic program& s,oH!arg$& care prezint modul de utilizare a funciei load!def aur 2i care ilustreaz
modificarea $ectorului cu argumente prin acest procedeu( J? s,oH!arg$/c ?J
%include >stdio/,P %include >mys-l/,P
c,ar ?groupslT F C 8client8& *ULL K9
int
main"int argc& c,ar ?arg$ST#
C
int i9
my!init"#9
printf"8Vector cu argumente original(En8#9 for"i F 09 i > argc9 iYY#
printf"8arg Dd( DsEn8& i& arg$iT#9
load!defaults"8my8& groups& Oargc& Oarg$#9
printf"8Vector cu argumente modificat(En8#9 for"i F 09 i > argc9 iYY#
prir$tf "8arg Dd( DsEn8& i& arg$SiT#9
e'it"N#9
;apitolul A =nterfaa 1P= MySQL pentru ; 255
Programul de prelucrare a fi2ierului cu opiuni implic urmtoarele(
) groups ST este un ta+lou 2ir de caractere care indic grupurile din fi2ierele cu opiuni care $ intereseaz/ Pentru
programele client& specificai 3ntotdeauna cel puin meniunea 8client8 "pentru grupul SclientT#/ Ultimul element
al ta+loului tre+uie s fie *ULL/
) my!init "# este o rutin de iniializare care e'ecut unele operaii de pornire impuse de funcia load!defaults"#/
) Guncia load!def aults "# preia patru argumente( prefi'ul fi2ierelor dumnea$oastr cu opiuni "acesta tre+uie s
fie 3ntotdeauna 8my8#& ta+loul care menioneaz grupurile de opiuni care $ intereseaz& respecti$ adresa
numrului de argumente 2i a $ectorului de argumente ale programului dumnea$oastr/ *u transferai $alorile
numrului de argumente 2i ale $ectorului9 transmitei 3n sc,im+ adresele lor& deoarece funcia load!def aults "#
tre+uie s le modifice $alorile/ Meinei& mai ales& c de2i arg$ este un pointer& tre+uie s transferai Oarg$& adresa
pointerului respecti$/
Guncia s,oH!arg$ 32i afi2eaz argumentele de dou ori( prima dat a2a cum le-ai specificat 3n linia de comand&
apoi 3n urma modificrilor efectuate de load!defaults"#/ Pentru a $edea efectele funciei load!def aults "#&
asigurai-$ c a$ei un fi2ier /my/ cnf 3n catalogul dumnea$oastr de +az& cu unii parametri specificai pentru
grupul SclientT/ S presupunem c fi2ierul /my /cnf se prezint astfel(
SclientT
userFpaul
passHordFsecret
,ostFo!gazda 3n aceast situaie& prin e'ecutarea programului s,oH!arg$ se o+ine urmtorul rezultat(
D s,oH!arg$ a +
Vector cu argumente original(
arg 0( s,oH!arg$
arg @9 a
arg 2( +
Vector cu argumente modificat(
arg 0( s,oH!arg$
arg @9 --userFpaul
arg 2( --passHordFsecret
arg Q9 --,ostFo!gazda
arg U( a
arg 5( +
4ste posi+il ca 3ntre datele de ie2ire ale programului s,oH!arg$ s $edei unele opiuni care nu se gseau nici 3n
linia de comand& nici 3n fi2ierul dumnea$oastr -J /my /cnf/ 3n acest caz& opiunile respecti$e au fost pro+a+il
specificate 3ntr-un fi2ier cu opiuni la ni$el de sistem/ 0e fapt& funcia load!def aults "# caut fi2ierele Jetc Jmy
/cnf si my /cnf din catalogul de date MySQL 3nainte de a citi fi2ierul /my/cnf din catalogul dumnea-= $oastr de
+az/ "3n ZindoHs& funcia load!defaults"# caut fi2ierele ;(Emy/cnf& l c( Emys-lEdataEmy/ cnf& respecti$ fi2ierul
my/ ini din catalogul EZindoHsESystem#/
25A Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
Programele client care folosesc funcia load!def aults "# specific aproape 3ntc 8client8 3n lista cu grupuri d[
opiuni "pentru a putea o+ine tpate $alorile client% rale din fi2ierele cu opiuni#& dar putei cere 2i $alori care sunt
specifice propriul$u. nea$oastr program/ Pur 2i simplu 3nlocuii instruciunea
c,ar ?groupsST F C 8client8& *ULL K9 cu urmtoarea linie de
program( & 955
c,ar ?groups/SR F C 8s,oH%aro$8& 8client8& *ULL K9 1poi& putei aduga un grup Ss,oH!arg$T la fi2ierul
dumnea$oastr -J /my/cnf( s./
SclientT
userFpaul \
passHordFsecret
,ostFo!gazda
Ss,oH!arg$.
,ost[alta!gazda 9( -
3n urma acestor modificri& o nou in$ocare a programului s,oH!arg$ $a a$e rezultat& dup cum urmeaz(
D s,oH!arg$ a + W
Vector cu argumente original(
arg 0( s,oH!arg$
arg @( a
arg 2( +
Vector cu argumente modificat(
arg 0( s,oH!arg$
arg @( --userFpaul
arg 2( --passHordFsecret
arg Q( --,ostFo!gazda
arg U( --,ostFalta!gazda
arg 5( a
arg A( +
Nrdinea 3n care apar $alorile opiunilor 3n ta+loul cu argumente este deterr3 ordinea 3n care acestea sunt
menionate 3n fi2ierul dumnea$oastr cu opI ordinea 3n care grupurile cu opiuni sunt menionate 3n ta+loul
groups SR/ & 3nseamn c pro+a+il $ei dori s specificai grupuri specifice programelor SclientT din fi2ierul
dumnea$oastr cu opiuni/ 1stfel& dac specificai A o5 am+ele grupuri& $aloarea specific programului $a a$ea
prioritate/ Putei $edea9 3n e'emplul prezentat anterior( opiunea ,ost a fost specificata at6t 3rl grupulW% c6t si 3n
grupul S s,oH!arg$ T dar& deoarece grupul S s,oH!arg$T apare ultimul 3n E opiuni& $aloarea sa ,ost apare mai
t6rziu 3n $ectorul cu argumente 2i are pric
Guncia load!def aults "# nu selecteaz $alori din parametrii dumnea$oastr% 0ac doni s folosii $alorile unor
$aria+ile de mediu precum MBSQL!V;P MBSQL!U*=]!PNMV& tre+uie s $ ocupai personal de acest lucru
prin intermediul l geten$"#/ *u $oi aduga aceast funcionalitate la clienii no2tri& dar iat un i $erificare a
$alorilor a dou dintre $aria+ilele de mediu standard legate de M9
;apitolul A =nterfaa 1P= MySQL pentru ; 25^
e'tern c,ar ?geten$"#9 c,ar ?p9 u( int port!nura9 c,ar ?2o-_et!name9
if ""p& F` Neten$;MBSQL%V;P%PQMV8# :F *UU#&
port.ium& \/ atoi "p#9 r if ""P a QeteH`MBSQLRR*=]RWNM`W:# @F *U@U-#
socIet.iame F p9 & & 9 / -/9
3n cazul clienilor MySQL standard& $alorile $aria+ilelor de mediu au o prioritate mai redus dec6t $alorile
specificate 3n fi2ierele cu opiuni sau 3n linia de comand/ 0ac $erificai $aria+ilele mem+ru 2i doriri s
respectai con$enia respecti$& $erificai $aria+ilele de mediu 3nainte& nu dup apelarea funciei load!def aults "#
sau prelucrarea opiunilor din linia de comand/
- Wt
1naliza argumentelor din linia de comand
3n acest moment& putem prelua toi parametrii de cone'iune 3n $ectorul cu argumente& dar a$em ne$oie de o
modalitate de analiz a $ectorului/ Guncia getoptN?are e'act aceast destinaie/
Guncia getopt!long"# este 3ncorporat 3n +i+lioteca client MySQL& deci putei a$ea acces la aceasta ori de c6te
ori sta+ilii legturi cu funcii din +i+lioteca respecti$& 3n fi2ierul dumnea$oastr surs& tre+uie si includei
fi2ierul antet getopt/ ,/ Putei copia acest fi2ier antet din catalogul include al distri+uiei surs MySQL 3n
catalogul 3n care $ dez$oltai programul client/ :> W 8r -W 99
)i / / Wt/ ; -/-8)( W -)
Guncia load!def aults ")# 2i seHritoteo
Poate $ punei 3ntre+ri cu pri$ire la implicaiile legate de /spionarea8 proceselor pe care le poate a$ea
solicitarea ca funcia load!def aults "# s insereze te'tul parolelor 3n lista dumnea$oastr cu argumente& deoarece
programe precum ps pot afi2a listele cu argumente pentru procese ar+itrare/ *u este nici o pro+lem& deoarece ps
afi2eaz coninutul original al ta+loului arg$S T/ Voate argumentele de tip parol create de funcia load!def aults "#
indic spre o reg.une pe care funcia respecti$ o aloc pentru sine/ 1cea regiune nu face parte din $ectorul
original& deci programul ps nu o $ede niciodat/
Pe de alt parte& o parol care este specificat 3n linia de comand apare 3n ps dac dumnea$oastr nu $ 3ngri.ii
s o 2tergei/ Seciunea /1naliza argumentelor din linia de comand8 $ arat cum s procedai/
Programul urmtor& s,oH!param& folose2te funcia load!defaults"# pentru citirea fi2ierelor cu opiuni& apoi
apeleaz-funcia getopt!long># pentru analiza $ectorului cu argumente/ s,oH!param arat ce se 3nt6mpl 3n
fiecare faza a prelucrrii argumentelor& Prin efectuarea urmtoarelor aciuni( :) ;onfigureaz $alorile presta+ilite
pentru numele gazdei& numele de utilizator 2i parola/
2- 1fi2eaz $alorile originale ale parametrilor de cone'iune 2i $alorile din $ectorul cu
argumente/ W 9 uWW ))
25b Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
Q/ 1peleaz funcia load!defaults"# pentru a rescrie $ectorul cu argumente astfdi. acesta s reflecte coninutul
fi2ierului cu opiuni& dup care afi2eaz $ectorul re
U/ 1peleaz funcia getopt!long "# pentru prelucrarea $ectorului cu argumente& ap seaz $alorile rezultante ale
parametrilor 2i ceea ce a mai rmas 3n $ectorul cu (
s,oH!param $ permite s e'ersai diferite modaliti de specificare a parametriI cone'iune "situai 3n fi2ierele
cu opiuni sau 3n linia de comand# 2i s $edei rezult prin afi2area $alorilor care $or fi folosite pentru sta+ilirea
unei cone'iuni/ s,oH! este util pentru a $ face o idee pri$ind ceea ce se $a 3nt6mpla 3n urmtorul nostru% gram
client& atunci c6nd corelm acest program de prelucrare a parametrilor cu noastr de conectare do!connect "#/
=at cum se prezint fi2ierul s,oH!param/c( J? s,oH!param/c ?J
%include >stdio/,P
tfinclude >stdli+/,P J? necesar pentru atoi"# ?J
%include 8getopt/,8
c,ar ?groupsST F C 8client8& *ULL K9
struct option long!optionsST F
C8,ost8&
C8user8&
C8passHord8&
C8port8&
C8socIet8&
C 0& 0& 0& 0 K
re-uired!argument& re-uired!argument& optional!argument& re-uired!argument&
*ULL& *ULL& *ULL& *ULL&
WuWK&
WPWK& WPWK&
re-uired!argument& *ULL& WSWK&
int
main "int argc& c,ar ?arg$ST#
c,ar ?,ost!name F *ULL9 c,ar ?user!name F *ULL9 c,ar ?passHord F *ULL9 unsigned int port.ium F 09 c,ar
?socIet!name F *ULL9 int i9 int c& option!inde'9
my!init"#9
printf "8Parametrii originali ai cone'iunii(En8#
;apitolul A =nterfaa 1P= MySQL pentru ; 25c
printf "8,ost name( DsEn8 & ,ost!name \ ,ost.iame ( 8"nuli#8K9
printf "8user name( DsEn8& user!name \ user!name ( 8"nuli#8#9
printf "8passHord( DsEn8& passHord \ passHord ( 8"null#8#9
printf "8port num+er( DuEn8& port!num#9
printf "8socIet name( DsEn8& socIet!name \ socIet!name ( 8"null#8#9
printf "8Vector cu argumente original( En8 #9 for "i F 09 i > argc9 iYY#
printf "8arg Dd( DsEn8& i& arg$SiT#9
load!defaults"8my8& groups& Oargc& Oarg$#9
printf "8Vector cu argumente modificat dup load!defaults"# (En8#9 for "i F 09 i > argc9 iYY#
printf "8 arg Dd( DsEn8 & i& arg$SiT#9
H,ile ""c F getopt!long"argc& arg$& 8,(p( (u(P(S8 & long!options& Ooption!inde'## :F 4NG#
C
sHitc, "c#
C
case W , W (
,ost!name F optarg9
+reaI9 case WuW(
user!name F optarg9
+reaI9 case W p W (
passHord F optarg9
+reaI9 case WPW (
port.num F "unsigned int# atoi "optarg#9
+reaI9 case WSW (
socIet!name F optarg9 +reaI9
argc -F optind9 J? a$anseaz dincolo de argumentele ?J
arg$ YF optind9 J? care au fost prelucrate de getopt!long"# ?J
printf "8Parametrii cone'iunii dup getopt!long"# (En8# printf "8,ost name( DsEn8& ,ost!name \ ,ost.iame (
8"nuli#8#9
;ontinuare
2A0 Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
;ontinuare
printf "8user name( DsEn8& user!name \ user!name ( 8"nuli#8#9
printf "8passHord( DsEn8& passHord \ passHord ( 8"null#8#9
printf "8port num+er( DuEn8& port!num#9
printf "8socIet name( DsEn8& socIet!name \ socIet!name ( 8"null#8#9
printf "8Vector cu argumente dup getopt!long"#(En8#9 for "i F 09 i > argc9 iYY#
printf"8arg Dd( DsEn8& i& arg$SiT#9 e'it"N#9
K
Pentru a prelucra $ectorul cu argumente& s,oH!arg$ folose2te funcia getopt!long "#& care o apelai& 3n mod
caracteristic& 3ntr-un ciclu( Q
H,ile ""c F getopt!long"argc& arg$& 8,( p( (u(P(S8& long!options& Ooption!inde'## :F 4NG#
C
J? opiune de proces ?J
K
Primele dou argumente ale funciei getopt!long"# le constituie numrul de argur al programului dumnea$oastr
2i $ectorul cu argumente/ 1l treilea argument 3l re zint literele de opiuni care dorii s fie recunoscute/ 1cestea
sunt formele cu m. scurt ale opiunilor programului dumnea$oastr/ Literele de opiune pot fi urmat dou puncte&
de dou puncte du+late "((# sau de nici un asemenea caracter& pent arta c opiunea tre+uie s fie urmat& poate fi
urmat& respecti$ nu este urmat $aloare a opiunii/ ;el de-al patrulea argument& long!options& este un pointer
spr ta+lou cu structuri de opiune& fiecare din aceste structuri specific6nd informaii T o opiune pe care dorii ca
programul dumnea$oastr s o 3neleag/ Molul su este st5 =ar cu acela al 2irului de opiuni din al treilea
argument/ ;ele patru elemente ale fiec structuri long!opt ions ST sunt urmtoarele(
) *umele lung al opiunii/
) N $aloare a opiunii/ Valoarea poate fi re-uired!argument "argument o+ligate optional!argument "argument
facultati$# sau no!argument "fr argument#& indic dac opiunea tre+uie urmat& poate fi urmat& respecti$ nu
este urmat $aloare a opiunii/ "1ceste $alori au acela2i rol ca si caracterul dou puncte& car dou puncte du+late
si respecti$ a+sena oricrui caracter din al treilea argument& > conine 2irul de opiuni/#
) Un argument indicator "flag#/ Putei folosi acest argument pentru a stoca un .
la o $aria+il/ 0ac se gse2te opiunea& getopt!long "# stoc,eaz 3n $aria+il $alet specificat de al patrulea
argument/ 0ac indicatorul este *ULL& getopt!long "# co_ reaz $aria+ila optarg astfel 3nc6t s indice spre orice
$aloare care urmeaz dup of 2i returneaz numele scurt al opiunii& 3n cazul nostru& ta+loul long!optionsS T sg
fic *ULL pentru toate opiunile/ 1stfel& getopt!long "# returneaz fiecare argumefl cum 3l 3nt6lne2te astfel 3nc6t
s poat fi prelucrat 3n instruciunea sHitc,/
;apitolul A =nterfaa 1P= MySQL pentru ; 2A@
) *umele scurt "dintr-un singur caracter# al opiunii/ *umele scurte precizate 3n ta+loul long!optionsS T tre+uie s
corespund literelor folosite 3n 2irul cu opiuni pe care 3l transferai drept al treilea argument al funciei
getopt!long"#& 3n caz contrar programul dumnea$oastr fiind incapa+il de a prelucra 3n mod adec$at argumentele
din linia de comand/
Va+loul long!optionsST tre+uie terminat cu o structur ale crei elemente sunt toate egale cu 0/
;el de-al cincilea argument al funciei getopt!long"# este un pointer la o $aria+il de tip int/ getopt!long "#
stoc,eaz 3n aceast $aria+il inde'ul structurii long!options S T care corespunde ultimei opiuni 3nt6lnite/
"s,oH!param nu face nimic cu aceast $aloare/#
Meinei c opiunea pentru parol "specificat su+ forma - -passHord sau -p# poate lua o $aloare opional/ ;u
alte cu$inte& o putei specifica su+ forma dpassHord sau --pass-HordFparola!dumnea$oastr dac folosii forma
de opiune lung& respecti$ -p sau
- -pparola!dumnea$oastra dac folosii forma de opiune scurt/ *atura opional a $alorii parolei este indicat:
de caracterul(( plasat dup litera p din 2irul cu opiuni& precum 2i de specificaia optional!argument din ta+loul
long!optionsST/ 0e regul& clienii MySQL $ permit s omitei $aloarea parolei 3n linia de comand& dup care
$ solicit aceast $aloare/ 1cest procedeu $ permite s e$itai furnizarea parolei 3n linia de comand& ceea ce
3mpiedic pe alii s $ citeasc parola prin 7spionarea8 procesului/ ;6nd $om scrie urmtorul client& clientU&
$om aduga la acesta logica de $erificare a parolei/
=at un e'emplu de in$ocare a programului s,oH!param si a datelor de ie2ire rezultate "presupun6nd c -J/my/cnf
are acela2i coninut ca 3n e'emplul cu programul s,oH!arg$#(
D s,oH!paran -, inca!o!gazda '
Parametri de cone'iune originali(
,ost name( "null#
user name( "null#
passHord( "null#
port num+er( 0
socIet name( "null#
Vector cu argumente original(
arg 0( s,oH!parara
arg @( -,
arg 2( inca!o!gazda
arg Q( '
Vector cu argumente modificat dup load!defaults>#(
arg 0( s,oH!param
arg @( --userFpaul
arg 2( --passHordFsecret
arg Q( --,ostFo!gazda
arg U( -,
arg 5( inca!o!gazda
;ontinuare
2A2 Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
;ontinuare
arg A( '
Parametri de cone'iune dup getopt!long"#(
,ost name( inca!o!gazda
user name( paul
passHord( secret
port num+er ( N
socIet name( "null#
Vector cu argumente dup getopt!long"#(
arg 0( '
0atele de ie2ire arat c numele gazdei este selectat din linia de comand "redc $aloarea din fi2ierul cu opiuni#&
precum si c numele de utilizator si parola pro$in ld fi2ierul cu opiuni/ getopt!long"# analizeaz corect opiunile&
indiferent dac ac sunt specificate 3n forma de opiune scurt "-, nume!gazda# sau 3n forma de op lung "--
userFpaul& --passHordFsecret#/
1cum& s eliminm liniile de program care nu au dec6t rolul de a ilustra modii funcionare a rutinelor de tratare a
opiunilor 2i s folosim restul programului cai pentru un client care se conecteaz la un ser$er 3n conformitate cu
opiunile cari i furnizate 3ntr-un fi2ier cu opiuni sau 3n linia de comand/ Gi2ierul surs re clientU/c& se prezint
astfel( J? clientU/c ?J
tfinclude >stdio/,P
Linclude >stdli+/,P J? pentru atoi"# ?J
Linclude >mys-l/,P
Linclude 8common/,8
%include 8getopt/,8
Ldefine def!,ost!name *ULL tfdefine def!user!name *ULL
tfdefine def!passHord *ULL Ldefine def d+ name *ULL
J? gazda la care se $a sta+ili
cone'iunea"$aloare presta+ilita F />
local,ost# ?J J? nume utilizator "$aloare presta+il
numele dumnea$oastr de desc,idere%
sesiunii de lucru# ?J J? parola "$aloare presta+ilita F nici.
una# ?J J? +aza de date de utilizat "$aloare 8
presta+ilita F nici una# ?J
c,ar ?groupsST F C 8client8& *ULL K9 struct option long!optionsST F
C8,ost8& re-uired!argument& *ULL& W,WK&
C8user8&
C8passHord8&
C8port8&
C8socIet8&
C N& N& N& N K
;apitolul A =nterfaa 1P= MySQL pentru ; 2AQ
re-uired!argument& *ULL& WuWK&
optional!argument & *ULL& WpWK&
re-uired!argument & *ULL& WPWK&
re-uired!argument& *ULL& WSWK&
MBSQL ?conn9 J? pointer spre $aria+ila de tratare a
cone'iunii ?J
int
main "int argc& c,ar ?arg$CT#
c,ar ?,ost!name F def!,ost!name9
c,ar ?user!name F def!user!name9
c,ar ?passHord F def!passHord9
unsigned int port.ium F def!port!num9
c,ar ?socIet!name F def!socIet!name9
c,ar ?d+!name F def!d+!natne9
c,ar pass+ufS@00T9
int asI!passHord F 09
int i9
int c& option!inde'F09
my!init"#9
load!defaults"8my8& groups& Oargc& Oarg$#9
H,ile ""c F getopt!long"argc& arg$& 8,(p((u(P(S8& long!options& Ooption!inde'## :F 4NG#
sHitc, "c#
case W,@(
,ost!name F optarg9
+reaI9 case WuW(
user!name F optarg9
+reaI9 case WpW(
if ":optarg# J? nu este data nici o $aloare ?J asI!passHord F @9
else J? copiaz parola& 2terge originalul ?J
;ontinuare
2AU Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
;ontinuare
i
"$oid# strncpy "pass+uf& optarg& sizeof "pass+uf #-@#9 pass+uf Ssizeof "pass+uf # -@ T F WE0W9 passHord F pass+uf9
H,ile "?optarg#
?optargYY F W W 9 K
+reaI9 case WP@(
port!num F "unsigned int# atoi "optarg#9 +reaI9 case WS@(
socIet!name F optarg9 +reaI9
argc -F optind9 J? a$anseaz dincolo de argumentele ?J arg$ YF optind9 J? prelucrate de getopt!long " # ?J if
"argc P 0#
C
d+!name F arg$S0T9 --argc9 YYarg$99
if "asI!passHord#
passHord F get!tty!passHord "*ULL#9
conn F do!connect ",ost!name& user!name& passHord&
d+!name& port!num& socIet!name& 0 if "conn FF *ULL# e'it"@#9
J? aici se insereaz codul aplicaiei propriu -zise ?J
do!disconnect"conn# 9 e'it"N#9 K
3n comparaie cu programele clieni& client2 2i clients pe care le-am creat ane clientU efectueaz c6te$a operaii
pe care nu le-am 3nt6lnit p6n acum(
) Permite specificarea numelui +azei de date 3n linia de comand& dup opiunii? i sunt analizate de getopt!long "
# / 1ceast comportare este similar cu aceea a clie standard din distri+uia MySQL/
;apitolul A =nterfaa 1P= MySQL pentru ; 2A5
) <terge $aloarea parolei din $ectorul cu argumente& dup copierea acesteia/ Procedeul are ca scop reducerea
ferestrei de timp pe durata creia o parol specificat 3n linia de comand este $izi+il pentru ps sau pentru alte
programe de determinare a strii sistemului/ "Gereastra este minimizat& nu eliminat/ Specificarea parolelor 3n
linia de comand continu s reprezinte un pericol pentru securitate/#
) 0ac o opiune de parol a fost dat fr o $aloare& clientul solicit utilizatorului o parol folosind funcia
get!tty!passHord"#/ 1ceasta este o rutin de tip utilitar din +i+lioteca client& care solicit o parol fr a o
reflecta pe ecran/ "Xi+lioteca client este plin de asemenea +unti/ N lectur a sursei programelor client
MySQL este instructi$& deoarece putei afla informaii despre aceste rutine 2i despre modul de utilizare a lor/#
Putei 3ntre+a( 70e ce nu apelai pur 2i simplu funcia getpassN\8 Mspunsul este c nu toate sistemele dispun de
aceast funcie9 ZindoHs este un asemenea sistem/ Guncia get!tty!passHord"# este porta+il pe mai multe
sisteme& deoarece este configurat s se a.usteze la idiosincraziile sistemului/
Programul clientU reacioneaz 3n conformitate cu opiunile pe care le specificai/ Pentru a complica situaia& s
presupunem c nu e'ist nici un fi2ier cu opiuni/ 0ac in$ocai programul clientU fr argumente& acesta se
conecteaz la local,ost 2i transfer ser$erului numele dumnea$oastr U*=] de desc,idere a sesiunii de lucru&
fr parol/ 0ac 3n sc,im+ in$ocai clientU a2a cum s-a artat mai sus& programul $a cere o parol "nu e'ist nici
o $aloare a parolei imediat dup -p#& se conecteaz la o!gazda 2i transfer ser$erului numele de utilizator
un!utilizator si parola pe care o tastai(
D clientU -, o!gazda -u un!utilizator -p o!+aza!de!date 0e asemenea& clientU mai transfer funciei
do!connect"# numele +azei de date o!+aza!de!date& pentru a o transforma 3n +az de date curent/ 0ac e'ist
un fi2ier cu opiuni& coninutul acestuia este prelucrat 2i folosit pentru modificarea 3n consecin a parametrilor de
cone'iune/
1nterior& am 3ncapsulat programele 73ntr-o $eselie8& cre6nd funcii container pentru conectarea la& respecti$
deconectarea de la ser$er/ Se poate pune 3ntre+area dac este necesar inseria unei logici de analiz a opiunilor
si 3ntr-o funcie container/ 4ste posi+il& cred& dar nu $oi proceda astfel/ Logica de analizare a opiunilor nu este la
fel de consec$ent 3n diferite programe ca 2i programul de cone'iune( programele accept deseori 2i alte opiuni&
3n afara opiunilor standard pe care tocmai le-am analizat& iar programe diferite au tendina de a accepta alte
seturi diferite de opiuni suplimentare/ 1stfel& este dificil de scris o funcie care s standardizeze ciclul de
prelucrare a opiunilor/ 0e asemenea& spre deose+ire de sta+ilirea cone'iunii& pe care un program poate dori s o
efectueze de mai multe ori pe durata e'ecuiei sale "2i care este& implicit& un +un candidat pentru 3ncapsulare#&
analiza opiunilor se e'ecut de o+icei o singur dat( la 3nceputul programului/
Prin ceea [e am fcut pan acum& am realizat o operaie necesar pentru fiecare client MySQL( conectarea la
ser$er folosind parametri adec$ai/ Vre+uie s 2tii s $ conectai& desigur/ 0ar acum 2tii cum s procedai& iar
detaliile acestui proces sunt implementate 3n sc,eletul programului client "clier$tU/ c#& deci nu mai tre+uie s $
g6ndii la ele/ 1ceasta inseamn c $ putei concentra asupra a ceea ce $ intereseaz cu ade$rat - capacitatea
de a o+ine acces la coninutul +azelor dumnea$oastr dedate/ Voat 7aciunea8 aplicaiei
2AA Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
dumnea$oastr se $a produce 3n inter$alul dintre apelurile la funciile do!connect "/-# do!disconnect"#& dar ceea
ce a$em acum ser$e2te drept cadru general& pe care 3l pi folosi pentru numero2i clieni diferii/ Pentru a scrie un
program nou& procedai astfe+l
@/ Gacei o copie a programului client1/c/
2/ Modificai ciclul de prelucrare a opiunilor& dac acceptai opiuni suplimentare& alfai dec6t opiunile standard
pe care le cunoa2te programul client1/c/
Q/ 1dugai propriul dumnea$oastr program de aplicaie specific& plas6ndu-@ 3,. apelurile de conectare 2i de
deconectare/
<i ai terminat/
=deea de a respecta o disciplin a construciei unui sc,elet al programului client era i propune ce$a u2or de folosit
pentru a sta+ili& respecti$ pentru a elimina o cone'iune& i fel 3nc6t dumnea$oastr s $ putei concentra cu
ade$rat asupra a ceea ce de facei/ 1cum suntei li+eri de a proceda astfel& ca o ilustrare a principiului c discig
duce la li+ertate/
Prelucrarea interogrilor
1cum& c6nd 2tim cum s 3ncepem 2i s 3nc,eiem o con$ersaie cu ser$erul& este mor s aflm cum se poate diri.a
con$ersapa 3n timpul desf2urrii acesteia/ 1ceast secii arat cum se poate 7discuta8 cu ser$erul pentru
prelucrarea interogrilor/
Giecare interogare pe care o rulai implic urmtoarele etape(
@/ ;onstruii interogarea/ Modalitatea de construcie a interogrii depinde de conii tul interogrii - mai e'act& de
faptul dac aceasta conine sau nu date +inare/
2/ 4mitei interogarea trimi6nd-o =a ser$er 3n $ederea e'ecutrii/
Q/ Prelucrai rezultatul interogrii/ 1ceasta depinde de tipul interogrii emise/W?W e'emplu& o instruciune S4L4;V
returneaz r6nduri de date pe care urmeaz s leT lucrai/ N instruciune =*S4MV nuWprocedeaz astfel/
9Q
Un factor care tre+uie a$ut 3n $edere la construirea interogrilor 3l constituie care se $a utiliza pentru trimiterea
acestora la ser$er/ Mutina cu un caracter mai gen de emitere a interogrilor este mys-l!real!-uery"#/ ;u aceast
rutin& furnizai uit garea su+ forma unui 2ir numrat "un 2ir plus o lungime#/ Vre+uie s pstrai lungimii
interogrilor dumnea$oastr 2i s o trimitei funciei mys-l!real!-ueryC.yi turi de 2irul 3n sine/ 0eoarece
interogarea este un 2ir numrat& coninutul su pe oricare& inclusi$ date +inare sau octei *ULL/ =nterogarea nu
este tratat ca un 2ir /c termin cu o $aloare zero@/ ) /&[
;ealalt funcie de emitere a interogrilor& 2i anume mys-l!-uery"#& este mai resfif 3n ceea ce pri$e2te coninutul
2irului interogrii& dar deseori este mai simplu de utu =nterogrile pe care le transmitei funciei mys-l!-uery "#
tre+uie s fie 2iruri ter cu zero& ceea ce 3nseamn c nu pot conine octei zero 3n te'tul interogrii/ "Pre
@ Prin 7$aloare zero8 nu tre+uie s se 3neleag cifra N& ci $aloarea ec,i$alent cu zero pentru i date al 2irului
respecti$/ - */V/
;apitolul A =nterfaa 1P= MySQL pentru ; 2A^
octeilor zero 3n cadrul interogrii determin interpretarea eronat a acesteia ca fiind mai scurt dec6t 3n
realitate/# 3n general $or+ind& dac interogarea dumnea$oastr poate conine date +inare ar+itrare& ar putea
conine octei zero& deci nu tre+uie s folosii mys-l!-uery"#/ Pe de alt parte& c6nd lucrai cu 2iruri care se
termin 3n zero& $ putei permite lu'ul de a construi interogri folosind funciile 2ir din +i+lioteca ; standard pe
care pro+a+il c le cunoa2tei de.a& precum strcpy"# si sprintf "#/
Un alt factor de care tre+uie inut cont 3n construirea interogrilor este dac tre+uie s efectuai operaii de
anulare a semnificaiilor unor caractere "escaping#/ 1ceste operaii sunt necesare dac dorii s construii
interogri folosind $alori care conin date +inare sau alte caractere pro+lematice& cum sunt g,ilimelele 2i
caracterele +acIslas,/ 0espre acest aspect $om discuta 3n seciunea 7;odificarea datelor pro+lematice 3n cadrul
interogrilor8/
N sc,em simpl de tratare a interogrilor se prezint astfel( if "mys-l!-uery "conn& -uery# :F 0#
J? e2ec9 raporteaz eroarea ?J
else
J? succes9 afla care a fost efectul interogrii ?J
1t6t mys-l!-uery "# c6t 2i mys-l!real!-uery"# returneaz zero pentru interogrile care reu2esc& respecti$ $alori
diferite de zero 3n caz de e2ec/ 1 spune c o interogare a 7reu2it8 3nseamn c ser$erul a acceptat-o ca fiind
$ala+il 2i c a fost capa+il s o e'ecute/ *u se specific nimic despre efectul interogrii/ 0e e'emplu& nu se
arat c o interogare S4L4;V a selectat $reun r6nd sau c o instruciune 04L4V4 a 2ters $reun r6nd/
0eterminarea efectului real al interogrii implic prelucrri suplimentare/
N interogare poate e2ua dintr-o di$ersitate de moti$e/ Unele cauze comune includ
urmtoarele(
) =nterogarea conine o eroare de sinta'/
) =nterogarea este incorect din punct de $edere semantic - de e'emplu& o interogare care se refer la o coloan
ine'istent a unui ta+el/
) *u a$ei suficiente pri$ilegii pentru a a$ea acces la datele la care se face referire 3n interogare/
=nterogrile pot fi grupate 3n dou mari categorii( interogrile care nu returneaz un rezultat 2i cele care
returneaz un rezultat/ =nterogrile pentru instruciuni precum =*S4MV& 04L4V4 2i UP01V4 se 3ncadreaz
toate 3n categoria celor care nu returneaz nici un rezultat/ =nterogrile respecti$e nu returneaz nici un r6nd& nici
mcar 3n cazul interogrilor care modific +aza dumnea$oastr de date/ Singura informaie pe care o Primii
const 3n numrul r6ndurilor afectate/
=nterogrile pentru instruciuni precum S4L4;V 2i SeNZ se 3ncadreaz 3n categoria celor care returneaz un
rezultat9 la urma urmelor& scopul emiterii acestor instruciuni este de a primi u8 rezultat/ Setul de r6nduri produs
de o interogare care returneaz date se nume2te set de
2Ab Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
rezultate/ 1cesta este reprezentat 3n MySQL de tipul de date MBSQL!M4S& o struc conine $alorile de date
pentru r6nduri 2i& de asemenea& metadate referitoare la $aloril5 ar fi numele coloanelor 2i lungimile $alorilor de
date#/ Un set de rezultate $id "adie care conine zero r6nduri# este diferit de noiunea 7fr rezultat8/
Vratarea interogrilor care nu returneaz un set de rezultate
Pentru a prelucra o interogare care nu returneaz un set de rezultate& emitei int rea folosind mys-l!-uery"# sau
mys-l!real!-uery "#/ 0ac interogarea reu2e2te& p. afla care a fost numrul r6ndurilor inserate& 2terse sau
actualizate apel6nd mys-l!affected!roHs"#/
4'emplul urmtor prezint modul de tratare a unei interogri care nu returneaz i set de rezultate(
if "mys-l!-uery "conn& 8=*S4MV =*VN ta+el S4V nume F W*umele meu8#
print!error "8=nstruciunea =*S4MV a e2uat8#9
else
printf "8=nstruciunea =*S4MV a reu2it( Dlu r6nduri afectateEnW&% "unsigned long# mys-l!affected!roHs "conn##9
N+ser$ai cum rezultatul funciei mys-l!affected!roHs "# este con$ertit la-W3. unsigned long 3n $ederea afi2rii/
1ceast funcie returneaz o $aloare de" my!ulonglong& dar 3ncercarea de afi2are direct pe ecran a unei $alori de
acest ra reu2e2te pe unele sisteme/ "0e e'emplu& am o+ser$at c reu2e2te su+ GreeXS= e2ueaz su+ Solaris/#
;on$ersia $alorii la tipul unsigned long 2i utilizarea unui l de afi2are ca Dlu rezol$a pro+lema/ 1celea2i
consideraii se aplic si la orice alte: care returneaz $alori de tipul my!ulonglong& precum
mys-l!num!roHs5 mys-l!insert!id"#/ 0ac dorii ca programele dumnea$oastr client s fie por mai multe
sisteme& reinei acest lucru/
Guncia mys-l!affected!roHs"# returneaz numrul r6ndurilor afectate de dar semnificaia noiunii de 7r6nduri
afectate8 depinde de tipul interogrii& instruciunile =*S4MV& M4PL1;4 sau 04L4V4& semnific numrul
r6ndurilor 3nlocuite& respecti$ 2terse/ Pentru UP01V4& este $or+a de numrul r6ndurilor ( ceea ce 3nseamn
numrul r6ndurilor pe care MySQL le-a modificat efecti$/ M# actualizeaz un r6nd 3n cazul 3n care coninutul su
este acela2i cu acela al actualizare/ 1ceasta 3nseamn c& de2i un r6nd poate fi selectat pentru actualizare ">i
clauza Ze4M4 a instruciunii UP01V4#& este posi+il ca r6ndul respecti$ s nu fie9
0e fapt& semnificaia noiunii de 7r6nduri afectate8 pentru instruciunea UP01V4 est.l cum contro$ersat&
deoarece unii $or ca aceasta s 3nsemne 7r6nduri corespu adic numrul r6ndurilor selectate pentru actualizare&
c,iar dac operaia de nu modific $alorile pe care le conin acestea/ 0ac aplicaia dumnea$oastr ne atare
semnificaie& putei o+ine aceast comportare prin solicitare direct 3n mc
;apitolul A =nterfaa 1P= MySQL pentru ; 2Ac
conectrii la ser$er/ Vransferai funciei mys-l!real!connect"# o $aloare flags egal cu
;L=4*V!GNU*0!MNZS/ 1ceea2i $aloare poate fi transmis ca argument flags 2i funciei do!connect "#9
aceasta $a trimite $aloarea mai departe funciei mys-l!real!connect "#/
Vratarea interogrilor care returneaz un set de rezultate
=nterogrile care returneaz date le grupeaz pe acestea 3ntr-un set de rezultate& pe care 3l manipulai dup
emiterea interogrii prin apelarea uneia din funciile mys-l!-uery "# sau mys-l!real!-uery"#/ 4ste important de
reinut c& 3n MySQL& S4L4;V nu este singura instruciune care returneaz r6nduri/ La fel procedeaz 2i SeNZ&
04S;M=X4 si 4]PL1=*/ Pentru toate aceste instruciuni& dup emiterea interogrii tre+uie s efectuai
prelucrri suplimentare legate de tratarea r6ndurilor/
Vratarea unui set de rezultate implic urmtoarele etape(
) fenerarea setului de rezultate prin apelarea funciei mys-l!store!result "# sau a funciei mys-l!use!result"#/
1ceste funcii returneaz un pointer MBSQL!M4S 3n caz de reu2it& respecti$ *ULL 3n caz de e2ec/ Mai t6rziu&
$om discuta despre diferenele dintre funciile mys-l!store!result "# si mys-l!use!result "#& precum 2i condiiile
3n care se alege utilizarea uneia 3n detrimentul alteia/ Pentru moment& e'emplele noastre folosesc
mys-l!store!result"#& care returneaz imediat rezultatele de la ser$er si le stoc,eaz la programul client/
)1pelarea funciei mys-l!fetc,!roH"# pentru fiecare r6nd al setului de rezultate/
1ceast funcie returneaz o $aloare MBSQL!MNZ& care este un pointer spre un ta+lou de 2iruri care reprezint
$alorile din fiecare coloan a r6ndului/ Modul 3n care utilizai r6ndul depinde de aplicaia dumnea$oastr/ Putei
s afi2ai $alorile din coloane& putei efectua calcule statistice cu aceste $alori sau orice altce$a/ Guncia mys-l!f
etc,!roH"# returneaz *ULL atunci c6nd 3n setul de rezultate nu au mai rmas r6nduri/
) ;6nd ai terminat lucrul cu setul de rezultate& apelai funcia mys-l!f ree!result"# pentru anularea alocrii
memoriei pe care o folose2te/ 0ac omitei aceast operaie& aplicaia dumnea$oastr $a pro$oca 7scurgeri8 de
memorie& "3n cazul aplicaiilor cu durata mare de rulare& este important mai ales s $ de+arasai 3n mod adec$at
de seturile de rezultate9 3n caz contrar& $ei descoperi cum controlul sistemului dumnea$oastr este 3ncet-3ncet
preluat de procese care consum cantiti tot mai mari din resursele sistemului/#
4'emplul urmtor prezint modul de prelucrare a unei interogri care returneaz un set
de rezultate(
MBSQL!M4S ?res!set9
if "mys-l!-uery"conn& 8SeNZ V1XL4S GMNM mys-l8# @F0# print!erVor"conn& 8mys-l!-uery"# ratat8#9
else
res!set F tnys-l!store!result "conn#9 J? genereaz set de rezultate ?J if "res!set FF *ULL#
print!error"conn& 8mys-l!store!result"# ratat8#9 else
;ontinuare
2^0 Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
;ontinuare
C
l? prelucreaz setul de rezultate& apoi eli+ereaz memoria alocata acestuia ?J process!result!set "conn& res!set#9
mys-l!free!result"res!set#9
1ici am tri2at puin& apel6nd o funcie process!result!set "# pentru manipularea i r6nd/ 3nc nu am definit funcia
respecti$& deci tre+uie s facem aceast operaie& 3n g ral& funciile de tratare a setului de rezultate se +azeaz pe
un ciclu care arat astfel( MBSQL!MNZ r6nd9
H,ile ""rand F mys-l!fetc,!roH "res!set## :F *ULL#
J? se folose2te intr-un fel coninutul r6ndurilor ?J
Valoarea MBSQL!MNZ returnat de funcia mys-l!f etc,!roH"# este un pointer spr ta+lou de $alori& deci
accesul la fiecare $aloare se reduce la accesul r6ndului roHl iT aWt i $ariaz& 3ntre N si numrul de coloane ale
r6ndului& minus o unitate/
Vre+uie reinute c6te$a caracteristici importante ale tipului de date MBSQL!M0@*(
) MBSQL!MNZ este un tip pointer& deci $aria+ilele de acest tip se declar su+ MBSQL!MNZ r6nd& nu su+
forma MBSQL!MNZ ?rand/
) <irurile dintr-un ta+lou MBSQL!MNZ se termin 3n zero/ Votu2i& dac o coloan . conine date +inare& poate
conine octei zero& deci nu tre+uie s tratai $aloare un 2ir care se termin 3n zero/ 0eterminai lungimea
coloanei& pentru a 2ti c6t dfi este $aloarea din coloan/
) Valorile tuturor tipurilor de date& c,iar 2i ale tipurilor numerice& sunt returna form de 2iruri/ 0ac dorii s
tratai o $aloare su+ form de numr& tre+uie $ertii personal 2irul/
) Valorile *ULL sunt reprezentate prin pointeri *ULL 3n cadrul ta+loului MBSQL!ef e'cepia situaiei c6nd
ai declarat o coloan ca fiind *NV *ULL& tre+uie s $e 3ntotdeauna dac $alorile din coloana respecti$ sunt
sau nu pointeri *ULL/
1plicaiile dumnea$oastr pot utiliza 3n orice mod coninutul fiecrui r6nd/ 0in i ilustrati$e& s afi2m r6ndurile&
cu $alorile coloanelor separate prin ta+ulatori/ aceasta& a$em ne$oie de o funcie suplimentar&
mys-l!num!fields"#& din client9 aceast funcie ne indic numrul de $alori "coloane# pe care le conine i
=at liniile de program pentru funcia process!result!set"#( $oid process!result!set "MBSQL ?conn&
MBSQL!M4S ?res!set#
MBSQL!MNZ
r6nd 9
;apitolul A =nterfaa 1P= MySQL pentru ; unsigned int i9
H,ile ""rand F mys-l!fetc,!roH "res!set## :F *ULL# for "i F 09 i > mys-l!num!fields "res!set#9
2^@
if "i P 0#
fpute "WEtW& stdout#9 printf "8Ds8& roHSiT :F *ULL \ roHSiT ( 8*ULL8#9
K
fputc "WEnW& stdout#9
K
if "mys-l!errno "conn# @F 0#
print!error "conn& 8mys-l!fetc,!roH"# ratat8#9 else
printf "8Dlu r6nduri returnateEnn& "unsigned long# mys-l!num!roHs "res!set##9
Guncia process!result!set "# afi2eaz fiecare r6nd 3ntr-un format cu date separate prin ta+ulatori "2i afi26nd
$alorile *ULL su+ forma cu$6ntului 8*ULL8#& urmat de numrul r6ndurilor regsite/ *umrul de r6nduri
respecti$ este disponi+il prin apelarea funciei mys-l!num!roHs "#/ ;a 2i funcia mys-l!af f ected!roHs "#&
mys-l!num!roHs "# returneaz o $aloare de tip my!ulonglong& deci con$ertii acea $aloare la tipul unsigned
long si folosii pentru afi2area $alorii formatul W DluW/
;iclul de preluare a r6ndurilor este urmat de un test pentru detectarea erorilor/ =n cazul 3n care creai setul de
rezultate cu mys-l!store!result "#& o $aloare *ULL returnat de funcia mys-l!f etc,!roH"# are 3ntotdeauna
semnificaia 7nu mai e'ist r6nduri8/ Votu2i& 3n cazul 3n care creai setul de rezultate cu mys-l!use!result "#& o
$aloare *ULL returnat de funcia mys-l!fetc,!roH"# poate a$ea semnificaia 7nu mai e'ist r6nduri8& dar poate
indica 2i apariia unei erori/ Vestul nu face altce$a dec6t s permit funciei process!rezult!set"# s detecteze
erorile& indiferent de modul 3n care $ creai setul de rezultate/ 1ceast $ersiune a funciei process!result!set"#
e'ecut 3ntr-un mod oarecum minimal afi2area $alorilor coloanelor& o a+ordare care 32i are deza$anta.ele sale/ 0e
e'emplu& s presupunem c e'ecutai aceast interogare(
S4L4;V nume& prenume& ora2& stat GMNM pre2edinte Vei primi urmtoarele date de ie2ire(
1dams Ro,n Xraintree M1
1dams Ro,n Quincy Xraintree M1
1rt,ur ;,ester 1/ Gairfield VV
Xuc,anan Rames Mercers+urg P1
Xus, feorge Z/ Milton M1
;arter Rames 4/ Rr/ Plains f1
;le$eland fro$er ;aldHell *.
2^2 Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
1m fi putut crea un aspect estetic pentru datele de ie2ire prin furnizarea de inforr precum etic,etele de coloane 2i
prin alinierea pe $ertical a $alorilor/ Pentru ace a$em ne$oie de etic,ete 2i tre+uie s cunoa2tem cea mai lung
$aloare din fie coloan/ =nformaiile respecti$e sunt disponi+ile& dar nu ca parte a $alorilor datelor[ coloane9
acestea fac parte din metadatele setului de rezultate "date despre date#/ 0up $om generaliza puin rutina de
tratare a interogrilor& 3n seciunea 7Utilizarea datelor setului de rezultate8 $om scrie un program de formatare
estetic a rezultatei
1fi2area datelor +inare
Valorile din coloane care conin date +inare ce pot include octei zero nu $or fi afi2ate 3n mod i ztor dac se
folose2te specificatorul de formatW DsW al funciei printf "#9 aceast funcie a2teap 2ir care se termin 3n zero 2i $a
afi2a $aloarea coloanei numai p6n la primul octet zero/ Pentru > +inare& cel mai +ine este s folosii lungimea
coloanei& astfel 3nc6t s putei afi2a $aloarea completai: putea folosi& de e'emplu& funciile f Hrite "# sau pute "#/
N rutin de uz general pentru tratarea interogrilor
4'emplele anterioare de tratare a interogrilor au fost scrise 2tiind dac instrucia tre+uie s returneze sau nu
date/ 1cest lucru a fost posi+il deoarece interogrileW codate ,ard 3n program9 am folosit o instruciune =*S4MV&
care nu returneaz un i rezultate& respecti$ o instruciune SeNZ V1XL4S& care returneaz un set de rezultatelil
Votu2i& nu cunoa2tei 3ntotdeauna care este tipul de instruciune pe care 3l repr interogarea/ 0e e'emplu& dac
e'ecutai o interogare pe care o citii de la tastat dintr-un fi2ier& aceasta poate fi orice instruciune ar+itrar/ *u
a$ei cum s 2tii 3n dac s $ a2teptai sau nu ca instruciunea respecti$ s returneze r6nduri/ <i 4$ident c nu
dorii s analizai interogarea pentru a determina ce tip de instruct9 reprezint/ Nricum& nu este o operaie la fel de
simpl pe c6t pare/ *u este suficid: e'aminai primul cu$6nt& deoarece interogarea poate 3ncepe cu un
comentariu& cum urmeaz(
J? comentariu ?J S4L4;V /// / )
0in fericire& nu tre+uie s cunoa2tei 3n preala+il tipul de interogare pentru a o W%. trata 3n mod adec$at/ =nterfaa
1P= 3n ; pentru MySQL permite scrierea unei rut uz general pentru tratarea interogrilor& care prelucreaz
corect orice tip de inst indiferent dac aceasta returneaz sau nu un set de interogri/
3nainte de a scrie liniile de program pentru rutina de tratare a interogrilor& s modul de funcionare a acesteia(
) 4mite interogarea/ 0ac e2ueaz& am terminat/
) 0ac interogarea reu2e2te& apeleaz funcia mys-l!store!result"# pentru a r6ndurile de la ser$er 2i pentru a crea
un set de rezultate/
) 0ac funcia mys-l!store!result"# e2ueaz& atunci fie interogarea nu returne set de rezultate& fie s-a produs o
eroare 3n timpul 3ncercrii de regsire a setului& . face diferena 3ntre aceste rezultate transfer6nd $aria+ila de
tratare a cone'iuni. funcia mys-l!f ield!count"# 2i $erific6nd $aloarea acesteia& dup cum urmeaz5(:
;apitolul A =nterfaa 1P= MySQL pentru ; 2^Q
) 0ac mys-l!f ield!count " # este diferit de zero& indic o eroare( interogarea ar fi tre+uit s returneze un set de
rezultate& dar nu a fcut-o/ 1cest lucru se poate 3nt6mpla din di$erse moti$e/ 0e e'emplu& poate c setul de
rezultate a fost prea mare pentru spaiul de memorie alocat sau poate c s-a produs o cdere pe segmentul de
reea dintre client 2i ser$er 3n timpul prelurii r6ndurilor/
N u2oar complicaie a acestei proceduri este aceea c mys-l!f ield!count" # nu e'ista anterior $ersiunii MySQL
Q/22/2U/ 3n $ersiunile anterioare& se folose2te 3n sc,im+ funcia mys-l!num!f ields " # / Pentru a scrie programe
care funcioneaz 3n orice $ersiune a sistemului MySQL& includei urmtorul fragment de program 3n orice fi2ier
care apeleaz funcia mys-l!f ield!count " # (
Lif :defined"MBSQL!V4MS=N*!=0# 55 MBSQL!V4MS=N*!=0>Q222U
tfdefine mys-l!field!count mys-l!num!fields
Lendif
1cest program impune tratarea tuturor apelurilor la funcia mys-l!f ield!count " # ca apeluri la funcia
mys-l!num!f ields " # pentru $ersiuni MySQL anterioare $ersiunii Q/22/2U/
) 0ac funcia mys-l!field!count"# returneaz N& 3nseamn c interogarea nu a returnat nici un set de rezultate/
"1cest fapt arat c interogarea a fost o instruciune de tip =*S4MV& 04L4V4 sau UP01V4/#
) 0ac apelul la funcia mys-l!store!result " # reu2e2te& interogarea a returnat un set de rezultate/ Prelucrai
r6ndurile apel6nd la funcia mys-l!fetc,!roH"# p6n c6nd returneaz *ULL/
Listingul urmtor prezint o funcie care prelucreaz orice interogare& date fiind o $aria+il de tratare a
cone'iunii 2i un 2ir de interogare terminat 3n zero( Lif :defined"MBSQL!V4MS=N*!=0# 55
MBSQL!V4MS=N*!=0>Q222U Ldefine mys-l!field!count mys-l!num!fields Lendif
$oid
process!-uery "MBSQL ?conn& c,ar ?-uery#
C
MBSQL!M4S ?res!set9
unsigned int field!count9
if "mys-l!-uery "conn& -uery# :F 0# J? interogare ratata ?J C
print!error "conn& 8process!-uery"# ratat8#9
return9
;ontinuare
2^U Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
;ontinuare
l? interogarea a reu2it9 determina daca returneaza date sau nu ?J %
res!set F mys-l!store!result "conn#9
if "res!set FF *ULL# J? nu a fost returnat nici un
de rezultate ?J
J
? lipsa unui set de rezultate inseamna ca s-a produs o eroare
? sau ca nu a fost returnat nici un set de rezultate\
?J
if "mys-l!field!count "conn# P 0#
J?
? se a2tepta un set de rezultate& dar mys-l!store!resultQ
? a returnat nimic9 aceasta inseamna ca s-a produs o eroaf ?J
print!error "conn& WPro+lema la prelucrarea setului de rezultat
else
K
J?
? nu a fost returnat nici un set de rezultate9 interogat
? nu a returnat date "nu a fost de tip S4L4;V& SeNZ&
? 04S;M=X4 sau 4]PL1=*# & deci raporteaz numrul de
? r6nduri afectate de interogare ?J
printf "8Dlu r6nduri afectateEn8&
"unsigned long# mys-l!affected!roHs "conn##9
K
else J? a fost returnat un set de rezultate ?J
C
)J:
J? prelucreaz r6ndurile& apoi eli+ereaz memoria alocata setu5 de rezultate ?J
process!result!set "conn& res!set#9
mys-l!free!result "res!set#9 K
;apitolul A =nterfaa 1P= MySQL pentru ; 2^5
Metode alternati$e pentru prelucrarea interogrilor
Versiunea funciei process!-uery " # prezentat anterior are trei proprieti(
) Golose2te funcia mys-l!-uery " # pentru a emite interogarea/
) Golose2te funcia mys-l!store!-uery " # pentru a regsi setul de rezultate/
) 0ac nu se o+ine nici un set de rezultate& folose2te mys-l!field!count"# pentru a face diferena 3ntre apariia
unei erori 2i un set de rezultate nea2teptat/
Sunt posi+ile a+ordri alternati$e pentru toate aceste trei aspecte ale tratrii interogrilor(
) Putei folosi un 2ir de interogare numerotat 2i funcia mys-l!real!-uery"# 3n locul unui 2ir de interogare care se
termina 3n zero 2i al funciei mys-l!-uery " # /
) Putei crea setul de rezultate apel6nd funcia mys-l!use!result"# 3n locul funciei mys-l!store!result " # /
) Putei apela funcia mys-l!error"# 3n locul funciei mys-l!field!count"#& pentru a afla dac regsirea setului de
rezultate a e2uat sau dac nu e'ist nici un set de regsit/
Nricare din aceste metode "sau c,iar toate# se pot folosi 3n cadrul funciei process!-uery"#/ =at o funcie
process!real!-uery"# care este analog cu process!-uery " #& dar care folose2te toate cele trei alternati$e(
$oid
process!real!-uery "MBSQL 8conn& c,ar ?-uery& unsigned int len#
C
MBSQL!M4S ?res!set9
unsigned int field!count9
if "mys-l!real!-uery "conn& -uery& len# :F 0# J? interogarea a e2uat ?J
C
print!error "conn& 8process!real!-uery"# ratata8#9 return9
J? interogarea a reu2it9 determina daca returneaza date sau nu ?J
res!set F mys-l!use!result "conn# 9
if "res!set FF *ULL# J? nu a fost returnat nici un set de
rezultate ?J
J?
? lipsa unui set de rezultate 3nseamn ca s-a produs o eroare
? sau ca nu a fost returnat nici un set de rezultate\ ?J
if "mys-l!errno "conn# @F 0# J? eroare ?J
;ontinuare
[s&
2^A Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
;ontinuare W?
print!error "conn& 8Pro+lema la prelucrarea setului de rezultate8 else
nu a fost returnat nici un set de rezultate9 interogarea
? nu a returnat date "nu a fost de tip S4L4;V& SeNZ&
? 04S;M=X4 sau 4]PL1=*#& deci raporteaz numrul de
? r6nduri afectate de interogare ?J
printf "8Dlu r6nduri afectateEn8&
"unsigned long# mys-l!affected!roHs "conn##9
t
else J? a fost returnat un set de rezultate ?J
C
J? prelucreaz r6ndurile& apoi eli+ereaz memoria alocata setuluiR
de rezultate ?J
process!result!set "conn& res!set#9 mys-l!free!result "res!set#9
N comparaie 3ntre funciile mys-l!store!result"# si mys-l!use!result"#
Gunciile mys-l!store!result"# 2i mys-l!use!result "# sunt asemntoare& 3n sensul-. am+ele preiau un argument
de tip $aria+il de tratare a cone'iunii 2i returneaz un setT rezultate/ Votu2i& diferenele dintre cele dou funcii
sunt foarte mari/ Principala difere rezid 3n modalitatea 3n care sunt regsite de la ser$er r6ndurile din setul de
rezult ;6nd o apelai& mys-l!store!result"# regse2te imediat toate r6ndurile/ Gun-. mys-l!use!result"# iniiaz
operaia de regsire& dar nu o+ine practic nici un r6nd/@ sc,im+& presupune c $ei apela funcia
mys-l!fetc,!roH"# ulterior pentru re 3nregistrrilor/ 1ceste a+ordri diferite 3n ceea ce pri$e2te maniera de
regsire a r6nd8? dau na2tere la toate celelalte diferene dintre cele dou funcii/ Seciunea de fa cor funciile&
pentru a $ permite s facei alegerea cea mai adec$at pentru o aplicaie
;6nd mys-l!store!result "# regse2te un set de rezultate de la ser$er& preia r6ndurile&( memorie pentru ele 2i le
stoc,eaz la client/ 1pelurile ulterioare la mys-l!fetc,!roH"#& $or returna niciodat o eroare& deoarece pur 2i
simplu e'trag un r6nd din structura de > care conine de.a setul de rezultate/ ;6nd funcia mys-l!fetc,!roH"#
returneaz 3nseamn 3ntotdeauna c ai a.uns la sf6r2itul setului de rezultate/ Prin contrast& mys-l!use!result"# nu
regse2te r6nduri& 3n sc,im+& iniiaz o o. de regsire r6nd cu r6nd& pe care tre+uie s o finalizai personal prin
apelarea func
L
;apitolul A =nterfaa 1P= MySQL pentru ; 2^^
mys-l!fetc,!roH"# pentru fiecare r6nd/ 3n acest caz& de2i o $aloare *ULL returnat de mys-l!fetc,!roH"# 3n
mod normal continu s 3nsemne c s-a a.uns la sf6r2itul setului de rezultate& este de asemenea posi+il ca 3n
timpul comunicaiei cu ser$erul s se fi produs o eroare/ Putei face deose+irea 3ntre cele dou rezultate prin
apelarea funciei mys-l!errno "# sau a funciei mys-l!error "#/
mys-l!store!result"# prezint cerine de memorie 2i de prelucrare mai ridicate dec6t mys-l!use!resultC#&
deoarece 3ntregul set de rezultate este pstrat la client/ Surplusul de memorie alocat 2i de comple'itate a
structurii de date este mai ridicat si un client care regse2te seturi de rezultate mari 3nt6mpin riscul de a epuiza
memoria/ 0ac intenionai s regsii mai multe r6nduri simultan& poate dorii s folosii 3n sc,im+ funcia
mys-l!use!result "#/
Guncia mys-l!use!result "# are cerine de memorie mai reduse& deoarece este necesar alocarea unui spaiu de
memorie pentru manipularea numai a unui singur r6nd la un moment dat/ 1ceasta poate duce la o cre2tere a
$itezei& deoarece nu configurai o structur de date at6t de comple' pentru setul de rezultate/ Pe de alt parte&
tnys-l!use!result"# solicit mai mult ser$erul& care tre+uie s memoreze r6nduri din setul de rezultate p6n c6nd
clientul crede de cu$iin c tre+uie s le regseasc pe toate/ 1stfel& funcia mys-l!use!result"# nu este o alegere
+un pentru anumite tipuri de clieni(
) ;lieni interacti$i& care se deplaseaz de la un r6nd la altul& la cererea utilizatorului/ "*u dorii ca ser$erul s fie
forat s a2tepte trimiterea r6ndului urmtor numai pentru c utilizatorul s-a decis s ia o pauz de cafea/#
) ;lienii care e'ecut un $olum mare de prelucrri 3ntre operaiile de regsire a dou r6nduri/
3n am+ele tipuri de situaii& clientul nu reu2e2te s regseasc rapid toate r6ndurile din setul de rezultate/ 1stfel&
ser$erul de$ine ocupat si faptul poate a$ea un impact negati$ asupra altor clieni& deoarece ta+elele din care
regsii date sunt +locate la citire pe durata interogrii/ Voi clienii care 3ncearc s actualizeze aceste ta+ele sau
s insereze r6nduri 3n interiorul acestora sunt +locai/
;ompensarea cerinelor de memorie suplimentare determinate de funcia my s-l!store!result "# reprezint
anumite a$anta.e ale accesului la 3ntregul set de rezultate simultan/ Voate r6ndurile din set sunt disponi+ile& deci
a$ei acces aleator la ele( funciile mys-l!data!seeI"#& mys-l!roH!seeI"# 2i mys-l!roH!tell"# $ permit s
o+inei accesul la r6nduri 3n orice ordine dorii/ ;u funcia mys-l!use!result "#& putei o+ine accesul la r6nduri
numai 3n ordinea 3n care acestea sunt regsite de mys-l!fetc,!roH"#/ 0ac intenionai s prelucrai r6nduri 3ntr-o
alt ordine dec6t cea sec$enial returnat de ser$er& tre+uie s folosii 3n sc,im+ funcia mys-l!store!result "#/
0e e'emplu& dac a$ei o aplicaie care permite utilizatorului s se deplaseze 3nainte 2i 3napoi printre r6ndurile
selectate de o interogare& cea mai +un soluie o reprezint aplicaia mys-l!store!result"#/
;u funcia mys-l!store!result"# putei o+ine anumite tipuri de informaii despre coloane care nu sunt disponi+ile
atunci c6nd folosii mys-l!use!result"#/ *umrul de r6nduri al setului de rezultate este o+inut prin apelarea
funciei mys-l!num!roHs"#/ 0imensiunile ma'ime ale $alorilor din fiecare coloan sunt stocate 3n mem+rul
2^b Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
ma'!Hidt, al structurii de informaii pri$ind coloanele MBSQL!G=4L0/ mys-l!use!result"#&
mys-l!num!roHs"# nu returneaz $aloarea corect dec6t at c6nd ai preluat toate r6ndurile& iar $aloarea
ma'!Hidt, este inaccesi+il& deoarece pe fi calculat numai dup ce au fost e'aminate datele din fiecare r6nd/
0eoarece mys-l!use!result "# e'ecut mai puine operaii dec6t mys-l!store!resur+5 impune o cerin
ine'istent 3n mys-l!store!result"#( clientul tre+uie s apele funcia mys-l!f etc,!roH"# pentru fiecare r6nd din
setul de rezultate& 3n caz contrar& l 3nregistrrile rmase 3n set de$in parte a setului de rezultate al urmtoarei
interogri 2i . produce o eroare de desincronizare/ 1cest lucru nu se 3nt6mpl 3n cazul func mys-l!store!result"#
deoarece& atunci c6nd funcia respecti$ returneaz& toate rai durile au fost de.a preluate/ 0e fapt& dac folosii
mys-l!store!result"#& nu mai tre+5 s apelai personal funcia mys-l!fetc,!roH"#/ 1cest fapt poate fi util pentru
intere 3n care $ intereseaz numai s o+inei un rezultat ne$id& nu 2i coninutul rezultat 0e e'emplu& pentru a
afla dac un ta+el my!t+l e'ist& putei e'ecuta aceast intere
SeNZ V1XL4S L=_4 8my!t+l8
0ac& dup ce apelai funcia mys-l!store!result "#& $aloarea funciei mys-l!num!ra este diferit de zero& ta+elul
e'ist/ *u este necesar apelarea funciei mys-l!f etc,!r-i "4$ident& tre+uie s apelai funcia mys-l!f
ree!result/#
0ac dorii s furnizai un ma'imum de fle'i+ilitate& oferii utilizatorilor opiunea-a selecta oricare din cele dou
metode de prelucrare a setului de rezultate& mys mys-ldump sunt dou programe care e'ecut aceast operaie/
1cestea folosesc fur mys-l!store!result"# 3n mod presta+ilit& dar comut la mys-l!use!result"# specificai
opiunea ---uicI/
Utilizarea metadatelor pri$ind setul de rezultate
Seturile de rezultate nu conin numai $alorile coloanelor aferente r6ndurilor de dat si informaii despre date/
1ceste informaii poart numele de metadate ale setul? rezultate 2i includ(
) *umrul de r6nduri 2i de coloane din fiecare set de rezultate& disponi+ile prin ap[ funciilor
mys-l!num!roHs"#& respecti$ mys-l!num!f ields"#/
) Lungimea $alorii fiecrei coloane dintr-un r6nd& disponi+il prin apelarea mys-l!fetc,!lengt,s"#/
) =nformaii despre fiecare coloan& cum ar fi numele 2i tipul coloanei& limea i $alorilor din fiecare coloan&
precum si ta+elul din care pro$ine coloana/ 1ceste ia maii sunt stocate 3n structurile MBSQL!G=4L0& care sunt
o+inute 3n mod ca prin apelarea funciei mys-l!f etc,!f ield "#/ 1ne'a G descrie structura MBSQL!G3i detaliu si
prezint toate funciile care furnizeaz accesul la informaiile din colc
0isponi+ilitatea metadatelor depinde 3n parte de metoda de prelucrare a se rezultate/ 12a cum s-a artat 3n
seciunea anterioar& dac dorii s folosii $a numrului de r6nduri sau ale lungimii ma'ime a coloanei& tre+uie
s creai setul de9t ae folosind mys-l!store!result"#& nu mys-l!use!result"#/
Metadatele setului de rezultate sunt urile pentru luarea unor decizii pri$ind pre,idi datelor din setul de rezultate(
;apitolul A =nterfaa 1P= MySQL pentru ; 2^c
) =nformaiile pri$ind numele si limea coloanei sunt utile pentru producerea unor rezultate frumos formatate& cu
titluri de coloan 2i linii aran.ate pe $ertical/
) *umrul de coloane se folose2te pentru a determina numrul de iteraii al unui ciclu care prelucreaz $alorile
succesi$e ale coloanelor pentru r6ndurile de date/ Putei folosi numerele de r6nduri sau de coloane dac tre+uie
s alocai structuri de date care depind de cunoa2terea numrului de r6nduri sau de coloane din setul de rezultate/
) Putei determina tipul de date al unei coloane/ 1ceast informaie $ permite s $ dai seama dac o coloan
reprezint un numr& dac poate conine date +inare si altele/
1nterior& 3n seciunea 7Vratarea interogrilor care returneaz date8& am scris o $ersiune a funciei
process!result!set"# care afi2a coloane pro$enite din r6nduri ale setului de rezultate folosind un format de
separare a datelor prin ta+ulator:/ 1cest procedeu este adec$at pentru anumite scopuri "c6nd dorii s importai
datele 3ntr-o foaie de calcul ta+elar#& dar nu este un format de afi2are estetic pentru e'aminare $izual sau pentru
tiprire/ S ne reamintim c $ersiunea anterioar a funciei process!result!set"# furniza un rezultat ca acesta(
1dams Ro,n Xraintree M1
1dams Ro,n Quincy Xraintree M1
1rt,ur ;,ester 1/ Gair-field VV
Xuc,anan Rames Mercers+urg P1
Xus, feorge Z/ Milton M1
;arter Rames 4/ Rr Plains f1
;le$eland fro$er ;aldHell *R
S efectum unele modificri ale funciei process!result!set"# astfel 3nc6t s genereze date de ie2ire 3n form
ta+elar prin atri+uirea unui titlu pentru fiecare coloan 2i 73ncasetarea8 acesteia/ Versiunea re$izuit $a afi2a
acelea2i rezultate& 3ntr-un format mai simplu de e'aminat(
nume prenume ioras stat
1dams Ro,n i Xraintree M1
1dams Ro,n Quincy W) Xraintree M1
1rt,ur ;,ester 1/ 9 Gair-field VV
Xuc,anan Rames i Mercers+urg P1
Xus, feorge Z/ 9 Milton M1
;arter Rames 4/ & Rr/ ) Plains f1
;le$eland fro$er i ;aldHell *R
N
@/
2/
L
sc,i general a algoritmului de afi2are este urmtoarea(
Se determin limea de afi2are pentru fiecare coloan/
Se afi2eaz un r6nd de etic,ete de coloan 73ncasetate8 "delimitate prin +are $erticale
2i precedate& respecti$ urmate de r6nduri formate din liniue#/
Se afi2eaz $alorile din fiecare r6nd al setului de rezultate& cu fiecare coloan 3ncase-tat "delimitat prin +are
$erticale# 2i aliniat pe $ertical& 3n plus& numerele sunt afi2ate aliniate la dreapta 2i se afi2eaz cu$6ntul 8*ULL8
3n locul $alorilor *ULL/
2b0 Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
U/ La sf6r2it& se afi2eaz un numr al r6ndurilor regsite/ 1cest e'erciiu reprezint o +un demonstraie a
utilizrii metadatelor setului de n ae/ Pentru a afi2a rezultatele a2a cum s-a artat mai sus& tre+uie s 2tim mai
lucruri despre setul de rezultate& nu numai $alorile datelor incluse 3n r6nduri/
Poate $ g6ndii( 7emm& descrierea aia arat suspect de asemntor cu modul 3n mys-l 32i afi2eaz rezultatele8/
0a& a2a este& iar dumnea$oastr suntei in$itat s parai codul surs al programului mys-l cu programul
final al fum process!result!set"# re$izuite/ ;ele dou nu sunt identice& dar comparaia dou a+ordri ale
aceleia2i pro+leme este instructi$/
Mai 3nt6i& tre+uie s determinm limea de afi2are a fiecrei coloane/ Listingul $ arat cum s procedai/
;alculele se +azeaz 3n 3ntregime pe metadatele setuli rezultate 2i nu se face nici o referire la $alorile din r6nduri(
MBSQL!G=4L0 ?field9
unsigned int i& col& len9
J? determina limile de afi2are ale coloanelor
mys-l!field!seeI "res!set& 0#9
for "i F 09 i > mys-l!num!fields "res!set#9
)9.
r.
[5
$.
1i
WQi
. ?
U
W[
field F mys-l!fetc,!field "res!set#9 col!len F strlen "field-Pnarae#9 if "col!len > field-Pma'!lengt,#
col!len F field-Pma'!lengt,9 if "col!len > U OO ==S *NV *ULL "field-Pflags##
col!len F U9 J? U este lungimea cu$6ntului 8*ULL8 ?J field-Pma'!lengt, F col!len9 J? reinitializarea
informaiilor
despre coloana ?J
Limile coloanelor sunt calculate prin parcurgerea ciclic a structurilor MBSQL!G=: pentru coloanele din setul
de rezultate/ *e poziionm pe prima structur prin apela funciei mys-l!fetc,!seeI"#/ 1pelurile ulterioare la
funcia mys-l!fetc,!fiel5 returneaz pointer: spre structurile coloanelor succesi$e/ Limea unei coloane afi2are
o reprezint cea mai mare din trei $alori& fiecare depinz6nd de metadatOe structura cu informaii pri$ind
coloanele(
) Lungimea c6mpului f ield-Pname& titlul coloanei/
) f ield-Pma'!lengt,& dimensiunea celei mai lungi $alori a datelor din coloan/
) Lungimea 2irului8 *ULL8& 3n cazul 3n care coloana poate conine $alori *ULL& arat dac acea coloan poate
conine *ULL sau nu/
Meinei c& dup ce limea de afi2are pentru coloan a de$enit cunoscut& at aceast $aloare $aria+ilei
ma'!lengt,& care este un mem+ru al unei structuri pe o+inem din +i+lioteca client/ 1cest lucru este permis sau
este necesar ca dateiey structura MBSQL!G=4L0 s fie considerate ca fiind numai pentru citire\ 3n mod nor
opta pentru a doua $ariant& dar unele dintre programele client din distri+uia MyS
gOW&?/W 8 W) W
;apitolul A =nterfaa 1P# MySQL pentru ; 2b@
modific $aloarea ma'!lengt, 3ntr-un mod asemntor& deci $oi presupune c procedeul este permis/ "0ac
preferai o a+ordare alternati$& care nu modific ma'!lengt,& alocai un ta+lou de $alori unsigned int 2i stocai
limile calculate 3n ta+loul respecti$/#
;alculul limilor de afi2are ascunde o capcan/ V mai reamintii c ma'!lengt, nu are nici o semnificaie
atunci c6nd creai un set de rezultate folosind mys-l!use!result"#/ 0eoarece a$em ne$oie de ma'!lengt, pentru a
determina limea de afi2are a $alorilor din coloan& funcionarea corect a algoritmului impune ca setul de
rezultate s fie generat folosind mys-l!store!result" #2/
Ndat cunoscute limile coloanelor& suntem gata de afi2are/ Vitlurile sunt u2or de manipulat9 pentru o coloan
dat& folosim pur si simplu structura cu informaii despre coloan indicat prin field 2i afi2m mem+rul name&
folosind limea calculat anterior(
printf "8 D-?s 58& field-Pma'!lengt,& field-Pname#9
Pentru date& $om parcurge ciclic r6ndurile din setul de rezultate& afi26nd $alorile coloanelor pentru r6ndul curent
3n timpul fiecrei iteraii/ 1fi2area $alorilor din coloanele unui r6nd este oarecum ciudat& deoarece o $aloare
poate fi *ULL sau poate reprezenta un numr "caz 3n care 3l afi2m aliniat la dreapta#/ Valorile coloanelor sunt
afi2ate dup cum urmeaz& unde roH Sii conine $alorile datelor& iar field indic spre informaiile despre coloane(
if "roHSiT F F *ULL#
printf "8 D-?s 58& field-Pma'!lengt,& 8*ULL8#9
else if "=S!*UM "field-Ptype# #
printf "8 D?s 58& field-Pma'!lengt,& roHSiT#9
else
printf "8 D-?s l8& field-Pma'!lengt,& roHSil#9
Valoarea macroinstruciunii =S!*UM"# este ade$rat dac tipul coloanei indicat de field -Ptype este un tip
numeric& precum =*V& GLN1V sau 04;=M1L/
Liniile de program finale pentru afi2area setului de rezultate se prezint astfel/ Meinei c& deoarece afi2m de
mai multe ori linii compuse din mici liniue& codul pentru aceast operaie este 3ncapsulat 3n propria sa funcie&
print!das,es " # (
$oid
print!das,es "MBSQL!M4S ?res!set#
MBSQL!G=4L0 unsigned int
?field9 i& .9
mys-l!field!seeI "res!set& 0#9
f pute "W)?)W& stdout# 9
for "i F 09 i > mys-l!num!fields "res!set#9 i
C
field F mys-l!fetc,!field "res!set#9
;ontinuare
@ Mem+rul lengt, al structurii MBSQL!G=4L0 $ indic lungimea ma'im pe care o pot a$ea $alorile din
coloane/ 1ceasta poate fi o soluie util dac folosii mys-l!use!result"# 3n locul funciei mys-l!store!result"#/-
*/1/
2b2 Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
;ontinuare
for ". F 09 . > field-Pma'!lengt, Y 29 . Y-?)#
fputc;-W& stdout#9 f pute "W Y W& stdout#9
K
f pute " WEnW & stdout#9
$oid
process!result!set "MBSQL ?conn& MBSQL!M4S ?res!set#
MBSQL!G=4L0
MBSQL!MNZ
unsigned
?field9
roH
int i& col& len9
J? determina limile de afi2are ale coloanelor ?J
mys-l!field!seeI "res!set& 0#9
for "i F 09 i > mys-l!num!fields "res!set#9 i
field F mys-l!fetc,!field "res!set#9 col!len F strlen "f ield-Pname# 9 if "col!len > field-Pma'!lengt,#
col!len F field-Pma'!lengt,9 if "col!len > U OO :=S *NV *ULL "field-Pflags##
col!len FU9 J? U este lungimea cu$6ntului 8*ULL8 ?J field-Pma'!lengt, F col!len9 J? reinitializarea
informaiilor
despre coloana ?J
print!das,es "res!set#
f pute "Wl@& stdout#9
mys-l!field!seeI "res!set& 0#9
for "i F 09 i > mys-l!num!fields "res!set#9
field F mys-l!fetc,!field "res!set#9
printf "8 D-?s 58& field-Pma'!lengt,& field-Pname# 9 K
f pute "WEnW& stdout#9 print!das,es "res!set#9
H,ile ""roH F mys-l!fetc,!roH "res!set## @F *ULL#
C
mys-l!field!seeI "res!set& 0#9 f pute "W lW i stdout#9
;apitolul A =nterfaa 1P= MySQL pentru ; 2bQ for "i F 09 i > mys-l!num!fields "res!set#9
field F mys-l!fetc,!field "res!set#9 if "roHSiT F F *ULL#
printf "8 D-?s =8& field-Pma'!lengt,& 8*ULL8#9 else if "=S!*UM "field-Ptype##
printf "8 D?s 58& field-Pma'!lengt,& roHSiT#9 else
printf "8 D-?s 58& field-Pma'!lengt,& roHSiT#9
K
fputc "WEnW& stdout#9
K
print!das,es "res!set#9
printf "8Dlu r6nduri returnateEn8& "unsigned long#
mys-l!num!roHs "res!set##9 K
Xi+lioteca client MySQL furnizeaz numeroase modaliti de acces la structurile cu informaii despre coloane/
0e e'emplu& programul din e'emplul anterior o+ine de mai multe ori accesul la aceste structuri& folosind cicluri
a$6nd urmtoarea form general( mys-l!field!seeI "res!set& 0#9 for "i F 09 i > mys-l!num!fields "res!set#9
C
field F mys-l!fetc,!field "res!set#9
;u toate acestea& com+inaia dintre funciile mys-l!f ield!seeI "# si mys-l!f etc,!f ield "# este numai una din
modalitile de a o+ine structurile MBSQL!G=4L0/ Pentru a afla despre alte modaliti de o+inere a structurilor
cu informaii despre coloane& $ezi informaiile aferente funciilor mys-l!fetc,!f ields"# 2i mys-l!f etc,!f
ield!direct"# din 1ne'a G/
;lient 5 - Un program interacti$ de interogare
S adunm o +una parte din programele create p6n acum si s le folosim pentru a scrie un program client
interacti$ simplu/ 1cesta $ permite s introducei interogri& le e'ecut folosind rutina noastr de uz general
pentru prelucrarea interogrilor process!-uery"# 2i afi2eaz rezultatele folosind programul de formatare a datelor
de ie2ire process!result!set "#& creat 3n seciunea precedent/
clients $a fi similar din multe puncte de $edere cu mys-l& de2i nu $a a$ea& desigur& un numr at6t de mare de
caracteristici/ 4'ist numeroase restricii cu pri$ire la datele de intrare care $or fi acceptate de clients(
? Giecare linie de intrare tre+uie s conin o singur interogare complet/
? =nterogrile nu tre+uie s se 3nc,eie cu punct 2i $irgul sau cu Eg/
? ;omenzi precum -uit nu sunt recunoscute9 3n sc,im+& folosii ;ontrol-0 pentru a termina e'ecuia
programului/
2bU Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
Se o+ser$ c redactarea programului clients este aproape +anal "su+ @0 linii de pi gram noi#/ 1proape toate
elementele necesare sunt furnizate/de sc,eletul prograrm# client "clientU/c# si de alte programe pe care le-am
scris de.a/ Singurul lucru care tre+uie adugat este un ciclu care adun datele de intrare si le e'ecut/ Pentru a
construi programul clients& 3ncepei prin a copia sc,eletul de program > clientU/c 3n programul clients/c/ 1poi
adugai la acesta liniile de program afere funciilor process!-uery"#& process!result!set"# 2i print!das,es"#/ 3n
final& 3n p?i gramul clients/ c& cutai linia din funcia main "# care are urmtorul coninut(
J? aici se insereaz codul aplicaiei propriu-zise ?J 1poi 3nlocuii-o cu urmtorul ciclu H,ile(
H,ile "@#
c,ar +ufS@02UT9
fprintf "stderr& 8-ueryP 8#9 if "fgets "+uf& sizeof "+uf#9
+reaI9 process!-uery "conn& +uf#9
J? prompt de afi2are ?J stdin# F F *ULL# J? cite2te interogarea ?J
J? e'ecuta interogarea ?J
;ompilai programul clients/c pentru a produce fi2ierul clients/o& legai clienii cu common/o 2i cu +i+lioteca
client pentru a genera fi2ierul clients 2i ai terminat: 1H un program client MySQL interacti$& care poate e'ecuta
orice interogare si afi2 rezultatele/
1lte aspecte
1ceast seciune trateaz numeroase su+iecte care nu s-au putut 3ncadra foarte +it e$oluia de la clieni la clients(
W
) Utilizarea datelor din setul de rezultate pentru a calcula un rezultat& dup utilia metadatelor din setul de
rezultate pentru a contri+ui la $erificarea faptului c sunt adec$ate pentru calculul dumnea$oastr/
) Modul de tratare a datelor dificil de inserat 3n interogri/
) Modul de lucru cu datele de tip imagine/
) Modul de o+inere a informaiilor referitoare la structura ta+elelor dumnea$oas
) fre2eli comune de proiectare 3n MySQL 2i modul de e$itare a acestora/
4fectuarea de calcule cu seturile de rezultate
P6n acum& ne-am concentrat asupra utilizrii metadatelor aferente seturilor de rezul mai ales pentru afi2area
datelor din r6nduri& dar este e$ident c $or e'ista situaii 8 datele dumnea$oastr $or tre+ui folosite 2i 3n alte
moduri& nu numai afi2ate/ 0e e'ti putei efectua calcule statistice 3n funcie de $alorile datelor& folosind
metadatele $ asigura c datele se conformeaz cerinelor pe care dorii ca acestea s le satisfa
;apitolul A =nterfaa 1P= MySQL pentru ; 2b5
fel de cerine\ 3nceptorii $or dori pro+a+il s $erifice dac o coloan cu al crei coninut intenioneaz s
efectueze calcule numerice conine cu ade$rat numere:
Listingul urmtor prezint o funcie simpl& denumit summary!stats" #& care preia un set de rezultate 2i un inde'
de coloan 2i produce statistici de sumar pentru $alorile din coloan/ 0e asemenea& funcia raporteaz numrul
de $alori care lipsesc& pe care le detecteaz cut6nd $alorile *ULL/ 1ceste calcule implica dou cerine pe care
tre+uie s le satisfac datele& deci summary!stats" # le $erific folosind metadatele aferente setului de rezultate(
) ;oloana specificat tre+uie s e'iste "adic inde'ul coloanei tre+uie s se gseasc 3n domeniul care conine
numrul de coloane din setul de rezultate#/
) ;oloana tre+uie s conin $alori numerice/
0ac aceste condiii nu sunt $ala+ile& summary!stats"# pur 2i simplu afi2eaz un mesa. de eroare 2i returneaz/
Liniile de program sunt urmtoarele(
$oid
VNR/U
summary!stats "MBSQL!M4S ?res!set& unsigned int col!num#
MBSQL!G=4L0?camp9
MBSQL!MNZ rand9
unsigned int n&lipsa9
dou+le $al& suma& suma!patrate& $ar9
J? $erifica 3ndeplinirea cerinelor pentru date ?J if "mys-l!num!fields "res!set# > col.ium#
C
print!error "*ULL& 8numr de coloana incorect8#9
return9
K
mys-l!field!seeI "res!set& 0#9 field F mys-l!fetc,!field "res!set#9 if ":=S!*UM "field-Ptype##
C
print!error "*ULL& 8coloana nu este numerica8#9 return9
J? calculeaz statisticile de sumar ?J
n F 09 lipsa F 09 suma F 09 suma!patrate F 09
;ontinuare
2bA Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
;ontinuare
mys-l!data!seeI "res!set& 0#9
H,ile ""rand F mys-l!fetc,!roH "res!set## :F *ULL#
if "randScol!numT FF *ULL#
lipsaYY9 else C
$al F atof "randScol!numT#9 J? con$ersie din sir in numr&?
suma YF $al9
suma!patrate YF $al ? $al9
if "n F F 0#
printf "8*u sunt o+ser$ation8#9 else
printf "8*umr de o+ser$aii( DluEn8& n#9
printf "8N+ser$aii lipsa( DluEn8& lipsa#9
printf "8Suma( DgEn8& suma#9
printf "8Media( DgEn8& suma J n#9
printf "8Suma ptratelor( DgEn8& suma!patrate#9
$ar F ""n ? suma!patrate# - "suma ? suma## J "n
printf "80ispersie( DgEn8& $ar#9
printf "81+atere standard8( DgJn& s-rt "$ar##9
"n - @##9
N+ser$ai apelul la funcia mys-l!data!seeI"# care precede ciclul fura mys-l!f etc,!loop"#/ 1pelul
respecti$ are rolul de a $ permite s apelai funcia sul ry!stats "# de mai multe ori& pentru a o+ine acela2i set de
rezultate "3n caz c don calculai date statistice pentru mai multe coloane#/ La fiecare apelare a funciei sul
ry!stats"#& aceasta 7d 3napoi8 p6n la 3nceputul setului de rezultate/ "1cest fapt5 supune c ai creat setul de
rezultate cu mys-l!store!result"#/ 0ac 3l ere mys-l!use!result"#& putei prelucra r6ndurile numai 3n ordine 2i
numai o dat/#9 summary!stats"# este o funcie relati$ simpl& dar ar tre+ui s $ ofere o idee cu S! la modul 3n
care putei programa calcule mai comple'e& cum este regresia celor ma55 ptrate pe dou coloane sau statistici
standard& cum este un test t/
;odificarea 3n interogri a datelor pro+lematice
Valorile de date care conin zerouri& g,ilimele sau +acIslas,-uri& dac sunt inserat ral 3ntr-o 3nregistrare& pot
cauza pro+leme atunci c6nd 3ncercai s e'ecutai inter 4'punerea urmtoare prezint natura dificultii si modul
de rezol$are a acesteia& l
))?gO)/ $
;apitolul A =nterfaa 1P= MySQL pentru ; 2b^
S presupunem c dorii s construii o interogare S4L4;V 3n funcie de coninutul 2irului 3nc,eiat prin zero 2i
indicat prin nume(
c,ar -ueryS@02UT9
sprintf "-uery& 8S4L4;V ? GMNM ta+el Ze4M4 numeFWDsW8& nume#9 0ac $aloarea lui nume este ce$a de
genul 8NWMalley& Xrian8& interogarea rezultat este incorect& deoarece 3n cadrul unui 2ir delimitat prin g,ilimele
apar alte g,ilimele(
S4L4;V ? GMNM ta+el Ze4M4 numeFWNWMalley& Xrian@
Vre+uie s tratai g,ilimelele 3ntr-un mod aparte& astfel 3nc6t ser$erul s nu le interpreteze ca fiind sf6r2itul
numelui/ N modalitate const 3n du+larea g,ilimelelor din interiorul 2irului/ 1ceasta este con$enia 1*S= pentru
SQL/ MySQL 3nelege aceast con$enie si mai permite ca g,ilimelele s fie precedate de un +acIslas,(
S4L4;V ? GMNM ta+el Ze4M4 numeFW08Malley& Xrian@
S4L4;V ? GMNM ta+el Ze4M4 numeFW0EWMalley& Xrian@
N alt situaie pro+lematic implic utilizarea 3ntr-o interogare a unor date +inare ar+itrare/ 1cest lucru se
3nt6mpl& de e'emplu& 3n aplicaii care stoc,eaz imagini 3ntr-o +az de date/ 0eoarece o $aloare +inar poate
conine orice caracter& nu poate fi inclus ca atare 3ntr-o interogare& 3n condiii de siguran/
Pentru a rezol$a aceast pro+lem& folosii mys-l!escape!string"#& care codific acele caractere speciale& pentru a
permite utilizarea lor 3n 2irurile delimitate prin g,ilimele/ ;aracterele pe care funcia mys-l!escape!string "# le
consider speciale sunt caracterul nul& g,ilimelele simple 2i du+le& +acIslas,-ul& linia nou& returul de car si
;ontrol-h/ "Ultimul apare 3n conte'te ZindoHs/#
;6nd tre+uie s folosii mys-l!escape!string"#\ Mspunsul cel mai sigur este 73ntotdeauna8/ Votu2i& dac suntei
sigur de forma datelor dumnea$oastr si 2tii c totul este 3n ordine - poate deoarece ai efectuat anterior
$erificri pentru $alidare - nu tre+uie s le codificai/ 0e e'emplu& dac lucrai cu 2iruri despre care 2tii c
reprezint numere de telefon corecte& alctuite integral din cifre si liniue& nu tre+uie s apelai
mys-l!escape!string"#/ 3n caz contrar& pro+a+il c tre+uie s apelai funcia respecti$/
mys-l!escape!string"# codific acele caractere pro+lematice transform6ndu-le 3n sec$ene de dou caractere care
3ncep cu un +acIslas,/ 0e e'emplu& un octet nul de$ine E0& unde N este un caracter N 1S;== care poate fi afi2at&
nu un caracter nul/ ;aracterele +acIslas,& g,ilimelele simple 2i du+le se transform 3n E E& EW 2i E8/
Pentru a folosi funcia mys-l!escape!string"#& in$ocai-o astfel(
toRLen F mys-l!escape!string "to!str& from!str& from!len#9 mys-l!escape!string"# codific 2irul f rom!str 2i
scrie rezultatul 3n to!str/ 0e asemenea& adaug un zero de final& care este con$ena+il deoarece putei folosi 2irul
rezultant cu funcii precum strcpy "# si strlen "#/
f rom!str indic spre un +uffer de tip c,ar& care conine 2irul ce tre+uie codificat/ 1cest 2ir poate conine orice&
inclusi$ date +inare/ to!str indic spre un +uffer c,ar e'istent& unde dorii s fie scris 2irul codificat9 nu
transferai un pointer neiniializat sau *ULL& a2tept6nd ca funcia mys-l!escape!string"# s aloce spaiu 3n mod
automat/ Lungimea +ufferului indicat de to!str tre+uie s fie de cel puin "f rom!len?2# Y@ octei/ "4ste posi+il ca
fiecare caracter din f rom!str s necesite codificarea cu dou caractere9 octetul suplimentar este destinat zeroului
de final/#
2bb Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
f rom!len 2i to!len sunt $alori de tipul unsigned int/ f rom!len indic lungimea datg35 din f rom!str9 este necesar
furnizarea lungimii& deoarece f rcm!str poate conine > nuli 2i nu poate fi tratat drept un 2ir terminat 3n zero/
to!len& $aloarea returaati5Q funcia mys-l!escape!string "#& este lungimea efecti$ a 2irului codificat rezultant a
numra zeroul final/
;6nd funcia mys-l!escape!string"# returneaz& rezultatul codificat 3n to!str . tratat ca un 2ir care se termin 3n
zero& deoarece toate zerourile din f rom!str sunt'. ficate su+ forma sec$enei afi2a+ile E0/
Pentru a rescrie codul de construcie al instruciunii S4L4;V astfel 3nc6t s funci c,iar si pentru nume care
conin g,ilimele& $om proceda astfel( c,ar -ueryS@02UT& ?p9
p F strcpy "-uery& 8S4L4;V ? GMNM ta+el Ze4M4 numeF8#9
p YF strlen "p#9
p YF mys-l!escape!string "p& nume& strlen "nume##9
p F strcpy "p& W88#9 0a& e ur6t/ 0ac dorii s simplificai puin& cu preul utilizrii unui al doilea +uffet& . cedai
astfel(
c,ar -ueryS@02UT& +ufS@02UT9
"$oid# mys-l!escape!string "+uf& nume& strlen "nume##9 sprintf "-uery& 8S4L4;V ? GMNM ta+el Ze4M4
numeFWDs8& +uf#9
Lucrul cu date su+ form de imagini
Una dintre sarcinile pentru care funcia mys-l!escape!string"# este esenial ifli 3ncrcarea datelor su+ form de
imagine 3ntr-un ta+el/ 1ceast seciune $ arat i procedai/ "4'punerea de fa este $ala+il 2i pentru orice form
de date +inare/#
S presupunem c dorii s citii imagini din fi2iere si s le stocai 3ntr-un ta+el&8 de un identificator unic/ Vipul
XLNX reprezint o opiune +un pentru datele +ina putei folosi o specificaie de ta+el ca aceasta( ;M41V4
V1XL4 imagini
imagine!id =*V *NV *ULL PM=M1MB _4B& imagine!data XLNX
Pentru a $ procura efecti$ o imagine dintr-un fi2ier situat 3n ta+elul imagini&& urmtoare& incarca!imagine"#&
e'ecut aceast operaie& date fiind un numr de5d ficare 2i un pointer spre un fi2ier desc,is care conine datele 3n
format imagine(
int i
incarca!imagine "MBSQL ?conn& int id& G=L4 ?f#
c,ar -ueryS@02U?@00T& +ufS@02U?@0T& ?p9
unsigned int from!len9
;apitolul A =nterfaa 1P= MySQL pentru ; 2bc
int
status9
sprintf "-uery& 8=*S4MV =*VN imagini V1LU4S "Dd&l-& id#9
p F -uery Y strlen "-uery#9
H,ile ""from!len F fread "+uf& @& sizeof "+uf#& f## P 0#
J? nu dep2i finalul +ufferului de interogare: ?J if "p Y "2?from!len# Y Q P -uery Y sizeof "-uery##
prit$t!error "*ULL& 8imagine prea mare8#9 return "@#9
p YF mys-l!escape!string "p& +uf& from!len#9
"$oid# strcpy "p& 8W#8#9
status F mys-l!-uery "conn& -uery#9
return "status#9
incarca!imagine"# nu aloc un +uffer de interogare foarte mare "@00_#& deci funcioneaz numai pentru imagini
relati$ simple& 3ntr-o aplicaie din lumea real& putei aloca +ufferul 3n mod dinamic& 3n funcie de dimensiunea
fi2ierului imagine/
Manipularea datelor su+ form de imagine "sau a oricror date +inare# pe care le o+inei dintr-o +az de date nu
constituie o pro+lem la fel de mare ca inseria lor pentru a putea fi utilizate& deoarece $alorile de date sunt
disponi+ile 3n form +rut 3n $aria+ila MBSQL!MNZ& iar lungimile sunt disponi+ile prin apelarea funciei
mys-l!f etc,!lengt,s "#/ Pur 2i simplu nu uitai s tratai $alorile ca 2iruri numrate& nu ca 2iruri care se 3nc,eie
cu zero/
N+inerea informaiilor referitoare la ta+ele
MySQL $ permite s o+inei informaii despre structura ta+elelor dumnea$oastr folosind oricare dintre aceste
interogri "care sunt ec,i$alente#(
04S;M=X4 nume!ta+el
SeNZ G=4L0S GMNM nume!ta+el
1m+ele instruciuni seamn cu S4L4;V& 3n sensul c returneaz un set de rezultate/ Pentru a afla date despre
coloanele din ta+el& tot ce tre+uie s facei este s prelucrai r6ndurile din rezultat pentru a e'trage informaiile de
care a$ei ne$oie/ 0e e'emplu& dac emitei o instruciune 04S;M=X4 imagini din clientul mys-l& acesta $a
returna urmtoarea informaie(
Gield Vype *ull _ey = 0efault 4'tra
imagine!id
imagine!data
int"@@#
+lo+ B4S PM= i 0 i *ULL

0ac e'ecutai aceea2i interogare din propriul dumnea$oastr client& $ei primi acelea2i [iformaii "fr casete#/
2c0 Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
0ac dorii informaii numai despre o singur coloan& folosii aceast interogare(
SeNZ G=4L0S GMNM nume!ta+el L=_4 8nume!coloana8 =nterogarea $a returna acelea2i coloane& dar un
singur r6nd "sau nici un r6nd& 3n cazul rR care coloana nu e'ist#/
fre2eli de programare a programelor client care tre+uie e$itate
1ceast seciune discut despre unele erori comune de programare a interfeelor / pentru MySQL scrise 3n ;&
precum 2i despre modul de e$itare a acestora/ "1ceste pr +leme apar periodic 3n lista de coresponden despre
MySQL9 nu le-am in$entat eu/#
fre2eala @( Utilizarea unor pointer: neiniializai ai $aria+ilelor de tratare a cone'iunilor
3n e'emplele prezentate 3n acest capitol& am apelat funcia mys-l!init"# transfer6nd acesteia un argument *ULL/
1stfel& se indic funciei mys-l!init "# s aloce 2i s inirializ o structur MBSQL 2i s returneze un pointer spre
aceasta/ N alt a+ordare o consrit transferul unui pointer spre o structur MBSQL& 3n acest caz& mys-l!init "# $a
iniializa9 structur 2i $a returna un pointer ctre aceasta fr a aloca structura 3ns2i/ 0ac dorii i folosii aceast
a doua metod& aceasta poate duce la anumite pro+leme dificil de depis Urmtoarea e'punere $a scoate 3n
e$iden unele pro+leme de e$itat/
0ac transferai un pointer funciei mys-l!init "#& acesta tre+uie s indice spre ce$a///WC lum aceast component
de program( main"#
MBSQL ?conn9
mys-l!init "conn#9
Pro+lema este c mys-l!init "# prime2te un pointer& dar pointerul nu indic spre ( semnificati$& conn este o
$aria+il local 2i& implicit& constituie un spaiu de st neiniializat& care poate indica oriunde atunci c6nd funcia
main "# 32i 3ncepe e'ecuii 1ceasta 3nseamn c mys-l!init "# $a folosi pointerul si $a scrie unde$a 3ntr-o zon
aleatoare de memorie/ 0ac a$ei noroc& conn $a indica unde$a 3n afara spaiului de adrese al programului
dumnea$oastr 2i sistemul $a termina imediat e'ecuia prograft/ mului& deci $ei sesiza apariia pro+lemei 3nc
de la primele linii de program/ 0ac aaW suntei at6t de norocos& conn $a indica spre date pe care le folosii mai
t6rziu 3n program%? iar dumnea$oastr nu $ei sesiza apariia unei pro+leme dec6t atunci c6nd programa2i
3ncearc efecti$ s foloseasc datele respecti$e& 3n acest caz& pro+lema $a prea c se p$oetW duce 3ntr-o faz a
programului mult mai a$ansat dec6t aceea din care pro$ine efecti$ 2i poate fi mult mai dificil de depistat/ =at
un program 7cu pro+leme8 asemntor( MBSQL ?conn9
main"#
;apitolul A =nterfaa 1P= MySQL pentru ; 2c@
mys-l!init"conn#9 mys-l!real!connect mys-l!-uery "conn&
"conn& ///#
8SeNZ 01V1X1S4S8#9
3n acest caz& conn este o $aria+il glo+al& deci este iniializat la N "adic *ULL# 3nainte de pornirea
programului/ mys-l!init "# $ede un argument *ULL& deci se iniializeaz 2i aloc o nou $aria+il de tratare a
cone'iunii/ 0in pcate& conn este 3nc *ULL& deoarece niciodat nu 3i este atri+uit $reo $aloare/ 0e 3ndat ce
transferai conn unei funcii din interfaa 1P= 3n ; pentru MySQL care impune o $aria+il de tratare a cone'iunii
diferit de *ULL& programul dumnea$oastr $a cdea/ Pentru am+ele programe& remediul 3l constituie
asigurarea faptului c $aria+ila conn are o anumit $aloare/ 0e e'emplu& o putei iniializa la adresa unei
structuri MBSQL de.a alocate( MBSQL conn!struct& ?conn F Oconn!struct9
mys-l!init "conn#9
Votu2i& soluia recomandat "2i mai u2oar:# este pur 2i simplu de a transfera *ULL 3n mod e'plicit funciei
mys-l!init"#& de a permite acelei funcii s aloce automat structura MBSQL 2i s atri+uii $aria+ilei conn
$aloarea returnat(
MBSQL ?conn9
conn F mys-l!init "*ULL#9
3n orice caz& nu uitai s testai $aloarea returnat a funciei mys-l!init"#& pentru a $ asigura c nu este *ULL/
fre2eala 2( Lipsa testului $aliditii unui set de rezultate
*u uitai s $erificai starea apelurilor de unde $ a2teptai s o+inei un set de rezultate/ Programul de mai .os
nu face asta(
MBSQL!M4S ?res!set9
MBSQL!MNZ roH9
res!set F mys-l!store!result "conn#9 H,ile ""roH F mys-l!fetc,!roH "res!set## :
C
J? prelucrare rand ?J
*ULL#
0in pcate& dac mys-l!store!result"# e2ueaz& res!set este *ULL si ciclul H,ile nici mcar nu mai tre+uie
e'ecutat/ Vestai $aloarea returnat de funciile care returneaz seturi de rezultate& pentru a $ asigura c a$ei
efecti$ un 7material de lucru8/
fre2eala Q( =gnorarea $alorilor *ULL din coloane
*u uitai s $erificai dac $alorile coloanelor din ta+loul MBSQL!MNZ returnat de ctre funcia
mys-l!fetc,!roH"# sunt pointeri *ULL/ Pe unele calculatoare& programul urmtor 7cade8 dac roHSiT este
*ULL(
2c2 Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
for "i F 09 i > mys-l!num!fields "res!set#9 iYY#
C
if "i P 0#
fputc "WEtW& stdout#9 printf "8Ds8& roHSiT#9
fputc "WEnW& stdout#9 Partea cea mai gra$ a acestei gre2eli este c unele $ersiuni ale funciei printf "# sunt 7ia:
toare8 si afi2eaz 8 "nuli#8 pentru pointeri *ULL& ceea ce $ permite s scpai fr a re dia pro+lema/ 0ac
oferii programul dumnea$oastr unui prieten care dispune de o i printf "# mai puin mrinimoas& programul
cade 2i prietenul dumnea$oastr a.ut concluzia c suntei un programator de doi +ani/ ;iclul de mai sus ar fi
tre+uit scris9
for "i F 09 i > mys-l%num!fields "res!set#9
if "i P 0#
fputc "WEtW& stdout#9 printf "8Ds8& roHSiT @F *ULL
\ roHSiT ( 8*ULL8#9
fputc "WEnW& stdout#9
Singura dat c6nd nu tre+uie s $erificai dac $aloarea dintr-o coloan este *ULL i atunci c6nd ai determinat
de.a& din structura de informaii pri$ind coloana& c func =S!*NV!*ULL"# are $aloarea 7ade$rat8/
fre2eala U( 1 transfera +uffere de rezultat lipsite de sens
Gunciile din +i+lioteca client care se a2teapt ca dumnea$oastr s furnizai +uffere general pretind ca aceste
+uffere s si e'iste/ Programul de mai .os 3ncalc acest prii
c,ar ?from!str F 8un 2ir89
c,ar ?to!str9
unsigned int len9
len F mys-l!escape!string "to!str& from!str& strlen "from!str##9 ;are este pro+lema\ to!str tre+uie s indice spre
un +uffer e'istent& 3n acest e'emHl nu o face9 indic spre o locaie aleatoare/ *u transferai un pointer
,einiializat ca P ment to!str al funciei mys-l!escape!string"# dec6t dac dorii ca aceasta si/./ 3mpiedice cu
entuziasm peste cine 2tie ce zon de memorie aleatoare/
;1P=VNLUL ^
=nterfaa 1P= pentru Perl 0X=
;apitolul de fa prezint modul de utilizare a interfeei Perl 0X= pentru MySQL/ *u este discutat filozofia sau
ar,itectura 0X=/ Pentru informaii pri$ind aceste aspecte ale 0X= "mai ales 3n comparaie cu interfeele 1P= 3n ;
2i PeP#& consultai capitolul 5& 7=ntroducere 3n programarea MySQL8/
4'emplele din acest capitol pornesc de la +aza noastr de date demonstrati$& si anume samp!d+& folosind
ta+elele necesare pentru proiectul de e$iden a rezultatelor 2colare& respecti$ pentru Liga istoric/ Pentru a
utiliza la ma'imum acest capitol& tre+uie s 2tii unele lucruri despre Perl/ 0ac nu& $ putei scrie propriile
dumnea$oastr scripturi prin simpla copiere a programului demonstrati$ prezentat aici/ 0ar pro+a+il c o carte
+un de Perl $a constitui o in$estiie solid pentru dumnea$oastr/ N asemenea carte este Programming Perl&
Second 4dition& de Zall& ;,ristiansen& Sc,Hartz 2i Potter "NWMeilly& @cD#/ 3n prezent& 0X= se afl la $ersiunea
@/@Q& de2i ma.oritatea celor prezentate aici se aplic 2i $ersiunilor anterioare l/''/ ;aracteristicile descrise 3n
capitolul de fa 2i care nu e'ist 3n $ersiunile anterioare au fost menionate 3n acest sens/
0X= pentru MySQL necesit o $ersiune de Perl cel puin la fel de recent ca $ersiunea 5/00U!05/ 0e asemenea&
tre+uie s instalai Ms-l-Mys-l-modules 2i modulele Perl 0ata-0umper& precum 2i fi2ierele antet 2i +i+lioteca
client ; pentru MySQL/ 0ac intenionai s scriei scripturi 0X= +azate pe Perl& pro+a+il c $ei dori s folosii
modulul ;f=/pm/ 3n acest capitol& modulul respecti$ este folosit 3n con.uncie cu ser$erul Ze+ 1pac,e/ 0ac
tre+uie s $ procurai oricare dintre aceste pac,ete& $ezi 1ne'a 1& 7N+inerea 2i instalarea programelor8/
=nstruciunile pentru procurarea scripturilor cu caracter de e'emplu prezentate 3n acest capitol sunt de asemenea
date 3n ane'a respecti$/ Putei descrca scripturile& pentru a e$ita s le tastai personal/
3n ma.oritatea situaiilor& acest capitol descrie metodele 2i $aria+ilele Perl 0X= numai 3n msura 3n care acestea
sunt necesare pentru e'punerea de faa/ Pentru o list compre,ensi$ a tuturor metodelor 2i $aria+ilelor& $ezi
1ne'a f& 7Meferin 1P= Perl 0XG/ Putei folosi ane'a respecti$ ca referin pentru alte informaii pri$ind orice
component 0X= pe care 3ncercai s o folosii/ Prin rularea urmtoarelor comenzi se poate o+ine accesul la
documentaia electronic(
D perldoc 0X=
D perldoc 0X=((G1Q
D perldoc 0X0((mys-l
7V/i
ni fi( l
3[t5 i )P "?>)W
r W&
[9
2cU Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
La ni$elul dri$erului de +aze de date "0X0#& dri$erul pentru MySQL este construit peste +i+lioteca client ;
pentru MySQL 2i ca atare 3mprumut unele dintre caracteristicile acesteia/ Vezi capitolul A& 7=nterfaa 1P=
MySQL pentru ;8& pentru mai multe informaii despre +i+lioteca respecti$/
?3 8 l :WW ) W ) (
;aracteristici ale scripturilor Perl
Scripturile Perl nu sunt altce$a dec6t fi2iere te't& iar dumnea$oastr le puteri crea folosind orice editor de te'te/
Voate scripturile Perl din acest capitol respect con$enia U*=] de a utiliza o prim linie care 3ncepe cu L:&
urmat de numele de cale al programului folosit pentru e'ecutarea scriptului/ Linia pe care o utilizez eu este
urmtoarea(
L: JusrJ+inJperl
Va tre+ui s modificai linia L: dac numele cii de acces spre Perl este diferit 3n sistemul dumnea$oastr& de
e'emplu JusrJlocalJ+inJperls sau JoptJ+inJPerl/ 3n caz contrar& scripturile Perl nu $or rula corect 3n sistemul
dumnea$oastr/
1m inclus un spaiu dup sec$ena L:&/ deoarece unele sisteme interpreteaz sec$ena L: J ca pe un numr magic
din U octeti& ignor linia dac spaiul lipse2te si astfel trateaz scrip-tul ca pe un script de interpretor/
Su+ U*=]& un script Perl tre+uie s fie e'ecuta+il& pentru a putea fi rulat prin simpla tastare a numelui su/
Pentru a face un fi2ier script e'ecuta+il& modificati-i modul fi2ier dup cum urmeaz(
r W -- ( 8 ) t
D c,nod Y' nume!script )/ 0ac folosii 1cti$eState Perl su+ %4ndoHs& nu facei scripturile e'ecuta+ile& 3n
sc,im+& rulai un script ca acesta(
;(EP perl nume!script
W& W:(&>)/- ( /r f 8 -
4lemente fundamentale ale modulului Perl 0X=
1ceast seciune furnizeaz informrii elementare despre Perl 0X=& 3n spe informaiile de care a$ei ne$oie
pentru a yi /scrie propriile scripturi si pentru a 3nelege scripturile scrise de altii/ 0ac suntei un cunosctor 3n
materie/de 0X=& putei trece direct la seciur nea 7Utilizarea 0X=8/ &&7//&/
Vipuri de date 0X=
0in anumite puncte de $edere& utilizarea interfeei 1=?= pentru Perl 0X= este similar ce utilizarea +i+liotecii
client f descris 3n capitolul O ;6nd folosiri +i+lioteca client f& apelai funcii si o+ineri acces I data legate de
MySQL mai ales prin mtermediul pointe?-rilor ctre structuri sau ctre ta+louri/ ;6nd folosiri interfaa 1P=
pentru 0X=& conti s apelai funcii si s folosiri pointeri la structuri& cu e'cepia faptului c/funciile numesc
metode& pointerii se numesc referine& $aria+ilele pointer se aamescMaria+ile manipulare& iar structurile spre care
indic $aria+ilele de manipulare se numesc o+iecte/
0X= folose2te numeroase categorii de $aria+ile de manipulare& 3n documentaia 0 acestea au tendina de a fi
specificate prin numele con$enionale prezentate 3n ta+elul ^/
;apitolul\ =nterfaa 1P= penZiPertP0Xf 2c5
Modalitatea 3n care folosii aceste $aria+ile $a de$eni e$ident pe parcurs/ 0e asemenea& sunt folosite numeroase
nume con$enionale pentru $aria+ile& altele dec6t $aria+ilele de manipulare "$ezi ta+elul ^/2#/ *u $om folosi
toate aceste nume de $aria+ile 3n capitolul de fa& dar este util s le cunoa2tei atunci c6nd citii scripturi 0X=
scrise de alte persoane/
Va+elul ^/@ *ume con$enionale ale $aria+ilelor de manipulare folosite 3n Peri =PX=
*ume
id+, ist, if, i,
Semnificaie
Varia+il de manipulare a unui o+iect +az de date - )
Varia+il de manipulare a unui o+iect instruciuneCinterogare# Varia+il de manipulare a unui fi2ier desc,is
i/.: (i
Varia+il de manipulare 7general89 semnificaia depinde de coninut
Va+elul ^2 *ume con$enionale ale $aria+ilelor& altele dec6t $aria+ilele de manipulare folosite 3n Perl 0X=
-(& ry
*ume
iP; ir$ iroHs jary
Semnificaie
;odul retumat de operaii care retumeaz 7ade$raf sau /fals8 W Valoarea retumat de operaii care retumeaz un
3ntreg Valoarea retumat de operaii care retumeaz un numr de r6nduri Un ta+lou "list# care reprezint un r6nd
de $alori i
Un script 0X= simplu
S 3ncepem de =a un script simplu& dump.nem+ers& care ilustreaz numeroase concepte standardW ae programrii
0X=& cum ar fi conectarea 2i deconectarea de ta ser$erul MySQL& emiterea interogrilor 2i regsirea datelor/
1cest script propice drept rezultat lista mem+rilor Ligii istorice& 3ntr-un format cu datele de_nuitate priiu
ta+u3aiori/ GormatulW nu este interesant 3n sine9 3n acest moment& este mai nnportant s $edem cum se folose2te
0X= dec6t s generm date de ie2ire cu un aspect estetic/ WW W W 8 Scriptul duiap.nem+ers se prezint astfel(
& & / &-
L@ 1ta2rJ +in Jperl / &( &
- W & i& & -> > ?
L duHp mem+ers - afi2eaz lista mem+rilor Ligii istorice
k ) W // / t .
use 0X=9 ??
use strict9 ) W
my "%dsn# F 80Ol(mys-l(samp!>l+(local,ostWlV ? nume sursa- date )y ifioser!Xaae# F Wpaull9 L numele utilizate
ruD5% PW) W-[y >%pass$[#rd# F Wsecret8 L parola r%8W$ %
my "id+,& ist,#9 / L $aria+ile de
date s
/ne
Rs[za
),i
2cA Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
;ontinuare my "mary#9
ta+lou pentru r6ndurile returnate de interogare
L conectarea la +aza de date
id+, F 0X=-Pconnect "idsn& iuser!name& SpassHord& C Maise4rror FP @ K#9
L emiterea interogrii
ist, F id+,-Pprepare "8S4L4;V nume& prenume& sufi'& email&8 / 8strada& ora2& stat& cod!postal& telefon GMNM
mem+ru / 8NM04M XB nume8#9
ist,-Pe'ecute "#9
L cite2te rezultatele interogrii& apoi face curenie H,ile "mary F ist,-Pfetc,roH!array "##
C
print .oin "8Et8& mary#& 8En89
K
ist,-Pfinis, "#9
id+,-Pdisconnect "#9
e'it "0#9
Pentru a testa personal scriptul& fie fl descrcri "$ezi 1ne'a 1#& fie 3l creai folosind un editor de te'te 2i apoi 3l
faceri e'ecuta+il pentru a-@ putea rula/ Pro+a+il c $a tre+ui s modificri mcar o parte din parametrii de
cone'iune "numele gazdei& numele +azei de date& numele de utilizator& parola#/ 1cest fapt este $ala+il 2i pentru
celelalte scripturi 0X= din capitolul de fa/ 3n mod presta+ilit& permisiunile pentru scripturile din acest capitol
care pot fi descrcate din =nternet sunt astfel configurate 3nc6t scripturile pot fi citite numai de dumnea$oastr/
V propun s nu modificri aceast proprietate& dac $ inserai propriul nume de utilizator MySQL 2i propria
parol& pentru ca aceste $alori s nu poat fi citite de alte persoane/ Mai t6rziu& 3n seciunea 7Specificarea
parametrilor de cone'iune8& $om $edea cum se pot o+ine parametrii dintr-un fi2ier cu opiuni& 3n loc de a-i
insera direct 3n script/ 1cum& s parcurgem scriptul instruciune cu instruciune/ Prima linie conine indicatorul
standard de localizare a lim+a.ului Perl(
L: JusrJ+inJperl
1ceast linie face parte din toate scripturile pe care le $om discuta 3n capitolul de fa9 nu $om mai $or+i despre
ea 3n $iitor/
4ste o idee +un s includei 3n script cel puin o descriere minimal a scopului su& deci linia urmtoare este un
comentariu care furnizeaz oricrei persoane care e'amineaz scriptul o idee asupra finalitii acestuia(
L dump.nem+ers - afi2eaz lista mem+rilor Ligii istorice Ve'tul cuprins 3ntre caracterul L 2i p6n la sf6r2itul liniei
se consider comentariu/ Merit s inserai comentarii 3n scripturi& comentarii care e'plic modul de funcionare
a acestora/
fii?
;apitolul ^ =nterfaa 1P= pentru Perl 0X= 2c^
3n continuare& a$em dou linii use(
use 0X=9
use strict9
use 0X= comunic interpretorului Perl c tre+uie s foloseasc modulul 0X=/ 3n lipsa acestei linii& se $a produce
o eroare de 3ndat ce 3ncercai s 3ntreprindei orice aciune legat de 0X=/ Votu2i& nu tre+uie s indicai modulul
de ni$el 0X0 dorit/ 0X= acti$eaz automat modulul corect atunci c6nd $ conectai la +aza dumnea$oastr de
date/
use strict indic programului Perl s $ o+lige s declarai $aria+ilele 3nainte de a le folosi/ Putei scrie scripturi
fr a insera o linie use strict& dar aceasta este util pentru detectarea gre2elilor& deci $ recomand s o folosii
3ntotdeauna/ 0e e'emplu& c6nd modul strict este acti$at& dac declarai o $aria+il imy!$ar& dar apoi facei
referire la $aria+ila respecti$ 3n mod eronat& su+ numele im$!$ar& $eri primi urmtorul mesa. atunci c6nd rulai
scriptul(
flo+al sym+ol 8im$!$ar8 re-uires e'plicit pacIage name at line n "Sim+olul glo+al 7im$!$ar8 impune un nume
e'plicit de pac,et la linia n#
;6nd $edei a2a ce$a& $ spunei( 7;e\ im$!$ar\ *-am folosit niciodat o $aria+il cu numele acela:8 1poi $
e'aminai linia n din script& depistai pro+lema 2i o remediai& 3n lipsa modului strict& Perl nu $a ridica o+iecii 3n
ceea ce pri$e2te im$!$ar9 pur si simplu creeaz o $aria+il cu numele respecti$ si de $aloare undef "de la
undefined - nedefinit#& o folose2te fr s fac nazuri& iar dumnea$oastr $ 3ntre+ai de ce oare nu merge
scriptul/
0eoarece lucrm 3n modul strict& $om declara $aria+ilele pe care le folose2te scriptul( my "idsn# F
80X=(mys-l(samp!d+(local,osta9 L nume sursa date my "iuser!name# F 8paul89 L
numele utilizatorului
my "ipassHord# F 8secret8 L parola
my "Sd+,& ist,#9 L $aria+ile de manipulare
pentru +aza de date si instruciune
my "mary#9 L ta+lou pentru r6ndurile
returnate de interogare
1cum& suntem pregtii s ne conectm I +aza de date( L conectarea la +aza de date
id+, F 0X=-Pconnect "idsn& iuser!name& ipassHord& C Maise4rror FP @ K#9 1pelul la funcia connect"# este
in$ocat su+ forma 0X=-Pconnect"#& deoarece aceast funcie este o metod a clasei 0X=/ *u tre+uie s 2tii e'act
ce 3nseamn asta9 nu este nimic altce$a dec6t o mic mostr de .argon orientat spre o+iecte& a2a& ca s $ doar
capul/ "0ac $rei s 2tii cu tot dinadinsul& 3nseamn c funcia connect "# este o funcie care 7aparine8
modulului 0X=/# Guncia connect"# preia mai multe argumente(
) Sursa de date/ "0enumit deseori numele sursei de date sau 0S* - a+re$iere de la data source name/#
Gormatele surselor de date sunt determinate de cerinele modulului 0X0 pe care dorii s-@ folosiri/ Pentru
dri$erul MySQL& formatele permise includ oricare din urmtoarele $ariante( 80X=(mys-l(nume!+aza!de!date8
80X=(mys-l(nume!+aza!de!date(nume!gazda8
??) )8?
2cb Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
Pentru primul format& numele de gazd presta+ilit este local,ost/ "4'ist 2i alte formate permise pentru sursele de
date& despre care $om discuta ulterior 3n seciunea 7Specificarea parametrilor de cone'iune8# *u conteaz
mrimea literelor folosite 3n 80X=8& dar 8mys-l8 tre+uie scris cu litere mici/
) *umele dumnea$oastr de utilizator 2i parola/
) Un argument opional& care indic atri+ute de cone'iune suplimentare/ 1cesta controleaz modalitatea 0X= de
tratare a erorilor& iar construcia cu aspect ciudat pe care a?n specificat-o acti$eaz atri+utul Maise4rror/ 1ceasta
determin modulul 0X= s caute erorile relati$e la +azele de date& respecti$ s afi2eze un mesa. 2i s-2i 3nc,eie
e'ecuia ori de c6te ori 3nt6lne2te o eroare/ "=at de ce nu $edei nici un program de detecie a apariiei erorilor
nicieri 3n interiorul scriptului dump.nem+ers9 0X= se ocup de aceast operaie/# Seciunea 7Vratarea erorilor8
discut despre metode alternati$e de reacie la apariia unor erori/
3n cazul 3n care apelul la funcia connect "# reu2e2te& returneaz o $aria+il de manipulare pentru +aze de date& pe
care o atri+uim lui id+,/ "0ac apelul la connect "# e2ueaz& 3n mod normal returneaz undef/ Votu2i& deoarece
am acti$at Maise4rror 3n scriptul nostru& connect "# nu $a returna9 3n sc,im+& 0X= $a afi2a un mesa. de eroare 2i
32i $a 3nc,eia e'ecuia 3n cazul apariiei unei erori/#
0up conectarea la +aza de date& dump.nem+ers emite o interogare S4L4;V pentru a regsi lista mem+rilor&
apoi e'ecut un ciclu pentru a prelucra fiecare din r6ndurile returnate/ 1ceste r6nduri constituie setul de
rezultate/
Pentru a efectua o interogare S4L4;V& mai 3nt6i o pregtii 2i apoi o e'ecutai(
L emiterea interogrii
ist, F id+,-Pprepare "8S4L4;V nume& prenume& sufi'& email&8 / Wstrada& ora2& stat& cod!postal& telefon GMNM
mem+ru8 8 NM04M XB nume8#9
ist,-Pe'ecute "#9
Guncia prepa re "# este apelat folosind $aria+ila de manipulare pentru +aze de date9 aceasta transfer dri$erului
instruciunea SQL pentru pre-procesare anterior e'ecuiei/ Unele dri$ere utilizeaz efecti$ instruciunea 3n acest
punct/ 1ltele 32i reamintesc de instruciune doar atunci c6nd in$ocai e'ecute "# pentru a determina efectuarea
instruciunii/ Valoarea returnat de prepare "# este o $aria+il de manipulare pentru instruciuni& adic ist,&
respecti$ undef 3n cazul apariiei unor erori/ Varia+ila de manipulare pentru instruciuni este folosit pentru toate
prelucrrile ulterioare legate de instruciune/ W
Meinei c interogarea este specificat fr caracterul de terminare punct 2i $irgula/ ;ategoric& a$ei o+iceiul
"dez$oltat dup un timp 3ndelungat de lucru cu programul mys-l# de a termina instruciunile SQL cu un
caracter 9/ Votu2i& cel mai +ine este s $ dez+rai de acest o+icei atunci c6nd folosii 0X=& deoarece deseori
caracterele punct si $irgul determin e2ecul interogrilor datorit unor erori de sinta'/ 1ceea2i reguli se aplic
2i pentru caracterele Eg( nu le adugai la sf6r2itul interogrilor:
;apitolul ^ =nterfaa 1P= pentru Perl 0X= 2cc
;6nd in$ocai o metod fr a-i transfera nici un argument& putei omite parantezele/ Urmtoarele dou apeluri
sunt ec,i$alente(
ist,-Pe'ecute "#9
ist,-Pe'ecute9
4u prefer s folosesc parantezele& deoarece astfel apelul seamn mai puin cu o referin la o $aria+il/ Poate c
preferinele dumnea$oastr sunt altele/
0up ce apelai funcia e'ecuted& r6ndurile din lista cu mem+ri pot fi prelucrate& 3n scriptul duHp.nem+ers& ciclul
de preluare a r6ndurilor pur si simplu afi2eaz coninutul fiecrui r6nd(
L cite2te rezultatele interogrii& apoi face curenie
H,ile "mary F ist,-Pfetc,roH!array"##
C
print .oin "8Vf& mary#& 8Vn8
P
ist,-Pfinis, "#9
Guncia fetc,roH!arrayC# returneaz un ta+lou care conine $alorile coloanelor din r6ndul curent& respecti$ un
ta+lou $id atunci c6nd nu mai e'ist r6nduri/ 1stfel& ciclul preia r6ndurile succesi$e returnate de instruciunea
S4L4;V 2i 3l afi2eaz pe fiecare& inser6nd ta+ulatori 3ntre $alorile coloanelor/ Valorile *ULL din +aza de date
sunt returnate scriptului Perl ca $alori undef& dar acestea sunt afi2ate ca 2iruri $ide& nu su+ forma cu$6ntului
*ULL/
N+ser$ai includerea ta+ulatorilor 2i a caracterelor linie nou "reprezentate su+ forma WEtW respecti$ WEnW# 3ntre
g,ilimele du+le& 3n Perl& sec$enele escape sunt interpretate numai c6nd apar 3ntre g,ilimele du+le& nu 3ntre
g,ilimele simple/ 0ac au fost folosite g,ilimelele simple& rezultatul $a fi plin de inctane literale ale 2irurilor 8
Et8 2i8 En8/
0up terminarea ciclului de preluare a r6ndurilor& apelul la funcia f inis, "# indic programului 0X= c $aria+ila
de manipulare pentru instruciuni nu mai este necesar 2i c pot fi eli+erate toate resursele temporare asociate
acesteia/ 1pelarea funciei finis, "# nu este necesar dec6t dac ai preluat numai o parte din setul de rezultate
"prin proiectare sau datorit apariiei anumitor pro+leme#/ Votu2i& f inis, C# poate fi 3ntotdeauna utilizat 3n
siguran dup un ciclu de preluare 2i mi se pare mai u2or s apelai funcia 2i s o utilizai dec6t s scriei logica
necesar pentru a disinge 3ntre situaiile 3n care finis, "# este necesar de cele 3n care funcia respecti$ este
superflu/
0up ce am afi2at lista mem+rilor am terminat& deci ne putem deconecta de la ser$er si 3nc,eia e'ecuia
programului(
id+,-Pdisconnect "#9
e'it "0#9
Scriptul dump.nem+ers ilustreaz un numr de concepte care sunt comune ma.oritii programelor 0X=& iar
dumnea$oastr putei 3ncepe pro+a+il s $ scriei propriile programe 0X= fr a a$ea alte cuno2tine
suplimentare/ 0e e'emplu& pentru a scrie coninutul unui alt ta+el& tot ce a$ei de fcut este s modificai te'tul
instructiunii S4L4;V care este transferat metodei prepare "# 0e fapt& dac dorii s $edei unele aplicrii ale
acestei te,nici& putei trece imediat la acea parte a seciunii 7Utilizarea 0XG care discut

S-ar putea să vă placă și