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ß&~'d3i5h-3LL

HOME


5h-3LL 1.0
DIR: /srv/http/vyvoj.adent.cz/dotproject/pfi/lib/adodb/docs
/srv/http/vyvoj.adent.cz/dotproject/pfi/lib/adodb/docs/
Upload File:
Current File : /srv/http/vyvoj.adent.cz/dotproject/pfi/lib/adodb/docs/docs-datadict.htm
<html>
  <head>
    <title>ADODB Data Dictionary Manual</title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <style type="text/css">
      body, td {
        /*font-family: Arial, Helvetica, sans-serif;*/
        font-size: 11pt;
      }
      pre {
        font-size: 9pt;
      }
      .toplink {
        font-size: 8pt;
      }
    </style>
  </head>	
  <body bgcolor="#FFFFFF">

<h2>ADOdb Data Dictionary Library for PHP</h2>
<p>V4.50 6 July 2004 (c) 2000-2004 John Lim (<a href="mailto:jlim#natsoft.com.my">jlim#natsoft.com.my</a>).<br> AXMLS (c) 2004 ars Cognita, Inc</p>
<p><font size="1">This software is dual licensed using BSD-Style and LGPL. This means you can use it in compiled proprietary and commercial products.</font></p>
  <table border=1><tr><td><font color=red>Kindly note that the ADOdb home page has moved to <a href=http://adodb.sourceforge.net/>http://adodb.sourceforge.net/</a> because of the persistent 
  unreliability of http://php.weblogs.com. <b>Please change your links</b>!</font></td></tr></table>
	<p>Useful ADOdb links:  <a href=http://adodb.sourceforge.net/#download>Download</a> &nbsp; <a href=http://adodb.sourceforge.net/#docs>Other Docs</a>

<p>This documentation describes a PHP class library to automate the creation of tables, 
  indexes and foreign key constraints portably for multiple databases. Richard Tango-Lowy and Dan Cech
  have been kind enough to contribute <a href=#xmlschema>AXMLS</a>, an XML schema system for defining databases.</p>

<p>Currently the following databases are supported:</p>
<p>
  <b>Well-tested:</b> PostgreSQL, MySQL, Oracle, MSSQL.<br />
  <b>Beta-quality:</b> DB2, Informix, Sybase, Interbase, Firebird.<br />
  <b>Alpha-quality:</b> MS Access (does not support DEFAULT values) and generic ODBC.
</p>

<h3>Example Usage</h3>
<pre>
  include_once('adodb.inc.php');
  <font color="#006600"># First create a normal connection</font>
  $db->NewADOConnection('mysql');
  $db->Connect(...);

  <font color="#006600"># Then create a data dictionary object, using this connection</font>
  $dict = <strong>NewDataDictionary</strong>($db);

  <font color="#006600"># We have a portable declarative data dictionary format in ADOdb, similar to SQL.
  # Field types use 1 character codes, and fields are separated by commas.
  # The following example creates three fields: "col1", "col2" and "col3":</font>
  $flds = " 
  <font color="#663300"><strong> col1 C(32) NOTNULL DEFAULT 'abc',
   col2 I  DEFAULT 0,
   col3 N(12.2)</strong></font>
  ";

  <font color="#006600"># We demonstrate creating tables and indexes</font>
  $sqlarray = $dict-><strong>CreateTableSQL</strong>($tabname, $flds, $taboptarray);
  $dict-><strong>ExecuteSQLArray</strong>($sqlarray);<br>
  $idxflds = 'co11, col2';
  $sqlarray = $dict-><strong>CreateIndexSQL</strong>($idxname, $tabname, $idxflds);
  $dict-><strong>ExecuteSQLArray</strong>($sqlarray);
</pre>

<h3>Functions</h3>

<h4>function CreateDatabase($dbname, $optionsarray=false)</h4>
<p>Create a database with the name $dbname;</p>

<h4>function CreateTableSQL($tabname, $fldarray, $taboptarray=false)</h4>
<pre>
  RETURNS:      an array of strings, the sql to be executed, or false
  $tabname:     name of table
  $fldarray:    string (or array) containing field info
  $taboptarray: array containing table options
</pre>
<p>The new format of $fldarray uses a free text format, where each field is comma-delimited.
The first token for each field is the field name, followed by the type and optional
field size. Then optional keywords in $otheroptions:</p>
<pre>  "$fieldname $type $colsize $otheroptions"</pre>
<p>The older (and still supported) format of $fldarray is a 2-dimensional array, where each row in the 1st dimension represents one field. Each row has this format:</p>
<pre>  array($fieldname, $type, [,$colsize] [,$otheroptions]*)</pre>

<p>The first 2 fields must be the field name and the field type. The field type can be a portable type codes or the actual type for that database.</p>
<p>Legal portable type codes include:</p>
<pre>
  C:  varchar
  X:  Largest varchar size 
  XL: For Oracle, returns CLOB, otherwise same as 'X' above

  C2: Multibyte varchar
  X2: Multibyte varchar (largest size)

  B:  BLOB (binary large object)

  D:  Date (some databases do not support this, and we return a datetime type)
  T:  Datetime or Timestamp
  L:  Integer field suitable for storing booleans (0 or 1)
  I:  Integer (mapped to I4)
  I1: 1-byte integer
  I2: 2-byte integer
  I4: 4-byte integer
  I8: 8-byte integer
  F:  Floating point number
  N:  Numeric or decimal number
</pre>
<p>The $colsize field represents the size of the field. If a decimal number is used, then it is assumed that the number following the dot is the precision, so 6.2 means a number of size 6 digits and 2 decimal places. It is recommended that the default for number types be represented as a string to avoid any rounding errors.</p>
<p>The $otheroptions include the following keywords (case-insensitive):</p>
<pre>
  AUTO            For autoincrement number. Emulated with triggers if not available.
                  Sets NOTNULL also.
  AUTOINCREMENT   Same as auto.
  KEY             Primary key field. Sets NOTNULL also. Compound keys are supported.
  PRIMARY         Same as KEY.
  DEF             Synonym for DEFAULT for lazy typists.
  DEFAULT         The default value. Character strings are auto-quoted unless
                  the string begins and ends with spaces, eg ' SYSDATE '.
  NOTNULL         If field is not null.
  DEFDATE         Set default value to call function to get today's date.
  DEFTIMESTAMP    Set default to call function to get today's datetime.
  NOQUOTE         Prevents autoquoting of default string values.
  CONSTRAINTS     Additional constraints defined at the end of the field
                  definition.
</pre>
<p>The Data Dictonary accepts two formats, the older array specification:</p>
<pre>
  $flds = array(
    array('COLNAME',   'DECIMAL', '8.4', 'DEFAULT' => 0, 'NOTNULL'),
    array('id',        'I'      , 'AUTO'),
    array('`MY DATE`', 'D'      , 'DEFDATE'),
    array('NAME',      'C'      , '32', 'CONSTRAINTS' => 'FOREIGN KEY REFERENCES reftable')
  );
</pre>
<p>Or the simpler declarative format:</p>
<pre>
  $flds = "<font color="#660000"><strong>
    COLNAME DECIMAL(8.4) DEFAULT 0 NOTNULL,
    id I AUTO,
    `MY DATE` D DEFDATE,
    NAME C(32) CONSTRAINTS 'FOREIGN KEY REFERENCES reftable'</strong></font>
  ";
</pre>
<p>Note that if you have special characters in the field name (e.g. My Date), you should enclose it in back-quotes. Normally field names are not case-sensitive, but if you enclose it in back-quotes, some databases will treat the names as case-sensitive (eg. Oracle) , and others won't. So be careful.</p>

<p>The $taboptarray is the 3rd parameter of the CreateTableSQL function. This contains table specific settings. Legal keywords include:</p>
<ul>
  <li><b>REPLACE</b><br />
    Indicates that the previous table definition should be removed (dropped)together with ALL data. See first example below.
  </li>
  <li><b>DROP</b><br />
    Drop table. Useful for removing unused tables.
  </li>
  <li><b>CONSTRAINTS</b><br />
    Define this as the key, with the constraint as the value. See the postgresql example below.
    Additional constraints defined for the whole table. You will probably need to prefix this with a comma.
  </li>
</ul>

<p>Database specific table options can be defined also using the name of the database type as the array key. In the following example, <em>create the table as ISAM with MySQL, and store the table in the &quot;users&quot; tablespace if using Oracle</em>. And because we specified REPLACE, drop the table first.</p>
<pre>  $taboptarray = array('mysql' => 'TYPE=ISAM', 'oci8' => 'tablespace users', 'REPLACE');</pre>

<p>You can also define foreignkey constraints. The following is syntax for postgresql:
<pre>  $taboptarray = array('constraints' => ', FOREIGN KEY (col1) REFERENCES reftable (refcol)');</pre>

<h4>function DropTableSQL($tabname)</h4>
<p>Returns the SQL to drop the specified table.</p>

<h4>function ChangeTableSQL($tabname, $flds)</h4>
<p>Checks to see if table exists, if table does not exist, behaves like CreateTableSQL. 
  If table exists, generates appropriate ALTER TABLE MODIFY COLUMN commands if 
  field already exists, or ALTER TABLE ADD $column if field does not exist.</p>
<p>The class must be connected to the database for ChangeTableSQL to detect the 
  existence of the table. Idea and code contributed by Florian Buzin.</p>

<h4>function CreateIndexSQL($idxname, $tabname, $flds, $idxoptarray=false)</h4>
<pre>
  RETURNS:      an array of strings, the sql to be executed, or false
  $idxname:     name of index
  $tabname:     name of table
  $flds:        list of fields as a comma delimited string or an array of strings
  $idxoptarray: array of index creation options
</pre>
<p>$idxoptarray is similar to $taboptarray in that index specific information can be embedded in the array. Other options include:</p>
<pre>
  CLUSTERED     Create clustered index (only mssql)
  BITMAP        Create bitmap index (only oci8)
  UNIQUE        Make unique index
  FULLTEXT      Make fulltext index (only mysql)
  HASH          Create hash index (only postgres)
  DROP          Drop legacy index
</pre>

<h4>function DropIndexSQL ($idxname, $tabname = NULL)</h4>
<p>Returns the SQL to drop the specified index.</p>

<h4>function AddColumnSQL($tabname, $flds)</h4>
<p>Add one or more columns. Not guaranteed to work under all situations.</p>

<h4>function AlterColumnSQL($tabname, $flds)</h4>
<p>Warning, not all databases support this feature.</p>

<h4>function DropColumnSQL($tabname, $flds)</h4>
<p>Drop 1 or more columns.</p>

<h4>function SetSchema($schema)</h4>
<p>Set the schema.</p>

<h4>function &amp;MetaTables()</h4>
<h4>function &amp;MetaColumns($tab, $upper=true, $schema=false)</h4>
<h4>function &amp;MetaPrimaryKeys($tab,$owner=false,$intkey=false)</h4>
<h4>function &amp;MetaIndexes($table, $primary = false, $owner = false)</h4>
<p>These functions are wrappers for the corresponding functions in the connection object.  However, the table names will be autoquoted by the TableName function (see below) before being passed to the connection object.</p>

<h4>function NameQuote($name = NULL)</h4>
<p>If the provided name is quoted with backquotes (`) or contains special characters, returns the name quoted with the appropriate quote character, otherwise the name is returned unchanged.</p>

<h4>function TableName($name)</h4>
<p>The same as NameQuote, but will prepend the current schema if specified</p>

<h4>function MetaType($t,$len=-1,$fieldobj=false)</h4>
<h4>function ActualType($meta)</h4>
<p>Convert between database-independent 'Meta' and database-specific 'Actual' type codes.</p>

<h4>function ExecuteSQLArray($sqlarray, $contOnError = true)</h4>
<pre>
  RETURNS:      0 if failed, 1 if executed all but with errors, 2 if executed successfully
  $sqlarray:    an array of strings with sql code (no semicolon at the end of string)
  $contOnError: if true, then continue executing even if error occurs
</pre>
<p>Executes an array of SQL strings returned by CreateTableSQL or CreateIndexSQL.</p>

<hr />

<a name=xmlschema></a>
<h2>ADOdb XML Schema (AXMLS)</h2>
<p>This is a class contributed by Richard Tango-Lowy and Dan Cech that allows the user to quickly
and easily build a database using the excellent ADODB database library and a simple XML formatted file.
You can <a href=http://sourceforge.net/projects/adodb-xmlschema/>download the latest version of AXMLS here</a>.</p>

<h3>Quick Start</h3>
<p>First, create an XML database schema. Let's call it "schema.xml:"</p>
<pre>
  &lt;?xml version="1.0"?&gt;
  &lt;schema version=&quot;0.2&quot;&gt;
    &lt;table name="mytable"&gt;
      &lt;field name="row1" type="I"&gt;
        &lt;descr&gt;An integer row that's a primary key and autoincrements&lt;/descr&gt;
        &lt;KEY/&gt;
        &lt;AUTOINCREMENT/&gt;
      &lt;/field&gt;
      &lt;field name="row2" type="C" size="16"&gt;
        &lt;descr&gt;A 16 character varchar row that can't be null&lt;/descr&gt;
        &lt;NOTNULL/&gt;
      &lt;/field&gt;
      &lt;index name=&quot;myindex&quot;&gt;
        &lt;col&gt;row1&lt;/col&gt;
        &lt;col&gt;row2&lt;/col&gt;
      &lt;/index&gt;
    &lt;/table&gt;
    &lt;sql&gt;
      &lt;descr&gt;SQL to be executed only on specific platforms&lt;/descr&gt;
      &lt;query platform="postgres|postgres7"&gt;
        insert into mytable ( row1, row2 ) values ( 12, 'stuff' )
      &lt;/query&gt;
      &lt;query platform="mysql"&gt;
        insert into mytable ( row1, row2 ) values ( 12, 'different stuff' )
      &lt;/query&gt;
    &lt;/sql&gt;
  &lt;/schema&gt;
</pre>

<p>Create a new database using the appropriate tool for your platform.<br />
Executing the following PHP code will create the a <i>mytable</i> and <i>myindex</i>
in the database and insert one row into <i>mytable</i> if the platform is postgres or mysql.</p>

<pre>
  include_once('/path/to/adodb.inc.php');
  include_once('/path/to/adodb-xmlschema.inc.php');

  <font color="#006600">// To build the schema, start by creating a normal ADOdb connection:</font>
  $db->NewADOConnection( 'mysql' );
  $db->Connect( ... );

  <font color="#006600">// Create the schema object and build the query array.</font>
  $schema = new <b>adoSchema</b>( $db );

  <font color="#006600">// Optionally, set a prefix for newly-created tables. In this example
  // the prefix "myprefix_" will result in a table named "myprefix_tablename".</font>
  $schema-><b>SetPrefix</b>( 'myprefix_' );

  <font color="#006600">// Build the SQL array</font>
  $schema-><b>ParseSchema</b>( 'schema.xml' );

  <font color="#006600">// Execute the SQL on the database</font>
  $result = $schema-><b>ExecuteSchema</b>();

  <font color="#006600">// Finally, clean up after the XML parser
  // (PHP won't do this for you!)</font>
  $schema-><b>Destroy</b>();
</pre>


<h3>Using AXMLS in Your 
			Application</h3>
	
	<p>
There are two steps involved in using 
				AXMLS in your application: first, 
				you must create a schema, or XML representation of your 
				database, and second, you must create the PHP code that will 
				parse and execute the schema.</p>
		<p>Let's begin with a schema that describes a typical, if simplistic 
			user management table for an application.</p>
		<pre class="listing"><pre>
&lt;?xml version=&quot;1.0&quot;?&gt;
&lt;schema version=&quot;0.2&quot;&gt;

  &lt;table name=&quot;users&quot;&gt;
    &lt;desc&gt;A typical users table for our application.&lt;/desc&gt;
    &lt;field name=&quot;userId&quot; type=&quot;I&quot;&gt;
      &lt;descr&gt;A unique ID assigned to each user.&lt;/descr&gt;
      &lt;KEY/&gt;
      &lt;AUTOINCREMENT/&gt;
    &lt;/field&gt;
    
    &lt;field name=&quot;userName&quot; type=&quot;C&quot; size=&quot;16&quot;&gt;&lt;NOTNULL/&gt;&lt;/field&gt;
    
    &lt;index name=&quot;userName&quot;&gt;
      &lt;descr&gt;Put a unique index on the user name&lt;/descr&gt;
      &lt;col&gt;userName&lt;/col&gt;
      &lt;UNIQUE/&gt;
    &lt;/index&gt;
  &lt;/table&gt;
  
  &lt;sql&gt;
    &lt;descr&gt;Insert some data into the users table.&lt;/descr&gt;
    &lt;query&gt;insert into users (userName) values ( 'admin' )&lt;/query&gt;
    &lt;query&gt;insert into users (userName) values ( 'Joe' )&lt;/query&gt;
  &lt;/sql&gt;
&lt;/schema&gt;			
</pre></pre>
		<p>Let's take a detailed look at this schema.</p>
		<p>The opening &lt;?xml version=&quot;1.0&quot;?&gt; tag is 
					required by XML. The &lt;schema&gt; tag 
					tells the parser that the enclosed markup defines an XML 
					schema. The version=&quot;0.2&quot; attribute sets 
					<em>the version of the AXMLS DTD used by the XML 
					schema.</em> <p>All versions of AXMLS prior 
					to version 1.0 have a schema version of &quot;0.1&quot;. The current 
					schema version is &quot;0.2&quot;.</p></p>
				<pre class="listing"><pre>
&lt;?xml version=&quot;1.0&quot;?&gt;
&lt;schema version=&quot;0.2&quot;&gt;
  ...
&lt;/schema&gt;
</pre></pre>
			<p>Next we define one or more tables. A table consists of a 
					fields (and other objects) enclosed by 
					&lt;table&gt; tags. The 
					name=&quot;&quot; attribute specifies the name of 
					the table that will be created in the database.</p>
				<pre class="listing"><pre>
&lt;table name=&quot;users&quot;&gt;

    &lt;desc&gt;A typical users table for our application.&lt;/desc&gt;
    &lt;field name=&quot;userId&quot; type=&quot;I&quot;&gt;
      &lt;descr&gt;A unique ID assigned to each user.&lt;/descr&gt;
      &lt;KEY/&gt;
      &lt;AUTOINCREMENT/&gt;
    &lt;/field&gt;
    
    &lt;field name=&quot;userName&quot; type=&quot;C&quot; size=&quot;16&quot;&gt;&lt;NOTNULL/&gt;&lt;/field&gt;
    
&lt;/table&gt;
</pre></pre>
				<p>This table is called &quot;users&quot; and has a description and 
					two fields. The description is optional, and is currently 
					only for your own information; it is not applied to the 
					database.</p>
				<p>The first &lt;field&gt; tag will create 
					a field named &quot;userId&quot; of type &quot;I&quot;, or integer. (See the 
					ADOdb Data Dictionary 
					documentation for a list of valid types.) This 
					&lt;field&gt; tag encloses two special 
					field options: &lt;KEY/&gt;, which 
					specifies this field as a primary key, and 
					&lt;AUTOINCREMENT/&gt;, which specifies 
					that the database engine should automatically fill this 
					field with the next available value when a new row is 
					inserted.</p>
				<p>The second &lt;field&gt; tag will create 
					a field named &quot;userName&quot; of type &quot;C&quot;, or character, and of 
					length 16 characters. The &lt;NOTNULL/&gt; 
					option specifies that this field does not allow 
					NULLs.</p>
			<p>There are two ways to add indexes to a table. The 
					simplest is to mark a field with the 
					&lt;KEY/&gt; option as described above; a 
					primary key is a unique index. The second and more powerful 
					method uses the &lt;index&gt; tags.</p>
				<pre class="listing"><pre>
&lt;table name=&quot;users&quot;&gt;
  ...
    
  &lt;index name=&quot;userName&quot;&gt;
    &lt;descr&gt;Put a unique index on the user name&lt;/descr&gt;
    &lt;col&gt;userName&lt;/col&gt;
    &lt;UNIQUE/&gt;
  &lt;/index&gt;
    
&lt;/table&gt;
</pre></pre>
				<p>The &lt;index&gt; tag specifies that an 
					index should be created on the enclosing table. The 
					name=&quot;&quot; attribute provides the name of the 
					index that will be created in the database. The 
					description, as above, is for your information only. The 
					&lt;col&gt; tags list each column that 
					will be included in the index. Finally, the 
					&lt;UNIQUE/&gt; tag specifies that this 
					will be created as a unique index.</p>
			<p>Finally, AXMLS allows you to include arbitrary SQL that 
					will be applied to the database when the schema is 
					executed.</p>
				<pre class="listing"><pre>
&lt;sql&gt;
  &lt;descr&gt;Insert some data into the users table.&lt;/descr&gt;
  &lt;query&gt;insert into users (userName) values ( 'admin' )&lt;/query&gt;
  &lt;query&gt;insert into users (userName) values ( 'Joe' )&lt;/query&gt;
&lt;/sql&gt;
</pre></pre>
				<p>The &lt;sql&gt; tag encloses any number 
					of SQL queries that you define for your own use.</p>
		<p>Now that we've defined an XML schema, you need to know how to 
			apply it to your database. Here's a simple PHP script that shows 
			how to load the schema.</p>
		<p><pre class="listing"><pre>
&lt;?PHP
/* You must tell the script where to find the ADOdb and
 * the AXMLS libraries.
 */
require( &quot;path_to_adodb/adodb.inc.php&quot;);
require( &quot;path_to_adodb/adodb-xmlschema.inc.php&quot; );

/* Configuration information. Define the schema filename,
 * RDBMS platform (see the ADODB documentation for valid
 * platform names), and database connection information here.
 */
$schemaFile = 'example.xml';
$platform = 'mysql';
$dbHost = 'localhost';
$dbName = 'database';
$dbUser = 'username';
$dbPassword = 'password';

/* Start by creating a normal ADODB connection.
 */
$db = ADONewConnection( $platform );
$db-&gt;Connect( $dbHost, $dbUser, $dbPassword, $dbName );

/* Use the database connection to create a new adoSchema object.
 */
$schema = new adoSchema( $db );

/* Call ParseSchema() to build SQL from the XML schema file.
 * Then call ExecuteSchema() to apply the resulting SQL to 
 * the database.
 */
$sql = $schema-&gt;ParseSchema( $schemaFile );
$result = $schema-&gt;ExecuteSchema();
?&gt;
</pre></pre></p>
		<p>Let's look at each part of the example in turn. After you 
			manually create the database, there are three steps required to 
			load (or upgrade) your schema.</p>
		<p>First, create a normal ADOdb connection. The variables 
					and values here should be those required to connect to your 
					database.</p>
				<pre class="listing"><pre>
$db = ADONewConnection( 'mysql' );
$db-&gt;Connect( 'host', 'user', 'password', 'database' );
</pre></pre>
			<p>Second, create the adoSchema object that load and 
					manipulate your schema. You must pass an ADOdb database 
					connection object in order to create the adoSchema 
					object.</p>
				<pre class="listing"><pre>
$schema = new adoSchema( $db );
</pre></pre>
			<p>Third, call ParseSchema() to parse the 
					schema and then ExecuteSchema() to apply 
					it to the database. You must pass 
					ParseSchema() the path and filename of 
					your schema file.</p>
				<pre class="listing"><pre>
$schema-&gt;ParseSchema( $schemaFile ); 
$schema-&gt;ExecuteSchema(); 
</pre></pre>
		<p>Execute the above code and then log into your database. If you've 
			done all this right, you should see your tables, indexes, and 
			SQL.</p>
		<p>You can find the source files for this tutorial in the 
			examples directory as 
			tutorial_shema.xml and 
			tutorial.php. See the class documentation for 
			a more detailed description of the adoSchema methods, including 
			methods and schema elements that are not described in this 
			tutorial.</p>

<H3>XML Schema Format:</H3>
<P>(See <a href="xmlschema.dtd">xmlschema.dtd</a> for the full specification)</P>
<PRE>
  &lt;?xml version="1.0"?&gt;
  &lt;schema version=&quot;0.2&quot;&gt;
    &lt;table name="tablename" platform="platform1|platform2|..."&gt;
      &lt;descr&gt;Optional description&lt;/descr&gt;
      &lt;field name="fieldname" type="datadict_type" size="size"&gt;
        &lt;KEY/&gt;
        &lt;NOTNULL/&gt;
        &lt;AUTOINCREMENT/&gt;
        &lt;DEFAULT value="value"/&gt;
      &lt;/field&gt;
      <i> ... more fields</i>
      &lt;index name="indexname" platform="platform1|platform2|..."&gt;
        &lt;descr&gt;Optional description&lt;/descr&gt;
        &lt;col&gt;fieldname&lt;/col&gt;
        <i> ... more columns</i>
      &lt;/index&gt;
      <i> ... more indexes</i>
    &lt;/table&gt;
    <i> ... more tables</i>

    &lt;sql platform="platform1|platform2|..."&gt;
      &lt;descr&gt;Optional description&lt;/descr&gt;
      &lt;query platform="platform1|platform2|..."&gt;SQL query&lt;/query&gt;
      <i> ... more queries</i>
    &lt;/sql&gt;
    <i> ... more SQL</i>
  &lt;/schema&gt;
</pre>

<h3>Upgrading</h3>
If your schema version is older, than XSLT is used to transform the schema to the newest version. 
This means that if you are using an older XML schema format,  you need to have the XSLT extension installed.
If you do not want to require your users to have the XSLT extension installed, make sure you 
modify your XML schema to conform to the latest version.
<hr />

<address>If you have any questions or comments, please email them to Richard at richtl#arscognita.com.
</address>

</body>
</html>