PNG  IHDRX cHRMz&u0`:pQ<bKGD pHYsodtIME MeqIDATxw]Wug^Qd˶ 6`!N:!@xI~)%7%@Bh&`lnjVF29gΨ4E$|>cɚ{gk= %,a KX%,a KX%,a KX%,a KX%,a KX%,a KX%, b` ǟzeאfp]<!SJmɤY޲ڿ,%c ~ع9VH.!Ͳz&QynֺTkRR.BLHi٪:l;@(!MԴ=žI,:o&N'Kù\vRmJ雵֫AWic H@" !: Cé||]k-Ha oݜ:y F())u]aG7*JV@J415p=sZH!=!DRʯvɱh~V\}v/GKY$n]"X"}t@ xS76^[bw4dsce)2dU0 CkMa-U5tvLƀ~mlMwfGE/-]7XAƟ`׮g ewxwC4\[~7@O-Q( a*XGƒ{ ՟}$_y3tĐƤatgvێi|K=uVyrŲlLӪuܿzwk$m87k( `múcE)"@rK( z4$D; 2kW=Xb$V[Ru819קR~qloѱDyįݎ*mxw]y5e4K@ЃI0A D@"BDk_)N\8͜9dz"fK0zɿvM /.:2O{ Nb=M=7>??Zuo32 DLD@D| &+֎C #B8ַ`bOb $D#ͮҪtx]%`ES`Ru[=¾!@Od37LJ0!OIR4m]GZRJu$‡c=%~s@6SKy?CeIh:[vR@Lh | (BhAMy=݃  G"'wzn޺~8ԽSh ~T*A:xR[ܹ?X[uKL_=fDȊ؂p0}7=D$Ekq!/t.*2ʼnDbŞ}DijYaȲ(""6HA;:LzxQ‘(SQQ}*PL*fc\s `/d'QXW, e`#kPGZuŞuO{{wm[&NBTiiI0bukcA9<4@SӊH*؎4U/'2U5.(9JuDfrޱtycU%j(:RUbArLֺN)udA':uGQN"-"Is.*+k@ `Ojs@yU/ H:l;@yyTn}_yw!VkRJ4P)~y#)r,D =ě"Q]ci'%HI4ZL0"MJy 8A{ aN<8D"1#IJi >XjX֔#@>-{vN!8tRݻ^)N_╗FJEk]CT՟ YP:_|H1@ CBk]yKYp|og?*dGvzنzӴzjֺNkC~AbZƷ`.H)=!QͷVTT(| u78y֮}|[8-Vjp%2JPk[}ԉaH8Wpqhwr:vWª<}l77_~{s۴V+RCģ%WRZ\AqHifɤL36: #F:p]Bq/z{0CU6ݳEv_^k7'>sq*+kH%a`0ԣisqにtү04gVgW΂iJiS'3w.w}l6MC2uԯ|>JF5`fV5m`Y**Db1FKNttu]4ccsQNnex/87+}xaUW9y>ͯ骵G{䩓Գ3+vU}~jJ.NFRD7<aJDB1#ҳgSb,+CS?/ VG J?|?,2#M9}B)MiE+G`-wo߫V`fio(}S^4e~V4bHOYb"b#E)dda:'?}׮4繏`{7Z"uny-?ǹ;0MKx{:_pÚmFמ:F " .LFQLG)Q8qN q¯¯3wOvxDb\. BKD9_NN &L:4D{mm o^tֽ:q!ƥ}K+<"m78N< ywsard5+вz~mnG)=}lYݧNj'QJS{S :UYS-952?&O-:W}(!6Mk4+>A>j+i|<<|;ر^߉=HE|V#F)Emm#}/"y GII웻Jі94+v뾧xu~5C95~ūH>c@덉pʃ1/4-A2G%7>m;–Y,cyyaln" ?ƻ!ʪ<{~h~i y.zZB̃/,雋SiC/JFMmBH&&FAbϓO^tubbb_hZ{_QZ-sύodFgO(6]TJA˯#`۶ɟ( %$&+V'~hiYy>922 Wp74Zkq+Ovn錄c>8~GqܲcWꂎz@"1A.}T)uiW4="jJ2W7mU/N0gcqܗOO}?9/wìXžΏ0 >֩(V^Rh32!Hj5`;O28؇2#ݕf3 ?sJd8NJ@7O0 b־?lldщ̡&|9C.8RTWwxWy46ah嘦mh٤&l zCy!PY?: CJyв]dm4ǜҐR޻RլhX{FƯanшQI@x' ao(kUUuxW_Ñ줮[w8 FRJ(8˼)_mQ _!RJhm=!cVmm ?sFOnll6Qk}alY}; "baӌ~M0w,Ggw2W:G/k2%R,_=u`WU R.9T"v,<\Ik޽/2110Ӿxc0gyC&Ny޽JҢrV6N ``یeA16"J³+Rj*;BϜkZPJaÍ<Jyw:NP8/D$ 011z֊Ⱳ3ι֘k1V_"h!JPIΣ'ɜ* aEAd:ݺ>y<}Lp&PlRfTb1]o .2EW\ͮ]38؋rTJsǏP@芎sF\> P^+dYJLbJ C-xϐn> ι$nj,;Ǖa FU *择|h ~izť3ᤓ`K'-f tL7JK+vf2)V'-sFuB4i+m+@My=O҈0"|Yxoj,3]:cо3 $#uŘ%Y"y죯LebqtҢVzq¼X)~>4L׶m~[1_k?kxֺQ`\ |ٛY4Ѯr!)N9{56(iNq}O()Em]=F&u?$HypWUeB\k]JɩSع9 Zqg4ZĊo oMcjZBU]B\TUd34ݝ~:7ڶSUsB0Z3srx 7`:5xcx !qZA!;%͚7&P H<WL!džOb5kF)xor^aujƍ7 Ǡ8/p^(L>ὴ-B,{ۇWzֺ^k]3\EE@7>lYBȝR.oHnXO/}sB|.i@ɥDB4tcm,@ӣgdtJ!lH$_vN166L__'Z)y&kH;:,Y7=J 9cG) V\hjiE;gya~%ks_nC~Er er)muuMg2;֫R)Md) ,¶ 2-wr#F7<-BBn~_(o=KO㭇[Xv eN_SMgSҐ BS헃D%g_N:/pe -wkG*9yYSZS.9cREL !k}<4_Xs#FmҶ:7R$i,fi!~' # !6/S6y@kZkZcX)%5V4P]VGYq%H1!;e1MV<!ϐHO021Dp= HMs~~a)ަu7G^];git!Frl]H/L$=AeUvZE4P\.,xi {-~p?2b#amXAHq)MWǾI_r`S Hz&|{ +ʖ_= (YS(_g0a03M`I&'9vl?MM+m~}*xT۲(fY*V4x@29s{DaY"toGNTO+xCAO~4Ϳ;p`Ѫ:>Ҵ7K 3}+0 387x\)a"/E>qpWB=1 ¨"MP(\xp߫́A3+J] n[ʼnӼaTbZUWb={~2ooKױӰp(CS\S筐R*JغV&&"FA}J>G֐p1ٸbk7 ŘH$JoN <8s^yk_[;gy-;߉DV{c B yce% aJhDȶ 2IdйIB/^n0tNtџdcKj4϶v~- CBcgqx9= PJ) dMsjpYB] GD4RDWX +h{y`,3ꊕ$`zj*N^TP4L:Iz9~6s) Ga:?y*J~?OrMwP\](21sZUD ?ܟQ5Q%ggW6QdO+\@ ̪X'GxN @'4=ˋ+*VwN ne_|(/BDfj5(Dq<*tNt1х!MV.C0 32b#?n0pzj#!38}޴o1KovCJ`8ŗ_"]] rDUy޲@ Ȗ-;xџ'^Y`zEd?0„ DAL18IS]VGq\4o !swV7ˣι%4FѮ~}6)OgS[~Q vcYbL!wG3 7띸*E Pql8=jT\꘿I(z<[6OrR8ºC~ډ]=rNl[g|v TMTղb-o}OrP^Q]<98S¤!k)G(Vkwyqyr޽Nv`N/e p/~NAOk \I:G6]4+K;j$R:Mi #*[AȚT,ʰ,;N{HZTGMoּy) ]%dHء9Պ䠬|<45,\=[bƟ8QXeB3- &dҩ^{>/86bXmZ]]yޚN[(WAHL$YAgDKp=5GHjU&99v簪C0vygln*P)9^͞}lMuiH!̍#DoRBn9l@ xA/_v=ȺT{7Yt2N"4!YN`ae >Q<XMydEB`VU}u]嫇.%e^ánE87Mu\t`cP=AD/G)sI"@MP;)]%fH9'FNsj1pVhY&9=0pfuJ&gޤx+k:!r˭wkl03׼Ku C &ѓYt{.O.zҏ z}/tf_wEp2gvX)GN#I ݭ߽v/ .& и(ZF{e"=V!{zW`, ]+LGz"(UJp|j( #V4, 8B 0 9OkRrlɱl94)'VH9=9W|>PS['G(*I1==C<5"Pg+x'K5EMd؞Af8lG ?D FtoB[je?{k3zQ vZ;%Ɠ,]E>KZ+T/ EJxOZ1i #T<@ I}q9/t'zi(EMqw`mYkU6;[t4DPeckeM;H}_g pMww}k6#H㶏+b8雡Sxp)&C $@'b,fPߑt$RbJ'vznuS ~8='72_`{q纶|Q)Xk}cPz9p7O:'|G~8wx(a 0QCko|0ASD>Ip=4Q, d|F8RcU"/KM opKle M3#i0c%<7׿p&pZq[TR"BpqauIp$ 8~Ĩ!8Սx\ւdT>>Z40ks7 z2IQ}ItԀ<-%S⍤};zIb$I 5K}Q͙D8UguWE$Jh )cu4N tZl+[]M4k8֦Zeq֮M7uIqG 1==tLtR,ƜSrHYt&QP윯Lg' I,3@P'}'R˪e/%-Auv·ñ\> vDJzlӾNv5:|K/Jb6KI9)Zh*ZAi`?S {aiVDԲuy5W7pWeQJk֤#5&V<̺@/GH?^τZL|IJNvI:'P=Ϛt"¨=cud S Q.Ki0 !cJy;LJR;G{BJy޺[^8fK6)=yʊ+(k|&xQ2`L?Ȓ2@Mf 0C`6-%pKpm')c$׻K5[J*U[/#hH!6acB JA _|uMvDyk y)6OPYjœ50VT K}cǻP[ $:]4MEA.y)|B)cf-A?(e|lɉ#P9V)[9t.EiQPDѠ3ϴ;E:+Օ t ȥ~|_N2,ZJLt4! %ա]u {+=p.GhNcŞQI?Nd'yeh n7zi1DB)1S | S#ًZs2|Ɛy$F SxeX{7Vl.Src3E℃Q>b6G ўYCmtկ~=K0f(=LrAS GN'ɹ9<\!a`)֕y[uՍ[09` 9 +57ts6}b4{oqd+J5fa/,97J#6yν99mRWxJyѡyu_TJc`~W>l^q#Ts#2"nD1%fS)FU w{ܯ R{ ˎ󅃏џDsZSQS;LV;7 Od1&1n$ N /.q3~eNɪ]E#oM~}v֯FڦwyZ=<<>Xo稯lfMFV6p02|*=tV!c~]fa5Y^Q_WN|Vs 0ҘދU97OI'N2'8N֭fgg-}V%y]U4 峧p*91#9U kCac_AFңĪy뚇Y_AiuYyTTYЗ-(!JFLt›17uTozc. S;7A&&<ԋ5y;Ro+:' *eYJkWR[@F %SHWP 72k4 qLd'J "zB6{AC0ƁA6U.'F3:Ȅ(9ΜL;D]m8ڥ9}dU "v!;*13Rg^fJyShyy5auA?ɩGHRjo^]׽S)Fm\toy 4WQS@mE#%5ʈfFYDX ~D5Ϡ9tE9So_aU4?Ѽm%&c{n>.KW1Tlb}:j uGi(JgcYj0qn+>) %\!4{LaJso d||u//P_y7iRJ߬nHOy) l+@$($VFIQ9%EeKʈU. ia&FY̒mZ=)+qqoQn >L!qCiDB;Y<%} OgBxB!ØuG)WG9y(Ą{_yesuZmZZey'Wg#C~1Cev@0D $a@˲(.._GimA:uyw֬%;@!JkQVM_Ow:P.s\)ot- ˹"`B,e CRtaEUP<0'}r3[>?G8xU~Nqu;Wm8\RIkբ^5@k+5(By'L&'gBJ3ݶ!/㮻w҅ yqPWUg<e"Qy*167΃sJ\oz]T*UQ<\FԎ`HaNmڜ6DysCask8wP8y9``GJ9lF\G g's Nn͵MLN֪u$| /|7=]O)6s !ĴAKh]q_ap $HH'\1jB^s\|- W1:=6lJBqjY^LsPk""`]w)󭃈,(HC ?䔨Y$Sʣ{4Z+0NvQkhol6C.婧/u]FwiVjZka&%6\F*Ny#8O,22+|Db~d ~Çwc N:FuuCe&oZ(l;@ee-+Wn`44AMK➝2BRՈt7g*1gph9N) *"TF*R(#'88pm=}X]u[i7bEc|\~EMn}P瘊J)K.0i1M6=7'_\kaZ(Th{K*GJyytw"IO-PWJk)..axӝ47"89Cc7ĐBiZx 7m!fy|ϿF9CbȩV 9V-՛^pV̌ɄS#Bv4-@]Vxt-Z, &ֺ*diؠ2^VXbs֔Ìl.jQ]Y[47gj=幽ex)A0ip׳ W2[ᎇhuE^~q흙L} #-b۸oFJ_QP3r6jr+"nfzRJTUqoaۍ /$d8Mx'ݓ= OՃ| )$2mcM*cЙj}f };n YG w0Ia!1Q.oYfr]DyISaP}"dIӗթO67jqR ҊƐƈaɤGG|h;t]䗖oSv|iZqX)oalv;۩meEJ\!8=$4QU4Xo&VEĊ YS^E#d,yX_> ۘ-e\ "Wa6uLĜZi`aD9.% w~mB(02G[6y.773a7 /=o7D)$Z 66 $bY^\CuP. (x'"J60׿Y:Oi;F{w佩b+\Yi`TDWa~|VH)8q/=9!g߆2Y)?ND)%?Ǐ`k/sn:;O299yB=a[Ng 3˲N}vLNy;*?x?~L&=xyӴ~}q{qE*IQ^^ͧvü{Huu=R|>JyUlZV, B~/YF!Y\u_ݼF{_C)LD]m {H 0ihhadd nUkf3oٺCvE\)QJi+֥@tDJkB$1!Đr0XQ|q?d2) Ӣ_}qv-< FŊ߫%roppVBwü~JidY4:}L6M7f٬F "?71<2#?Jyy4뷢<_a7_=Q E=S1И/9{+93֮E{ǂw{))?maÆm(uLE#lïZ  ~d];+]h j?!|$F}*"4(v'8s<ŏUkm7^7no1w2ؗ}TrͿEk>p'8OB7d7R(A 9.*Mi^ͳ; eeUwS+C)uO@ =Sy]` }l8^ZzRXj[^iUɺ$tj))<sbDJfg=Pk_{xaKo1:-uyG0M ԃ\0Lvuy'ȱc2Ji AdyVgVh!{]/&}}ċJ#%d !+87<;qN޼Nفl|1N:8ya  8}k¾+-$4FiZYÔXk*I&'@iI99)HSh4+2G:tGhS^繿 Kتm0 вDk}֚+QT4;sC}rՅE,8CX-e~>G&'9xpW,%Fh,Ry56Y–hW-(v_,? ; qrBk4-V7HQ;ˇ^Gv1JVV%,ik;D_W!))+BoS4QsTM;gt+ndS-~:11Sgv!0qRVh!"Ȋ(̦Yl.]PQWgٳE'`%W1{ndΗBk|Ž7ʒR~,lnoa&:ü$ 3<a[CBݮwt"o\ePJ=Hz"_c^Z.#ˆ*x z̝grY]tdkP*:97YľXyBkD4N.C_[;F9`8& !AMO c `@BA& Ost\-\NX+Xp < !bj3C&QL+*&kAQ=04}cC!9~820G'PC9xa!w&bo_1 Sw"ܱ V )Yl3+ס2KoXOx]"`^WOy :3GO0g;%Yv㐫(R/r (s } u B &FeYZh0y> =2<Ϟc/ -u= c&׭,.0"g"7 6T!vl#sc>{u/Oh Bᾈ)۴74]x7 gMӒ"d]U)}" v4co[ ɡs 5Gg=XR14?5A}D "b{0$L .\4y{_fe:kVS\\O]c^W52LSBDM! C3Dhr̦RtArx4&agaN3Cf<Ԉp4~ B'"1@.b_/xQ} _߃҉/gٓ2Qkqp0շpZ2fԫYz< 4L.Cyυι1t@鎫Fe sYfsF}^ V}N<_`p)alٶ "(XEAVZ<)2},:Ir*#m_YӼ R%a||EƼIJ,,+f"96r/}0jE/)s)cjW#w'Sʯ5<66lj$a~3Kʛy 2:cZ:Yh))+a߭K::N,Q F'qB]={.]h85C9cr=}*rk?vwV렵ٸW Rs%}rNAkDv|uFLBkWY YkX מ|)1!$#3%y?pF<@<Rr0}: }\J [5FRxY<9"SQdE(Q*Qʻ)q1E0B_O24[U'],lOb ]~WjHޏTQ5Syu wq)xnw8~)c 쫬gٲߠ H% k5dƝk> kEj,0% b"vi2Wس_CuK)K{n|>t{P1򨾜j>'kEkƗBg*H%'_aY6Bn!TL&ɌOb{c`'d^{t\i^[uɐ[}q0lM˕G:‚4kb祔c^:?bpg… +37stH:0}en6x˟%/<]BL&* 5&fK9Mq)/iyqtA%kUe[ڛKN]Ě^,"`/ s[EQQm?|XJ߅92m]G.E΃ח U*Cn.j_)Tѧj̿30ڇ!A0=͜ar I3$C^-9#|pk!)?7.x9 @OO;WƝZBFU keZ75F6Tc6"ZȚs2y/1 ʵ:u4xa`C>6Rb/Yм)^=+~uRd`/|_8xbB0?Ft||Z\##|K 0>>zxv8۴吅q 8ĥ)"6>~\8:qM}#͚'ĉ#p\׶ l#bA?)|g g9|8jP(cr,BwV (WliVxxᡁ@0Okn;ɥh$_ckCgriv}>=wGzβ KkBɛ[˪ !J)h&k2%07δt}!d<9;I&0wV/ v 0<H}L&8ob%Hi|޶o&h1L|u֦y~󛱢8fٲUsւ)0oiFx2}X[zVYr_;N(w]_4B@OanC?gĦx>мgx>ΛToZoOMp>40>V Oy V9iq!4 LN,ˢu{jsz]|"R޻&'ƚ{53ўFu(<٪9:΋]B;)B>1::8;~)Yt|0(pw2N%&X,URBK)3\zz&}ax4;ǟ(tLNg{N|Ǽ\G#C9g$^\}p?556]/RP.90 k,U8/u776s ʪ_01چ|\N 0VV*3H鴃J7iI!wG_^ypl}r*jɤSR 5QN@ iZ#1ٰy;_\3\BQQ x:WJv츟ٯ$"@6 S#qe딇(/P( Dy~TOϻ<4:-+F`0||;Xl-"uw$Цi󼕝mKʩorz"mϺ$F:~E'ҐvD\y?Rr8_He@ e~O,T.(ފR*cY^m|cVR[8 JҡSm!ΆԨb)RHG{?MpqrmN>߶Y)\p,d#xۆWY*,l6]v0h15M˙MS8+EdI='LBJIH7_9{Caз*Lq,dt >+~ّeʏ?xԕ4bBAŚjﵫ!'\Ը$WNvKO}ӽmSşذqsOy?\[,d@'73'j%kOe`1.g2"e =YIzS2|zŐƄa\U,dP;jhhhaxǶ?КZ՚.q SE+XrbOu%\GتX(H,N^~]JyEZQKceTQ]VGYqnah;y$cQahT&QPZ*iZ8UQQM.qo/T\7X"u?Mttl2Xq(IoW{R^ ux*SYJ! 4S.Jy~ BROS[V|žKNɛP(L6V^|cR7i7nZW1Fd@ Ara{詑|(T*dN]Ko?s=@ |_EvF]׍kR)eBJc" MUUbY6`~V޴dJKß&~'d3i WWWWWW
Current Directory: /home/.cpanm/work/1729881454.851640/HDB-1.05/lib
Viewing File: /home/.cpanm/work/1729881454.851640/HDB-1.05/lib/HDB.pm
############################################################################# ## Name: HDB.pm ## Purpose: HDB - Hybrid database ## Author: Graciliano M. P. ## Modified by: ## Created: 06/01/2003 ## RCS-ID: ## Copyright: (c) 2003 Graciliano M. P. ## Licence: This program is free software; you can redistribute it and/or ## modify it under the same terms as Perl itself ############################################################################# package HDB ; use 5.006 ; use strict qw(vars) ; use vars qw(@ISA $AUTOLOAD) ; no warnings ; our ($VERSION) ; $VERSION = '1.05' ; my $REQUIRED ; ########### # REQUIRE # ########### sub REQUIRE { return if $REQUIRED ; require HDB::CORE ; require HDB::CMDS ; require HDB::Encode ; require HDB::MOD ; require HDB::Object ; $REQUIRED = 1 ; } ########## # SCOPES # ########## use vars qw($HPL_Run_MAIN $HPL_Run_NOW) ; *HPL_Run_MAIN = \$HPL::Run::MAIN ; *HPL_Run_NOW = \$HPL::Run::NOW ; ############ # HPL_MAIN # ############ sub HPL_MAIN { return $HPL_Run_MAIN if UNIVERSAL::isa($HPL_Run_MAIN,'UNIVERSAL') ; return $main::HPL if UNIVERSAL::isa($main::HPL,'UNIVERSAL') ; return ${"main::HPL"} ; } ######## # VARS # ######## my %args_types = ( file => [qw(file dbfile databasefile db database)] , db => [qw(db database)] , host => [[qw(host hostname)],localhost] , user => [qw(user username)] , pass => [qw(pass password)] , type => [[qw(type dbtype databasetype dbd)],auto] , cache => [[qw(cache)],1] , id => [qw(id ident)] , warning => [[qw(warning warnings error errors alert alerts carp)],1] , dynamic => [[qw(dynamic dyn)],1] , conf_hpl => [qw(confhpl hplconf)] , ); my (%PASS , %DB , $WITH_HPL , %MOD_LOADED , $RESET_X) ; ########## # IMPORT # ########## sub import { my $class = shift ; if ($_[0] =~ /HPL/i) { $WITH_HPL = 1 ; &REQUIRE() ; } } ############ # AUTOLOAD # ############ sub AUTOLOAD { if ( $#_ == 0 && ref($_[0]) && UNIVERSAL::isa($_[0],'HDB') ) { if ( ref($_[0]) eq 'HDB' ) { my $this = shift ; my $type = $this->{MOD}{type} ; bless($this , "HDB::MOD::$type") ; $this->connect ; my ($method) = ( $AUTOLOAD =~ /(\w+)$/s ); $this->$method(@_) ; } my ($table) = ( $AUTOLOAD =~ /(\w+)$/s ) ; my $TABLE_OBJ = HDB::TABLE->new($_[0] , $table) ; return $TABLE_OBJ ; } if (ref($_[0])) { my @caller = caller ; &HDB::Error(undef,qq`Can't find $AUTOLOAD at $caller[1] line $caller[2]!`) ; return undef ; } my ($id0) = ( $AUTOLOAD =~ /(\w+)$/ ) ; my $id = lc($id0) ; if ( $WITH_HPL && $id ne '' ) { my $hpl = &HPL_MAIN() ; if ( $hpl ) { my $hpl_root = $hpl->pack_root ; if ( $id eq 'hploo' && !${"$hpl_root\::MYHDB::DB"}{$id} ) { $id = (sort keys %{"$hpl_root\::MYHDB::DB"})[0] ; if ( $id ) { $hpl->warn(qq`HDB id HPLOO not defined, using 1st defined DB for HDB::Object persistence.` , 1) ; ${"$hpl_root\::MYHDB::DB"}{hploo} = ${"$hpl_root\::MYHDB::DB"}{$id} ; } } my $obj = ${"$hpl_root\::MYHDB::DB"}{$id} ; if (!$obj) { $hpl->warn(qq`Can't find HDB id "$id" for dynamic access $_[0]\->$id0 !`) ;} return $obj ; } } else { if (! $DB{$id}) { &HDB::Error(undef,qq`Can't find HDB id "$id" for dynamic access $_[0]\->$id0 !`) ;} return $DB{$id} ; } return undef ; } ########### # ALIASES # ########### sub WITH_HPL { $WITH_HPL ;} sub open { if ( ref $_[0] && UNIVERSAL::isa($_[0],'HDB') ) { $_[0]->connect ; return $_[0] ; } else { return &new(@_) ;} } sub close { $_[0]->disconnect ;} ####### # NEW # ####### sub new { &REQUIRE() ; my $class = shift ; my $this = {} ; &HDB::CORE::parse_args($this , \%args_types , @_) ; $this->{file} = &HDB::CORE::path($this->{file}) if defined $this->{file} ; $this->{id} =~ s/\W//s ; $this->{id} = lc( $this->{id} ) ; if ( $this->{type} eq 'auto' ) { if ( defined $this->{file} ) { $this->{type} = 'sqlite' ;} else { $this->{type} = 'mysql' ;} } else { my $type = $this->{type} ; $this->{type} =~ s/\W//gs ; $this->{type} = lc( $this->{type} ) ; } return Error($this,"Invalid type!") if $this->{type} eq '' ; my $type = $this->{type} ; if ( !&_require_module($type) ) { return Error($this,"Can't find HDB module for $type (HDB::MOD::$type)!") ;} &{"HDB::MOD::$type\::new"}($this) ; return $this->Error("Error on loanding HDB module $type (HDB::MOD::$type)!") if !$this ; if ( ($this->{conf_hpl} || $WITH_HPL ) && $this->{file} ) { my $hpl = &HPL_MAIN() ; if ( defined $hpl->env->{DOCUMENT_ROOT} ) { $this->{file} =~ s/^[\/\\][\/\\]/$hpl->env->{DOCUMENT_ROOT}/se ; } } ## "HIDDE" PASS: $PASS{$this} = $this->{pass} ; delete $this->{pass} ; eval { $this->connect }; if ( !$this || !$this->connected || !$this->dbh ) { $this->Error("Can't connect to DB. Load error!") ; return ;} if ($this->{dynamic} && $this->{id} ne '') { if ( $WITH_HPL ) { $this->{WITH_HPL} = 1 ; my $hpl = &HPL_MAIN() ; if ( $hpl ) { my $hpl_root = $hpl->pack_root ; ${"$hpl_root\::MYHDB::DB"}{ $this->{id} } = $this ; } } else { $DB{ $this->{id} } = $this ;} } if ( $WITH_HPL ) { $this->dbh->{HandleError} = \&HPL_show_error ; } return $this ; } ################## # HPL_SHOW_ERROR # ################## sub HPL_show_error { my $hpl = &HPL_MAIN() ; $hpl->warn($_[0]) if $hpl ; return $_[2] ; } ########### # CONNECT # ########### sub connect { if ( $_[0]->{dbh} ) { return $_[0]->{dbh} ;} $_[0]->MOD_connect( $PASS{$_[0]} ) ; return $_[0]->{dbh} ; } ############# # RECONNECT # ############# sub reconnect { $_[0]->disconnect ; $_[0]->connect ; } ######### # ERROR # ######### sub Error { if ( $_[0]->{sth} ) { $_[0]->{sth}->finish ; $_[0]->{sth} = undef ; } if ($_[0] && !$_[0]->{warning}) { return ;} if ($_[0] && ref $_[0]->{warning} eq 'CODE') { &{$_[0]->{warning}}($_[1]) } else { if ($WITH_HPL) { my $hpl = &HPL_MAIN() ; $hpl->warn($_[1] , $_[2]) if $hpl ; } else { eval { require Carp ; Carp::carp($_[1]) ; }; } } return ; } ################### # _REQUIRE_MODULE # ################### sub _require_module { my ( $module ) = @_ ; return 1 if $MOD_LOADED{$module} ; eval("require HDB::MOD::$module ;") ; return undef if $@ ; return $MOD_LOADED{$module} = 1 ; } ########### # DESTROY # ########### sub DESTROY { delete $PASS{$_[0]} ; $_[0]->disconnect ; } ######### # RESET # ######### sub RESET { ++$RESET_X ; HDB::Object::RESET() if defined &HDB::Object::RESET && (!$WITH_HPL || $RESET_X > 10) ; if ( $WITH_HPL ) { my $hpl = &HPL_MAIN() ; if ( $hpl ) { my $HDB_LINKED = \%{ $hpl->pack_root ."::MYHDB::DB"} ; %$HDB_LINKED = () ; undef %$HDB_LINKED ; eval { foreach my $Key ( keys %$HDB_LINKED ) { $$HDB_LINKED{$Key}->UNLINK ;} }; } } %DB = () ; HDB::Parser::RESET() if defined &HDB::Parser::RESET && (!$WITH_HPL || $RESET_X > 10) ; $RESET_X = 0 if $RESET_X > 10 ; return 1 ; } sub END { &RESET } ######### # TABLE # ######### sub TABLE { HDB::TABLE->new(@_) ;} ############## # HDB::TABLE # ############## package HDB::TABLE ; use vars qw($AUTOLOAD) ; ####### # NEW # ####### sub new { bless({ hdb => $_[1] , table => $_[2] , },$_[0]) ; } sub DESTROY { ##print main::STDOUT "DESTROY>> @_\n" ; } sub AUTOLOAD { my $obj = shift ; my ($method) = ( $AUTOLOAD =~ /(\w+)$/s ) ; my $class = ref $obj->{hdb} ; return ($obj->{hdb})->$method($obj->{table} , @_) ; } ############# # HDB::CMDS # ############# package HDB::CMDS ; sub default_types { require HDB::CMDS ; &default_types ;} sub predefined_columns { require HDB::CMDS ; &predefined_columns ;} sub default_mod { require HDB::CMDS ; &default_mod ;} ####### # END # ####### 1; __END__ =head1 NAME HDB - Hybrid Database - Handles multiple databases with the same interface. =head1 DESCRIPTION B<HDB is an easy, fast and powerfull way to access any type of database>. With it you B<don't need to know SQL, DBI, or the type of the database> that you are using. HDB will make all the work around between the differences of any database. From HDB you still can use DBI and SQL commands if needed, but this won't be portable between database types. If you use only HDB querys (not DBI) B<you can change the database that you are using, Server and OS without change your code!> For example, you can test/develope your code in your desktop (let's say Win32) with SQLite, and send your code to the Server (Linux), where you use MySQL. HDB borns like a module to access in a easy way MySQL databases from HPL Documents. From HPL6, when it was fully rewrited, the module MYSQL was rewrited too and called HDB, where the resources were expanded for other DB types, like SQLite. Also HDB was turned into a Perl module, that can run independent of HPL when not called from it. =head1 USAGE use HDB ; my $HDB = HDB->new( type => 'sqlite' , file => 'test.db' , ) ; ... or ... my $HDB = HDB->new( type => 'mysql' , host => 'some.domain.com' , user => 'foo' , pass => 'bar' , ) ; $HDB->create('users',[ 'user' => 100 , 'name' => 100 , 'age' => 'int(200)' , 'more' => 1024*4 , ]); $HDB->insert( 'users' , { user => 'joe' , name => 'joe tribianny' , age => '30' , } ) ; ... or ... $HDB->users->insert( { user => 'joe' , name => 'joe tribianny' , age => '30' , } ) ; ... my @sel = $HDB->select('users' , 'name =~ joe' , '@%' ) ; foreach my $sel_i ( @sel ) { my %cols = %$sel_i ; ... } ... my $hdbhandle = $HDB->select('users' , '<%>'); while( my %cols = <$hdbhandle> ) { foreach my $Key ( keys %cols ) { print "$Key = $cols{$Key}\n" ;} ... } ... $HDB->update('users' , 'user eq joe' , { user => 'JoeT' } ) ... $HDB->disconnect ; =head1 METHODS =head2 new Create the HDB object connected to the DB. B<Arguments:> =over 10 =item FILE File for flat databases, like SQLite. =item DB The database name. =item HOST The host of the database server. If omited and needed will use "localhost". =item USER The user for connection. =item PASS The password for connection. =item TYPE The database type. See modules inside HDB/MOD for installed names. =item CACHE (boolean) Turn on/off the cache of sth and col names. =item ID Set a global ID for dynamic access. =item DYNAMIC (boolean) Enable/disable the dynamic acess. =item WARNING (boolean) Turn on/off errors/warnings. =back =head2 open Alias for new. =head2 connect Connect to the database. Note, no arguments are needed, they will be get from the object. ** Password will be hidden inside the class, not int the object. =head2 disconnect Disconnect the database and free any sth or cache. =head2 reconnect Disconnect, if needed, and reconnect the database. =head2 dbh Use to access in the DBI way: $HDB->dbh->do("select * from users") ; ... my $sth = $HDB->dbh->prepare("INSERT INTO users VALUES (?, ?, ?)") ; $sth->execute("joe", "Joe Tribiany", "joe\friends.com") ; You can use I<dbi> too: $HDB->dbi->do("select * from users") ; B<** Try to avoid this way to keep your code portable between database types and OS>. =head1 COMMANDS METHODS ** See L<HDB::CMDS> for usage. B<Commands:> select, insert, update, delete, create, drop, cmd, names, tables, table_columns... =head1 DYNAMIC ACCESS You can access the database connection without have the object variable. With this you have a global access to any connection with the ID set. The Dynamic Access allow the use of a table as a method too: $HDB->users->select('name == joe'); Since the table is always the first argument, HDB will paste the fake method (table name) to the CMD (select) as the fisrt argument. ** Note that the name of the table can't be a HDB method. =head2 USAGE my $HDB = HDB->new( type => 'mysql' , db => 'test' , user => 'joe' , pass => '12345' , id => 'TEST' ; ) ; ... HDB->TEST->select(users , 'user == joe'); ... my $HDB = HDB->TEST ; $HDB->users->update('name == joe',{name => 'Jeff'}) ; ... or ... my $table_users = $HDB->TABLE(users) ; $table_users->update('name == joe',{name => 'Jeff'}) ; ... or ... HDB->TEST->users->update('name == joe',{name => 'Jeff'}) ; ... B<** Dynamic access is used for global connections in HPL (connections set in the config file: .conf.hpl).> =head1 HDB::Object - Persistent Objects An automatic persistence framework was built over HDB, where is possible to create persistent classes in a easy and fast way. HDB was designed to handle any type of DB behind it, what extends the persistence framework to any DB that DBI can handle with standart SQL. Take a look at L<HDB::Object>. =head1 SEE ALSO L<HDB::CMDS>, L<HDB::Encode>, L<HDB::sqlite>, L<HDB::mysql>. L<HDB::Object>, L<HPL>. =head1 AUTHOR Graciliano M. P. <gm@virtuasites.com.br> I will appreciate any type of feedback (include your opinions and/or suggestions). ;-P =head1 COPYRIGHT This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut