xapool-1.5.0-src/0000755000175000017500000000000010235647075013553 5ustar twernertwernerxapool-1.5.0-src/archive/0000755000175000017500000000000010235646675015201 5ustar twernertwernerxapool-1.5.0-src/archive/xapool.mf0000644000175000017500000000035110235646675017026 0ustar twernertwernerManifest-Version: 1.0 Implementation-Title: "XAPool" Implementation-Version: "1.5.0" Implementation-Vendor: "Experlog (xapool.experlog.com)" Class-Path: idb.jar classes12.jar jta-spec1_0_1.jar log4j.jar commons-logging.jar p6psy.jar xapool-1.5.0-src/archive/xapool_jar.xml0000644000175000017500000000106210235646675020060 0ustar twernertwerner xapool-1.5.0-src/.classpath0000644000175000017500000000217310235646675015546 0ustar twernertwerner xapool-1.5.0-src/.cvsignore0000644000175000017500000000000710235646675015555 0ustar twernertwerneroutput xapool-1.5.0-src/.project0000644000175000017500000000055510235646675015234 0ustar twernertwerner xapool org.eclipse.jdt.core.javabuilder org.eclipse.jdt.core.javanature xapool-1.5.0-src/README.txt0000644000175000017500000001272110235646675015261 0ustar twernertwerner2005/02/11 - xavier.spengler@experlog.com XAPool: XAPool is Another Pool Description: ------------ XAPool is a project which allows to use a pool, connection pooling, and XA connection pooling. A generic pool is used to store various of objects (see org.enhydra.jdbc.pool.GenericPool). Pools of JDBC connections, and XA connections are presents in org.enhydra.jdbc.pool.StandardPoolDataSource and StandardXAPoolDataSource. Package contents: ----------------- src: source files (java files) under org.enhydra.jdbc doc: the documentation of the project archive: files to build xapool archive externals: jar files need to compile source files ext: external and useful files examples: examples to test and show functionalities 1.5.0: ----- - #303280: XAPool does not cooperate with transaction manager when testing connections: this bug is fixed - #303239: IllegalMonitorStateException in PoolKeeper: this bug is fixed - #303191 (and #303192): unable to excute new connection after expiration: this bug is fixed - #303302 StandardXADataSource.toString() fails with NullPointerException: this bug is fixed - #300994: NullPointerException occurred when multi-thread access: this bug is fixed - added jdbc 1.4 methods for Statement, PreparedStatement and CallableStatement objects - added methods and fixed bugs about Statement and PreparedStatement objects which were not included into transactions - added the last version of JOTM (2.0.8), new version of Carol, commons-logging, jotm_jrmp_stubs. And added connector-1_5.jar and howl.jar 1.4.2: ------ - bug fix, contribution by Miro. Bug found with SAPdb in his test suite. 1.4.1: ------ - bug fix for poolkeeper in while loop - important submission from Tuomas Kantonen about synchronisation problem into the pool - Hanging tomcat problem, poolkeeper object was not properly created - added methods in CoreStatement for jdk 1.4 - bug found by Miro about TM which was not yet initialized (worked into 1.3.2), this bug has been fixed 1.3.3: ------ - changed license from EPL to LGPL 1.3.2: ------ - remove printStackTrace call in GenericPool class - remove .error(...) calls, and replaced them by .debug(...) - save autocommit status for CallableStatement object now - restored autocommit after transaction (maybe a regression) - restored autocommit for createStatement (never done) - propagated the log object inside StandardConnectionPoolDataSource - removed e.printStackTrace, and only use error level, with +e inside the message. - added toString() method on several objects, to dump internal states of XAPool's objects - added log.debug message into close() method (StandardXAConnectionHandle) - change the status of isReallyUsed in the close() method (StandardXAConnectionHandle) - set up the autocommit flag in the close() method when autocommit is false, and tx=null, just after the rollback call to the connection (StandardXAConnectionHandle) - added a comment into CoreConnection object (setAutoCommit) - removed unused code in StandardXAPreparedStatement and StandardXAStatement, preInvoke methods are no longer used. - added toString methods on many objects to print out internal objects 1.3.1: ------ - added logging information - changed Andy last name (sorry) - made a lot of changes in jotmxapooltest by Andy - added example HSQL config - added sapdb example in spy.properties - prepareStatement(String, int, int) was not getting associated with the transaction - get the last version of jotm (1.4.3) 1.3: ---- - added comments in GenericPool - added a lot of method comments - fixed a bug with multithreaded process (was a regression) - removed a wrong test, which made a bug, in XAConnection - added 2 tests, a multithreaded test and a contribution from A. Zeneski - added the last version of JOTM (1.4.3), and carol - removed TraceTm uses with JOTM - changed the XAPool way of log (log4j.properties) 1.2.2: ------ - removed the limit for used objects inside the same transaction (limit was 100) - fixed a bug in the XADataSource object, to check if the current connection is not already in the freeConnection Vector (bug #319) - fixed a bug when the pool size decreased and connection lifetime is reached. This bug appears when the pool activity is not important, and the number of used connections is lesser than the max size of the pool. - switch to off the boolean status of the pool 1.2.1: ------ - added a console appender to the log4j configuration file, to log with the complete name (org.enhydra.jdbc.xapool) - fixed a bug when using multiple connection inside the same transaction - changed the logger name xapool, and now use the complete name org.enhydra.jdbc.xapool 1.2: ---- - bug fixes in JNDI mechanism - added logs with commons-logging - added several examples 1.1: ---- This version includes major changes, and correct a lot of bugs. Main changes are: - AutoCommit value is now saved before the begin of the transaction and restored to the commit or rollback of the transaction - when no transaction is defined, and the AutoCommit flag sets to false, when the user calls close() on the connection, the connection is rollbacked - fixed bug when the connection is opened before the begin of the transaction and close after the commit or rollback (connection enrolled a posteriori) - fixed bugs in the cache prepared statement mechanism - added commons logging to log inside XAPool - added 5 more examples (tests) to demonstrate the XAPool functionalities To do list: ----------- - validate with 2.0 JDBC driver - validate CallableStatement xapool-1.5.0-src/build.properties0000644000175000017500000000112510235646675016774 0ustar twernertwerner##################################################################### # This file is used to configure ant # @author: Xavier Spengler - ExperLOG xavier.spengler@experlog.com # @contributor: Guillaume Riviere ##################################################################### ####################### # compiler properties # ####################### # Wich compiler do you want use ? build.compiler modern # Compiler deprecation mode compiler.deprecation on # Compiler debug mode compiler.debug on # Compiler nowarn mode compiler.nowarn on # Compiler optimization mode compiler.optimize off xapool-1.5.0-src/build.xml0000644000175000017500000002152410235646675015405 0ustar twernertwerner This build file is used to compile and build XAPool. XAPool Developer Documentation]]> xapool-1.5.0-src/doc/0000755000175000017500000000000010235646675014325 5ustar twernertwernerxapool-1.5.0-src/doc/online/0000755000175000017500000000000010235646675015611 5ustar twernertwernerxapool-1.5.0-src/doc/online/1.2.2/0000755000175000017500000000000010235646675016251 5ustar twernertwernerxapool-1.5.0-src/doc/online/1.2.2/img0.jpg0000644000175000017500000004701510235646675017616 0ustar twernertwernerJFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( 3EQEQT5MbIL4mp$d($q^!a{F=0if#o̯նhy1XXuik'[ң*C(1eoma&TC1#A]!ԭ'p* ѳV@H@r :Lғ埻.;֫ޢxn⸷9$l]H #ԕfQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEƶA y{D!%T33s+vYq cnym[Dk.jsٻEB9GGEG)#bvkC0xZ8rMoC^u),.Z ;y7@vi;m.yfhUA@ 1Wޣw5N-? LҰcA]I9n~_fKԡԥ{TWM cS|dO5R'p Zj_Q֞ Э"xOHaj#h-(QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ\eKN-'šZu̗39zᑞ9e쁞7 8 {TQEKTn캕W1rWxnFꭂpApZ=RE][1hI>P!'}MzUz1$gحiV"X$h 8O՚*Gh̨!re>4((((((((((((((((((((((((((+ȼ 'CBes_\KZ4 xzu}jz[]Ѥ#ʣր:oGy -n102=d08 χZ׊|@z72h6]vVRb kt qd҆ܪEu<rc$ DaYwNgךiյ_i5*jWa6 wRxZ B.ZQ$2A+\uL hi~" _an -yhP]b%GAk:;jz40i삹<#9Zvм$tkm[?~}ӚKk-. =:=:" WJ$ְ=^MkE4<($# ȸY+{N[u9m&39JM35ݬ>Lfg9 6H;y_]覬熮1i˪^,C6Ӵ*A' C%ȼ#[L3 dq@u w뵶+Gm1ް5q P%٤כ/+m\m*=G<+_Ht/x҉(CuOixf}l64YAE;@ۆ go"!4 #[SԱ78HbN:m稯@2ģ'ui}y7F[u=9=#W>7hJkO-mN ?ռ[8e%wQ8OC^oH[&ڇm?2$nDlxDSv}%}gZyo_Nsx<@ex-ș߱Y[;ϴlˆ^GCUG_L_aRK40ʾ9!;mc[ӭ q+?mm|;Jx:3x_hNGYp??c@NJ&3DGZ?sg8' qҷ(/m/֋s]n673P?h(zѲQ\^GÚg-p<KA4PJ̠屖b}X((((((((((((((((((Ğ |]r{X~4q3؎wFgtP\\:sM"}\,x,GOA^>Dpʲ09&AyEG<+so,d "cᔂGj߂C92ZM$de;q]on>ؿD7>oiu527TӮOS]Egd0F#E$G$Պ(~+\.5=OH+ep` m #@dXIRQ@ H##F8e ڸ>$gQ2d? ( ϧ}`؈{4„;aqz u _xIô-Fk00?(AEr$w_j1WBcHFαI|<{'n?zN *FGKhΟ[y>u1۰᷎s M'p p9O(I|<{'n?hh |b [IѾ}._Lw)S9G" ((((((((((((((((((((((((((((((((((((((((((((((((((((yyeHd ,Q 72zr@"$E^6‘I+p$,\، C0xmH? ni֊b8H#rT*g9`Ea(kiw^ B+1UF"ƛ 놴oZHՀ$re$R+?\-?iDp 寘UxE5::V I!l@]J (mt-+XcOmG Mu#%[ _ʥ3pOyhv:LqZxc 3!"m&0(Ks#]GqDEsHmyPk+qj6N.űk"n[ GDFD׸Q@Eڞ/ >A+ѵX+bG yO }+A5=xF c1 P<3dYp1T87J϶Q@gGK}&iwmVYّشeVSРSBJNլI>ugCfm\dX+8}Nv-|G~KH͈ԙZtdd4%d*Ne>ǽ?;?ǗOg?ٱf9k(?7doE]3K}/$3WICŶ< w|uѵuH֍ȳyV=y  sZP=6=J+v]R}4 #ssq9~_gL>n=[[M$Ue)d$}אG5g~\)bĒIff9,ĒKI$I4b(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((xaxRYcGDmj RW' &<&mx59"K%dx. RU(3Xִ:7f];rEy #i: sBA'npDzD:]g ԭg!wPx*c0ݷ((Q[ic3eU 1{n}odLȯu[, Zu C{OʼHaB16@q!`9i%ۆ*9fZ!/ʁ #`A"34MR/ '{ˈضLfO>Y!2sP8ث>Nij}{d#$Eҟ9=d(+DqjZ= /W d!k*H 30QEqvK$S{0a1)rp1 ¦NS,7k0l-mľVŰͽ6eJVnn]bK^x%TY$VrA((((((((((((((((((wi[]YvEVEkkK`ays'i tWpsdMk{~A50UW@T||_]:}bMGB5[kY2#2RwFW7c ^k6B-B_lHʙUT6JJ'py;OH V 2Q0pf2>yd|hr TYw2FJ>`xfuHYC"Zl 4B #)hmK(!y|>LFBm|8; n\x/Dgi{>JwLq$q"q.$C32QaZ^:ŋ. <`I  i4 K( ﱔQlš1%P G@4 D^AߙepnN]*|2gϻ +IԥdX쒗" ン~5w-wGjV9HơJ"\w ,K=I!!9nM?\ZIߺ^%ڶ &"S&.F _M6.czMXqx"xg :\ʴʤHu^-[K^o#QoH 1hh /Zh',x;(F.5A}# AmjI\giR4o^$o5@3 Wُ- ݮ;k:֤,b+W0 \ r2eUu{L y QgsE#͖U|Nz%<Ծ?lKW+d1 ی.qON_6Vwa<ҖY"%Tc gB ʩ-V o㰶msHm,DIpu~e_ZkDK$ c!Y^(*1\zĶv22!تF]n[; 5gĖiZƥk5 BVU tXÇl.r`ɿGMn^b &\+ 3n|?.е-Kò["Y7i,ht L(`GT"Ցrs#ȯw/{[!y {!RDD @q!( uV?'4i!yu]JRX =TY,%eK*\ےy` 5kPmN+ABЖKiѳ7vmNt-&{o3I?+";pB$05-.uHTm${(::T:fK2ZJTfe;FvvW:ƯԮ>KmgC+9Mw0U-@riiz_$Sծ .,* decroxvm:hbI'eVU.6Tc|]mw%ݽ0q8 H HI('5O"{4ttf|WISgNO<at=RYWK-gd1,_a<ݗ/exN$]5w1]vm9{cA`4-'g RG,sA(#V1̌4M. )i,: &Sӭl屵Zisj2qyE C+l}O<6\K0DF dOk-/[ͶYpDvbGPyD @&q}g-WPe!̥yRr*$X9e_ZRo[$S$OI#eɱ ctvRZY?&IDc@g|'8+?>3&:֞r,vI$#kly<A85k\k٭4q,gqP` [?¾,).K>F<U8G&U!(fwn4xmou;WWw.4|I8f 0O|Cj 32!x$f@@/2*r22 WE+qr\5̶|˸IK`#1$F -<5 6ė677V8x [[M:UIH؝A̘ HT@jw2_oO\`)4WK}JVxndwXhdw`XFz5[-a.c|n$DWvFy;76yḵGK}Z$vv:}ΟgY adfpL9w'N WMPKWOKjJMq!QVbK׮ItZC#Ao鶖d=v9dU1`F}8`}GvHvݵ໷2^\,{TH*xú^qiW g] o vmeUԪ 7ךv.o؞#hCK%i[:!\H"ϊlE, nlRD])#@q&8+jtm6Kk#w $b Y;r66PnbƐaoЪ EnqF6QCn-|Qk{H ZO7RΑ`X)њh<7`Y\(10dڥ;\SjϮqx[+snؑ% &"bWj6_}mRDiq%EfAV$39,]b?4&]BR;׳n[syxY% >V`  |]o\I%ţ63<|8 CHc,xoJC֛s["1TT,;@<: JÇ:}}={F:5RxQ]0#;/iZs]iw"o JB6ǐ)S(K:fp^O"A#I$' 9Q?){hZԣW4i =A 8zg V=CTM[x Q &v9I5@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@pzׅLimy- ) IJWb_wwP{ bZhs, 4>HqjZMݠN1M!v4%.mބ+Egg!MmXɒA `[ K]zZѓD;[THO"#1?<m JQ@~.:xjLdCmD$FifeG 2vp$smkk үMe%[aq{m ~˒f@FdsGQ@WxJHaˏQY$M##7HT>捦jN=j>ggo,Bkl\Ι.ܕl711e&l-[DE@m$r_hPiVMQЋ{)#VsqqqYK.-F_ӡdwkpIwpV޲w2vP=7LJh-tg.Mܷ H@q=OY4--k4ml% T3aKzͼ9$Qr20cR pAh]`%lW 0P"`ǡKwwSƩ")fe7(0b<5&:vIR[i%•Te(/uc֚LrO+Ilg.$ McJJݿ;>Q_hb&I4rn,W+ \.#?*|n>jai=wWK{U|ܙbG\HG}A7<;O}mp/;'ac oL̓nP&XIEp~'/.M.n/ ՆmɚEOlrZ"?3r}?]4}6@ֱX]5wWQJ$0(Ŀ6ޒi<E|Kjϥf\ZXyuYKk&^znmʑ[<5yj:uq#"I` o[(S5aťOqwvzYC,[ㅭKl) 3o4K77ucSmⷈEA+&T91<ܠ@]Xm>Ey No6\čnKrPy2 `nn[v\n8L㯩Pk=wNX7V_ 1DW@Y@.N_|<>D}>{O.Aqw+n#pzir^iri5ûp" ӝf 6|f_dxgN߰;*]Kt1m;rR*,S4MfRFrL:CA#yދ{Úȳo5ј1ıH岥Fw<9]sIspgeGVʹx!HC1(YvA VG  HB(q9}?AEմMJ/&[`d̳2ȃ#G<1: :bԮQ3 HXSXB(υNuMjS>SQW[4a\caET±ڻtAhv~]׆bbqdKy b`r)_mlEsf=OEյI,5$.&%q qqݫn@>QHmZ$E𽵋"&ʀn巸9 I]H#PJ-bSo|5'lܕ8 1;&#BCx_I6g8E?ͱN\sF6(((((((((((((((yi}ŭim=춎if@NXryi}ŭim=춎if@NXr (x-h%@WR2#4%U;[M-mu KiesL6@r, TpO ռW4x䍃+s ( *1<-p,ftEw0ܪą$u`}Ҥ}gYywx4r@c ~5iͻ\iz KYU pJ3=\((ngDWx ʬHRGP V}*J(((((((((((((((((((((+/_Ŵi-$b`и;*J4[-Rg3XJf1W#*pHtc }/o'hX y oa sznMmTIMkKgF1Fe`LXRǼ4[-Rg3XJf1W#*pHtc|5{-!-4VX–*&6 Se麎k6ٚP[-3E0T5sz7/x^亮kKϩɥX^Z@$I"2-|$ȈITc(|Nz Z}ē"\$(g |3H—vcFk ^iU;%YA!7pP(ϲO_sk$;`8Ɍ&!cPw_M0{yUI&3dG%Օ~YA&(V%գZmb04lH&(Fv(TPA /b_k6zr_]"Y6|?7.y,r'4!/տ䴒  ̪TVbA-'*>&g-twZerGq11X:Hd,)2[N>% ]͠`aaʄyDcBȤHW) Rw)6|/9ú h.u9{F&KE#8ʝ(#$5C—zm޵$W.xʯdQ4Ѫ!%zeWoi^2$[[y)"clͭ=r]jR ! "b+z2n bo`S&d lY Xh9|mUf;9ueU|${"^(aB;.Ub@fcEX.7. Lqf[bKo*"&>b)$ڥ7#Y|=[Q EC<(ݳ"*wO٧o~R_ݽ+39[ |u'47wVB3plV~h6ok`/+k';'$ԓԚР((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((ꖚ.q_ilt*u' 5b )HDH3ʰO%L+nc{v򕂗>s3לg(j6W61w~)D.G' u QQ<7(^ cF +ap;EWԵKM&fyw E$pH)=4rǛL6v"i[\V7pl+eF!N eok;O%]n,LV%bS_dR˼eok;O%]n,LV%bS_gB ặXTeu# 8 s@QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE? &./60Dž%xi<ʻ<5]w=yeD<>ta Ȩ47P.g}M B(Hʜ9Ҁ\ _SՒMmHo"kBh@e%7iy麅ŭis=ﶒhU9BFTACצ >+tUʳn8.Kܒz/X'LQ} wHu$A89].qSӼɭ볛{TM+6ƙ]&!T$UÇ2~зMWp8r7gUHSд}oҬokIvgq9Z.5MDw_ݛł>V+IOmBf!_*[ ^O h3iprk H7 w>cRtfmM>p+*#>8"/ Ga:ny\L{m,J*ȏ~[6+xroi q AP"  l Tg&hߕX9n38=hPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPxapool-1.5.0-src/doc/online/1.2.2/img1.htm0000644000175000017500000000062610235646675017624 0ustar twernertwerner Page 2
Première page Précédent Suivant Dernière page Texte

xapool-1.5.0-src/doc/online/1.2.2/img1.jpg0000644000175000017500000004061310235646675017614 0ustar twernertwernerJFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( o|v.XhZHݷBF2Qt``uҼ???6ހ=-/}u^{+='hP>I.1X!L{P'Tۊ<㹼[KңD[y;2ۤRFQH{TNj|u KyYR8FDR0/9_#A%wGK6 n}.k612 ە\l WF~h+OWIn: *z3j:—rď?2*ݜvlQ@6eia,j\6TU@ 8*34kW@"̱m I #0Ȥʧg}Ŗim=﹒Uf9rX>r(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((?躎v#c_BҭtB,F'UlaGOɨfm/f-3rey`伥0UmU64-it}Y)丸u"4aцF^NRKME[Y!x7eRF9F@7/<_+ĺ^䶼Qw+C!(䍈jw4[I}G~@W*G h[#Z7?vZLj.Ss/"a6 rXSq4zj?/Bl2U@q(hH'yp C-GQ^?dmmg ~$2NqkC"uVB#s&Ȥ-=?V|9]j>foŦAgvMVʳLAI&rKW4[TSYI=*-xI.Q|;`KHQUob,㺅'H8#pt9ҬPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPXs .Ow:<1-<3*Cs }cuyd{}sҾ{t0z_\_kKXl0m3($gbe1n[TKAivMq-ʚx \K(S:Z Kkm `Tǿ̍@b*^YBwr37{U}'RYѬuKu`5]CpH;-ƅmVҤ}A퍭ݴd\$~HB.UHzi5++cV%`#dm͍|;\S [O"%Fz:+su& IK 7BX";3ؐu>g4zvWk<g*i {?mz]CNmWJO }7MxfM$!V>N}xn'۲MkCA.CEn#1 #Bwe^L;+>K>LWJ'6x`1ٻ~ݣ5Gw1n 4أy#ݶ'f'Xwc}j楪+m?BP{ks-ͷ-HgV (ou$_[zueI4/8<:ד{Z/;UkˈZ;-'pb+rYV2p,ZA3ݲ6,Ūؼ4ZwRlT+zEou_(e"]v՜l4+=/uO4Ih.(I%&H$c2օZtϐ]eqCw +nExԵ;GaԵe lΫ9Y%2xԶzGXҮ$[GK};O BCݳ 8\>^^5t𘿆[w& *%;H93Fm/VKEʯ[tmRB:r4Y{dVVxv~M eC`}mYͪM!IkYmkn$H|5]2ysia]G<`{`S>s1u(Xh-\u<5{/^=/ȧ/1 9Yp~cPM57OԠ}K+t)V&{y>Py~DƐRkR 3\:֕R/aK}9cVEak#/1,OTԡlet#HdfU 2kmtWM-ol;a@X!BOދ>$:!ձeeۯwpTX};o=6CC:mt`H 8 S&y{-{O#Vͻ=6%1eBOZ4 9#4c|nnV/i>c2?vY(P(((((((((((( qlڤ\Zme2&r̼zͪMŨZ> ofS*/g |ǭrzj>,f{uA|c}MJl2h֞E|8 nx;ݤ+ːwn vl8g`0U,@ W(Z> !\4b\S,KCʲY$UIr;&\vok: v;K=2K--cFIPewcn^C#YXz}P]BżC si#al<2 PF+5K3Ao*^m)) ʬUs`AU;!((((((((((((((5ƯZo.fJdet$eY$q)*M+J;J9e#b4,Q 1rIf$Uu((((((((((((((( 3DӴo7WrUs5N'j.rpMSRæƩ .!〟.7NPrX9k6hvg9<];ggZ5yZ'⻿0鷒faІ䷏ru yHp I|#o[E>7| *@Si7{uyk쫴;`du ` x cZ(2Ȉ}"vQg;y,` x cZ(2Ȉ}"vQg;y%'LjћhcUrF߻li]n$;FwrYp NKFVd򌚕ĀWScmVPj"Yoyw&#;|?ųn۳1@(#t- ˛GmRVm}DײGo9Dh{( u47z0KF*H_&Q}<iEpz|Um/і@$W{Va`Fv Zci<}nYlL}%Nۆʧ, qEy{.5X{1Y7%GT;PPpˎvxr]xRK CApZLn&XWYmS}U\o;:+J&XhL6-vKvC$(Փ8 Q\/徔mfؗM2"7)~6rXZx~]4Y2Z&h $rI[pU!s=Oľ*[i\`s++ S00#}H;\e^"ԒP"hk,֯d@TjmW,]Zg"mC懥DOciۡM2ċh3 F}oq R85}n̾T}#4@sNh(,,[˴],P\K,q+Kjf r@.Ex~dՅ&Bh` fq p_FoƣėO͂IkBG̬<*R? ^HH(fXaV+8. 8ǁYEy>2զmzD[7Z/%rT.z^\\ZO;ټ&HJ*ͷ NYYB{đ}ZP5[,d\o+>yd-QX~Ե^[m$Z6erDcr ( ( ( ( ( ( ( ( ( ( ( ( ( ( R6{} mqDX+@ ck 3NZ\ZMYиإqrúGRr^2tf[m*AtKq΀>IEbҥ4-/mm%ػx! &)C<Ieᘨpio{kmQ. ķpY1O*H(rO/ F0p3ѯH5k[=?PP6VGgl[s7bJкE&4MiMjۇ2>@,|('5]BLZ_Lo|O;c ~vcDIwov}uwmQ@<[wiٶvۤKo\p *~1rzuW`mXeͣ|"}ePz| id.v6٘g*7$Lʺ39hdi#ͳA IlI$߱kCRODe,pJ8s'7FEҵ}[M?хu'f\+`@3E׵G=ƳiiszErJ*`:OG5[֭/- qbv\ *{˴gҵCi& < (Ur|Ix x}_X;Y%O EfG\gv 'zM_R o$JZU\F Y#y8oOB?yo?3F%{o[Cz#rYP@F#己ʄ$ ŐI5/n<;uq]-Im EMy!EWÂ,Y苯k.{fc Gf"3KDUݍt^{O̗:bNqPvдpxOյ}NSHսG)`ݝqP 0E*(rA6|jwD}8́8V19S@,|7gi(54-&vvz/ːy4M{y-8#ڭ,[wn$4k zJK#f;dXd!&~@m}Ʊ75ǾcytKEc|D6(ƭizl:MB8<ZI˻2S]Go>}axIV7l#wܻݢI渖ݚaU`HsEeeeYQ5]k{[aPv9k%ǃ⺲ZNbecƪ6!ĸc<ڍĶ[oxCF˝x-2tHK2<4PQ).p#~*G( iO4z{JK JC G0WP#*6G5rŶ3Ojr%^g'04jpf6 ޿.OV@:B2JAy[;f%$rxRSjoU-yTd3aw…ݒkVC]UjQ9L^hvS(od`((((((((((((((/LUs~Foegi׃lyVa9=KV3&ZEq"!n̦2Sn=gja+wYAgG@:(`r9y^2J\_H蛭x9ˌ/muvZNҊt0ZYn%.K#HW' @$O7w^uM':l~K RWIJ$+l*A'c+y{(7% K@},my14%Y$h VwF]0ۗOqo?!^Eo26J.2߽hQ@G-,hz-"y~[ظG,%ԲYU$lzlVKkLu+ #]J,IWQ@h~)U,oie4p\%$4rpq3Q8mN4#Rt9hLVVʱd(c) -l,|Aȏ:<@ڶ5]A1",9r 0|Nqq.wIn})ʥO4bm`G.1uPz{]UHP&HTF|&ج'D׶,soVW_rFXX12S+?1vΤ$s$Gx WgFsk^!֥.m巒Os; n3HGQ@Z~jv"8ZhGcs!<#/υ;tCCޡ>s FX}8oqEp:!tMnPe#,>~s|I/kkwz/o`.aa,sax?LqǦDmRi晍fKbSm8}.פ.g. 6p|Lm>IFデ'oˆ(/z{FM meUuv a.,>]nܶ46V}j}緷 :KtTA" dn巸9 I]H#Qoop8* ((((((((((((((47:~֐/Ti=cegQgL;4#Ercc*@I%9P/,Q|Jך;)=ctiݻ]IN8<_۶W5ݭawl7>2bx|oQ@g6k_Mgk icsyqi`I /G3͈@]g+[Uk˿9X$"0U@/̊IRyQ@WYu폇ŖusyC#[H_,4 cT1@܅2j3: xUym7U de(]1]l(J6W+Y$-mE Qd!caIe hIw "D6),WiI# X6Y6of]WQ@ [YS2fn-y!6b['<}y~)|Ib3s+mGzEgǪf@_>[_y~_[hQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEr?uѝWPC@vʋUU@*W_Od6γ6 20$cCWO֬kdZ,#]ʲ \fPKxէ8L^6FY~Al o5(ບX᳼vYY[#lX|nޫ3T"!6ƣycs9ܶUNHf ˭Kq,̠1J%N_rkˤ$mݐ 689`%}&94:xxK'TD j'3bni}slKD>7,϶o&IsmeSVboL?n4WK%֘h^Id2 fCa8FPH;QE|WmjAs2Kʼn[YUKvlGɷ/{yylۻUO\麭%yUvrb𩝠avؠ((((((((((((((((((((((((((((/ք?g.,!)b\0C'Ԝ\[f=6..=_g_bnX sQ޹_[xP4*V,@&b1| <7DV7r?yy`0 v!@ 4t'oIY^ ,KL@Qajg$Ӿo` 80g oR%]`K-bDmgȷwO$AAXz9F^R+WkkUoc;E,o;aTV`r6mp U柨X kA4[M2bշ|r .K㸠K@c[6XC"32H ~!|I}]XZOk/v=-NrqrN1ssPQ n}utKLt8N PRYCyvI/-q_U!iܗW>nҮ 6+ļao:& M=bmU|lK+4mTH4?n|$)VPsP߉,Vy4kwz$o8Colm >2ΛC<4Ѣ YT1"߿YAq0دmBM6] Rhwou80K"#;P:}98:̷ݺZɨM&aDZFW%m(pnj~u}ᩢ3^<; -6fo'9ͤS]Z3!WTrcZmZ75<[wa7LFYm/-I$ ft"ݣqou̒$T1Mqߌ.QM)9έ\)%˰o,F)gԼEws[^M>x[;[Ekd;XWV e $ewpjbi<ʌ K>TkhX˩궺KpА6fm\2K6|=6.)2ꫩi.LZblA]Y a n8NͼѸm!E`r NF,9sw}K(%uF݁@3nZt异_xfs|ҕ0NܶUhFqgG6]G{,Hƒ,~lm &$6%K {Umft0=d}' &4S ic3G$^ВFŷsC׍%K+se$eD*HbU%(ռ5y}RմHe֌0 ɷ2,Yե\4o DRH# o;~=Zn'6HKUڛPM;AԬuxOXl4$?/ PX]jiǂMy:pr<ҵRManjo[Cz#rYP@F#己ʄ$ T6ZCIzS22! h+ϟ(((((((((((((((((((((((XYylȕgΌ?"\a9b(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((xapool-1.5.0-src/doc/online/1.2.2/img10.htm0000644000175000017500000000063010235646675017677 0ustar twernertwerner Page 11
Première page Précédent Suivant Dernière page Texte

xapool-1.5.0-src/doc/online/1.2.2/img10.jpg0000644000175000017500000010212410235646675017670 0ustar twernertwernerJFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( (I-Ķ&&/C.cgbݞqqs c^= dZLA Nyae ;)^RO2ҤH*pU A*t(((((((((((((((((((((((((((((S}q~i,򮧖HfyHVMd یvW`TH a.~`4Cl$V!$$qơU ;Tv6Vnmaimm n'j(FO': 6X|\vۉg.~vIf_IjbX eR'aB 69 ї%i}gs-(Xt 2ᑁYn$Ooޅ>``[0(.(~aVRwiKnki FNqCc Xd0&ZC㈂|nBSfcFg9%`\`!ܿ%?e'ؙKEWfQEQEQEQEQEQ\Sq:*G]e>d K>Z#FJs𵼏_iP[_-oݕ;#LcllxϤW]>y/5-{Q[q`Bbi;ȫI':d --8`ue=ڎi#ǎ݆H75s-r۷H$pK){"US.j 1T`R9ړz>u{[v; hFPy# ռMkYϧZf7i)'76J<+ytwSB+vWe8<x❽Q#C+A8vNj.O^QHQ`%m?fGj$̒\QC6~\|@%o_*[(7;>Rd 0̺>CFc>M`*5_jyy{rQImmʮp60ԣ졻x ]8;.N98+^(ִc-Μ6,opJHךoNZG\ b,fH]`d $\>}(Otƴ7n1RX0\˂P'_6:?/n&i\)$$ݟ ^8=A#Io l/7ݺEOnN󆧣^i-y 0褂]2 ^UrKo' &. l_QGue(th.-e1~nF~IӾp3~&i16 !V۟#vn3 [CeXDa#HEV>Z? dž'1iy1_3_# 9 !Fޝc%afkvy6*,T68sVmH"9 a]5r( (((((^/A|ښ tҼ`*H6/* ( QjrZo'x\`á :v<\5\izu݌K]N&+pJ2ǰҊ7>`gLI'mw|np1Vksj+;ھC72CAV1R ʞhQ@Ú LV$pjH3;$[Q`UoF=on\9( x[FvgX*yz1!>o`OLr Mix^1f (߁50zDIe%238xZ )mM[j70 D+$ek#mmⷷ8`GjQ@W?|/ i1Ͼ[ţйkmQ?*3]%OUҬu.LM0Ar` mt7nI!d8 JHTQŠ>VCD:W'&XSa7ȿ3tܼdW7um,p^b-h:r4z)>˽I.QYXU]Mv\5ƖIkƉ { mcc_dG":UV z2\'xsIcԯu9m!Yˢ4xݲЯ. 7hi4O7& Xy>~3O_SC[XI(Wq.fo9y i.j{)%V(aybM8d4O6׺{mgyca,<`[qbĞo\YYdx_$[[j.O'jEvd `xqnŃOKr1ch%ݺ<."4+ݢG(; 5Fd2mpp;Uܿ7#Rúquqe{i}̐3d9c''v,t9)oc>::G&ᵷ(=Ű.a. )]V ]:n[Z[.Vo:TyvKK r)M 1J k^]^I?#/4dQ9eG')t[/o1U>Ӏ~fր.hϥZ㾾qEyrv+/P-g]'5YjCPDbRtIȪ7[`GzRmR+ &2lt?rGʼzTw59d ]$By<0pT0 @qI9-nUWYRhH [pn2IMIfYte'pA+eX^9 Jv/,|^it)̑.ycy5bGY`sy! b|IOSQ;ӆpr{ۋ!;$6@vc[ytfx&[Iyw)߿9ݻsj[ Qˠy &8gfއ|ja9ե{Jvz뾺 ^j)^ Li+_ɵ# 6AjmOZ2YdU"-MݱɿR÷?i/c)cMD\y]x_?xfɅq=2hLge*w+nܽCm=Ww7W%(Pĸx4OA2K!u(څIq#>=_UGl[cQf`̩`rۆ8ܵaѭq&6!~cv~4?/Z*]57i6bn@3~+ڭݼ"#-vK*1a60*rwmxS~Ke܏{H㑤!G-8ۃ/5MI"Qy'7 qK$@DryhwyJ)>`]SR|YfڵyF->Z.ˆh^~%Yt.5l. o0qLb`s55i48:7~^R-e ( ڤ:mj_x-+}J+B9SPx.fکc̄b?gy{H J'SњoHgk߷!5 +[w8%`cIŷn%k•wH -#?x;j6z#dLG+c(bɐpIa|-yNMNM.b4L`))H63j֏}opܰ`F,ikf%9P^+tX]+0 ڮʲHR2AU;M2ZRXF ĖഭX6(fa7*.hM杩WW7\G݋aiwsq@/4)k6OًrWy܈ʤaU\~6ZVxy7c~bC \ R^̾ Qr9oUFmD18>X& #GԴoWQP@,7GF D3OOo!/=B Ɨ٪[ͤ=L``ۈRX$r)D|/ΧqwsqpKdtF<$#u,Bf 6Dž"|@~uoɭڔwPr,rܖ`?IJgmWM^4ttvfEHVU5?&6$\4E"m1H$arB %jdLp[q ݒN~jZ_潷OҭϩF팭,#d$e2讯̮vUo~mo)Ɓy,LlsL$|4\M*>B,XOPf53$:˹4#IC[k2qqeCPf53$:˹4#IC[k2qqeK~ԮYh^rQD?ϖpA#z΋{jŦzS1ݔE# w=W➋߰Z\}1K`$8WeVKGcju㲸L\/, vQe*nn7$LS"{[%#JKL#|ݙ; bMQtCM5ZIh UM6`ЪP@)A.uy-\Iu%ْ;iWRB 2?( quFxS|1t#4TT1fL_Zk[_jpM zZ)"dB/&$Igk^ ,M͒hijmްVao;vg2u&5ȳm2,Q,aYVB7*Ԟڣi3  r%Suq۟iMJM֌4طBM ߐn?6[ RIŶ^[5%dbM mõv ӭ=x\ AarBG-FO<۫-r[N!w.Wq8m;,mkV2}Uԟnyf;q˃qq_i3]5ug.d¸J4&R32u?hZ5.4&wY[iIl5.6/z<0R =3zo>9k/٤*Ƣ?0 ASf >qN⾏ b!;ookIJC͓c2K*'v /zƗV/K9yf?LYiCT4k?],W}qIJD G'w 92[jgMG&p*l?VZw[hЙ/o"T0[ç`8B i\ODF~g>N͞vwx~j|+jFK,+ܺYMj%yDd2`\ZMxh[ߋ.LitV[i:n3A"&mσ[_B.oYb@Io2X:eXգqa(tMP։kmw<"sU T3`}3׺ۿ,`$*| dY>w;n`^=:|2L&f~m s޼[rέ5XFIy\EaXޡG\r: |#5{Qi1ZMC"伈^G 8X'f[.6:iW_`]5#À*6 bcDlRSԿ7f\*@7Um1TMqnnb[-Q.<F\BVb@%9;F[o^Jm`&Uqx*|M9rwyjxH^L֖kVTrd$B*|`B ,-K}?My캧k4L<O/n۱ܲ؏6=i,ײiMn Ĉȹ*@eʃV8-yp.,#rF#vvI@ͼX  $.t!dtIknb-a(PDoIj$1poQjŊ].y{m&-̐E&dLmgAmZ\Z>vw:ȯ3,],ͳO2hEqhҮ` JAmprt5{YUf]}.|()6\/'A|Sዸ.{ic[On U;+o] ZEov "HbHpivs(Nys]%QEQEQEQEQExCx[Z^-:9givJf8$rH+3iKo<=}inڻkfUMO +7B#Iմ{[>U{ydAH)ڄ]#cpoguy>ZDgiHX|L˖P {ޘ˞M|5jt˦Ic,DZ.e*A}%Ě&Ķުu)4[7AmD>lyyP#l*I$( HD6oZwQm2mfO1 e`B ]^Ga#9FJ9$e!6Tm`3B>ЯvW- KӺPJ>#nzg|E4XO3=Gq\rH 2-@Ny6G M9x%%Е 2A&x_:xvK -ͤHW|PYېKK>uG4R"dX̄#/Mm8Zx{Ryn'xćsd*"l0>ReQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@fm9ȅ[F{dgU}6=J+v]R}4 #ssq ( =ݥnӘ] {f[]܈Kăc68ƅJ}ojZX4@$ǒYIdHa+vЯ_9nB6XÒ'$`vGe^7H.Uc7if@Zp/y<y{;(~5_*(1.6wa$v \_[Oi lS i;#HG>Tcϧ+GwcN5>/7B 01\dg?RcͷJ"VXr p烴;K4KXIMuMdgV93x[?4GhQ^'ݜpOx|xf-lۭ c2qo$'faKM^6@|:.E-@[Q[}ٴΈqzb{Hgdr`IB8}=q^gms.y'ӣ-!y!h;PٕUD=0΁u}ng-[I";3ɸ[kygq!Hлgb >{U}'RYѬuKu`5]CpH/{+s^Av'X\Ҩ#nU*FQnAy>}(mmͮO k W}2@Wũi֏eYhiUխOq-ظ;~7! I%\[$? swy]UP*(|GE<@= mX㽎-SECC#XJ*`QT ܠ(((((((((((((((((((((((((((((((((((((((((((xVXD(91)O  Od}bk&ws,C4M!Vf#.$`'2Nh(/0[ǻuA.dX`rϗ;$F2Cmo& 4Zݝi:  % *0 K/.;+4VxfK}2MLH=Wd߱N ePPEqv6A"wurǼKAU,.Y3Tq;pVmK|Z-aO.Y!m&LO>Ul%U;+|A%GohwJf L,TV?j:W|)&%iݬtbR"Hm߳'hQ\ܞ(K& v;{@Y\̉UfH,KS1׵}3^-Ϋo ,;Qv-NE"`4B9*@;+zƷIw<6)R /3.z6 {biR4o^$o5@3 WQ\~s{]kuX#3EDY9He6 p3 p S%_vdO*Wj]6)S!_8X"gPhL$4H(Ǔ7IbXv]V SQψ${ y@ qrR9[+ ,}6iEyNƴQђ.>bp?嘒&,!M%]= fc ےY]iEqz46d[gDy*TF VF ՍOzjMR"ηegi65ZuIX `JU$(\\i^ZHS &`duX(((((((((((((((((5o$qPD.3#>{?z_/n㸓DDʐbxk"v$6NNLD`+]e:mBj؎!T"T"??#pNok-w[$AA$^I)p؇^F[ɭ᧖'H @KF̡_r$l|%t{y-<ˁ{`첪+|emXWK}<W7|7uoL {q %BfR1Lpj4 +[gԣVZ\I4Yz$aG eOX5>êONu<3r8NK𞱣Տf0$L~vC+.8_ BصV{絾 M9k%?#$) 6 FIմxnlgh7f 6&Brlwcp ]ŪFV\5ZgL[]ve]La %` rY4HR&\B2:۔=ko-ıH^I$`I$_nݧ6D!Q rŻrd(%|ݍO ͪ> KYlͺbD2<̊&_ݨ}s{Mỻ&6VF!.2.|He*xl5-%`}BS1d1/c>bU9+O B l[}9GI }\DB;`t$"'ut.6/fF(0 1Q4X  Z_ bܬ0hw"2Uc73|/4iY^ZJfyY;|m Ǡ&Qgmr&eoi,|K¶Tmb(=#GԴoWQP@,7GF D3O4h-\Zj7yEZgqC0 ĐY购ZY$ҧ sHFBv=~Pn )HDH3ʰOɷ;L]jPin!Nw[pBDmw߁-;TzVuiLZy+rP@ns*F>>3j[]:FWU+% ʰxhjsi%xgbFe`W?1r{_ ^Yx_GM[I8-hvԨdhϙ]*lXzv/),v[%Y] KoYX"-\4;$Um co8FĖ/年E6s! V@Y7)8H)4|"ѭ.Kz][B"%@b1]9˦q:Imc.qctV?"SЌ)`K74/j7&wp-$?hv2+pANkcJoS6[Z oބ cyKȠVSs7;揭itqH7E8dt`z0zQ2T:tsgѫ$HȒ6UX>Vn-ho.uH\yb?5hrrp:fV=4 Elg8HBU(K A)A4}{ۋhmh7704ݻ-He$q:93huIJw[*H+b;_מydpә_,n,] PNp W6vj-KCMKTdsFC6!8ذM As sn|RMEPg`Y3@=Χn;qiCvaऊ AR:A ex}84ǀO܋[rs.!1&R0aЩz(;]mSTԬu-5eo5F3 ]q*Un$ 8*O?s{ۛZK[HŻ@PK#\΅R AV ({H$-lD^{H~#e :%T 䒘v"׵ ^(-=%>cx dvi6 RQTJ_KdD2c7FG AQEQEQEQEQEQEQEQEQEQEQEG<+so,d "cᔂGjiVnɺ᳀8it:EpgBᣤFjSSlT@7HB6P&&#PS]H6Sg, #D䍲P</cAm}3N˵J@MoMOo沸5߸ڣ96ޛ<=}eqkcqGys>m\ILIڊ cX?'_ķY\momQw}dmi:͍MқLY6*X2$@B̝e\]h|t|Ɗ I"o,gPM3VҴ? _IN^mΜH.80*2nW-X-In.O&"y\"=ry$A@:zf4{.nPk(e}pC3m$}ŖoO*/aF}9}\ Hdz3ksiZݿTK1$[sBv֥p&%β])EBjde*EG$l "LJmyP_4W3,e[7;,(4]BYОE(2o,ټ/o ^8ẍ  Z6nmGS>EJ㸺)^Tyd88;+(з$%69Ez_\qPͪMa #EdLpU;3ܛ8{=A{r\&pm&,Lr~o`n>1x[)UKApx{ Հ$FiwV8Q5I8Vb ZŽԑ]$Fg&7y1")X0\u$:sw7-Ժ _Uk&)zTqI6WBNw84饊(4I+ ba d5l_}Fב_nӾx$K1sWFRLd ;(-:o废CO%'PKHf[6K(W<3Si6Siϥ&g{VMx2*QUpvK7z|P[o2 ?>$<oTtc[,irF씖g x'3DCr'9P:WP2e< ԔŦj7n$ҧY-IXb33'&HPrʦ8rT-]{n"fS$`!<}y~)|Ib3s+mGz˻<6WEjWbF@f |3yBwn;h?E{Y.aky$xL b'^Eo"kMVpn ap#AFC.KmA+/Vֆqs{p#b 8' >fP@9?Z\\[i[0A|V) U7oD?LS[4f jm+RC>[( 9BXe4SM[` sg 9@m%ѳԠK;V`1w!ʗ}XoBxvkH=OI-$p_UP\+)nPK (υV%IHrQg2y]#&K=r+g9;tP n\Xg*qB| a6tkb!r{@Jp9MXkhb{{MO2β# evf^A;T?yEcMuif=2B[s Knr `~ eͧjv:XlỻEyAp3nA}d!ِ^t[Y=rZi-ԱlysSpR#p ?Y]fV/4X\KCr6ț'¬ldU}SCx.oD2WgTpz8Ya؂2zPEPEPEPEPEPEPEPEPEPEPEPsU8(Do"UlpJ 푟QU(uKKkl(\ Iyqܢ3卌JQFV (ײQ@7._tZw2HlI< `i"4=Z~AoX#&B2ķG$B͎HRI=qjJwzd5(]nam S@wbI\d32>')^O1}?k(?6y$r[)*2Zvhs˃6#.idUsikcs"ܳ m0~cU(>{~A-έ+[e"I] fm$r|ܟt uKX.L\4Fc.n mnќbc\׮Q@wᩖ|3{a [l-9GDq鰦6$\fB>23 y,qB[QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE46ʐ;X*tn dEWogin4˽=Õ]4L`|wsnQ@^{I|;2x}}qUM:?_}p^O?ꓓB((((((((((((((((((((((((((((((nḿ$Bc#2T\|s\Vy.oB8rdFBy=fm9ȅ[F{dgV{s'02y)1Q&˵1n *˚ jV#k7qEM=ƪZR(  cZ5aVHvYYl4m. dxȖ9T0&-*Kգ\;*&_i=1m1 o!i7!˝ pZ=$D Di`,1|JnGZ\V[56 +弌A,$<<< h-s}'ޒAmV #3 + Dj# [S͊>_[`M3`PN œl)\rȓj!o D lS[0]9ȍ /M3Yk F;tiRtbW;5# FR+9m{Emn澍EVYXbIX9`@EZ_ ۭp܉.{đ)pVV*hR $ϹYQK[.+8dQi}>X c)!C[i7X{e:ylɼ,GDpF(EBZ "|H.&V]v˺\7>$]MEXd)T^A`hIfخ#Q/UQ"H'嗝K)BD%G Hծ5i/ԮH&$d 82(f:\7iy[U+3:CM|]}=֊ֺ4riK;|)2:l%K*3G宂￵/&hR4FH#qy`yFr3]Vv7Ԥ^i2G7l˛˹XcI G/[뷑&!][ 彾GET`*"! ^^ZåZkSʂc ev.|7Faa8 WmRڰ#VW.e`KzAy,4-Pגۗvė0@e@ʰ}ni}Eme&4,O`\kޯZa^Di d6FӌjE:fq:Oo4fkHetv*8‚vbw|/0𞧠ܦe海0[wp;GA$ߊ54I<;ɯ-"0lCGጀ+ ,-ťi#>}.4]-[l37~vUHߌ2h5=>i WMT/vyy y_KG?Mp 7dbX˼p#h ȜP:6A_Z5-6/GW"G&X4(o!T++ݞ 5"{Iua%{"e@/#g-wfbq^E)*\Kl>bR&6m*1L0: RռA=V[ggm HQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ghZ=yX_AɹH˵$t5EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEglnmDt1Sp8K(=kB,,>"kH$</mcpqր;m6mRm.-BS|2Qx9^H=j{u3:"nUbB:JXwPo_J>xqGeLh.eOPILg$Q^_;KMCU[9fk{xei^9g" a2<`)do3>'uh-׿&N1Ċ/#5LeV$ 3;++z*TA#3YYM@A0@vs]mylN:UAs+[qA@ .IY~@w%$–W9̓- GS-טr֓FLe HxaxRYcGDmj RW{w'0%ԷsZݵG$i8љx-GH\m֫ioހ~} UK7.%km7_WEDLF{hba@YK$W't#+`',BN:ן^VץF>$_h>lb80AoFB%szѾִ-oT$\~xǓ6([hv#717BoxnoiQn<{Iv6' J3· n'tgH ̪@bRe=k9=hku,D0@!\+o(7qRj߈㱾{6bKԒ1le/7q)`bBېo $Ə3Y.Ka}Ncڤo;kHnM{4dQ9Rm'a"F*S8!0`q\+u-sc3 $D89Yl0#9@BU{=2K--cFI?g^$ cKWWwG"@$3-f5ܭ7[$:̾iclw]cy9,6zz2UԬ,!I2Ck,5U&fp# !D!-|SmhmcԆd).l,auUduv̈́C z$vs]mylN:U#rHWkgrw  @ܭ/k_G&wq{ n<4$p#IEšʎyᵷX$/$0UE$xs^O'X8c}²83y /ϵP>Ix2Vm{i=w,JE!b7<zduoż9#`FApA椯?T> hWVX~%JA rqo]SYl%)o-oEb(FlX8mi]9Ky"Yf`1?} Gk>d7N<ϲ\$3gi8_C\_\7WKƋDRFHE7$9\K/#Ҧ?֐_=؈&cmv SXwiEx^9--6MI\JbXn`x4. 1ȿ20)m>7RFl]Sm(>dH:ӵ6˄otYIj9Ǣk׵#5%`ԖH1nDl%yfL5-o3,%t"1J6 v]PJ'eΈXV<4V%ѦW qN6I'W'ꗿۖ#,u+^HͳK؁̡H SqpH]XЭF9tЗ[iq#"Fr( `a=(((((}+vi;I fĶ˧0;rH 8⺊8 Y}VY֘]y|ZY' b*b 7+m AmO C\N_y$.,|>{]jQ'POQ L[.Fr[.XAihS]Y}eyr8`U)df;ojeeip[d"c&@B%`LѠP]д{8 ]*Wf#F2' 0bHyh༽ҬnnMktw!qC0#}kuk>-m}SUM]h xl*yh2ܳl-:KRXKyo":9rf(V'*ր: h77z&^ vvxLH']:Ak;\mo5jY0@#i̚nUM7Q{ `#- Ҵ ng%7cix[ɿ̵PI7tZ}@Qːkq} f;UՑVIFH#~O/ox#Ŕcdor8S:kce>f֫ h-p itkڦ噈- 8rUInhJ( nG) Q!ۗ\EsAR5M7}ӳ7S33+/J $vjQ@vl--4M6 PZ*K>J2ey vnO?15Ec? YY*K[]g)ڤary8RG.m.-MM>g-ڠێY1~Uҵ( h:h-a\aF AE+kMM{T)o$V Ą eA.kRÓ~!I|5:B"V]Ű/s1IRM? YY*K[]g)ڤary8[P{hZ;2j-X<˓nGU-B= c~[w_ huwXEA Hۂ@f}krϺд{: :Jom5:tH6 sU1 ۯa,"̠$m 3{n>EgZ=>gXOιI7͹5^ nQmD)eIv Jآ2iK$Ww-Q誣z[.d7h;Km,'Ԣ9REze7sHGO-Knq#$> 𭳗Z4NQXD)V/B;EnQ@l,8- ;!1.I' 8$ƩkAM6 s628 0`ZԢ2փ6. ѭPč*?3rsU_mn"֍ 8x%d`r!r<((((((\z-!-sgMgi]G9$vn!Y"GWZx:ξ]2Jfd2m?fč$j4E/P[g\^EBH6nbK3&Ig$&mb¤D#JPU~oq(|k,YOq 4 }0>kq֣MGRKV)d$mu;QWfNy i.(I^}mKyNa?y).0 ;uS46Iٙ0X *t,EMkų颒o'6z` ^UP8cGwk|C߳_O.bI|aO"3]\F| \\O&ܼS\hv%l=l*dFQRZpQz6,:3[OR)VUuo %! Page 12
Première page Précédent Suivant Dernière page Texte

xapool-1.5.0-src/doc/online/1.2.2/img11.jpg0000644000175000017500000005616010235646675017701 0ustar twernertwernerJFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( (I-Ķ&&/C.cgbݞqqs c^= dZLA Nyae ;)^RO2ҤH*pU A*t(((((((((((((((((((((((((((((S}q~i,򮧖HfyHVMd یvW`TH a.~`4Cl$V!$$qơU ;Tv6Vnmaimm n'j(FO': 6X|\vۉg.~vIf_IjbX eR'aB 69 ї%i}gs-(Xt 2ᑁYn$Ooޅ>``[0(.(~aVRwiKnki FNqCc Xd0&ZC㈂|nBSfcFg9%`\`!ܿ%?e'ؙKEWfQEQEQEQEQEQ\Sq:*G]e>d K>Z#FJs𵼏_iP[_-oݕ;#LcllxϤW]>y/5-{Q[q`Bbi;ȫI':d --8`ue=ڎi#ǎ݆H75s-r۷H$pK){"US.j 1T`R9ړz>u{[v; hFPy# W/i]W 'Qʯ p3W<_M ]k0r-'8.OR#v8c_T>m[Ҫǩw$CvXt1<1}/:?o' 8#&ōm;Y / T9 HEy Oldo[n:Q9%HA9+ qXտݵ#n1'e7uOF-Ru0rr7:q\?<6oyc(,ª9Xr@95mw\t=:-=#$ƄHW*Tcв ½GƱh5b񌬛zmO*9{x5i|F ĐIfo۴SWH ̪HpG<-}6[VB"^WB_HO,<'eh!u&uG 4C/9Lv8bpĿGv7HP%)nO@G&Džk &ob05F ٜL  qntσ:-Ɖc-2MThE m8 9_?MMqO3 ڟulQ!IC1R?%u?;7--f(- FOHuw҈zSm(KrMkOyeb0 |ĸS\,xsx%{kJi7]^ IǖPN 0pr[=3 5gNBt_:V %wcEzޥeNCA央"5ԤX >w,9OZð\\_D[MLՒ-o8RjOxA5:̢.<+  &}#$\|'`?>/CcaSmӼuEg3"#f?~,<]_C>o$< GQT$`5{Nş A w^j>-;ʌ6)RHBe1"+;O kW"Դ>r\ͩK]+rDb}eg%:Fɂw<:çcN <\5Ɨ]Qb { (~ |# {Hh~4qWwghk:-=:Cs$;c)e VoZ|i-&2N2@݌c8}ON̵7#OJErcᯄ{{}2KH%[igAJ#p$8f$kc@m-t;K@),YRĖ=I<:ZP7ž&W/XN{&8G ?I۟o;7g;nQErv hAEMQ ]/AR۰?@M*}эOxWB𥙵,oP`7967dgآ8U~f|N|5Oh>.ƹk=q?l8lG #v3 (kZh6ok1+!giY݉gcĞhQEQEQEQEQEQEQEQEQEQEQEbu7ZcnذiK2'KRHVUtĚeXI77,/?u9$SFMv1t5^S Y1#`2+gͳ)I^M{-m".H,x?|żWQ qk R*.zIv K'.u$ͣLIճ[̊r?1de IEr+[v[s a: m7̟ $0-0 ܂u)@}^#= 'ˮ:<Eq?t8tn-$|~Ls|y'm/ۻoՋ^h9{`e6\3!XEgzՖ %!Fm6ѕYA9#9w>ΏG3nRorRRCa6!8޹(O6м5w}Z\݋#wm@TQD(|mSF汩e٣.- #pHP2@%QqТBXo,.l[EX2Lq >a z2NΒC_CF.'A-FErxƋoO[[^b HR I=A$,^omCMx`qrKݳ˔^HIEsvw{.e%36c1B)m .iRX/%ZIJYǹ]<л #(kI 46Pލ@E!dq#2rbHa_ť77rZ[ؠ{[n!O"H"7(oC2w=!-AI<}8Cnڏ(]rY;\jQ\ݷ/{qm :F_`s [r->-/\\ػ:|슑 [dn!Q\ޭZe$V6 $:(-"b*[ .B Ν-fuZK G4JT @%Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@^{l42K[MHV|iHwLP$UʗWOrܺ|;_hڬʫBf5=g%d^ovǴ*EcOЩ&A<BǰjjZ5 E,+/P吶7 &_j:dZ&ŲKukhxY E8l]ux?M4 4?C~[k#($vD(F ̸xvz Z%nu[kIdT یǹ̀XAQ'T]G SCt?Mrz}iu.FWZI^U-a`r͕nпӵ]}N >}:ib(.>$J2DBLJ;@ W5/>m i[pG-G=3 4?C~"=fi[mAe#xknf Xdۄ2 ԇ¦W0MjWj t5y#tq7F'cebK.ٹ'T]G SCt?MaIxN;kq< q(-bJ(͇7H^[̍*\)EpK@~ꪻj 4?C'T]@=wM|ѧIen!;g,YEΊɗ[)Jgғjj3=b&T3}cJs+2~G7quhzkgvZLn'G&;GRN[rp1a 4?C'T]@z&oiݮ%R#]b'.q*,k6=ʥoGUr  6l?  h*h.1^Ϣ=˨Y +:F@Ay%FUOЩ&A<B7Qt!{uh%m,2D%+Ea:[5? ]%ce 6-M'Y.I\OA<B?  hU%HX?  h*h._WV-LooeNp ?xw[{rw9 m}ֻn?յ1y 6ur2x%vA<B?  h'PK )X]0ȑãxz[ iMI$4 "NFF^OЩ&A<B Dcflw_tki-J!m muI/-Xx[U@^s> Y GG*:A<B?  h&g oټmOջ>n߹vwvTg}j ݼi̲DMq "/'%۟x?M4 4?C}η{Hxb[+YGؔ[,0Vy\(nUB1\oϱc\[SY=~k/ dX*h.OЩ&: *gd0F#E$G$Պ(((((((((((((mn%. 9I#%d`pA%Q@Kv1;:FXneR: ('RPEPEPE3r9P;!d`2Vw #PQEQEQEQEQEQEQEQEg隍Mٍkxs*G1qaˍN^K[9Y0m` ?@KӥX/Gr_Nȃ8C+9}3q6dE7FH=ܬ2I$WS/wr5vb_+d~DY2%HE}]VͻjWq(7֫j.ND!{n~Ui$ .e^ϷR]'aapȜ|:;=;2]K :~b;NϓnWP?o?ou}MԤҒ{+&Qm*x'.  R09_.xsTX+`ch۷mu;!.,xb"]\r˻k70@";?hv)Ei$En.%ؒ WO]յ_ j{}%rG 4kRQ ]IwQΡ{}Z;!w' ȊRW cPpK1Dh&$+c1_)JXʅ< 6Ηq<1w.ݮw9eݵٛf`YI P4 >uwS=a-YDۈYBd#rk $.Ijv;dҪ0#-8\e/TV%գZmb04lH&(Fv(TPA 5/h:̶jV%4gFEe|:&Yڹ;뛈.(koF60~8e Sʚ7ⶻHo5 ?|$@vN%72`@i]n$;FwrYp a{ SFɰ+öN[q9=?XdwFmoJK϶K_,Gg<[nFڠ8ZÁ5O>ß(̊7m lcWqͶQ,8%/ I_hXq™ ,I$fcI$$I$@>jVռC<~RtMjFX[p ARm柄&nH,UG~,mFPZ(Cpyyii?-̄oxZ:-γ똖XQyP#-`F7"ݭa@$$[&_/I8voQ^ Ю)i=XR>FYpʔRYNj~kS:n%֦S[ZF.NxP  +}+Plk>|.ݝBL 9.5qy q ;w,d.#'4!/տ䴒  ̪TVbA-'*>&g-twZerGq11X:Hd,)2[N>% ]͠`aaʄyDcBȤHW) Rw)6|/9][Ӡ۹ $nfQ}(xAZxór[hj°;0B >l6 {-kE#L{W61k42P%3Ii\$  HP(W`o^_kw{n-tG3FXP,^xTW>">BX A9Ro;.\8;NF ",rSi6aD-,QsL&Bۓrd e-Z}}حnr<_(ؘ#bxiZm[ZǨ0$Y퟽A_˽oE.|X 5ŊnUi.:rZ.iEf͕֭d2([vٴ*Ǵfbw-Oyms%{Z5P ]`0Fa*@O_FKӥX/Gr_Nȃ8C+9}3q6@9cP7#J]_=#_6VsNe̐^&5suca H6 1K#<FBB gܸ^wϴ%mK+ڕ!O\{H;IÇF@I"$j3|sMǪlH5d 6Zpݹ2pw34W?|j[yPF uc47ppGQ^kn+vόw͍ՏEeӾSo+$oC&H| yu-[{#i2ZȖ8C/yofɵE jɺ%uĆv{ۨ<'![!_ gtwxv+rIؤn|_2Mَ/YI}Lr& !@%7fXn#<kmj[ rmmT$>b4Bm%V\oϸDХ֥oI69>y;m>Z6|JP=l@+˵`[+6W3lGraw (9Q 9N]/,|54_>H2?rmɇc!3zM6 -F;rŢɍ q@ŽO\.h5?fk^+<?wI rv0| OI5ZYG$تC li8ڈiv7HAЪ,N.dļ&mŏD$R|Z?(Y}(D%d@q#0\Ddy7ͫu|ŎOt^NO3vgr fdiF۩Td6muϩwz-QoYSʂs#y#jcE ;>H_A_˩O4sFG#9\ OrN00>? YIyjUKp}8y|ّ/ \u?(Ia/-%=گ*0Vʎ_OajvX}0YiV7F#l|),tاyf.Ev $کN d(fTW=2#tJHx<˟^OWDkM6_" L&Q mUKu? VIi^P3lu't$/B? /,muB,s͈^Dn<85KME i14B,_{~FP&RF9F@+]^JT,mX0:[xYwJw薷yq-ŽuLf8$ghZrxNoe|~!BYLЙTa„W5T-l-u8y2]dTh%s d2&84K?yWQ&YEpes8MǗ^C-v6>{ޖL%bf{]ت!+"69ԹoHKxm1pdDG~E;~<6ɨh[w,S2  jO7D^]8ڟb)/6v.%1Eyqo1%"sl(``'-[翶8٪[y,') Ca_߻|oCpl,, Ģrw) W-Z/G w)5yFT% [Nl5lM6T(4,UY<- f7(kt= }N6b HNU3Ȏ3@A Y H[=^դCu5ş @] l28_C8`7m.M*ŰKm#6sS\{sK἞^ZCc)Χzf-}7ڍ>!Tk|fH%@Ԁc )vU@jjCj/iuky%:"`W9cRe>}}q|ē\诶lR |O~_Q{_yC7 o9koԮ8im\mo( <bU=ľA,ypm 0 _j%dck٥E,6b7 ylgsblkS6~ {sE<\? ">V,P dDׇoum;X`Kx-5*:dt;v!-,~Q s?vݜ  lG\xn.6)̂ ;&2̨v~\4e#IikmuM<_Z:{D~e8-7Ҧ53tVn&HA;K63''ִUՒI䵹[K+͌ 1k?&#!X{ۙt@1ekB7F$/em 6 mg,ʦ0 3nܹ|*/<EiwZ4v[4%Q"]e}/dЖH33+ j6 2ޥzvqq>j %H-DeFHLp(~Ưwo.JWVGeY$Cʩ *uu\V%]ʢ814[#nPmw9bq 6UIӵ=j sq8#XncNp=b(((((((((( |C\jNy 5s)sRʫ6>G؎:5c14ixcxK $c BTS0> ׅ#eΗ;m=SXvhVXwܩ 2ߡ7}assOi,Lx\L)<(1@Ŀ\ɭGs "G2(n7QI`r hY@J5{kfFL#FpⒽ9g?|1ލw% ǔaLZUaNNj4mOĺ"l#E/m:̒R~PaR7`Lw7&i[}dW7p;nlNFH"u6}:ݽ7[r44B2 eA5k-jDԭ,#ԵCsqvRȈf_nl0{kޝ;UУZp aKlE]nm̲B`i'GT2&W;cryscsE%cO]-ğ"wch8ztf_jKk4.nmaB&e%X ;!'{˦Oi6.`i# *W sn6]^`e/HHCEVp66sl ]au?˓g08Wh٦?r6œpZ_'Ϋw dIu@(iK)bc`6r(75 um]5-R aնjZARAB3*.KK;)E-* TV 1pk>_h#AunK"[.2JB Mo)i7VVmrj ETVU`ZmFX6ӿF?'/\e}jEդxMݽQ؆`PmP5M/_Gtp]tPދB0I# .6]_TX{+)#Y*YdzԬv~:X_h7vkB ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( _궂ǶV(qѾ`>AM2b/7Z8fz;|`iw:}F Z7/ 8S$0QN; +1 4ւÒ=ʲI)3bAU#h]Gu"ŗ]C}7|&ͱ&N0ChXOâRIvtB7 e8es^GKk%I.buJq)嶑okz4m l# 1,+YAQ!@=r7, ῲxm1psmd rQWW-K%!/0< dMZ]0U{ }ON̵&GZpdz$~%xk23ѵ2U$2Y<+m:etjzWaKup̱ c,g8d?ze~O$AĎTp'#8RӠnYͥ,6[[h\y>Y1TB @Er0!)1'160d݃;_IcIqh[F,˩9H+0ˈT 01n]lztVN)A5tءenZ;'rHp:^;Dk;حݧK6cۇW ?z{1 !*k;;2 .كDS}򥲝fRFPN=wE + ٯ-nmrћ8 V6(+IS?VW Wgv:iv9V9J*[[~%:D#S uLƲmvsUA7wpZMM2G!Dme8 O8x>m4" 2g0 Cei𦧮`֧DKYm^<D-U* vfWJEoo])cHPr :}y,d_} by#I(DV jL*dH [Aw`Lz$A0#v!Vc8K>߉_Vr뭼׫W:+uaZE [&t-気qPʫ̀׮k2GXҮom]FM{xv-lg`I׵p9ԚoE_7=:ֺl]ArqFv.DžSGkp]Z֬$Ff|2nyM:E֥ Oux&ݾ6*ffv2i:݇O.r켝Znzu)o$W3Nnzpж&ދ#N0є¹[x H%c"J$xPP$s7t15YGngpBJr%=էf.n鮡K<< sӂiZ%ռW}d6Lr 0ƠP`ip9tVꚵZF04Wx8Q!+$0lcفYTc 'u^隷9#ð5E6]$:y@A?8LM +ڳjMچaB3\5P;@A.MsR__Ji.}&7zuC 7G{yrexZ(Nck>9إQ[F3Fn}H((((((((((((((((|[=kui bZF9?05[JZQKht& ޲o?viCEckqY+ tgi  $#ڡx'p`T.n9k ^k$Y`KQ!ePIMGhZ3R_i\g-H* w@W_gΛWRZj"%2ܤY|R*+ǞBݺ+nOr1?JX#l;@޹(^5z ,v\\!,"w}<,w~g]j.U Ev6ɧ(5f1P<):mb+/}VҤGI$[fRQLv ;`6_t='T{"v0Y4r,FƇ&'w\p۴ەݣ|.8fޛA޹(=)x5"Y?w'A^2%Do ZxC‹&BkkygPȾb)Mvw6; WuCkk}̚=XE4?1@BX),3`+et6FS@#IEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEm6}BKR9e+TsA @5j^g<c%$젺JK2z 6ወ'xQԬsG6v5 xjZ- /UҦM[ibA(͆/: \ARz }3N˵J $|XjT+o0M*UP𖫣x5/̗xW[ufI6T3g%rikNԮ -ܺTqI/":ygyF2}W#:EXuwiwocda2A(I .dqB}1]W4<[Xii;QA,p98;< ~[$L<s4 S@+.%'rl|.$k_FPx-滕DXy9?wydq ^Ep.M+ֺT:$|o[H>Bdcpv z//uAm텽۾Y!7Kg<5z$k 4zP㷑̒9\+o 'pD5q9@dHܺcH| ((((((((((((((((((((((y>\VSuh4Yf6QqIc[P=GtS.xX㳺IW!A yMlnYR#"fgbU29\hWzŦ:V0#BUamq\@-+{[_IF0KI>-G "}ÑAjh[_YɢY#޷1m'i,hCBzžZz6Ǜ+;7EUA8Lh.scB<_Z[[YN|}ٴ->[]wc [9'D.vTit !ZVSFC(෷|cguyG//26- :Ab %wt 9t 뙬|?ѣ.#tkpr[1Fá +4[-Rg3XJf1W#*pHtc ;n"mCn47WihmJ\nT2)ʄ?>Wgg%m2@&-&F/J< Y?u}Ҋ?xEյ(Ml7.%a͗S@[UMsZxOᘵoFI% FcbT@yUPY|GY Page 13
Première page Précédent Suivant Dernière page Texte

xapool-1.5.0-src/doc/online/1.2.2/img12.jpg0000644000175000017500000007327210235646675017705 0ustar twernertwernerJFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( (I-Ķ&&/C.cgbݞqqs c^= dZLA Nyae ;)^RO2ҤH*pU A*t(((((((((((((((((((((((((((((S}q~i,򮧖HfyHVMd یvW`TH a.~`4Cl$V!$$qơU ;Tv6Vnmaimm n'j(FO': 6X|\vۉg.~vIf_IjbX eR'aB 69 ї%i}gs-(Xt 2ᑁYn$Ooޅ>``[0(.(~aVRwiKnki FNqCc Xd0&ZC㈂|nBSfcFg9%`\`!ܿ%?e'ؙKEWfQEQEQEQEQE_xOwڿ.<5ݍw#v1Ѷ*=Ÿi?Ҿӳ%hÜmQ {k_bHRQS֓qxyV\ni_,+#luGQ>!5d?!; QxbX)|ĩ:G>Yrnߺ1_ u.yhֵ>M-,3)pnYf2d%OWjYE1 Y?9q ~+7|+B$3ѝ7%9xE@ ^Am$ec d dqZN+LӓZ׮!mNG2!eQnH0_ٯ:lA=@stJ9郞xF_\ɥHUc# S;I{*ǚw+KөۛmO(!GlGw|nX^({[HcWߖ:+{_G:|:ӯ I-TlWsm'Þ;=KUSb6$nب8Ulpk>_ 9]F,.cZ5H-2=>O6w>z\6଀<?ľ|q}BI.?^Z0 FVeV Fd <0;W>ķךV;#е 4}R=BͽhUxbn3GC޴/c6[y?Mk:\Z}k9&$yO+e`%Il5 _Z[/I&Iy&'B8 wWd1.{]um;nڽ"y_qK)42$HсVS 1xn8 n5-Ɛ$]F}0ci+O[YD4W#\$<2 wc5tQc+ (((((gwew=_77 I `YEGoop8*()V6Ww~S)D>G$$Jm|tSy$P7x!!ԵKkp8.@o1~U9P2Fz֥jz-$B!e,N<օ0hw:4zafL3^ o>x(z^o%鉨4"Ԧ(eNs䓜׸V=7Iy*Lo{(ve~_IOtKȯ,A3IpFHFcap93c~Ѿ5;hl4yX ? 90E{%gd0F#E$G$\ ķѦW/$XDNI$I'Om{+?&WwQ!gۄ_8!1ki^ƿp!q\oop8*(м)fmt=2 ($r͍'r\:ݼ˩M]30LzAkjk<:Kuiy56-+'$ DӴ7m琳,rijbOt((((((((((((( ]SNZl~mה1)fP)w*I ۊ2YLK &Ņ8(|ӆ8XYvrYAwk&7_籰,v:lZG}1xX۟khnrZϣjmƪ40;G"͆FaGv v}Ԥ6^cŸ5/LC|A;F@64NkK%)\ gNg+7Ş57,?iW\[P#!a翘\i]Z; ~/8fv 02G;Mմfݮ4Br%*8%I|Mmo-;FGs=:fL;3`M&Rn+[dx.(I1ݴI/moqkso5-&-/m2(޲90HUp՜]ZDg<1 w\W9AduҗRͅb">~rN+=֋c^Lwh%G)9BdC$5qeG]&ƥj˖3$Lhiaw5 m'GXbTA5OMNuhwV|żR[MrTLwsX~Q[Ǔrfiۈn袎IXaO5twe0+.tVE Ӥrpeom9|wll?iHv߼G]]jK[MPy4HU@9%8ӎN|KqI]> ft>20F>b"0uΙ֒hWcV> H4$2\GeD!n Q3VdMBѠwKe+ ˇ9•q;+صp7 r}?լj:e+}LdB腍%d@Lmck:ktךP|$K䠑`z%7:oOKmf캔Ⱥ;lmv3eCZ4t!ib2CI,nl.\ $x<:[[q\jOeȠmX4Oߦ܁gOou%Ife& XBXd`0!}Ksg/’\Ό 4qp%N+:ݶ 3ȸ="_=Kk ;1Fs$@} isͬRⷹQGb3-Fp̣h>a˫ {.;h<~~0K gr9;[SZkA|k]ZGp),Xԏc=1Od[XYRʐ/$PK+݇ <;76VMբjEy.*"̼|9r-wGVc'~~۶ٱqOq~7VzeΆf0>YDl(YOm~V]h[ml켨ln̪"L>z~%f"}ݭ8^ =h.^zmiIe9BNaõ5zZuncl@<9Rùb 5Q]C ynlkHSYdK{!gv$y{RlHc!Ezs3̑K/UVm ;YNbz<-utY Ἠ?LG(((((((((((((((((ǾՆy%HȃV"Ht9ֱsˮ[j#O"&[fŌ$!!\r8簢9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (Λslx#nurCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (7KszCt?{{ǫ9Ct?{{Ǩ7Ksz (/M,mIݐZ ;x5EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ\퍿 >ؘgy,gofGY'i\{ _:voŸL(/ndT3GmyIor2J +k~aOIuehCkk,yyp[(H4K6:oM,f`XtWniB^p'{K|\PUTju궶ww6R'Y`]PH(UF8$nQ\ߊ5˝.W- .;xd.BGuY_v\peV@jج[jnтEtW ŴM61N$F-"e 'i%VwioZO=躸c,ʓZ,R?brp~~Oɉ;+ީs6- vh4F d.Sp>coؙP0K+!E^fxL;$ڧ(Pn dvg~%U>(F[M]XbrA,.(?khVqp TvbVWؠ@w C閶uoz]]E6 anv v3w@[-jAco[DQ"YDr4!u*ky91W$' *E-tQEQEQEQEQEQEQEQEQEQEQEQEQEr~"KR)m?}--:@Y6%j3 5ciSiog]^qvZ{<*Lʣ1v 䚭ޣ< qޱ @2IIhS.[VM(Ԡeo:ĕ;#+Mڭ<9#i@m8eh4c4O 4Olo4XHܻ)$g J?'͹BXPqw.Hԭgk2|VB?0ݸq&5YnYO͂! u] p䀠I7!gQԬQRmPgmB1;WlwV&o]b%@IBgrf)A`xyu|Na* P C67[xMK[(.t5@$aHNE%PbCUS3Y(wIg9s W4$vH-wI*0UV+Am HSCZC [k=[đC.HFD5]Ydo%&El,9R8nӕfViy%㫋PAi i۾B7_$|w}uM8I%zbp$KW n]v^=m쥴u\`Ekw@!@ dbE~ ՞ $q 0  o!@6|n'}J.l+O$,19 6$-:0V_I>FZ5[V%޹lUeV9,N6jVqz؂D`"2f&BqpE}7št6wi8 ;%ՀTb#!MP5)/m.>Ζ䖸!ٓHسUmXKv|drrŁ]1X+۔}<՗$//]rs(#+5T.A 5|c}6ik3D%KOܼ nrvGF Pu..b{s[X^ަ55HD)9Q\19ST7j~c$O-uI6ȱw,(x9O/-bGm'c !4eep"!W2QCZM}qM2O8UYmcRĐ6tf~oNc%K9v5_LFg}|)sBv aj+FϣyvZpq)U啔d\.["LӮ"X#)xbpv >^Mմfݮ4Br%*8%I⣸t{Ku[nȎ.]Il:uPu/[6m,'L`KIZQg FfXƘP0cla/:]*M?&>Z3c'}.hɾ+FD򩜑 v>IirLiJ*+rc@wZͅ6]OteZ9DddSm!| Z9˫Mk28Ts@P9LIj]j=N'QG  $g8pIQu)/n,lZ;mNO.# C.7((C M[OmFWD_Z-Cr)ΪX |zH5K9,N5Ufqnٷ3DለÕ9uj}O70naG=sn`p0'=WŞTv[3] `qҀ9f?J&=S[e7ʮ۫Hp̪,@wYڶb-$ւ/h &s~A ]O,mNghU`C!H$u }*g%|#Ee$曯k6jAue5Zg]aF #d-|5 pj:~p[{hnlM+̊BIN?Eֻj7|#pܻXHQR_nBq26U'#΃> jZ \VN .hlS$QI@?9v/bF6r^Z=I!XB y]Hωt;x.6$H$Y\1B 8!9ӎ^jnqko{Z[Ov-eF9`0=Gek?71_[ZMmiiӼmfi%12bϸti_Ҥ%|G~'o$մuHtu D&MZ4%uL䏕{/ZƝ%ޏsixbX q'$`΃ɠ 4= uf)" rc8jG-,hz-"y~[ظG,%ԲYU$l#մٵI G!M,eELy#]QN]Vů 2>\ࣃU câkh,?gۤ!ڛXyj1<5OkmlgG$e.ceR[r7qkڌucq}:y#v#sօr͗5M8ͥ [\?jc8eIvY.c@nZ<?(R=Q!mv@~i77ȻNҊÿu(5M! VNeƨ2HFX+ ]\:m;{@5Cz=@d<.1HvnڽԦKK/gVXdkeM$## g SvMwajdf乐K6(6R2ۗ9? h:].YCP#di1`c 2Svߵ.\į_iZCdf<,3G#O='4j-"(cR2 f㽳b}t ˟V l0I'f>|fvc۟T{=ɑ|w=USr7YEccXKI⾊PT!YRHRNJ֮/um%M-ɒ%)Dv ?"Q@7]XxFGD|!aBYQ$;vCBX}]fo( ؍: (ú# tMrSl$Y^xK$UpVi"<|;o|hZ[:"|17A]n-n|;jWäieZoV/> p*P2[S7 Iyu<]K+6!]îgEQEQEQEQEQEQEQEQEQEy߈4iյ|@-X`Ke$Fai&0C:F< /ɯƓ>m{o 1,*dmz%z?e5$fͨ-8w4mE$q(5o`ާ 隵[t&7Ȫ7w;T$ʇ(_BK1)J8n|d 1ƙBkj3k[B?(d$ZA WRJuGYg um%O!x0EVa`y)$8RH"h2Iw\yvCaG,@IAl#+/KF݋ aؘ @j)E$^hׇZַknvh&iچ_  5;ֵ n-LӁ *#1@{(ԥowmMki"Y[C(̠8zЂyDn^hv݅ak pʁ 0xNq=Eytٮ|y}5:1ť&(\TmΆ[g6#tg}n5+xW|F V]vBa( b>0&o\<=xyI$ kHT"f1dTE*[Pt{MsK{>)Hx,G(AcYS* 7tPhhڻ-IەUy`YP|oӏ,+*Y>>3^i-vZ(g[D^2D)CayU8ePLm5I'P$a7wLрc|$f=E>'MOL[K-9 dKdvБ ̑]ܹEqlڦ}uwq ȿhaQƥ]b7c= }$֞%[Ȥɮ0Pi˦cْ۔zE[\EMkOb܎<9\̦Ay =>}pP.=e_yApۍuk(;ݍ_h9C=MU ;f8lQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@P66fU˱a) .0NU= Ğ$O jQF^Ȳ[memHuapK($ؾPFkx#lxU:i$˷z' []/20~#fOid`_j*iƢP3pee@#2-qMǖ^%׾c[o\J\Fd$,0AM4ei ^2k,CtBHWg.++d\U"Z^+k+A6ZfCiKJsPhU (Sh%Vтh<ɈF BX%_~]aYShl1+^TehD-}VWeDtIY%E."R&d$PI'aj?ڟhҼdz|z}%҇<;]47z0KF*H_&Q}<i^fF+<5{Ǹo GYUP¡P0w?i$ AkQꗗc$q[Di9vgl@A$/]]iOߚiɰUhH3Y3!VĺIImM$FnnVܴm;"˂C XvtҼkokqq5]c)xݏݲbXU4of?Fyc+H[]4@ o(J#?'PK1%K--q2~ ,$/ȫO)Wx#kHy"c^Tm2"m;+b1oi\.YLT*VUp0acմVy]g\Cxi~M6HXvSvA]Zg"mC kI%X&'FJ'3 *vlb>ϵ4p[~}av7yFK7dwqK0] xb;[٣'9d;rH 8w ]c66Xu3rDA^UH\ʣQJhPI;}.x~k0ifAo5N]BJ(ݓ WI 7i]{yCGhQpAnχk\i7'&YK"@ \iio|@2jd)Fǘ<FmO `%.0dN|Kq<[oqsA*92<G;XZ}H%.-.HR`ZRːw|SC/W%#բkvTC G |2i*wZCۥսIuuۃ\,%T6Aϕrw7!m+oدtfю6loݻ'(x95rqi~7,uƦDKvh]m؜7s$$ѼKm~mB ]ۂds4,5 06F{rApH{B^ztᡴKE.o ̒@RhHYw$ 7ر<67G.$i%-$M 1iP `@uxF(`//U 9@(E ̬]|^k?cҾɦj hc4(۹W1He ou++/.;`v!İK䓂yR>WIGsjRǩ}"3ѕ"E$rbXi:JiQO=̾uwU!TaQrrI$5H[qc& xfy^[";Un Nx'Ww61 I#IY^Yb" `D'%? _Wo1oyo[v>6*KMx/,@ѼjD& G/1uVL',%`U3bKYT7jm'\i5[&{_-!&>#q(* r?ռ)[!Y鶒t%yIYGC򪫡 B/jwh8V7cs!%ڬ<" 97Ʌs6zW74W#.fʒ U}&,j::*\w b2F2j$4 kvTzn-246+)6HyÍͷ}M/u6h&7@QTmlrBhZ']#ԯ0$$EykȀ Z"sA6IO,ij[#FMjR2Tc*w> ~,}au_ ǤZyڄ&WE&Tm?)-#n v"ԞO躓۬6 VwTBXr] [G"'yky|إS*a(R px^ OĖc<T <Cj?ܶ9 bu9##Js2)Ð pO*T:ťյUtTv'x`͸ 5MjUٿ:uH핊!#mw_OPonnƯ-辊QQ1/L8~xo1O'4{MU֓[=:2.A&^=JU4V{hUmE?1 v|x IKkYI#YЙJ/Xy Ʃ[NM_RnR$N]2c,$\T6(i't@,C9 =(((((((((Ģ-Q쭴J!c)o$ ÐDbʬ=x`ZC56r%HQsY8A&D{A-toKltee7!R0 H/5.!MGe7ƭJ۶o"5UUv*Lg{Fx`֯t.X#)6:8Cr[kjcq$|V/5n lViIT&0岹zxKdM"-ۨ$tA J x<bvn[̫ii!.aLeJvTQX wv]Y=F{QBZbvV @HcBֵ[Knmi.m/f.0ηn1fdtb]UQYgC{O}7sڼ Ƨ#H yf,,P J0;JnEq~0tGA?]K3qi&mǕgV93f{{o èxv]^Ik-M638qcE!c"nV3@Ex^56n'Oe%oa ؿ |݊!9*bC.W\8|T56kfV. y|3o!;K{Ow҈ʛV\?Ŀ>yXvžv6+ $D;076xMΏ-mXrѬUc%o9^mnvGkD,@Q\46+_i1[r,t;N`:&g4uw,: H|0/ޚ~]Ey4 L,^j]\^\m{ۄJ@,K9<_5ג x]ޢƱضqM:)mHQ^?ce/?$֙by,Ṅlspq֕jŎ~}iͪi\^hTOd*wcm[kDi8eg0~ݤg$q9Of}_G$wzoJ#G,vT#% emw ^;m !P%+]@\N]$ә"-vIx=o92pzχk6zt62Ouzm xuV-4+$Ռ%T:Ā.-+Ǖ.h(/ӵ/h^ M&y67-f̅P,wrcez*Zj$Ѡ!\`|HZLy$LB=Ofˍv4z(kRDR1D{tAU9YQ k$t-CBեM kD6wQ$K,ivh([RҟTBm,mx@p>`~tP#tŨjV%3dbڝ܍n ]C弍O!d{e7w]'%w}fh|:4Kn,T_1\זs\.U2(6cьJ{Jۀ="Sӭ-nI}nFd֬W']vo^[Y wsXC+)HKK/iim%*\pA. 4bA-5]r*O2<]a!BI$ ]pڭ5+,zĽVm2?~,ŦF08 pClҵM [|4ڶG FYlʏA1rlOPuWiA[2mh-qdtbL㼰wk&vMHA |GXfRM֫][CwpȲۈV2v`aCI;Ur|KeXG^jq\buW4H]k9 k3Nqu6>=ܾFFЬNz`\m>m=춎o#L Xh=tH6"%j2m]avڤm-Kq!fXc$-. bѴ[{߈zo93d 6czՃ-[5;:Fcʤ }$ zz3_k O+U!%б &I*1W&K3&.}0.95a1/m**h,tkKڭk?ec4m HNΣ F1/QSǏ/,8"Эn㽚?1d Cmm;="IIeg]'e7xXKkf6ĻXIxOzzk0]܋Ne%6R(VIp Zņu[u=*Y. BPRar+@EyC/q}mWFQ͒k*ʹ6-4MF)ƥhI$b0XJUAE FI`XB((|[=kui bMݷ+.z15Ż;;;3%%AnIEeǴ{vxkr˴ݺ$d u9O𶍦E6~o/p )fe Rp2x4;{H!pA=ijAnLQ;E(h`qW5 TYw2FJ>`xfB?hkh5i?uHs%eq֋c6Sp6l[o`r`~͈4]RS8/R4x2lؐ@1rZ wVk9lG uڠmRA+R=.+K4m J6(XĖ$ƇsdדPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEr^$nXjU&s洪T: $Ŏ6-[d=s[AkM FdFh] `(~&([4*# *)E- ÇSс5iyIݤv@kY~ٞ$ wbPX3#w ĺpAoq\F*L,oת`ۃR/t9[.M]fʆG>F pQ\} ^-'*{W .lykǜIhq&ơj:柢xlv,q߾ea+'Dh~|@'%@: +X-;+d+fWٶLrE9*q挀P(jƗΆl~vѻFlFp\#^$|/G} ;kݒ,2ݠs}5fm^;K=:sW@8P1f F0^Ae#oWɵ~O`;; +mkZ-ZL:[%XorIPN!hKoT!V!e.č#v:J+š-'S0H\AD](8ؠjEi?SڽPϧasd_~ֳۢÖϏ g0^X>kȠ7.UB+/36twvڼI`߼uVS0?0 0bV7Iy*Lo{(ve~_OЩ&9}'þ ӵi4گ)$YY,,v)"0&mvZk]v{2da+Jҽ&(y.ѝ'Y :OA<B}Zx_JH0[,.0A;zt 9}&-R^mNRͼl!.&1mhwvr\ּ*eյwLԵH5VmiHJNU@w Rǂ8apgY˸,z^6ncv88x?M4&0Yo4߷iDHb12(،ʠf;-r_"i/尞D[׺12 KG,\ImA<B?  h?w:ޟEZ[Mq=ŷUѳvH,/&{2H" AB_i߽Fz +/OЩ&A<B{]c[Pv': x;7Q.[1*Ĕ,QNJ5;WE[}/$I,:QVTCOЩ&A<B|34_^MCC#XOm$sYf$EZ.q^麆F6K'l1ThTv9  4?C'T]@[MMF[]5Kphʯ%X+} 民N)~ȭ'DV8YVi?  h*h. .α}ytOK5ڸ<#Fҫp{Mī{/ DF&b{1(:⻟x?M4 4?Cx!_ʍwѮƥ̕\ H:*;v&&I{%).dge'ec62X|۟x?M4 4?C<ؗzdxuA,$ rNq [Q3>XೖK;G\ѱe;%%G {#SMKAlc?8#($!qr .AUiEpfC5y+%a,EmYͶ-JX]-57Zֽm&5mL1#l ݷ 4^Eq~KfdX{s9(c]E@Ae  )ίQ_g-Vergqq Z28 (!GHY.&Q|$Kv/$eK)vJ}ZLYxhYUHKL?(n9 jVwk2,p]ߵy"H01 J!'=%PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPxapool-1.5.0-src/doc/online/1.2.2/img13.htm0000644000175000017500000000063110235646675017703 0ustar twernertwerner Page 14
Première page Précédent Suivant Dernière page Texte

xapool-1.5.0-src/doc/online/1.2.2/img13.jpg0000644000175000017500000005521310235646675017701 0ustar twernertwernerJFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( o|v.XhZHݷBF2Qt``uҼ???6ހ;i~s{-cav ?3t܁E. j.Ҿ!6_h eWRǧ;pMu Aӵ{tۣxb(ZdrWV|B>; ph" t}7͛RZ$U) A)b,ْ=8'`u w뵶+Gm1޼é"wh^'h8,.XrHU`, *Ttw?±hhAN^E1ՙGy@w>|;>3Oݹ4i42) [a4jĺΏ}Gh,RK4\)P0Ny5_>57.cBR<Xp9$`UpAL(((((((((((((((((((((gwVrJ1n35Q@޵?xTR-绁PA ƪ!T@F?xYcMBo @|3r<]%~ 5-'RK5+e~7b^Մ:Zp]M)v;9d aH$w9(>o CѤ 4J$\;pyW5/կ-.g2Ym xhPo9cIѵ hڍFWpNF#bg#<[P/mmбi4WΖ6$ʸ@4=gTTB$T a5]+T5#9x{LО[$ݺ$Uv$fb8㩭J((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((zB^]ZeS P8ܱx*F![mg'kuM #r0N# bO \=] 7*!I@%Xi((jd1ydKɈIf0zQEQEW%ܦwF:|ǟO\P( ( *9[cHU I9I@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@5ΧAWMsziXK+|0q >Tl`7J⦁{,}KȻ2ZJSND#3&p!#~٨}Jf~l$2yxflI;MPrb`tWP=BOkw6m[>k3*mCޒgac"OMPj%ײ^A*,0" +Ėg5/EhlФ_*3(W^(7.>~(}-7a73|>+Y6I_z}5&Wedvylv#%ZZjR3=iO?]< k^]^I?#/4dQ9eF< {{p-T?GlK "@8!s@~ o]GmAbXu >-Lhu_xT r,V,i)i ;XJ3Xy;\tJ'ww>yf“fߴn8LP[oTE__mQvoymCKhȑ3#2UvpŎ$ߩw7=_]Rǧjnm&(sYJx,V3*I;,+' kx?:.g&5R]M3_0Y %! |I宔NiHdfلmVNHWoFm/MԵ+7x-Mw+ɀ jjڲiQA=̾MwYTaap2Hм xH?:[n76@\ƥb+s ;GY"WKo.Q[9cF@f\1R`R0IiKktKZfCm;@exBB`쥆,/ IH[BЩ(1`a*;]:Q]f7m œj<ryOZS_N%rIO$0d2V!OA h~mE]HY-gI`o9P#%X>%V/[E:\U1 IX}vV=$ wk aP$'>fGv%W>uKh\># ʧkYBCJ}$R@^-+G+ZK֏YFRky22h:>a+78,"WDW>2?03'*vb2FミI~]_]xkSdlۗoH#9] 3yeډV47$bqPSzԖ;PB[̲ AIr8Ϫk4}sZ]%mXfyrFəSŤvvoY.R.%m`؎nz =cĺqvm IlཷkiJTB`i#aL7m41+L;d/8ߞ+SlVsbmmr9*HQ}@5[ki?!%ƙ%bȑAfU!a9$r%孜z]'nѐHt\84._K˶d}GЫz~Nnml/tt8`HomX&⬤aoeûibT[OyЁz$r`lg_AζHA 5~%f"}ݭ8^ =kmuOgo_>uxU>ΑmbV6xA K-7 ӥs:4EM"D 7|PoU@F , Λh'mūyE܊|%vJukaMieiapni l M[z08!6j6:EYKluwf+OpU= ?Ƨ|];GM̲l'>hPay@䚶 7i2ovB:2e[8#bdvCCfG81H#6@8烌WqE'4;wI{hYR!q\6X3w<7$:]ln+cg 9>I<s'jOg+6<Ȳ'πnoŬeBbYfTF9#lH[ hvZ%G%[s`5҆`AsIйU^/&;LݥF}#[PҢm *1ݰC ;+صp7 r}wGձߴ'uy}~ot]r 77Fvl4fd*fQ kRXS%"j{fy@J]됲{+ &t{xU;{w{Xw'P1#9D|V? }uzgZ}IWմmTȗחl7K$c<|#"L(u WaZmO\^hGqnaT_1gH.2[M[mB^;%|e@$eb;_Nӗľ*MȘOa@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@e.5yQ 1+È(؂O ͙-fQ/,lby$~~]bP' iSh/IGs.#L"m^Sӭ-nI}nFd֬W-WSjzޜNdmX69q b@䍼I9ﵿXMk,&NYbXnI<9 j3X,(6Smu]I_kwo$=flbK(?4F`o;z"[|n[s .@_iϊhf{ZQ<!e]b jYϦE_}1bhU6 |% &n9MG.&7XvZ澆RxI۔ܾmԱ?]ZTԟHKہv9aoNnV7Vcݵׅ.#ծыu+m.YY[0EzN]k'u(rSr2BHMeE !($ qUE81\^iO=wk/$Lм) 2+HcucU5γscb44N HW/Oۙ3@kv?mQq,"bj$g*܇ȡ@=֬-i\DFB ]rG_ txtQKkĩ48|!&T=W6Ҁ: +˂}Al k۫DΫgo%z6̬9J}Gm"9mRS^( ǑXdȑI#)^Ofˍv4z(i&]l$eNTAQ7Wְǻm\ $gr7(sau^íiݤ1٫3a"3<2 2ckyzN6hɲ[Dpόu ]1{Zśd|sc\&M8x3-{bE\1|mR,ޏ uhd,LbFf;SN"˄ qHI77q?TiO>(͐nöG;ryo n~(}Q ݇lvS\>x];e6%gZG%#ݳ`y-ŷ`mPyzxV[+-wQhե)dbdBAmd #Kla@4{=cG0jwO4]7}c=ګ'Gپcnq_QxJ[?5䚜QKH <,q+)(2WSRO[-PdװYy+Z6V#!Or {Ғ="y$k xM|@Q^+KRtdCA $s?\ǖ^HZZZXΒGc Nes0)7D+ 2eE}o,3=*UO(I!Z) LvRDBX9{5v, `F9\]oW>ZXf$QC\DKFzdko-ıH^I$`I$X[EK-$E i(^6M͏$2}X[y]-amǗ 9$!sP?a^Mk7XKd$̦@2ϵ6(]CʘYG=@L t? FWE]_ r[AzPǔt0f, *Wo.SϛLS81G*(6% q*H ~ǩ.dq"6 GFe k. xV{MI$wZ60 mOCA!ȼAqdL6>T@>m+m!vM%KK}4k}RJX,o m5$?'RŰ;ւzi/=T, |1''[}bl /*1ș;W'ԏZ :\\Z&|Ͼ[EAcsm|?qY-zv khćP[k.>xsrCC:76qyDdK3'7nMZjI[jx7& E%v4hVp6 wۧ_-]بT)!' rvfUiiz:%v'V1O, Wʷc iwNMRkI.a!x9dVa`ɯ]b_n4KpdxGd.GPq^Kh4MDIM hD{%R9 ɨxk­o5ƥhy.-F,0 1ga:xEgm{ Y(𨊏H [$TҷgjRi-ocheU  /U*Y;l,ZA٢0A0TgnQqW^(ORփ-ƩiӪY.RV p qN=r&6uH$Pf'6ȌJ˻p']&뚍G5YV!=ԐHڄ$r v:mt4H!Ugp0rr1Ma~c:RZ]Ϧ\Ų?4lNQ&&k]_G$Ԡi%A)Xvsk]sHl<#{rombU[Sx3/Op2 I7o:? ܗ|:!mm& 5tf46x$7K` WmvB ݰozƽ/WԮ= |/1ByacFČ-Qm\9zKH%޵uq0!PU`? gg?}(3w7cr-%[ ;IVGlכ#~S( y>]qX5bWe=Q2&h2 q'"/g}IEۋ{JDvu5 Pd@K!J9H*QzpޕOv> uV( ͺ@bټ0Fc ܉"Ե}WMA wP۪cOi@HTG@+oi?v[HwXn/FM0w&To7ƢͬӵoDQLK7nT(;A9((((((((((((l.u\İFBʁm0o̾ Qr9oUFmD18>X& z]\9.d Kن[/Dwo{J}d;9;cЅ ķQծ, 3oe`5 Iз $ G U*#1`mG={zéi-q˴'f ˓@x_ICѣtٶ%d+xoUZfDԯ4dҵCkp,e&Xۙ؆q/>!|Xͧ};^yYCnJ4#|T;ni洺94ˆi)့AbdC6ѐPx6Y쬼JIoNVM˰v^n'V>Ѡm <%Ʊs Ф2-˒qPx!(T)$r(eu#x 1XxGGƝ$wf-8K$m\ncOkOovñk0z]zgh8 #Ew|Eunm6k{d5FtF" I 6I>q-qn$S8)pm}rYguM L.dTܰ1r@' Ėl:{IH\r2͵T 0:('$xxYn=3Ϛ'HggfEE ! ˅o/a\/$ki䈆e,\R7'LA+":ɝd'%:66uvpHI%I,I$I$.)WL>,%_#VtxKFs cm-ħG} (؏ׅlJi-u _ h:u4;+~k.֔G!^ Al潿K_I|>vnԮ[lC9l;gwU:mdGE!ß#=20z&\5mwu 4yePp+J" ZBVP {!̽R/+6ߘӳە~sGٽa4p]I@z ≧qFr/-cgc(C4EpU짭j,/Z݅%t{F*#i |@_5𖦛.6+YqHʁZx_I{-Drȍ :3vKN$9 x|]S&Cx14;cQ|C tXd$Q\]K4' 2m}킨sḕ64 h>.ggw44 $9,z1KFX${qkrO#$C8C1Lr͞nڥw{o-58I3wv # $:۴h XbѵO%^\ÃUAlm3̷|n.o1+ue K M}&MF?iw)l/?J::umtO#mF"W(w(FRtBMCI]B]B"gxbC*x)p|#w,m#K};c#s7`İ9$ľ aӚ]3òj7itL-W 3{UJOȧQC>0֯ag&)Wռa c 2OkOovñk0z]zgh8 #Ew4[-#6;I.ss%Čpfm,B2NixCCI[I#Coq, dF,(7>7N<tׅ3iDAVdrQ\K2+R(Y TH2/貧8I,ecel'۷J~f8cw5Q@zo &ݭ4Ź6DƱ">|Wظ{[EVkRM;+tP?"3iaτ1G^G%)>Ch_ +NU̻"kXl\F66( 5e ̲7QHo.ҕ FߙNѳ݅~ hMUW(RHK2pբ[PEPEPEPEPEPEPEPEPEPEPEPEP>C_z.#T1Hz. I**aJgmWM^4ttvfEHVU(>ƝxZ=+BD-ka 9|/5ԷɫNDgͅD[%{am }vmBOǾ?N&7\<ùoHKxm1pdDG~E;~JoS6[Z oބ cyKȠVSs7Ϳrּ>ڞjvQ^Y$$nIvhpV;V x;Zx2OS"a8,2XO@vPUȆ" qq6K}PPvbFZyqCDpfXU!Y%~WOoqEsrx^mP/Zenm$YdQ7JF &ڵse6enmeڬIbGͻ8=o>#5-7QVb1i?DLR2C/[oHKxm1pdDG~E;~(op2mw.%-Ē 1+/˳r((((((((((((((((((OiVj2HȺY[Y09]~$q@Q@Q@Wyc HA R6;nq@/Rt,AgFW|EoZ_nFP"QI<lQY.oi'HLxoh*y^Pp}@a5[Ɇ7DV p+/K|;Oo?>g&~˷3>_sngDWx ʬHRGP V}*J[i̺ݝ4{ͺ#1(ۇ_nJ[g|?jSI4gvR̂EibݒarчdEyŮ|U?[$) eݮؽpIG~6+Z-Ym[Oxn##,lleGMV'دQ@oKewcU2 r=U`z_E³ǫ;jKÛ>Pb|ppOWT^X}+0il/ڬp;{P_PhܱyOog/yW OpGg%-8=֗e%f\7 dT:E⏶`/?w|gSٷyخVO oDqGx4>%*r6LyBK-Y>R}2 ặXTeu# 8 sRP{xLu[K-Z[[dFAdbic4yڻqoOyfwUuoż9#`FApA9?k_$%[$[XR8y,b$go86F+.MXdv[T(Y+7d9,"+[fغ$_['Valɦ#o\>^A>Q<0),"V` _SXv_³Xkl#H4D<#J08C"ܲ7Eoo62xMs6p+2PoePoBKm O \]Jd9X-@'F<:fGw:Yj>< ߻"5vX'd$%69Ez_\Պ%[8d̝aL)/'60x]Ml|4u9^o kdy0f 0U{ȴOw6"i6rckSdM|FrQAJHp4꺬wWF$ڙ!Kc',(ܠ#[HӤxd]\cdg9P6ǔP2Xq^hڞskz:ՌWg^ڮDV֙p֗! V|^E6i:}Nb6ѳSHd'\K;!r#֯A'<*`捨izH`}@$sր<ŗ^T񖤺pxr߿K7@U qb Ҵ OMJ{{D3}'yU^@yLǜb@G56]AkK"ɕ/1D2m A`^gC˺P{"AZIRdDݜ$+xmm常8` $Q@$_tkIm6-Cv"C4#FFC +mĖ6Wڭ[2]Vkq#D/٭dVb]]U%K`|?>W.[yu%,%ivb[*>3-h!@\+`X2{؀hJ( ( ( ( ( ( ( ( ( ( ( (8}CR`sE4heۯlodrIϘ߸`T;[ Kͫݻ^I|#J52 s!_:v}C8if#;,L2#(F6_V/otƓMRխM336U۴Pk:k?ۮbXecs#!E@I7@8 Lqf[bKo*"&>b)$ڥ7#Ye 薿c}`ݩ\ٟ̇vr#~>v Z]>g4rH;o/|;jwAqsi,&0oے@HdqXNu;]>+h%o,ϴUdZ:ݏ>V q\i&O,'{3bd'$~Sb}ZYVkĐ; h`E۸i&9})5-#vF>%0KF,px`6$w_XX$w_3@,H mѼ92^c_y1`T!8+;39r;i^myg\J őn \P;> 3ͣŨ_]aw4RMe4]l[Tn,##Ik oGwi>ԍK&7,ӗPcPY1``fuq,4OK8D5nVH#!FYLºVZu- ϗ4n¶B(Ny 'zfoEGviMԓẠ.7H9q@U8(Do"UlpJ 푟Q^wnMA)[ZLi0$-nUH(%oir]C6q̪P* !*?1ی{f Stm 2$g\)# Hc{~.Qӏ]jSVL a#E' ?| $nckWqj>w'LdRI͂U2J+Vߦo ieEʲ-YU1eBkSTҬuԭwGxdX\r8xC%ƛc.y,ݮM0M( s"F#SȖQ(mRHPVRҩp9 ۗS]>o4{4?q$K#I$Vu/VRYD\`/&}o_yۿngvv|w|Ct뫽n$5{IH) G,i5;MWfc\[X*nэ/gml!ow,3|/Q6X`jKiOA$CJpq$) |Hە`H WO!q\̀E(CgiqNOk⦸8 I쫞ar8ARYMy ycI$pM* ]|@rX;O?*K!bą*QB e7'S\J΍ɍ$evUwϠ .e^4j,3KD67pH^N@?Kqe%@VeYFp8V61sxYv[]$7ޟKT NP ;'yLd mִ.HҴ9u3:]rRw3ۜ6р+&/ #H亚0ՖM\rrۏ4[YnmCOB-% +0UzLԣK{0YB Gq<' 23ADteX34|jYmXGQr?d`ʞ-@s$Ry K*) `mwW׿W[,V)Ivf6܄_k::K$7a<I#[TCar .YEy3|?r~3vߓ;TsCCK5{IE+c?1a"}W|lI|E^Kki ؖ7vאi$a:ɸmc)u5uRJ F&$nmX.Ankvv|:eжiKFEB%OcawyZ=֙,vVV8]q%CVGݗÝm[}2V2ۤ]ېBXnO#8u;_iS`ZēFfy;J| BSzMĺc}ƻCu! L*6DWd` Page 15
Première page Précédent Suivant Dernière page Texte

xapool-1.5.0-src/doc/online/1.2.2/img14.jpg0000644000175000017500000007133710235646675017707 0ustar twernertwernerJFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( g^Gܚh e@\g9:J1}sV4KmgL$t(^0R$R2}Np.@0_|wq`MնҸesP @$jj>: 'g\Ǘ)۳o?{۟?6u}y*"ɘDvQ#|n(owO<ćL((,Tsܱ@,^ZLȀ[nXU;sb> %0}(Ԛy86b H1œ?>&y+GY.s*" $@2tܣDžk &ob05F ٜL  \Ѿ&~!iq=KO{:O)+yh; `XVxWKEX.!v7Xm'|`>þ VDS:ma[WZYUc!KA !Z=nGRjL!GC`AD6PH&SZEG$]@0+_8}m&Cѳ6*I慩m{Lռ'֑\[lށ83@w^.6>Xc,p(%U#\#HpNOJW~%t{2;Abo:\)L66 yxS8 i\ϧxNKKfU#;񜺣cie ƩU^[x=LAd/5.eI[[qXտݵ#n1sCjĺΝae!\[}!e\nP>fH ?,q!;8UG=H'?W%:+CTxg_>(/ٺޛƅ'+_@8ap^~_Z~4> vkR&GM{jW}o;t/ b"ea@HgmhbFj<'ّU1]D4KP/I$1Go 2l*'##1Ѷx]KסNDtI8fYK*A7"!94k:{:^iU B)eG9`7_Nj|u KyYR8FDR0/9_";/,zcM O$!*8DSpr@<_ ͧm[K/fe F<(6W8 Sy>Oۭ"nٽmqg+f4v;yQđI]섌+s' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( }KT.PxĎE7 dm\IEszo7x{ Vd(o. h۞H%~ x ״/.H)z ܢ95eGqN\(*ĂAQ5]:V ˋdBy#ڥ!pӁ ^6m^LF9f㌓qYzOTmOXc#JIp:n2yQ@l,8- ;!1.I' 8$ƹU~f|N|5Q@z4=gTTB$T a5]+T5#9m TKI5T)}$,fWb 'nQ@+ yf a|}ncݻ}|!:z够"wp\K ^6R9,i4' nq<<]I8kR_xSڤڞ[J ݟ/q"0Cmn ?~!WtaKWۇo8lQ@*Hh,-̒r.yw8f$X[u6Kyɐ_~V8Q@޵?xTR-绁PA ƪ!T@Z4gF]'TP*2JĶw$5Es?#HI2lqߔFqo Ae5ݵɲ[kmFȒbU@$SMuPpA VG  HB(q((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((}JQ4Of6N}iˍBђ\0Q׏[=BOmQQ$GH"Tt=05 6a'k;ȝgEd+ےs x# W}nuU~-Z'!8I&d3R`K190&"MN}am+Hn$Hە0 ϸ65/[?..bPo/%F,GpCk3]18TQ%\mo&9ԵHH#RHvȤ`g ~g٥m|e7A޾_*p>jԵ~u-V]!.4x"u'Έc!in8@vP cy{ B#]ȲLHdm˔*dȓY|Ao iiiZ\)W$f˕$\ Z:Nj4/Y&+5ՄfUpA]! MTOA$Miͪ$ǔgV I;$oy B #ӯ6(Io6 Ĉ0qV+Uf-Ŷ&MY a| 2͍D M`o+^Ǭ_j5 -k[P*#*A ۴vm/MԵ+7x-Mw+ɀ XJ5D:NŹc'+YK I"?荬A4'0[Qiymqes41L$S(Ido,yQ%ܷv3G6RIl Ql |kw#A+Aq6c!# r]-CF^7_8v=2 ặXTeu# 8 sRPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP\η:vΖ\yYe2(V  jZV27Pɻm,#Wp71qڌ#XWO9tuGp$}IH[H57I K+Y59NPQ+`ѝ. yl ʤ,S\=(4}YK )cn.&*hL V"26$#Wu;wcGEid\Y1j.NQlmgpF:P& ۪ZBA%| T!{7EѤt6DK(9'h'#7Tc*x?L֕Y ]Nt.yvI MZ=:ּFVc xHۄ~шϖK*'(,~c%7,̃/ny_6wYp5O/YӦ]=9V0 Lv,9d.N"7>#>h򼽟gw6yZM#եAs%ۼ;b2Xp1.fvs\yjDF^"TJԗ/xxX\i R6d1;nko(S$?8- ZMaK`{x.|H$Bc8f :mzk{-u{M:qo% ('i(!i]Ъ <ێ@[^zjZHeSiZb dx9!g>xJ2 {y E^?0#C6ךt+{UKo0ǐ6 8,ojz74K[#2KC@ S30<6ziz櫨iBBF>R,dnD}wGMV-m%0\p &@X$.OZҬau+š/t2TI؃M$,# HRǥjP(.cNlr&cfnnm<;76VMբjEy.*"̼|9r-wGVc'~~۶ٱqOyޗW tM#O}*{k慭$ky"!$Qܛ1 I'X/;4=Oረ#HA;$2(8axV  >`sʍR$ RBGK7<IFޡ7 <b|w5(&" \,LvvedL6kᏴ^W lVYcF>k(;ن~P/>{m3S a͹1v)2mjcTtԙWOK0݂E 2)lmRO$ (7MEnEun~|.\ࣃU IͪMŨZ> ofS*/g |ǭyz}"?1x]G z4"(1֤vRB/ZJ˖8ch$y Fn Iw2VYnquoeZ\h.cevF9R0}e7ϥcDf)0T4kef U~u%A#YIh_mEˉ@t#r5]r=OT4e -M.|j2s(#X3,9#йD\\%rhwPEl;]\'%ϊ&,#EWVʇuMZ(aܺ9ǽMZy+m];qr\gVp6)͔lg P<ŠO׿732"i2̑A*nRW7kH'-g}Z[Jnd8Ja|(Q-xLm9ΧD.l kVZ-Zu,KyHN VhWjeyvqmkgk, 0Q"S fEFO^K4b;|2y+ z]Ƨmgn(d5r_/i=Ɵi;$4HK*bXyv8ͨX&uyO/g" b̬ ֫cecaqswwk ҔBrzrRϟ<7]ݼ.cXv8(0WԐFFG"!kj$zzk#Y:2$M#p$o|<gLp,tFUAAs3gvHl /U֬M&bQ{y#\f] qi$r[E;eF8hݺexT]cUl} Ok;KʅÂ' z%~sAw)YHXSpr @zG\A=k<7sجERSs$1RT >_YB9`HtQIhw%2]˸F 37O#u[i1j/c崃 21}n^kp_H}lnUw1?m{eK$cE[Mje$xm*m9 (evv=2zuͅ~eO ɸzWesr4M"BFvsC Kk[}Zok3A3i[Z##kqUPi^{۽ޭjjmPh,6"ro}͂nWhޟwF\I `pn}nJtϳj}DةD\\Cscnk(׬#k \ -D{F[ زlu,cG!ёr:3 Hwᤸ7&[&w<WbGf`N@FGmOlacmT $Ia>㓂MR7Z??GUg}{Gm$Ы-rʃ=*7дy/.$Ҭ^#n挀 ;c,` چqzIMI/LĔ;F S:ΡiKso(WE'h0r\F0ů7cUA7eyFNAԋRDBX9{5v, `F95_?sŲ&rcxʤe@bH31.wۚƱc+O#<ӵ.HUݖPB@3#tuIHD&Mݬ*%u|dx'д{mJKYZ{w{t&)#b1#y^M!d<1tkm1S"7/'8Ā}^i>__$be㔨K.ڡw;l:6RmR->5 dk ]x#^ =*"~JQ~f6یn늯iɱ=NVH#yv35vxra xnHR=OPE2H ɇ,Ė>{h3j*Oo4X짷34"1` Շ'Ft--Oh,6J00Gcp^:nϗo6My-x ȢEfK‚bOT \oQ}FR( 9mWbK >I8'(P7Zp^QHA*@8[hɨ/*GmQ%'}E X w3n--֟co$_$KS40*FA 5([2kM)n#Vy2^wUYvQ@;m /tUnmYw4qT8^7mQ<iN̶Q˕yμU8D;95hinW7qҬr(Ѥ*#e2RT; Oj^ 촑iawj$0h6F,7wIc>u_iHg:fk4^s:+uol n ڥ܁慣-*:U~ngl~=7=77ŠCQ{m97ضy~sl'cw82%qB)P6;:ŕhg]B-:x").]2HTcPQ\=r;)ʻGw3yK3.Npp"_i} nnwMۼcjkڌucq}:y#v#s_b/PjnȢiuVЎbswmV^k8 sT P(r/7gw)<5 X5vắ˒ yOgvcWK}%&  &CY ?A'oeO~7c~?(a{YoM._9Ja3ug&߾q}gxABfvw>4h6Z-{n B=rQ3DڡhV^"ۭ$x*Iȥ_^UmOzT\ݥeKc&б Le>&_VV $X`;EHHHA B)$8:M'IM*)gθn_j$""">NI$64V 4jfVEK.#0y~$^嗅:V;OyL41^4]I f^6%TQ[o露kn.~c30J" 0e ]QM{U[(yŸc2) & (Y#5%#-6-nKgTyn)Q+'; m1Ǵ2 1FFpAS#cxf+Z=B !,EÔrї c$b A[onV۵X+?|.9=KC }۴yIUH>Y7=mC(L.2 ܻҮcp:_[\Kl-ʋ6D%YB圔A 녻oFZH$# Հ$H@f!˻ҧ<(*,Djs0-s}ݗSQX q7b < y:Q#3i>c̳I 4Y9X9 Z6 eo-ZFA+Lʌ[~I\|;&z=ۢڬv+9>dNrJ'Nr mos1Ou|5nHb-m 0^۴p*Ʃr;X"+8{.{%L0p^ӆ}gr'Ј{5NWvFMh\[ {onfTs̅j\cǖH Vy<6{GqqeڌH Rr2RF/A+-F{[o+] #90$7MVX.vp7a&c";m,L:uhDg\ ̌Zz/5-[S,SÖzz\M4wfS.I##U`2qck+8 -4݉$dG@ Jx_33Ǧ1I89@#<Ѩ2g~\ɹ^o$;,;e@ hu ʄ4Q\~It]GWNҭVe,~6~baNߟ= ;mK`9IޠH\=\%Hlt.غ6JQd1C?zYN__~l٩ż=x䍞&hr# 9c@(7|koKvR_ؾq[O&pD|@!BGskohzxrSk$l0g[oȼEsrkz>0Ԝl21|'@'>ukH֡m-nm/ oIS@͈! TPxTP{$f %Ń* ҆@d4p|"-ɷ&yXz9( #E=[wZf/#w9܄BaqZ((((((((94 :i "e%o }lfms݃%Wѭ ⸻o$/n/ 2'tbi-)e; 4{d>b` iZ-qb&kAmЁvo)b0*nf姇:ukZIsnmLN[ǹ'tBO/cPVa%֧]G?b!w~.KcK(,>)ѵmo<ɟ* %f IJ(/F[SS40:ny-W~ejxC=˴[Kb՝E`(_ނoӤA>A!7lmG.sp.p~%xv=Rn{r2I0F_1T2duCPYE&8ohv l5Cʫ[iC09M;OnF;/n>ر[ٸxıg2'PI݁>Xu {Mn--/,.?cOC$hF֒2F2ÞC XqZj:>iaq4w{6\(H+`y 8lx~hc6=E..ݼWZ>đfIr3 CImDZEwDcPC)w ;d7VƏiwiY^2vS(뜍˕88ڞjvQ^Y$$nIvhpV;VM3Yk F;tiRtbW;5# GyEq nV-v;@fr؍3!}=eyya;y|gC$O)uU<BυIѭt.4x˔`oE PE3Fe5=CD!]$e˶*Ea>auhH-DdfNs~M*BщMyD۹991EuP>iڞus{zع8fF,]|8^w*QӵH,R"Wym{r#`$*{ (|#}c,5;Kٯu,y * `tl[wwE ,@'s1<(?=c_OjiyϿ=ͳ}qoI޾rKB٠fsst88C/]e隿oOӬQp{ͿL ֱj\[i-5&S-Č6A?;^Eri¾k {[lB4h^-$+dگxWė47Qu@x;f,P&q`϶A%}vc":K#+"Q ݔ j6!ֵks]ZElڬ00e\\ (O[𦥫\xխ WN, |4$M/a]qSR-6MZ#enر0){-sG 3L䰎)y1*z6I+Q@Ɠyz-յfH2Ǵ0uz?xT4[ğ3]/gV;T9bUa>cQ@Nqcm(D_Sp!2T\sEQEQEQEQEQEQEQE+o[_7y tʆolcNrO}ށEr֙.8.44t+Ĩ<#x, Q\{^]'u5 $6֓uO9!2=OVvIu1$b(RvޅO1UR MͰ5=K濣a&y|—RFJĠ0OiEpzίi$- V-i0I$D(&ݷ ³mxrӮl52lWqKypYHܪ J(,MKuwL'6Jo<|nn$'̈́r$"_ Ε=Ψ@Ϟʪ]Y/$$l>I.! ]UBnHcvpH k(']x.-bڿi̲[nGx˾¨K3;vmwgulPEPE3r9P;!d`2Vw #PQQ<6\K0DF dOhJ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (9n?EKI]M qӮn[Λu%QP–xeymQjhvEupʳxR8_A* rO4,ZV~-h6h핓%~R>RGBEWh[|kkKQfĎMTJ +*|>kmkAm"@NTF()TuN: >g8L3I%I$$I$Tum z4Igd?\GC |igp?"?;sq,wVi"Z+ G5/<=ɣiS"$DC""Orw. !E^}?iTxg8 JIQ"ڬkmcUIT]4ߵ+ia@\SN{{=&gV8; Uvj>6]_4JZ u)k8Yv#AVM\5{[y+yqG1wG?mgK-?6xvIGW-%t1$yY@@:M/o--lu2KؚkRȉpav\ eEcx&{yQg"ƭT-$cznQI 0' :Un֗ FP)'j'Mԅ~ԅH-+Ic ;|T.K,lv ;@:WRH/Y!LQ#s;zŚ,]Pa*N<+w AOI<[fpp88˶P[5{/ɧ-2KK}-6`URcfDDU 't(8^j67Vҭ3ڼp U%S dR>\=3Cӌ|D,v01$KI<օQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEcYH4yGپgn͹񎹭JSlkiVZ3B 1~QC8^jq=22Fc\Ř#Q\]ϊ5KTzV$P*4]xa+"(LFCw^kڦnl5!ia#C)drhPA,v(L֮|A=tY$oZԺ(*s6ǀ,ZmN>|gXBsb)Nr3B(T4]xZڜME+vc?31*w3lB7ZMs\[OlNDlU ++@<1?#Epl!e3[b ̊l+-ce?cOo%wow}K;oWR>ucׁ07;Vby]GO9Ay }-DA#L&0r_.367sW4'\n{? h2,(H%"V"$~T >UзD%%i޼Ikx. Jk-j;2frϲO=|Q+^qF}(.qǹ$H|~/wkC?i_OMیy18;y'5-[OZsN}pP!b6|ù~7;AXfcNcw?ev#f>@v!ZXԵ_JӴ[M&6 +& E(fRcO ccAi}%I m3Vq^5EZ]LQ-|]SgJfEgGڿ5;\]l6m) +KO͉@;+ߊ(7چ[, %(hcYEr6~k]ݙ4_ ;X7;bY6$Wqs*2L+kCl*T?zލh֖WwZՕj bF%e0|FU<0(>Ʒ[Z{K8%c9o1+`,鹪Z\[X[Gu\RbFCV  ėcs(Zcg{_DSk<ı,jܪݵFuMo_ΙeեL/ Q;#FINWx|L wW3`.> wnn#d 8 ="x-SD['oOrq" ʻC0&@IEyϨisǡ}m<%DӘF>QOTmKk;tR9s>{=~E$ Njٱ@C]{X lIl8Sͅ<谼>wkC2K+y,YppV^T˧ou94FFs ݒ#K6Ѽ ((((((((((o%G;?~,ې(ռ'^KAaXiW3ɧ6ZVav+BYm8eEEn1( :J(6sZifI.6ۛL'sW#qv &hՏۭ!3>9m v|,r9NaEsvO״[kosMnZY丑eC pK#nMwqoaslR3.J!2PsڔPGm[vz$k# lݏ5 ( #W]y nv5- uP\ x(?_;}5u#JOHm(X%?;Q; ;GNz|hb(偑'WQ@=?kx uXŦ J~Ij6!.,'qZgjchϷ8%6ʄb(;(`uP~iE7yi/-g+G&Or7)Wu# ezk&i{Ll dTHġ-Y*87ViF"VIpv*Wym #`9okz6B9LgbX3f5p03'uvP7{WK=v83P샖h] FB*% /cN+ ~FGԮ>n>@%'2wt Erz'5-&&i<FqEdiay)nx;[&Ѽ[JR\[Cw\b$fO*UlbGW( 7Fm};7dܫkB(((((((((((NoymsymSEf=H.(i1wiT2ZJaQ D{4ES:)/ݮQLOV >6 .W9 I-RG<)GL R09 QUok_J>=uq@1)+kv֥Nn5?DQcxUQ?u^Eyk'M,]M2]uŴ@ͻO-rK~MGN:2hO>}Us<2yBF%97^4V_F\o kCzLJ5Km"ʋzel$Y(J<@%.tKi%ߟ,p%5i^&whQUz0QITC\k/uw Page 16
Première page Précédent Suivant Dernière page Texte

xapool-1.5.0-src/doc/online/1.2.2/img15.jpg0000644000175000017500000012037310235646675017703 0ustar twernertwernerJFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( 6MqjۼvPJyҺ|vou-qdZ}-b$1d&8 5ۅZXF(>pǾiM:mfvH3!ܙ _-ckb@}.SRK;2C,h6 owhH A_}JÞ-۩>%Ӥi,ot9WS_͕~O âiZm]$֯-1!=0 [vbg(A9[KH^B KnnUX %G*E\co5N=֨tR]\Kj3O,{P!#~&=>}wHa{ l8]pHfpw\tCCޡ>s FX}8h 6Kȑг Uuuq 9QY/i5͔$ѕes"H@ M۔Cz[Ih9n&{wN1}NӆV ToR8EFu!Tݒ72V45,4g3kT$wn7KHJ'fsy'kk3'j(%'9%ԏv5jwaJTB n:泧j p[k/-R]ۻn@9zP~wkg)LO2` n5/ixѤH$54[#v`ȈX8dP$||T^!o+Mԯ``%# rdU PM}?!m&mޙ\)d[[̒:n:w$Yk׺!ݑӵ1_k@ltin6K)pkȮxF@ X㡮_Oi=KrkDʄyjBƈʡ~N}7Zz%w9ymaIcf@E!TGJi&4ie^9"w. :c]^Pp#jrŗqP$uKRP6=%Rk9T1.}ham_\.?Mh/y_[;z,}IoV $K[1CF&݈0C3$^)ѦFKJ:< 9I+0q^O4/Kw%\O# .3m0ʶÿsQ}J%_j7as;_{n Fo%$6SJ42! YF2˜ix}ou+KwmM$Ew,/B\<]֑Y][ݤquF %[ I.m9zO&&*eb Y2H yRhK?Z:ĺVOgx[YK|yqSG|geM;KS.u+=.X BHF 1*x҇ +Ե-&4$/m]N.ئIp z=@#{xmc{YV7:m0QH«6$@ad7Vq {,RIJDj*L ڼ fMZGzݦpy9 Nx$ce\@} ke dnAcZ|IIJ[DO77q?|^q]{%PX&%p&@8o.>Vl}*KI;b,mC3)\/RciqmghK$ rX!C/ )z/Ktۻ>f{ 8r4KkG"ʰ9n`D*FY& K __[r]]I˜,I$UQI(@\}I]([ }"'! / yn5>WcE|]y~ah̐ʒߴrҀ)4 kwr-RLۋYEPYahA;@#:ޖ9(˧KdB0J0;Y5SFaFY 97n ,X?ZG3w?AiMx}dy<:f@]0pTL2uKxo|2-C]d݌FA'CR,ȮPH E b՘ʋ6 .ENe}.S\dv҆7p(WFOWMÏںx~KBo+nPw0PJSZeΣ6?<iE-` @yo%ujɠwCgM$pm߱yb72O^dWF\{cϣˆxhGyڧqjzy?}WUIo|ӵòu6I`%eG'RYѬuKu`5]CpH~"u wMWRMeO\2!J-u:ԛNmg^aqŧ<}m ܕ2 2*ķ [x;WweYf\2yc$WqG kiW564,Ht)V@-$s^}&/X'ظʠ{KYjPiq%Cq%FQ8e $dM}_ןS[z33.eER{ c g\h,ڀͯQ배k9<[h_i*pyu/Ѵ;OGڕEh-˥wr}ܐ6bp1~]o\i$LKkl!v@`[+W+³@ qkn%D X#q+m# [ Pg zRIm{tKbʙ<h$lY|WѮt3W-?GԮ ߐ"| VuI+}#U> iM#R' zVr@p}e "H@+n;Qڜ|5`KfF|29f4G3Ƥ lnK2 伲H%$ݳw`HRq=?xK?!>x#ӥ'P]$X@B'V;9b(Q_<69 BTӷ"Wh\BC)Zcớ/Z%݋YN.om ^X2ڤ(Vͣx7@q^M\~(ն*~<5\h \얓D",3#BّTWWwW .:~kd|M 5A;@ ľGjZtMKOڦGk-j&Ao 4[k T% Ā2cUs@ܯMkψvVV h4{*0̛Mu '} -jZKdp@<R@ܐHs{jn{ -XMpZh;~@wqp@=?i!|}xKHo,GB>!UD!00Hо$ d}WGL6ǹٙ'ˑe@\ /\B)u㱀Ǝ|iYCG/xL6,H7g]B廝eToUR/׬<-o hz|I1@q8W1[ox~]jU c1 ˑO#d_Vyr_|M:\bHwM1bI*rܰԞ6u-hZ_\C6xl.!BoVķ;+'[jzj:G_YGcz,fgt2 ~O&Df HC]4wi+C Fn?+"ž(w֯m.-!uY~;C̹d8H't|vtZ;^!n1 FbJ9_:Dfmr@('][_ZDBH܌S#y~x?Ԭ5B+An]/,cE˕[䁵{ qZ[lTC@Zz2ld ªrp_C]\}+[iG.$<"dyFWjg{.sOUuH1mT;V*UD qxt័C]']좶hYKgen n89h]^h7Zqylצ<) 6HX\=:Wa^OiEyç_[Giw\]C,|܅" [jqEt5 BMLRi8-h=U,nc\[*L$Cy ~$>M:;V*9eB:yJ\?3Q܁^.4(t2xEHi)7!%օMhhk ]Pp.vg>dR+F/o`ԠxnLAe2,̾XaT2 sԵt&G丳@cdRp @%=9L_֥e!oP@s+$RB/ |2/t}.]qs{mo6 ,/ TԡTӶI$ $qInx'.8bfKM@zRo(g#i:t7:/ y8~zsx|>nN yOmt#Lc,KF.3͍YhRml6K4 .Ny]#ú;kONHmmd΂UI]ƥ6f %B=F:W}RK=4xlo41IX1D;Mu^i-3~'#`U`C) tzf]j.[5#lS4n&)$`_ ŌӋ[y.4˙QD/ݰ3ggɅ􇾷QI4iȅȟv>PdSy(27#x;I-edi|lLH\" ϰǘkB^d/7z1y!}' la]@@Q^O.k =b{˝RiD2l /l`[(V-rf,^+'ӬnbgZCr[vĒd  #ݷ@=jw6S=['efT.A`6ڬ@b3ן߶Z6;&K++xx++(.;лңӿ/ПQ6cpg>˲.8-w'/3ji- h  2۶F;j2iCanK 69^ TfKta'람2pG"7#aY-u$m HGeltr}זz]>+ېyJ6)B<Ķṻ>-49ig{fv>Ӷ`Xя,Wk*.5Ѯ`)=:Xu&| oN9(? 꺭捣XimX^<3$Uď1䑽o͟y]zGE&-5X,l[vx1e=2 sZEƶ5>"GKNϘ!{ =fdhy1[~kB2|mmxwhU;6ˋ[Eslh A>2oD)'1“02{b5c7Inlmiss$v?B&3OA@cz bo0Pqcpwawgj㏹yhVz߈oE8Ԅ >yc³ ٔ'm5xG(m*RM.hW7VyB9fl,8iv5Y$%yXv%$OZZ8.ͮ`/Aus7ISуY\\K3ir)#\*`zXPǦs+I[nH63ߛuCYeҎ-#o;}#n60UOfj1}K ^y <"%ǜU=2ψTȚ=-uӞ#;Ų;XRMWƗ5˭ťi _1)0ge19dVٌ;+·+xL.#.&mWpە'8" GKAݤ0M{iw/\ěN$Q!ԃI_9⾋L֬<$l4۝Rgf<ě-qUo^]>(-l]E%4vP-C2R6~U4W9uGiOcok=2Lf$ycr@ۆUqI>>(xS;yGۼGg3*QEcn2O,,M$2$n,)#۱EQEQETs[M$Ue)d$}אG5%cd|؟v>f[so99/vwQEQEQEQEQEQEQEQEQEQEQEQE{Lמѵ($ZcDŽt}vi/=C}< ,@a5>)MxGY5ٞW([cJ;qAb?zV؉^^jKqrpT$3p7 Ը^wϴ%mK+ڕ!O\{5 zw/& 2NİߵzdiT]-V+c77PQ")dC@vk{V:ޥݺ^1m*,r$", ,EiVKIdn5YQ['p͍c:>q4ݗZ! Xu0>'XiV \inQ,淍dt̖U&M^1~5^c=};JVPdeH]Ya\Cp2ǂK}/mY\nԮO }?;$lXEk pgsO.ӥy_W?؟g3#qz8DzZ=HXdh0|TK `|?zkql  Ov3SO46ԭe\lq(BN8#9v?4˻IlmTyx>Y #7=7W7::ivZtQ+X(%WKc^>UƁҬqF>DXOь(a ay\z~P]:( Yxc0.SopMKo4:$Aw23PGc 29Oˍb7G<1U;inyA'/<۽@B !p0:*OIt]zwuY"\O-#Fp>^Q45_Mi [^kws(2̕e&-Crp 8OhiowoI whVXq XP *up i_h-4G#j%r\dɒIySl\S|uay"++)fc$C>FAVf̫#?Ex6Uλ!>cEě@giߡض^g.%_Fl^E=a!r Q@8ifG. ΜRnX81\"+L60]&f ,e}Ή-̊eVXǡQV<z(o'i4fmG!s0fBv~l.a_̑&\>лܸ;഑ct%V\pbKk.%Ɠ^+UE9l&4"xl7 Ľ*Y5+GGێ)2`X{R Y4ZtvOiI~.dگ`#C/ͥ[p Xʁ\\x@aԴ5+̺ٗT2A by]yuܺy ,G K ^%HBc skK51[-#x,0K$W;x _7ى$KednRDfi|ad|'}w W 8a$88 xsE_x~II-8w!;Tb($'R{P隍ͅutLڝHgȟ>թxM5`wMF٦Esj͵eMH[/\tVmLӍkkj3{iP1ղr08΂ҵԤMM.dcA/n7d`pQ^qFű~>։iy+(G22e.N!jA OK_bhygޱ$p$a"rT(?-l-tCy%?bر9x-.Lԭn솢l%kS*X0+ Q\[/\e\鉨4gYSkHy)O>9`Wim1lȦUep>\zW3zxs"\WH9xV0`zkZxN/a4uX۪GJaNQCҊՄ!{+K_Y̱ FE*QrQKԭun-4x{{q$1<^j[AuW &ӵ[(JM^34q7ƛvHfg;U)hY\ɧd[GUr_#cߜc(>ɬx[JK;6X%IG8~vFb;MSm0)7EW6mܮ~mj(;OXݍMvhT,H#v :-gr ( ( ( ( ( ]ᙼQoM6a$[_]dFo3]%wj7ȶٽҥLPQvr̠(CY|6_&qF;=KN63M=OLF  4\c%NF('_3uW0DI>L4'1,A{wQu-f{Y,[P_i%ڔ"%;%ݑLt& (~i_1q}g,Gh6f݈V*X,Nr6ݮ L]1k8K1(}'j=>_7;gm}ckY_iggw~|3o;qg殢=#] \ıc&m?2^$o$7U,m]}ռEhg>#_#5w!_;% ێAּ5h=.m IFV[vę!ҊK':͍EZb!GiX1;>pCC>yy=`5K G1ǖ waEy^m/R԰HEMo8xa[Q󂤃5?M]REbv֌L&ǔem9b ށEyޭZյNOZy./c^^/,=^#i[X`fL>|nⷃZi'V#N1 I,)lvz`,8Oh!v":s$ z%Jom P]Kõ֒h) p;Esw58J;"Ym26QFEgcv,pPmJצQ@}^#4+U;OX.fL8TtF!!2 %w(~Š((((((?}{Շϙv;=;w;*< hQY5F8scF3.n?&>f:$մuHtu D&MZ4%uL䏕 VY.-.'ړlK 28I3VVc}B`tKYe ;893rOh≼9S(ZT ÝX*n#+)W4[MmK-/W(Z̲lTq(_?kWo0y^vnxL8|KK[eDF2pr0r1 jQX~(5K{CX0<)ǖ7d07x\[+;I4eosqxO<#E1 (,v(;ZÎ_0#FƄۗXa?Ԟ9@~2u]SY 6]?M,O<xV5O:0ҞS QȶEɿq`6`]zܢG;p}3z隍5m6K{- 'tfR2 s)Q@(ty,o#l^Qp&#g `s#մْgPt첲̤$ۂmm<ހ.QYk][J_K6I by8jl::\j&eʦrG܁P*武o9Ti a9czxu7Q3h~ .Ԥ/];FN d5(oL}qZ}1/Ǝ1<%n u:tcoc>&kH7.' 1PxM5 f{:+y` F(V@Եm7F[SP"u2ĥNbp DZ V|:q-P2Ik*pp#6F[Ok/WSUN}1kWV(:Gü~[ `H2xZ:yede#ʫ]H׊e-5GF4 BZn^Y#xU0. MtU95m6R.]B5 |V2]yS9#n@}*K=2K--cFI V=5QXn།B's2?| .uož9#FWoZԢtyj2gnϙɍtQk>d7N<ϲ\$3gi8_C@V:xGMϷ@QG/ҠgUSqYOznn^i}FeC`q@(O>=tW,Vl鳖b3.vEf2m YnquoeZ\h.cevF9R0}\麶۵ƗZ_@QeP#8 W?wKJe6MLjnfOݫ>Pp q@eKSѠ4EmfYAD* }+W,徴I#x:4o*w/L@U;[M-mu KiesL6@r,ב=k({InmR䳷++FPnf@QEQEQEQEQEQEQEXjƏo+9`UlQ?جO[Ӵ)on66|xѥlcvȐ| '+fG_GK% 1aqn2 CJ7vm55ߋ,!_b+`laUA/CM~>]hzvue, yTs[v<&Nwdtdj}qxU9`,J.3kգ]0}Q YǦHtmLJEZ͢3;+ecڎrDz}>o魏 h :g\#JI(Bznؤ2xJ,4kϳ_j$NSh7gns/0~(-C.'FD Rp<%u @% Ps\އex#X4}'מ;fhn/o!UFic$C3CWqk}o}i<ņV)۽~`Sʐ#lu7K6Wg!% S= qAOk]i5/HZ YǦHtmLJEZ͢3;+ecڎrE=/A׎s_٣]:K+)+iRV#m1Bm1/!cOk1,gȆ3pxui=ń림mg;V1*1=:&^wv߅gu n[ Y-[V eenpuH8Sh5uawrϖ9yBc2v̙k鏋.um>Xy/UQPm =̶헊IW<qr]P4)tY[VPh!_AѱP (;yQ<6\K0DF dOh]\}ްk ^ xOTT o70mޖSHIգ>U)Ft4d8*µ燣n^%'$60nG ԼCf"RVML" ="<HcD oVjVyVᤇ"f;UU)}pIuaZ.KN8.r26R1c.;دqoop8*(Uŏh<7}&<>?ĂಅyJ;? i BOvei4BG311nq3V5-2yLuK #1߼0!IdЊԠ/ZFj"4$W\H7oSVZ|WF>>vjN$yN˵0rY8Q]Cuk6Wtpє9p bka]ߦGc J C)rUxN44H/+[+Y4HQ/ Dv* ) Fp qa}z3ژm$c*IlaS Zq߻'JQ QHz-yši^yBi5 @O9@P9~)u\\\:o,)4;KɃ)Ayv‹\vˋh5I.{X1*HT AsϵX$ Km*'FUIϔsϿ,5O]d7F B\B*̈́$׾Q@?^&76Zn} ݗ˳x#ދs<'h|rcNX%YC" ܠȭ? x~"~[m'\ }xbcIR<>kP_G% nOTJ.b5]Sq^]o5ptpM{S7s쯱{cmj<1_ؽ߆w{ctPϖ'6/o⋹ O][ܡB{oR|Y[4,/mŮ%x6# ˏ G Q@X|eŢS2I$d 2SzۀYcmϬi\׾{y$R%"‚1PHbhzgA|5\AlZHѳOFDnpX<-o>5}JPK/$Dsq+ͲQ]|_,];9dm͂B%dSH.1+~?kK?XmlnS5݆I0CrEx=t-Sqe%XեởdGy2U#X/l5]8+'Ӥ҈%YKFR&F}΁OtPp#_<[i4$:!y r *23KsxR}w#R>`r@īS ^̓z:>e֥Z{+o$r搰Gݐ"+cF9?$zfc!+j3G,[#&Fzw{zd7?*Ov.{b7IF yWlـ@nlŧ{VZν}kw_d( rDS7US~jO}8.Y-GL=@ ۔5/4o-di;w#i2J'v7*EPEPEPEPEP\X]W1:v$r yUga,OaۃV~kqA/ s$!eo:>[Ƌ4:g-qqNȸ ʬ6~e^pGxk^\1KdRE!dvGmX8`m\c,(9at4$y_і.Y Y1,xoDÞthg:lO&3`6nzeH($ gڮvwtu'tV&Ŭ 䆅FӎmJ((((((((((((((((((((((((((((((>sԖ;>S}'H".TXxU,2 ߶^ GV T o-IA\,j6j(4#1AQ tb@##`̪G6 l?yur[[{K$/q"mbBO:?KYF{Ijyf# .J$1Ķz:ZtK>JĥeJR7 UŬ[Y aw]`>SP'>/<']7Kg8h2MnLePktw>\̔EO[ÐNeӗd_߈o"ڕA5[O #nlcZ.{u2;YN[$j4Vjt6Z-b]+8*te|9~[x.>K-FX9.w1`sPυ͎F{ե+: Hie@!9+&XQj~m(ىa8/0"oqk[_QdOh/|H$"DVnx.UI?VmQ#tnYm5٭'<2d1o͡xsX*W:ۀkUrNAog,?5yZlJdiTBOq:]6S{Lw0_7(PV6)FTs8t} {,ol|ْrhYU:8rUk^&.-X?Ō:C|Щdew8c;v^T [H'BL`snƒq&bkվ Vr&3?sHb?t@9{OWY=Aes5Wp*4lՌ {dqA Zkmhn.Iz,#y±X?vrwl# lOM6[$## 6`ix& jMZ-gU7b?!@b`ې#)]͐ 7$?<iK^A1d6-&+];KH?J+,\n$Y2.03cӿϯjɧ[ݾ9?Ȱz~r[tv^ӭ셦Eyen, lg[Põ R ILjcoQ*ja1Fv}պ)]4ky`*BH];QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEkVZD޴V-*(gU*gP7χƺ uNh[9`)2p RC/kǞ":N}-Ѵk{I*!;>p[0xCÚ%k(rGV32غ-F mSqڛ UF.Hs~$5JVk(t>r]-(F1fs'lj6]/Q4!km๒B'2: Zi65H(Y$lD@I GQr,I$7ytZl 5\^xh`򊬉2JO@R C$IIExi[GJW,\>`~oxx"/l׺| G@oݪg|͕*Mv^WjO}pַ2dKLFb#i-?/5|;^iқHqt5Pac6C w[xRѦ-oMIcu$|"*]mS ]/U>mR-eYVX@r@em05kW0+Af [EHfWd`2CeUU'5 eP{ FR/3?PȠqEQvPY壷ܢn $3 BƣH4,Cj7PZ#퐿& d*7*~tp29~j1Z]oQ[%Il>dW3Jɹ@#d*BEG{ĚEBiSTdJn$GJJ!wT!4U4] lfO{0FP \峀&o&4[J5+2ɴd Jdb-EnWu69|IhmOy&y$Ud+.˕Ju\\i^ZHS &`duX(((((((((((((((((((((((((武o9Ti a9czx3.NQlmgpF: rRQWHҡ?9*%$Qpw-.{Y_cCu %vO~ F|ý]HA;vy*Oi%u6uBJrHRN2@ϸMỰi96 B@,pbX|Wz% aKcu+K,R!$OsKXk'Λ}4aeE-  WXl@FBzQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@RL[9Ϋ%}Qk6UoJ^QoAiWBE}2f{k0 K%vʡPkh:-Iw^X̣׷8^gH5K}b{PK SGL᡹"rPuK'hƆD%si4KLxfeXǚ@;+4YcMuMqkp 02ă|8Q`zׇ/R6:ͤ ef44rҫܺ?(`wƮK1@=XEWiw~[KP!)c2OIQ{wZeKv0XRɕ$N0k>?PMM&KY4iK8X+0rAo}k}5tmO]kg]}17m ˈEILzrEp9JKێ=Bh!@\+`X2{؀jJQ/4'JWjcOCr -˹:{ivO5CS61X E<f] @>Uv~Wc]K87tjh[M-G56÷fW6.PqLgkǣE{jObKk8gf,6H*+D@B"4}?HЮS[I-6kjRUF(rPcpw@=j6:K<2)dV9d|w>2W쟋oo5?gNz4mM8 {XDZ_--sZ]+^HmH\yjfi \ +޿{kK2b}"Yxi$˖ c c.,kB+_ .-\- ,އ?@NQ^OxBN.?+=vZR<S(cbDtTa^M{ VO{Xܱ*3m ~U8'-V}e%+ɷdnlnU8wǨj?Rk+|Hi=z&/kYY\Z%+k9<[h_i*pyu QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE^L KXi2ǁ@ja5!}2ZY@bou nQYŧu(床[ #B,ḟL:˥ϋ ]>[2[#ƊX C 7*Y؂prX}FPM;Ķ6bg+N}lH yN6-Cwi%.S-ψm7Ԛ|m*fP/jÌnMpq8=} hW]٭bψV?q=9n ofS*/g |ǭ\?T -F{? jGw:Gz)!QSy5+cBC[{ /e JEHPG}hVay]B7GyPcTUf-,I=*]F[}S[lgd]$LW$d ϛ+iqIggs$VO{r /sXG'Iku3:jlaU’:J@tmMoM:ut1\3hԼK okzm;䌀dcY~ w>ۿ>ݻ~m;7|+hTGwWB1) F &;U# 7$2yh;y&@=T0@ aowy@wț a:jr~&ak٤/lZ.GV\AsmrkG?)%m/l{obJ`MX}wwg۞35b#O^ًU8;"A@Q@Q@Q@Q@Q@Q@ggև{"ky\.#o,9`Q@gšhҬcv۠Ns3;~ (,kA6D|'쩶UaB㼵JKH-0&( x|'Ң4x6YFTn]p>V=\4uk@]$I# 4r#GeYUA Esxnt;>{cllǓ'Xo mқ͉ 6QݨxF6(>] G>nc'~>źٱy||ڽ1GI&ͪCK> lS*/<+ |=ϭ\0/ iWqZ6sqq,l+4U> [xkF0#f-bB'[P86RmR->5 dk ]x#^ =*>ݿQ}S<,_*C.+|( z6oi+XYT6  5gh]mNrɌ$vEem..]M}>ZU1~f֤-[򿵴'>_]qg (? Gʱ߳vnuW~G*_'}m7a#o<77q?TiO>(͐nöG;ryi:mW}3n-c8UY!"0@@yҮQ@[MMŰ_'nxf[FgyK.A%;P| ۷-R}3 :[E1:306wdmТ(((((((M}qgd%†dy)!Zu@V>}qkĞginAWt]Q^v IˉHԯIB<6F||؎@*7x8(/t jڴΥ{$w,**BDBd-e3Fm@^C:-vAHcIxUE $@z)cuV>K?^ I{yi#hIS!Cny;s'Xnښ<6+,mMoȿuF7(?XhǩZ}7D+ꥆ~P@$tT״8ntF{xo"I~ÑzZ'ZmM}{ vYAˍ G۱rxWE׈}*<a"̡ H(mg'kuM #r0N# xZGɨ\YO9XWOk`WԦf T FC` PAEs hZXP"i3 zdd&g-{LHOuoH8r摬3_̖_k4 pup0S#10."h>T@$3nqF@:+/Z!KۏAa٤9 Ddn' |em=tu!~/Z5DT28PoW$(EC$vrKqAENѶEgm,wg:Zwc$݋G9x A 䂌 R:+V6i/ KĘVٕYIr`m$cx}nQӯ2;(.ϑ +HdYw QYfOgy ֗;|gk|8e$d0`+@OY|oEhc;J{aYT1hMkJ+;G'Hhyaـ3) pXph:e}zvmk %^OϿ۷ ~Ӑ,BŒ Nӧ5M=V=VúP2m ~YKd]FőXKm63 HKk_h}Oo5͑yFr4ʆݹ<|-4ڎ],͙GʸQ(Rج5(.沚8]%ThB2v Sŝ|v^pז0eVW' 0V*Q\M#1I!g822BЌ6 J1MC c("g6xV*X3˓;|/mkikY-o]<[9diԀ7?ROF"3h:žUC B@ %4Mr+fݤDhyE,66WbUI5/5&Kky+"mXڧr.Ԑ-uV=̷v}nĥьrl'v#(݂T:jOjSj$7Kݣor"'R'fbEPEPEPEPEPEPEPYzg5:IscȐm3.œvU>fz jnnic8EeK` c@g>M̻}|靋&ܝp8QmIszn"0iMUHv%wty_Q?0UsR?F]I-68&@mfX`@$`x=@mkfQUK$Qؘ~"e!}V5=Ë}*EvEɁm4J6q0#bXcß4}_f]Xo r8fۻ<7 &մm,ji̫VӼ``眊,W%NGE2XOG>tSJ$ӭ[ee 9!c#p K<7 7Ocnٻ8ݎqN-[O2 y*#8@3\)]VZnMlAJpT|rޢh/KYEQswe #= OLq\}oW5=Yv$4@e|̼)+~<mX&sY4$p1 sq׎Ͽ5A0[jzlv,]}+G 0* T|W\Jm, 7|,rH Ǎ?k16zlyB2IX۲dg/[FK-NQMk&eUVlp8Gz:wZdZ䍢Bvyd, ¨c%h}6Kb+4oA(~N>\ݟR,umC.ocZ8RaP5u]YɪإդF{ZuUpA@્7O#A4}9T؁$K"Ȋeݸ{U9]$5|+YIe]3j3zhni۔CY1N,u:;qFUT,3n xCT4m7OM[ DD~[1n9 aV32iԴK5kFԴ] rGĘշ+!ʯmA[a o%,7Tϧ=(ĺ Vޛ5;xu)䂿6}9@sxZjѬ2C$-'D&ݭ$1sگoWݔu")lUvy+>>YM-i#f۹kxԼK okzm;䌀dc@B־oZ-e<iH_;@mφ얲ia Cz:q֋/YO[ , g?p(}=R%PPMe% &6vgܲ:\|m}G{kW6ieznF& db% $-#%h3hzk/.P¶67LeHd!6LJٴ'ȸh\\]H#$4<  _n 8Ԣ ( ( ( ( ( ( ( ]jך=݅o1CBPϻ*w:![Go},\Z'9v&Pb* +{x$qơU 8I@7OzDWO @EG a\n?*NJ Page 17
Première page Précédent Suivant Dernière page Texte

xapool-1.5.0-src/doc/online/1.2.2/img16.jpg0000644000175000017500000007362010235646675017706 0ustar twernertwernerJFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( +.@׾Ҭnt,ޥy7d/9At-|Eg˫K}Gcw0I< l`X.Hf6({xoLUx ʓAjMKĺpcHH AA4Egk=yϷɹ97 ˵ujzy_ڭ/w c8FqPJݭ浧EؾE&;tbqE3@صi<ڍ卍֩o^FcRR6^(bǾg,AZ]G{n9ƶ(ĺ v=;FHZC.3 x$ĺ :\:ޚ|ϲ+A<+=jQYqAKT[_OKvHbF|x'4wGVǙKfs'hB(; z aCLt}oloydIvg8q4(..xDm6m>L:-UY\~&ߛ8>pq8=} hQYsxA>ŨTt)fѰ`c;˫95[s \ xcʮ9=kr`r[;\c9 u V^ L=G=N'FUhA,y/I; +>-wGVc'~~۶ٱqOGAnK vI+!I8>5(4={Wmt[?<6p>S,c|@7ujl::\j&eʦrG܁P+/R.\-3X&+2qF}e1ufPҬtb;!>lY3J0rv:(zn6q+i-fYT6*H8jZ[ƩZXdbR'8+.ĺouqe0Z&!GXW8Q''T}O70naG=sn`p0'=hQXcƞkw_uG_ŵY* ݀HV w}(ƞrxF3KU,džO` *մַ{- nO v, Y Ct;OWĺ :\:ޚ|ϲ+A<+=jQY^Iإ C v@\*Kݭq4WX'G(tdwTbxZXaU H*OI@Q@Q@Q@Q@Q@Q@Q@Q@5ؗzcqc,3U͒3[;Wn [YS5YzTz|SK>[$^Ba.E$ᲀ,/=:O2$F` FAjy?7/,ndQhW8-x xq珚Y~!M[Ϡ]zg<+#e)?+ e5mJF.FK0 E,@8A#Mo ;fBNFGN 5a+i|lWWvrZyn*)SzO-բ`qeUP֚.Ι.&@o ` NQEyτuO.|1Wz+G}pVvBHB8IU@$Ik2Xݼ!6\B y͙/B3/Q@WwMG=hexo^$ >]Ym,]FLK,,ۡ1)'x^>{=:ݦx;Hav6Ʊʰ_r=B'ҹW(Rv%Nz |=״oU[j7^i,wJ_8pA'Gy~gv󞹭 %nMcZwkWYVyn00C -\k֙hX.'0BC+8bh'v@> .. ;|}1_wr:uo@ Ė^]]/ogգ-B4S/:"8EyZ&CQǬCMi+:,L0`9Po xN.,f{v`$*υ'AJ/Q@ogV%0cOZ-"|əv $?Iu t×Q?q>eq|>ExN_ VpGwj}+R]HCgB+/'NKWwRc|G#,FN6cCwIqI항թԼhmaqF93_ڏۋI,縷Ki3i%@9WO7VEJ$E `*ͺ} ;VU 23F}y~jzIaHGJhsy#E(V1| )cmSF?3ռ9}yX%wi8p6"B&"A VG  HB(q<=<565Swk)}+Yu(ƈv<dqϖ_5CIڒK[K;ZM#V7$|Wplp(B\X<Ꭿok+5 =N{yTbOv(Ci9, /5 x[K7fKhA#/X&{(g{ k:NKcʈZ%sa 6 q.BզO|9yeM&iy,v߻U,*=£0B pFgDdI ʬA`P U$w=(q'X[f&xϖ.yoWYQ0QeP йoSTdv((((((((ym"h%BG"WR0A%z^[WHޥb=܂s#,`1۝ +d,<) F]lX$cF.r0Dko-ıH^I$`I$Gw妱c%u~fFbA(˨Woj(eӼ`` ׵;Zt&H$x""R`J#>H0?͖wuC(X0+ˍ{~sᑊV2ֿ <#iGZm!R9YL^^G.m.-MM>g-ڠێY1~UңO_a|}?/q=q@j^4>]n}BswoWKENAfBk$o5[l,RbKMቌOҺ5ܠIM6TjQX2!z>J2ey vnO?14u|| YݡHI %aqq8#JkM#.c%v]V# 0IH. ;6RmR->5 dk ]x#^ =*; G%[ *H0#nr–%'=hMhSwq"zdha;c #r̤YuMfɵ%i?wYRqr+0DO2=d~a4}-'^H=*;_ n>&o&4#oʜ Sk+k*-Vydb]Sʋ_\I _Cghe+<1-u+F{ 3N6I墩nrO h3iprk H7 w>bIt->{s$04͒r }hֵ 'QEB ̶}@Y czuc-bWK_y%ݗS-9RUAbvB9dJHۤ !$rltZ77q?TiO>(͐nöG;ry ~ Sդk#ȈҫpQAb Yݴ0j\Y:It->{s$04͒r }jaf/gAx˗Q$jH*{>p-Nh j!!%Lkk#rSZ~YeX褶yf7*[a@ IjB"hTʋ 3ps@sgk?jVżGencHv̖hO 9UhTq.6SO^c6$qj%mAr=E7Iy*Lo{(ve~M? }/eϾ6d7ܞ~chtK}ZJ49%LhBX9 ^YEs߶i\ۘ#b vC{Gm$Ы-rʃ=(If!%P6EvЩ>fր9j:, B;[1n#dXcra?) X𭍽ޔO-5Nh69:ß_\V>DmM1j.À0 FZouoei]˘DYaa#kkpx#KuOj,vvѼl!Y<(MKM ]OV"{uY-MB1DwH>̀<|(󟎽9H<5ooi8QU&@p8֣_ m<җʉQ8Nw7N[JPE{e`gh-y QB[ȴY'Y$Hᱝ88EtWռ.nQ(eT LHmqSjYũ:㾷.̒8,;|m cǚ܋BwXA>g>w7\U|'2;VQdYGA FA#.ĺ凁乻մy,X0i\FD?ԯ 1 n4$(7E)Y#ˍAC5^hiKx1p'9 I'5%J1,hmƠMgh h =gJtXth#ӵ;$TuNxsJ 99r{4˔RxX/KHvD <`sߎV}>kI<"g}^l'ف c{qsMjgmW\E@s YıP5((((((((((((q3[ʶGBꭎ PA#=3+-^֮< qiR\$P8hܾ 1 ǪW'aZ]ƝqeI sZHq\Brv|?Cu.MJWѮ5DWeaT+bMTNPr1OͩKse4oզ*{8xe,PTv]g+ ϥ}B=kruQ+Aih?5qdmd|͆\ti}Z6sFypI`|0\# թ74 twO[Y q[4&TW,AF#Ҵ=b\M_iSXy`,rl#HB8PXepMIm`- 7,pQ<`` Z+VѦ8]IR8P KZtK"%f2#Uw1ڬ"׆vwqIsHчf$`+&H냸k<:Tzj] ~j $0HT>BO/ }qj76YI:*˝ynZg=9='◆uB(n$DmA;dWRw8ي(\n/\׈nuOGWi\i~m&o.Df>*寄vUt` qMv-@T"*rֽ=Ƴqu,,RK+L%Rfcfs39Ïwm;Q$ӴNb[T{LNv,%n@$ H0fr p˽m>ص֕>zydrrJ/vD~)M,-^S .TG:+,pﴡ`@?Ki4ӱXb+!vȬ?:Ngy5wv[%X8Xf]!]wO֯u.Yⷶhduda0 TpKA 4"^Ji!Q Py۷3Pry,ZcqO<ݒ)Ԉf;@ o ?43ŖOqed"9]ȬWP ; ?ھ^c۵[mI7i_C>DY<0%5-ZZŤ-tʻ K̀;ºJIuyZ4,o|.N>j`>$bxCZtRK9-㑕mr+oM!$1 V~MKIIZO>QlYebmi @.8~O 7/>[,6ݢ*]H sP~=^}%WKmmh7W6co)V+b xQéz55ݚBdDUyUVT&@>`H HufBsQ'AԗÞ\e Z%@H`ϚYػ/D3-ANԯn/$,@A"ILyʲœ $ٮⲗfؿϝ#0qcUd ׵kM:u4,6Ao*Yv:987T=ko{%KpЈ|Lwb jWP}Zk( ,4) RAdro[Aw> ɴYdU_4aݍ~u#K?A7tv62~ t*օHwiZZkS[, XRUл` m.5kDHVhUjbNx'@ ::rnۋu@E9j;%iF>h-Afmvþ62nM,mIݐZ ;x5^EK#S/=⽷*y#U0u [Zmif; ZE|>X>6Jl[m{Ek\ZdjRo{oc5y>RK7`G=qE滺񮓫}Bۓ,HR]"2F|2ixOXݪjINv/j " 0TԢ|7x:f5rY -nd4ZO-FFp2 ómkV2}Uԟnyf;q˃qƹx !ῂYxdkhd?|śZKVZۏ9.M(S۵AI!wM'1kzvqݽ`J9"PX)@X.)47vzw^u5ŋH`0 X2Oʤ;X>y&zu V#>`(Ǘ˕ͮCh|mǒV)nΠ S.ۀ|]g^Og}ohoh% \xAԮmT4.{$3\MdUsCg5DmMcLKΙg]q ,9bsv45zVd:lwCpƈdA#alϙF̫_[877ojZO,Ui$|m*X $ԛ[kj1-ke#A,M|U l%Mq'Im'{}NܬL ,h ;Gn(6׵?Z5ޕ.{24^bdZOXLd=[Mm~M[6Goux?)LnJYB @6!}LJK84&.̭4$ѕ+Xzo{;[ZVtau*E.$%fnw(€ &5k)Eh$x 5r!2U",Fl^x7̖w,mk!tp1`šy֖4v,D^卡VNwyJ4w.|j?jڒnӝ'ڇv|x>>aB_ZhwS}Usxmc%ߴoᱟE5}&KmBM8Za޳$o#|A]X2#:hz[\đEdxe–Z֏usZ<7w*lyA勝<(@itbЧo[Bx KBPLworWj ;__ucN%{[[;KuḵKQc6NՒ iHՉn5(:sgnBvx3w@dVZgs%{+JL4I#Hrɀ "k_ k:冟o,.`IeEX njM{A&]_X,PbXdw{MČֆ*V՚T;{ p7;b$e$ ԓhz%Nk" wvUdisi6[†=061bH|ޅ]NhWcu[ [H[xXb v Ű 0;^qOyw a+&@3 #6+&(4iR6{%dm$/B񏘚˼ҼP4CFO/8M$刣C+n#WvBJʛ vQEQEQEQEQEëFqn04oRƊ(9\66tusk$vzR=RJԏh/ .ۑw|.i艪C,k2H|{ e}mn:RgF$}P;ܾ/uཷXc9|pcl3!#p^BןCUže$Ş5J ܥewi艪C,k2H|{ e}|*D6訍,2"j{Xԭ KopsC/Dx1˸&n;mPNO.$)bI *bH@$˽~q7r}Gݼ:,|H^5RH qQVޡm-9I%GrtΫl*7`m^ғEd}/LMZ Icv7q-> ZKs!Z2(2WA2ʱcS|%j5՝T;TN'gW9K.h3ެWE3ȱCM2+A@w2Om2@nm$C<wRąc$g Ƴ5徜lu| G`TY@NݧėzpDʊW+#mFIUc ,<ΤKH5bU畓%yn=ZkT]B=NXm!^p04I.W!B-细 7i(qQd+5b;zmSY--}xD!X8v˔%9F@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@WI%j:NY}k \D|O.68AN^GXq̣8gxFM*Ka<&""!8Sd?ۤmuxuX5b;e`l{j\vI-nƵ+Kk䵴즶%@"`g+=d0m8kI.#ۇA~tOj:NwoygdWC4?h[%3]GW:d%ͻ$6Icq'p^[,Ryqr:ƃVe犱^'wQYJMvLe",cyUISx:k[m!m-lq,LfGns .`K-A#;’UfBwg<(f,/=:O2$F` FAkClj|Om'4pޢ/oJx% Lt m _M޷= Ks2DxYV8*w@((((((((((((((((((((((6fmagkkC n'j(FO'$ēIYc Y xndu x߃Mb-@6T#p>.v}3 Ex<ݎg_5PL%G_(Sr_=gKxJ]&Igy%X8,U~gbw9 +뚧όSjqxdZ8měD)>Y ,0ZC|E,{J4e8K#l9QlÑʰQ^'?xWO߈"j rml ݲ ppEeMS瀵䳼uǷ%FD/F 020Uxo/.lỂK]h$2r# M^KGÏBx lHP(*U~Q<ǷvK#a9F)3(X0I<0),"V` _SXv ặXTeu# 8 s^^mդԭ|9;yx&Lj#U8sz xoi\(mHLbbpHrd1#J(+Xu~]I )<:Պ(( ODӵ+o0웕6Fr6U2\fx^Xw̠mrk0HRQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@c? ٥35;rȼ~Q+bχB幖*9.Y-dVޮ|AFY/QM4Sj`Ł$瓚Ԣ3?:ywo^Q+JC?mn9|>|nִ(OЩ&> [xkF0#f-bB'[P?'T]V~].Q6X9q|7==kb wgmamn!IR(Xv-1` Ǩx/MԼ?rY70J]e<ݙؖP6` R%QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQQ#Co, !e2FONHW|KҵˏoaF\5aA$#\vWRm;Z5_:ֆ Z% o0y%P|ϊ-Wdo-.̤mJY2$'cv A%N7(+;55jWv#KM[˷XryJُ z..-%X)Vhnw*FFHe/JTaMDj$b!vq8| qx>#vRΠ#I!mkZ˅nq6 g㌀ze#n4dh [k.BJOp'px_xzV#SD鵙RnuOjآ/o--lu2KؚkRȉpav\ e6zgmv"HeP]AY V$QErn:RgF$}P;ܾj^-𖩯=DW! / 4QYzrh7bz[k]6ѸJO g#EWg;buoEgޝǒI6P!N [NjUL2 †&]&HYA(~?xvYP-0#f<ČWjɆ1 r2/:ڌv#PobaF.0 Y2 H$ HAEc%հIo)aCIv!N S]w$GqlCo+*`0+ܢyoiֺ6Y%ŕʗhđL%ѴSoN]jFU)'[yFYtB#e:IEszt_ jřisE"Wc/I8 rBIu]&9vn, Zېy* &ppH: +օgqsͩonVV*7,d<\g"#&6' X$IQ6>ܻWn[z W>5dӣyp$:fT2+H*8EW֛o<0_\Ws[nF%c=H7E4Q\~]3Xඁt MNVIȑcv@+'_$-bW_ePҔ*L#T2Y|nHQErsj^&4jhX%y?|%esc?a a}2˛,m!Cj<%UVc#BrB`tQ\!: E΍C$qY6B[/u"KO*D+2'ݓ23t`+/^慭6F]֎*ȉ_4%vĺƕ[ŞZCsv/R5P9ӼZmM6Yṳ|rt HT-wW> i0GS)KSy ++muRۃ4^*4k5k͙rСYSvռAk=6;k5Dn('tOҤ? suy|⛟$mh.uvҬ.4xo^*x@nf6t9㰬Y {h ڮRFeR 7/%Kk闚6k{$t츎IscHšƷa}.X4]sdXdAFPơ&& )ӴR+D;UkYUQwȅI 8REK9t='X[=Kf/?=ȟ.pXb8?XjZ!qEioiA=y|$cn#Hx<)Ht$fk}9nkH cA{a$kȵҏMB /r122yA&Mq,b.fG d]hw::lS}J)n(վm8ȉ 'h ;J(?Qw}JԾר -Hyv/c9Qmp[gaj3Y:LZН'gVPEMޣ-FlyEyțM7Z{G' J*U\]|!bѯfӥG&2XR{A ˎwŠ|;>.t?]hW6,id6ŸhBT MbQM >K xy&`67z(7gNZՌZֈ,o&˕pK7~ 5˭fI B(xu)MZoaՃdwe}MZGzݦpy9 Nxv+c> kx^REFbǖ"ĂXy (zYhFQL D@JH[$GU9K};MM}eOۤs79 A wPj}izjjn[b]Ir&+Ǚ$'1 jM'¤_T%Οgu$3u]SkȬVq'kZD¾!K{9-~!l- Q7w c|ڐ7cA kH7&EL85Q@m7L5gb"0P N}@ľ*5+6FH.&T;x`m$nK"(?ywy4QKHD0 ct`~y@)5x=JiFNmyGm*Vk( =zK-.^ v7 xJ73BneߒX8쵍:Vu1͟:i%*CFۼ J(LCZxPuѢW׎ifKcU33o+%ONi5 V;YY- C((((((oNu-QtfGo+Xf'+Dgr `*[XYЛڊQyb m4PZ|:1F?a>N]·-t`ɕjY si@H]P3PY*{ ܐ*JJO[χ]4[ڬO T;`$ׇ/4]7U+=*O-b1T65b6@&d<ą;btkL`Z:g; ) `" 02XcCl=w ٴiR;ܣ[Ǵ`P7ᙖIաIjw3G' p@`˸d8szcUvxcZWwt**O$v}`jz\M/&kHZ ,Cb6%Sj^xOmto.|K)]I.U@,$8VyqPS p@3;[VVE++9 ܐ$IixQӾ}oHfPgin/\m2_$mJy.`L;p^s9ɾgF" >70Wsx>,QEgkzuೖuቧ,(I-m),@ TpO ռW4x䍃+s ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( Q|7w量Jy5'X$YU*I*ãh:]HY[oHAbA8gPZj{ɮuAaPHs}1}Yŷmam[AldAi;6qP>h|AbQ[U:nfMJC;ra2SzdV]qnf -:nP F-#J#I=2m7]֝qjeO%*-@I X#]h'tj"k>4F$y"#Ua߇aOIaѴk.ݤh,㷍 TP3(%í6:%mG赫<~K1V\a ۧOFdy& įY2weh<UV{m;غEP{oQv`b18ݡw#/\>^dz>юۼs Դ8u[9AOIdp˹ƑŢ3ɬjQicbxЊPʠ^WyTJ{{Kcmٺ<'OpB@#QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEfm9ȅ[F{dgW[6\xVHpѵ|c! &A瑏TNᯄ:Lfo'㒹ߒ9_ ~]ƚ]OkP8¨WěA yg>~ڸɓdi$2*/KWU(I%4 OmdO^kHFv bUޣ @`@^XF.>} l߼ !,v8oB.muKSM(/- 2,mѫ9Umx,C?wf^ƓB[O5E\wF$*F}'_lʆx/q6W7{p(cbhr"6p/*upn>\,Q5y̪d* @,ۏ_еK'}=4Ѡxxj^4>K )P8'=zEo iwtvWq>cF[j0kBhvIᮞ1q/$̏!Sظz׏,4{ntR,泎L,Pb SdYå i7"5-唨 2j_ iwuŖ$3i"O-%s% r;n?rɢ 7W$V󿂞$3^մm쮯.{i7J<\Ns(߳B=Jm_+]ȀmaS RI*U`0Mu?<1exk,_N|29n>czu',t}]y_WI o#'ͳ[]i3s]ދT[TxHکHϸ+7m֗RԢoVaI 0P4`NHaLH(k-_'uFUCܬʤ` >Z;}LIJګG4cXGPʣ;:M Sy>Oۭ"nٽmqgυkmi5bо) џr0@PS)vZLW3Cg߱xPvNsxk3^_X/uh$<䲌6jugh˥ē27Ux UUͼ <'uqC˨YXiҤRIHa";Epb̫%$gaJV2TBG09 7:t7ِlԥe[ZHwW1 #S ;.1]4NSiJP(>VC` MARԜ\޽dMPKnR g $+i&o-eiG3. yj>R65gxT R3Z\\=7axу3!I?.T%i{_ѣ6gu9>@LWjd*4/|5KhkjVZ^$+$0 $FmpmZZMo7 W)LXHDf2oܱom/FNiM}ZL vTG+1CnxNt.&IV o,qHrn`G/H$hZU.DŹ,$0bٵPwp# iweY}kXu>i 1BX.Nw6x5i|F ĐIZb]:Ak.a͎&}de FܬkR i-z$tԷػ۹_ @*sS-Z].A۠12xQU,@ 3V|ZEsnݳzۜ 8g8,rO<j/&IfiDgqq FcWoAuttmKi +xi,U(' z 6=5 $;l϶y.Eo)%f"ʠ!/ڬIZ<0]̚w!&XS26+ykxSĐ7PI-v76r֐4$'hb,x:MG]l$nZKy@dmfr d&C8|>^Ӫ+4kþDݹa:k/QD n4SP)#՘ц<Ȅ⹋%Ic_>Jd _H߻\2->X;@; }F;Y<_ H pU A+>/k%s%hRclvRpʤ8Ujz2;r\3d$P:^pI6"o \fLѯg{/ #/ɹ~A O E_(Do)FEOcHFN)-jK="M}Z\ ̀픨Br2^N1q\=ve<e 2@ Iq ->4XWWpIȋidž'P:wRjgXp۴DeE ۆNp)xCukF{!.]\j R qqb^ݸ(mg3yEًv(f^?k(F%_Q*  Ki[},Ud6<`%'[UgK9lexP :9jQ,:l IVܤf&dsoͅoO[MV}3F-iJC)ɷ ?}v,$/=c< ,@."(aOOO׵I謠VvV"S:\3p+v ,J~52wiZ젤A"_]OZԮ@A"eFai9q pv5qn ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (zp>5R+SQb!BEH](PY;$ܒjJD;jW5LntYna`n%6N\(¦vޡԵ'I{oXmUu0Vp!1˒3 Wσo][yuiRW#nϹ_r1Z%V!.o̽ `ENGV\~!%,YVjhZ rXer;pz[M]j}?z0խ̛֓#nW*@ˋ_N`z<%w[Y8$1p@=B b.@^+Py{LێWvш$>%j_cسuϧ$`!;$-mĠs_[ymi$;Q,HQc2cQż ZTVG<z+ K.-cQR?^A;;wE)uPu ?DA]ÿ2=4{Aăt\H V~qi?nil򼯴e6{g@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@oi4<Oo)Y$}h +vC:\wgk7`3<ʡw Wjb!($ qUE81RQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQExapool-1.5.0-src/doc/online/1.2.2/img17.htm0000644000175000017500000000055110235646675017710 0ustar twernertwerner Page 18
Première page Précédent Suivant Dernière page Texte

xapool-1.5.0-src/doc/online/1.2.2/img17.jpg0000644000175000017500000005566210235646675017715 0ustar twernertwernerJFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (_)ޝmc2O %d-#%A9ZGA-/nʝ16Uv6b0@5ݦiFF]Ӆ:F)5_?6=:}[;uy^oc]x$O*Z (='>m 7X 9nb$'f!ppN \5?hw쵴| cH<GJWiRiWswMۓ\" QoiV~0i7&"%2#s ak|]ϩ5sYȭq+TQ.vlp'9rf~-m"i_諒bp$UhZ֛62v&1[xlK<7GռAYZ\\xtb FX1D}~PԴ4лI&dgZxK:Ll]@ Fy@ؠ(((((((((((((((((((({χqjk%J񃜪 ؿ3|2F++YEYk3Α2`q0ӥrzoh qv3i-u;A+ 8»J(߂C92ZM$de;qZ΋eajAXYH'*x>ErOh6si0_Y[̑] ToF჎3EWѾxCڊ_lWKfrTr+ ÿڒZIP\Kk,v)q.q[P{ =2;; H--c`FIŽI'hz%j =ݕĶȧo2"18ESJΙgmAvSNFNz>?x{TRໝPq;Ȭ99]%W/],g~{Gځ®v '( E4ӖtLId`df*Jo:],p\ H3NB}y(?%i~4oecjfTX cZԢ9W~i4/H2oĩ>s`'F1I|<{'n?zhw4x4&0nϷs<$IօPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEW4<[Xii;QA,p98~gMӮu; /YV~𥷈!] pO~^EF`泒Qܩ8!$D{T\6_G#ڧzzz+i-u4qv$H7W8+ÍsVmMzMCMоk&"fIbɜdwU'Y5=ߛ/GS=s=yw}.K,ĕ7]55a l-PU3GeܔW ̧ ZZ=jLQo CƥC#G|0ݍ8UbC,%85x#yM)gݜܱ*7W. ]NM2Q·dͩto,opBO9Ҽkq}uK!`jamhsВմ}=7@jէ}\0i[h2X["};Z޻>MPbYؖ ٍv @.o|KZY-;RYm-Օx6 5 'vL,+[{Y!a dxG)S]jAKkdA'@f|ĪWv2/-yqֆDH6Pb%q;WK9"驯 fdoWOt:٘";-䢹e8W`/zg{+[[Hng{bW{jMrYJm;E+qr\5̶|˸IK`#1$F 챩i up7Xjo} i7.-r="Hm y4KFvL&Dž.M{3nZVXQ٘0Y~M&-u),#MK[pZVX,LlQٔ 30ޛ~}xq∮/'XP">Z5PAs=$cХ%oT3}cJs+2~G}3Ourfܯ4@2WZqJ 1ɑJn^jSlVKNX! ;&p>YZ]V.l㷷$t,䂠dIU<|}$q y]LP2HC^KHWڭ̚tc.k We(\q0T};OjR%0nUba,Q`q$o+ԯ7ZxR,5p« bF+#y_'|zF +I\BY}bnRWvQgj`Ҽ1-e,ȏ wn/ xi%gږok&grEy|J3"Fd,@>iG}m[q_.6-'n0~.hY;$6p[5">eq.AK] of\x=&dIO|άAv\r  !y$($s.ͻdGGT430!\T#lX6;{Ąvd! m݃8n!Ky=P`4>dHu GVනU%x[n !]N#Vw"XcPa.H$ۿ#njGJQX [3;oR@g (koy^fl0{ 1̀p~tmܶn-գ\XgHvvX#!⋘_SM6H5}2; EVW  dRLS[4f jm+RC>[( 9BXeɨZkmxz_?7my}3({6ӏNIm{yyXN8@!d\lA\+0'r.izJn-mظDP";1#`Z@nNr&^赻f@PG8 힕_I񦟨V\+at4ƻL܊A Ǡ8 ;3ºv[ 6h_1i;I*z>vs.m= 2*烅fFHaYisF[pdN62`o 7xN?"}/-/wFDJ;s(P˝Cz ݵ;;tm0q* b n<݆X GO싅y`-!N Xv.HV;^5n,{$&,txC"m%sF7/:j0icSk͑]%@ٳnK$ Ā2H;oQ_\mo8U[We I e0jZ]>&YaKXRG+l (,V(>=_\5[Z(HQbdNL`r]Td>/tAw$ 1%8s?$/X܅s\HlnۮvKVrV\dR>?okiڐn%afǸ3\6w(BM&;k4-.+{If8|Ċ]vkQTԖ=SM\cw *2'z]߆:w4W1$2:l϶E.n#c1ۍ;p̻X6GQC@-m--eh|rLdºac~I|˞?O^G_n?nMCRIܼ.G$m 9JԻӵˏtyq"%KlX6@ʗE c 5tx@ƥyGgm&I[FGՍ#:fqXO!. "˹wG"A8 r͆z'#.b.%͎+[v2ne 70MHWڭ̚tc.k We(\q0T}AEPEPEPEPEPEPEPEPEPEPEPEPEPEPQ#Co, !e2FONHTwy%a<]lxLC);{KOH2cS dI ̠~hxcY/6VVaUY"E| I3F#]Gq]^2jrjbk0--~~6iwC@\F_Ft9lD8o% Ʃiw]濖2!4Gەbʑfہx&}7ZE-ʌu+aNP4ci3m% ȃa9\7*2FCzjW?Z^4Ļn!9\IK!A!2%\bU7(}RĶPۤL#}ʭ¶¿,e~`(Q^?rojMxfP'Oen o-^%)]A6c6qG5K7!.yGvcJ`۴kϳoĒ7 HvaԆZ.(茉!QU,*Gy?bq [ۋKt6r\ ûkRn b!‡@ lm5OkeD +!# q 4w 5dk,u1%2 й W䙃!A"5"dhhzj=,־c>K#b(Vޡ]c*GZ , 0I9cFc<$&\_[Oi lS i;#HG>Tcϧ+M]6t;;AbZDmid!3G,ZaiXml<-5ҴkQ[X$ƱU {go>gYv~A,RVPT6z('WkK{&4 z4YYv6[Ȍ[z;/YV~𥷈!] pO~^EF`泒Qܩ8!$d((?PlK a)s$a\d #aюt( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( yᵷX$/$0UE$xsQ\Kig$O{"@P;vU$tnk)l L9(̼P_V3~ОOqׯr ặXTeu# 8 s^Go/ZP9}T898ɩZ&]ۢ$1ʷaR]P6tWͬkCS]IYЖMygT:H+[qwZ׈lU6RM{ks LVE1N$PT+*>Š=OVߏeUn4eo*"(pٵs m=seK-պ kC\j񲹉 3)u~e!zeG$R U(CaS؃޸{]KE].oq-6RnLd4vևOU5*Byms*,@s kYc3+aV$)#{>%y?jNo$nG5Ա2 rs ĽnhRjv%{RMJmTQaU0h?98:J+?=ޫw}vz[-ɊfX3(PȣBV>&g-twZerGq11X:Hd 9H*Qzyƹiڤp6w=펟tE|i&ev 2k-H"$:rAff0 i(ص߈#cjwVlQ*IL,KbWBCo0*8g"7x_d F vϫv:~7O=#1,i"\eB3V*g-̞+Yd4 2٣iJY6h;h(Sէuh5YgҢԖT&{}4nB>rcb_~6ni巈u༵'I$-sPLye)Nͣ9J %Kѝ#,72HpoڍG2 =N+Q$JA\O daUWA {Mn {/Ÿ2#?4n; +"Ək-:ݜ2I2|,$. WcO=wfp-l&@/^Drz\ڞdL&P,r\6UмlqJmgºFpPH3bI84EPEPEPEPEPEPEPEPEPEPQ H##F8e ڤ0ZI>*l67@.ĠFjƥ3VY O$k2HIUX S\0R{co@GF0"=T(h#%ܢiwEz|O\Պ(UjJ)q*E7˴3Ƭr 6 7n֚lbۛ_"GicXQ F[q( x|/gslaeKqw,|)].mbX`jM#ÚFri1-˒3 X$fcN^ 5}Fkľ7y[ZJ|?$ 6X`pĞЇE\cYs+ /*e HysEc[Fidd,^]]o&3Ii\$  HP(WcRPKPUȌ6| 7}jGGWGwY\7ӗiJ#o̧hwܢ0Ohz\^H3X*P|6ocHiIuy#dWjFbPQ@PO BbTosuKt rG)'u 31©_ 6z=N-kob_3{u>t~i<jLݷ+3NѼ߰[^n˳Uq;#\U5OT5#:I%e( }nv[P]χ˧٠!8{8>D`m0Xt$Cߙ{p._Ne W|m1gɷ++rǛLv[}\r7r;nl3eHZպ ȶhFٸ*nJ k1m/[ee( `20S n;:A VG  HB(q(((((((((((((((((((((((((((((((((((((((((((jO n2@\;T,U XMsxĒ^]E',Z;=B mI+!c"U1_݆hnquoeZ\h.cevF9R0}g^&5l5KvڅJRHs*p9P7vnQYZcAj63nfDMrbpr#E\xmm常8` $Q@$VkmR^vzuǗ%Ɏa6%B#'4 մ۫ IpG2n[ǯhktcqc:x76sTڶ{omqiZOӔ)fA( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( Rvkais4Q+Hە@GI/,䵙H0NBtyұ \ p2zfw&.VkFX0 t8 #-A{xΗwwi忝kh-m,QV(cw(8jn?ZoP'p^:}[6iv5IJYߙ !+pk7_fUl7Ŷ7`D1&@RKwW7KszCt?{{Ǩ(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((Z}S$c"g9 p zTp,XC!vF1GwİOxʎxkybI ,72:<ƾ"m;G+ִmO8P]>2] 1E74?ՕH%/$*,5\z[7ͦZߏ+HɱhPC)jPI4%K7VԭRD+ a"2a(۴ڿ-r_Dpʀ[Qr6ڛ@#Ԯu4"[Ki㺞v*"sņ0J~ /}o|0puBH#‡*l#1Eڣjm#PgȺ$d<r`Wr k&{ _[m$d%ImԹa#@2WGKX7zm݂hg} .SNL.KHVTnFP$,XXK>zWzy2m*l wN5խgDw4_k.1"C "<im;ZE'u=>Ma.Ly$Dp$ 3MP#(n>З 䆷%Sx(R8ԫVuXBfS:,vѲiMT )U]( @0k.[XSK'ʊoeܥ"hjP2ryYkVp̂x93(m+ I$Yc-GQ}. nJ*2PqW?v؆͚_] 0[$ '!v@~Oxj}3Kik-Ʊ~E2.#ryHA-|E= u'XmR&˦ C6 es=6q,1>j`tNMS\Ev|$pr@])UTlM"ԞO躓۬6 VwTBXr] m7$d)"$gbÖbKrI=/q%>*!O*PڣbmAoCKpd #p6"fnGLs~ɭ쾑w?e[|v:!tMnPe#,>~sCHŞ>궶FKp7+m F1RKqŶ(\Uڠfqk?X߂+cZCu dۭZ%FS)Wv/7ͨjZ5KekɌoq,#@J32!Fܸ*@:Iic6RԥԬSE8ppcpY7.g+w i0ȤƟ3H+*.b\.ltҧ*2?T$a$`7?.}xwKԡҾ˧i_b0yH$Cj2mcܥ#FXŞizrֿgɶw)vWweqxx-g[}RRk;7q*XK|s0U$z_|1sjl,IPv|f.j5 R,VHlZ 8W_/\Xvp4 Kuq\QK[BrŏA| F=oo45mm,#`eqFv Mh5kwGU]^=ʞAž W1bwlel%߉!iI^H5X՝ n'6刌/8qbN-4GmOBc³(W;vޛctm]+YKMesWR|m±V 6E^ݡIXL:Hѕڧ(3n T6S'"`. nns?&66:OVM7ʉ-&KmdqfUU\2Tgs(8~ bc 5iy$EpQC XSVQֱKn c-V$ a0e|=Ic.{WI- ~KBB#ٛ巍r@,^,K{Ij[o,HdFp3CnC([ѯ.S),ʅa]7pOC\ԴJRѭ-kDe'-$R o* dI|ΕxZOKm= t)"( NrwJP|O 9zvbq&*! 8}w)pi6ڭΑC5ͭ&+cX #0bqk zPMh-p.1<@P)F;Gr~oVw/h=(]XImpy Nm%V\DIȗy mw?X٭o-8@vQ ~yLLȃnN*DdΆNS|3~͛'VB36/ĞԼOiMK8.bc, BH,'5KM=[sXȚAn)@_x;.=YԘiA2,WcnHl ԃEv|#'rpHm1Y+XMt{RNmBE %S \5S8 ʯkI,4mCt`ux+NQ78flx7F;=3U珵\ژ['w9ezn %NJ-G6o7ZOzl\Hm<)aiLjZG;(]D9{s"~2ڦv{k}k&4Mh!XB,e\ݴpi>ϥk%MAyn@Prxo4gici$i W($s WhסFcj0i\K+nP1q"nBv^$nҗz\]I/Uc"00^#:mjZ}sY\YCGo$(͸cǣxFookΌGH]T;9U);>$eҾy_>ˍN7cgTw>Y=VK[";$[bն6֏(q|Ygge$yPbDtcܪc|B0^j1h׺%oݷ $v06ʾF 垃he/t?FY[yݭUY3 ^ x_RRFDtq^J-*ʳѦ {~m? :-Z _JFJFrX/r3:r=[MTKP}B-̦T^9d@;Ziu[K+~$EeFc*KʀܒBV'D|<,Z-kwX#O2F3)|y8_m5hOVҴQҤjQ# \΃W]a0I45fr"H?ꘝt[ 9Pie ĸ" !A# G-?+v?'{ߍg?-z$z66h)[ELrɜ/$w'ypo3g=Eq~ѧlu+\MDcy%22;HL}<\.oNԚytW'$-7k:1DRl{/ɐM[MTKPMBdLW^yTH[;J;;5[s3\ Hd¶H<+&gv֡qs5ۻEݚ p6Dc!~uͮ94JVI$K[GdCeY2Hh,RYCv]Y:yP&c IAQckjf~v:z]#noR[N0;{~}|.(]Ί}S 4,q$[y8bI őq lfrA<7V\[J6 dGhxn⸷9$l]H #_A8,9{T̒Tjyo^^jZ=WJ[x#U\gcF̄aq\ɬZY\Co:wLe!`܃vЮ߽lVOyS,Aᑹ$z ((((((((((((((((((((ya lyH܌傱gOj^CR ?D\%i4\ClVogs.Ǟۛ`ӮF6# #N~u\ILIڊ cp5_, 4R4֞\85VĆh'wt'ylr?lgLNpA vg!֬.th[DJE@‘!]$0OoqO|mqťZBѠc/}vPTC$}'1[f/g$0x:0\+ *l(5/My<R $XPʤD7G 6@Efi z 5ŸVc8$#FVQEQEQEQEQEQEQEQE_6?o1E䫳3'7m\jPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP\f4}Z5Sn@}jwh 1'o61EetkM6vB%Dr P2ǰ:l:ڤZ}j&n>2GʼzU(9 g7x_|L FW+v Ď%PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPxapool-1.5.0-src/doc/online/1.2.2/img2.htm0000644000175000017500000000062410235646675017623 0ustar twernertwerner Page 3
Première page Précédent Suivant Dernière page Texte

xapool-1.5.0-src/doc/online/1.2.2/img2.jpg0000644000175000017500000004711110235646675017615 0ustar twernertwernerJFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (8I/ټ?ȻmWd(i> ?-~< NݛyUpl^|9#SԵU0!F#bF݊_1IN AoM/G u.^Z0 *6e+6̀y❿x7VӾu4_hӧ9. mnG=Ծ>:xZvmukKk Ict_.=~`Bn!%Ձ;/^,t MZI%XF WeܶyY\އu:CaB$.|͸A ]%x?W%:+CTxg_>(/ٺޛƅ'+_@8apS:>'wo7.m=}}o;t/ b"ea@H?Nѷ 7=oŸfҾӿXSc {1:x^؈n]c}<Hqf=[u]O4ϴ8zU/1i"KZ+$#b ":A슬Q:8$sG6x-Aaiacss=@Y@r2+9nG1I1#`q7%H"|-loZGg27$(Fqk)yl_Oݦkm6NQʈ0)<=opJ𭡊DǑpes0/|+|k { o-\ /ɷGKIoQ%y׼YaX+Z8<o֭7 a3B$z}|Aa%JU#GBkRY;mMJDI÷ L?u1Z؍[HgbUW$]xCCKRO T[]W#1<\y× mMw]R^0sB$opHuP?|+xZd.xA;\a;FpFqK3kYF|%$nsln88Ex[F N%x'AD}vszV4h$g%{iYJbnRHg\ v0ː2 ]U{ =NK;H.dgHʞP' igKJ-KM4]2A!Yy"l3\8t/ Y]L6/& #scqIp8U~f|N|5Q@<qǂhg .35?֏%ՌyԚ2x|ɂێ1]|5𖡣Z7d6vf.r0o"K =2;; H--c`FIŽI'PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEj<἟ G8k(fW Y'8^Nm-mn%. 9I#%d`pA6"8"HE4P0)fOW3uWCUYLLFLs$R'#ø x"z+5'yEx5NMS.d9N:k[jj9V=1rJ /^^pz)iZU{=N; .dɠHA#hQEQEV> cQ{m`Tk{KcW-;B0=1ϟǧ''ֵ'-8Z}IOm*0s Eqw>%#hkpm{+q6|&p"`ÜdnQ\}G_j]բ^Ggas4+l(6X=2tu/Y3NSGTzEmOUyA̗@iڔMw{&W*|p2%@R~+ڭݼ"#-vK*1a60*rwm +a^C]w֖0Z_!F$I!v!x b n_|Cy Lҿ!?I`˅7&SQIuݴc,FF7Q͔vFy# V}miCewx`K1H }@;+>(:mՄi3CgxFFM[*yMl+4Na=6S!W(P1UV>G Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@VK·Vm+xe>S"IJ`ipO]9ݕu-IM* nU0 r)Cjҡ8I}'23Tm6C ,qI2y+Ln7 f6 7n9|:]iHrd7cM̪ѓ ׿kp[[1"eك$+\2p6whKUIs 6C4$?Et`2Cr»#GP i٨K!h OXBsc8ϻzb_9L7bշ)^H{[mhX}1 隗JwB5eo,(OrcH gQZvڇ>@1-"U9'@,Q1y!3`1dt'&Xѻ#VS`IV_ y?#U*d 4g Xt+`>zlt5FO kϕHנ6&yH(c<^ տcJK;Z(((?kuuoƀF'7+;z%wc\? ۶$*/H(mEgnڶ?ٟ~߿{x~ak.`Yav*M"v~e69XlQ\?Zxn㸞Z)Z"Ud4#r˯_nikkKUcJnТ|_K}NKϳq|;l u5%NJ4xx/TTEH/@9 @akOǧzvO[<F2LhCp@Q0KAKT[_OKvHbF|x' J*kq-ơi [#eVHAr7tA[a+k$]"LLdsjQT5m7O--}2L ֬C<7(^ cF +ap;EIEck7 M? Pw'I] )|YpmNڱktcqc:x76sPoմ:=fI5[i2mc YP3kR=[MTKP}B-̦T^9d@;ZEc K/4_/s`1KǓPXzXt}Bj77B% ;!ESVf&-P7h)Y3>e֩7zݔ~;IE>pQ{]F۷lۖ +_Ƨool&yi((H3ݑ5j'4V'mR$^M(+[xyESVa!-P7h(מU3>VҩjP}MB:IQlwEgnڶ?ٟ~߿{x{owZI9ԯ.mb3&bdxIX0Qw2uy# E͍wZմWE5'3,eaS4Hr| >%pjZ=>gXι8͹ EgŮ}ldv!633[>,m7P-.g}12B#ʜ>Ҁ.QYqAKT[_OKvHbF|x'xAYto=6ȻP$@VY-65n%M4q/6nN¬IiC{.h&i#&U6+6G`OA@(7zwp]ɝA GV(((((((ϼ]d]g6]*BA*~o0jĊX%HC#`yr s 7ɷnʸ!m\'Ԡ"@TP0A6[0D#5 `*Jэ(1QV (((gw-%Rh,+: -,<7ȃ$ jz$Ze%Zj2q5ˆUZVG18 *-uPK}<_;yھͷcQ د{ ;[XlHYmFhIqiH Z (׈=h׏^ٓC$E>dʑg{5 .I7\ ^d`f(c wP=Q/ۦ>dF[ ]Jp+q yV.v#DzTneƚSRm g,2J7 RU>lojChV`&ض3x\XGDBaunum#Dޛ/uV۵(/MFgi o -b32HplM1RY!fgp0=ew~fu$KH#.:( $-r0g4]B{MsRdIt!8."miauLvPV>Eqpm:6- W [ϕ%~{Z˽2MCOxe&k)0k@LfC*]?C̛}3{]Vwe{3w0Rg<1$C6.c^+-(p6t2#,!]M[J֊/o,ʻYJ1vǦ@5r!($ qUE81@=4_ ;ִi-̳d).ylxVL~)-KkɯKiB$ʀ>ي`fWl[s]%_}o:mW[+Z93+隶w-FY!w86$+̛z(3Uq-F;\u%Ibf9JL@'.Dt%[V kXfȿD~dm<m%tzE}~\kKpye;Gos-qTHcb_ÖE/KI,V8m5Ϝ"#ʾR&P0 (?Z&m4[_6). bIc+;: eXv+X1A-Z蘆ĹhӦI.nYɽC™r({gΛ,?w*M{X f еgl!VG![ۑ,җR}M x4y{igO-I+˅m`Py-2=R+Ci4vǎMۤ)#m2Ob~ͯ蚍|R#&d]%.CQ@o`O񶱩e.oNs,[ D Ϛ+-fn~QqE'4;wI{hYR!q\6X3}"(Ex8lQ:xR\e$rdFQ@Q@Q@Q@Q@Q@Q@Q@a \KqqirI%LJynU{}3N˵J?\xoyj_8Zir m^2\*62 lw` 1㏈/-mtQ& m3#pQ'W_I2i%ޫ.v,T;L[?ɮ.h`*k4# ͏vaO|2xJŲdeO'>-XuᰤWtD :)dW0^j[eQ^Cqh<=nI'+/8=L=GNFɦ(QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE_/in}0nݏ/i3g>NqkqOj]}:,xdT 3խ Fc)l'u:&<jMqjJexuܣ#*p3QHXnGFM:~>n$!?PN:`W8թ[]yw捖hMwgnzs!UhԦ0˹ d[o6j[6hY>} h7|KN5GG.{n;G c 6)Sj۬cXB t8brCɭ_W}լMwZ{9Lʗ+"e܇}TAֻ+-W3fϘYPLo!@a8HΑ~/EROcjQx<@ ҵ33K{߰+.H#=r^&n{kL/hYA-"`0|0$racm=+w kr tҺk__]0mZVS CG*79}E}qj~5o'uW>V7m3W˞+qf?s#g($cs(=k:# Vk40Ki Ҝ\Ʈ̣%vdteV\-][jΟW:Nml"wP|]U p$]j(4#1AQ tb@##`̪Dz΂uk[: %.U+;zd) R>troŮؤٓL7Q02!IU"J.oڣx.=y,mXy+y*23q]e`~SkYgH@#frr9᫁,:ve EuX-偲59]2I`e4 {E[V9dE \v)*K/LZHBג]M4# і;^|ٱhn60IDu` $2l'HO-- 3ʅ'fm ep4˛_Vcum$XI)S, .`#_^ZGji5'g1)2 bXN+pNK-F춓Z>SHgTrŎYrsWLuu꺆mCđP+QHx(啁+oXjlROH5YR '3:v:fAHkkZe׋.uM4qAS[ "×yvE.ᔸs_~&[Oݭ<򀒤G?)v!.^O%ˤJHۿ1E#bª*ÊŖ5[]2'o )VA cf"M˵qcL];GS5C-sA˶mWra˱-uh|A%l;K#A AE\.A{cn}Ơβ NBATPm }p_$:ŧeI@wA,rCp!5)*%E{xucҟvxU<͐C['r rl?%Q23t ^ВHvmٱpx VSZMދ|EQIVB.0~Fҵ_j6Vq;X/<#8FT*ŕ! OAi9u~[:,<]̃r#蚏- kVϖUIs;w[YUK>M>7P[s}8:!$CmQ6hX}:Gwh>|3v9yy}j6Uwfs%HiRCgPrHmgщH \,nH+ym#"2#v 'F+BzeK1m۲O;ˡwemێYQ\/RKm`] 9Ni> o· mf*,N"Ef@.\|ZiWS۵^c4 E xSlz踿x^(/Xi59a &U@U]*x?\Zx'"#cnb-T:$cxRԍkmլZ;ixP!- ?vw`$a򼏳ycfޛq:bЉɫjW/25FrܙOœoldg}4՟sue ܄[̬"7oVp7/]VIWR y ݾ-)xPy yUf*nh6'ңC0U,l5adyg*,px^?kpiVOJ((((((((O|&ך]KAjKL;.3;%NgC:u2 ̟,FBFQ2p4WX-cJ +PAdޖվG[7fiIsR<Dx{:WO(4} G3?Z#[i5+E#JztƏ2?=>|X]:2xcψUشm*ii[ o+h V4P׎dI$FO5^n#kMZy|e*Kx7t\5.f8;WcmhuH3.<^ϡ\8)t/l.mekEr\~*eU!`ASeƻ}:?a2癓gZcAj63nfDMrbpr#Epf_mk-Cv|6ȰޒL@Gv- W}eI4ۻr궒,K34joqpQhմ>P[G4ʍ3d ',r`zZwGձ/'w}yׇ j6?5+Hmm,txn1nٞVO)ZEdA| UO.s^"o:ǽdC.g}SkPi:3 .N3>mQ, AԱ\yc,ǰCRK;X˼}GPoE }R47LhP(e&G:eiwWh^ 5q,QM2-qH 0;AQq'#cn`LFg}|)sBv ajktcqc:x76sWkeݥ"YBgn#qWRbZ>{iIksfͧL\ܳ#[퉓{yl+2O6m%լ63Z]{+K;r Pr<)"tyj2gnϙɍtW* %:][mD2@쉺ۏa86fI#^=QZi%-snGV$FC X` M7Vuv K4,$g{#մٵI G!M,eELy# u0]]Z{@ Qra -N݅,mf,w[ /~X=wG/ cst"Y0#*AH=T[kzkKkx')H*IZ"$OhO7Юkqڠ]6Ea'V!NnXvjo[YO$o89Vě>e J|Q4><>;y-[{ո,^GGm;`0X kOuoieiy_hY`,r(@D'qR֫FXQK< yR7JyZmuf]XIJ,b:Ȃ`( #y;.d/ܥ  D|1oݳvq+OMRP\ +I FH8U8]$+f5a6u5LBD< uFIu:j((((((((((((((((((((((((((((+V7㲏ͽeդ{O +(< uRj }KO̶fiOK[Wd x2GRGI{iܽƝ"&XKPI9u$$jZMcr*9@8hJ:QFU#Tɥld^o^G'|nkdvl 2xU>RCgouĮy?Y4kY (Ha#5t{70ZӬC<ȋ /YI .墑09yF@ 9%!A VG  HB(qi'g2$"J+>qasVsW] 7pŔdzևKppqkO%˅\L!rƍJ}RkYAb>lWv˧Ż`MɡXN7P®' mn?v; +/wo%n-b2M[ S2>`)`ON[d'EơN\q^%A[ qޘh9f1,N ċ!*ů;'u -y$C>d x]ESD]Nkf틛Ӯhc KF<2*r .ŧ⳰ǫ_kK">H#3F#I*8#SoIEgcɣfݼ^Y>c> l`2۰(P1yu^Z5ٔ5DTlxb~Zܢ0Dž퍻ww:59 u!RBa.+o}|cj/ vn$Sb1$c@]1B xAQ@9/ew.2cE0RrI&PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEeiikkg%C:P&I bS3PwZմWE5'3,eaS4Hr| >%ptV}i6zŌnhۘ  ARYnquoeZ\h.cevF9R0}\KxKT$6|,W*hbiRou K4_uT7: A<7V\[J6 dGhJ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (9q.,/\{m(/Rnf  4iIu%FKH$ Yl*C/Z(7h}%%͛G62Isr̍o&Mr˕?i]:+EM#GFQ4\[J-Y]Ep9 kmϤQ@?.-u_ xJMΔlCBF28iI-/۟\Naҵ[n'8le;Ѭb,BG1),E ͮZ5[w4o ;7L#qoWڦ=Tr\_ͥjQi-Juo'I#WovRQ@w c?"GeR6uI.3*By6S]۞XԖYOe Zom6ڎuNQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@xapool-1.5.0-src/doc/online/1.2.2/img3.htm0000644000175000017500000000062410235646675017624 0ustar twernertwerner Page 4
Première page Précédent Suivant Dernière page Texte

xapool-1.5.0-src/doc/online/1.2.2/img3.jpg0000644000175000017500000004065210235646675017621 0ustar twernertwernerJFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (_)ޝmc2O %d-#%A9ZGA-/nʝ16Uv6b0@5ݦiFF]Ӆ:F)5_?6=((((((((((((((((((((((((({χqjk%J񃜪 ؿ3|2F++YEYk3Α2`q0ӥrzoh qv3i-u;A+ 8»J(߂C92ZM$de;qZ΋eajAXYH'*x>ErOh6si0_Y[̑] ToF჎3EWѾxCڊ_lWKfrTr+ ÿڒZIP\Kk,v)q.q[P{ =2;; H--c`FIŽI'hz%j =ݕĶȧo2"18ESJΙgmAvSNFNz>?x{TRໝPq;Ȭ99]%QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEcYH4G~cvs *武o9Ti a9czՈ'+yc P^Ff<Seqg5dӴ>O RY雅[E*Jm|WIjZ\1A{sy\H&)TZ-v27v_u9n-XwnvKn@ `m?tb[z4<#BII7;+j_iɢ 4׈@`\#K`Bc8GS⽶=[KnVAOVHkض_%ĐB3,R1\~X1SR/f/$!9EX́ȐE*_;[,0ēsPyauuFk L?]FJ #aю@,hq}#x"t8kMJ81tC0(?RAu&̚R[ E `A'"uK$Y 5PqӅ%sUI [YǩfIj`;b$ #+H+&y ki>`P`SGujמ@G K z%HnHH cX}rYAҾmC]*nXžÒ9F43[#rꭎ@b#=3(J( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( 5˝5/-QshklUCvwʥGvW/kϾm╗OMk`:N 3HiVvŮi^S(s;qALf8Vf p͖|UoRhm-'K^)6c6$_ yMqjzFIh̄y'cI(F*UH#/^߈,ooQH&htR VAg E,Zq *;lf; IꖚMhRD'He8 @`zk>Đ܈K>kybBI]B: w+5 SM֢ҧPuB 0bY-dNІE>]X&Eţ4֒\43D `DrFT޻DPg_XC :m"C6`A$Y/4˗P5\G6·XJEF$}>`QkX]Ţ]4{6i`2^\kՉ9n߱a'U}.Kk{(`.&̷0琅nIRXŇ}NNK}FݮKX΋$Jp_s :u#;ӡt+>p U\2\t-_Mݥi)%Κ amE(oF`~q>d-k&ly* ;>87Jπ!tS~b3 3ZjӬ`76[Ƞ EVp60J ㏃G|Ax-CHHUYn*hپ "eɦLծ 9gdBÌ^&eT~d,>eA|$_mu)ndMI3 y^]΅T*rn;5zir^iri5ûp" ӝf 6|`/rK}Z9ѬFJWF +eLxðm7\Ek2I;*Rpn#ls}>o魏 h rgt~yMjf7 LRA*a<3G (`|_˥j6r]!{pā hWϩG-ݿڭFhH9!XѴ[×ҧmG,Mm%Q[Y7,iZFxJ2I,Q{ W)8n`c.NX(xòAy1 h!D2H+* X&6>~b;x^hip-#wBT+nbC XH}5O 3 kSXZ4HΑO]e}vaPAXk: XK. Zo~,w`#4AkzqI\y>cJ (9rI0ʐj;hl^},ۦٟܶ(gvr##N~uɡ0kZ6zxȆ/(',Am-_^d-]_0cfK@$ tW׼wkxLя $o^KyM3e@ X*vܗeΓZ3SOv# LʒDc :˷v1rkiz^wIurKs, [Il& |-ǨZkmxz_?7my}3({6ӏ>#k 'o͎HU1 [p]̻_X L׬h5MBnk L UYN  CHtov4kp_ a/EhAmV) Ws_?M-?hb]1oq Hm@8RjzՖ %!Fm6ѕYA9#9kxNJoBbkxIxaI7pr((((((((((((+?LX־6\G$镟,ܤp'|<K`o?jƕm W}M&gi _-&]0U{ }ON̵&GZ?6`o4DkVv12ʗ#|q;voi/ym[NmGVPW˻vFţPh\x[|Klyu[ rJ3ָ{-E5[] 8b΋ފ2O?F5Ťp\&KHf2nfB\)nQ\lt]&vkˋ2Ow(6+C!Y&+${\gu_ / kA6jCuEfHkb ?u"\t߾[_[¾^:EvY%\aD4JgF-E;@u #8>Yg%DE(\M BMy/x]-!m=M+̼.moYfq ǻw+>m}rYguM L.dTܰ1r@' ǗvK=m5^Ii8f&3O1 QrQWW-K%!/0< dMZ]0_}N<DO/nh'j/v8X)^ouj֢j.UɼX)?7O>kn,_ͪ^A x̖yh<&ݡ͸5x}% B0&"uTs5dԼ؞{;pfF;[fVV)#!w+h?|%hڿeyR$Y+):'<Ha6ofTHv[lj078 a+m+?Ot}_ٺwc &vI3}Ey^Ꚍ63jSͦk` iY1-%vjڛnysFmJ> K9(FvԮb!.2Í#xqErkiw:j ?I(x@S-<ʝ+ϵյ w[.H.2Jxx2d=0Q^wjv W"~g 5GGa$`<zv/u/ K.4q--QM?""Hʋe)mZ"cj0ʅ< $/3\ڕɆf /3c.i]@\cW\ɹKCyy[B%B,8~x|{=Նr3cY`bq,|L Z&yA`U߳gh h2)+:+>eKM"9LKڠ#wȮQD|/ΧqwsqpKdtF<$#u,Bf 6ޱ뗺'E Nd.ѕl F(>X?(,X$sRQc)p.Q$i&Ibh N]@ÞX1 7~p}Y]rȤB]Bڹ9 x|]S&Cx14;cQ|C tXd$Q\]K4' 2m}킨sḕ74iMOg hy$XPJDD/ʁGʼ|x sֵINr4k/@8mV8[giEpi-mJ_b!RB$,P]9J2*F4KX WvQ\yyDFPlEre6tQ<{h i ,W%NGE2XPEZZ+2K8E- tbT7X{K+O.$\jxLd(nf'M\CQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE&'^ &&kgh^f{FB #ke}+𴷚NF|75244ҹYB w8? 2},r\;Cܶ2TFLEI>zt6YN# kC^jic&v]a J64,2\d 0/6c )-gm6hrHG$//{Ϛ`Tן>'Tq^-&|K)ɭ9Ho(! Z+Aӧsk=YH^M&`#^Y v7>nl-kW~eq  @2G|'N@97~#xfkY9xjk^. 'jZg21iigzwy-g9j͆c B/9]g7ROx;FrpeYw? k -4 Ѣo7n eyRTب8=(#51݃-I_OyUcUr%D1ЮF $cgcG[ZYϦI}ynemm刢"E2m0 e['M*;#O7(#d[RKԕ?)Prlk$t9-l4[^I'QRBpF }S*7ïgmh$ {FDFt;|HՅV4N[Yu=//&̎X0W`S͌ո|Y{+]_RE"`Uu'!:}ߖ|_WԢh2 [1•N 2NN@9xeӼ#}[}[Y^{9]Jie$f\4i67)rAO|Ct,-t +,#%L%5FXԢHQ]9Q,ɹmH6q7^i+BFsq#060tI-77ܛ2U+1BWzW݁Pْ .ߋHoРd*/ \,L*FB!("8 k5j:̑ Y9T@@t}  < Ηu'f$ŸLB~P\S&q^[M A$3ne+]lm;<65]kjK&{ C4Sr f&,6IBMW'PItp,r0_5U,Ud K7$ BIk!!ؼd3nآ(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((xapool-1.5.0-src/doc/online/1.2.2/img4.htm0000644000175000017500000000062410235646675017625 0ustar twernertwerner Page 5
Première page Précédent Suivant Dernière page Texte

xapool-1.5.0-src/doc/online/1.2.2/img4.jpg0000644000175000017500000010012510235646675017612 0ustar twernertwernerJFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( (j>oE{?Cmm3I`tW7}?xEeKuwcA>Hlb ùq$֝̾s.eEs>8#51c+0$' r twaEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP\^mĚnڵ{y6G$;/'@<]9"t qH7b N~v$6N[|T\#坘I'%Mqq>܆sE{y55냩C2yь> V*Ye[Q p9`Y,p;I5MNw0w{SIkq ~dJBFr3k[A(?:WV+KsJ$n]d0<GqQX[ɢ?0&T}C߇˵0 -\F*" 1a^c2KyDyaAfRQUFSix{RŦ [jn0369 哸moyȦ."12bC)rr+dIX5k"Oj7mԀh!w_[ 7gUEWaQEQEQEWWo$ d}3JN7˕c3=N1k+lmro\"{b#v<!I[kygq!Hлgb >{WŏO1uy]3\߹@ŰN5Wj$XY]]xjHaMnv(dր=3EFNmzñ u[ {c,2;XkK#q mJY* Wq?t-}kqݼ<Dž2,*۹ldj?~φl`c1% ˬІ=\8I7F +¶c%0>/hf8a;*Ov0OVr2p\"O|ͽܩ掭 Q#ywo#(WO29C3?{[_Or[Р% lU|k. 8+=. SH2Nv9$cԑ-Sx-3›[HNnC$ d 1I_"\!A•c1@d7tzv?閶^,ڪG$Ĉkp ~ Y Ǎj"WLXqVxW_)n5%̑bb7sϢ|qzxT|3$->5+q`G$i::΍c[w Fp}Mc_/<4Ža-k،6gp8  jhžYkqg΁W y\V3mC!}eq{HqڱoGF]B /"c 7B';傌fmCۿG]?xkV)h.dzC;xAbrW\UJsjƥkO|&>]\zchbf>]WQр$^j Z[4?d1tb8Ux]\K[Fjq1[P?^ΞGٳn;}Mͥ >d(K<[N쀒3sd3s[P'2^eH VmαDbU `0*<qǂhg .3( { iѮ?0emB| mbGN8<=}'¶fGx-OH^YQ9'Wb%;q(/3g[91Lsہ1]P?Oh>.ƹk=q?l8lG #v3x{Ol͞ ZܲrOʮ.Kv=[P\~/7Ɩ>lVGB孷yDrStPs ռG4I#C+ qñOtck}?) y&H mBc'5Q@!1gC<)w,H*0 lUE4ӖtLId`df*JТ ( ( ( ( ( ( ( ( ( ( ( (<[ \` <*x$Wk i-oPQ ery^G#r N+e#9F}iK%YXyI$F%ڿ1VmI%"$H+1!G+2/~T]~<1JL, 49X DUkj6~v |.S=USqsx]^" 9JܞN WxD@Wπ7;v#'8PۂùKKdiNwfQ^QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEKTn캕W1ށ1dᔂ3vC旗j9 Ct:)9'yQf=.h%|]3WL9 4"2]Asm82;?://P[F[hy 댞ʽ7Rփ-ƩiӪY.RV p qN=o4MIkj1\Tq+']mEc.OslWL<<p9?橇8Mtz(znSޞ 5zO->˦Emms#]Y'Wh(((((((((((((((((((((((((((((=Ʊiwy uo׊[g4WRd /)ǯL;շYe!rW$ݵXlXv|Wvs8RW$|%@x;]{MXL-ֳI5ضkp ª';-ksf$H$U2mc: +?Vb"ϼ$k?;T*;p r>22$eia+>%*ZDgiHX|L˖P {ޘ˘񆙨j:mZ9T<)0h*YrQYzotZᠳFpD/fP%NWB^~a\P,5 * |9ZU*Hslk5 Ee4Xc2J 45/My<R $XPʤD7GV<ڝ^2|>qs&C$rBqĹI'UִY۬fC#[ǵ}eIRIEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^u;v\i^Dz4YQKawGs%GQ'T]G SCt?MaK:Z|#l$( iF U\Z^qԢR q&8Y&s;\6|}A<B?  h.K[wэN!mS4Hrua[x 7R:轒;w۾Hs R6ns]' SCt?Mx?M4x+u IkOu \IƢ0KHg(?(<+w'-o.lLz]iE&ZA9RUI` 4?C'T]@uOLa1yi ̑OӆbϷ bomRD"Y.DI<" >S1'xQb?  h*h.n7xR{;RN >P4.G*aip ~=fk,ן33;>GlNXbF_OЩ&A<BņgqKBVX& BH?g' mgjzGM:%..$щ@=`OA<B?  hk\FD uAbhcc*"npR<;j>&w[g-<Ѽn8 Iڧ88*h.OЩ&9}Cדhz[xoU:Uńou6"6REI>WvͿw SCt?Mx?M4QQ6[0D#5 `*J(((((((((((((((((71w`PtOu QEQEQEQETfxV-XaH @@,ۇW[joۘhV(ܧ29 U{;}BO25HIF7hsqV(_[Oi lS i;#HG>Tcϧ*QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEgz>=̻c |靂Gwrxgu[8wiڭ3.gq`2@aooGۿn1g(=FÖkk:#P|7O<*$eKA3g<+Y۴S#,72bRe=k.~$}>M&M*+QI/'i$v(aB$vaw$w<~5];@Ԟ4%b$ϵ҇5B}70Kpp9 #zJ,nm+S,1VK _D5Wsήwi,vأ%r$uT_jśiFb~ Xi 3C#nh2\ NX;d]Z6h/`m&2Fij$*˰r&4{ -KRR7ւ $YNKUd ZHE6[h "#P\j7u]sHҞJ̪QPpHx;p /RJ.}vY ѨxɵrRDA`zt6궗oZO&ܤouY\uݕ2൝m J=J V UĪEa. !|MWڔzL~Ɨ;ZJѫ Ҭ %Bsghx{X5J4[Y"ͱkZ4]|"rbA'VLKˋyf>vB|0\۞EFrfXH#)(2H;d+Y^hfP[F$,,YYK"  7c~͎nh~o()1xpprztۨWkK#! fh.k*AK vVw%0*lɅa\ xom Z[bBb`F<퓙kk1fXwsKp#nMO ~Ou_|S+IdMZ\ۺƲF8. +r@Tͽe-TKX Wnn.vj''3ĶzN<)  p~Q sI{i[{t˯"Zj6֢)жVgJP;12m,[ ]\"I2޴+Gi] # /LHѭaCl'-q7N9S`YQo c _.1BLeW-C +D/>t5ĶQ4o,Sg3l* wB$6snRM\Ī lm[(̸%XuӦq@e 8\f3y{J+Bx*s]]L/KӼͣ˰݌͵3ׁ zʜ5}^ylCqkmQ VިO*rO*F0r6G{5m5ɩ\yP*'꥔ v1V :̷ݺZɨM&aDZFW%m(pSw57>cҍoy$q6bbPd?_xȻ..M+,>NWa吮_qk nwbF08 * [kc.L$-[m-.-] Y0qy1یn}L%sWq%"mqR(@*#hUɓ>-ԡ,Vg1o,F[dIе945Qn[KRe¯nR k—կﴝ>#9DRۏ#ldbdA?.g }?Ė[ *IIEכ$m$ر)"G1*,`cNV:.s ip4uJ;1Um W5?ok{#NyvU qlU=>ĐS/-F 07RFf3R$ݰnڠM]5lwz[ݺ(KXY;+؁ rֵ)Eo5 ۼo-.H TÇcwcRn'S7(,ȅcFɏ o!^V?ȼ#k'̹p[ 9bk{KYgR[x xD3,(u;rNHu_Y&7ť$B"Tc#eQʝX/[rwY[{+[ZworPI$qʒQ|z|3O9< xß2%6]|U\v#|v-#isEXjV:[-Iho(,a 3i_+^8Ӡ-/U[xy6#ܳ1@]cVotȖ2NFLf4ǘ̄nwx[RI=/þ{9 IZ5ua6ZU$P>\nlx&֭RoƟysqml"4mF>b b@۝ ? })4)%7hf c̏#|㌆<=y둬%ү4Q|P񓏗 yuHԂ4*j;d|X?&d~` J( ( ( ( ( (#xm<T f w$ ktcqc:x76sV[Kk E:=@G2۲#&%*\/$ 1ǚYhOxc$2ܴKt ]U1mcf@nڶ?ٟ~߿{x~ak.`Yav*M"v~e69Xrg_?O#c^qm;jk=ww+^9d(V[w$RcbR/V;,/-&K]g0Xu^y4-՗(/Ϸ?VQEQEQEQECuo-QRHPF Ab+YqZAikvCb4\Np2I?X((((((((+?Sд}oҬokIvgq((((((((((((((( {Evwd+%qh:`2t:dJ((((((((((((((((((((((((((((((((?lQͧ]1弓B%>O O 2 \}g7tj & [GO bV$rIm, YqUU+'m[V/&_\f'C!̈W!wob\N5g\Xxy"y#Ѧ9Q9!ǛPt<;:`Ԛ}gxd jJRs+I%uWMfDդfPK<ܺQ4WxK'ay+[5=CI%U(ق )PQ\^]SNE3ڄvuqyuuWwTE'bmi?`6?Xm*S7$ʥ " 2wWvD Y-ķO3 dݴ0U ;Sb4O'4{MU֓[=:2.A&\M/u6h&7@QTmlrBwQ^Wn!?u>iwx#-4i zξk  /T bը5խgDw4_k.1"C "<im;X(}R8/dzl%(YKƮ6bRnq#5EcT.mXD| 2LMl5K[}KRׯ|"4E~B@c4ĐAF2iwؿ:x퉂6mD_RIo RRԭŵ%Hw߼aА1$zFp(^ku{Uڄ:-#..I<l=A Z}nFv1  -tP7?[,ھhe5kh+69m2ьdK ^A=}qi@Rr$.Umr@0$Ó@/mjVț$ygRŰDd#s(ْj44}[Rs8}4r4 #S,B ɿ;9%ܢ9OiiiLtVo'Ͷ *=63ά~rsx IKkYI#YЙJ/Xy 1D~o_[Z|:2Kʼn۽r,ʬrX兜֯y$r\=.UD ..Q@x6jn-^-Dhi 3 <z|䢣*~ Gpj|n kdI5ȅI%pK!QIF BDSN/\{ЕY6\BEa{ioKVy[ `G*;[rT;D%mo䉡qqb1 rqUݸ*EgzJh:İ$w^ӷ995qd9]]?ʟ.߽Fz&_ūk2˫Q&d3E"R&c$PI'assOդo|>ĢEa^PWTQԬkqkp[C \ol0?9$AIBFQMP~3[K[|OYNQ~e?{#9>Y Z޹muo,HQ&bDVEeu.ۋ:;F; (Z]xm,%y~̢9亲?+3Y$ r yI-.i3i +꺕1Ԫ dp0F vxgN5yr',,R$s2+,ѱA G*Af ɦo+†52A(4EPH2\@Ԣ1>w\A_XyZY7(|8M>7P[s}8:!$CmQ6Ǩe(u{ɳ8 `8r+R2ߧu,4WwVn>ж'H%N8܅[\TVZYGkkRP`h[;PpՅ^ӷC;LKqs"VvVB8 ~UQ$I${+O7h[vUc$nBs4hZz&yŽՎhHʡ;qk e #|InIƙcbayRRz*)8&i UHV^Wm(hX\j Č#8(B6~SxH涎;ɥIp%Jm((Ju,05jQO^[0xRNk8 D(k(%%0lC*VSQQVDԫ:曻P)Q@Q@Q@Q@Q@Q@_VB46;nxl[alWvAwZ"tyj2gnϙɍtPϿ6!Cٱk|طQ#yL7dHKޕkڌucq}:y#v#sVŚ4wZd/>ķ 9U{pHVRd ,m7P-.g}12B#ʜ>Ҁ.QT[MmK-/W(Z̲lTq*qw]Aﳴ[Os)e!ǵn q͹jآKxKT$6jB\h5[5 EqX$0EzE`dT̎Y͜,Aj!`F5;ֵ n-LӁ *#1@{/E]v/p.9{b`MQ'Ԓt x-h%@WR2#4[\EMkOb܎<9\̦AycR|V A4tidQm d2tN2B ܚ kI$Hb)bBtQ  %ndiVbn,UG,i鍤xG.gX|YRo&@Yw'rKmhbQm!N˱͓udaFvQ|עTs[M$Ue)d$}אG4z^|!aojФ"kSYm;'!9e[n`^i:xm1hh8 I%XmB}CSA촘g%9'ۿbU ɣQ4'N[.|B9C.ܸ"0 t-CKKl+ol"(]((OQNٸ;RL*m;t A ȅCnvT{6A(?wTcoS֐xj#2wY.V.wn%i rΞZW # ,5[M9͕IBB@at9@@Gu H]뗒M05ƫf!nMx}B:*8a,IIj'+yc PV=\tBOI4* d#*rzJ|Gk%XjΨЗR(1<&S$ ڇ'DIxUĊYdr (asZiSǩE4e6֫5M7}ӳ7S33+/J $vpz%hd +O7]pw1fhY66_=w*-e-% :(PU,tM4%Qjbcmw\ZO#$P3.I$D$3P&o+Ċhp<YJ0+s:%c-ƛMΝ-)>252IJcbf@c?go.Wu-^2h.<,gha@W]xeмtBOI4* d#*rzJ+5+ri}/s,)i#)]͘pg$&$oj݄L$ @d*=Iu [>{Gm$Ы-rʃ=*;= G 喕cmtbX ۢ9@ @@w_Ri7pYeͺl^EF_(8p, )n? &OU`}\@"`Ƌ.c*!*{KIuu4KìwPdg5-'MmT/WBl3h]j+[;B~o&e[o|nր8{IbX$sFqg#,779Y6!Nx ԧ[$S/DքQK3$oɮ 'MO'pƌx!@!lֈt6EvQΐVs# gb;OZEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP=KSJY#tg Ƭ@1U=ki:eo)bҺM Ov*g%~d/@bAVV*C A |06k,mIY˂9dRж8RK xXxt9n12T#B$~$4j?k7F'))˗a+.$lrJFSS?S'$J6|PdqiXmf`}G%{RpP@NI$x-nsjPP}rE`\~Q>Xu=B]Qj\I.."ؑA)oIDp8f8C%-nt{YyV;c2(gB ܾr7[CPWԣB\/ܔTeOHR~[b C:Y"<]d􍶀 ,/B&xVRm](aemvɹ!|ieOIR""{IfX=G %8߈ -NijWh*@!];GK5fI;91䝿0ڼmu-<%omZjzŤRnHoϼ,XuX:KOo\ H,JP qjƟA#h`[8M7k31Wln7*&yxSֶBm%J$?|UWC;_wF~ȗ-A(fmn 7|3xF]&;9DbڬRC#p @PxSmIm/HWI7QI76$ ֿ?͇c`,ѤzlTsqRC I1 86b+o8&*8}oڻcKy}*%M(h㸘ɺEwWPك5> yk#}2,,$˂w6m&EԞaH\BN.* g7|m#{XmDxMl Q9fr ݾ-)xPy yUf*nh>5}F:NH(P23oq rǍjzōib7om$l2H"Y83nޕ "$lPh[Ey9.!CdʺqG3i Ō1dWfU*|?A;P|ms oynCfhż(r)B}jIaxh4]5kWJ mr ૖Mec}J{,oญK8XanK?.4s!Oc*W;)9ojv2Yl6#+I5%8 S*S [r ]SZIm5f ˫qLL6 UTS(.xSD]Nkf틛Ӯhc KF<2*r .Aյ+{DFq4b+RT)'j9h׌( @99/5{6ḻѮyT{ę8u!#$5}F:NH(P23oq rǍ|_WԢh2 [1•N 2NNcc\ĒCmTCH$l Qy*NJ/u4ۛ{y[W>X2Ls7Nr5zYm@X\Hmb͓cgTxe:U%Ρo2Cۙ-aF.I*8m^-. ŨFP23Rd?3R a)_+a݋LAo:ahЖ8F B2nqrI m>=RũfePkt!_HVs_ 6wZt .[a iR% ٰ (6m kYZ]yņ #5XYaʳ7,oMe巖ºEoo Bڠ 0-}OѬ/5 kٯL{70<4XqsK +)R F(ڛ@0UsO k5_*M2KcS(]cĶz7ZlC澕p!r05tSEa<1 _j:gqnq8\a Ho0,Ӷ= j;ۨcѫa6H(QEQEQEQEQEQEQEQEQEQEQEQEQEORմn5MBp%8'ƣluo/ 6?2av$/9$ Ъz`֓4 $dDp * @~x=wA![Ҧums|6ch2pXbI7DKMNMR[c[A9^T6oh ̺ zw Zc"023V++Č6k0։}qp1boʔ!9JPxm~/+KeKtQ,13!BeTJg>"״K8Pk}O ?lB+weT)$j}TU]ZH7S\ÝЦ#>o ^j$6|nm H9= L6*C`*T]NSsرw%PFܱrW!o_]w GA3˥m.Z&]V5VBq2KbE֬4NIg5[cCv!+|ˎ&R7֍K%R_]kVp-6}yY1B# @a< 2N腖(ʆr=9 z\~=_UGl[cQf`̩`rۆ8'5o$qPD.3#>=/zƗV/K9yf?LYh}}UCwwߥ׉eT,7&eTUNgĦ]hNP-#5hmq+1&A; ( ;/5MI"Qy'7 qK$@DryhwyJ)>`kNcK{"S,&,?gɝۗ#uW:FG6 *HaE(țvS G%T Mdy_i'Ϝyw1~/|-yyP%D%X\LTau^hoi 'oϓ۟;- =/ŗz?kukv-<Fy#j(DozjÝKV;=Z-1 /(qo s Hr1P8"5)a6^+)o%+whUD)r rA ݟ!??]-?3h. ћ*6p8E8?ڼY-dBn2U@q(hH'y} }3N˵!7'Z/di-ŽkyswoDʑwdRF;B4q:ڔw1ƿqOˏN@,SRvj0֬V'a6Vv@WJ  SL.5p.%'s:I|m\,@#XvPvcL'@\vl $ ۇw]hO֭kORiHТޮYbރ0 nP+֚ me=5HKJQ/#p 7gt; F o%B$`H[U|` h:ƥ~MAH'gZƗ$SgG#p![(Usڔ^{qofiPƟ*h> u5Y!wٲBo]Fˇ8J7 pOzjMRE{k_S,\2y;f(E9 xW#}'ٮ>$Xd *euc&06lTv=Ӽ=qubUmn(L8L|XT5M"iv_m'EuOy-&33CI<"ᙘSÚo_X\GjGKFYcLdތa0?)P xmOM/l᷎<'YqFd[Urn}OZiNsk~c ̿4Qƭ.2n6O#בIVY$uE͌E*ɕR|۫04hK}~B3vA]Ld>T@\uw}n&XgGw rrBKkp+Ѽwq7$l.R/C=ϖUԍ~񃴘~rw. S7#K-IJIdijw;`H<KMbK=%-DR;dWUnmH E 0!C)b1/ۈ-jh5H'}`Hg IiOZbv0}Ǐe>oekKp%/EL%U m fŶ9MwblDF#.tP_֕xä1ND?w[SM ^; Bh"f|Ҷ?F3|whi^IjTvPy\;\&| '^+Ӽ}qϥEkؤ[Lmu1$"1Lȥ*p0ۤ`\/b8G*R6vb?1~.yG!{lcs/gfP0=c_OjiyϿ=ͳ}q"CT H#cic{Bbw}hWّηAm5K*6v`+|KuxTyҬwdq$ƻ0˸d—3\hZ;O@Up`*x,TrCk-gF[1p{=,&uىb.r @o5!o ҴnRPjZB#.oV nvӷ~&w4:6%մè5Aj +{FpddzŇrZU2.4Mwʜ TmrRC՟ EdmA[kW;--+&i%VSc"O@gv]O2IYd>zce HH ۏgԴ4icőV)搤bsmanڤR$X>c_wQ+w(.yGG,[Y[{u4 9٘.8#*]NNe[]x+[[xFE%J 7ddn/ksځԖW;h g$ 1_26$T`A k۝vvy{ɜcw˝U|C\jNy 5s)sRʫ6>GǓ@c|j:.B1y| ̗H7'R33Si6Siϥ&g{VMx2*QUpv ^;dqu b; yXû"DG``__[r]]I˜,I$UQI(@^gmO] cxF47FӤrĈJ 8Tpcqpe~|eٺ႙HU)a P Pw  jm;"Fl\@ _;C}FTҮS{Bc`He?;9ڼjڮTҗMӚXѷݷc&rpPm]@XݭIovɝβf7 6~X-dc!jqKhA,dN~V9; /DžuZ;c6o4 :2 ;&Ck!<j)^ͽ ѳ [RIsAcvsWƚݬ&B{X%dibI{%Ac1Al9bM2Tt'ޱ$1F퍨؎w.0>egHM;I񔴕F@K$ke|18i>ڂ] ^H#9oщXX˹jx~N4+͏IbMM`\ PHxA=gEo=;E4NYX.FQgưGbD1^YYKw ,1N2d2$7(piF𾠱4å܁ˎ8-JJ c[ֵj<+"_qg.򀸅dnbY§O g u(!%0d9J瑙!F5ɚxVoŤ&"uۛ*SQoŚ6]_JiwpLL"϶bfI ?f(^0KpZ~dZ5+{;u-P] IHI$Dn%2o,D8\rcr(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((xapool-1.5.0-src/doc/online/1.2.2/img5.htm0000644000175000017500000000062410235646675017626 0ustar twernertwerner Page 6
Première page Précédent Suivant Dernière page Texte

xapool-1.5.0-src/doc/online/1.2.2/img5.jpg0000644000175000017500000011242310235646675017617 0ustar twernertwernerJFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( (~H$) r[ن6tqe@HnAEqG_iھ.=3s122Gi͌XWY>`yw9 :snew;*+džx AvY'A9k ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( En$t>ըɵ$DT,umcz.!cݍϖK #(HJ8`x kΒwI-y+b^YQ919r{_v[|3+(((++7oz߅?>}ʱ̓ݞ566 ~97.ctDܻ`y{$-h]qgPK` =ǂxKeqw܀ P b '+n5?,,.5$07;Cnd2H@Z'6cJ]:-` =Pp\,5qgn|i8kH%,+8@U|Y:>ŵKXrc™NT m܌2H5|?uC60[iahCI~Mdh#_[GޘV?3` TDg';_G]+m9\f.c'`N@NU޿TJGVpiz+'J!z9oPOnVqFp5z |J{N_B~HLΧaTN1jH~᩼EaMܭ$'a!eݒ2q\LJOz Ic^ۘ$D/.J1O=;Pe[I/[U#Hn bDvI Mhh,caK+&Fd vT8`+CO/}Mb05Fq3IV4Mb_,ta3cg@+<`.z@6?!ϲ|ۤT8XV#~.בFWK]\Λ!rFp3U6!J#O<5`_a١犼Q1[9+UT*K95cRF>_in.t11`|.T@|ѯ5-yiy2Kº1xcxA \^MƺƊ|K.gHԛ1eX? uxWixh]mh$/auU͵d'g>: 'g\Ǘ)۳o?{۞¼UwC{CN6ȹ29epzs^@Q@Q@Q@Q@Q@Q@Q@Q@Q@B.UԵZGS6$[?#(88&FaUI R@e+|g8ol Y9,_uCVqZUd$sNi'pW#8B7g9Y"@Y*C$.>lsj<,a $u$zQZ(iIuXܩXۜ}7;imVb$0*0[thݑԫ)R0APƚY51:ςncRdsaKf{[¦[nBm/i%6aCq)TmkQ6m+RӵhFmI[<|Տ Ro"{!{ o_ݢ2yER-wk+N(((zw]ɍ<V(^8ikvCy.I' %$5 ^6m^LF9f㌓q[P'|2^{I/f]Ȳ6tR$9r+CZpzO%ѷlڸcV=3svlyljEisiz}O =ӻ $A  -Yx~;՛sm6QB*: Oh>.ƹk=q?l8lG #v3 (m4k}-[P l&1Xӎx_I𭙳 STNIU؅bNgkbK85C ;;ŖtS6q`WiEZZwx+&0Fp݌8[3g</w, ĝ|W7|/ i1Ͼ[ţйkmQ?*3]%Cuo-QRHPF Ab|:XOqJgI$,[|P`IEdMtP?|/Y= ]? ʌ`#vqcFl 9,4-Sk&*aGҴ( sF{_['z2q'*{k-Q_þ(/m3 4d䁜bk<vV冏<ѴhneYU©$vp2k8xRTռS .P p(f1EǴ(((((((((oOUժZө<;v0z/4Hk6q/mss[͂@233^n/@IFRR@1Ey)8#q;nDhY?..@c9L, 49X㌭s4˭pfM+I0hìh gO'o^5{xm@eFMHz;8zV\7[9x&&#zqDwBM",שUrp9LΩ@H!c1O$ӵ§4Zڰͮ݃!:ˣ>F#T^~ֶPG-dMN+7 _ hGAS2 Fِ0*(',I=*SkDiN7w6袊΀((((((((((((((((((((((((((Zveԭ"69@tn' Pj4VYRI?j5sER3klgD<< 29e*`OUx喧;}mu*NAmm '2{*OB+[Js%ٜgp:z Mփ\5Ɨi3i-mR&+pJq=a~3˭( eumźU NRiw0+FrIvgw$Ŀ MEIuc>%I  pNUA炠~-֦Y ݆>-G%9ɔD7XJ] kYԤɚV*w%0@xm<T f w$ /fY3u Q"m?*9p=91+>kK_I }Fwk!d.vE~nAw\iڴiK3&KX$hXFC#bT`z(HtmkU[Y_FHY-Am")N0p1懒{NQfdpgZ{HWVP52|wcdjIк=}56 k6,ș8,xrXW-uuMg[`5*=HmS-cZ{=ztzpƎl15p.7P% &n9MG.&7X3o(<@Z6%}o4 UvS+Es*4ZA\vpm%|AtbO5wL9Y#\zej$ ?o4> , 7, t${⸻BGM^G{0ˀ8tw9W1*K( ʧaox71l BJXz <2,@TԎxM3]j%[*9.G9bA*̤jx"K4|[cm}U ^q,e@b98(K4Q^_b G/[FĦ]`&)"P+ M:":]]ܲTO7U)p<Ey.4mB^l.7p$xL;f6US˗ I`%SY't۫";.XY"Q܅y@e僓(u`Tw:usWT}ܜVr\:fVK裓OԖDү*bXǜPHF)fd=x->隭ۅ$J7! n97P9ɾ]^hp,f刂ر3+)b 7-O>iSh/IGs.#L"mzv}rFj7HAnv®FHȬ9u=[\mOTӓIt6 [pUÌo2$mM˩*ywwˡM=͜QFѤA-3`HisggWpA'i23֋ }ON̵&GZK&]>)BŨE*i0T.9;$Լ;:Ewq͔\cOhB8R j b X4땗xLҮyH-m`}#y5g p3+:Z5唓ԗv+2+Ɖ͟(>jͨRƚ^]K do*OWA @Sɧ\yo/0(cjF  @Я+u/^hɣ\١kf Andi[~ض9m,5+sEԵ부j>u1WQ,jf FbCI(+d$zK{X氞y<Hc-)D*3(,lu[+k#Jү.U-|v(g CP̍ev72TziwȖɾWHB@NRq<\?ZGMJH-H%[NY*HRp振%foz=z bױ  즶gP@%D%A+n\#:Zujw]:m­q:9 'i\M}"C.ƫp{s5ɹTa/PB<ܠBŎ>g?-g[CH689ú:ڤWMBd-%u䏕x'77#'1~ߴcv8\U%Q0\rF@Ӗ\0xWaEpx)cl$H>*J@p8x[XTC?missvP$ =F ^hrˀ ;RkfDdKsYð YUTJ(?;oJ9<4 KmHSdJ$"-Hnf8=뼢8%Q0\rF@Ӗ\0xU=Ě|F+-KÖѝHt)x=UGP: (;::G&ᵷ(Q@_ iυn[aMiyr6J]FFѐ5r?jPsiq7SOha}vP# %դB i "7rFúͽ'G.0 pnp@ Q@zx[X9(V-_8xciʮ rjK/ky4v@t,P\xWYErw׵ [ \h@wh[ ʜ9ң}OK673xyH˵F $cŠ4_ju/\7a&Фp7)FVe>j;RTEorj<8طb'%9fJ(]\Y^b{s$:L'.EX>j^׵u/|1}u@yT6 rFpHϹs.{ KT;Dql78x[X9(V-_8xciʮ rk8A?m߷ݎ3r?j^a5 dk8׎Ӓ>UҺ(;;o|?/~э=qZ/5;9,/]ɍϡI"6#*npp@?uP7[xH8%UE.bw^.,|1m=﹒Ѧl",rZ(>Ŏ>g?-g[CH6894 2mK[)BFĚuߝʼn sEQEQEQEQEQEQEQEQEQEQEQEQEQEW'oI!ҵ۳Zl3\#81* n`̬K[hRЭsBFbL1MBsWRXuW/xWIU[[}Z#%͸X`pŕ#p akx2Y"oԵ kUM _QbX.C˺Ho5[VႂfwsUrG2( 6:Mԧԣ['-Buۙ#TbT~3Vb?X٭o-8@vQ ~yLLȃnN(}[u/VpkYӆ˫2ɝw+mwj>*MtZ:}ĶbY*~lϴ_Ϩe>Ȗ{ ԟ§ Ѫm),zR@;+LG>itI${`α2&T14=jmWķ+d,olBPgby$jy3@:J+Լc Σwcn3%ǖVvP$pՅdžu]~[M7uUPWXƙ Cp 0`w>]?_!^ Ě^I9$³+aX X3.A%(E71iw%[I5`Ib>[{J(bA ˹E׉|;ǥ]\5hP[ cC ?20a$-hX-ޥxPHֆ0I N[ Bw(_iFgt> K #(hgR U͓÷jYZe;y^Hrvѕa<]f_i! EfpۤuW&@: +ռiugbN|wvQe9y଻>b" `#Jd _H߻\2->X;v.bc_>Jd _H߻\2->X;K/ 𵏙EcJ$]FCnD7ˀ[;>=ռS_2LV3\2| J@0w~ss–s‹YU,. dC\OttHhv#v1C"Y$66Rܹг4[Sl ,N  I86 @xcO Z\zb2Z|%UY߽P|vsUޱ&%UwsZ3G$ld|c HrG)6kwiioaqiݼI2.ȁg n3llM2Tt'ޱ$1F퍨؎w.0>e;{-b}Gf+kI- wŒ$0FLQ|1t-j~ŨAooi)MͻČ *ʥm屸}؛:e4'OcgHbQ \+0'z`|˘;ɼ[SCZZ[1.cL 8P}1AǴҠMV,㶴'q c(f<^iwyqI{)h,J$"dc|J*/4#iY^ZJayY|#n*è"iSC\}!y]Jnc|cDa" x*_o~8,PzB>2*+omow?*VoqǫJvȰoiVdԏ -.>#AunK"[.2JB Mo7(Y47Jno'q+,U,dFFc]ִKhmh<'\'da + g9MחWΨlP]YAndhS# 1!?p}8ٹCkڝNJ7txwՃ.YD@ՎҊ4ۃY9KI#ThD éPOx{Ěi_eJk;ÌhG9c 0yj(},|[qX|]ayd*1N*>ȆQKr2;l*ycpe[q#i(ּ=MGDTҤ"cI?-܁ȣ?1*j&]FUZiصēqk;NOݳ9]n[ Q@^mSWeh ЬK2;2ž)ߴm;>VwxoRCk-|\YHѪ)H \ d?~J(/ZfW6>n#  88` U57RĽqPgP$;P̿iEr2dQo|چ4q.HbX> KmN#춱\<п wcFENҪ?)]&ͺ} ;VU 23F}\NOWw i Z+=Xt K pi)G{Xt?HcOXØ!y'1;Q@=ɫGr|?$KLeX0łHY BS/ knMM/ASy!IFG s N&-J(Rd.g{{HA̮ 9ʐWi 4*H+x_J;F$A!RAlŠsAC%ޡv"VsK4s mT74#+2HTg]=)h9;Jn??dW,y^wlnyLՊl5gI;شY㸶Ufe)E 9@!|1mKI^іXn%}J٣ #bYCQ@bKhw^i^fp v8((((((((( QjrZo'x\`á :vF'K-5L*-2ҶT@]b;VIA*̐#gWU\yx%]KK]*# 2,FKNcp aK`${>wkiqZFM$$y;! #< FKtPGK5+lI4a`wBeV 7|vޑbjI $E \ж0 Ca2ɹlxvL/dw~^q\I"\ c  ")OVvIu1$b(RvޅO1UR MͳR+s&:X˧x;3L1unf]]isCHJΤ+ 4]b^Ne,1ѶTxoJJ':l|fI+  TU@#q.+.|@mӵKkb̛6Y938a]w(J'Q@wy᫛ou R}q#k[miE'W$~UQ@Q@Q@V}ou_(e"]v՜l4((_ce<8@ouMuwncA=QXv(/&{a<\:J3vT,A&7(~Ő[6E_]Xh>P(L~af8Brx,(o..ͳHe6N$` zp.QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE^/$l' O e')yk< LHܜaK1c*y/n]$E^ܼ' Mn˻82Q%XNt옸qIY]0xvdҜٿex#Ā7nAcu[?weqs۫V0_Gie= 4U6t4XxOGkm}]iin\>rw<9=k>N}xn'۲M6 i H;HAi$w.p33`pbIIeg]'y? ZxC;zf,0=-3yX +bBn`nmx5 S[nۋ϶m}c—rvj(K]&/ tƉr0֒HӒYv3oBKc$w] ~O mPi+mYK;mC$Q@jzviV7֞,V3eUޑ@Z4m+RӴ }Q[fQ:1+"d_$iiWmopy1ʮ#Sw`aBԠ#ÚմI,m]܀r]Vg% x-h%@WR2#4C<7(^ cF +ap;Es~)7Mch~O6~뛰‘=SG5-8*-D@WϴAW'(3M/ţjÓkwrQM1hydefl,ԭ? :4 6᫉;yvRNP,v8in|R 3 $}P1ޘN~wkAsnoYn$@ m..xbB +wu%\dIv_ 0o/gYתG<3<%U`J6oC o;8,.໵;&A"6  88 €vDO${X$yᵷX$/$0UE$xsRP~}cuyd{}sҾ{t0z^-p5ZXkV}1G>Xy-?Z"JJK-6v,LF+GF;!hNݢd1cyD=璁kkk麬vz5Q9 ᢔ X\!6m8#&Ca[cȈE\8'%ʕU--ޛsc ku h呯U47ϒD[~\h)gKoC}ioԞ~g$[RpC3I-^ä7q&72pqvIcy?IF=̳DgDr l-7<)<68`SI$`/'$xsUYXXw>"ʜ4 $`S(8ܭYi%㋆䉍L)E$o'1ހ9xgv/ʃ셑lUAM%Tk]a<\\%Kv1;:FXneR: ('RPEPEPE][7na2az#( ( ( ( ( ( ( ( ( ( (+\Kig$O{"@P;vU$tnk)l L9(̼U(DkͭZC`voKXFඥrg̅f[q ZÁ5O>ß(̊7m lcWqcRht -R^ZK9緍#2J|,JH\~ƍhrXi:Z$2MU23PŽG{Ln{8$W(c@"„R%f"$~T >U&~yI.5;(>ƑE7RrB2n@ ToF]"H,.{u W,N `A; oi4Koi s[XU 𤏔bx4XTx.{hy_,ѓr*Y v7>(׭.QZBֈMtm♄Ct1 ۗn_k$Xs>5_dY\(dGLvǔp_ ]ׅk Ig8bX0J/݊DBHH c/v$I2>›ԩ_n>acB]|7Եy%卽!Da$M'X] pEGNfUZ92J[snz!Ҭ`Θѵ##/~,I,[%$YcBCHIPqM07>}/&FZ "y]mvءmekI@Aơ}æO=Le6׷LyLBHBIr>_[GvkM8? .PO$)4wro2v3&%2e &0V6UC`+w9]1esxTOOoGũ[%GHHI(hSJMG6wgɹhxӌn DVP{lB_IDݩ\2ywI={^ЖY;aI!2H"W*BFbc&ker7q+lצ>H!'LydUr3C..;e+i[䌃ua8%$i]n$;FwrYp &Tok4.Vd$6HS垓6WoN w-FE2 ,<ݹPBO]k_wi\ݳ>Lc~\m4KY 2HB>P8U`4[*jxS+g_4ǵ})۴m:^:φDڍWsCj>BGm"vnKNܽd!Ծ$wq\}cg9%U##S{!̽R/+6ߘӳە~cjr萶 Jc.P;Sy@py:@]_M]뺥S%Ԓmw MޙccoYkk dX$YK1$ĒI$MaxBԷ\CN+,ZB mw6s@kwX+m{ e gL/;dp(b` = ^&U5(E<飜}Z&d1s3>,e!Nx{L$yR:kA;e$lLpC2T:pH'*1FΑ؎w6YT~f;ouOϣZ3ZCt$o$WBUG˂HnOISQMaǢ(s{n&ᰈSwyZnu,KyewN U$d S~}qk uV( ͺ@bټ0Fc ܋n5ݹt\a̶ExK2ʧn-6lLs^Y$|m%rY!NS9_7 .XƾkĜd bBn 3m'ǾOj~-4Ofç\[,wI$i2n $[Y񞖚z\[f( I#Y-o/B#+aX% 6_x-/<̏+:A(S&czj1-ؼ1@(H ;N7*<5MWH.50Bt @'>*8 +{x$qơU 8I@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@9//വA.H,x$ƣPQ=:1pbF7l qPڽY{y7c˓ Gdا,w-AU(6-|mݥ2D.n4h彏y&%‚X\fk5Yk}f6nOg%>[1,Ce@U*;? ^fc'u[IξgnA|<)^=+*RXS˖H[d /r Um s7|1&\ϥ5Bx$ae1j=cGY-u)+a7IW\0p6Xa_)zFHiQ#B.$lq@q40hd5T81F;n?1[۟ I薟ڙvh ۊy8g"~^i,BGZMw78b4$免[XYЛڊQs.cJ4m?Ɇ|148W3{yck4_e[zEI/*&|O:0*Tρm.mm"@"0_m &Qy~= oR &[sfܤÈ0;J ]Oi {9/E 7lyۇ o`fͣEm%(Qeb޿)C:ÇM,dVݖ(bm~J53_L6o&E++,H&E22t4Wpa\ .O5;Lm-XOrbM,Lv2|VB$H f񥇉.ؼ9 ̻-"pc"4a3nfʱ6 5sH22b*YvcW?wMJMej֊5%X:K ߜh?.'SZ8t F^Hd,sdM*Hݞh-YǧiPj7-Z$J@f]d' B|Oi:޳g&,ު碪FFP )չPܑLJZ~%՟K jPٴ<m 0AFFkbnHK/,uKДCPwe9y{յ;-N+G|V3rȏlSjHY<0-w/Z/լvA]M:)Y\6|Y嶋|X{5Ko%d%!w>Pve"Mֵ+I-/Ʊ>k$EmU,Jm*mmZKKmA.{WK)х*`-KE)=7OC$;ofynU˨ N9IɫZ]]]Cqno' IK++`!R j6f}a{UIQcc AʲeT6 KZwMgQBv`C$ P$0Z'ԮdOlB!w36M)3e5y!lQq2ۺlI1\Pph.]$k-67q c(l$YUM`E沅4۽O|Inn.miVػ  kcuA{Gbt8LbI(1"9yP/t;u׵Ρr\i$ցwB,XOPf53$:˹4#IC[k2qqeCPf53$:˹4#IC[k2qqeK~ԮYh^rQD?ϖpA#z΋{jŦzS1ݔE# w=W➋߰Z\}1K`$8WeVKGcju㲸L\/, vQe*nn7$LS"{[%#JKL#|ݙ; bMQtCM5ZIh UM6`ЪP@)A.uy-\Iu%ْ;iWRB 2?( quFxS|1t#4TT1fL_Zk[_jpM zZ)"dB/&$Igk^ ,M͒hijmްVao;vsa\Cf^#6qn *qQ]VNAc#|m4JgF-E;@u #8>W<-e_\_#9@𡐉t1fh݆ãh:]HY[oHAbA8gPOЭx#{Ϯk P]|2Fl1ٖ?. :]%5H&vTc~ ,Ky)tLn%YOHe?07go"da73ݎ{P?$#ҾI$wq[Mmb< <@\+Ԕjn4O"`kI$b$P  (q^?]qro5ŵ͔6-I0\ɼua") lC~Z]n.m|ȥmdጴ8 km ^&&PSR ,lQ0v1:1MJjw5Tqw̞EB#@X3W[8 ='f #Eęlm<"omΣcq}g˪yVIF!2LTRCӸJ^kZgHϨvѼs]D ;Ƌ*̣pf@kb^O'—w̛Hb=v[cp8ٯ#Y湴O|4gxy&V0Q2|J˘^t.|ז$&kM6br o0`pO$þ8#i[_aԒH(oVpp7YYzmopͨj@RKA7#敷ρ5u(((((((((YEYk3Α2`q0ӥe~RI6eFU$dn t@oxbFK^<.v7EbEömu{}58HKW !![i|9ƚݬwim[3[K4 SÖizMdP(Om^@A?g#^q>{M/FugGgOK %'Dy\.;A!v((2MX0~7P& .[en VIykvfUm&sHg糎ron1i/BqTbPlIt}SC7qK"$K>UFͱ ˒d#O4rq;X7+;GJ;Ln [ӛCZ$)6dWśrn$N+m3VMsLԿkm\G#jqW![ _׬n.LϛL7B0S81I*6%,3**0-t^jQ}mIFVe8!;5{G[aws,wc'4f=mb˕ÑY~"e^7zE̫yWHU߅Py$ؽ5mbQF=.X>t ; ܮr;FlG#! >T9&2a]0$>e̓x@ƥyGgm&I[FG?wk7]deok( qDK8ذlw.A(j5 bOG].4]Q7a ;]2K.SuDe%G9)5_KuK[C̒&Դ2"\*XF]?2YpA7mgK-?6xvIGW-%t1$yY@@,iŶMK:-|[?i ;A @:Mg:7RX3HSĜPBn W'.Qixؖvͤȍ<_/ ̛Glrzz߈AcghO:k y$p&3hHU]]n-+ޟni#bho[fYo,+eU 7ti%c5;_E7W [p1d_*y#b< =p:vZu$hdđ^0S}/F< hS_˨9 IJ:#rʞ'RPK (υV%IHrQg2y]#OL{F%t/'[ۇ@KEwa a[RoӤA>A!7lmG.sp.|G]嶁R_ZA &Z;xgXѷz PkyPG sPcԩg O"x-B ]ǩt^gͻj$9)~Nķ`9/EIXh5 nߋn+Xcב tBrJksJԡ{DI&9@tdp ڸ? I{so{a+ٯ帏x$ciݼ6%Vmʪ6p4>H^C*xyeG#'nQEQEQEQEQEQEQEQEQEQEQEU=ZKhtkoa{DB]w## z*K伒E.6I<&T^Fr3Cמo _t3t+@3^ܽ@]N[mRH--KAeXa@fЈ8Gmmep4hjZ2Mq{_,bua*y<G#]7-q8l,΁swZT:veH-XFYqQ^F,txjYnDX(lZ8$C&t<ˊ-.?HmWÖAekAHgxLr,mv騌 H!êMEi"K5ڥn%<~ʫn+7QԿ4<[Xii;QA,p98;t}Ưi}&YhTO*Dҟ4͘SFGAZ۸K6qxrOy_#`(; rx;=F?lRK*f4Pmf~@*yl^ojkZ4dMGa0̲0p0KeA~5>O'% ) yktI f7JL zX2,qWuA:9=$i$)wvnXVv@?B03xsDƌ=女Jpoqulbzkg$ai6-i#ų(re 9/0.W\8|T56kfV. y|3o!2kٙ' RUq_4)*Ą1| +txSŤ$+rd6Rl8[BB6 /aўuj%K崍O,Aq)T 1-.ߟ$wƋeYФ2ndC;e<PP*u'K '/#h8fQx'Ůcw`L>]y23+;Ȏ3ԗWn=sո.6lnYn\Ћpf1$(o^폈Ȓ+> mFWQ62kSZУWH\FncHlS6X4{=E-0_ڤ XeO+oop8*^.4'A+_&#~Č wc6|rZX[5R࿒SbL>aMȤ(/i?-"}WGI+l4R|*Hr7N)^~+x֕iXʝ>\a:hw D%.UrMIF pr8F|+|}wy^<Qa[IŭŢ]yE ['g5]OسHoESX2@ ka3ȇShXZ , 0I9cFc<$&Znusݟ*<n`!Xѱ'{.G,*?7+۸qnzsG3H/Uu8y /90<ߴġw6Z]qJÆK;MCMXKc2Lb9n Exߊuo xS5㷸}g)/%W>zW+}S'eҼ5ll,d{]VEaqfz;4RY?3xԐ+Ot#*o}gFc|v7|\}|Ex.4-.f2[ 8htɕ jW)e@=b_>O͸9o͞kᆥ#}BM)pl),79#F|+|}wy^<熭.k X.ѯF b*v㓷hAZ_nӭ>=K&#نpGc^_WѬ.a@'H Vx!|=D7-a1QD|Ϯܤ2Ԯ!H6a`v 2& +R[[eK?29{$O + ((((((((((/ʁ #`A"]}avV4"T'k#+#*#H RiZT֗1jW(,QbYK1%8ګw$Ե]?MoI̶p6׫6X;YGcG\H$QJl.n-]bسK CwW(FY#,Mib|ܹ SE 6I(_o9 {">_6N0 &v\;YEylwhmYi_͸M |VHUk}E>r\'pd [ *;Er6XC&5Yd},vd^5McRS+k7}cͨiEDBX9%b6 EF'eΈXV>sw>c]Ibn纒%FV&v pT3XR1 Kr-ZK[HMvZdFQ^_ixK^}{KwD Kh"c;<ʫ@w 'Qg.jZOdC C#;l2GeʠR G<3<%U`J6oC +՞/ܚMk q((_9ve 1ʒ7mw4[)/bt>9."Q os)CS FXRNAk [}6RDW']`$'<6 x-h%@WR2#5u jV>{v VEfb9% ?xj؟[|w 881'n.%"BI#TP2I'5%yt:M[ʖNUPa +a!Smf?ٓmP湅EXa6 XdtO ռW4x䍃+sL5Al-u% X66USl" T#<9sI֮nKos*T)|3deA{m&{ZCl؇O-7re#hC", ݬچ^ _1:A**bdC4{Ba]cSZ#M-#gK(cӼqc ɿfGr:ycȕɐ?"ltay ڤye=ͽ1h á#k|pُk?^{m )Ʉ PoH9b ( /hֵC$-2乷Lv$ $.lg-QVtn/#X$DVG_v@;+-%|_G}eur b f]m;SR-6&AwmP; z~!$ tFRLޏ2ۋ8QT.!ېOUX1}3P^y94IKQmϴ@2=@6(?/ hA}+{H[ITF%uZ]j]$Ev+1m`z5O~7#}rʚ SʎFyEU X`XD|OO,[NᴾԢ2KGfG ws\ mUXxvKm";{{)ɸ`UENؙ2]T| M}&k;ka .[{a9|ʌ6s$\]NJG(&M?Ptыf%{_(sPG8R>%nvseYK wpOʌQ̠*Ak˛xglAw,h*"Xnb$Ŏiz,6Ԉ `c9 rI\`8>6VK. yHB@v+3xS1œCzUև$ڤWKiir]ľ\r, e w/ !P|Ofҥ3JɘdߵX hc ZPk:k?ۮbXecs#!E@I7y=_~#+$m-5K[82 'nl $ cjQH,p,I2*\!]g ?@T-xhW? h~4c( &|r[jV}ܩ;4̷ɒs}a;rO?qv;ݍpIg>v8i,Ad+0 r9\=ӦMkk=e{=O)q}<J\)3(-|?eݕfYC)|98RY$r &k $UH$hlr͗@XbZ vkU˼w]B!Wp)%t*V%-  P6(uP~i7 +9v}'dk 8& ZպiXjZm2ʈa h(CÒ(%|/ɮ38KU#g Y9c bB(QQ@Q@Q@Q@Q@Q@Q@Q@rw>L}d(FlqwGP/xZQֵ Hn"D- h3y:fܠ)+H$ضK]rR]^ ѧi.;+ZY UT 砢9 i]KkGDnUC"4jZ2 XnJpajWX֠Q4^m4Di!p6,q'W(^O ^^ƣ&?|m P٥3EF-~bI;ZU紵1nx巐;1_,)F0nO quXiA,FSNq qTGd<1e05MZWg{okZ}o)<_!fp˵rAV/XxzM4E`Hm(B ]u5&Q[k-Ӯ̑ld3f7h`s(op2mw.%-Ē 1+/˳.AiϨeh s+S+,FW+a$aEszM-Ǜʆ'A*ٛ.w2rƾj7qjڐ;;+HW4`!Ynm Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@^LӮo$mby}EҳN-兗qH1v?[J@yi˄p9T #6,kY*x|U#E뺭j 4..}K,w 2(u QH0,1Hʉ[,zsZ6muV)‰F{W4AdŌG{MPR֣Ok7\woDG|H( "$@O5 ii)hwL3yC$m߱`7+FGN`ԓw%ۛyBV]N u?oYoH˲ܧ-qc }HmWSn)2":W-|H$WZIuo)Y~҇\I6 i H;HAi$w.p33`p~Ǖghڟ١ cn`Ȳ)UTPr˯F_ZZJa{Iݬwg ;y2]b%@>d(紲𵯎q/ tdj2=x+63wTFZ_|9m9K.0'@XUFz 72biZUT]sgYcrExwNZְ4ԯB|>QE'-{[y-D~SKR3=[:zVs^xVO jB8]  1$KMGGTag5IK}Ùv\<_~ZZ{鬼yi>ck3~ȖU aSZk,m?ْXZ*,!69D[ͭ$n.=zK񞮏.o{d._y}euai,:Zϼ]%䨊Zq!E9I,={^Xֵ|g}H4+ ΌNWff j F1F ٯi-gYcG'ylU@9_`co5Njq ?a@G&MYz~Kyܔ K$"&p/ '-]SÇ\.eБΦ4ԊZ3+\c,z)TbS$0JԼ1YNm', R > a8;KBlrxf3u&fWFY#BbF&mmÇ_Wڄ>5#C|@Չ,#X7)rzFHR;K[Hi0%վD #rSq'nq Page 7
Première page Précédent Suivant Dernière page Texte

xapool-1.5.0-src/doc/online/1.2.2/img6.jpg0000644000175000017500000005233310235646675017623 0ustar twernertwernerJFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( (~H$) r[ن6tqe@HnAEqG_iھ.=3s122Gi͌XWY>`yw9 :snew;*+džx AvY'A9k ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( En$t>ըɵ$DT,umcz.!cݍϖK #(HJ8`x kΒwI-y+b^YQ919r{_v[|3+(((+|v9 ).d-9RLwi^?J o@&SHF2xV$ZNf=."P:c^9xhAtikP[qp k Pg<)T1##81Ѷ~O4 Q>(i> ?-~< NݛyUp|Q6 3@#5KfI. Qƒd졛 . <|'`?w }P ydjl(.#lbIO€;Mc_xK5m;ʱտwaE?l=,X||M\e 18cF+'uV5YV_~+Dde)0oeF9+(K 7te|/J=?^\_/$׭V/dӮDF-?622 PEPEPEPEPEPEPEPEPEPEPEPu-GVĆD n< pre{TPJ+=ci(=BuvKsᕆGdV|Y?j'\ӱm#IV68ze[Uf* 1s88q7du*pT}))T>cqMv}LN'zqR)۸z0=B M|7A8GJUZMDnJԴZ7kgc:"985cԵ@n#kh2̣'p)QmT];袊(((+~xC:lMkNfrN` ++Ek pgsO.ӥWt=/:sj^ڶNɓ;InS[( 7fpVHl3uu<;38L3Rk:95{/m['dɝ7)ꭂpgZP^3Jkx${CKdI&FvIk~[]wơpyUCʁ3ֺJ(8![kxC!H"$gb,Ė>{?x!!ԵKkp8.@o1~U9P2FzIErkz{M]f@e"ÒFI'\Komo]An&q >o9cI~尗SҾ5DK+vfbd\ `Z]_F]KOD D1R@+;b(~ׄ|áZI&CMB2ܖ83U>r\ͩK]+rDb{::mw=m5Wʧ*HZ5{Ķ͵rj~P@b F9(oWAińZ;~]\1*sY!Xi *r;A5ZiZ/8V`чXUv8BuF|Fl[Pkn #W˩ZEsmsQNH#<Wh8<iy{ ?7KӡbkRO7ZfXynx?u@$ds^ErTRC7N,-OOw"U}:ʝy}g%2C @O\dU:~Wc]K87tFk/Dlgd(ZڤLW { 9_ >g[jQjˆS y*-#0 k{O~aŶ?2]7^>@G ^*qE-/GKO鶑[D[{WcbI$(@(((((((((((((((((((((((((((((((((VIM"2=ޢyo4 "cUnCĚc}Zi0طI-? VN7 /AEpO|ILJCVڞ*}K ʻW;)Q۲-(d6Yi,ȦH? B`,K`GR\xs[eQFZ\#$V8 wWt6rs) bc}m˂y\}c]g/?pA,xĀ:vUpYʂPQ\|EjZɵ%ϼiWVlELX9OdU۾OeE|eRv@=2?~dmnRe|PO7|ꡎd+S֡^$Dݝ.d.\sI] %U5h V[\$y"R!%-`\(|Eo_j6j]M' v!#ݶxRU9|2Wk/wU.{yt8;YUՂy~LImZ٧kyok]ݥDHe@l. #+=B5__k0hg^ǖ_2e6$gx\!韕vJ~= DIDR8V?, 0ʼnPmԼ c6G-t_Oo.b5J63r r@&.cKK&7RqmY0qErw~"Լ?2YjYi[c40l3HTo/~_o^ u}$T2:3>p@?f}ʏ۟3nEyv5ծ}R]jQ˥ (UWS! B8#{$7Q?~>+[8LnLVI2.X#SJJ="E]]X$(X"pX)w;ss7(7KWծ5xզ6b]+bC$Xxr9Sc[E3b 56%T#h-~UUt&{o x I3.vvTG'|Yc@SnJR=MNfS:X/*M)C>T</c?/3o Ϣ|_UI3sqfGw; IE/c?/;Zwu]Ckm7<rp2ǁM)C>T</c?/3o Ϣ|_UxS}Z ?{?y{h^u^g&E?6 /QhE\{?y{kZ ⹷TTTmO_hE\{?y{ixS}Ÿ3EsvE\mO_o Ϣ|_U^u^?sv ?g>/*M)C>TZ ?{?y{h^u^g&E?6 /QhE\{?y{ixS}Ÿ3EsvE\mO_o Ϣ|_U^u^?sv ?g>/*M)C>TZ ?{?y{k':wMG\yõ6 ˃kmi3h$AdD/2E5*QEPQEQEQEko-ıH^I$`I$nڶ?ٟ~߿{x ?Ҁ;'+yc P2FW}_CC ggVe3@3OPɫ8 }FmOs+M(((((((cŸ S|m"sOSQɩ6 _ M_gKQG3((((E3|#rF/v;sTԿ[L{2,gT> Y9cv mw졆kɥ@z6FrAWg2KO.%J#c4ħ.q71v],wr|;wDYPEaqqp,[HN$dk 1,I$>!I3<n2JG,"UrϱӬ=c-m"" H0 c'=NIk7-h]ijVܗ)Bly5vYc@b$l+1|-Y;=@aW4QpDHUŒIg>~Mlyofr +9us $Ԣ)Z] "Z[&ȑy a8p\+o(zmuu7=WV?6&r ѷ5-iqu icۏ9g]6棯툗 tmB8`}J;y+Hse-)A5l/67@\@=@%E%IO4;h0v#+TwԛO]@-%$a)/g<|ڏK TUr=,?'cQUQwTEV*]JKء6,PJ%WxS9\׍]WUoҨ Gjku7FTV֢-sEo#o\n>lZvycga5ZLSDyQ c dEL(HJ8`x w9k{}Noog5/ rOdœF'.u7^WrXEt9+{V S3s!硯o3Mэ6tKV 7aR!B ?$RtE 0iP[6l6k$"XRJn`2ySw$4 h@qx߼jf sk=ZldD &ݣ8 `5,n^_EqrFaĈAn 1$\`s$4 h@qX56t/lwm7𮧧>= ח]o%Wۙm:ʽ"5~> Y5jW/k=͕zGH^WR#*AV 3XJt6;J+J}kjLֿIyƫos5: +J}kjLֿIyƨos ?`N&sOb^>68"3ҿZ%=+}^k[E nRH$" [U·vo6:EmM^~w'xF3ҿZ%=+}^~¿?]7vo6:EmM^~w'xFMBoS?j"¿٦/?;<~Y_Q > /?/a_.3ҿZ%=+}^_VattW? > /?_QjGAEs_Q > /?VatAOSQɩ6 _ MK=DGhّg}u+)*0ʰ<֓!x?)iSI9iEVQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@r%UU]S[tzecV^_ڮ-8Fq|BfV[KGfUز\$$$U? /E ?g>/*M)C>U#úPĥK(UQ@$w,kS>/4 hs)U"F)j^3]\w+"}7JI-u8RMI# A"}xQ~Lm}nhٷ YC2XW'Ÿ,hRA \Gqo")`jB{xS}Ÿ3UזV_Zum&7TmO_@6`+kxHBGjQ@IX_xS}Ÿ3N + o Ϣ|_UxS}⨺EamO_o Ϣ|_U@nX_xS}Ÿ3EV&E?6 /Qt ?g>/*M)C>T]EamO_o Ϣ|_U@nX_xS}Ÿ3EV&E?6 /Qt ?g>/*M)C>T]EamO_o Ϣ|_U@nX_xS}Ÿ3EV&E?6 /QtaxD/2E5xS}/ς{i.pl6$ړj=6(R((((((((((((sşHkC]=و ս.$e ]HrI#+ޭ]]|LY5DECt%P wd((qCd6]\L#A䷘a*!H`pa*qh:ƧmGOԬ-%VCK`pJ̮ʚ66:u4$>#1%,:I:1 H&9(Aox~(jZϴA6Y7)rfe8bw*wQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEa Dnw{hOqq F2|Ȁ~~C# :EiqIn|AckSj۹QBK(Q"V+xMu{!OI!h6Hyy߅wSԮto×CKft#i#-43y+ ( (UG:|x^2}:YwK)̈́ǐcO+ھO.Pگ/Q|<Bnù .]=SDA>a;O{{RM*+RʉA5G'/¢Zʃݕ徣am}i'mspy֧/ȅ[襭QE(j~n,K5-p 3xM)C>TgCGs]5y99o4.rxS}Ÿ3]M?grxS}Ÿ3]Ml9oM)C>TmO_?_~?&E?6 /WSE/?[o Ϣ|_UxS}⫩~g- ?g>/*M)C>UGO{?3Ÿ3G&Ehe'=mO_zMZcOW{Gmr0\ϽoW92FVl֪(Y\ע+3 ()#E'd9eWG\rŠ(EPEPEP/-KI}R[I'Kۛu64K),$nlxL$ l Qcj$t+s)ÕQUAppF{]2DWV;ݠ`cU[a#qeB8S. Yij2NA;cV* x]˜n\غNg/74K8h& !܅!X qq}{cT{]"}F6ҬC|ۼHʥ~N샷Jޓ3KM>=7RK,q,vB7Y6xIxLn W($rI"„VU"$g*>V8Sź40%Ż4۲1`\OVNXI $p,OV |m$?3 ('k\k)-'{m-@&x<@"Qnz(+_+aW;髙_+aW;qxFo;j.MG[{q<6, 3 |~R3GOO[5!Bw)kkwh6YN$YWi_FfX]^Z*qYrjh:^ܬڎl(9 qRIf~t쿮E<]lto%` ZOnz䵽G*k5]An"XaHL&Y$݁/j=,?'cQR׵nǿ*XTUkNvE碫FIǿ*XTUj+[fi`dhv2eO#wm*bnm/ᶽ%I%LrylUi7O<;^خPGrIDaevqy8+}:c/VHU(ˉIϴ;+]/)5Gϱґ;Z4 ˗*NJԒ }՞ EԴǻ[5эіi| hl5t.ec{ag ]v bxH'aX3GjW3SZ!kd"E GKm[7/%`PI9t2I䪖yWB-Rax'D/2E-nխ)QE{¿HkgY''M_7z~ޞEWXQEQU+C2HY-w(UuB} !u?y6+*}o1Q?+!4`iB뗰>ȃenpwCjݦ7ͩε[~_|?wѢ˸vo6:EmM^~w'xFH4scg {-(Q@s7/mtuj_> Ѷۗ2gQE}YQESGOQɫs.a=GK&QH(((((( t[(5˝f51,2F[`$:Q@Q@Q@s>+*Gs]5s>+*GsN;9Y&彺3gx '}O~Xh.?W`#Z|V2w<mo4MsMƽ^&?OGMsMƠt{]VySWqs8砯^da%.mr,ƗL@Oa\$4 kX5vc?&?9\G$4 k_1>Q 6A7?&?9\^E1`hO^eZݢQE(|M}i^=M<sirX9 ~5 DŽi?aZTW㈟;fqtOEQ DŽi?aZTW74? N<#CN?8 :' "J?= DŽi?aG'D_UiQG4?38 :' "?40*(Ƈo'D_UxGUEv?40Ӣ/*xGTqtOEVcC{C7Ӣ/*ƹk^=[+L>p̶qMEm#F{ EWfQESGOQɫs.a=GK&QH(((((((((;7w<6ڛZv4QXX(-swjJ,\Ɗ= w%?Q Ek#UGac|?(-swj(,qXϖ;5G%?WcEՅ;?G{ƨ|hڰQc>ZXϖ;5]{V8J,\?G{ƫj Ek#TQc>Zv4QXX(-swjJ,\Ɗ= w%?Q Ek#UGac|?(-swj(,qXϖ;5G%?WcEՅ;?G{ƨ|hڰQc>ZXϖ;5]{V8J,\?G{ƫj Ek#TQc>Zv4QXX(-swjJ,\Ɗ= E`-ʓ>Ǻ`eX@]Vc ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (?xapool-1.5.0-src/doc/online/1.2.2/img7.htm0000644000175000017500000000062410235646675017630 0ustar twernertwerner Page 8
Première page Précédent Suivant Dernière page Texte

xapool-1.5.0-src/doc/online/1.2.2/img7.jpg0000644000175000017500000010213510235646675017620 0ustar twernertwernerJFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( (~H$) r[ن6tqe@HnAEqG_iھ.=3s122Gi͌XWY>`yw9 :snew;*+džx AvY'A9k ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( En$t>ըɵ$DT,umcz.!cݍϖK #(HJ8`x kΒwI-y+b^YQ919r{_v[|3+(((+.U fKY,ni%(h!’69J? Ѷ''OO_is,pR`T099 \統x<9oa+@( `ϕ_?`Z[5\C"Dg˟qlg itOWNJ\R)%S%F?Td$d-}.DMEL*78-N8q⿈xGº/)3i:F2NMk^Y9df0JC31D\qa U AѠZ[k{!Y382pG7.>H/˜(Ɂ㒵Y2x%Tád`2`A"%O Dּ oc}xfXjV?qL. J;IaXT9y}sJo1۽i݁tclC3UQ#]VZUSidb7m*bP̀uO2 %OyV?-nk|G <aSj4D)9\f*XR}ZhzwoO,W+ko0y,rHA[#ekiW?eû7yv6󌞾ŗtk{}F{F1'Cj")_8g9 ?<ıZ$(I9tE }wFp.GXٚOh瑸ŷ~$[x/[#3]Z}7Y8g*8s~gmh'u@~-[M{ )'6V~vő-c~R*@o/, մ]M4Kr6a?t)6/kB$Y?w'?/6>"پk]ua+W@mŀ d?*2(Z!.XYHl4_HYD9;Eۂ0!_o:-=>O3y1ȼ7<ӓ/Oӵ ^'WYgSZ2  GVZUuhfĚ>U}ܧ29þ5oAipO2*[XWpHHF+`t3V|ZEsnݳzۜ 8y? ͧm[K/fe F<(6W8Oo#Ln-㷞Id܎H 82q(((((((((((vڮ8H"yG23ZL\opJt8)\9cx~',m%gZιbۮz2㌊ү'\9$v0-sI=U=M%Vj2]IR I$aqdcUfS##~b@cMMU۬|H'LKjV7 Q&6p3F쎥YN %7Un4ɮߏ|p2${N*^33\4B~7woUx=3HA)7&ۈ'Jk^iZF3muLpGTyU>g'ƬxZ|Ah֑ m`\|=Yd3*-kGt{]Q_BuQ@Q@Q@r|9} n pK.9T"A~fWdWQEg&F w;.ɓ;[3GWY=baKbGQln;b(Nᯄ.K$}'&ߛc9UÀ`` Cѣ ̫4dH[x$ =6t]?cE#2bT1a7I<ՍK5KB 닋=G. P2oIa#$uP7x%m EXP b7$協Z}vgyg9$K:U(ּZp8xj a\?*#=h<[6w[qɨ\mA|1Xk9Oz&ŤI}ucu&r|̰o32`FvQO[j܂i.<`F-d7 xG:d4i$ +m(;s5~^%+RWf|PPwrsIEr|9cn h{.W&C~U[ Qy× mMw]R^0sB$opHuP^#) 18x&0el"rʑTfhkY[ly;K42W%7 (ï^k$#@:A]YMcmewmg2lQ)r$XP #-]DCkoQH8Ppb ( ( ( ( ( ( ( ( ( ( (<[ \` <*x$Wk i-oPQ ery^G#r N+e#9F}h["O˷ː&>XNk:74 M!NV2h>~&+\2\7مJyL0*g׮gl;[xQy8w< ^ dbQУSH êjEmqܻ4qg/$EFr"Aq2,X vG*:4a0M?oV3k쿹`Nϑ;H_u|-m| By"tq̯pDbQ(vd ( g Of Sͺ(s((((((((((((((((((((((((((*ݧu+Hb c|0)g*//a'հrzt?,RrOڣ`QiԆLxc+-khJ*ShfŞ9e[]yxJ=3CS/P[F[hy 댞ʽGSд}oҬokIvgq|5 qmK[TdaXg+_>mJ-Cpj{b4{eQ}oi5L=ضYRkGr5VTԥN(~i]6+hopvp2I8䚻EhQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEE_jӣz-"1rnR+2@N XͨhzqM1bhuS$4hVé_ Y"vھ\Dnf0s+BZi ZR{u"aq ;H[kn@3a`_TS/۝:$p˧m!L]#+ /wq%gʕm)UTlMCx/JFtKeˍ|~g?0_ v4kcSܑl~ܶljeYL7&e1z[Q#&3`"`g䪙z jƕ_i])$ؗs{OzMGMj6-|4Ko.$r|^L!i (C#,+;zH.M1u:HnmBuՅQ~v,h!YݼHq$̛>c!}o%K:bYk6FGYlIrĒŲXNI4%֭ |J-wD-X'vf2)2"FNX(x^ޗ%oˍFX{xðHyW rf5x)47vnɲnolq d]B$viCXvix{vk%ı"vn-$er߿8Ěu7Tׄh}2-H.)G!>Imkei+Mǧb](~3c\l_i+Mǧb](~3c\l^tF5 3LMR";Dܰ 0` [ivm/#}].ߗikB{x=GOM> U5 3V | rO 7׶~<{'w :Hч5o@HU j>񦙪iZZPm RUet̬<>j3:+Gck6t>|&0/*!&,9ak2ˢx$լhKڑ)n2 ($jvċmB;?]V qiSǙd!YXA ix|e:J}JM*Ygo%ItLj@`I$Tn/y,ɧ/(nRsϢ;(5[F4I=ݢ3M> a"OI*kXԵ_ƗSI*f >Q]Yx<=k}6#MѾcTW;/c'1w]qxK{vPzq0ܪL9*{0,Ā\WfYεK|RC? d\E;[@Ec9 #nn.O7PY~SbPpJmrSl=h֦#6.d%e o7 Z5+sݞ}`mlRO/uk6߅NR w>̮[w+& ԌseqQL2}8mQ̈9'@$aǣix+c:`lѐ\jH,Xe -݌i]ז*9n!Ĝ|A>c~':xNmN6/O$|u . <},t@f,mGߛM/5o ,RQI3Y \XHF[jm`F]w|+m}Le>e(ŽrzNdOk xHoDi!*7"sNr 8 -[Hڄ vuI1kx $퓍W.7x|[!(w20`]EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQT+)+}NOpጶ1?)9L9   !y$($s}[QbiۤDcFX̌Y`6?<2QgImBvq4xp#܄ 0@O ]G[igX.6Oy#q%PUcGijiqjBYʋ,2GqX>ugo>pb5hUwp{O\ -N݅,mf,w[ /~X4B'yS?]㼺UKH00.뜪"&-Zeƞ_u =2 ʁ'~ѧlu+\MDcy%22;HL}j'Xe}V5k&hmUsN2WBֻj7|#pܻXHQRjZnIyEM*#\JAoe"%V([fy!T9 ;vk*tۍ}_Im,\}^i>F9򇑆`:8<o֭7 a3B$z3( g@um~R ͒[څi`eFr gJ,cRV<#MR/,t%, ;ęD]Ã}EWѬ> -u[L.vH6.ceM|W#+ieѮÒZ GD_>m㟸li=ø.ktEx;Y-7 @VlS|3w. `|ÑϵBMhAmoijLfTmbrߍ8MqwsZFcs>oei$A$K;Id2J07e|?ڕ6Ͳ2*"e)i kn*2=M.5ӪhnV 2Bq}Xum7Yk/P\Ik2ʡ RFpAǸE oq>[x`Ii-b71H1!SjE<->jB\h5[5 EqX$09/4vQSOa@$n\X2Wr]=V u7Ǵnm砮Tޕ_N,"Y5M&P1eߛfKQtٮ|y}5:1ť&(\TmΆ[g6#tz%gvgdH$F U{=wG/ cst"Y0#*AH=Y~ӭuC1ԯbԮ Dʎ#ځp < =BCӧk==nաHD2w$NB1~r TմBP\ d8*r`J-jPjV9OH3 ĩ10kխ|Cimc;,hDSr 6r#s]_iiW|:/h/x¯[mz$hZ߇[~iϕvnp38\C|?OC$S:: VX9=FA ((((((((((((((((((RjQ[iv3P\l[[}J}s`Do1XܨHXۘ&ڽ>5\ݓvZ_jv3kp֥$H'Rb3E.B,KկRImeg^oF+LɅu^sN_O>Az3G 9:\n;ɼ2RFMť!䞠BK֗R k*LJv$P[xgTwhRB3{~:JbK"mp%N8 oK{uI%i61&f<۞wƶ{K=^&-̇ib ' ݥ$m(;W۠<]} t(omE8N q*ŕX+\C繂F[׌ML10B#0az$ ’<ϲ%fm-;U`Oj:Ղ1Z;$Q6qO#ds^wyͣǯL6-p$a$cܥܪI%֚RkvxXKpD57h$fApT[+ 㻿wKXOޔl@Ӑ:esr4M"BFvsC K!kj$zzk#Y:2$M#p$o|<+p,bwFtʤ u POm֤?[o mB{$(\\ZRNHPA❕4_˷ֵ hn-° *$?(A.[;+%Cj1h&MXȷb>USǗb&+7uEoo}Jyd]{̳0QTr|9M'eΈXTEu_Riq.@J\ 3 &Cկ,e紞tKңAn*O$vD)gɍ(/KomUvp[䵵lp αħbՑsrz>w:X[xmo|J\Yx7+`-V%Eԯa[Kx.s+FK*A>@n.%"BI#TP2I'5-EB $n&X%ajf5Du''Cz]x+[wQ]Ww !*:D!5XJ (+?LgǛ`&lw6lEi_Nc_2%I7 yK啲0#ooi\K; I)hP8վ_3 '%Yz\܍E}kPѮ<+;P¢Cyzw ]UC ;;\L-Z+nf`7n,&yeho7 hc =g`W:-4JAw%N3pvek5ķrBI$X7u.f!p+kqkW>OMBuG%Di3L}rUO|5ޡqy H$u5 YNrExi?l|G\OZ],O (Dx|wcc7k77>6:MZKn^KupM`(<)[Y7w  !y$($sSӭ-nI}nFdְ":Gl.糖K堐S`4[}RN%v2[`e0OcL܋Gfft.6 z2I#^IpV$c?Wus&kH'ݷB<#)cȷ,F ڼv8k2U]KAl+gۆ FPs򌊩jZFM )<0#R$O6㪧Mth\kA4@Kj(*@rFX@?58*ۂY7zN6hɲ[Dpό 'M[]>^;|eBKc$fP{#/wեBҭAin"/"L^+䉤%N]FAlcŏ.B O;P9<賰Dʍ?Űm$(}3(%i\2;;x6RmR->5 dk ]x#^ =+!E^fxL;$ڧ(Pn dv\&XhL6-vKvC$(Փ8 O ^j~!+C~!J@7 aOb--?mj9RZ$bX4lE U'j8ݽ͜>ңR09]rm'MƗ>i.PZ<*\m8!H&I-"*w*APřA v܂$agge]]Ok.hWFm 7 i6cKOO-h6c`V^^]cmA,20U%X%nH#;v>$|Es͠(5'VTs,F~lX.luǴx5w{hDָjŎȯ͉u >+kxHb3l2E! (*TnjxK... 6SK^&aYPD` ?A+7~/#iuvMqpdd?Ƕ5 n> Y׈ih#X"o`1l XxP{u0J2ey vnO?15j5S}i8r[-qO4Ȫ7s&^6wjF /bm9cfb NN~brIt->{s$04͒r }j; GJ)|L( _}yK}6~%ӅaYVp)±ݕ7KmM)~ڦ.1`d!99y?cӼ:bo|rڼ8J{Y\+pbI[1pR9'% N$<5/u;]+2PUwwmPBѴwiPYGgqwjUUd(Aƛ5[z} ;XV%-2B3}s/ /|B-'&eO۴p9B]().iɱ=NVH#yv35vxra ] GӧӬ{yۢG&ᵷ(9XYqZAikvCb4\Np2I?aܐ!zdY,}$ ( ( ( ( ( ( ( ( ( ( ( ( (zqj03Y.X ,@845լ76FH A f\x} 3k:q1n[nPuMnoQ7I!b3@̓W//|Gxt)-AuHଋ oW4@r.)kN/5ƁƩ>BY#D. )k!ۜԐC (#_q%1{)R0;aF2rͺ&-u),#MK[pZVX,LlQٔ 30ޛ~}6o oI6i3PwQloP bYgl* $H"z; ->A# +#C--AuT<cu+{7KcA' rK$SVIx_6)`J6t;G#vT9uM$) [ykUbP,Σ䁒8eށ]i䷱k"%e*Pyfuߔ`vKv|drrŁ]1X+۔}5MjUٿ:uH핊!#mw_OPl9 @4/t4ugasKUi#qs> zW_k47fD1bv`c$\`1qZ:dwb/|Q_ˈ!c)/Σw+UMSB+[[|5fr!#.Yxv Y{uy|&~APTp$>KK'//\Z;HPN|ngݗ}km^E66V$'O*C$*R@B[죁=3ƣ.C_k+UA-ʡb¶777kn&q2Rɜ"o؈vWh+I {fo+yy6w;|j8UdbyyGTD$s.6:s:1*kzE֓kg.pzD0s8$*}[ڥǩjV/=7R YkKBUс?X7ɾK y]jj79`ݴr?Ma!{n bG2̊UA_ݱMmiwyK1BU9$sÖwUm* <1Ycbm Ipu.Vu Y.qkshvgK{&3DG T FDQP6.]fvC{mBUQP)*@X%I]lw%; #?dKW36ӷ|oe)=7OC$;ofynU˨ Nzť7j@;иZ0BB@:E wz[%Џpi`3t":` J|WY[I3OsW,Nv2r]/ʾ$IeD(s;*pQwz-bXth`鹛TtF[xG eƇ{yhvW`e{B; Īc##dhQEQEQEQEQEQEQEQEQEQEQEQEimmu錱H.`]0R>nAD$O˪[P{\ۅ_f;#rM?A_I[cHU I9ch2]}KF rF6+^hRM7l'e_)D.H«RͼGLΎK$޼ф_ HsnƓ{5zMk٭RXp&8 %l(xC.Y4r@p` %wmݚXo5OE=:C6cx~Y7;O@AZuXZǨ]ܢIP'qq6wjCT6+;mMtW#l8ɍfrv>llG7+cA jR[u|P2N6d&:vln$Q&KİiUQr[(~PZUI9Rc|Pܺ5̖7B䷘ȨYFdA0B;' /uٯ/4ӝ6KEVe>L/&]-j?Zuٮ#<a#3|"";6b\i"kQ4$[RVI/nl B0T/Iէg.5RݥaUwm37/=s^\$wVk4(!Vnhcx\g8?ڼY-dBn2U@q(hH'yy?4?w}bsݳn/w3nsLծ 9gdBÌ^&eT~d,>e%,_h,Z[$+mZVl" FA7Q\]HEYA 6̥&u*_?;~^ƧGbӯ/14Fh!DV4StW=-|U^oNn2D/IO꤀I H hkZkVl]EDJѩ%/lCY^8.[cm]$AF#{evS|uil X][G2 c߷vvk OU[;$(1$POpJ$JG &.YNLӴu\^[9-ƶ"NTDQmC֥ΐڗ}NI弰\O,gPas 9$:e4'OcgHbQ \+0'z`|˜-&͠MBa0pʊʬkMw˺uo¾!PNx`҂Ch%UXʠYNv垀%iuBR Y2[; C`n9H(_XKYkex#qi)Efdm jS\EȳE{ɘ&lVO΋|7F_8{{o9T"%Gت>`)_5g^(tփ{Hͻ*qn ly5W4( uYٔ+Pč6 3N˧M;]hd&I!DlcB^h|Uy3H}! ݵ7 oFARAV:-jSkVVwV]C 0xmm常8` $Q@$=;닫xKK y`4y82V+[Qld \ڵ(!f(b`HNqcm(D_Sp!2T\s{JӠK}JG1InVXʑF-8r GZOvM4\}5 {歁-KRw#+|$*E i%@zg+K<- ($xe @Cn*9R(>;!$Knv!,Do#gp Tnwr$XorMV >]U.ӸY F,X[tmQN'i X=OA\V V{絾 M9k%?#$) 6 _ jVŞh֤oŞUD XTaw? K^m,+ ]K{nn2# $f\I ??\kj*njhH[UH]*OP# NT,Ǟ=\[<)@ aJ! N~uƥZi65H(Y$lD@I i:U&dw<]*|jxZQֵ Hn"D- h3y:fܠ)+H$6`oPIRcRvGpdxw c#巋{ i.^;y.h$*J0<֣ >i/o\[jwmxm%iDB)DoQҹ8K=Ԓ_ټNVFhh*; a.K=sZ4W7 gZ^NՌ|s`V]6Y3ݸCA1T'BϓR ( ( ( ( ( ( ( ( ( ( ijėhݳ9hI:z EelVKh, w*Mዌ;g=3E״߈rUhRP[YO.6R#B#AVQ (E>q}WqEKn:r5 Mm_K [6~Ͻef8?:qWAc{٭ ?g2dz`8OZkr[?_]ۿVɢUtʭ\(0OQ@^QNt4̓Wg&A"9ټXF\3U 杪xfGm]:K"d-,mSN uNyt_[x-.{ƴnL=.dd24.Xi原 y$ȸX ༅]bcwP/_kWW&MH4s[H9 o+!CJ(]:Dԭn>c.KT77 mp&(cp_e cՖw[ɠNk\){XV.>Pі˄%HvTzþMGCJ#վnybjN8C2'Vڿ:;#4~LmMcjIw%Cz.Y8u$ˮ?ZĢsɧond/k=2JT7ᝒ4/ksq%X %AQ3idʗ%ů>j$ rHU~1G]> "LH@u@E9>A27'_ķY\momQw}doQ@,5;w]7R2)0`|A99kl~_ӧ˖W{t;?r>n1P`>T3}cJs+2~Go[[vb}6k+[hDy"7H,(Yno8nFt˲e,!VǩEs)K]/JBu8%Iv8#]F nbNT@ԔQEQEQEQEQEQEQEQEQEQEQESԵm7F[SP"u2ĥNbp DZ V>4˔ĺ4_*f<7@{MnPEORմn5MBp%8'ƀ.QUWp\68:=U`z@Q@uoż9#`FApA棾,伿"|ɳS? 5ߠ6ƭn*OmS0gmN/%ጾbc9|9g2KO.%J#c4ħ.q71|+=Ԯ-5 )/{AF#QфÂ[%o$qt{aȅ[\F{dgV{aY7IY彚I @ 6$`jKMѭxc ,cˤ~y5),|62Z5#g5$vhEY"n0kw7v #[{YWH $4Ku9x z;V!GG9EUxg!]ljZ]nݤ#6GBN 2uIju}V+ƽJo$Eq*NI`ANкy ,G K ^%HBc r\幍mGoo[yZ+xcvbInj,XK.F.<Bg#!IVCT~\4ږI9LF1a|(]dI^*汢iZVtqʓU7E9WGRz:@}޷!U.{6dĒ$" dr9: K{y.{qsh*Fn>DE-ug*9ZUag! _-+>y,XXu~]I )<:g 2]]}C, gb*'V*CkK$n'/#yfc8QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEU=KVtku5 K,S,J[ g{Es+ծ-|k$K4z|6ӉL,$S 6# j~+VifZAm;WdnbS  ai:5p,[ѐ+RFA5akVΡͭZ\Kue+4ļim ⾏ b!;ookIJC͓c2K*'vc3۾̚l*!x8 QCT4k?],W}qIJD G'w i7[^ovndKc!1{C], cڜlNOgw*[jM*O$]҃"ǹ&)|Q4t۫^gD+K,%(0aT0 ME夿hY>eܥ]Ԍ8*a|/4u+^WG+rE嬊".rf6X[ M%/W-i4jL{lBQ㐠8cʫ|I"驯 fdoWOt:٘";-䢹e8W`/rךAqu]ZS]G^fxHr\I%BcؼVbnvFXev+`/?0 6&Ҩl|۹7l uV GI}7A;!S 0V@|8dN_3iVcDͽbx2޻_`;Aٸ6"E[ŧd61EK5{3 %z=W jM᳏Vҭn<$fX)˘_;F2u ˈ<;hoA׼X$yRRBa2 v~-GRoy}\6-BțFd*Xrl Igk^ ,M͒hijmްVao;vSiNukF l[!V&@|l-_oD}ԷO3?ٷ#/,AhV!I]</s$j%(X+08Zt m>tTzt{a*T pH TeiVG=څYJc/#7 2Ԯkzn" F ps@8~-ޤj0?Ɠ#z 'QM*msZv{ng\mc2'pyyg7^K6i e:w>Ve`0m1ПZY; ,4O(tpH #Vwwĺ߅tY\뚍\ĢrD2H/ݝ(؊ˡWY!aI ,o f?++ >vwfcMqn5!tR"nx.)xS:<3%ީPHŒ5Ϸ;MgQR[iCwnE(ZeI"Ɗb%pR[nk; K7ė|Ĭ-E.,zzk/MXV=wR[xwÕ?(eq^)Ѭ%gADvYX8$;+N zX֝=R#lL1uq$T3?-u=UeY6n:6֍HX ƬcҬK^bB푆!+˫^jzŌ>1.;DeA(dX\1`eWo.u2n>@H`[xajEeawwݹ[ЋVpXF/r<;kڷڭ֫+-K){uĿ2K9d-)sRԵ)uѴeY\\]uVb#0T\] 9ʫSmZ8,g 5($,h7?+OpZ?|zmI&<*%eݲFCۗ֝.;X4˃s+]\0,ʌ#24&kJR jM40) )yK{5hŽV%om$rH@"Acp}fXf{1ON;e2VnI$~&%~쭓E5}瓇[Q`3rO[Jhl[ y* )XSxIMXL [v?(Ox" lS*/<+ |=ϭ\#n巸9 I]H#Tv6zevvZZǝ$ OV((( Nu+6wKQ;[n F( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (?JWRZO-흿2,1F 4EsqϫxMROLT[.1>c*1'%Ne{Aai5} 0|U?4ڀ: +bo$]DTYC d(`c'πFI8"ksOi6ڣq!4"X~<0@; +E_DDeHFympRI6dp۱\(^&,È\co3`;6Km\kIcAM!`VD'IY ǯĿ ˬYjKFiZ!3$|#km{wӭ/t k3]BrE4MqEU{!1[xvR,KxA<¹6˗eSO[4Hx͟{]vp+n(eqEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP\>Gy:ΐBҾĻ؄PXT]eUF~omqooRJbȒX+|=(=VĶivZϦ%1Jbw U*c(6䂤8Y5!y,R9%p2E>*,? Iciwq-7_jZhй&2DM]ՂUCukM8/젴ΰ\ѳr QI@;P7kkKNoc{]N+}Bωk$"* eHM/vm9˴.# 3ܑ: 9忊&vrK 3m]JɝA&gJ҈'{RF[n?)4=,`e("|ؚXti Βfľrl?x]wR. ˡŽzxm))Gf }BܛŞG */J }kHwa'o<=[M.. Kep̮жHÀr*F>k> y%X9ˑTò2d ?/g65 b* F^ =xATvЖb݋N~BXF*8ufOg BediP*иxr(Km&{ZCl؇O-7re#hC.v MrItk۝BȬN6z,F,E-5VQӭ-&ԭ~+, )Q޸K]Z#J"kQnm"(a91WH!O$zZE顼c9l] mQ]͸txW[ԯ4v;[MI lx_p J"p s nj| j)Oql moFLm ?.,3dwii`{yMK"GI$-9l, n "7[a.H>5M&m;z!cmB1|N$$.K<7yi^Omoߜ.znX]k9u[Xh^$ƅs u89{okX7'Xq,aT,+NŎṗ LWu7R6S_QRߞE\g'p#մٵI G!M,eELy#;/H~)|Wвńgwʿ&yw +],OMգa2aY$][%jKj薺#94={/%ˇfmt]ōhNw#}^L(3^Fcbɐu#xqj2]4@2F;H3sCTM.os#̭!7bDҮC)9\~ՑkiiӾp$I'*-q>)wen$I#ƅ{dԔQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@s2t- }aggiݬ ASǣw-kG%ٵ.ͱ WdY'$0UP`- c5y$($xs]CkoQH8PpbZ=>gXϻζ97 @ugi^Aټ1aQe}r[ :Z5vo.*cn&$ wA VG  HB(q<$/$o=٭-3$HZT'MѭK,`g.±)l3(5Ꚅ%ݥi.RX$2^vS  T)q/|CTޛw-miqlf"Kg *vrd'in{:eZ]ūEs/Xcq Z$\7n_Q;Q-Sr3ƈU _rv~/uhN-ɱ0̐[[_߀XϏυ+Z42n|Ӆ8'P=RNe_}%Ʊ8АxF"$L nVq.dӎۤd $ ~v,@(3]X|#<UMnt:;GB6vYo5]3Ao s[zL\Dp#:3H(mPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPxapool-1.5.0-src/doc/online/1.2.2/img8.htm0000644000175000017500000000062410235646675017631 0ustar twernertwerner Page 9
Première page Précédent Suivant Dernière page Texte

xapool-1.5.0-src/doc/online/1.2.2/img8.jpg0000644000175000017500000010332110235646675017617 0ustar twernertwernerJFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (KƿtszZ+HHᜟ3<[iœIF K}gYywx4r@c ~5 A5/u9[ 4( @'#%L<]JO+~#Q=4QEx&EPEPEP\,n;xwJ3Yಟ-rq G6Yu$PXo > @1pHԂoA46)6o0S6H8]o:όO4WQRH F&LF\"k0O ~ongDWx ʭPX[xH:`d2|0'q>|GQ[7my,f(I+ygvr8kg< ,oVO>H4KY#G ' - >㈴OxU5R(!V28cJV6s8f˅Pg  ==q!ު8f88Π֯ƣBL,{kd(ѫG rA88  ϥE%J,/03 *§*7q4xr> xG^V)M,Ѽjdp%\a`vW>%t ) k ('thpB6rF5Sώ|Q_Sӿu7 O,$.$W _pþ?W%:+CUbVAҀb<]0X=s"::[;M[y^"6_Q_sxYfoG ;n[t eclnxٵ '||Q?u~FCR|n|u&tSWQ$lS@#hi_Y4m/^Uo'SU ̬|Eܣj,76x7~!eΉi[ڥɾG0@A%wGxSX /a-!Q(x۠yX]Nz8OO7v#;jQEs ((+~xC:lMkNfrN` +9{䳿ݬ WAcagYgaiy rI8Q$5b^ ҵKFq:Hs8p(F:*M?ׄtE K CjɎf%:0y|isi^iRt)Χw3da8Yzvw7I$f%yrzaErq4|6P,:9q m| 2+SL𾓤j26%[`Vb q( }[6yuA+: 0%÷˜sҮiUnX[G;$+J]p2I=ɫP}:&wA-c$Z0HsЋX Rɚ2 %J#؆9dI9$k9~6]w;Ρpv;Ys1s֏/]c)G 8k3mKEVfcqɬ=KᗂmeukIx;2EˢI'%C]eCkoQH8Ppb(((((((((((((+ϼ}ŒiiGcû!1܀>P0H^l.=ҕiњ7f>?,/tԭ&PItHٗ ˕8_^jZNۭ_@ceP# 0#8$g^LU;L|RĀ{)RryGZ_|EzuC:wqɒInx9zqW?CzK;~G^ K\fk֋jxn_ح uf{c=sTϰPWrO9&weUK o+;?IO(1rrFz1,@8޻4/x_wlx id1n38\nV\(TiinGoop8*(|((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((7#?Xw6R'o,LF_ ay{Ѧ>o[H<<֛Dst6`  3\,5 ow(]Mi%XM.ʤ * :)YK~[.y$_NDDxN%H%武o9Ti a9cz?ך.Օr=9L y,jۂ?FuL]\Zs5=2m,%-XKBDR 2Gwrw?O G A}2ɨY0$qw rH ?VmDiwD kqdp IirLiJ*+rc\^x{ƚtkom9ViJ'xxSsqOȪƽ,^j%V( <,-$d؈$*,0Y{kki4;. &96ȒdޙݗcuU ֋Ia9p21R bA`s'M7vzbdLoYIROp$*cCÚ{waAYv$Lf~c @44X^X˨uwwqkbGxh3d:ll?iHv߼G]]kkKa w~o JGdgv!Ȉ9 E56K˴啵op$)a*@5 wG3cn~pvx[ԗZݾhQlX Q^oK=>7?wmnFLȳG÷FwP3E>'MOL[K-9 dKdvБ ̑]ܹ՜]ZDg<1 w\W9]ﴙ %I۟! ̃jn-Mgv8[6m/\y!Y.<ㄗ29,˖PCm{[/p]rIeIfHw;c2.[n@;m6mRm.-BS|2Qx9^H=j5twcӗUkwv 98(oC\4_ ;ִi-̳d).yq| ?w 8cѦYE$-ݎ'_;M[Y-|Ci]m%߼|YpB6-{M:İM$..{*mpEc0>m#Vͮ`Ewx MȊOe\ǫh@Ѵtϵ4r^\[,>Eite2ht{: FUos5$rnk *W5-* /LSB%B ($@+:Etst-Hk˙d!Sb񩉊*A=wWQUcعrN>v Xt{:}FUws {iIksfͧL\ܳ#[퉓{yl+2O۹[XV>$Ҭi[Go"'@"Rcؤ&$*sLt}oloydIvg8qj,QRY[ ZA$ *n2)<1aZm"#< WHe}Dg?ҖWS"2| sH =UNJnWO nfH ўF4YZ&k.V^ =qz?:,"l>і̠򄰸]J$#d ΅.^HnpU]xI%pr0N 5)u0Gڦmz5PVCg?^#ઘk 㚼dm#N.X!\1 AgkjZס c.1 IÕaw9om/aA'QL\Fym ;߀::sW;J)(<+o{-zxJRk>jq y-]VSUӤWjdv̧skۡiGM} M+odX!k/˾ğN'1Z afې#f7onS OW})KKo5_.ִ,dMNͬmpO~b5 ])kp$S`j> z7W1I(YЋ  rϭe.XwTl`&\XŦOئ3mDa~qH<)[qo9#+6#ԟW<Cwr˸Y(!b2B)SU@ .xm.-NjK{^pF A:Α i#rO3LLdı¬O%i@: ?(z?mW;8,5]VL^HA pAI'4X^YGD ]Xv=GQI_[Үmm5sp#b72<1C 69=ae~B  vwM8)3$oS!Nֹ=Xv k(u_ynV~"D Y*I^Wsjig"Tk{hcޱ!eXˍ|+!+ʏ3-:muid[JCfI6DCmin?ZoV⵾"ou1nݯ_2%opϗO:Vg"HCw}効+#yN +aG`uQn?Zor~zkz:Ou$΅4uB$gq!{7zvQV6,Rb{QaU6_sf]y5Ѿ6hSUԙlL gTcN4܋M_QP o\8q'f ۦf 3@9#pzU A {x88P,@P; #ZپɩkDv~l-2g\r&{\މ|A-EśW-\:03e~/So)映~:4M ֹ=Sڽɚ٢I\*Nv2 nX}S?rƟZfO#?TVrG}j󿽙?X}S?rG,義[9ZQd9c=O? nkQG${֫;ٓ?ks(r{5㕭EZfukip-:]ByUѢi%Nnw (EPEPEPEPEPEPEPEPEPEPEPEPZ萦urnoqg=}MhQ@tْOtQ+B$ۋyީOv>?[4y6Q}lTd lQ@cZ&[eM,`yI}hKX$ByBц9P6:dghQ@cOYV63󭡷DMknP0r=EG7!e>h\@PFi@ҵ(t-NNҬmg[Cnܠ`zТ3:y?{w߽N9[?i\"gUP9^@v ܢ#n巸9 I]H#U84-;t]N\iZ&( ؈w25(8KqŶ(\UڠfqkQ\OxĺDmUu)Y;@8Rz Uy"Xdk1o!~}}rQ\K<j% 4Z|V!@Bᗜrpk ;=JFa[+O*J#ۂw]w(+uW/&g[[4o`[ ne2F0 jO84ˉZ .$#%v('P:J+5GRniw [ZI*<,8l,اrp[5SV 5!m bba< C0yw:(a]^sFꑇnuZ--%X 60q.OHm,xEvHe䍭}ZoN j+ Y]FܚkFQ lOexFC aՔ1ou٢RϬXZioq VhTˎ sۻ|:⋭F$Wsن+Ucp(m@( g{>`riREcO[X.&hpx[cS0I0;2ޗGC3, \&׍ T 58dȖc(/门8kWi"iXoY FAb6RM[MTKPMBdLW^yTH[;JulZ]]C#,N 8>[iYi,6P]i];흄b9pTv=6qzmA*EZiRd/}è+`F{v{kki4;. &96Ȓdޙݗc^GӼCe_AM,)$ê*bh@vԒOhk۴7I+W2Tsm[ |7KUmNg Lmc\m/IͪMŨZ> ofS*/g |ǭG>kj6v|$[qGOQ@8,KkZzVj =edK}6)V 0eܳu- JK"ccfpAVx°i:mh{x(5 #S0=+b [MPW s+F_`%\zր3JMm$K(m1)-8 ;DxLh~ u9줵[I-g{nIfSJBW>avwĺ %rl. ) qF7V1[;s0,}X c KDv"^ +HpHyu[_n- vdD`c/4b%mmb9]* K"/Ew7 pW8'hؓVa!-P7h(מU3>VҀ9oXuy,MŜ"xTC(\6=/7ͨjZ5KekɌoq,#@J32!Fܸ*{ëi~ Z vD3/̨\䐬G`5%gvgdH$F P}d~[{)w 3qo{aI6(d-1>rH&"YXCPk˨ ,⵸RI.Rijnj7ť6c]JW]GX6I2$ /$:9W0 =YsoXu%UƘ`g1%;ž6ᷤVf&-P7h)Y3>e֩(9>}ۥhyHv9f,FzGxΗfkJ~ϟ|oa3c]ִKhmh<'\'da + gCCuq$Fl1ȊY#'h<bv N3Zlڤ\Zme2&r̼z>gTm6(.[[R24o)ɑ>l]Kr,WW"hLRl??~l_nBq26U'#΃>tx~1hc[}8Ǘϝ?xzjIu;2Zj6RA$p .Sp %y\o XhmV#xIJ=]vǖeqe[oͷyi}ŭim=춎if@NX^M]Ul=bo ?.nԊ։~735_\jsXMj`w.$xDS;`vVr-qc^YXivQ,%!(7eg~cSgO]oqmWNZsvZiSͯ๹9a˴g,Jpn0;\jJZ$r$g"0t.P(<}+rjJxʎ\+#4WWy즲$f vvr\(^$Y +Y? iryN6<2F#;z sINeC88{og7w홞5[fYHdĆHa@7B`Zh77RҴk+ĪJAb\|aOE7PXڊ {k~d%~ZG,S V*v # -zN}vfVᶼl#;>F0#pJ)&DqS-n_#m#QW#_fe kur:,ms2KC7YtZK,p\%$uydw1 ]!hžG%nDwv/{>L嫞ѧlu+\MDcy%22;HL}Eq~ k?6Oq"ig -¶ y($yRcJ|7a: ĺ}6 "7vcdy$0/q>'-{[y-D~SKR3=[:6>޳w}oow[Kxx]({[92m[Twr.q4!\"L yEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEyޕ: sP8m aloBT pz洉7$(&:ĻE\Yj d̠vMoLЇ4[*N]mFU%o(iUVP'q5=rMG`MsOԭ᱅"X<ۑ܏`=_Q[Q.o`XDC0^;eF>SռO}%c t#p#+\Ǎۜ\ If۽G:P`l#F',!~ZCZgٵVL1Ż+Yw d08uY ѬQGo$(g@ '8ݴr7U[jF}gL:8W[UAe.f\ dzLsiZ(5o[_ݔ<7.#2?sa*0T99v> ];/ٚ|}EXl s=`/t:pCq%7I I)4@$_,qPʺǂ m~mARNtdK9!Xe{anEݾN2݀X`Tm+Mh'?!SjK=n5_-@#څe}s\c-LE|1'85o k='Nm;CC~sM7%Ae"# 1% e'A0:. D"v9t܁Whf>MkiǦ5}6+q?/\ :*̠,u@\>_jQipHMjRk ~vdWc|0۩giZ5ɬY&6w1!$_|=>{;yO&,"Gm||6Yy'ZkA9g1+p|pw/!L rdRS*9u%.d?gPO9|Ly?Acibu,>V_d{J,D ThX&#B\pG/.5iA={\,F'q@F5l v3^Cү*Hhl\~fJ1L/cU m6{XM ƭ Si7Fm/m"Mww"ykqvQ^$ @rnP*wțco q^ -:ȾXDTT**zu/Wn7 +9xJ aq܃*1$64j~,QMwJOB/h2cxf2|m@\}ԗ\7̸;L1Sܛ/>w\A_XyZY7(|Zci<}nYlL}%Nۆʧ,&5{+f{Kwy*d ;++P D;|vd}QE}mj@.w'n`*`wPkqm/os>B@ue9Gu=T km* [_%udJDD0Ul +nJ5q-3;&$ӼRMrGJ@?|r۞m+MKR.DTday^Y9ćˆ" cU1 =USvD[c9y{X*Cs|I g˥}oCwۤ<}|nύ˟ y/~@,B/-8% |ƺj H.[tP 8vV'a߱8%Fݗx+/a<࿆*|O$%2 1 mXTѓJx<"DG4""F7e}kz͇-l$x` HGUXt% ؾZ^Io}cof fwl;o&y~#ikޟʩw}a FHi#owck#5Ű׬n4bw"aDJacSg*~o÷vcx~;KmO-."`‚ blZK^%kmGwn㴵Ȉ-2;#=2xZh۷u7UЬw&u& ~^hxM(x:YOtv.lThdgh݌|CI7_m+N_\]&bI#G@BʪT @.xkUkƩsy4n$ڊ 3u=+oHntJIo5.HKxV,PK na'cuqrA#D2`H(YC3#emܟ1Z|V:;cY RAElHQ|ݬ@ѧ6`бa]=.j(/3jj n<ڛ`~Im  -m+Y[e3$sfM`2*۲\6ςFghݑ$^AJx$vY_ao^K_<9hK l8+06;Ien2&񮚶B =-%,@w@ Qwe1f{ t28/9ʟ"&S f̅BLo*CcBF464dҞ;-2-dHtQ(m0_Zޱsa[ ,^=n&'gB<r6V2 b6/@[_[٢7#ɻ_Zsw]AmbBQH]ql5>-4=ظȴDA&>Yʟ0X?}i-hK,AXn _k:Itdjm^?Pqk!s+[_ZDBH܌S#rz~7/hX{-#f)Hѳ "B?<=i>wHݻw@8ɠ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ü֯TMѴ'D{.|xdqVRXeAk][3ˬ]C&$8r6_ǃO5޽uc}5,wiuil%# 0t_~ݿ9RAp)h/u+_[ZiOKW"eR1%`m5m6(oe-d2udʶpFf +\.t{[He&͓t ʡ?GWq{:)ȮN>Oo&ݐ(kyjb#i^ ʩ-J7U{k!RYP[G4ʍ3d ',r`zZRAasiqh)yHIځ!v+ai}:NwkZAkkfۭCi$剃%P[G4ʍ3d ',r`zZ]/#la_"8dEw v'%q_Q\"үu-l^_2%_.q9ϙЅzD:$o*9ZDDceIY_x .qq[cHU I9S]"VHbY.eޮJa$}9 ͶH4TfIb9`kXwi9Wխm,Z9P) ̠:#(Kr2Pumm?NYMB'DdXƒfb cZwB]x?5Sϒu7AȂ (A OF0})noGjc KgI1n/ ThvZ ݄KifҥGG 3{ƒG]1]ayck.$UŬww1♢*0p͐8RpXOjgKU#~v>=vn .t+Xu=0`* i ؇" fl;|g:T5ִ/.ÖVקOet )#5HceMG۶:|zoCRIirLiJ*+rc^oK=>7?wmnFLȳG÷FwP3pxcE5yNF ]9VB! TǸ]㼺UKH00.뜪"Xk=$6)3s{s4YA9mPPź)6>k!>%ǜpG8rm|Oke ;.Qi,bi<,)lfVE`6(yͪMŨZ> ofS*/g |ǭGgᳲlnnK9w_h9C)=kkRӼ9w]ɨi c# F s"e]Guo?o>+ԅŶdFI,f@N嘀$#DXG<5ƞ\KU `cȸPt_ˎO&\!a"C,Rb?# ]!H*:6wh}5SJv|pf\B6qjR^\-x$!d TʫfB‚1@d:q=j2s"4Fip!GVXUxp̼zJm_\.,<5 hhk7Gp(c. *S ^Kf-:}pivxT[vYܱS؀wigΫc y%*3n7cuauuvf,Hg@ c@Rq}{[ћJM:Tyh%E""yRmdX0 =sk6bAI*6TPL ygl[ >^ h5v=(C|wf$0o Hb>Wv&MdKˋH7J0%V HK / 20J}:bet/%ȉU7#ϗ oH(((((((((uxwU(y {eBn G2>ky}c- "ss+8U玕ʫNլI>ugCfm\dX(l㺵̅*T XAR@";@x6$['Mv;&?w)K?w4vVQ۽̓LMߓ|'>snò j~TScmELnvGͻp! C<$NOƋuI-.ͭͳq,8dXqoCϚsaoyͥޕxZ-&5*u P7+Ui{%l5-hiܷs!UpArՔ5ۯyK[ M7?1젞zS?R5ˉ3hM%ԗ%K3*ؾX|2NwgAztᏋ,lo?}*j7eVeeenL|ʜ9 EW6\Q^Z`m;^Gሼ mowq>9UHL B+uyY54Y8\Jq9l){}{@GE4}iw7mwueHfBKSvG+S0xsJNt;~n^͜ 3d0$+Q+at:5 Yk|ʻ@XYy X?<ey}&6\yvd6~fm@ƙ[Q[}ٴΈqzryᵷX$/$0UE$xs^..H_ )E}M8\YJga󣔷%-q63@e۬dNnN ^ .5/-1l5 C"niBi(pa/UOu*ZxOgMϘZ M4a!FO.mArŘbxGP:oi5Xv+ly?,N 8aeձԴ?P]AѴ]El`a@V UPpU=3RU{ED܇J17!#:WiԵ95\^{36SsC!xf` vLxnVK!崎Dh k/ F_-噀`@I^jƫd 嵴#)hؠU-!©#5rT"xK4X㈪! aBdQo?jƕm W}M&gi _-&]0|~~?^ ȍvsoOΙ & :6,$`6J%N~Q++Xg>VqJv< 1) _jE]I/HymOIHT}%)LUS\L4<[Xii;QA,p98-I,nG(]*SF FrGPpA9 |FncϘY}bYAom^{neW=ԏYw34,A*Ͼ-OK'i)^(Y"%m!8OapzcxxGҮ kVwXնS埔S=Auyn>H^o\`?]A@gz=Ϧ<.%$NteeVGŹmyY-ĞDZ2 +qir©5H#aK(0тpNVu {-B{Gs3+-0ʑ}+]o:nq6m|.;wŹ#?_oQ( Q7VEJ$E `+5}GF\=[21*2#ڢ5rXe.ӥvm{y~{=>$wMvfʟ)G# u g-PlͳqGT3d%M\;X qyǣY7[G3Gm}4. /  &}:fiN9f O.-|#}a>o$1[|4O+eTobTz(Ӵ=Pc6Ia[,͙JY>vY FI۷ TogGഒ[E٣aѕ Ì֦ä--##!ܻ,̀`U(((((((((((((NDЬ쎪A ;a.F΅/D?Z=JypQϦQ0Foa-gxfXdg*x`xTqQ@v~,X$K ]463JJ|3qcmO <EWZ+" laFآ9wRF'6#@$ [V';P[sK=*O)n|̿rO73vM(^u5/.}> H6 0>D\Hd1YPwv|r/( 搩da.K6bN\ r~eS/D}Oo;vqk2iMOg hy$XPJDD/ʁGʼ| i1o-bEǖmU\ qQ@fho-7lkN\* ϗ2]މ}*k.@udl*v]>}/&}o_yۿngvv|w|9*Y'co9xK͸bX%¹-APtI-B;2Ķ emD3{۽ӵ 셜S# y`!9տsEqz5iMޓco%ߛ[l~YY dYVC eb?NU7Ѱ7m"`Yw, ի2ދ+iv!*Fb[JH Σ#1}&k;ka .[{a9|ʌ6s$[PuơAZ(y~H@P! U Hܻ٫CJa4{GHSIH/+ugrijޮQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ϦɩPâM-|hⓄp,LzsUϊoÞ! k]OhG*hxv`J}~:*i5j K%-p 3N=Gq0K/2\"Ʌ;t8󯨠 +?Lt}oloydIvg8q.eqsowOj#RT%=EjQ\/V)g{;ۑx#n)\%axR]oMGQ+] /bmV; J+wGXu[#gtB"z~U+x#nڶ?ٟ~߿{x +N?uねb0O`@1` ұj1jzi.KYc)%pW,JW+Q\ eޣbWIuFYb\?xWĺ ޚ*%U]FTf5(~vv*g⸄^=!iU@T$7/\Շg)gXι8͹ %fokޟqukwQDBj0  rQ\]uj#[;#+xfW2[vUN88<_vv}:\Z$`l,Xd7(.d/ܥ  D|1chϖ q%γV W(5n%_߰<|.P|NᎪp_uƙr ~;{KWXє̩g˴msX-tFf2–|ڪU)s de%q./'y6Iw)#*1br+!@>®P{o!L}V6$gǒvj^ivUe&6yimn>E2Elc+T.]#Y+Y[Ӳ=d1N$!;8<5~Ӯ⽎0EC T,lڋxunbqj^9lbvK$dDj.{'#ݣ[Y]T(Bn!q]%y] Q2YDl峖%{\c6$ jF5ag5; DČ"1As,9.,/ZAqJFˑ~z0@Ox7VNz K MInn&I%vŘI <=sxE/PY,r[B<bYH$(qO<6\K0DF dOjX\]qnqo${)uqnzxmOX=jqorcL2v2նl1IN֍d.۶[/B6̹ $],uGR%a$ {ߝb9 ψ-y۠mLI|иpA@GF>XY׳\ڽέ<6QB#[NX! ;3 x A [P;Y e3_"NuYk(MF85oũEwaey4ѿۇTL+;N;=5.O{[K.&P&A ;@h8#"5k5ݐK=ţpaʭ@u(1x~/o+SͼЗlw3JSlPrh;p.N-t js2^\\jHũ E8_!̆d)5HҊ4aE{n嶔U>zc A޵M擡Z?MKFK+$4Ňh70,?\1*GQ@'kGSjb-*({4<0,i8ߑ):[[h>)leS[x̉u,eFR$~Sr;mBKZl#}AծM.AO*T&KAt,αeౌF-溊(((((((((((((((((((((((((Z_5\]i\Akrݒ)&\ܠq4=.XxЋ}Nyn홣c2?ˌ*Ӥ CVb'b-DdT zɜcEMiVZ> RK%s3d]a:\ x_PumdpHel4ʖ-vKQDkE2K"©Su+铳Z&`jB c26ʬ9ݕ4hz-ͧZInQݣEˋy%B[%%T(sw^%?'[)tmP%6#q1"I.4hB_8wԫQާrEj\CCDM)XıKم> FyqQ{ygKȋ.ŏЊ&6ʀ ex^qoS`H6I(h)75&Zx‘y{=dvR`r& yodc3ޤ7/$j;Π1y56e>mȳ&&2*nXl9 ~t`ŰZi׶FiI%/*C}/[KњXNJ$+pm6 L<QvǂKy|~vԮWtbA\'"^u5/.}> H6 0>D\pi-Okss4Cou{4vVffeONJխAGa$ƷqŌAc F`'ʚ0T.uMg9k,裌,`mTbmNQ^ 'GdB 6`ANXq0u{I/Ѡuw4)3i-I2dZH IVh/h=zJ[*(WpŇt}2N;}:ݭmC_NLrSk9 :uS~B\GmwGڅ,* >Eh95K@CL[T[xY"IbYcsrGQYz khIuP۽ Page 10
Première page Précédent Suivant Dernière page Texte

xapool-1.5.0-src/doc/online/1.2.2/img9.jpg0000644000175000017500000011076310235646675017630 0ustar twernertwernerJFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( (I-Ķ&&/C.cgbݞqqs c^= dZLA Nyae ;)^RO2ҤH*pU A*t(((((((((((((((((((((((((((((S}q~i,򮧖HfyHVMd یvW`TH a.~`4Cl$V!$$qơU ;Tv6Vnmaimm n'j(FO': 6X|\vۉg.~vIf_IjbX eR'aB 69 ї%i}gs-(Xt 2ᑁYn$Ooޅ>``[0(.(~aVRwiKnki FNqCc Xd0&ZC㈂|nBSfcFg9%`\`!ܿ%?e'ؙKEWfQEQEQEQEQEQ\Sq:*G]e>d K>Z#FJs𵼏_iP[_-oݕ;#LcllxϤW]>y/5-{Q[q`Bbi;ȫI':d --8`ue=ڎi#ǎ݆H75s-r۷H$pK){"US.j 1T`R9ړz>u{[v; hFPy# W/i]W 'Qʯ p3]Eq%~!>_;y~?wch8]x(*?mz'Qc ]FHD133˃5:d3Ӿ?hwVv0$a;`1$ֻxosGӼ]nSosIW]9ݟ>Q׸O*t=ڍl UCe?z>|JߍV/ ˙^ip<[m2CI_wh?lJvNJ8@Άճ{;). 7Gkl2 NIeګ'W#>g |rmGjfP f4e/!\oO87gx$tSk-ekix5ogys?>fDGnͼ~9oi>őݩZ#pA¯dT):K,hi+0˷l/ڬp;{Pi4gys?^nͼ}nqE7Tm-M- pգPX\+j i<ŇO`n[g O*@: *O7$[:%ׄcpj2n*wI>[cܾ]/“izo~2&ѐGe\ #r`?pK㞋\^.*"d$N2c8~s/Oe?2jҤv1 d\5S_rmcŚG&w=T%CCen ώ|Q_Sӿu7 O,$.$W _pþS±AS^=7ų:&coi]Mcd Fea8QEPEPEPEPEPEPEPEPEP\4-]ń&$d Հe=L X:ݶkqs$Ǚj(\}Ьw0Gjjhbz{2A9:giW^mjsӮt.}Vj$rMHVn-KVj q R_,LM&O.pA8郞c]vݵ{D";RhdI"CAEcc>,ݢq$j [!hHn`79WKw޶iM o*G &Ixdj魖IEWQ@Q@Q@Q@Q@r|9} n pK.9T"A~fWdWQEWPg#|d;aӱJ߅ѮKӮgd(ZwQ1\V@q=vP?h>k=rd?lH8lw+v35_ӞQY! NT}+B7>`gLI'mw|np1VZ<&  C=:U(~x;Fk/NIkDr Y@87]H/hmo2qIEe%JU#GBko CѤ 4J$\;pyWqϨv>)P8V 99^?KYjDZqlZ/$cT.zp8c9;^ M-'&-W(m| $>b~̇߅~5zW}5=?ΐ/=+9>֣yZ}y2$>NHy%JU#GBjC L-$ew-nqf ('5,DrGe.!2sֆ~ӒHpvB@s,rN95EQEQEQEQEQEQEQEQEQEQEbu7ZcnذiK2'KRHVUtĚeXI77,/?u9$SFMv1t5^S Y1#`2+gͳ)I^M{-m".H,x?|żWQ qk R*.zIhW'geM;Kg#K/ KEh-U,ƾ\H$?ˠyp^(̻ gyZ@2Tdi桮_eҭq_&YM|X1x8Jz][ßg$KVL0ev.g͖^t[jMwj[YM*w2/@] =_:g&0&D9H$8uU ֋Ia9p21R bA`s'tk_P e"LӮAk"llmc 1<7Znuk&-XH4#p!.%%d(I 7 KXI]k5${Kgn哀O|kCPt}#?Z67 7n뵽 a x뚾v\Y%BjIՖ%bE0e8,v[i_ФQ&gMy3?*/m ݅]85 wG3cn~pvx[ԗZݾhQlX Q^oK=>7?wmnFLȳG÷FwP3E>'MOL[K-9 dKdvБ ̑]ܹy}೽lmM8kG1%i9'}+>LJ-5"H.[h40^0UH(8QkV>iWw_,6qZ,jU6!ڪSv<< 7k}_*Lj4H0*̻7`ʺ#մٵI G!M,eELy#]QN]Vů 2>\ࣃU rvV'D|<,Z-kwX#O2F3)|y8_mǂO$_g&/ FdE`F#v:|~Z5mgX v7_iKs~m5e9L ط-4뻿co(A7ۄ}쩷b rêxEUXSO{6*4X")>Rݗ#%sFa>Zs\Ktyql,e}lLI]t5V}Mɸn]N@$cQ7>qEKJxsW;Mce=u{wwZ<#[4ח26BSvUE\ni-Oit`!WF.T,!̝J @;K]wGӧl[7y0#ѹ08YH4yGپgn͹񎹮?(pgnt>U _Ŗ[j6V{+aqa2+H0ā]B@9&acyijfi/tbfxq௙# !mx.#)eu:+o#'<=dXu[Q;04ԫQ_nK-ey4]NQ+^^^ R( \U؇W#QrS N4}n[k뭶۩nPTە> $KVqW;A&-fI?ӓH$`ww62<m[i*W(]vq QԵ;JʹGyͥh x9q $1 v)a=lu_mM׍iIpCWR;ڇO5+6RGQgq L>rfl\:, jԴY7n {YepͺevqGOQUC\{`' *UK7_7m$ڹ]oJ'mAIim5bw,hg ۰HWk١-2pfV [n1|0/J,^e+_[1̶/WxJψ!ظ ,2CMF,쵝Vk{dE&t.&fչ9 H? \_UWh_-(5nnlnKeYcq$q*navn"ϩgoyj6^\߅&(-o#%>eÝ!_k=L^]e4sk?nBkż`x88X#?jZ^%鍄0xPYmŋlk7շi|5,tphp"Gjh7Kszt=.SMf7+QrI8I \}ޡ}ow}wWUey:;XĥYYX5xCƶךޥ v%b^)7ϜG/ I˝;%U:R$2l9 ~tG΍m*WRT)6@?uqsVNO,˪l[{4p۹yp T+{]V ŭmjO[(2]]JDq76W@۵<Z^5._n\7SA.ż#KC{W%V! b Co0NK|xs>IlݧjW+Gs,$!ln@ +SB-cGluAzsZ 3w0d܂Bl07KszCt?{{ǫ׈MkZ}6pvX!he1o<+5˴ִmm-Bc?0.x(W{@ E'7tѡOy),{'-?xc5ɪZڭşB%y nxJ:Ko`yTTZZa֖+^( ijdk&m I:u%ݺ}ʲMkc!HGbR?,oRT;MNX#CG+5զ67Fy]U 6#ܸTtMoG>o-ƧK]mB Q0HU݆5Iu~#@$ݰq - A+O \,QSdy̫gvTԀYZJ`iK=>__X}S?rG,義[9U|xi-l_C đFE_̟G,義[9G#?Tj(`{2 nX}S?r=Ur{5 8fIVmD0`Re#ZQ5oaEUQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@m=:?2'dF`C FA=+=9afkv: n@, lQ@Ņf-  6R1*熴E{MyfȥPG%T ( ւdi,TŻ L||#Ջm'MOyGy"UrH%!'ўQ@rx/³$)/gHSdJnf8=BIu'K$DiW*\ /wESIa&"P6Kv׎>UҩxOz䗗ҮGlX[P=KIuu4KìwPdg4'MѭK,`g.±)l3*NM'MTTO}BBT^xW@{Z$tٵHuItG!M]*eE|dP=7Iy*Lo{(ve~sMtݭ>r+!@>®Q@Zi&]l$eNTAQZ>xo,kfjTv6JТ):nquqe[OvdFN\9br}OeR #. 0ُ/̊X nϖw (>]3v7xxka8% J$`rqϾKiǫovZۤvy!+1vr߹;~L`P{ }3N˵!7'ZEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQESգFK85meeRRcz W>iugK\Z4Zm3H ĝynbMw[Ck}pͪiϩheLĻw @C ϻv;+ŠjڭuvG0i]T$|[XMZ'HC 2 &H]$ɠ +SZO6|pGrD\M<}㴲\2Գ<77PͧjVfErAhRH ] P4? _Hڔq7bZ%*w7jMhoDbK1pj|;PVPĂAWEsׯutZ+S!H$sB-NjP[ZwVqEpd!tSOuuVż~ۼIVs%DI d9; Co ̡\znܢjF%{X-g&WU2NBYT6dҼY&tKi.|H]lI6H(^?%ɯu i-WɁ'WGV*<{V% n"=WqI&)IJeV`FY,pYEs~<".丼\m2*'9gBE T9!6FbjB@:+S|5gjIy^ 3˰I# &/<u!i*1 QĈČ-2HŠm1h:gՅ v¨(F~nx{.Ovڛ.IY/huD"8mD: I.[oQ9,07gVD_!,@ˏ$Z|&Clo1 i哿wK:_jV6 :x̯6"" AA(o&y}e&}Yyf[{PJ8%Yq`@E]u4 x0b[y xfU*vh۽?V;{k=M#7VV Fwvv]@, oBe仸h51emhmr4DMF %{`XbW5\jMmPA2ÒrpN$)΁XfrͤF7n ; +/Jn. 5-5DpnEd X|$ldLx6YXD"1wtW'aMtXVOk}{ mec!C aK?_xȻ..M+,>NWa吮_pQ\ޱiX|S\^oĥy˷8`.X.#OGEAt$+mH_hxiw[:=;Q`X@723m ;"RZY~Q7.a`ym!Ucr[eN7Zq BΞ3+퍈(y) PeʌMU;MQޑ`NLQ­:n(((((((}aggiݬ ASXYqZAikvCb4\Np2I?W5?hw쵴| cH<c翱a ԥɺ2Cc00`@.ZjQRԥiV2]4M|1.?tmhmt_cw15^jnqko{Z[Ov-eF9`0=G:gq֡ibmE>Yd7i7Mgb,_LKGeidA]f ham}{:o#.c ."VwU `X*Yot뫘..m,^udR+ǃ &\I\恦^i+{o4Ijs[R͸ @ݟjr~޽srH{v*cbL'eXl 㣎M[MTKPMBdLW^yTH[;JOK{wgviK'U' {C?w?g] ۞~VҬjZ[ƩZXdbR'87{Xt?HcOXØ!y'1;^dգ>Kvo&O2 C+,yb$,A\)~X9%MJH ,%ayFGRO@RH6ceiAՅٸO=K!A82|;%t׷hnV7,4ev& ۂ7e]7R]ޒ֟lӯEvYcLrDYA(v62e[%Χ?YnS[u$kqfoŠ|7K?UM*ޡ;I#*!B&kE4:oKqv aNGV < NҊ9k.woy5]eyXd6^דrOIJ~[#wRmᄛܿQEqpx\ֵS)5[e-OʱVf gq5]|VVF4}AṂK[m+dyHgle,X8kvyt%!u  ˥}oCoۤɍ͟/Gb#ʹۢG,VR`*w@8{o|Ѽ9I]閿zlVKkLu+ #]J,IW4k?ͯMX{m\O@nVBCvi cagYgaiy rI8Q$4^Դ KHѼ?k=$S4"XV,vc %M,RJKVe yj0eæj\\X7n YQgvbaٗ5CsšR}EV;ڲǔQOY9 'iEQEQEQEQEQEQEQEcSnaguuC nsld2H\Z@$0>dBID)ݹ^w+*P-=jzeYiK"[$/dVUڞ:F{˯GkiS+"ȩ8{ppO 3goQ@$ߥݵ=v% bY4/Q1`9YxTY?wv>M:H\Xʱ8Rrr NpEzzi]䦏s4oݴq#F?Ic %Ojmz-żtFA#.Qזܾ@^@0[JaILw.f⹊G!G,B$@/R-O_ 8IR6LOzdߘooi[nx%U`P(*z+yEyܞKmM 4{@Jгڳ_ Wң5H[qc& xfy^[";Un Ni -{xل~R,e^C}OCC<7|ߟs3 wֵk-W^[k(-Ukl5klc eX3#d',ksYxNR엗s`H~,2F\䈋;NpO= $:z# q F}Íiˡâ|XCCa1caV˵H`w#4|% Z //-,KaUC#Y#<1 +(ܶԵ}fM;Q]6i F 9P "T!k`~o6>Pi|l uXd;zYUX;pXJV qteu2 1@nxT׮EԑmEIجrUAD̀+]i=-BypˌnG]SNE3ڄvuqyuuWwTE'bmi?`6ſlD]OR6RC!Er3#WǧC%r[BO Z"l6KÉJfHMJMY]Bfv 6WdY\LDA嵽XиfL\8 ~Z[gM.4o-`gpIa6Pѡ'5&xn6OBԹ [v$$!l\=Ūjl"6h42ÀSsg^*忄-&I CtHO ;[*yr1z՞TiAzײ5CēY|-TxnR[F{[UXۅ#oDǿuq%':FEemdڮV͘ՔIرа5mIEhfGV@%I˨bw,fTԒEq{&sNFIA+I%p+B'Yм@l}\O$o#B$ SnZM?z]4n/Om6(ϕe}y'nMeãͥLjDh cx[sB-^h!OrWP2Sp{ jkjzayKt<1`FYV;x&Z]>=;sQ Qے7U<4>ڞj ]i09H +@1_\%6wmi/4LcQ+ʍfS$\vmӵ{LM=Ʊwi91l^r5HBCVmqg_6an] !(n)F Fһ@Dګ6g-KcMSMbF#\ **Xn˓Ğ0~:= ?h67 0Ȫ |,g;e qyƠs9CH۔%v(U۟x Id"Zgftx,veI1F~RlPP#_jX @ 1 JϵU(`!fþ"5-dH`4Eed"&,Ⴇv]|/m ܚXFH(mQYJ]̘f6f@FcMћOi_Uԯ!VXS# 7H]?7ۀ9GV4ꒋ&[M9"h$M ~y ͥ#\mǤj\qo%4+6]܃P s.ZMC:vˑ9fb#_afd29R0oVM7E7 wsw^1،4q E*@$䐪x)KiK-6Vri DB88oMnŢ\Kb'xYV6r \-x7*C} )%`U,Tc̓挣|眅>K" kVKQ,Io=Ϙ+W?tW|i}jztNtG%#m&#mβ=)Wj3 ø\]]jkhIq\!/y/hb] ܱißA #j]Iq}aifJV6o jIaxh4]5kWJ mr ૖Me}{ĺk }4i>Kynۣ$66'ݦ;.t)yܜ`Wx yeV v;u}Wj̲IY%EH IXzavg~%״/Ħ[}6mCLR)uUݱO!~@ZR'4>=)էزџ7˒2߹oߜGzBkj}^[OOOL?u` .kj}^[OOOL?u` .E%Et׸Y^&7,+>*ۂY7|Um/і@$W{Va`Fv ?MFdO!s@F:!Tb[*w<՗$//]rs(#+5T.A %6DI;id xdI@Q@Q@Q@Q@Q@Q@Q@Q@ﯭ9.LB$f$I I8C\I +Q<ȑivWݷ,1;-WXҮ>+rn-AO*0$.%X(T?,E흕[q [[Y*IʱJ8fUhIͫsc_3n23U<v vZg˄6oz.iY$3\γH2`I\o VZVsw{o,-bG$nEubA9dCMΥmcKi3j/;fwĢ`8&~|Ic_Ik?U0i@Fs1;S/=B{k6F rwvx\-0$1-T%U1 UxC[ .F9Wm1l!dm*wl͔vgMY؋%'ZYFk噂e[aߗyz={ 'jxNߵ_FcblOh.%D}>1h88`Ķ̪U6>>Nm\/ n6yb(@RTuI5m=Mt򰸅gvyQc ]erkzG5_[vlnZ&O|,a7d܌n Zxr;ȮKytǀ2țMԭ;ṉId*"Ger75/n<;uq]-Im EMy!EWÂ<9|=gBl˰ IaEu'TRsͧzdp%tB¤~ <ҿ7@ o[j6n{q2#H ]tdV۸+%-)gxB 2Uyc,򺲘*q=Ě# kK}w,[fGӣ,NC) !V *nZxkR{&{)xaMƫ@{t[I` O \j~ $.y}nvKI=+b ƋZU3GgWRd]̞T(p: ((((((((((((((((((((((x!(T)$r(eu#x 1U'MѭK,`g.±)l3*QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQUK9x 8$QyʆRx^zV~~[y]}H!#M+߼wq@W|,e#om`{vv7Pk?[xc*̺ ,tJ+ ìYyiyey*">6\G$^P̍ev72WE^ZM{}Y]juJ't[,)mkó˗ *pnYZA!--4[Xl̗- ΃m Bln zIc{i%xNj`yh BJ ī}䚦Xx~o.m,>˨z unf.@ A}ou_(e"]v՜lKDSsGʃ\8=FF EW+M>*5 ـNL+P>\aW_km./'$[4U~I(x+kK* Y-֐+;7۪>^;TsES|< h7vxo5 %0eܱ1}:KH#К7xsOUFf]͊YfziSFk=.QLK+*KS&Dy1 +K/z1톮dxqm,߀B%ܒ. /;;H3'@-Y|3h+<#n@ou<}QSj˔W܇۟+bZ Y4ŶjlP`'8ǖ6LJ4KMFm84xgk"%B|=CMԡHHs H A2r;G{Y>363>{4^Ů\Z2 䵻UR3l# +d|*u'K '/#h8fQx_ UcVмBUegÉdt] +eHAmB+dwlEi+`?&03XgԢIѴi/M*%p'BoS— IGa!,k`56`$DZhغM.xW}EekBm u+ygX=.TԥxdRst^u=^Wi6ǹݚϗ/֓1,#caX}6kwCis$c¬[ӽ>q! v]Ey_ NG\Aq TXYƠa v)&nỿjVo sK; E w  T-ChQ\_-laԥ5];/FɖGFP H0VtmGƁ 5 ]ԭLn% „( 1|xP{)<)|%/UVkdfc,jVmf?DnJ,-la-]q!]V-1#,dub``F,ۯyK[ M7?1젞՗wxmNԮČ%{X" gvH$%v'Ik uPCXK8fzŷхYܡ8e;q<;Hm?ϴ_߻L@TMJ&YH8-$Hfe\I&M?_jRxt^A B{"is!>VA]h|Im9|5ju+߲Ccc[!7|7^6 mw{vltApA$Mx'G@yY$cZ%c.Y ,GT7ڞ}߉4؞w7~k[Q$.fB"PEy,^SV4=jhy)ree_ wdȏ9!UW}oaۋˉ,l-[7Jd6F_[ Ȭĺ{U}'RYѬuKu`5]CpH7>htF;OoXWY[An+6ᨼ9i ;[H5 \ M, 9B*PV}ou_(e"]v՜l9}O {Ry^Rg~o;3>_o* &boyy4RV{i +N G3@=1j0vb_9S1ƒk7f;pV+o%2';Bm66֗QNBb; [Ck~{WUE=q>X#&=2{Hgdr`IB8}=qV+-/G^ZZ_Qk h[BfTL"3f/K;}BO25HIF7hsq@((((((((((((((}coku U EIm QQ^PUK0˜5iMOE>׼X$yRRBa2 pAEqzg/tO2Yi!+70vP*UщW! Gf| #7wGY3fi 1q$s8y "E=A)b`SvʩwVj*JY"ciY݄(s1J\qF2T}F~%^,4(/ѯ$fv$F2MҊ]2þ׎]}ڮy1D7^G1D.ȡG[MmW̺l# n Haymx¤Nxw`zhZ#∵;]kUSy0B-Q!ݷ׸t'o ڵ㫛BL{xaqv$ah,89=hY5 ydi ˹U],J2y+X@/kvdB>} &!D.@|e^[Ӥ)W rGT=Y]NM2Q·dͩto,opBO9uWo w0ũ+JΩF,ʡF Ԛoun=%iYXb*J6(wҊs\u6MbUDP%x AbOB.Kgi%Ƨuea7DN 1(DD1eBv!iEeZwVȒKRc1`UI 5MN y 85ՄmϐY%wWQԛhc"ʹxryFP&хeY ?(ܨ[.[uG]cUFO 1TQB(RW]^JT,mX0:[xYwJMgK{qi$ne330\!KFqq6,@??x68ٓ@\t_o{i5=ĶEf4/qmjhڅחm{/,լe!}K1IJolV&Au;3sŮv3:p C e^ oM8lK[y,H~?dW~ Tx< }SDrI,WX@K4+dnW /4iY^ZJfyY;|m Ǡ&{4۽)E8$ՈVBC)<@z/5;Tɯno/b%wDZY)00v 0bNH|v h+dIE1`!.5CG<}A܉)]keU#le^mtkN Y/VKB>ҲE$LRE$| ,}u%ӉٲRm 0Zn/ueyD"6`X-# 2jWl&>NR(m>*XN? /,muB,s͈^Dn<82Y%c5i{wĚ"$&TěYn!rrrb#\6ChvLI`v)s#%q QfSUY4"" 8^ oM8lK[y,H~?dW~ TiEqv ɫ6kq{$w)cKj6Cd+@V!Mqqe5 ";ۡ'E2Ī"{%ZV[zeN1 go2X}v-2 R.kn\ qI(oV5]rO-cEl| ͌a|T{ar:Ӣ/7-caVba Q@w0M=V8;+]dv0Q(s3P#|1?i^j}+ş2?3hqo2C7*󞂊DžlүC=ޑ̤)U 甒F!Ycn.yiZ^i"]rd"ȫ:ud\r6( {&ok {ZMlؗ1 70bi/Q!|84* f7~l0=bԆgIQ@z,\Ꚏ_5VjӉ>.4J-|,(>AiϨeh s+S+,FW+a$փzK6&m(K{?.+LlϹdulH۱( ?WzE֭uyI.pBD0#!18G$35uBy:$W_XYmg,823ʤd|BqҴ../cԮQ#X1F#Bw$bKqViqGeckQ$}]s!lpI=8Œ}wZ*CI l#BXFN,HezvV:閱{ UGƹv\űKME i14B,_{~FP&RF9F{(w+{-KQ g ZfȠ]'Z 'I+K P@h'@*J((((((((uwe\Xijh%H̭nrNӵ;,kp 2vPl^A/YEqvnTmg$K{5Se&H Ǒ62gv U^9 07×Pv{;1I3%VYQF(oRχѯiue,B-E7S[xwvǺE=JY-㹸"FP6nf,w7H`w)Pk6+j[O}qiݱ!A4 ^H(ղ6Y}x[N9ҧkϴy}yyhwToЖ37^(3Ė/~L)9c_]$ɜ~O T ׅ#eΗ;m=SXvhVXwܩ 2Q@g¾&FԭgBk2^+n@H4vap/$/QU ; ,px 9UV8`'ym"h%BG"WR0Agd0F#E$G$/5唞 U'y}m.ʦjm$Qg53ZA,W` QɤjB"hTʋ 3psW((((((((((((((((((((((((((((((((((((((((((((((((((((((((((*E5g&xaoH$-vSitĈAOͷw8+sĺlυu}.ݣYl$(gBqjdž׾{C<dXj+G,U-1"+6v?A;H->yy4{ՎI}-Gmn67*gKy_!K|%Xak>ՒI5 ma,| &vM׃BЖ6|Y\j70?(U.PP]*UjBhk=^[uI <S 9bʼn0{>*{KbkaÕiV3y{wdl2dGY~(޷lNXݱfC]ZP yU p[u#~m];MZBqpF-簂 ^Xf(dm ~>$-gҮ/oK9#E%Y\3@O$un4Cm$P4Mqm͵ |e6S: @S\jG13n${H$W#hRn5mk{" +S|nLzʳˆ0,bq iRVĿ#,06!Q:FI@Wzz _^XiSzPnO3l ^XТ hfK~͛qcoGN5wTw;I9,ʒCW`bD-$kHW+o.,N>EPyEχƛomaijH@6k,w#1+ R'Qx:v,:l#ZYf3$]R $L! $m|;2X715m萒߹Ul2*`/gCRȷ)F.r6]H@ *M'MFy2 J 4.A,\O2Z]j~*˥}_F`h/$cs 39`ok[kFotXX8!H'ؘ#bA/ <[c'\L$߼K9aI 9=^,ujJK[{m#;|+-nzau/?FT:f2iªb&82.8@|! E#ff1a#0?sYcw(c]6ueI8x$gxqأ ɓ@+BU׵]oSҬm|UŷOO(QoRͼuS@dg~Fp,^DKte[\9P,oTeQ?t{KwcSڴNl\ :;~B1ݮfFӫ!C!Nm\chCA3xJvhWBN$d >dPs_L, }}b6[c-w)sa$V9\p5i4.L $yh9f8bI#$>>ѯ.ViVQBXm?<گlo- >[xwlM m ދ*\K]cM氚!Js$P.`i=ap.--ddP q̌~Y9o9=kqm2]mn )u\OLK I~]g$/x\{H.mao$<ɕvƤD7C:m-(V$ o)nx劰Tb6Odm?-w)x^Bgl6ۖVel`IKm,44Yo&w&m_3FOHYz`8 x~G5- yמ^+9¶X1.,%|U -5"IYKb1,>˨8el KOtkK?˒&4:[ƌQ3I$xxF(/] F cfvUd`.-`~!'mFfbkyf.|̩PP ׵'#3i}\Y[dfI%'tќ)C?xnA?Z{omw P deߵ!_-99/.$ܦ{fCm4]3pJ 7^hԚm 3l/39ܾZO66N;m+F𾓠lφq ϻ&1?1bjlPEPEPEPEPEPEPEPEPEPEPEPEPEP?/4rywV}оvN_h:3Ky;k+k&G{&gEځ`5x {xyt˔8Գ;xcjx;X-Žzm1t zcP-~2l'g[KkRdy&I.*E%qcv^jx[f֝u[ R8-QsDagq|ߴ TZ[ݤ eimMm$J$EPw.G98+zIuXoԬ[]2R@.C'OԯtJO[ot`SdJ o7Ÿ; 1 .4"DMϵKeJŐ4x%s`חqݱHY<,r,jvYF}}cAݽĺrNP=kV_i:ʤźi>\,%7*Oi|Whf >u)7 #9L:`@ pHjg9x'dB)f ʩ VKR[UdoE̶c$u(C!=N,㼱Kl: (N23لa #._]h_~n,KV+($F Tb܁⤛&-o_*DW*鉃)2㼂$vaeYG I`ܶ餺eQ XeBB<-|Z-;o}uo]wPYbs Qa\keˀV2⩧ -sk Qr=.8 7W\nY2~Gk&i˩a+Hdi4@+W'>:fd|Eyit;I,Iʫ\Omrvfe (NM=bXCT;dt^?B>ϩkYYH`1nY@c Rna-Hn]Klp)T˼3ps5iMJM֌4طBM ߐn?6[  ;Ve1a -Ԯ;(,19O(c5+brqT↖M95ņ(sgxݜo7|Aab?jB5Reby2FYHUe +R3Z>"om {q 3 9b.@)[JkZ5}j!eF$3E# &>ec׼yjTխﭬa%^@E+ay0qÍJ␺֛VoSGZ,Ǯm2xJ"l,CX1$qRŀ^>^隖I4z';<ô!w>p$l}]DIu-C$h1ərەy xvÇE_[Bm--ZKyn-+d2(?6,Coaix]oR׬n![QiЌ;+331 둅QEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP~bx{Sռ;6[؅3\|GؼI;Ǩ|ӳZ5VNJ.9*E5e=rX4 G5H:Ŀev$/x$P柫^\xSo,Cq ܙ|yUwrID^#[k>tבݰw)A!U? ѷuCurEQUҼFc%iE + v RQ$f17۵<)ޘ=7<6fiKDɛnswEg}I fo1<Ɣ89 6#zU,nF}i pxV[״`ݦpTaliwHKK\\УO4#bp/$v~KkܞDβՈIj&.m .}oMP.-R͍a99'c?hO'm׊xG]ԵHbKh|Fk-Z\[sl; *YUOCXb@ԭ%}tj7vS#fуܳ w^ZǪؽB{hV EYp Yz+eqiwky^EʎɖʌGz|7 EP"pEx`3ef"xxq&n[i<"\m4ֲSVFtX(`v-]^XX dAs+FœgO"O2:"kzk;H.iWt@suQCJD.dܒϧQm>h79WBz}[ g|x;Uǃ#Y4v8xKHK 03ZݾhQlX QTg>xJ2 {y E^?0t554}IbV#&%&|,>n YZVrD01eHϼJJ5zDt]6 ˸$7$Qba a:|&jZNLkxnha>Yv(qHcx\K *o ]$zl/fU@]B+)/[zޓm'OFMc,e|"2>rAd\ܵ#U]$v&M9ađ\&0sgpj|]}\XEh& JXoĺ %rl. ) q^oi+ [>f-mKAY#>mNRd I5 NúnyhO{aW2ʜXL_dj] oM.WO&V0LNpBK⣛ŞG */J }kHwa'o<&,IGVvy|&tN #`\mpch+ ~[7LO&[5 ` ,=K ]伵U{Э2 +?}{<0OqmwkyV4#KCbQ%8 eQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEG<[oqsA*92<Gl,8- ;!1.I' 8$ƬQ@7O-}2C L'.@9>֤,㳰<h$(dEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQExapool-1.5.0-src/doc/online/1.2.2/text0.htm0000644000175000017500000000051610235646675020031 0ustar twernertwerner Page 1
Première page Précédent Suivant Dernière page Image

xapool-1.5.0-src/doc/online/1.2.2/text1.htm0000644000175000017500000000057410235646675020036 0ustar twernertwerner Page 2

Première page Précédent Suivant Dernière page Image

xapool-1.5.0-src/doc/online/1.2.2/text10.htm0000644000175000017500000000057710235646675020121 0ustar twernertwerner Page 11

Première page Précédent Suivant Dernière page Image

xapool-1.5.0-src/doc/online/1.2.2/text11.htm0000644000175000017500000000060010235646675020105 0ustar twernertwerner Page 12

Première page Précédent Suivant Dernière page Image

xapool-1.5.0-src/doc/online/1.2.2/text12.htm0000644000175000017500000000060010235646675020106 0ustar twernertwerner Page 13

Première page Précédent Suivant Dernière page Image

xapool-1.5.0-src/doc/online/1.2.2/text13.htm0000644000175000017500000000060010235646675020107 0ustar twernertwerner Page 14

Première page Précédent Suivant Dernière page Image

xapool-1.5.0-src/doc/online/1.2.2/text14.htm0000644000175000017500000000060010235646675020110 0ustar twernertwerner Page 15

Première page Précédent Suivant Dernière page Image

xapool-1.5.0-src/doc/online/1.2.2/text15.htm0000644000175000017500000000060010235646675020111 0ustar twernertwerner Page 16

Première page Précédent Suivant Dernière page Image

xapool-1.5.0-src/doc/online/1.2.2/text16.htm0000644000175000017500000000060010235646675020112 0ustar twernertwerner Page 17

Première page Précédent Suivant Dernière page Image

xapool-1.5.0-src/doc/online/1.2.2/text17.htm0000644000175000017500000000051610235646675020121 0ustar twernertwerner Page 18

Première page Précédent Suivant Dernière page Image

xapool-1.5.0-src/doc/online/1.2.2/text2.htm0000644000175000017500000000057410235646675020037 0ustar twernertwerner Page 3

Première page Précédent Suivant Dernière page Image

xapool-1.5.0-src/doc/online/1.2.2/text3.htm0000644000175000017500000000057410235646675020040 0ustar twernertwerner Page 4

Première page Précédent Suivant Dernière page Image

xapool-1.5.0-src/doc/online/1.2.2/text4.htm0000644000175000017500000000057410235646675020041 0ustar twernertwerner Page 5

Première page Précédent Suivant Dernière page Image

xapool-1.5.0-src/doc/online/1.2.2/text5.htm0000644000175000017500000000057410235646675020042 0ustar twernertwerner Page 6

Première page Précédent Suivant Dernière page Image

xapool-1.5.0-src/doc/online/1.2.2/text6.htm0000644000175000017500000000057410235646675020043 0ustar twernertwerner Page 7

Première page Précédent Suivant Dernière page Image

xapool-1.5.0-src/doc/online/1.2.2/text7.htm0000644000175000017500000000057410235646675020044 0ustar twernertwerner Page 8

Première page Précédent Suivant Dernière page Image

xapool-1.5.0-src/doc/online/1.2.2/text8.htm0000644000175000017500000000057410235646675020045 0ustar twernertwerner Page 9

Première page Précédent Suivant Dernière page Image

xapool-1.5.0-src/doc/online/1.2.2/text9.htm0000644000175000017500000000057610235646675020050 0ustar twernertwerner Page 10

Première page Précédent Suivant Dernière page Image

xapool-1.5.0-src/doc/online/1.2.2/xapool.htm0000644000175000017500000000054410235646675020270 0ustar twernertwerner Page 1

Première page Précédent Suivant Dernière page Texte

xapool-1.5.0-src/doc/examples.html0000644000175000017500000001256010235646675017035 0ustar twernertwerner XAPool Examples Description

XAPool Examples Description

GenericPool: use of the pool, just to show it is a classical pool
Pool Datasource: a sample to use connection from a datasource
XA Pool Datasource: to get connection which can be used in distributed transactions (this example comes from JOTM)
MultipleConnection: demonstrate the use of multiple connections in the same transaction
MultipleTransaction: one connection and multiple transaction
FalseRollback: here no transaction, but a rollback on the connection close()
SaveAutoCommit: save the state of the autocommit flag before the beginnig of the transaction and restore it after the commit or the rollback of the transaction
SimpleStatement: test the Statement implementation
  ds : datasource
  utx : UserTransaction
  c : Connection
  ... : means in most of the case, an executeUpdate on a PreparedStatement object

MultipleConnection:

source file: MultipleConnection.java
This example shows how to start a transaction, get and close connections, and commit or rollback the transaction.
   utx.begin();
   c = ds.getConnection();
   ...
   c.close();
   c = ds.getConnection();
   ...
   c.close();
   utx.commit() or utx.rollback();

MultipleTransaction:

source file: MultipleConnection.java
This example starts to get a connection, begin and commit a transaction, and begin and rollback an other one.
   c = ds.getConnection();
   utx.begin();
   ...
   utx.commit();
   utx.begin();
   ...
   utx.rollback();
   utx.close();

FalseRollback:

source file: FalseRollback.java
This example demonstrates that if you set the AutoCommit flag to false, do some update on your database, and close the connection, all datas are rollbacked. This example does not use transaction.
   c = ds.getConnection();
   c.setAutocommit(true);
   ...
   c.close();
   c = ds.getConnection();
   c.setAutoCommit(false);
   ...
   c.close();

SaveAutoCommit:

source file: SaveAutoCommit.java
This example shows that the AutoCommit flag is saved and restored after the commit of the transaction, in our case, autocommit2 and autocommit are equals.
   c = ds.getConnection();
   c.setAutoCommit(autocommit);
   utx.begin();
   ...
   utx.commit();
   autocommit2 = c.getAutoCommit();
   c.close();

GenericPool:

source file: SimpleGenericPool.java
source file: Car.java
source file: SimplePoolHelper.java

Pool DataSource:

source file: StandardPoolDataSourceExample.java

XA Pool DataSource:

source file: StandardXAPoolDataSourceExample.java
source file: DatabaseHelper.java

SimpleStatement:

source file: SimpleStatement.java


[Last changes: June 04, 2003] xapool-1.5.0-src/doc/index.html0000644000175000017500000003200610235646675016323 0ustar twernertwerner XAPool - an XA Connection Pool

XAPool - XAPool is Another Pool !

current v1.3.1 - July 30, 2003 ::wiki::

Description:

XAPool allows to pool objects, JDBC connections (see the example) and XA connections (see the example and here).

It comes from Enhydra application server from Lutris. Now the project is hosted by the ObjectWeb consortium and managed by Experlog.

It exports:

- a DataSource (with a pool) which is a factory of PooledConnection,
- a XADataSource (with a pool) which is a factory of XAConnection (connections that can be used in distributed transactions).
XAPool has been successfully tested with MySQL, PostgreSQL, Oracle, SAPdb, MS SQL and InstantDB databases. We need contributions for other databases (about Informix and Sybase, we have the code, but not tested for the moment).

The classic pool offers common and useful operations:

- lifetime of objects
- a common log writer
- a minimum size
- a maximum size
- the possibility to setup a way to wait for objects when all objects are used
- an object check level to verify object before returning to user
- a garbage collection option
- a common PoolHelper object, to create, verify and destroy object
- objects are linked to a generation of objects when they are created

Download:

XAPool on Objectweb SourceForge

NEW -> 1.3.1
XAPool source :xapool-1.3.1-src.tgz
XAPool binary :xapool-1.3.1.tgz
XAPool jar file :xapool.jar

1.3
XAPool source :xapool-1.3-src.tgz
XAPool binary :xapool-1.3.tgz
XAPool jar file :xapool.jar

1.2.2
XAPool source :xapool-1.2.2-src.tgz
XAPool binary :xapool-1.2.2.tgz
XAPool jar file :xapool.jar

1.2.1
XAPool source :xapool-1.2.1-src.tgz
XAPool binary :xapool-1.2.1.tgz
XAPool jar file :xapool.jar

others
XAPool source :xapool-1.2-src.tgz
XAPool binary :xapool-1.1.tar.gz
XAPool binary :xapool-1.0.tar.gz

Mailing-list:
subscribe to the public mailing-list on OWForge
view archives of the public mailing-list
Documentation:
Presentation of XAPool(PDF) made for the Objectweb architecture meeting in July 2003.
README.txt
Javadoc API 1.3
Javadoc API 1.2
Javadoc API 1.1
Javadoc API 1.0
(the best documentation is the example part for the moment)
ChangeLog:
1.3.1:
------
- added logging information
- changed Andy last name (sorry)
- made a lot of changes in jotmxapooltest by Andy
- added example HSQL config
- added sapdb example in spy.properties
- prepareStatement(String, int, int) was not getting associated
  with the transaction
- get the last version of jotm (1.4.3)

1.3:
----
- added comments in GenericPool
- added a lot of method comments
- fixed a bug with multithreaded process (was a regression)
- removed a wrong test, which made a bug, in XAConnection
- added 2 tests, a multithreaded test and a contribution from A. Zeneski
- added the last version of JOTM (1.4.3), and carol
- removed TraceTm uses with JOTM
- changed the XAPool way of log (log4j.properties)

1.2.2:
------
- removed the limit for used objects inside the same transaction (limit was 100)
- fixed a bug in the XADataSource object, to check if the current connection
  is not already in the freeConnection Vector (bug #319)
- fixed a bug when the pool size decreased and connection lifetime is
  reached. This bug appears when the pool activity is not important, and
  the number of used connections is lesser than the max size of the pool.
- switch to off the boolean status of the pool

1.2.1:
------
- added a console appender to the log4j configuration file, to 
  log with the complete name (org.enhydra.jdbc.xapool)
- fixed a bug when using multiple connection inside 
  the same transaction
- changed the logger name xapool, and now use the complete name
  org.enhydra.jdbc.xapool

1.2:
----
- bug fixes in JNDI mechanism
- added logs with commons-logging
- added several examples

1.1:
----
This version includes major changes, and correct a lot of bugs. 
Main changes are:
- AutoCommit value is now saved before the begin of the 
  transaction and restored to the commit or rollback of the 
  transaction
- when no transaction is defined, and the AutoCommit flag sets 
  to false, when the user calls close() on the connection, the 
  connection is rollbacked
- fixed bug when the connection is opened before the begin 
  of the transaction and close after the commit or rollback 
  (connection enrolled a posteriori)
- fixed bugs in the cache prepared statement mechanism
- added commons logging to log inside XAPool
- added 5 more examples (tests) to demonstrate 
  the XAPool functionalities

Examples:(all examples are described here)
GenericPool: use of the pool, just to show it is a classical pool
Pool Datasource: a sample to use connection from a datasource
XA Pool Datasource: to get connection which can be used in distributed transactions (this example comes from JOTM)
MultipleConnection: demonstrate the use of multiple connections in the same transaction
MultipleTransaction: one connection and multiple transaction
FalseRollback: here no transaction, but a rollback on the connection close()
SaveAutoCommit: save the state of the autocommit flag before the beginnig of the transaction and restore it after the commit or the rollback of the transaction
SimpleStatement: test the Statement implementation
MultiThreaded: test with 2 threads (contribution from Nicolas JULE)
JotmXaPoolTest: stress test (contribution from Andy Zeneski)
License:
Enhydra Public License (EPL)

Success stories
ExperLOG embeddes XAPool in its e-commerce suite : ExperSHOP
JOTM (Java Open Transaction Manager) uses XAPool as XA pool datasource
XAPool is now integrated into JettyPlus from MortBay.org
It's official, Ofbiz.org supports now the last version of XAPool, and Andy Zenesky becomes an XAPool Developper. Thanks for his work.
Links:
Advanced JDBC tutorial
How to write a new driver wrapper for JOnAS ObjectWeb Source Forge
ExperLOG.com
javax.sql API
XA Specification - OpenGroup.org
To do list:
to implement JCA (Java Connector Architecture)
to validate with 2.0 JDBC driver
to validate CallableStatement

Download Section
Mailing List
Documentation
Change Log
Examples
License
Links
Success Stories
To Do List
http://www.enhydra.org
http://www.objectweb.org
http://debian-sf.objectweb.org

XAPool downloads:
August 2003: 198 downloads
July 2003 : 130 downloads
June 2003: 72 downloads
May 2003: 36 downloads


[Last changes: August 26, 2003] xapool-1.5.0-src/examples/0000755000175000017500000000000010235646675015376 5ustar twernertwernerxapool-1.5.0-src/examples/distributeddatasource/0000755000175000017500000000000010235646675021773 5ustar twernertwernerxapool-1.5.0-src/examples/distributeddatasource/DataBaseLayer.java0000644000175000017500000000731110235646675025301 0ustar twernertwerner/* * @(#) DataBaseLayer.java * * JOTM: Java Open Transaction Manager * * This project is developed inside the ObjectWeb Consortium, * http://www.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA * * -------------------------------------------------------------------------- * $Id: DataBaseLayer.java,v 1.3 2003/04/11 14:43:34 jmesnil Exp $ * -------------------------------------------------------------------------- */ import java.util.Properties; import javax.naming.InitialContext; import javax.sql.DataSource; import javax.sql.XADataSource; import javax.transaction.TransactionManager; import org.objectweb.jotm.Jotm; import org.objectweb.transaction.jta.TMService; import org.enhydra.jdbc.standard.StandardXADataSource; import org.enhydra.jdbc.pool.StandardXAPoolDataSource; /** * @author jmesnil */ public class DataBaseLayer { private static TransactionManager tm; public static void main(String[] args) { Properties props = new Properties(); try { props.load(ClassLoader.getSystemResourceAsStream("spy.properties")); } catch (Exception e) { System.err.println("no properties file found to init the database"); System.exit(1); } System.out.println("\n database configuration:"); props.list(System.out); System.out.println("------------------------\n"); try { TMService jotm = new Jotm(true, true); tm = jotm.getTransactionManager(); StandardXAPoolDataSource ds = null; StandardXADataSource xads = new StandardXADataSource(); ds = new StandardXAPoolDataSource(xads); ds.setVerbose(true); ds.setDebug(true); xads.setDriverName(props.getProperty("driver")); xads.setUrl(props.getProperty("url")); xads.setUser(props.getProperty("login")); xads.setPassword(props.getProperty("password")); xads.setTransactionManager(tm); ds.setUser(props.getProperty("login")); ds.setPassword(props.getProperty("password")); ds.setDataSource(xads); ds.setDataSourceName("XADataSource"); InitialContext ictx = new InitialContext(); ictx.rebind("XADataSource", (XADataSource) xads); System.out.println( "bound XADataSource with JNDI name 'XADataSource'"); //System.out.println("DataSource ref="+ ds.getReference()); ictx.rebind("DataSource", (DataSource) ds); System.out.println("bound DataSource with JNDI name 'DataSource'"); ictx.rebind("UserTransaction", jotm.getUserTransaction()); System.out.println( "bound UserTransaction with JNDI name 'UserTransaction'"); ictx.rebind("javax.transaction.TransactionManager", tm); System.out.println( "bound TransactionManager JNDI name 'javax.transaction.TransactionManager'"); } catch (Exception e) { e.printStackTrace(); } } } xapool-1.5.0-src/examples/distributeddatasource/DistributedDataSourceExample.java0000644000175000017500000001177010235646675030415 0ustar twernertwerner/* * @(#) DistributedDataSourceExample.java * * JOTM: Java Open Transaction Manager * * This project is developed inside the ObjectWeb Consortium, * http://www.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA * * -------------------------------------------------------------------------- * $Id: DistributedDataSourceExample.java,v 1.1 2003/04/02 13:18:55 jmesnil Exp $ * -------------------------------------------------------------------------- */ import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Statement; import javax.naming.InitialContext; import javax.sql.DataSource; import javax.transaction.UserTransaction; /** * @author jmesnil */ public class DistributedDataSourceExample { private static final String SQL_REQUEST = "select id, foo from testdata"; private static final String SQL_QUERY = "update testdata set foo = ? where id=1"; private static Connection conn; private static void updateTable(int newValue) { try { Statement stmt = conn.createStatement(); PreparedStatement pstmt = conn.prepareStatement(SQL_QUERY); pstmt.setInt(1, newValue); pstmt.executeUpdate(); } catch (Exception e) { e.printStackTrace(); } } private static void printTable() { try { Statement stmt = conn.createStatement(); ResultSet rset = stmt.executeQuery(SQL_REQUEST); int numcols = rset.getMetaData().getColumnCount(); for (int i = 1; i <= numcols; i++) { System.out.print("\t" + rset.getMetaData().getColumnName(i)); } System.out.println(); while (rset.next()) { for (int i = 1; i <= numcols; i++) { System.out.print("\t" + rset.getString(i)); } System.out.println(""); } } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { if (args.length != 2|| (!args[0].equals("commit") && !args[0].equals("rollback"))) { System.err.println("usage: java DistributedDataSourceExample [completion] [number]\n"); System.exit(1); } String completion = args[0]; int value = 0; try { value = Integer.parseInt(args[1]); } catch (NumberFormatException e) { System.out.println("[number] has to be an integer\n"); System.exit(1); } UserTransaction utx = null; try { System.out.println("create initial context"); InitialContext ictx = new InitialContext(); System.out.println("lookup UserTransaction at : UserTransaction"); utx = (UserTransaction) ictx.lookup("UserTransaction"); System.out.println("lookup DataSource at: DataSource"); DataSource ds = (DataSource) ictx.lookup("DataSource"); System.out.println("get a connection"); conn = ds.getConnection("mojo", "jojo"); } catch (Exception e) { System.out.println( "Exception of type :" + e.getClass().getName() + " has been thrown"); System.out.println("Exception message :" + e.getMessage()); e.printStackTrace(); System.exit(1); } System.out.println("before transaction, table is:"); printTable(); try { System.out.println("begin a transaction"); utx.begin(); System.out.println("update the table"); updateTable(value); if (completion.equals("commit")) { System.out.println("*commit* the transaction"); utx.commit(); } else { System.out.println("*rollback* the transaction"); utx.rollback(); } } catch (Exception e) { System.out.println( "Exception of type :" + e.getClass().getName() + " has been thrown"); System.out.println("Exception message :" + e.getMessage()); e.printStackTrace(); System.exit(1); } System.out.println("after transaction, table is:"); printTable(); System.out.println("Recovery Example is ok.\n"); System.exit(0); } } xapool-1.5.0-src/examples/distributeddatasource/README.txt0000644000175000017500000000413610235646675023475 0ustar twernertwerner# # # Test that JNDI mechanism works correctly when binding/looking up (XA)DataSource # # Scenario: --------- Setup: ------ o A database: - MySQL - PostgreSQL Database Setup: --------------- The example expects: o a database named javatest o a user of login "mojo" and password "jojo" o a table named testdata which is like +----+-------+ | ID | FOO | +----+-------+ | 1 | 1 | +----+-------+ o id being an int (primary key) o foo being an int For example on MySQL: mysql> GRANT ALL PRIVILEGES ON *.* TO mojo -> IDENTIFIED BY 'jojo' WITH GRANT OPTION; mysql> create database javatest; mysql> use javatest; mysql> create table testdata ( -> id int not null auto_increment primary key, -> foo int)type=bdb; mysql> insert into testdata values(null, 1); Database configuration are stored in properties file (spy.properties) which contains the following properties: o realdriver - Name of the JDBC driver o url - URL to connect to the data base Compilation: ------------ Go to output/dist/examples/distributeddatasource Type $ ant compile to compile the example Run the example: ---------------- o To run the example, first check that only RMI protocol will be activated (in the ../../config/carol.properties, carol.rmi.activated should be set to jrmp); then type in the lib/ directory: $ rmiregistry -J-classpath -Jjotm.jar:jotm_jrmp_stubs.jar:xapool.jar -J-Djava.security.policy=../config/java.policy & to start a RMI registry on default port (i.e. 1099). o Set the classpath $ export CLASSPATH=../../lib/jotm.jar:../../lib/jotm_jrmp_stubs.jar:../../config:.:../../lib/xapool.jar:../../lib/p6spy.jar:..:$JDBC_JARS where JDBC_JARS is the location of the JDBC driver jar file(s) you want to use. o Modify ../../config/spy.properties to setup your jdbc properties o Start the example * start the Database layer $ java DataBaseLayer * start the application $ java DistributedDataSourceExample commit 4 Usage: ------ $ java DistributedDataSourceExample [completion] [value] where o completion is either commit or rollback o value is an integer value Enjoy! xapool-1.5.0-src/examples/distributeddatasource/build.xml0000644000175000017500000000147610235646675023624 0ustar twernertwerner Recovery Example xapool-1.5.0-src/examples/falserollback/0000755000175000017500000000000010235646675020202 5ustar twernertwernerxapool-1.5.0-src/examples/falserollback/FalseRollback.java0000644000175000017500000001337010235646675023555 0ustar twernertwerner import org.enhydra.jdbc.pool.StandardXAPoolDataSource; import org.enhydra.jdbc.standard.StandardXADataSource; import org.objectweb.jotm.Jotm; import org.objectweb.transaction.jta.TMService; import javax.naming.InitialContext; import java.util.Properties; import java.sql.ResultSet; import java.sql.PreparedStatement; import java.sql.Connection; /** * this test is used to show the following process:
*
 *    c = ds.getConnection();
 *    c.setAutocommit(true);
 *    ...
 *    c.close();
 *    c = ds.getConnection();
 *    c.setAutoCommit(false);
 *    ...
 *    c.close();
 * 
*/ public class FalseRollback { private String SQL_REQUEST = "select id, foo from testdata"; private String SQL_QUERY = "update testdata set foo = ? where id=1"; private String USAGE = "usage: java FalseRollback [number]"; private Connection conn; private TMService jotm; private String login = null; private String password = null; private String url = null; private String driver = null; private String USER_TRANSACTION_JNDI_NAME = "UserTransaction"; private PreparedStatement STMT = null; public FalseRollback(String [] args) throws Exception { if (args.length != 1) { System.out.println(USAGE); System.exit(1); } // first, load the properties from the spy.properties file Properties prop = new Properties(); try { prop.load(ClassLoader.getSystemResourceAsStream("spy.properties")); } catch (Exception e) { System.err.println("problem to load properties."); e.printStackTrace(); System.exit(1); } login = prop.getProperty("login"); password = prop.getProperty("password"); url = prop.getProperty("url"); driver = prop.getProperty("driver"); // get the new value which will be assign to the database int newValue = 0; try { newValue = Integer.parseInt(args[0]); } catch (NumberFormatException e) { System.err.println(USAGE); System.err.println("[number] has to be an integer\n"); System.exit(1); } // Get a transaction manager try { // creates an instance of JOTM with a local transaction factory which is not bound to a registry jotm = new Jotm(true, false); InitialContext ictx = new InitialContext(); ictx.rebind(USER_TRANSACTION_JNDI_NAME, jotm.getUserTransaction()); } catch (Exception e) { System.err.println("JOTM problem."); e.printStackTrace(); System.exit(1); } // create an XA pool datasource with a minimum of 4 objects StandardXAPoolDataSource spds = new StandardXAPoolDataSource(4); spds.setMaxSize(15); spds.setMinSize(13); spds.setUser(login); spds.setPassword(password); // create an XA datasource which will be given to the XA pool StandardXADataSource xads = new StandardXADataSource(); try { xads.setDriverName(driver); xads.setUrl(url); xads.setUser(login); xads.setPassword(password); xads.setTransactionManager(jotm.getTransactionManager()); } catch (Exception e) { e.printStackTrace(); System.exit(1); } // give the XA datasource to the pool (to create futur objects) spds.setDataSource(xads); try { conn = spds.getConnection(login, password); conn.setAutoCommit(true); PreparedStatement pstmt = conn.prepareStatement(SQL_QUERY); pstmt.setInt(1, newValue); pstmt.executeUpdate(); System.out.println("dump, after the first update:"); printTable(); pstmt.close(); conn.close(); conn = spds.getConnection(login, password); conn.setAutoCommit(false); PreparedStatement pstmt2 = conn.prepareStatement(SQL_QUERY); pstmt2.setInt(1, newValue+2); pstmt2.executeUpdate(); System.out.println("dump, after the second update:"); printTable(); pstmt2.close(); conn.close(); } catch (Exception e) { System.err.println("Exception of type :" + e.getClass().getName() + " has been thrown"); System.err.println("Exception message :" + e.getMessage()); e.printStackTrace(); System.exit(1); } System.out.println("dump, after work:"); conn = spds.getConnection(login, password); printTable(); conn.close(); stop(); } public void printTable() { try { STMT = conn.prepareStatement(SQL_REQUEST); ResultSet rset = STMT.executeQuery(SQL_REQUEST); int numcols = rset.getMetaData().getColumnCount(); for (int i = 1; i <= numcols; i++) { System.out.print("\t" + rset.getMetaData().getColumnName(i)); } System.out.println(); while (rset.next()) { for (int i = 1; i <= numcols; i++) { System.out.print("\t" + rset.getString(i)); } System.out.println(""); } } catch (Exception e) { e.printStackTrace(); } } public void stop() { try { InitialContext ictx = new InitialContext(); ictx.unbind(USER_TRANSACTION_JNDI_NAME); } catch (Exception e) { e.printStackTrace(); } jotm.stop(); jotm = null; } static public void main(String [] argv) throws Exception{ FalseRollback spdse = new FalseRollback(argv); System.exit(1); } } xapool-1.5.0-src/examples/falserollback/README.txt0000644000175000017500000000410410235646675021677 0ustar twernertwerner# # # Verify that setAutoCommit(false) on a connection rollback # the connection when connection is closed # # Scenario: --------- Setup: ------ o A database: - MySQL - PostgreSQL Database Setup: --------------- The example expects: o a database named javatest o a user of login "mojo" and password "jojo" o a table named testdata which is like +----+-------+ | ID | FOO | +----+-------+ | 1 | 1 | +----+-------+ o id being an int (primary key) o foo being an int For example on MySQL: mysql> GRANT ALL PRIVILEGES ON *.* TO mojo -> IDENTIFIED BY 'jojo' WITH GRANT OPTION; mysql> create database javatest; mysql> use javatest; mysql> create table testdata ( -> id int not null auto_increment primary key, -> foo int)type=bdb; mysql> insert into testdata values(null, 1); Database configuration are stored in properties file (spy.properties) which contains the following properties: o realdriver - Name of the JDBC driver o url - URL to connect to the data base Compilation: ------------ Go to output/dist/examples/falserollback Type $ ant compile to compile the example Run the example: ---------------- o To run the example, first check that only RMI protocol will be activated (in the ../../config/carol.properties, carol.rmi.activated should be set to jrmp); then type $ rmiregistry -J-classpath -Jjotm.jar:jotm_jrmp_stubs.jar -J-Djava.security.policy=../config/java.policy & to start a RMI registry on default port (i.e. 1099). o Set the classpath $ export CLASSPATH=../../lib/ow_util_log_wrp_log4j.jar:../../lib/jta-spec1_0_1.jar:../../lib/jotm.jar:../../lib/jotm_jrmp_stubs.jar:../../config:.:../../lib/xapool.jar:.:../../lib/commons-logging.jar:../../lib/commons-logging-api.jar:../../lib/p6spy.jar:../../lib/connector-1_5.jar:../../lib/howl.jar:$JDBC_JARS where JDBC_JARS is the location of the JDBC driver jar file(s) you want to use. o Modify ../../config/spy.properties to setup your jdbc properties o Start the example $ java FalseRollback 4 Usage: ------ $ java FalseRollback [value] where o value is an integer value Enjoy! xapool-1.5.0-src/examples/falserollback/build.xml0000644000175000017500000000154310235646675022026 0ustar twernertwerner xapool-1.5.0-src/examples/genericpool/0000755000175000017500000000000010235646675017704 5ustar twernertwernerxapool-1.5.0-src/examples/genericpool/Car.java0000644000175000017500000000060210235646675021252 0ustar twernertwerner public class Car { String brand = null; String color = null; public Car() { } public void setBrand(String abrand) { this.brand = abrand; } public void setColor(String acolor) { this.color = acolor; } public String getBrand() { return this.brand; } public String getColor() { return this.color; } } xapool-1.5.0-src/examples/genericpool/README.txt0000644000175000017500000000136210235646675021404 0ustar twernertwerner# # # GenericPool example # # Scenario: --------- genericpool is a simple example to use the generic pool. The generic pool can pool various objects and in the example, 'cars' are pooled !!! Sources files: -------------- - SimpleGenericPool.java: a simple example how to use GenericPool.java - SimplePoolKeeper.java: is an object to create, test and destroy pooled objects - Car.java: is object to pool How to compile: --------------- Go to ouput/dist/examples/genericpool o Type $ ant compile to compile the example Run the example: ---------------- o Set the classpath $ export CLASSPATH=../../lib/xapool.jar:.:../../lib/commons-logging.jar:../../lib/commons-logging-api.jar o Start the example: $ java SimpleGenericPool Enjoy! xapool-1.5.0-src/examples/genericpool/SimpleGenericPool.java0000644000175000017500000000212010235646675024122 0ustar twernertwerner import org.enhydra.jdbc.pool.GenericPool; import org.enhydra.jdbc.util.Logger; import org.apache.commons.logging.LogFactory; public class SimpleGenericPool { static public void main(String[] argv) throws Exception{ GenericPool genPool = new GenericPool(new SimplePoolHelper(), 4); genPool.setLogger(new Logger(LogFactory.getLog("simplepool"))); System.out.println("set the max size of the pool"); genPool.setMaxSize(10); System.out.println("set the min size of the pool"); genPool.setMinSize(2); System.out.println("start the pool"); genPool.start(); System.out.println("get a car from the pool"); Car aCar = (Car)(genPool.checkOut(null, null)); aCar.setBrand("Mercedes"); aCar.setColor("black"); System.out.println("get another car from the pool"); Car anotherCar = (Car)(genPool.checkOut(null, null)); anotherCar.setBrand("Porsche"); anotherCar.setColor("red"); System.out.println("stop the pool"); genPool.stop(); System.exit(1); } } xapool-1.5.0-src/examples/genericpool/SimplePoolHelper.java0000644000175000017500000000152510235646675023775 0ustar twernertwerner import org.enhydra.jdbc.pool.PoolHelper; import org.enhydra.jdbc.pool.GenerationObject; import java.sql.SQLException; public class SimplePoolHelper implements PoolHelper { public void expire(Object o) { ((Car)o).setBrand(null); ((Car)o).setColor(null); o = null; } public boolean checkThisObject(Object o) { return o != null; } public boolean testThisObject(Object o) { return (o != null) & (((Car)o).getColor() != null) & (((Car)o).getBrand() != null); } public GenerationObject create() throws SQLException { return new GenerationObject(new Car(), 0, null, null); } public GenerationObject create(String _user, String _password) throws SQLException { return new GenerationObject(new Car(), 0, _user, _password); } } xapool-1.5.0-src/examples/genericpool/build.xml0000644000175000017500000000152610235646675021531 0ustar twernertwerner xapool-1.5.0-src/examples/jotmxapooltest/0000755000175000017500000000000010235646675020472 5ustar twernertwernerxapool-1.5.0-src/examples/jotmxapooltest/config/0000755000175000017500000000000010235646675021737 5ustar twernertwernerxapool-1.5.0-src/examples/jotmxapooltest/lib/0000755000175000017500000000000010235646675021240 5ustar twernertwernerxapool-1.5.0-src/examples/jotmxapooltest/src/0000755000175000017500000000000010235646675021261 5ustar twernertwernerxapool-1.5.0-src/examples/multipleconnection/0000755000175000017500000000000010235646675021311 5ustar twernertwernerxapool-1.5.0-src/examples/multipleconnection/MultipleConnection.java0000644000175000017500000001565410235646675026002 0ustar twernertwerner import org.enhydra.jdbc.pool.StandardXAPoolDataSource; import org.enhydra.jdbc.standard.StandardXADataSource; import org.objectweb.jotm.Jotm; import org.objectweb.transaction.jta.TMService; import javax.naming.InitialContext; import javax.naming.Context; import javax.transaction.UserTransaction; import java.util.Properties; import java.sql.ResultSet; import java.sql.PreparedStatement; import java.sql.Connection; /** * this test is used to show the following process:
*
 *    utx.begin();
 *    c = ds.getConnection();
 *    ...
 *    c.close();
 *    c = ds.getConnection();
 *    ...
 *    c.close();
 *    utx.commit() or utx.rollback();
 * 
* This process should work in all cases. */ public class MultipleConnection { private String SQL_REQUEST = "select id, foo from testdata"; private String SQL_QUERY = "update testdata set foo = ? where id=1"; private String USAGE = "usage: java MultipleConnection [commit|rollback] [number]"; private Connection conn; private TMService jotm; private String login = null; private String password = null; private String url = null; private String driver = null; private String USER_TRANSACTION_JNDI_NAME = "UserTransaction"; private PreparedStatement STMT = null; public MultipleConnection(String [] args) throws Exception { if (args.length != 2) { System.out.println(USAGE); System.exit(1); } // first, load the properties from the spy.properties file Properties prop = new Properties(); try { prop.load(ClassLoader.getSystemResourceAsStream("spy.properties")); } catch (Exception e) { System.err.println("problem to load properties."); e.printStackTrace(); System.exit(1); } login = prop.getProperty("login"); password = prop.getProperty("password"); url = prop.getProperty("url"); driver = prop.getProperty("driver"); // completion is either "commit", either "rollback" String completion = args[0]; // get the new value which will be assign to the database int newValue = 0; try { newValue = Integer.parseInt(args[1]); } catch (NumberFormatException e) { System.err.println(USAGE); System.err.println("[number] has to be an integer\n"); System.exit(1); } // Get a transaction manager try { // creates an instance of JOTM with a local transaction factory which is not bound to a registry jotm = new Jotm(true, false); InitialContext ictx = new InitialContext(); ictx.rebind(USER_TRANSACTION_JNDI_NAME, jotm.getUserTransaction()); } catch (Exception e) { System.err.println("JOTM problem."); e.printStackTrace(); System.exit(1); } // get an user transaction UserTransaction utx = null; try { System.out.println("create initial context"); Context ictx = new InitialContext(); System.out.println("lookup UserTransaction at : " + USER_TRANSACTION_JNDI_NAME); utx = (UserTransaction) ictx.lookup(USER_TRANSACTION_JNDI_NAME); } catch (Exception e) { System.err.println("Exception of type :" + e.getClass().getName() + " has been thrown"); System.err.println("Exception message :" + e.getMessage()); e.printStackTrace(); System.exit(1); } // create an XA pool datasource with a minimum of 4 objects StandardXAPoolDataSource spds = new StandardXAPoolDataSource(4); spds.setMaxSize(15); spds.setMinSize(13); spds.setUser(login); spds.setPassword(password); // create an XA datasource which will be given to the XA pool StandardXADataSource xads = new StandardXADataSource(); try { xads.setDriverName(driver); xads.setUrl(url); xads.setUser(login); xads.setPassword(password); } catch (Exception e) { e.printStackTrace(); System.exit(1); } // give the XA datasource to the pool (to create futur objects) spds.setTransactionManager(jotm.getTransactionManager()); spds.setDataSource(xads); try { System.out.println("** begin a transaction **"); utx.begin(); conn = spds.getConnection(login, password); PreparedStatement pstmt = conn.prepareStatement(SQL_QUERY); pstmt.setInt(1, newValue); pstmt.executeUpdate(); System.out.println("dump, after the first update:"); printTable(); pstmt.close(); conn.close(); conn = spds.getConnection(login, password); PreparedStatement pstmt2 = conn.prepareStatement(SQL_QUERY); pstmt2.setInt(1, newValue+2); pstmt2.executeUpdate(); System.out.println("dump, after the second update:"); printTable(); pstmt2.close(); conn.close(); if (completion.equals("commit")) { System.out.println("** commit ** the transaction"); utx.commit(); } else { System.out.println("** rollback ** the transaction"); utx.rollback(); } } catch (Exception e) { System.err.println("Exception of type :" + e.getClass().getName() + " has been thrown"); System.err.println("Exception message :" + e.getMessage()); e.printStackTrace(); System.exit(1); } System.out.println("dump, after work:"); conn = spds.getConnection(login, password); printTable(); conn.close(); stop(); } public void printTable() { try { STMT = conn.prepareStatement(SQL_REQUEST); ResultSet rset = STMT.executeQuery(SQL_REQUEST); int numcols = rset.getMetaData().getColumnCount(); for (int i = 1; i <= numcols; i++) { System.out.print("\t" + rset.getMetaData().getColumnName(i)); } System.out.println(); while (rset.next()) { for (int i = 1; i <= numcols; i++) { System.out.print("\t" + rset.getString(i)); } System.out.println(""); } STMT.close(); } catch (Exception e) { e.printStackTrace(); } } public void stop() { try { InitialContext ictx = new InitialContext(); ictx.unbind(USER_TRANSACTION_JNDI_NAME); } catch (Exception e) { e.printStackTrace(); } jotm.stop(); jotm = null; } static public void main(String [] argv) throws Exception{ MultipleConnection spdse = new MultipleConnection(argv); System.exit(1); } } xapool-1.5.0-src/examples/multipleconnection/README.txt0000644000175000017500000000412610235646675023012 0ustar twernertwerner# # # MultipleConnection example # # Scenario: --------- Setup: ------ o A database: - MySQL - PostgreSQL Database Setup: --------------- The example expects: o a database named javatest o a user of login "mojo" and password "jojo" o a table named testdata which is like +----+-------+ | ID | FOO | +----+-------+ | 1 | 1 | +----+-------+ o id being an int (primary key) o foo being an int For example on MySQL: mysql> GRANT ALL PRIVILEGES ON *.* TO mojo -> IDENTIFIED BY 'jojo' WITH GRANT OPTION; mysql> create database javatest; mysql> use javatest; mysql> create table testdata ( -> id int not null auto_increment primary key, -> foo int)type=bdb; mysql> insert into testdata values(null, 1); Database configuration are stored in properties file (spy.properties) which contains the following properties: o realdriver - Name of the JDBC driver o url - URL to connect to the data base Compilation: ------------ Go to output/dist/examples/multipleconnection Type $ ant compile to compile the example Run the example: ---------------- o To run the example, first check that only RMI protocol will be activated (in the ../../config/carol.properties, carol.rmi.activated should be set to jrmp); then type $ rmiregistry -J-classpath -Jjotm.jar:jotm_jrmp_stubs.jar -J-Djava.security.policy=../config/java.policy & to start a RMI registry on default port (i.e. 1099). o Set the classpath $ export CLASSPATH=../../lib/ow_util_log_wrp_log4j.jar:../../lib/jta-spec1_0_1.jar:../../lib/jotm.jar:../../lib/jotm_jrmp_stubs.jar:../../config:.:../../lib/xapool.jar:.:../../lib/commons-logging.jar:../../lib/commons-logging-api.jar:../../lib/p6spy.jar:../../lib/connector-1_5.jar:../../lib/howl.jar:$JDBC_JARS where JDBC_JARS is the location of the JDBC driver jar file(s) you want to use. o Modify ../../config/spy.properties to setup your jdbc properties o Start the example $ java MultipleConnection commit 4 Usage: ------ $ java MultipleConnection [completion] [value] where o completion can be: - commit - rollback o value is an integer value Enjoy! xapool-1.5.0-src/examples/multipleconnection/build.xml0000644000175000017500000000154610235646675023140 0ustar twernertwerner xapool-1.5.0-src/examples/multipletransaction/0000755000175000017500000000000010235646675021477 5ustar twernertwernerxapool-1.5.0-src/examples/multipletransaction/MultipleTransaction.java0000644000175000017500000001510710235646675026347 0ustar twernertwerner import org.enhydra.jdbc.pool.StandardXAPoolDataSource; import org.enhydra.jdbc.standard.StandardXADataSource; import org.objectweb.jotm.Jotm; import org.objectweb.transaction.jta.TMService; import javax.naming.InitialContext; import javax.naming.Context; import javax.transaction.UserTransaction; import java.util.Properties; import java.sql.ResultSet; import java.sql.PreparedStatement; import java.sql.Connection; /** * this test is used to show the following process:
*
 *    c = ds.getConnection();
 *    utx.begin();
 *    ...
 *    utx.commit();
 *    utx.begin();
 *    ...
 *    utx.rollback();
 *    utx.close();
 * 
*/ public class MultipleTransaction { private String SQL_REQUEST = "select id, foo from testdata"; private String SQL_QUERY = "update testdata set foo = ? where id=1"; private String USAGE = "usage: java MultipleTransaction [number]"; private Connection conn; private TMService jotm; private String login = null; private String password = null; private String url = null; private String driver = null; private String USER_TRANSACTION_JNDI_NAME = "UserTransaction"; public MultipleTransaction(String [] args) throws Exception { if (args.length != 1) { System.out.println(USAGE); System.exit(1); } // first, load the properties from the spy.properties file Properties prop = new Properties(); try { prop.load(ClassLoader.getSystemResourceAsStream("spy.properties")); } catch (Exception e) { System.err.println("problem to load properties."); e.printStackTrace(); System.exit(1); } login = prop.getProperty("login"); password = prop.getProperty("password"); url = prop.getProperty("url"); driver = prop.getProperty("driver"); // get the new value which will be assign to the database int newValue = 0; try { newValue = Integer.parseInt(args[0]); } catch (NumberFormatException e) { System.err.println(USAGE); System.err.println("[number] has to be an integer\n"); System.exit(1); } // Get a transaction manager try { // creates an instance of JOTM with a local transaction factory which is not bound to a registry jotm = new Jotm(true, false); InitialContext ictx = new InitialContext(); ictx.rebind(USER_TRANSACTION_JNDI_NAME, jotm.getUserTransaction()); } catch (Exception e) { e.printStackTrace(); System.exit(1); } // get an user transaction UserTransaction utx = null; try { System.out.println("create initial context"); Context ictx = new InitialContext(); System.out.println("lookup UserTransaction at : " + USER_TRANSACTION_JNDI_NAME); utx = (UserTransaction) ictx.lookup(USER_TRANSACTION_JNDI_NAME); } catch (Exception e) { System.err.println("Exception of type :" + e.getClass().getName() + " has been thrown"); System.err.println("Exception message :" + e.getMessage()); e.printStackTrace(); System.exit(1); } // create an XA pool datasource with a minimum of 4 objects StandardXAPoolDataSource spds = new StandardXAPoolDataSource(4); spds.setUser(login); spds.setPassword(password); // create an XA datasource which will be given to the XA pool StandardXADataSource xads = new StandardXADataSource(); try { xads.setDriverName(driver); xads.setUrl(url); xads.setUser(login); xads.setPassword(password); xads.setTransactionManager(jotm.getTransactionManager()); } catch (Exception e) { System.err.println("JOTM problem."); e.printStackTrace(); System.exit(1); } // give the XA datasource to the pool (to create futur objects) spds.setTransactionManager(jotm.getTransactionManager()); spds.setDataSource(xads); conn = spds.getConnection(login, password); try { utx.begin(); PreparedStatement pstmt0 = conn.prepareStatement(SQL_QUERY); pstmt0.setInt(1, 13); pstmt0.executeUpdate(); System.out.println("dump, with 13 before commit:"); printTable(); System.out.println("** commit **"); utx.commit(); System.out.println("dump, with 13 after commit:"); printTable(); utx.begin(); PreparedStatement pstmt = conn.prepareStatement(SQL_QUERY); pstmt.setInt(1, newValue); pstmt.executeUpdate(); System.out.println("dump, with the new value("+newValue+") before rollback:"); printTable(); System.out.println("** rollback **"); utx.rollback(); System.out.println("dump, with the new value("+newValue+") after rollback:"); printTable(); } catch (Exception e) { System.err.println("Exception of type :" + e.getClass().getName() + " has been thrown"); System.err.println("Exception message :" + e.getMessage()); e.printStackTrace(); System.exit(1); } System.out.println("Print table after work:"); printTable(); conn.close(); stop(); } public void printTable() { try { PreparedStatement stmt = conn.prepareStatement(SQL_REQUEST); ResultSet rset = stmt.executeQuery(SQL_REQUEST); int numcols = rset.getMetaData().getColumnCount(); for (int i = 1; i <= numcols; i++) { System.out.print("\t" + rset.getMetaData().getColumnName(i)); } System.out.println(); while (rset.next()) { for (int i = 1; i <= numcols; i++) { System.out.print("\t" + rset.getString(i)); } System.out.println(""); } } catch (Exception e) { e.printStackTrace(); } } public void stop() { try { InitialContext ictx = new InitialContext(); ictx.unbind(USER_TRANSACTION_JNDI_NAME); } catch (Exception e) { e.printStackTrace(); } jotm.stop(); jotm = null; } static public void main(String [] argv) throws Exception{ MultipleTransaction spdse = new MultipleTransaction(argv); System.exit(1); } } xapool-1.5.0-src/examples/multipletransaction/README.txt0000644000175000017500000000377710235646675023213 0ustar twernertwerner# # # MultipleTransaction example # # Scenario: --------- Setup: ------ o A database: - MySQL - PostgreSQL Database Setup: --------------- The example expects: o a database named javatest o a user of login "mojo" and password "jojo" o a table named testdata which is like +----+-------+ | ID | FOO | +----+-------+ | 1 | 1 | +----+-------+ o id being an int (primary key) o foo being an int For example on MySQL: mysql> GRANT ALL PRIVILEGES ON *.* TO mojo -> IDENTIFIED BY 'jojo' WITH GRANT OPTION; mysql> create database javatest; mysql> use javatest; mysql> create table testdata ( -> id int not null auto_increment primary key, -> foo int)type=bdb; mysql> insert into testdata values(null, 1); Database configuration are stored in properties file (mysql.properties) which contains the following properties: o realdriver - Name of the JDBC driver o url - URL to connect to the data base Compilation: ------------ Go to output/dist/examples/multipletransaction Type $ ant compile to compile the example Run the example: ---------------- o To run the example, first check that only RMI protocol will be activated (in the ../../config/carol.properties, carol.rmi.activated should be set to jrmp); then type $ rmiregistry -J-classpath -Jjotm.jar:jotm_jrmp_stubs.jar -J-Djava.security.policy=../config/java.policy & to start a RMI registry on default port (i.e. 1099). o Set the classpath $ export CLASSPATH=../../lib/log4j.jar:../../lib/jta-spec1_0_1.jar:../../lib/jotm.jar:../../lib/jotm_jrmp_stubs.jar:../../config:.:../../lib/xapool.jar:.:../../lib/commons-logging-api.jar:../../lib/commons-logging.jar:../../lib/p6spy.jar:../../lib/connector-1_5.jar:../../lib/howl.jar:$JDBC_JARS where JDBC_JARS is the location of the JDBC driver jar file(s) you want to use. o Modify ../../config/spy.properties to setup your jdbc properties o Start the example $ java MultipleTransaction 4 Usage: ------ $ java MultipleTransaction [value] where o value is an integer value Enjoy! xapool-1.5.0-src/examples/multipletransaction/build.xml0000644000175000017500000000155010235646675023321 0ustar twernertwerner xapool-1.5.0-src/examples/multithreaded/0000755000175000017500000000000010235646675020231 5ustar twernertwernerxapool-1.5.0-src/examples/pooldatasource/0000755000175000017500000000000010235646675020422 5ustar twernertwernerxapool-1.5.0-src/examples/pooldatasource/README.txt0000644000175000017500000000311010235646675022113 0ustar twernertwerner# # # StandardPoolDataSource example # # Scenario: --------- Setup: ------ o A database: - MySQL - PostgreSQL Database Setup: --------------- The example expects: o a database named javatest o a user of login "mojo" and password "jojo" o a table named testdata which is like +----+-------+ | ID | FOO | +----+-------+ | 1 | 1 | +----+-------+ o id being an int (primary key) o foo being an int For example on MySQL: mysql> GRANT ALL PRIVILEGES ON *.* TO mojo -> IDENTIFIED BY 'jojo' WITH GRANT OPTION; mysql> create database javatest; mysql> use javatest; mysql> create table testdata ( -> id int not null auto_increment primary key, -> foo int)type=bdb; mysql> insert into testdata values(null, 1); Database configuration are stored in properties file (mysql.properties) which contains the following properties: o realdriver - Name of the JDBC driver o url - URL to connect to the data base Compilation: ------------ Go to output/dist/examples/pooldatasource Type $ ant compile to compile the example Run the example: ---------------- o Set the classpath $ export CLASSPATH=../../lib/xapool.jar:../../config:.:../../lib/log4j.jar:../../lib/commons-logging.jar:../../lib/commons-logging-api.jar:../../lib/p6spy.jar:../../lib/connector-1_5.jar:../../lib/howl.jar:$JDBC_JARS where JDBC_JARS is the location of the JDBC driver jar file(s) you want to use. o Modify ../../config/spy.properties to setup your jdbc properties o Start the example $ java StandardPoolDataSourceExample Usage: ------ $ java StandardPoolDataSourceExample Enjoy! xapool-1.5.0-src/examples/pooldatasource/StandardPoolDataSourceExample.java0000644000175000017500000000553110235646675027152 0ustar twernertwerner import org.enhydra.jdbc.pool.StandardPoolDataSource; import org.enhydra.jdbc.standard.StandardConnectionPoolDataSource; import java.util.Properties; import java.sql.ResultSet; import java.sql.PreparedStatement; import java.sql.Connection; public class StandardPoolDataSourceExample { private static final String SQL_REQUEST = "select id, foo from testdata"; private static final String SQL_QUERY = "update testdata set foo = ? where id=1"; Connection conn; String login = null; String password = null; String url = null; String driver = null; public StandardPoolDataSourceExample() throws Exception { Properties prop = new Properties(); try { prop.load(ClassLoader.getSystemResourceAsStream("spy.properties")); } catch (Exception e) { System.err.println("problem to load properties."); e.printStackTrace(); System.exit(1); } login = prop.getProperty("login"); password = prop.getProperty("password"); url = prop.getProperty("url"); driver = prop.getProperty("driver"); StandardConnectionPoolDataSource connect = new StandardConnectionPoolDataSource(); connect.setUrl(url); connect.setDriverName(driver); connect.setUser(login); connect.setPassword(password); // second, we create the pool of connection with the previous object StandardPoolDataSource spds = new StandardPoolDataSource(connect); spds.setMaxSize(5); spds.setMinSize(2); spds.setUser(login); spds.setPassword(password); conn = spds.getConnection(login, password); printTable(); conn.close(); } public void printTable() { try { PreparedStatement pstmt = conn.prepareStatement(SQL_REQUEST); ResultSet rset = pstmt.executeQuery(); int numcols = rset.getMetaData().getColumnCount(); for (int i = 1; i <= numcols; i++) { System.out.print("\t" + rset.getMetaData().getColumnName(i)); } System.out.println(); while (rset.next()) { for (int i = 1; i <= numcols; i++) { System.out.print("\t" + rset.getString(i)); } System.out.println(""); } } catch (Exception e) { e.printStackTrace(); } } public void updateTable(int newValue) { try { PreparedStatement pstmt = conn.prepareStatement(SQL_QUERY); pstmt.setInt(1, newValue); pstmt.executeUpdate(); } catch (Exception e) { e.printStackTrace(); } } static public void main(String [] argv) throws Exception{ StandardPoolDataSourceExample spdse = new StandardPoolDataSourceExample(); System.exit(1); } } xapool-1.5.0-src/examples/pooldatasource/build.xml0000644000175000017500000000133710235646675022247 0ustar twernertwerner xapool-1.5.0-src/examples/pooldatasource/mysql.properties0000644000175000017500000000016110235646675023703 0ustar twernertwernerdriver org.gjt.mm.mysql.Driver url jdbc:mysql://localhost/javatest login mojo password jojoxapool-1.5.0-src/examples/pooldatasource/postgresql.properties0000644000175000017500000000017710235646675024750 0ustar twernertwernerdriver org.postgresql.Driver url jdbc:postgresql://localhost/javatest login mojo password jojo xapool-1.5.0-src/examples/saveautocommit/0000755000175000017500000000000010235646675020436 5ustar twernertwernerxapool-1.5.0-src/examples/saveautocommit/README.txt0000644000175000017500000000417010235646675022136 0ustar twernertwerner# # # AutoCommit value must be saved before utx.begin and restored # after utx.commit or rollback # # Scenario: --------- Setup: ------ o A database: - MySQL - PostgreSQL Database Setup: --------------- The example expects: o a database named javatest o a user of login "mojo" and password "jojo" o a table named testdata which is like +----+-------+ | ID | FOO | +----+-------+ | 1 | 1 | +----+-------+ o id being an int (primary key) o foo being an int For example on MySQL: mysql> GRANT ALL PRIVILEGES ON *.* TO mojo -> IDENTIFIED BY 'jojo' WITH GRANT OPTION; mysql> create database javatest; mysql> use javatest; mysql> create table testdata ( -> id int not null auto_increment primary key, -> foo int)type=bdb; mysql> insert into testdata values(null, 1); Database configuration are stored in properties file (spy.properties) which contains the following properties: o realdriver - Name of the JDBC driver o url - URL to connect to the data base Compilation: ------------ Go to output/dist/examples/saveautocommit Type $ ant compile to compile the example Run the example: ---------------- o To run the example, first check that only RMI protocol will be activated (in the ../../config/carol.properties, carol.rmi.activated should be set to jrmp); then type $ rmiregistry -J-classpath -Jjotm.jar:jotm_jrmp_stubs.jar -J-Djava.security.policy=../config/java.policy & to start a RMI registry on default port (i.e. 1099). o Set the classpath $ export CLASSPATH=../../lib/ow_util_log_wrp_log4j.jar:../../lib/jta-spec1_0_1.jar:../../lib/jotm.jar:../../lib/jotm_jrmp_stubs.jar:../../config:.:../../lib/xapool.jar:.:../../lib/commons-logging.jar:../../lib/commons-logging-api.jar:../../lib/p6spy.jar:../../lib/connector-1_5.jar:../../lib/howl.jar:$JDBC_JARS where JDBC_JARS is the location of the JDBC driver jar file(s) you want to use. o Modify ../../config/spy.properties to setup your jdbc properties o Start the example $ java SaveAutoCommit 4 true Usage: ------ $ java SaveAutoCommit [value] [autocommit] where o value is an integer value o autocommit is a boolean, true or false Enjoy! xapool-1.5.0-src/examples/saveautocommit/SaveAutoCommit.java0000644000175000017500000001414710235646675024210 0ustar twernertwerner import org.enhydra.jdbc.pool.StandardXAPoolDataSource; import org.enhydra.jdbc.standard.StandardXADataSource; import org.objectweb.jotm.Jotm; import org.objectweb.transaction.jta.TMService; import javax.naming.InitialContext; import javax.naming.Context; import javax.transaction.UserTransaction; import java.util.Properties; import java.sql.ResultSet; import java.sql.PreparedStatement; import java.sql.Connection; /** * this test is used to show the following process:
*
 *    c = ds.getConnection();
 *    c.setAutoCommit(autocommit);
 *    utx.begin();
 *    ...
 *    utx.commit();
 *    autocommit2 = c.getAutoCommit();
 *    // autocommit == autocommit2
 *    c.close();
 * 
*/ public class SaveAutoCommit { private String SQL_REQUEST = "select id, foo from testdata"; private String SQL_QUERY = "update testdata set foo = ? where id=1"; private String USAGE = "usage: java SaveAutoCommit [number] [autocommit]"; private Connection conn; private TMService jotm; private String login = null; private String password = null; private String url = null; private String driver = null; private String USER_TRANSACTION_JNDI_NAME = "UserTransaction"; private PreparedStatement STMT = null; public SaveAutoCommit(String [] args) throws Exception { if (args.length != 2) { System.out.println(USAGE); System.exit(1); } // first, load the properties from the spy.properties file Properties prop = new Properties(); try { prop.load(ClassLoader.getSystemResourceAsStream("spy.properties")); } catch (Exception e) { System.err.println("problem to load properties."); e.printStackTrace(); System.exit(1); } login = prop.getProperty("login"); password = prop.getProperty("password"); url = prop.getProperty("url"); driver = prop.getProperty("driver"); // get the new value which will be assign to the database int newValue = 0; try { newValue = Integer.parseInt(args[0]); } catch (NumberFormatException e) { System.err.println(USAGE); System.err.println("[number] has to be an integer\n"); System.exit(1); } // Get a transaction manager try { // creates an instance of JOTM with a local transaction factory which is not bound to a registry jotm = new Jotm(true, false); InitialContext ictx = new InitialContext(); ictx.rebind(USER_TRANSACTION_JNDI_NAME, jotm.getUserTransaction()); } catch (Exception e) { System.err.println("JOTM problem"); e.printStackTrace(); System.exit(1); } // get an user transaction UserTransaction utx = null; try { System.out.println("create initial context"); Context ictx = new InitialContext(); System.out.println("lookup UserTransaction at : " + USER_TRANSACTION_JNDI_NAME); utx = (UserTransaction) ictx.lookup(USER_TRANSACTION_JNDI_NAME); } catch (Exception e) { System.err.println("Exception of type :" + e.getClass().getName() + " has been thrown"); System.err.println("Exception message :" + e.getMessage()); e.printStackTrace(); System.exit(1); } // create an XA pool datasource with a minimum of 4 objects StandardXAPoolDataSource spds = new StandardXAPoolDataSource(4); spds.setMaxSize(15); spds.setMinSize(13); spds.setUser(login); spds.setPassword(password); // create an XA datasource which will be given to the XA pool StandardXADataSource xads = new StandardXADataSource(); try { xads.setDriverName(driver); xads.setUrl(url); xads.setUser(login); xads.setPassword(password); xads.setTransactionManager(jotm.getTransactionManager()); } catch (Exception e) { e.printStackTrace(); System.exit(1); } // give the XA datasource to the pool (to create futur objects) spds.setDataSource(xads); try { conn = spds.getConnection(login, password); boolean autocom =(new Boolean(args[1].trim())).booleanValue(); conn.setAutoCommit(autocom); utx.begin(); PreparedStatement pstmt = conn.prepareStatement(SQL_QUERY); pstmt.setInt(1, newValue); pstmt.executeUpdate(); utx.commit(); System.out.println("SetAutoCommit is '"+conn.getAutoCommit()+"'"+ " and should be '"+autocom+"'"); conn.close(); } catch (Exception e) { System.out.println("Exception of type :" + e.getClass().getName() + " has been thrown"); System.out.println("Exception message :" + e.getMessage()); e.printStackTrace(); System.exit(1); } stop(); } public void printTable() { try { STMT = conn.prepareStatement(SQL_REQUEST); ResultSet rset = STMT.executeQuery(SQL_REQUEST); int numcols = rset.getMetaData().getColumnCount(); for (int i = 1; i <= numcols; i++) { System.out.print("\t" + rset.getMetaData().getColumnName(i)); } System.out.println(); while (rset.next()) { for (int i = 1; i <= numcols; i++) { System.out.print("\t" + rset.getString(i)); } System.out.println(""); } } catch (Exception e) { e.printStackTrace(); } } public void stop() { try { InitialContext ictx = new InitialContext(); ictx.unbind(USER_TRANSACTION_JNDI_NAME); } catch (Exception e) { e.printStackTrace(); } jotm.stop(); jotm = null; } static public void main(String [] argv) throws Exception{ SaveAutoCommit spdse = new SaveAutoCommit(argv); System.exit(1); } } xapool-1.5.0-src/examples/saveautocommit/build.xml0000644000175000017500000000161310235646675022260 0ustar twernertwerner xapool-1.5.0-src/examples/simplestatement/0000755000175000017500000000000010235646675020614 5ustar twernertwernerxapool-1.5.0-src/examples/simplestatement/README.txt0000644000175000017500000000415710235646675022321 0ustar twernertwerner# # # Test the Statement implementation with the printTable method # # Scenario: --------- Setup: ------ o A database: - MySQL - PostgreSQL Database Setup: --------------- The example expects: o a database named javatest o a user of login "mojo" and password "jojo" o a table named testdata which is like +----+-------+ | ID | FOO | +----+-------+ | 1 | 1 | +----+-------+ o id being an int (primary key) o foo being an int For example on MySQL: mysql> GRANT ALL PRIVILEGES ON *.* TO mojo -> IDENTIFIED BY 'jojo' WITH GRANT OPTION; mysql> create database javatest; mysql> use javatest; mysql> create table testdata ( -> id int not null auto_increment primary key, -> foo int)type=bdb; mysql> insert into testdata values(null, 1); Database configuration are stored in properties file (spy.properties) which contains the following properties: o realdriver - Name of the JDBC driver o url - URL to connect to the data base Compilation: ------------ Go to output/dist/examples/simplestatement Type $ ant compile to compile the example Run the example: ---------------- o To run the example, first check that only RMI protocol will be activated (in the ../../config/carol.properties, carol.rmi.activated should be set to jrmp); then type $ rmiregistry -J-classpath -Jjotm.jar:jotm_jrmp_stubs.jar -J-Djava.security.policy=../config/java.policy & to start a RMI registry on default port (i.e. 1099). o Set the classpath $ export CLASSPATH=../../lib/ow_util_log_wrp_log4j.jar:../../lib/jta-spec1_0_1.jar:../../lib/jotm.jar:../../lib/jotm_jrmp_stubs.jar:../../config:.:../../lib/xapool.jar:.:../../lib/commons-logging.jar:../../lib/commons-logging-api.jar:../../lib/p6spy.jar:../../lib/connector-1_5.jar:../../lib/howl.jar:$JDBC_JARS where JDBC_JARS is the location of the JDBC driver jar file(s) you want to use. o Modify ../../config/spy.properties to setup your jdbc properties o Start the example $ java SimpleStatement commit 4 Usage: ------ $ java SimpleStatement [completion] [value] where o completion can be: - commit - rollback o value is an integer value Enjoy! xapool-1.5.0-src/examples/simplestatement/SimpleStatement.java0000644000175000017500000001560110235646675024600 0ustar twernertwerner import org.enhydra.jdbc.pool.StandardXAPoolDataSource; import org.enhydra.jdbc.standard.StandardXADataSource; import org.objectweb.jotm.Jotm; import org.objectweb.transaction.jta.TMService; import javax.naming.InitialContext; import javax.naming.Context; import javax.transaction.UserTransaction; import java.util.Properties; import java.sql.ResultSet; import java.sql.PreparedStatement; import java.sql.Connection; import java.sql.Statement; /** * this test is used to show the following process:
*
 *    utx.begin();
 *    c = ds.getConnection();
 *    ...
 *    c.close();
 *    c = ds.getConnection();
 *    ...
 *    c.close();
 *    utx.commit() or utx.rollback();
 * 
* This process should work in all cases. */ public class SimpleStatement { private String SQL_REQUEST = "select id, foo from testdata"; private String SQL_QUERY = "update testdata set foo = ? where id=1"; private String USAGE = "usage: java SimpleStatement [commit|rollback] [number]"; private Connection conn; private TMService jotm; private String login = null; private String password = null; private String url = null; private String driver = null; private String USER_TRANSACTION_JNDI_NAME = "UserTransaction"; public SimpleStatement(String [] args) throws Exception { if (args.length != 2) { System.out.println(USAGE); System.exit(1); } // first, load the properties from the spy.properties file Properties prop = new Properties(); try { prop.load(ClassLoader.getSystemResourceAsStream("spy.properties")); } catch (Exception e) { System.err.println("problem to load properties."); e.printStackTrace(); System.exit(1); } login = prop.getProperty("login"); password = prop.getProperty("password"); url = prop.getProperty("url"); driver = prop.getProperty("driver"); // completion is either "commit", either "rollback" String completion = args[0]; // get the new value which will be assign to the database int newValue = 0; try { newValue = Integer.parseInt(args[1]); } catch (NumberFormatException e) { System.err.println(USAGE); System.err.println("[number] has to be an integer\n"); System.exit(1); } // Get a transaction manager try { // creates an instance of JOTM with a local transaction factory which is not bound to a registry jotm = new Jotm(true, false); InitialContext ictx = new InitialContext(); ictx.rebind(USER_TRANSACTION_JNDI_NAME, jotm.getUserTransaction()); } catch (Exception e) { System.err.println("JOTM problem."); e.printStackTrace(); System.exit(1); } // get an user transaction UserTransaction utx = null; try { System.out.println("create initial context"); Context ictx = new InitialContext(); System.out.println("lookup UserTransaction at : " + USER_TRANSACTION_JNDI_NAME); utx = (UserTransaction) ictx.lookup(USER_TRANSACTION_JNDI_NAME); } catch (Exception e) { System.err.println("Exception of type :" + e.getClass().getName() + " has been thrown"); System.err.println("Exception message :" + e.getMessage()); e.printStackTrace(); System.exit(1); } // create an XA pool datasource with a minimum of 4 objects StandardXAPoolDataSource spds = new StandardXAPoolDataSource(4); spds.setMaxSize(15); spds.setMinSize(13); spds.setUser(login); spds.setPassword(password); // create an XA datasource which will be given to the XA pool StandardXADataSource xads = new StandardXADataSource(); try { xads.setDriverName(driver); xads.setUrl(url); xads.setUser(login); xads.setPassword(password); } catch (Exception e) { e.printStackTrace(); System.exit(1); } spds.setTransactionManager(jotm.getTransactionManager()); // give the XA datasource to the pool (to create futur objects) spds.setDataSource(xads); try { System.out.println("** begin a transaction **"); utx.begin(); conn = spds.getConnection(login, password); PreparedStatement pstmt = conn.prepareStatement(SQL_QUERY); pstmt.setInt(1, newValue); pstmt.executeUpdate(); System.out.println("dump, after the first update:"); printTable(); pstmt.close(); conn.close(); conn = spds.getConnection(login, password); PreparedStatement pstmt2 = conn.prepareStatement(SQL_QUERY); pstmt2.setInt(1, newValue+2); pstmt2.executeUpdate(); System.out.println("dump, after the second update:"); printTable(); pstmt2.close(); conn.close(); if (completion.equals("commit")) { System.out.println("** commit ** the transaction"); utx.commit(); } else { System.out.println("** rollback ** the transaction"); utx.rollback(); } } catch (Exception e) { System.err.println("Exception of type :" + e.getClass().getName() + " has been thrown"); System.err.println("Exception message :" + e.getMessage()); e.printStackTrace(); System.exit(1); } System.out.println("dump, after work:"); conn = spds.getConnection(login, password); printTable(); conn.close(); stop(); } public void printTable() { try { Statement st = conn.createStatement(); ResultSet rset = st.executeQuery(SQL_REQUEST); int numcols = rset.getMetaData().getColumnCount(); for (int i = 1; i <= numcols; i++) { System.out.print("\t" + rset.getMetaData().getColumnName(i)); } System.out.println(); while (rset.next()) { for (int i = 1; i <= numcols; i++) { System.out.print("\t" + rset.getString(i)); } System.out.println(""); } st.close(); } catch (Exception e) { e.printStackTrace(); } } public void stop() { try { InitialContext ictx = new InitialContext(); ictx.unbind(USER_TRANSACTION_JNDI_NAME); } catch (Exception e) { e.printStackTrace(); } jotm.stop(); jotm = null; } static public void main(String [] argv) throws Exception{ SimpleStatement spdse = new SimpleStatement(argv); System.exit(1); } } xapool-1.5.0-src/examples/simplestatement/build.xml0000644000175000017500000000155710235646675022445 0ustar twernertwerner xapool-1.5.0-src/examples/xapooldatasource/0000755000175000017500000000000010235646675020753 5ustar twernertwernerxapool-1.5.0-src/examples/xapooldatasource/DatabaseHelper.java0000644000175000017500000000473410235646675024472 0ustar twernertwerner import java.sql.Connection; import java.sql.SQLException; import java.util.Properties; import javax.naming.InitialContext; import javax.sql.XAConnection; import javax.sql.XADataSource; import org.objectweb.jotm.Jotm; import org.objectweb.transaction.jta.TMService; import org.enhydra.jdbc.standard.StandardXADataSource; public class DatabaseHelper { private String password; private TMService jotm; private XADataSource xads; private String login; private static final String USER_TRANSACTION_JNDI_NAME = "UserTransaction"; /** * Constructor for DatabaseHelper. */ public DatabaseHelper() { Properties props = new Properties(); try { props.load(ClassLoader.getSystemResourceAsStream("spy.properties")); } catch (Exception e) { System.err.println("no properties file found to init the database"); System.exit(1); } System.out.println("\n database configuration:"); props.list(System.out); System.out.println("------------------------\n"); login = props.getProperty("login"); password = props.getProperty("password"); // Get a transction manager try { // creates an instance of JOTM with a local transaction factory which is not bound to a registry jotm = new Jotm(true, false); InitialContext ictx = new InitialContext(); ictx.rebind(USER_TRANSACTION_JNDI_NAME, jotm.getUserTransaction()); } catch (Exception e) { e.printStackTrace(); System.exit(1); } xads = new StandardXADataSource(); try { ((StandardXADataSource) xads).setDriverName(props.getProperty("driver")); ((StandardXADataSource) xads).setUrl(props.getProperty("url")); ((StandardXADataSource) xads).setTransactionManager(jotm.getTransactionManager()); } catch (Exception e) { e.printStackTrace(); System.exit(1); } } public Connection getConnection() throws SQLException { XAConnection xaconn = xads.getXAConnection(login, password); return xaconn.getConnection(); } /** * Method stop. */ public void stop() { try { InitialContext ictx = new InitialContext(); ictx.unbind(USER_TRANSACTION_JNDI_NAME); } catch (Exception e) { e.printStackTrace(); } jotm.stop(); jotm = null; } } xapool-1.5.0-src/examples/xapooldatasource/README.txt0000644000175000017500000000535110235646675022455 0ustar twernertwerner# # # StandardXAPoolDataSource example # # (this example comes from JOTM project, thanks to Jeff Mesnil) # Scenario: --------- The JDBC is a simple example showing how to use JTA transactions with JDBC. Setup: ------ o A RMI registry o JOTM is the Transaction Manager o A database: - MySQL - PostgreSQL o DatabaseHelper setups the JDBC objects (i.e., the JDBC Connection) with Enhydra wrappers and associates them to JOTM as their transaction manager. o JdbcExample then will ask the DatabaseHelper for a connection, update a table within a transaction and complete this transaction thanks to arguments given by the user. Database Setup: --------------- The example expects: o a database named javatest o a user of login "mojo" and password "jojo" o a *transactional* table named testdata which is like +----+-------+ | ID | FOO | +----+-------+ | 1 | 1 | +----+-------+ o id being an int (primary key) o foo being an int For example on MySQL: mysql> GRANT ALL PRIVILEGES ON *.* TO mojo -> IDENTIFIED BY 'jojo' WITH GRANT OPTION; mysql> create database javatest; mysql> use javatest; mysql> create table testdata ( -> id int not null auto_increment primary key, -> foo int)type=bdb; mysql> insert into testdata values(null, 1); Database configuration are stored in properties file (mysql.properties) which contains the following properties: o realdriver - Name of the JDBC driver o url - URL to connect to the data base Compilation: ------------ Type $ ant compile to compile the example Run the example: ---------------- o To run the example, first check that only RMI protocol will be activated (in the ../../config/carol.properties, carol.rmi.activated should be set to jrmp); then type $ rmiregistry -J-classpath -Jjotm.jar:jotm_jrmp_stubs.jar -J-Djava.security.policy=../config/java.policy & to start a RMI registry on default port (i.e. 1099). o Set the classpath $ export CLASSPATH=../../lib/jotm.jar:../../lib/jotm_jrmp_stubs.jar:../../lib/xapool.jar:../../config:.:../../lib/commons-logging.jar:../../lib/commons-logging-api.jar:../../lib/p6spy.jar:../../lib/connector-1_5.jar:../../lib/howl.jar:$JDBC_JARS where JDBC_JARS is the location of the JDBC driver jar file(s) you want to use. o Modify ../../config/spy.properties to setup your jdbc properties o Start the example $ java StandardXAPoolDataSourceExample commit 2 // set table value to 2 and commit the transaction $ java StandardXAPoolDataSourceExample rollback 0 // set table value to 0 but rollback the transaction $ java StandardXAPoolDataSourceExample ... Usage: ------ $ java StandardXAPoolDataSourceExample [completion] [number] where o completion can be: - commit - rollback o number has to be a integer Enjoy! xapool-1.5.0-src/examples/xapooldatasource/StandardXAPoolDataSourceExample.java0000644000175000017500000001044510235646675027734 0ustar twernertwerner import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import javax.naming.Context; import javax.naming.InitialContext; import javax.transaction.UserTransaction; public class StandardXAPoolDataSourceExample { private static final String USAGE = "usage: java StandardXAPoolDataSourceExample [commit|rollback] [number]"; private static final String SQL_REQUEST = "select id, foo from testdata"; private static final String SQL_QUERY = "update testdata set foo = ? where id=1"; private static final String USER_TRANSACTION_JNDI_NAME = "UserTransaction"; private static Connection conn = null; private static void printTable() { try { PreparedStatement pstmt = conn.prepareStatement(SQL_REQUEST); ResultSet rset = pstmt.executeQuery(); int numcols = rset.getMetaData().getColumnCount(); for (int i = 1; i <= numcols; i++) { System.out.print("\t" + rset.getMetaData().getColumnName(i)); } System.out.println(); while (rset.next()) { for (int i = 1; i <= numcols; i++) { System.out.print("\t" + rset.getString(i)); } System.out.println(""); } } catch (Exception e) { e.printStackTrace(); } } private static void updateTable(int newValue) { try { PreparedStatement pstmt = conn.prepareStatement(SQL_QUERY); pstmt.setInt(1, newValue); pstmt.executeUpdate(); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { if (args.length != 2|| (!args[0].equals("commit") && !args[0].equals("rollback"))) { System.err.println(USAGE + "\n"); System.exit(1); } String completion = args[0]; int newValue = 0; try { newValue = Integer.parseInt(args[1]); } catch (NumberFormatException e) { System.err.println(USAGE); System.err.println("[number] has to be an integer\n"); System.exit(1); } System.out.println("start server"); DatabaseHelper dbHelper = new DatabaseHelper(); UserTransaction utx = null; try { System.out.println("create initial context"); Context ictx = new InitialContext(); System.out.println("lookup UserTransaction at : " + USER_TRANSACTION_JNDI_NAME); utx = (UserTransaction) ictx.lookup(USER_TRANSACTION_JNDI_NAME); } catch (Exception e) { System.err.println("Exception of type :" + e.getClass().getName() + " has been thrown"); System.err.println("Exception message :" + e.getMessage()); e.printStackTrace(); System.exit(1); } try { System.out.println("get a connection"); conn = dbHelper.getConnection(); } catch (Exception e) { e.printStackTrace(); } System.out.println("before transaction, table is:"); printTable(); try { System.out.println("begin a transaction"); utx.begin(); System.out.println("update the table"); updateTable(newValue); if (completion.equals("commit")) { System.out.println("*commit* the transaction"); utx.commit(); } else { System.out.println("*rollback* the transaction"); utx.rollback(); } } catch (Exception e) { System.out.println("Exception of type :" + e.getClass().getName() + " has been thrown"); System.out.println("Exception message :" + e.getMessage()); e.printStackTrace(); System.exit(1); } utx = null; System.out.println("after transaction, table is:"); printTable(); try { System.out.println("close connection"); conn.close(); } catch (Exception e) { e.printStackTrace(); } finally { conn = null; } System.out.println("stop server"); dbHelper.stop(); System.out.println("JDBC example is ok.\n"); System.exit(0); } } xapool-1.5.0-src/examples/xapooldatasource/build.xml0000644000175000017500000000152710235646675022601 0ustar twernertwerner xapool-1.5.0-src/examples/xapooldatasource/mysql.properties0000644000175000017500000000016110235646675024234 0ustar twernertwernerdriver org.gjt.mm.mysql.Driver url jdbc:mysql://localhost/javatest login mojo password jojoxapool-1.5.0-src/examples/xapooldatasource/postgresql.properties0000644000175000017500000000016410235646675025275 0ustar twernertwernerdriver org.postgresql.Driver url jdbc:postgresql://localhost/javatest login mojo password jojoxapool-1.5.0-src/ext/0000755000175000017500000000000010235646675014360 5ustar twernertwernerxapool-1.5.0-src/ext/carol.properties0000644000175000017500000000273610235646675017606 0ustar twernertwerner# Copyright (C) 2002 - INRIA (www.inria.fr) # # CAROL: Common Architecture for RMI ObjectWeb Layer # # This library is developed inside the ObjectWeb Consortium, # http://www.objectweb.org # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 # USA # # # author Guillaume Riviere (Guillaume.Riviere@inrialpes.fr) # # $Id: carol.properties,v 1.1 2003/04/02 13:09:30 jmesnil Exp $ # carol.rmi.activated=jrmp carol.start.ns=false # Interceptors for Transactions configuration # for iiop carol.jvm.org.omg.PortableInterceptor.ORBInitializerClass.org.objectweb.jotm.ots.OTSORBInitializer # for jrmp carol.jvm.org.objectweb.PortableInterceptor.JRMPInitializerClass.org.objectweb.jotm.jta.rmi.JTAInterceptorInitializer # configuration for rmi iiop jndi # java.naming.provider.url property carol.jndi.iiop.java.naming.provider.url=iiop://localhost:19751xapool-1.5.0-src/ext/java.policy0000644000175000017500000000027110235646675016522 0ustar twernertwernergrant { permission java.lang.RuntimePermission "accessClassInPackage.sun.rmi.server"; permission java.lang.RuntimePermission "accessClassInPackage.sun.rmi.transport"; };xapool-1.5.0-src/ext/jndi.properties0000644000175000017500000000047010235646675017423 0ustar twernertwerner###################### JNDI configuration # # Please refer to the JNDI documentation for further details. # You may adapt localhost and port number # depending on your configuration. # java.naming.factory.initial com.sun.jndi.rmi.registry.RegistryContextFactory java.naming.provider.url rmi://localhost:1099 xapool-1.5.0-src/ext/log4j.properties0000644000175000017500000000334010235646675017515 0ustar twernertwerner########################################################## # log4j configuration for XAPool package # # 2 categories to configure the pool and xapool # ########################################################## log4j.appender.Console=org.apache.log4j.ConsoleAppender log4j.appender.Console.layout=org.apache.log4j.PatternLayout log4j.appender.Console.layout.ConversionPattern=%d %c{1} %p - %m\n log4j.appender.Requests=org.apache.log4j.RollingFileAppender log4j.appender.Requests.File=xapool.log log4j.appender.Requests.MaxFileSize=100MB log4j.appender.Requests.MaxBackupIndex=5 log4j.appender.Requests.layout=org.apache.log4j.PatternLayout log4j.appender.Requests.layout.ConversionPattern=%10r [%-5c{1}] %7p - %C{1}.%M(%L) : %m\n # Root logger set to ERROR using the Console appender defined above. log4j.rootLogger=INFO, Console ###################### # Logger definitions # ###################### # JOTM # log4j.logger.org.objectweb.jotm=DEBUG, Requests log4j.additivity.org.objectweb.jotm=false log4j.logger.org.objectweb.jotm.jta=DEBUG, Requests log4j.additivity.org.objectweb.jotm.jta=false log4j.logger.org.objectweb.jotm.recovery=DEBUG, Requests log4j.additivity.org.objectweb.jotm.recovery=false log4j.logger.org.objectweb.jotm.tests=DEBUG, Requests log4j.additivity.org.objectweb.jotm.tests=false # CAROL # log4j.logger.org.objectweb.carol=DEBUG, Requests log4j.additivity.org.objectweb.carol=false log4j.logger.org.objectweb.carol.rmi=DEBUG, Requests log4j.additivity.org.objectweb.carol.rmi=false log4j.logger.org.objectweb.carol.jndi=DEBUG, Requests log4j.additivity.org.objectweb.carol.jndi=false # XAPool # log4j.logger.org.enhydra.jdbc.xapool=DEBUG, Requests log4j.additivity.org.enhydra.jdbc.xapool=false xapool-1.5.0-src/ext/spy.properties0000644000175000017500000002541610235646675017321 0ustar twernertwerner############################################################### # XAPool CONFIGURATION # # # # please edit the following line to match with your # # database and JDBC driver # ############################################################### # POSTGRESQL configuration realdriver=org.postgresql.Driver url jdbc:postgresql://localhost/javatest # MYSQL configuration #realdriver=org.postgresql.Driver #url jdbc:mysql://localhost/javatest # HSQLDB configuration #realdriver=org.hsqldb.jdbcDriver #url jdbc:hsqldb:data/javatest # SAPDB configuration #realdriver=com.sap.dbtech.jdbc.DriverSapDB #url jdbc:sapdb://localhost/JAVATEST # Sybase ASE configuration - Change host, port and database as appropriate # Note also that ASE passwords (at least in new versions) must be 6 characters. # Change the login and password below as appropriate #datasource-class=org.enhydra.jdbc.sybase.SybaseXADataSource #realdriver=com.sybase.jdbc2.jdbc.SybDriver #url=jdbc:sybase:Tds:mac1:11222/master ################################################################ # common configuration, do not edit the 3 following # # lines # ################################################################ driver com.p6spy.engine.spy.P6SpyDriver login mojo password jojo ################################################################# # P6Spy Options File # # See documentation for detailed instructions # ################################################################# ################################################################# # MODULES # # # # Modules provide the P6Spy functionality. If a module, such # # as module_log is commented out, that functionality will not # # be available. If it is not commented out (if it is active), # # the functionality will be active. # # # # Values set in Modules cannot be reloaded using the # # reloadproperties variable. Once they are loaded, they remain # # in memory until the application is restarted. # # # ################################################################# module.log=com.p6spy.engine.logging.P6LogFactory #module.outage=com.p6spy.engine.outage.P6OutageFactory ################################################################# # REALDRIVER(s) # # # # In your application server configuration file you replace the # # "real driver" name with com.p6spy.engine.P6SpyDriver. This is # # where you put the name of your real driver P6Spy can find and # # register your real driver to do the database work. # # # # If your application uses several drivers specify them in # # realdriver2, realdriver3. See the documentation for more # # details. # # # # Values set in REALDRIVER(s) cannot be reloaded using the # # reloadproperties variable. Once they are loaded, they remain # # in memory until the application is restarted. # # # ################################################################# ################################################################ # P6LOG SPECIFIC PROPERTIES # ################################################################ # no properties currently available ################################################################ # P6OUTAGE SPECIFIC PROPERTIES # ################################################################ # Outage Detection # # This feature detects long-running statements that may be indicative of # a database outage problem. If this feature is turned on, it will log any # statement that surpasses the configurable time boundary during its execution. # When this feature is enabled, no other statements are logged except the long # running statements. The interval property is the boundary time set in seconds. # For example, if this is set to 2, then any statement requiring at least 2 # seconds will be logged. Note that the same statement will continue to be logged # for as long as it executes. So if the interval is set to 2, and the query takes # 11 seconds, it will be logged 5 times (at the 2, 4, 6, 8, 10 second intervals). # # outagedetection=true|false # outagedetectioninterval=integer time (seconds) # outagedetection=false outagedetectioninterval= ################################################################ # COMMON PROPERTIES # ################################################################ # filter what is logged filter=false # comma separated list of tables to include when filtering include = # comma separated list of tables to exclude when filtering exclude = # sql expression to evaluate if using regex filtering sqlexpression = # turn on tracing autoflush = true # sets the date format using Java's SimpleDateFormat routine dateformat= #list of categories to explicitly include includecategories= #list of categories to exclude: error, info, batch, debug, statement, #commit, rollback and result are valid values excludecategories=info,debug,result,batch #allows you to use a regex engine or your own matching engine to determine #which statements to log # #stringmatcher=com.p6spy.engine.common.GnuRegexMatcher #stringmatcher=com.p6spy.engine.common.JakartaRegexMatcher stringmatcher= # prints a stack trace for every statement logged stacktrace=false # if stacktrace=true, specifies the stack trace to print stacktraceclass= # determines if property file should be reloaded reloadproperties=false # determines how often should be reloaded in seconds reloadpropertiesinterval=60 #if=true then url must be prefixed with p6spy: useprefix=false #specifies the appender to use for logging #appender=com.p6spy.engine.logging.appender.Log4jLogger #appender=com.p6spy.engine.logging.appender.StdoutLogger appender=com.p6spy.engine.logging.appender.FileLogger # name of logfile to use, note Windows users should make sure to use forward slashes in their pathname (e:/test/spy.log) (used for file logger only) logfile = spy.log # append to the p6spy log file. if this is set to false the # log file is truncated every time. (file logger only) append=true #The following are for log4j logging only log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout log4j.appender.STDOUT.layout.ConversionPattern=p6spy - %m%n #log4j.appender.CHAINSAW_CLIENT=org.apache.log4j.net.SocketAppender #log4j.appender.CHAINSAW_CLIENT.RemoteHost=localhost #log4j.appender.CHAINSAW_CLIENT.Port=4445 #log4j.appender.CHAINSAW_CLIENT.LocationInfo=true log4j.logger.p6spy=INFO,STDOUT ################################################################# # DataSource replacement # # # # Replace the real DataSource class in your application server # # configuration with the name com.p6spy.engine.spy.P6DataSource,# # then add the JNDI name and class name of the real # # DataSource here # # # # Values set in this item cannot be reloaded using the # # reloadproperties variable. Once it is loaded, it remains # # in memory until the application is restarted. # # # ################################################################# #realdatasource=/RealMySqlDS #realdatasourceclass=com.mysql.jdbc.jdbc2.optional.MysqlDataSource ################################################################# # DataSource properties # # # # If you are using the DataSource support to intercept calls # # to a DataSource that requires properties for proper setup, # # define those properties here. Use name value pairs, separate # # the name and value with a semicolon, and separate the # # pairs with commas. # # # # The example shown here is for mysql # # # ################################################################# #realdatasourceproperties=port;3306,serverName;ibmhost,databaseName;mydb ################################################################# # JNDI DataSource lookup # # # # If you are using the DataSource support outside of an app # # server, you will probably need to define the JNDI Context # # environment. # # # # If the P6Spy code will be executing inside an app server then # # do not use these properties, and the DataSource lookup will # # use the naming context defined by the app server. # # # # The two standard elements of the naming environment are # # jndicontextfactory and jndicontextproviderurl. If you need # # additional elements, use the jndicontextcustom property. # # You can define multiple properties in jndicontextcustom, # # in name value pairs. Separate the name and value with a # # semicolon, and separate the pairs with commas. # # # # The example shown here is for a standalone program running on # # a machine that is also running JBoss, so the JDNI context # # is configured for JBoss (3.0.4). # # # ################################################################# #jndicontextfactory=org.jnp.interfaces.NamingContextFactory #jndicontextproviderurl=localhost:1099 #jndicontextcustom=java.naming.factory.url.pkgs;org.jboss.nameing:org.jnp.interfaces #jndicontextfactory=com.ibm.websphere.naming.WsnInitialContextFactory #jndicontextproviderurl=iiop://localhost:900 xapool-1.5.0-src/externals/0000755000175000017500000000000010235646676015566 5ustar twernertwernerxapool-1.5.0-src/src/0000755000175000017500000000000010235646676014350 5ustar twernertwernerxapool-1.5.0-src/src/org/0000755000175000017500000000000010235646676015137 5ustar twernertwernerxapool-1.5.0-src/src/org/enhydra/0000755000175000017500000000000010235646676016571 5ustar twernertwernerxapool-1.5.0-src/src/org/enhydra/jdbc/0000755000175000017500000000000010235646676017473 5ustar twernertwernerxapool-1.5.0-src/src/org/enhydra/jdbc/core/0000755000175000017500000000000010235646676020423 5ustar twernertwernerxapool-1.5.0-src/src/org/enhydra/jdbc/core/CoreCallableStatement.java0000644000175000017500000007640110235646676025473 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.core; import org.enhydra.jdbc.util.JdbcUtil; import java.io.InputStream; import java.io.Reader; import java.math.BigDecimal; import java.sql.Array; import java.sql.Blob; import java.sql.Clob; import java.sql.Connection; import java.sql.Date; import java.sql.CallableStatement; import java.sql.Ref; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.SQLWarning; import java.sql.Time; import java.sql.Timestamp; import java.util.Calendar; /** * A very simple implementation of Statement. When created * it is supplied with another Statement to which all * of this class' methods delegate their work. */ public abstract class CoreCallableStatement extends JdbcUtil implements CallableStatement { // the CallableStatement which does most of the work. protected CallableStatement cs; public Array getArray(int i) throws SQLException { preInvoke(); try { return cs.getArray(i); } catch (SQLException e) { catchInvoke(e); } return null; } public java.math.BigDecimal getBigDecimal(int i) throws SQLException { preInvoke(); try { return cs.getBigDecimal(i); } catch (SQLException e) { catchInvoke(e); } return null; } public java.math.BigDecimal getBigDecimal(int i, int scale) throws SQLException { preInvoke(); try { return cs.getBigDecimal(i); } catch (SQLException e) { catchInvoke(e); } return null; } public Blob getBlob(int i) throws SQLException { preInvoke(); try { return cs.getBlob(i); } catch (SQLException e) { catchInvoke(e); } return null; } public boolean getBoolean(int i) throws SQLException { preInvoke(); try { return cs.getBoolean(i); } catch (SQLException e) { catchInvoke(e); } return false; } public byte getByte(int i) throws SQLException { preInvoke(); try { return cs.getByte(i); } catch (SQLException e) { catchInvoke(e); } return 0; } public byte[] getBytes(int i) throws SQLException { preInvoke(); try { return cs.getBytes(i); } catch (SQLException e) { catchInvoke(e); } return null; } public Clob getClob(int i) throws SQLException { preInvoke(); try { return cs.getClob(i); } catch (SQLException e) { catchInvoke(e); } return null; } public Date getDate(int i) throws SQLException { preInvoke(); try { return cs.getDate(i); } catch (SQLException e) { catchInvoke(e); } return null; } public Date getDate(int i, java.util.Calendar cal) throws SQLException { preInvoke(); try { return cs.getDate(i, cal); } catch (SQLException e) { catchInvoke(e); } return null; } public double getDouble(int i) throws SQLException { preInvoke(); try { return cs.getDouble(i); } catch (SQLException e) { catchInvoke(e); } return 0; } public float getFloat(int i) throws SQLException { preInvoke(); try { return cs.getFloat(i); } catch (SQLException e) { catchInvoke(e); } return 0; } public int getInt(int i) throws SQLException { preInvoke(); try { return cs.getInt(i); } catch (SQLException e) { catchInvoke(e); } return 0; } public long getLong(int i) throws SQLException { preInvoke(); try { return cs.getLong(i); } catch (SQLException e) { catchInvoke(e); } return 0; } public Object getObject(int i) throws SQLException { preInvoke(); try { return cs.getObject(i); } catch (SQLException e) { catchInvoke(e); } return null; } public Object getObject(int i, java.util.Map map) throws SQLException { preInvoke(); try { return cs.getObject(i, map); } catch (SQLException e) { catchInvoke(e); } return null; } public Ref getRef(int i) throws SQLException { preInvoke(); try { return cs.getRef(i); } catch (SQLException e) { catchInvoke(e); } return null; } public short getShort(int i) throws SQLException { preInvoke(); try { return cs.getShort(i); } catch (SQLException e) { catchInvoke(e); } return 0; } public java.lang.String getString(int i) throws SQLException { preInvoke(); try { return cs.getString(i); } catch (SQLException e) { catchInvoke(e); } return null; } public java.sql.Time getTime(int i) throws SQLException { preInvoke(); try { return cs.getTime(i); } catch (SQLException e) { catchInvoke(e); } return null; } public java.sql.Time getTime(int i, java.util.Calendar cal) throws SQLException { preInvoke(); try { return cs.getTime(i, cal); } catch (SQLException e) { catchInvoke(e); } return null; } public java.sql.Timestamp getTimestamp(int i) throws SQLException { preInvoke(); try { return cs.getTimestamp(i); } catch (SQLException e) { catchInvoke(e); } return null; } public java.sql.Timestamp getTimestamp(int i, java.util.Calendar cal) throws SQLException { preInvoke(); try { return cs.getTimestamp(i, cal); } catch (SQLException e) { catchInvoke(e); } return null; } public void registerOutParameter(int i, int sqlType) throws SQLException { preInvoke(); try { cs.registerOutParameter(i, sqlType); } catch (SQLException e) { catchInvoke(e); } } public void registerOutParameter(int i, int sqlType, int scale) throws SQLException { preInvoke(); try { cs.registerOutParameter(i, sqlType, scale); } catch (SQLException e) { catchInvoke(e); } } public void registerOutParameter(int i, int sqlType, String typeName) throws SQLException { preInvoke(); try { cs.registerOutParameter(i, sqlType, typeName); } catch (SQLException e) { catchInvoke(e); } } public boolean wasNull() throws SQLException { preInvoke(); try { return cs.wasNull(); } catch (SQLException e) { catchInvoke(e); } return false; } public void addBatch() throws SQLException { preInvoke(); try { cs.addBatch(); } catch (SQLException e) { catchInvoke(e); } } public void clearParameters() throws SQLException { preInvoke(); try { cs.clearParameters(); } catch (SQLException e) { catchInvoke(e); } } public boolean execute() throws SQLException { preInvoke(); try { return cs.execute(); } catch (SQLException e) { catchInvoke(e); } return false; } public ResultSet executeQuery() throws SQLException { preInvoke(); try { return cs.executeQuery(); } catch (SQLException e) { catchInvoke(e); } return null; } public int executeUpdate() throws SQLException { preInvoke(); try { return cs.executeUpdate(); } catch (SQLException e) { catchInvoke(e); } return 0; } public ResultSetMetaData getMetaData() throws SQLException { preInvoke(); try { return cs.getMetaData(); } catch (SQLException e) { catchInvoke(e); } return null; } public void setArray(int i, Array x) throws SQLException { preInvoke(); try { cs.setArray(i, x); } catch (SQLException e) { catchInvoke(e); } } public void setAsciiStream(int parameterIndex, InputStream x, int length) throws SQLException { preInvoke(); try { cs.setAsciiStream(parameterIndex, x, length); } catch (SQLException e) { catchInvoke(e); } } public void setBigDecimal(int parameterIndex, BigDecimal x) throws SQLException { preInvoke(); try { cs.setBigDecimal(parameterIndex, x); } catch (SQLException e) { catchInvoke(e); } } public void setBinaryStream(int parameterIndex, InputStream x, int length) throws SQLException { preInvoke(); try { cs.setBinaryStream(parameterIndex, x, length); } catch (SQLException e) { catchInvoke(e); } } public void setBlob(int i, Blob x) throws SQLException { preInvoke(); try { cs.setBlob(i, x); } catch (SQLException e) { catchInvoke(e); } } public void setBoolean(int parameterIndex, boolean x) throws SQLException { preInvoke(); try { cs.setBoolean(parameterIndex, x); } catch (SQLException e) { catchInvoke(e); } } public void setByte(int parameterIndex, byte x) throws SQLException { preInvoke(); try { cs.setByte(parameterIndex, x); } catch (SQLException e) { catchInvoke(e); } } public void setBytes(int parameterIndex, byte x[]) throws SQLException { preInvoke(); try { cs.setBytes(parameterIndex, x); } catch (SQLException e) { catchInvoke(e); } } public void setCharacterStream( int parameterIndex, Reader reader, int length) throws SQLException { preInvoke(); try { cs.setCharacterStream(parameterIndex, reader, length); } catch (SQLException e) { catchInvoke(e); } } public void setClob(int i, Clob x) throws SQLException { preInvoke(); try { cs.setClob(i, x); } catch (SQLException e) { catchInvoke(e); } } public void setDate(int parameterIndex, Date x) throws SQLException { preInvoke(); try { cs.setDate(parameterIndex, x); } catch (SQLException e) { catchInvoke(e); } } public void setDate(int parameterIndex, Date x, Calendar cal) throws SQLException { preInvoke(); try { cs.setDate(parameterIndex, x, cal); } catch (SQLException e) { catchInvoke(e); } } public void setDouble(int parameterIndex, double x) throws SQLException { preInvoke(); try { cs.setDouble(parameterIndex, x); } catch (SQLException e) { catchInvoke(e); } } public void setFloat(int parameterIndex, float x) throws SQLException { preInvoke(); try { cs.setFloat(parameterIndex, x); } catch (SQLException e) { catchInvoke(e); } } public void setInt(int parameterIndex, int x) throws SQLException { preInvoke(); try { cs.setInt(parameterIndex, x); } catch (SQLException e) { catchInvoke(e); } } public void setLong(int parameterIndex, long x) throws SQLException { preInvoke(); try { cs.setLong(parameterIndex, x); } catch (SQLException e) { catchInvoke(e); } } public void setNull(int parameterIndex, int sqlType) throws SQLException { preInvoke(); try { cs.setNull(parameterIndex, sqlType); } catch (SQLException e) { catchInvoke(e); } } public void setNull(int paramIndex, int sqlType, String typeName) throws SQLException { preInvoke(); try { cs.setNull(paramIndex, sqlType, typeName); } catch (SQLException e) { catchInvoke(e); } } public void setObject(int parameterIndex, Object x) throws SQLException { preInvoke(); try { cs.setObject(parameterIndex, x); } catch (SQLException e) { catchInvoke(e); } } public void setObject(int parameterIndex, Object x, int targetSqlType) throws SQLException { preInvoke(); try { cs.setObject(parameterIndex, x, targetSqlType); } catch (SQLException e) { catchInvoke(e); } } public void setObject( int parameterIndex, Object x, int targetSqlType, int scale) throws SQLException { preInvoke(); try { cs.setObject(parameterIndex, x, targetSqlType, scale); } catch (SQLException e) { catchInvoke(e); } } public void setRef(int i, Ref x) throws SQLException { preInvoke(); try { cs.setRef(i, x); } catch (SQLException e) { catchInvoke(e); } } public void setShort(int parameterIndex, short x) throws SQLException { preInvoke(); try { cs.setShort(parameterIndex, x); } catch (SQLException e) { catchInvoke(e); } } public void setString(int parameterIndex, String x) throws SQLException { preInvoke(); try { cs.setString(parameterIndex, x); } catch (SQLException e) { catchInvoke(e); } } public void setTime(int parameterIndex, Time x) throws SQLException { preInvoke(); try { cs.setTime(parameterIndex, x); } catch (SQLException e) { catchInvoke(e); } } public void setTime(int parameterIndex, Time x, Calendar cal) throws SQLException { preInvoke(); try { cs.setTime(parameterIndex, x, cal); } catch (SQLException e) { catchInvoke(e); } } public void setTimestamp(int parameterIndex, Timestamp x) throws SQLException { preInvoke(); try { cs.setTimestamp(parameterIndex, x); } catch (SQLException e) { catchInvoke(e); } } public void setTimestamp(int parameterIndex, Timestamp x, Calendar cal) throws SQLException { preInvoke(); try { cs.setTimestamp(parameterIndex, x, cal); } catch (SQLException e) { catchInvoke(e); } } public void setUnicodeStream(int parameterIndex, InputStream x, int length) throws SQLException { preInvoke(); try { cs.setUnicodeStream(parameterIndex, x, length); } catch (SQLException e) { catchInvoke(e); } } // From Statement public void close() throws SQLException { if (cs != null) { cs.close(); } } public int[] executeBatch() throws SQLException { preInvoke(); try { return cs.executeBatch(); } catch (SQLException e) { catchInvoke(e); } return null; } public int getMaxFieldSize() throws SQLException { preInvoke(); try { return cs.getMaxFieldSize(); } catch (SQLException e) { catchInvoke(e); } return 0; } public void setMaxFieldSize(int max) throws SQLException { preInvoke(); try { cs.setMaxFieldSize(max); } catch (SQLException e) { catchInvoke(e); } } public int getMaxRows() throws SQLException { preInvoke(); try { return cs.getMaxRows(); } catch (SQLException e) { catchInvoke(e); } return 0; } public void setMaxRows(int max) throws SQLException { preInvoke(); try { cs.setMaxRows(max); } catch (SQLException e) { catchInvoke(e); } } public void setEscapeProcessing(boolean enable) throws SQLException { preInvoke(); try { cs.setEscapeProcessing(enable); } catch (SQLException e) { catchInvoke(e); } } public int getQueryTimeout() throws SQLException { preInvoke(); try { return cs.getQueryTimeout(); } catch (SQLException e) { catchInvoke(e); } return 0; } public void setQueryTimeout(int seconds) throws SQLException { preInvoke(); try { cs.setQueryTimeout(seconds); } catch (SQLException e) { catchInvoke(e); } } public void cancel() throws SQLException { preInvoke(); try { cs.cancel(); } catch (SQLException e) { catchInvoke(e); } } public SQLWarning getWarnings() throws SQLException { preInvoke(); try { return cs.getWarnings(); } catch (SQLException e) { catchInvoke(e); } return null; } public void clearWarnings() throws SQLException { preInvoke(); try { cs.clearWarnings(); } catch (SQLException e) { catchInvoke(e); } } public void setCursorName(String name) throws SQLException { preInvoke(); try { cs.setCursorName(name); } catch (SQLException e) { catchInvoke(e); } } public ResultSet getResultSet() throws SQLException { preInvoke(); try { return cs.getResultSet(); } catch (SQLException e) { catchInvoke(e); } return null; } public int getUpdateCount() throws SQLException { preInvoke(); try { return cs.getUpdateCount(); } catch (SQLException e) { catchInvoke(e); } return 0; } public boolean getMoreResults() throws SQLException { preInvoke(); try { return cs.getMoreResults(); } catch (SQLException e) { catchInvoke(e); } return false; } public void setFetchDirection(int direction) throws SQLException { preInvoke(); try { cs.setFetchDirection(direction); } catch (SQLException e) { catchInvoke(e); } } public int getFetchDirection() throws SQLException { preInvoke(); try { return cs.getFetchDirection(); } catch (SQLException e) { catchInvoke(e); } return 0; } public void setFetchSize(int rows) throws SQLException { preInvoke(); try { cs.setFetchSize(rows); } catch (SQLException e) { catchInvoke(e); } } public int getFetchSize() throws SQLException { preInvoke(); try { return cs.getFetchSize(); } catch (SQLException e) { catchInvoke(e); } return 0; } public int getResultSetConcurrency() throws SQLException { preInvoke(); try { return cs.getResultSetConcurrency(); } catch (SQLException e) { catchInvoke(e); } return 0; } public int getResultSetType() throws SQLException { preInvoke(); try { return cs.getResultSetType(); } catch (SQLException e) { catchInvoke(e); } return 0; } public Connection getConnection() throws SQLException { preInvoke(); try { return cs.getConnection(); } catch (SQLException e) { catchInvoke(e); } return null; } public void clearBatch() throws SQLException { preInvoke(); try { cs.clearBatch(); } catch (SQLException e) { catchInvoke(e); } } public void addBatch(String s) throws SQLException { preInvoke(); try { cs.addBatch(s); } catch (SQLException e) { catchInvoke(e); } } public boolean execute(String s) throws SQLException { preInvoke(); try { return cs.execute(s); } catch (SQLException e) { catchInvoke(e); } return false; } public ResultSet executeQuery(String s) throws SQLException { preInvoke(); try { return cs.executeQuery(s); } catch (SQLException e) { catchInvoke(e); } return null; } public int executeUpdate(String s) throws SQLException { preInvoke(); try { return cs.executeUpdate(s); } catch (SQLException e) { catchInvoke(e); } return 0; } /* * Add those following methods to compile on JDK 1.4. * Instead those methods are defined in the java.sql.CallableStatement interface * only since JDK 1.4. */ // java.sql.Statement methods public boolean execute(String sql, int autoGeneratedKeys) throws SQLException { preInvoke(); try { return cs.execute(sql, autoGeneratedKeys); } catch (SQLException e) { catchInvoke(e); } return false; } public boolean execute(String sql, int[] columnIndexes) throws SQLException { preInvoke(); try { return cs.execute(sql, columnIndexes); } catch (SQLException e) { catchInvoke(e); } return false; } public boolean execute(String sql, String[] columnNames) throws SQLException { preInvoke(); try { return cs.execute(sql, columnNames); } catch (SQLException e) { catchInvoke(e); } return false; } public int executeUpdate(String sql, int autoGeneratedKeys) throws SQLException { preInvoke(); try { return cs.executeUpdate(sql, autoGeneratedKeys); } catch (SQLException e) { catchInvoke(e); } return 0; } public int executeUpdate(String sql, int[] columnIndexes) throws SQLException { preInvoke(); try { return cs.executeUpdate(sql, columnIndexes); } catch (SQLException e) { catchInvoke(e); } return 0; } public int executeUpdate(String sql, String[] columnNames) throws SQLException { preInvoke(); try { return cs.executeUpdate(sql, columnNames); } catch (SQLException e) { catchInvoke(e); } return 0; } public java.sql.ResultSet getGeneratedKeys() throws SQLException { preInvoke(); try { return cs.getGeneratedKeys(); } catch (SQLException e) { catchInvoke(e); } return null; } public boolean getMoreResults(int current) throws SQLException { preInvoke(); try { return cs.getMoreResults(current); } catch (SQLException e) { catchInvoke(e); } return false; } public int getResultSetHoldability() throws SQLException { preInvoke(); try { return cs.getResultSetHoldability(); } catch (SQLException e) { catchInvoke(e); } return 0; } // java.sql.PreparedStatement methods public java.sql.ParameterMetaData getParameterMetaData() throws SQLException { preInvoke(); try { return cs.getParameterMetaData(); } catch (SQLException e) { catchInvoke(e); } return null; } public void setURL(int parameterIndex, java.net.URL x) throws SQLException { preInvoke(); try { cs.setURL(parameterIndex, x); } catch (SQLException e) { catchInvoke(e); } } // java.sql.CallableStatement methods public java.sql.Array getArray(String parameterName) throws SQLException { preInvoke(); try { return cs.getArray(parameterName); } catch (SQLException e) { catchInvoke(e); } return null; } public java.math.BigDecimal getBigDecimal(String parameterName) throws SQLException { preInvoke(); try { return cs.getBigDecimal(parameterName); } catch (SQLException e) { catchInvoke(e); } return null; } public java.sql.Blob getBlob(String parameterName) throws SQLException { preInvoke(); try { return cs.getBlob(parameterName); } catch (SQLException e) { catchInvoke(e); } return null; } public boolean getBoolean(String parameterName) throws SQLException { preInvoke(); try { return cs.getBoolean(parameterName); } catch (SQLException e) { catchInvoke(e); } return false; } public byte getByte(String parameterName) throws SQLException { preInvoke(); try { return cs.getByte(parameterName); } catch (SQLException e) { catchInvoke(e); } return 0; } public byte[] getBytes(String parameterName) throws SQLException { preInvoke(); try { return cs.getBytes(parameterName); } catch (SQLException e) { catchInvoke(e); } return null; } public java.sql.Clob getClob(String parameterName) throws SQLException { preInvoke(); try { return cs.getClob(parameterName); } catch (SQLException e) { catchInvoke(e); } return null; } public java.sql.Date getDate(String parameterName) throws SQLException { preInvoke(); try { return cs.getDate(parameterName); } catch (SQLException e) { catchInvoke(e); } return null; } public java.sql.Date getDate(String parameterName, java.util.Calendar cal) throws SQLException { preInvoke(); try { return cs.getDate(parameterName, cal); } catch (SQLException e) { catchInvoke(e); } return null; } public double getDouble(String parameterName) throws SQLException { preInvoke(); try { return cs.getDouble(parameterName); } catch (SQLException e) { catchInvoke(e); } return 0; } public float getFloat(String parameterName) throws SQLException { preInvoke(); try { return cs.getFloat(parameterName); } catch (SQLException e) { catchInvoke(e); } return 0; } public int getInt(String parameterName) throws SQLException { preInvoke(); try { return cs.getInt(parameterName); } catch (SQLException e) { catchInvoke(e); } return 0; } public long getLong(String parameterName) throws SQLException { preInvoke(); try { return cs.getLong(parameterName); } catch (SQLException e) { catchInvoke(e); } return 0; } public Object getObject(String parameterName) throws SQLException { preInvoke(); try { return cs.getObject(parameterName); } catch (SQLException e) { catchInvoke(e); } return null; } public Object getObject(String parameterName, java.util.Map map) throws SQLException { preInvoke(); try { return cs.getObject(parameterName, map); } catch (SQLException e) { catchInvoke(e); } return null; } public java.sql.Ref getRef(String parameterName) throws SQLException { preInvoke(); try { return cs.getRef(parameterName); } catch (SQLException e) { catchInvoke(e); } return null; } public short getShort(String parameterName) throws SQLException { preInvoke(); try { return cs.getShort(parameterName); } catch (SQLException e) { catchInvoke(e); } return 0; } public String getString(String parameterName) throws SQLException { preInvoke(); try { return cs.getString(parameterName); } catch (SQLException e) { catchInvoke(e); } return null; } public java.sql.Time getTime(String parameterName) throws SQLException { preInvoke(); try { return cs.getTime(parameterName); } catch (SQLException e) { catchInvoke(e); } return null; } public java.sql.Time getTime(String parameterName, java.util.Calendar cal) throws SQLException { preInvoke(); try { return cs.getTime(parameterName, cal); } catch (SQLException e) { catchInvoke(e); } return null; } public java.sql.Timestamp getTimestamp(String parameterName) throws SQLException { preInvoke(); try { return cs.getTimestamp(parameterName); } catch (SQLException e) { catchInvoke(e); } return null; } public java.sql.Timestamp getTimestamp( String parameterName, java.util.Calendar cal) throws SQLException { preInvoke(); try { return cs.getTimestamp(parameterName, cal); } catch (SQLException e) { catchInvoke(e); } return null; } public java.net.URL getURL(int parameterIndex) throws SQLException { preInvoke(); try { return cs.getURL(parameterIndex); } catch (SQLException e) { catchInvoke(e); } return null; } public java.net.URL getURL(String parameterName) throws SQLException { preInvoke(); try { return cs.getURL(parameterName); } catch (SQLException e) { catchInvoke(e); } return null; } public void registerOutParameter(String parameterName, int sqlType) throws SQLException { preInvoke(); try { cs.registerOutParameter(parameterName, sqlType); } catch (SQLException e) { catchInvoke(e); } } public void registerOutParameter( String parameterName, int sqlType, int scale) throws SQLException { preInvoke(); try { cs.registerOutParameter(parameterName, sqlType, scale); } catch (SQLException e) { catchInvoke(e); } } public void registerOutParameter( String parameterName, int sqlType, String typeName) throws SQLException { preInvoke(); try { cs.registerOutParameter(parameterName, sqlType, typeName); } catch (SQLException e) { catchInvoke(e); } } public void setAsciiStream( String parameterName, java.io.InputStream x, int length) throws SQLException { preInvoke(); try { cs.setAsciiStream(parameterName, x, length); } catch (SQLException e) { catchInvoke(e); } } public void setBigDecimal(String parameterName, java.math.BigDecimal x) throws SQLException { preInvoke(); try { cs.setBigDecimal(parameterName, x); } catch (SQLException e) { catchInvoke(e); } } public void setBinaryStream( String parameterName, java.io.InputStream x, int length) throws SQLException { preInvoke(); try { cs.setBinaryStream(parameterName, x, length); } catch (SQLException e) { catchInvoke(e); } } public void setBoolean(String parameterName, boolean x) throws SQLException { preInvoke(); try { cs.setBoolean(parameterName, x); } catch (SQLException e) { catchInvoke(e); } } public void setByte(String parameterName, byte x) throws SQLException { preInvoke(); try { cs.setByte(parameterName, x); } catch (SQLException e) { catchInvoke(e); } } public void setBytes(String parameterName, byte[] x) throws SQLException { preInvoke(); try { cs.setBytes(parameterName, x); } catch (SQLException e) { catchInvoke(e); } } public void setCharacterStream( String parameterName, java.io.Reader reader, int length) throws SQLException { preInvoke(); try { cs.setCharacterStream(parameterName, reader, length); } catch (SQLException e) { catchInvoke(e); } } public void setDate(String parameterName, java.sql.Date x) throws SQLException { preInvoke(); try { cs.setDate(parameterName, x); } catch (SQLException e) { catchInvoke(e); } } public void setDate( String parameterName, java.sql.Date x, java.util.Calendar cal) throws SQLException { preInvoke(); try { cs.setDate(parameterName, x, cal); } catch (SQLException e) { catchInvoke(e); } } public void setDouble(String parameterName, double x) throws SQLException { preInvoke(); try { cs.setDouble(parameterName, x); } catch (SQLException e) { catchInvoke(e); } } public void setFloat(String parameterName, float x) throws SQLException { preInvoke(); try { cs.setFloat(parameterName, x); } catch (SQLException e) { catchInvoke(e); } } public void setInt(String parameterName, int x) throws SQLException { preInvoke(); try { cs.setInt(parameterName, x); } catch (SQLException e) { catchInvoke(e); } } public void setLong(String parameterName, long x) throws SQLException { preInvoke(); try { cs.setLong(parameterName, x); } catch (SQLException e) { catchInvoke(e); } } public void setNull(String parameterName, int sqlType) throws SQLException { preInvoke(); try { cs.setNull(parameterName, sqlType); } catch (SQLException e) { catchInvoke(e); } } public void setNull(String parameterName, int sqlType, String typeName) throws SQLException { preInvoke(); try { cs.setNull(parameterName, sqlType, typeName); } catch (SQLException e) { catchInvoke(e); } } public void setObject(String parameterName, Object x) throws SQLException { preInvoke(); try { cs.setObject(parameterName, x); } catch (SQLException e) { catchInvoke(e); } } public void setObject(String parameterName, Object x, int targetSqlType) throws SQLException { preInvoke(); try { cs.setObject(parameterName, x, targetSqlType); } catch (SQLException e) { catchInvoke(e); } } public void setObject( String parameterName, Object x, int targetSqlType, int sacle) throws SQLException { preInvoke(); try { cs.setObject(parameterName, x, targetSqlType, sacle); } catch (SQLException e) { catchInvoke(e); } } public void setShort(String parameterName, short x) throws SQLException { preInvoke(); try { cs.setShort(parameterName, x); } catch (SQLException e) { catchInvoke(e); } } public void setString(String parameterName, String x) throws SQLException { preInvoke(); try { cs.setString(parameterName, x); } catch (SQLException e) { catchInvoke(e); } } public void setTime(String parameterName, java.sql.Time x) throws SQLException { preInvoke(); try { cs.setTime(parameterName, x); } catch (SQLException e) { catchInvoke(e); } } public void setTime( String parameterName, java.sql.Time x, java.util.Calendar cal) throws SQLException { preInvoke(); try { cs.setTime(parameterName, x, cal); } catch (SQLException e) { catchInvoke(e); } } public void setTimestamp(String parameterName, java.sql.Timestamp x) throws SQLException { preInvoke(); try { cs.setTimestamp(parameterName, x); } catch (SQLException e) { catchInvoke(e); } } public void setTimestamp( String parameterName, java.sql.Timestamp x, java.util.Calendar cal) throws SQLException { preInvoke(); try { cs.setTimestamp(parameterName, x, cal); } catch (SQLException e) { catchInvoke(e); } } public void setURL(String parameterName, java.net.URL x) throws SQLException { preInvoke(); try { cs.setURL(parameterName, x); } catch (SQLException e) { catchInvoke(e); } } /** * Methods used to do some works before and during the catch * clause, to prevent the pool that a connection is broken. */ abstract public void preInvoke() throws SQLException; abstract public void catchInvoke(SQLException e) throws SQLException; } xapool-1.5.0-src/src/org/enhydra/jdbc/core/CoreConnection.java0000644000175000017500000002202010235646676024172 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.core; import org.enhydra.jdbc.util.JdbcUtil; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.SQLWarning; import java.sql.Statement; import java.util.Map; /** * This is an implementation of java.sql.Connection which simply * delegates everything to an underlying physical implemention * of the same interface. */ public abstract class CoreConnection extends JdbcUtil implements Connection { public Connection con; // the physical database connection /** * Constructor */ public CoreConnection(Connection con) { this.con = con; } public CoreConnection() { } public void clearWarnings() throws SQLException { preInvoke(); try { con.clearWarnings(); } catch (SQLException e) { catchInvoke(e); } } public void close() throws SQLException { preInvoke(); try { con.close(); } catch (SQLException e) { catchInvoke(e); } } public void commit() throws SQLException { preInvoke(); try { con.commit(); } catch (SQLException e) { catchInvoke(e); } } public Statement createStatement() throws SQLException { preInvoke(); try { return con.createStatement(); } catch (SQLException e) { catchInvoke(e); } return null; } public Statement createStatement( int resultSetType, int resultSetConcurrency) throws SQLException { preInvoke(); try { return con.createStatement(resultSetType, resultSetConcurrency); } catch (SQLException e) { catchInvoke(e); } return null; } public boolean getAutoCommit() throws SQLException { preInvoke(); try { return con.getAutoCommit(); } catch (SQLException e) { catchInvoke(e); } return false; } public String getCatalog() throws SQLException { preInvoke(); try { return con.getCatalog(); } catch (SQLException e) { catchInvoke(e); } return null; } public DatabaseMetaData getMetaData() throws SQLException { preInvoke(); try { return con.getMetaData(); } catch (SQLException e) { catchInvoke(e); } return null; } public int getTransactionIsolation() throws SQLException { preInvoke(); try { return con.getTransactionIsolation(); } catch (SQLException e) { catchInvoke(e); } return 0; } public Map getTypeMap() throws SQLException { preInvoke(); try { return con.getTypeMap(); } catch (SQLException e) { catchInvoke(e); } return null; } public SQLWarning getWarnings() throws SQLException { preInvoke(); try { return con.getWarnings(); } catch (SQLException e) { catchInvoke(e); } return null; } public boolean isReadOnly() throws SQLException { preInvoke(); try { return con.isReadOnly(); } catch (SQLException e) { catchInvoke(e); } return false; } public String nativeSQL(String sql) throws SQLException { preInvoke(); try { return con.nativeSQL(sql); } catch (SQLException e) { catchInvoke(e); } return null; } public CallableStatement prepareCall(String sql) throws SQLException { preInvoke(); try { return con.prepareCall(sql); } catch (SQLException e) { catchInvoke(e); } return null; } public PreparedStatement prepareStatement(String sql) throws SQLException { preInvoke(); try { return con.prepareStatement(sql); } catch (SQLException e) { catchInvoke(e); } return null; } public PreparedStatement prepareStatement( String sql, int resultSetType, int resultSetConcurrency) throws SQLException { preInvoke(); try { return con.prepareStatement( sql, resultSetType, resultSetConcurrency); } catch (SQLException e) { catchInvoke(e); } return null; } public void rollback() throws SQLException { preInvoke(); try { con.rollback(); } catch (SQLException e) { catchInvoke(e); } } public void setAutoCommit(boolean autoCommit) throws SQLException { log.debug("CoreConnection:Setautocommit autoCommit was = " + con.getAutoCommit()); log.debug("CoreConnection:Setautocommit = " + autoCommit); preInvoke(); try { con.setAutoCommit(autoCommit); } catch (SQLException e) { catchInvoke(e); } } public void setCatalog(String catalog) throws SQLException { preInvoke(); try { con.setCatalog(catalog); } catch (SQLException e) { catchInvoke(e); } } public void setReadOnly(boolean readOnly) throws SQLException { preInvoke(); try { con.setReadOnly(readOnly); } catch (SQLException e) { catchInvoke(e); } } public void setTransactionIsolation(int level) throws SQLException { preInvoke(); try { con.setTransactionIsolation(level); } catch (SQLException e) { catchInvoke(e); } } public void setTypeMap(Map map) throws SQLException { preInvoke(); try { con.setTypeMap(map); } catch (SQLException e) { catchInvoke(e); } } /* * Add those following methods to compile on JDK 1.4. * Instead those methods are defined in the java.sql.Connection interface * only since JDK 1.4. */ public Statement createStatement( int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { preInvoke(); try { return con.createStatement(resultSetType,resultSetConcurrency,resultSetHoldability); } catch (SQLException e) { catchInvoke(e); } return null; } public int getHoldability() throws SQLException { preInvoke(); try { return con.getHoldability(); } catch (SQLException e) { catchInvoke(e); } return 0; } public CallableStatement prepareCall( String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { preInvoke(); try { return con.prepareCall(sql,resultSetType,resultSetConcurrency,resultSetHoldability); } catch (SQLException e) { catchInvoke(e); } return null; } public PreparedStatement prepareStatement( String sql, int autoGeneratedKeys) throws SQLException { preInvoke(); try { return con.prepareStatement(sql,autoGeneratedKeys); } catch (SQLException e) { catchInvoke(e); } return null; } public PreparedStatement prepareStatement( String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { preInvoke(); try { return prepareStatement(sql,resultSetType,resultSetConcurrency,resultSetHoldability); } catch (SQLException e) { catchInvoke(e); } return null; } public PreparedStatement prepareStatement(String sql, int[] columnIndexes) throws SQLException { preInvoke(); try { return con.prepareStatement(sql,columnIndexes); } catch (SQLException e) { catchInvoke(e); } return null; } public PreparedStatement prepareStatement(String sql, String[] columnNames) throws SQLException { preInvoke(); try { return con.prepareStatement(sql,columnNames); } catch (SQLException e) { catchInvoke(e); } return null; } public void releaseSavepoint(java.sql.Savepoint savepoint) throws SQLException { preInvoke(); try { con.releaseSavepoint(savepoint); } catch (SQLException e) { catchInvoke(e); } } public void rollback(java.sql.Savepoint savepoint) throws SQLException { preInvoke(); try { con.rollback(savepoint); } catch (SQLException e) { catchInvoke(e); } } public void setHoldability(int holdability) throws SQLException { preInvoke(); try { con.setHoldability(holdability); } catch (SQLException e) { catchInvoke(e); } } public java.sql.Savepoint setSavepoint() throws SQLException { preInvoke(); try { return con.setSavepoint(); } catch (SQLException e) { catchInvoke(e); } return null; } public java.sql.Savepoint setSavepoint(String name) throws SQLException { preInvoke(); try { return con.setSavepoint(name); } catch (SQLException e) { catchInvoke(e); } return null; } /** * Methods used to do some works before and during the catch * clause, to prevent the pool that a connection is broken. */ abstract public void preInvoke() throws SQLException; abstract public void catchInvoke(SQLException e) throws SQLException; } xapool-1.5.0-src/src/org/enhydra/jdbc/core/CoreDataSource.java0000644000175000017500000001236710235646676024142 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.core; import org.enhydra.jdbc.util.Logger; import org.enhydra.jdbc.util.JdbcUtil; import java.io.Serializable; import java.io.PrintWriter; import java.util.Hashtable; import javax.naming.Context; import javax.naming.Name; import javax.naming.NamingException; import javax.naming.Reference; import javax.naming.Referenceable; import javax.naming.StringRefAddr; import javax.naming.spi.ObjectFactory; /** * Provides a Data Source which can be used to generate JDBC connections. *

* This class is generic in the sense that it does not rely upon anything other * than standard Java APIs. It uses java.sql.DriverManager and preconfigured * properties to construct a JDBC connection. */ public class CoreDataSource extends JdbcUtil implements Referenceable, ObjectFactory, Serializable { // Standard Data Source properties private int loginTimeout; // timeout for database logins transient public PrintWriter logWriter; // the log writer public String user; // user for the database public String password; // password for the database private String description; // description of the datasource private boolean debug; // debug flag private boolean verbose; // verbose flag private JdbcThreadFactory threadFactory; // thread factory /** * Constructor */ public CoreDataSource() { loginTimeout = 60; // Default value for loginTimeout logWriter = null; user = null; password = null; description = null; debug = false; verbose = false; threadFactory = null; } /** * Setter/Getter defined for standard properties */ public String getDescription() { return description; } public String getPassword() { return password; } public String getUser() { return user; } public JdbcThreadFactory getThreadFactory() { return threadFactory; } public boolean isDebug() { return debug; } public boolean isVerbose() { return verbose; } public void setDescription(String description) { this.description = description; } public void setPassword(String password) { this.password = password; } public void setUser(String user) { this.user = user; } public void setDebug(boolean debug) { this.debug = debug; } public void setVerbose(boolean verbose) { this.verbose = verbose; } public void setThreadFactory(JdbcThreadFactory f) { this.threadFactory = f; } public PrintWriter getLogWriter() { return log; } public void setLogWriter(PrintWriter out) { log = (Logger) out; } /** * shutdown is a placeholder for datasources which should shut down * any pools which they maintain. */ public void shutdown(boolean force) { } public void setLoginTimeout(int seconds) { loginTimeout = seconds; } public int getLoginTimeout() { return loginTimeout; } /** * Methods inherited from referenceable */ public Reference getReference() throws NamingException { // Note that we use getClass().getName() to provide the factory // class name. It is assumed that this class, and all of its // descendants are their own factories. Reference ref = new Reference(getClass().getName(), getClass().getName(), null); ref.add(new StringRefAddr("user", getUser())); ref.add(new StringRefAddr("password", getPassword())); ref.add(new StringRefAddr("description", getDescription())); ref.add( new StringRefAddr( "loginTimeout", Integer.toString(getLoginTimeout()))); log.debug("CoreDataSource:getReference object returned"); return ref; } /** * Methods inherited from ObjectFactory */ public Object getObjectInstance( Object refObj, Name name, Context nameCtx, Hashtable env) throws Exception { Reference ref = (Reference) refObj; this.setUser((String) ref.get("user").getContent()); this.setPassword((String) ref.get("password").getContent()); this.setDescription((String) ref.get("description").getContent()); this.setLoginTimeout( Integer.parseInt((String) ref.get("loginTimeout").getContent())); log.debug("CoreDataSource:getObjectInstance instance created"); return this; } public String toString() { StringBuffer sb = new StringBuffer(); sb.append("CoreDataSource :\n"); sb.append(" debug =<"+this.debug+">\n"); sb.append(" description =<"+this.description+">\n"); sb.append(" login time out =<"+this.loginTimeout+">\n"); sb.append(" user =<"+this.user+">\n"); sb.append(" verbose =<"+this.verbose+">\n"); return sb.toString(); } } xapool-1.5.0-src/src/org/enhydra/jdbc/core/CorePreparedStatement.java0000644000175000017500000003735710235646676025545 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.core; import org.enhydra.jdbc.util.Logger; import org.enhydra.jdbc.util.JdbcUtil; import java.io.InputStream; import java.io.Reader; import java.math.BigDecimal; import java.sql.Array; import java.sql.Blob; import java.sql.Clob; import java.sql.Connection; import java.sql.Date; import java.sql.PreparedStatement; import java.sql.Ref; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.SQLWarning; import java.sql.Time; import java.sql.Timestamp; import java.util.Calendar; /** * A very simple implementation of PreparedStatement. When created * it is supplied with another PreparedStatement to which all * of this class' methods delegate their work. */ public abstract class CorePreparedStatement extends JdbcUtil implements PreparedStatement { public PreparedStatement ps; // the PreparedStatement which does most of the work. public void setLogger(Logger alog) { log = alog; } public void addBatch() throws SQLException { //preInvoke(); try { ps.addBatch(); } catch (SQLException e) { catchInvoke(e); } } public void clearParameters() throws SQLException { //preInvoke(); try { ps.clearParameters(); } catch (SQLException e) { catchInvoke(e); } } public boolean execute() throws SQLException { //preInvoke(); try { return ps.execute(); } catch (SQLException e) { catchInvoke(e); } return false; } public ResultSet executeQuery() throws SQLException { //preInvoke(); try { return ps.executeQuery(); } catch (SQLException e) { catchInvoke(e); } return null; } public int executeUpdate() throws SQLException { //preInvoke(); try { return ps.executeUpdate(); } catch (SQLException e) { catchInvoke(e); } return 0; } public ResultSetMetaData getMetaData() throws SQLException { //preInvoke(); try { return ps.getMetaData(); } catch (SQLException e) { catchInvoke(e); } return null; } public void setArray(int i, Array x) throws SQLException { //preInvoke(); try { ps.setArray(i, x); } catch (SQLException e) { catchInvoke(e); } } public void setAsciiStream(int parameterIndex, InputStream x, int length) throws SQLException { //preInvoke(); try { ps.setAsciiStream(parameterIndex, x, length); } catch (SQLException e) { catchInvoke(e); } } public void setBigDecimal(int parameterIndex, BigDecimal x) throws SQLException { //preInvoke(); try { ps.setBigDecimal(parameterIndex, x); } catch (SQLException e) { catchInvoke(e); } } public void setBinaryStream(int parameterIndex, InputStream x, int length) throws SQLException { //preInvoke(); try { ps.setBinaryStream(parameterIndex, x, length); } catch (SQLException e) { catchInvoke(e); } } public void setBlob(int i, Blob x) throws SQLException { //preInvoke(); try { ps.setBlob(i, x); } catch (SQLException e) { catchInvoke(e); } } public void setBoolean(int parameterIndex, boolean x) throws SQLException { //preInvoke(); try { ps.setBoolean(parameterIndex, x); } catch (SQLException e) { catchInvoke(e); } } public void setByte(int parameterIndex, byte x) throws SQLException { //preInvoke(); try { ps.setByte(parameterIndex, x); } catch (SQLException e) { catchInvoke(e); } } public void setBytes(int parameterIndex, byte x[]) throws SQLException { //preInvoke(); try { ps.setBytes(parameterIndex, x); } catch (SQLException e) { catchInvoke(e); } } public void setCharacterStream( int parameterIndex, Reader reader, int length) throws SQLException { //preInvoke(); try { ps.setCharacterStream(parameterIndex, reader, length); } catch (SQLException e) { catchInvoke(e); } } public void setClob(int i, Clob x) throws SQLException { //preInvoke(); try { ps.setClob(i, x); } catch (SQLException e) { catchInvoke(e); } } public void setDate(int parameterIndex, Date x) throws SQLException { //preInvoke(); try { ps.setDate(parameterIndex, x); } catch (SQLException e) { catchInvoke(e); } } public void setDate(int parameterIndex, Date x, Calendar cal) throws SQLException { //preInvoke(); try { ps.setDate(parameterIndex, x, cal); } catch (SQLException e) { catchInvoke(e); } } public void setDouble(int parameterIndex, double x) throws SQLException { //preInvoke(); try { ps.setDouble(parameterIndex, x); } catch (SQLException e) { catchInvoke(e); } } public void setFloat(int parameterIndex, float x) throws SQLException { //preInvoke(); try { ps.setFloat(parameterIndex, x); } catch (SQLException e) { catchInvoke(e); } } public void setInt(int parameterIndex, int x) throws SQLException { //preInvoke(); try { ps.setInt(parameterIndex, x); } catch (SQLException e) { catchInvoke(e); } } public void setLong(int parameterIndex, long x) throws SQLException { //preInvoke(); try { ps.setLong(parameterIndex, x); } catch (SQLException e) { catchInvoke(e); } } public void setNull(int parameterIndex, int sqlType) throws SQLException { //preInvoke(); try { ps.setNull(parameterIndex, sqlType); } catch (SQLException e) { catchInvoke(e); } } public void setNull(int paramIndex, int sqlType, String typeName) throws SQLException { //preInvoke(); try { ps.setNull(paramIndex, sqlType, typeName); } catch (SQLException e) { catchInvoke(e); } } public void setObject(int parameterIndex, Object x) throws SQLException { //preInvoke(); try { ps.setObject(parameterIndex, x); } catch (SQLException e) { catchInvoke(e); } } public void setObject(int parameterIndex, Object x, int targetSqlType) throws SQLException { //preInvoke(); try { ps.setObject(parameterIndex, x, targetSqlType); } catch (SQLException e) { catchInvoke(e); } } public void setObject( int parameterIndex, Object x, int targetSqlType, int scale) throws SQLException { //preInvoke(); try { ps.setObject(parameterIndex, x, targetSqlType, scale); } catch (SQLException e) { catchInvoke(e); } } public void setRef(int i, Ref x) throws SQLException { //preInvoke(); try { ps.setRef(i, x); } catch (SQLException e) { catchInvoke(e); } } public void setShort(int parameterIndex, short x) throws SQLException { //preInvoke(); try { ps.setShort(parameterIndex, x); } catch (SQLException e) { catchInvoke(e); } } public void setString(int parameterIndex, String x) throws SQLException { //preInvoke(); try { ps.setString(parameterIndex, x); } catch (SQLException e) { catchInvoke(e); } } public void setTime(int parameterIndex, Time x) throws SQLException { //preInvoke(); try { ps.setTime(parameterIndex, x); } catch (SQLException e) { catchInvoke(e); } } public void setTime(int parameterIndex, Time x, Calendar cal) throws SQLException { //preInvoke(); try { ps.setTime(parameterIndex, x, cal); } catch (SQLException e) { catchInvoke(e); } } public void setTimestamp(int parameterIndex, Timestamp x) throws SQLException { //preInvoke(); try { ps.setTimestamp(parameterIndex, x); } catch (SQLException e) { catchInvoke(e); } } public void setTimestamp(int parameterIndex, Timestamp x, Calendar cal) throws SQLException { //preInvoke(); try { ps.setTimestamp(parameterIndex, x, cal); } catch (SQLException e) { catchInvoke(e); } } public void setUnicodeStream(int parameterIndex, InputStream x, int length) throws SQLException { //preInvoke(); try { ps.setUnicodeStream(parameterIndex, x, length); } catch (SQLException e) { catchInvoke(e); } } // From Statement public void close() throws SQLException { if (ps != null) { ps.close(); } } public int[] executeBatch() throws SQLException { //preInvoke(); try { return ps.executeBatch(); } catch (SQLException e) { catchInvoke(e); } return null; } public int getMaxFieldSize() throws SQLException { //preInvoke(); try { return ps.getMaxFieldSize(); } catch (SQLException e) { catchInvoke(e); } return 0; } public void setMaxFieldSize(int max) throws SQLException { //preInvoke(); try { ps.setMaxFieldSize(max); } catch (SQLException e) { catchInvoke(e); } } public int getMaxRows() throws SQLException { //preInvoke(); try { return ps.getMaxRows(); } catch (SQLException e) { catchInvoke(e); } return 0; } public void setMaxRows(int max) throws SQLException { //preInvoke(); try { ps.setMaxRows(max); } catch (SQLException e) { catchInvoke(e); } } public void setEscapeProcessing(boolean enable) throws SQLException { //preInvoke(); try { ps.setEscapeProcessing(enable); } catch (SQLException e) { catchInvoke(e); } } public int getQueryTimeout() throws SQLException { //preInvoke(); try { return ps.getQueryTimeout(); } catch (SQLException e) { catchInvoke(e); } return 0; } public void setQueryTimeout(int seconds) throws SQLException { //preInvoke(); try { ps.setQueryTimeout(seconds); } catch (SQLException e) { catchInvoke(e); } } public void cancel() throws SQLException { //preInvoke(); try { ps.cancel(); } catch (SQLException e) { catchInvoke(e); } } public SQLWarning getWarnings() throws SQLException { //preInvoke(); try { return ps.getWarnings(); } catch (SQLException e) { catchInvoke(e); } return null; } public void clearWarnings() throws SQLException { //preInvoke(); try { ps.clearWarnings(); } catch (SQLException e) { catchInvoke(e); } } public void setCursorName(String name) throws SQLException { //preInvoke(); try { ps.setCursorName(name); } catch (SQLException e) { catchInvoke(e); } } public ResultSet getResultSet() throws SQLException { //preInvoke(); try { return ps.getResultSet(); } catch (SQLException e) { catchInvoke(e); } return null; } public int getUpdateCount() throws SQLException { //preInvoke(); try { return ps.getUpdateCount(); } catch (SQLException e) { catchInvoke(e); } return 0; } public boolean getMoreResults() throws SQLException { //preInvoke(); try { return ps.getMoreResults(); } catch (SQLException e) { catchInvoke(e); } return false; } public void setFetchDirection(int direction) throws SQLException { //preInvoke(); try { ps.setFetchDirection(direction); } catch (SQLException e) { catchInvoke(e); } } public int getFetchDirection() throws SQLException { //preInvoke(); try { return ps.getFetchDirection(); } catch (SQLException e) { catchInvoke(e); } return 0; } public void setFetchSize(int rows) throws SQLException { //preInvoke(); try { ps.setFetchSize(rows); } catch (SQLException e) { catchInvoke(e); } } public int getFetchSize() throws SQLException { //preInvoke(); try { return ps.getFetchSize(); } catch (SQLException e) { catchInvoke(e); } return 0; } public int getResultSetConcurrency() throws SQLException { //preInvoke(); try { return ps.getResultSetConcurrency(); } catch (SQLException e) { catchInvoke(e); } return 0; } public int getResultSetType() throws SQLException { //preInvoke(); try { return ps.getResultSetType(); } catch (SQLException e) { catchInvoke(e); } return 0; } public Connection getConnection() throws SQLException { //preInvoke(); try { return ps.getConnection(); } catch (SQLException e) { catchInvoke(e); } return null; } public void clearBatch() throws SQLException { //preInvoke(); try { ps.clearBatch(); } catch (SQLException e) { catchInvoke(e); } } public void addBatch(String s) throws SQLException { //preInvoke(); try { ps.addBatch(s); } catch (SQLException e) { catchInvoke(e); } } public boolean execute(String s) throws SQLException { //preInvoke(); try { return ps.execute(s); } catch (SQLException e) { catchInvoke(e); } return false; } public ResultSet executeQuery(String s) throws SQLException { //preInvoke(); try { return ps.executeQuery(s); } catch (SQLException e) { catchInvoke(e); } return null; } public int executeUpdate(String s) throws SQLException { //preInvoke(); try { return ps.executeUpdate(s); } catch (SQLException e) { catchInvoke(e); } return 0; } /* * Add those following methods to compile on JDK 1.4. * Instead those methods are defined in the java.sql.PreparedStatement interface * only since JDK 1.4. */ // java.sql.Statements methods public boolean execute(String sql, int autoGeneratedKeys) throws SQLException { try { return ps.execute(sql, autoGeneratedKeys); } catch (SQLException e) { catchInvoke(e); } return false; } public boolean execute(String sql, int[] columnIndexes) throws SQLException { try { return ps.execute(sql, columnIndexes); } catch (SQLException e) { catchInvoke(e); } return false; } public boolean execute(String sql, String[] columnNames) throws SQLException { try { return ps.execute(sql, columnNames); } catch (SQLException e) { catchInvoke(e); } return false; } public int executeUpdate(String sql, int autoGeneratedKeys) throws SQLException { try { return ps.executeUpdate(sql, autoGeneratedKeys); } catch (SQLException e) { catchInvoke(e); } return 0; } public int executeUpdate(String sql, int[] columnIndexes) throws SQLException { try { return ps.executeUpdate(sql, columnIndexes); } catch (SQLException e) { catchInvoke(e); } return 0; } public int executeUpdate(String sql, String[] columnNames) throws SQLException { try { return ps.executeUpdate(sql, columnNames); } catch (SQLException e) { catchInvoke(e); } return 0; } public java.sql.ResultSet getGeneratedKeys() throws SQLException { try { return ps.getGeneratedKeys(); } catch (SQLException e) { catchInvoke(e); } return null; } public boolean getMoreResults(int current) throws SQLException { try { return ps.getMoreResults(current); } catch (SQLException e) { catchInvoke(e); } return false; } public int getResultSetHoldability() throws SQLException { try { return ps.getResultSetHoldability(); } catch (SQLException e) { catchInvoke(e); } return 0; } // java.sql.PreparedStatement methods public java.sql.ParameterMetaData getParameterMetaData() throws SQLException { try { return ps.getParameterMetaData(); } catch (SQLException e) { catchInvoke(e); } return null; } public void setURL(int parameterIndex, java.net.URL x) throws SQLException { try { ps.setURL(parameterIndex, x); } catch (SQLException e) { catchInvoke(e); } } /** * Methods used to do some works before and during the catch * clause, to prevent the pool that a connection is broken. */ abstract public void preInvoke() throws SQLException; abstract public void catchInvoke(SQLException e) throws SQLException; }xapool-1.5.0-src/src/org/enhydra/jdbc/core/CoreStatement.java0000644000175000017500000002132110235646676024042 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.core; import org.enhydra.jdbc.util.JdbcUtil; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.SQLWarning; import java.sql.Statement; /** * A very simple implementation of Statement. When created * it is supplied with another Statement to which all * of this class' methods delegate their work. */ public abstract class CoreStatement extends JdbcUtil implements Statement { protected Statement statement; // the Statement which does most of the work. public void addBatch(String s) throws SQLException { //preInvoke(); try { statement.addBatch(s); } catch (SQLException e) { catchInvoke(e); } } public void cancel() throws SQLException { //preInvoke(); try { statement.cancel(); } catch (SQLException e) { catchInvoke(e); } } public void clearBatch() throws SQLException { //preInvoke(); try { statement.clearBatch(); } catch (SQLException e) { catchInvoke(e); } } public void clearWarnings() throws SQLException { //preInvoke(); try { statement.clearWarnings(); } catch (SQLException e) { catchInvoke(e); } } public void close() throws SQLException { if (statement != null) { statement.close(); } } public boolean execute(String s) throws SQLException { //preInvoke(); try { return statement.execute(s); } catch (SQLException e) { catchInvoke(e); } return false; } public int[] executeBatch() throws SQLException { //preInvoke(); try { return statement.executeBatch(); } catch (SQLException e) { catchInvoke(e); } return null; } public ResultSet executeQuery(String s) throws SQLException { //preInvoke(); try { return statement.executeQuery(s); } catch (SQLException e) { catchInvoke(e); } return null; } public int executeUpdate(String s) throws SQLException { //preInvoke(); try { return statement.executeUpdate(s); } catch (SQLException e) { catchInvoke(e); } return 0; } public Connection getConnection() throws SQLException { //preInvoke(); try { return statement.getConnection(); } catch (SQLException e) { catchInvoke(e); } return null; } public int getFetchDirection() throws SQLException { //preInvoke(); try { return statement.getFetchDirection(); } catch (SQLException e) { catchInvoke(e); } return 0; } public int getFetchSize() throws SQLException { //preInvoke(); try { return statement.getFetchSize(); } catch (SQLException e) { catchInvoke(e); } return 0; } public ResultSet getGeneratedKeys() throws SQLException { //preInvoke(); try { return statement.getGeneratedKeys(); } catch (SQLException e) { catchInvoke(e); } return null; } public int getMaxFieldSize() throws SQLException { //preInvoke(); try { return statement.getMaxFieldSize(); } catch (SQLException e) { catchInvoke(e); } return 0; } public int getMaxRows() throws SQLException { //preInvoke(); try { return statement.getMaxRows(); } catch (SQLException e) { catchInvoke(e); } return 0; } public boolean getMoreResults() throws SQLException { //preInvoke(); try { return statement.getMoreResults(); } catch (SQLException e) { catchInvoke(e); } return false; } public int getQueryTimeout() throws SQLException { //preInvoke(); try { return statement.getQueryTimeout(); } catch (SQLException e) { catchInvoke(e); } return 0; } public ResultSet getResultSet() throws SQLException { //preInvoke(); try { return statement.getResultSet(); } catch (SQLException e) { catchInvoke(e); } return null; } public int getResultSetConcurrency() throws SQLException { //preInvoke(); try { return statement.getResultSetConcurrency(); } catch (SQLException e) { catchInvoke(e); } return 0; } public int getResultSetType() throws SQLException { //preInvoke(); try { return statement.getResultSetType(); } catch (SQLException e) { catchInvoke(e); } return 0; } public int getUpdateCount() throws SQLException { //preInvoke(); try { return statement.getUpdateCount(); } catch (SQLException e) { catchInvoke(e); } return 0; } public SQLWarning getWarnings() throws SQLException { //preInvoke(); try { return statement.getWarnings(); } catch (SQLException e) { catchInvoke(e); } return null; } public void setCursorName(String name) throws SQLException { //preInvoke(); try { statement.setCursorName(name); } catch (SQLException e) { catchInvoke(e); } } public void setEscapeProcessing(boolean enable) throws SQLException { //preInvoke(); try { statement.setEscapeProcessing(enable); } catch (SQLException e) { catchInvoke(e); } } public void setFetchDirection(int direction) throws SQLException { //preInvoke(); try { statement.setFetchDirection(direction); } catch (SQLException e) { catchInvoke(e); } } public void setFetchSize(int rows) throws SQLException { //preInvoke(); try { statement.setFetchSize(rows); } catch (SQLException e) { catchInvoke(e); } } public void setMaxFieldSize(int max) throws SQLException { //preInvoke(); try { statement.setMaxFieldSize(max); } catch (SQLException e) { catchInvoke(e); } } public void setMaxRows(int max) throws SQLException { //preInvoke(); try { statement.setMaxRows(max); } catch (SQLException e) { catchInvoke(e); } } public void setQueryTimeout(int seconds) throws SQLException { //preInvoke(); try { statement.setQueryTimeout(seconds); } catch (SQLException e) { catchInvoke(e); } } /* * Add those following methods to compile on JDK 1.4. * Instead those methods are defined in the java.sql.Statement interface * only since JDK 1.4. */ public boolean execute(String sql, int autoGeneratedKeys) throws SQLException { try { return statement.execute(sql, autoGeneratedKeys); } catch (SQLException e) { catchInvoke(e); } return false; } public boolean execute(String sql, int[] columnIndexes) throws SQLException { try { return statement.execute(sql, columnIndexes); } catch (SQLException e) { catchInvoke(e); } return false; } public boolean execute(String sql, String[] columnNames) throws SQLException { try { return statement.execute(sql, columnNames); } catch (SQLException e) { catchInvoke(e); } return false; } public int executeUpdate(String sql, int autoGeneratedKeys) throws SQLException { try { return statement.executeUpdate(sql, autoGeneratedKeys); } catch (SQLException e) { catchInvoke(e); } return 0; } public int executeUpdate(String sql, int[] columnIndexes) throws SQLException { try { return statement.executeUpdate(sql, columnIndexes); } catch (SQLException e) { catchInvoke(e); } return 0; } public int executeUpdate(String sql, String[] columnNames) throws SQLException { try { return statement.executeUpdate(sql, columnNames); } catch (SQLException e) { catchInvoke(e); } return 0; } public boolean getMoreResults(int current) throws SQLException { try { return statement.getMoreResults(current); } catch (SQLException e) { catchInvoke(e); } return false; } public int getResultSetHoldability() throws SQLException { try { return statement.getResultSetHoldability(); } catch (SQLException e) { catchInvoke(e); } return 0; } /** * Methods used to do some works before and during the catch * clause, to prevent the pool that a connection is broken. */ //abstract public void preInvoke() throws SQLException; abstract public void catchInvoke(SQLException e) throws SQLException; }xapool-1.5.0-src/src/org/enhydra/jdbc/core/JdbcThreadFactory.java0000644000175000017500000000620010235646676024606 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.core; import java.sql.SQLException; /** * Generic interface for getting threads, modeled after Enhydra * ThreadClientService interface. This allows the JdbcLib code * to be portable across app servers. */ public interface JdbcThreadFactory { /** * Get a thread for the client. This thread will belong to the * client's thread group. * * @param target * the Runnable object that will use this thread. * @return * the Thread that the client can now use. */ public Thread getThread(Runnable target) throws SQLException; /** * Get a thread for the client. This thread will belong to the * client's thread group. * * @param target * the Runnable object that will use this thread. * @param name * the name of the thread. If a null value is given * an arbitrary name will be provided * @return * the Thread that the client can now use. */ public Thread getThread(Runnable target, String name) throws SQLException; /** * Get a thread for the client. This thread will belong to the * the specified thread group, or the client's thread group if none * is specified. * * @param group * the ThreadGroup to which the new thread will be added. If * null the new thread is added to the same thread * group as the currently executing thread. * @param target * the Runnable object that will use this thread. * @return * the Thread that the client can now use. */ public Thread getThread(ThreadGroup group, Runnable target) throws SQLException; /** * Get a thread for the client. This thread will belong to the * the specified thread group, or the client's thread group if none * is specified. * * @param group * the ThreadGroup to which the new thread will be added. If * null the new thread is added to the same thread * group as the currently executing thread. * @param target * the Runnable object that will use this thread. * @param name * the String name ofthe new thread. If a null value * is given an arbitrary name will be provided. * @return * the Thread that the client can now use. */ public Thread getThread(ThreadGroup group, Runnable target, String name) throws SQLException; } xapool-1.5.0-src/src/org/enhydra/jdbc/core/CoreCallableStatement.java~0000644000175000017500000006467210235646676025700 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.core; import org.enhydra.jdbc.util.JdbcUtil; import java.io.InputStream; import java.io.Reader; import java.math.BigDecimal; import java.sql.Array; import java.sql.Blob; import java.sql.Clob; import java.sql.Connection; import java.sql.Date; import java.sql.CallableStatement; import java.sql.Ref; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.SQLWarning; import java.sql.Time; import java.sql.Timestamp; import java.util.Calendar; /** * A very simple implementation of Statement. When created * it is supplied with another Statement to which all * of this class' methods delegate their work. */ public abstract class CoreCallableStatement extends JdbcUtil implements CallableStatement { // the CallableStatement which does most of the work. protected CallableStatement cs; public Array getArray(int i) throws SQLException { preInvoke(); try { return cs.getArray(i); } catch (SQLException e) { catchInvoke(e); } return null; } public java.math.BigDecimal getBigDecimal(int i) throws SQLException { preInvoke(); try { return cs.getBigDecimal(i); } catch (SQLException e) { catchInvoke(e); } return null; } public java.math.BigDecimal getBigDecimal(int i, int scale) throws SQLException { preInvoke(); try { return cs.getBigDecimal(i); } catch (SQLException e) { catchInvoke(e); } return null; } public Blob getBlob(int i) throws SQLException { preInvoke(); try { return cs.getBlob(i); } catch (SQLException e) { catchInvoke(e); } return null; } public boolean getBoolean(int i) throws SQLException { preInvoke(); try { return cs.getBoolean(i); } catch (SQLException e) { catchInvoke(e); } return false; } public byte getByte(int i) throws SQLException { preInvoke(); try { return cs.getByte(i); } catch (SQLException e) { catchInvoke(e); } return 0; } public byte[] getBytes(int i) throws SQLException { preInvoke(); try { return cs.getBytes(i); } catch (SQLException e) { catchInvoke(e); } return null; } public Clob getClob(int i) throws SQLException { preInvoke(); try { return cs.getClob(i); } catch (SQLException e) { catchInvoke(e); } return null; } public Date getDate(int i) throws SQLException { preInvoke(); try { return cs.getDate(i); } catch (SQLException e) { catchInvoke(e); } return null; } public Date getDate(int i, java.util.Calendar cal) throws SQLException { preInvoke(); try { return cs.getDate(i, cal); } catch (SQLException e) { catchInvoke(e); } return null; } public double getDouble(int i) throws SQLException { preInvoke(); try { return cs.getDouble(i); } catch (SQLException e) { catchInvoke(e); } return 0; } public float getFloat(int i) throws SQLException { preInvoke(); try { return cs.getFloat(i); } catch (SQLException e) { catchInvoke(e); } return 0; } public int getInt(int i) throws SQLException { preInvoke(); try { return cs.getInt(i); } catch (SQLException e) { catchInvoke(e); } return 0; } public long getLong(int i) throws SQLException { preInvoke(); try { return cs.getLong(i); } catch (SQLException e) { catchInvoke(e); } return 0; } public Object getObject(int i) throws SQLException { preInvoke(); try { return cs.getObject(i); } catch (SQLException e) { catchInvoke(e); } return null; } public Object getObject(int i, java.util.Map map) throws SQLException { preInvoke(); try { return cs.getObject(i, map); } catch (SQLException e) { catchInvoke(e); } return null; } public Ref getRef(int i) throws SQLException { preInvoke(); try { return cs.getRef(i); } catch (SQLException e) { catchInvoke(e); } return null; } public short getShort(int i) throws SQLException { preInvoke(); try { return cs.getShort(i); } catch (SQLException e) { catchInvoke(e); } return 0; } public java.lang.String getString(int i) throws SQLException { preInvoke(); try { return cs.getString(i); } catch (SQLException e) { catchInvoke(e); } return null; } public java.sql.Time getTime(int i) throws SQLException { preInvoke(); try { return cs.getTime(i); } catch (SQLException e) { catchInvoke(e); } return null; } public java.sql.Time getTime(int i, java.util.Calendar cal) throws SQLException { preInvoke(); try { return cs.getTime(i, cal); } catch (SQLException e) { catchInvoke(e); } return null; } public java.sql.Timestamp getTimestamp(int i) throws SQLException { preInvoke(); try { return cs.getTimestamp(i); } catch (SQLException e) { catchInvoke(e); } return null; } public java.sql.Timestamp getTimestamp(int i, java.util.Calendar cal) throws SQLException { preInvoke(); try { return cs.getTimestamp(i, cal); } catch (SQLException e) { catchInvoke(e); } return null; } public void registerOutParameter(int i, int sqlType) throws SQLException { preInvoke(); try { cs.registerOutParameter(i, sqlType); } catch (SQLException e) { catchInvoke(e); } } public void registerOutParameter(int i, int sqlType, int scale) throws SQLException { preInvoke(); try { cs.registerOutParameter(i, sqlType, scale); } catch (SQLException e) { catchInvoke(e); } } public void registerOutParameter(int i, int sqlType, String typeName) throws SQLException { preInvoke(); try { cs.registerOutParameter(i, sqlType, typeName); } catch (SQLException e) { catchInvoke(e); } } public boolean wasNull() throws SQLException { preInvoke(); try { return cs.wasNull(); } catch (SQLException e) { catchInvoke(e); } return false; } public void addBatch() throws SQLException { preInvoke(); try { cs.addBatch(); } catch (SQLException e) { catchInvoke(e); } } public void clearParameters() throws SQLException { preInvoke(); try { cs.clearParameters(); } catch (SQLException e) { catchInvoke(e); } } public boolean execute() throws SQLException { preInvoke(); try { return cs.execute(); } catch (SQLException e) { catchInvoke(e); } return false; } public ResultSet executeQuery() throws SQLException { preInvoke(); try { return cs.executeQuery(); } catch (SQLException e) { catchInvoke(e); } return null; } public int executeUpdate() throws SQLException { preInvoke(); try { return cs.executeUpdate(); } catch (SQLException e) { catchInvoke(e); } return 0; } public ResultSetMetaData getMetaData() throws SQLException { preInvoke(); try { return cs.getMetaData(); } catch (SQLException e) { catchInvoke(e); } return null; } public void setArray(int i, Array x) throws SQLException { preInvoke(); try { cs.setArray(i, x); } catch (SQLException e) { catchInvoke(e); } } public void setAsciiStream(int parameterIndex, InputStream x, int length) throws SQLException { preInvoke(); try { cs.setAsciiStream(parameterIndex, x, length); } catch (SQLException e) { catchInvoke(e); } } public void setBigDecimal(int parameterIndex, BigDecimal x) throws SQLException { preInvoke(); try { cs.setBigDecimal(parameterIndex, x); } catch (SQLException e) { catchInvoke(e); } } public void setBinaryStream(int parameterIndex, InputStream x, int length) throws SQLException { preInvoke(); try { cs.setBinaryStream(parameterIndex, x, length); } catch (SQLException e) { catchInvoke(e); } } public void setBlob(int i, Blob x) throws SQLException { preInvoke(); try { cs.setBlob(i, x); } catch (SQLException e) { catchInvoke(e); } } public void setBoolean(int parameterIndex, boolean x) throws SQLException { preInvoke(); try { cs.setBoolean(parameterIndex, x); } catch (SQLException e) { catchInvoke(e); } } public void setByte(int parameterIndex, byte x) throws SQLException { preInvoke(); try { cs.setByte(parameterIndex, x); } catch (SQLException e) { catchInvoke(e); } } public void setBytes(int parameterIndex, byte x[]) throws SQLException { preInvoke(); try { cs.setBytes(parameterIndex, x); } catch (SQLException e) { catchInvoke(e); } } public void setCharacterStream( int parameterIndex, Reader reader, int length) throws SQLException { preInvoke(); try { cs.setCharacterStream(parameterIndex, reader, length); } catch (SQLException e) { catchInvoke(e); } } public void setClob(int i, Clob x) throws SQLException { preInvoke(); try { cs.setClob(i, x); } catch (SQLException e) { catchInvoke(e); } } public void setDate(int parameterIndex, Date x) throws SQLException { preInvoke(); try { cs.setDate(parameterIndex, x); } catch (SQLException e) { catchInvoke(e); } } public void setDate(int parameterIndex, Date x, Calendar cal) throws SQLException { preInvoke(); try { cs.setDate(parameterIndex, x, cal); } catch (SQLException e) { catchInvoke(e); } } public void setDouble(int parameterIndex, double x) throws SQLException { preInvoke(); try { cs.setDouble(parameterIndex, x); } catch (SQLException e) { catchInvoke(e); } } public void setFloat(int parameterIndex, float x) throws SQLException { preInvoke(); try { cs.setFloat(parameterIndex, x); } catch (SQLException e) { catchInvoke(e); } } public void setInt(int parameterIndex, int x) throws SQLException { preInvoke(); try { cs.setInt(parameterIndex, x); } catch (SQLException e) { catchInvoke(e); } } public void setLong(int parameterIndex, long x) throws SQLException { preInvoke(); try { cs.setLong(parameterIndex, x); } catch (SQLException e) { catchInvoke(e); } } public void setNull(int parameterIndex, int sqlType) throws SQLException { preInvoke(); try { cs.setNull(parameterIndex, sqlType); } catch (SQLException e) { catchInvoke(e); } } public void setNull(int paramIndex, int sqlType, String typeName) throws SQLException { preInvoke(); try { cs.setNull(paramIndex, sqlType, typeName); } catch (SQLException e) { catchInvoke(e); } } public void setObject(int parameterIndex, Object x) throws SQLException { preInvoke(); try { cs.setObject(parameterIndex, x); } catch (SQLException e) { catchInvoke(e); } } public void setObject(int parameterIndex, Object x, int targetSqlType) throws SQLException { preInvoke(); try { cs.setObject(parameterIndex, x, targetSqlType); } catch (SQLException e) { catchInvoke(e); } } public void setObject( int parameterIndex, Object x, int targetSqlType, int scale) throws SQLException { preInvoke(); try { cs.setObject(parameterIndex, x, targetSqlType, scale); } catch (SQLException e) { catchInvoke(e); } } public void setRef(int i, Ref x) throws SQLException { preInvoke(); try { cs.setRef(i, x); } catch (SQLException e) { catchInvoke(e); } } public void setShort(int parameterIndex, short x) throws SQLException { preInvoke(); try { cs.setShort(parameterIndex, x); } catch (SQLException e) { catchInvoke(e); } } public void setString(int parameterIndex, String x) throws SQLException { preInvoke(); try { cs.setString(parameterIndex, x); } catch (SQLException e) { catchInvoke(e); } } public void setTime(int parameterIndex, Time x) throws SQLException { preInvoke(); try { cs.setTime(parameterIndex, x); } catch (SQLException e) { catchInvoke(e); } } public void setTime(int parameterIndex, Time x, Calendar cal) throws SQLException { preInvoke(); try { cs.setTime(parameterIndex, x, cal); } catch (SQLException e) { catchInvoke(e); } } public void setTimestamp(int parameterIndex, Timestamp x) throws SQLException { preInvoke(); try { cs.setTimestamp(parameterIndex, x); } catch (SQLException e) { catchInvoke(e); } } public void setTimestamp(int parameterIndex, Timestamp x, Calendar cal) throws SQLException { preInvoke(); try { cs.setTimestamp(parameterIndex, x, cal); } catch (SQLException e) { catchInvoke(e); } } public void setUnicodeStream(int parameterIndex, InputStream x, int length) throws SQLException { preInvoke(); try { cs.setUnicodeStream(parameterIndex, x, length); } catch (SQLException e) { catchInvoke(e); } } // From Statement public void close() throws SQLException { if (cs != null) { cs.close(); } } public int[] executeBatch() throws SQLException { preInvoke(); try { return cs.executeBatch(); } catch (SQLException e) { catchInvoke(e); } return null; } public int getMaxFieldSize() throws SQLException { preInvoke(); try { return cs.getMaxFieldSize(); } catch (SQLException e) { catchInvoke(e); } return 0; } public void setMaxFieldSize(int max) throws SQLException { preInvoke(); try { cs.setMaxFieldSize(max); } catch (SQLException e) { catchInvoke(e); } } public int getMaxRows() throws SQLException { preInvoke(); try { return cs.getMaxRows(); } catch (SQLException e) { catchInvoke(e); } return 0; } public void setMaxRows(int max) throws SQLException { preInvoke(); try { cs.setMaxRows(max); } catch (SQLException e) { catchInvoke(e); } } public void setEscapeProcessing(boolean enable) throws SQLException { preInvoke(); try { cs.setEscapeProcessing(enable); } catch (SQLException e) { catchInvoke(e); } } public int getQueryTimeout() throws SQLException { preInvoke(); try { return cs.getQueryTimeout(); } catch (SQLException e) { catchInvoke(e); } return 0; } public void setQueryTimeout(int seconds) throws SQLException { preInvoke(); try { cs.setQueryTimeout(seconds); } catch (SQLException e) { catchInvoke(e); } } public void cancel() throws SQLException { preInvoke(); try { cs.cancel(); } catch (SQLException e) { catchInvoke(e); } } public SQLWarning getWarnings() throws SQLException { preInvoke(); try { return cs.getWarnings(); } catch (SQLException e) { catchInvoke(e); } return null; } public void clearWarnings() throws SQLException { preInvoke(); try { cs.clearWarnings(); } catch (SQLException e) { catchInvoke(e); } } public void setCursorName(String name) throws SQLException { preInvoke(); try { cs.setCursorName(name); } catch (SQLException e) { catchInvoke(e); } } public ResultSet getResultSet() throws SQLException { preInvoke(); try { return cs.getResultSet(); } catch (SQLException e) { catchInvoke(e); } return null; } public int getUpdateCount() throws SQLException { preInvoke(); try { return cs.getUpdateCount(); } catch (SQLException e) { catchInvoke(e); } return 0; } public boolean getMoreResults() throws SQLException { preInvoke(); try { return cs.getMoreResults(); } catch (SQLException e) { catchInvoke(e); } return false; } public void setFetchDirection(int direction) throws SQLException { preInvoke(); try { cs.setFetchDirection(direction); } catch (SQLException e) { catchInvoke(e); } } public int getFetchDirection() throws SQLException { preInvoke(); try { return cs.getFetchDirection(); } catch (SQLException e) { catchInvoke(e); } return 0; } public void setFetchSize(int rows) throws SQLException { preInvoke(); try { cs.setFetchSize(rows); } catch (SQLException e) { catchInvoke(e); } } public int getFetchSize() throws SQLException { preInvoke(); try { return cs.getFetchSize(); } catch (SQLException e) { catchInvoke(e); } return 0; } public int getResultSetConcurrency() throws SQLException { preInvoke(); try { return cs.getResultSetConcurrency(); } catch (SQLException e) { catchInvoke(e); } return 0; } public int getResultSetType() throws SQLException { preInvoke(); try { return cs.getResultSetType(); } catch (SQLException e) { catchInvoke(e); } return 0; } public Connection getConnection() throws SQLException { preInvoke(); try { return cs.getConnection(); } catch (SQLException e) { catchInvoke(e); } return null; } public void clearBatch() throws SQLException { preInvoke(); try { cs.clearBatch(); } catch (SQLException e) { catchInvoke(e); } } public void addBatch(String s) throws SQLException { preInvoke(); try { cs.addBatch(s); } catch (SQLException e) { catchInvoke(e); } } public boolean execute(String s) throws SQLException { preInvoke(); try { return cs.execute(s); } catch (SQLException e) { catchInvoke(e); } return false; } public ResultSet executeQuery(String s) throws SQLException { preInvoke(); try { return cs.executeQuery(s); } catch (SQLException e) { catchInvoke(e); } return null; } public int executeUpdate(String s) throws SQLException { preInvoke(); try { return cs.executeUpdate(s); } catch (SQLException e) { catchInvoke(e); } return 0; } /* * Add those following methods to compile on JDK 1.4. * Instead those methods are defined in the java.sql.CallableStatement interface * only since JDK 1.4. */ // java.sql.Statement methods public boolean execute(String sql, int autoGeneratedKeys) throws SQLException { throw new UnsupportedOperationException(); } public boolean execute(String sql, int[] columnIndexes) throws SQLException { throw new UnsupportedOperationException(); } public boolean execute(String sql, String[] columnNames) throws SQLException { throw new UnsupportedOperationException(); } public int executeUpdate(String sql, int autoGeneratedKeys) throws SQLException { throw new UnsupportedOperationException(); } public int executeUpdate(String sql, int[] columnIndexes) throws SQLException { throw new UnsupportedOperationException(); } public int executeUpdate(String sql, String[] columnNames) throws SQLException { throw new UnsupportedOperationException(); } public java.sql.ResultSet getGeneratedKeys() throws SQLException { throw new UnsupportedOperationException(); } public boolean getMoreResults(int current) throws SQLException { throw new UnsupportedOperationException(); } public int getResultSetHoldability() throws SQLException { throw new UnsupportedOperationException(); } // java.sql.PreparedStatement methods public java.sql.ParameterMetaData getParameterMetaData() throws SQLException { throw new UnsupportedOperationException(); } public void setURL(int parameterIndex, java.net.URL x) throws SQLException { throw new UnsupportedOperationException(); } // java.sql.CallableStatement methods public java.sql.Array getArray(String parameterName) throws SQLException { throw new UnsupportedOperationException(); } public java.math.BigDecimal getBigDecimal(String parameterName) throws SQLException { throw new UnsupportedOperationException(); } public java.sql.Blob getBlob(String parameterName) throws SQLException { throw new UnsupportedOperationException(); } public boolean getBoolean(String parameterName) throws SQLException { throw new UnsupportedOperationException(); } public byte getByte(String parameterName) throws SQLException { throw new UnsupportedOperationException(); } public byte[] getBytes(String parameterName) throws SQLException { throw new UnsupportedOperationException(); } public java.sql.Clob getClob(String parameterName) throws SQLException { throw new UnsupportedOperationException(); } public java.sql.Date getDate(String parameterName) throws SQLException { throw new UnsupportedOperationException(); } public java.sql.Date getDate(String parameterName, java.util.Calendar cal) throws SQLException { throw new UnsupportedOperationException(); } public double getDouble(String parameterName) throws SQLException { throw new UnsupportedOperationException(); } public float getFloat(String parameterName) throws SQLException { throw new UnsupportedOperationException(); } public int getInt(String parameterName) throws SQLException { throw new UnsupportedOperationException(); } public long getLong(String parameterName) throws SQLException { throw new UnsupportedOperationException(); } public Object getObject(String parameterName) throws SQLException { throw new UnsupportedOperationException(); } public Object getObject(String parameterName, java.util.Map map) throws SQLException { throw new UnsupportedOperationException(); } public java.sql.Ref getRef(String parameterName) throws SQLException { throw new UnsupportedOperationException(); } public short getShort(String parameterName) throws SQLException { throw new UnsupportedOperationException(); } public String getString(String parameterName) throws SQLException { throw new UnsupportedOperationException(); } public java.sql.Time getTime(String parameterName) throws SQLException { throw new UnsupportedOperationException(); } public java.sql.Time getTime(String parameterName, java.util.Calendar cal) throws SQLException { throw new UnsupportedOperationException(); } public java.sql.Timestamp getTimestamp(String parameterName) throws SQLException { throw new UnsupportedOperationException(); } public java.sql.Timestamp getTimestamp( String parameterName, java.util.Calendar cal) throws SQLException { throw new UnsupportedOperationException(); } public java.net.URL getURL(int parameterIndex) throws SQLException { throw new UnsupportedOperationException(); } public java.net.URL getURL(String parameterName) throws SQLException { throw new UnsupportedOperationException(); } public void registerOutParameter(String parameterName, int sqlType) throws SQLException { throw new UnsupportedOperationException(); } public void registerOutParameter( String parameterName, int sqlType, int scale) throws SQLException { throw new UnsupportedOperationException(); } public void registerOutParameter( String parameterName, int sqlType, String typeName) throws SQLException { throw new UnsupportedOperationException(); } public void setAsciiStream( String parameterName, java.io.InputStream x, int length) throws SQLException { throw new UnsupportedOperationException(); } public void setBigDecimal(String parameterName, java.math.BigDecimal x) throws SQLException { throw new UnsupportedOperationException(); } public void setBinaryStream( String parameterName, java.io.InputStream x, int length) throws SQLException { throw new UnsupportedOperationException(); } public void setBoolean(String parameterName, boolean x) throws SQLException { throw new UnsupportedOperationException(); } public void setByte(String parameterName, byte x) throws SQLException { throw new UnsupportedOperationException(); } public void setBytes(String parameterName, byte[] x) throws SQLException { throw new UnsupportedOperationException(); } public void setCharacterStream( String parameterName, java.io.Reader reader, int length) throws SQLException { throw new UnsupportedOperationException(); } public void setDate(String parameterName, java.sql.Date x) throws SQLException { throw new UnsupportedOperationException(); } public void setDate( String parameterName, java.sql.Date x, java.util.Calendar cal) throws SQLException { throw new UnsupportedOperationException(); } public void setDouble(String parameterName, double x) throws SQLException { throw new UnsupportedOperationException(); } public void setFloat(String parameterName, float x) throws SQLException { throw new UnsupportedOperationException(); } public void setInt(String parameterName, int x) throws SQLException { throw new UnsupportedOperationException(); } public void setLong(String parameterName, long x) throws SQLException { throw new UnsupportedOperationException(); } public void setNull(String parameterName, int sqlType) throws SQLException { throw new UnsupportedOperationException(); } public void setNull(String parameterName, int sqlType, String typeName) throws SQLException { throw new UnsupportedOperationException(); } public void setObject(String parameterName, Object x) throws SQLException { throw new UnsupportedOperationException(); } public void setObject(String parameterName, Object x, int targetSqlType) throws SQLException { throw new UnsupportedOperationException(); } public void setObject( String parameterName, Object x, int targetSqlType, int sacle) throws SQLException { throw new UnsupportedOperationException(); } public void setShort(String parameterName, short x) throws SQLException { throw new UnsupportedOperationException(); } public void setString(String parameterName, String x) throws SQLException { throw new UnsupportedOperationException(); } public void setTime(String parameterName, java.sql.Time x) throws SQLException { throw new UnsupportedOperationException(); } public void setTime( String parameterName, java.sql.Time x, java.util.Calendar cal) throws SQLException { throw new UnsupportedOperationException(); } public void setTimestamp(String parameterName, java.sql.Timestamp x) throws SQLException { throw new UnsupportedOperationException(); } public void setTimestamp( String parameterName, java.sql.Timestamp x, java.util.Calendar cal) throws SQLException { throw new UnsupportedOperationException(); } public void setURL(String parameterName, java.net.URL x) throws SQLException { throw new UnsupportedOperationException(); } /** * Methods used to do some works before and during the catch * clause, to prevent the pool that a connection is broken. */ abstract public void preInvoke() throws SQLException; abstract public void catchInvoke(SQLException e) throws SQLException; } xapool-1.5.0-src/src/org/enhydra/jdbc/informix/0000755000175000017500000000000010235646676021326 5ustar twernertwernerxapool-1.5.0-src/src/org/enhydra/jdbc/informix/InformixConnectionHandle.java0000644000175000017500000000401710235646676027122 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.informix; import org.enhydra.jdbc.standard.StandardConnectionHandle; import java.util.Hashtable; import java.sql.SQLException; import java.sql.Statement; public class InformixConnectionHandle extends StandardConnectionHandle { private int lockModeWait = 0; // The amound time to wait on a query or transaction public InformixConnectionHandle (InformixPooledConnection pooledCon, Hashtable preparedStatementCache, int preparedStmtCacheSize) { super (pooledCon, preparedStatementCache,preparedStmtCacheSize); } public synchronized void setLockModeToWait(int seconds) throws SQLException { if (lockModeWait != seconds) { if (seconds >0) { execute("SET LOCK MODE TO WAIT " + seconds); } else if (seconds == 0) { execute("SET LOCK MODE TO NOT WAIT "); } else { execute("SET LOCK MODE TO WAIT "); } lockModeWait = seconds; } } public synchronized void execute (String sql) throws SQLException { Statement stat = createStatement(); stat.execute(sql); } } xapool-1.5.0-src/src/org/enhydra/jdbc/informix/InformixConnectionPoolDataSource.java0000644000175000017500000000353310235646676030615 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.informix; import org.enhydra.jdbc.standard.StandardConnectionPoolDataSource; import javax.sql.PooledConnection; import java.sql.SQLException; public class InformixConnectionPoolDataSource extends StandardConnectionPoolDataSource { /** * Create a pooled connection using the default username and password. */ public PooledConnection getPooledConnection () throws SQLException { log.debug("InformixConnectionPoolDataSource:getPooledConnection(0) return a pooled connection"); return getPooledConnection (user, password); } /** * Create a informix pooled connection using the supplied username and password. */ public PooledConnection getPooledConnection (String user, String password) throws SQLException { log.debug("InformixConnectionPoolDataSource:getPooledConnection(2) return a pooled connection"); return new InformixPooledConnection (this, user, password); } } xapool-1.5.0-src/src/org/enhydra/jdbc/informix/InformixPooledConnection.java0000644000175000017500000000312410235646676027147 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.informix; import org.enhydra.jdbc.standard.StandardPooledConnection; import org.enhydra.jdbc.standard.StandardConnectionPoolDataSource; import javax.sql.ConnectionPoolDataSource; import java.sql.SQLException; public class InformixPooledConnection extends StandardPooledConnection { public InformixPooledConnection (ConnectionPoolDataSource dataSource, String user, String password) throws SQLException { super((StandardConnectionPoolDataSource)dataSource, user, password); } protected void newConnectionHandle() { connectionHandle = new InformixConnectionHandle (this, dataSource.getMasterPrepStmtCache(), dataSource.getPreparedStmtCacheSize()); } } xapool-1.5.0-src/src/org/enhydra/jdbc/informix/InformixXAConnection.java0000644000175000017500000000472710235646676026247 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.informix; import org.enhydra.jdbc.standard.StandardXAConnection; import java.sql.SQLException; public class InformixXAConnection extends StandardXAConnection { /** * Creates the first free connection. */ public InformixXAConnection (InformixXADataSource dataSource, String user, String password) throws SQLException { super (dataSource, user, password); // creates the first Connection object // Save the constructor parameters. this.dataSource = dataSource; curCon = new InformixXAStatefulConnection (dataSource, con);// wrap connection as a stateful connection // NOTE - the current connection is not made known to the data source // so it is not eligible for re-use. It only goes on the data source list // if it ever becomes associated with a global transaction. /* // get the timer thread if (dataSource.getThreadFactory() != null) { dataSource.log("StandardXAConnection: Getting thread from factory"); timerThread = dataSource.getThreadFactory().getThread(this); dataSource.log("StandardXAConnection: Got thread from factory"); } else { dataSource.log("StandardXAConnection: Getting thread from new Thread()"); timerThread = new Thread (this); // create the backgroup thread to check for timeouts } timerThread.start(); // start the timer thread //timerThread.suspend(); // and suspend until some timeouts get set up */ dataSource.log.debug("InformixXAConnection created"); } } xapool-1.5.0-src/src/org/enhydra/jdbc/informix/InformixXADataSource.java0000644000175000017500000000501710235646676026173 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.informix; import org.enhydra.jdbc.standard.StandardXADataSource; import javax.sql.XAConnection; import javax.sql.PooledConnection; import java.sql.SQLException; public class InformixXADataSource extends StandardXADataSource { /** * Creates an XA connection using the default username and password. */ public XAConnection getXAConnection () throws SQLException { log.debug("InformixXADataSource:getXAConnection(0) XA connection returned"); return getXAConnection (user, password); } /** * Creates an XA connection using the supplied username and password. */ public XAConnection getXAConnection (String user, String password) throws SQLException { InformixXAConnection xac = new InformixXAConnection (this, user, password); connectionCount++; log.debug("InformixXADataSource:getXAConnection(2) XA connection returned"); return xac; } /** * Create a pooled connection using the default username and password. */ public PooledConnection getPooledConnection () throws SQLException { log.debug("InformixConnectionPoolDataSource:getPooledConnection(0) return a pooled connection"); return getPooledConnection (user, password); } /** * Create a informix pooled connection using the supplied username and password. */ public PooledConnection getPooledConnection (String user, String password) throws SQLException { log.debug("InformixConnectionPoolDataSource:getPooledConnection(2) return a pooled connection"); return new InformixPooledConnection (this, user, password); } } xapool-1.5.0-src/src/org/enhydra/jdbc/informix/InformixXAStatefulConnection.java0000644000175000017500000000246710235646676027756 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.informix; import org.enhydra.jdbc.standard.StandardXAStatefulConnection; import java.sql.Connection; public class InformixXAStatefulConnection extends StandardXAStatefulConnection { /** * Creates a new stateful connection in the FREE state (NO_TRANSACTION) */ InformixXAStatefulConnection (InformixXADataSource dataSource, Connection con) { super(dataSource, con); } } xapool-1.5.0-src/src/org/enhydra/jdbc/instantdb/0000755000175000017500000000000010235646676021461 5ustar twernertwernerxapool-1.5.0-src/src/org/enhydra/jdbc/instantdb/IdbDataSource.java0000644000175000017500000000326010235646676024776 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.instantdb; import java.sql.SQLException; import java.sql.Driver; import org.enhydra.instantdb.jdbc.idbDriver; import org.enhydra.jdbc.standard.StandardDataSource; import javax.sql.DataSource; /** * Data source for creating IdbConnections. */ public class IdbDataSource extends StandardDataSource implements DataSource { /** * Constructors */ public IdbDataSource() throws SQLException { super(); super.setDriverName(idbDriver.class.getName()); } /** * Constructors */ public IdbDataSource(Driver driver) throws SQLException { super(driver); } public void setDriverName (String driverName) throws SQLException { throw new SQLException ("Cannot change driver name for IdbDataSource"); } } xapool-1.5.0-src/src/org/enhydra/jdbc/instantdb/IdbXAConnection.java0000644000175000017500000001124510235646676025276 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.instantdb; import org.enhydra.jdbc.standard.StandardXAConnection; import org.enhydra.jdbc.standard.StandardXADataSource; import org.enhydra.jdbc.standard.StandardXAStatefulConnection; import org.enhydra.instantdb.jdbc.ConnectionExtensions; import javax.transaction.xa.XAException; import javax.transaction.xa.Xid; import javax.transaction.xa.XAResource; import java.sql.SQLException; /** * Provides and InstantDB specific instance of StandardXAConnection. Almost all of * the required functionality is provided curtesy of the generic super class * which looks after most of the transaction state management. InstantDB's * own Transaction object is informed that it is part of a global transaction * and looks after the detail thereafter. */ public final class IdbXAConnection extends StandardXAConnection { /** * Creates the first free connection. */ public IdbXAConnection (StandardXADataSource dataSource, String user, String password) throws SQLException { super (dataSource, user, password); // creates the first Connection object } /** * Associates this XAConnection with a global transaction. This * is the only method which can associate the current connection * with a global transaction. It acts only on the current * connection which must have been previously established using * getConnection. */ public void start(Xid xid, int flags) throws XAException { doStart (xid, flags); // do state checks and set state curCon.commitOnPrepare = false; // we will do a REAL prepare ConnectionExtensions conExt = (ConnectionExtensions)curCon.con; // get the InstantDB connection conExt.startGlobalTransaction (xid); // associate the transaction with the global TX curCon = null; // no longer owned by this object con = null; // ditto } // We don't override "end" as all it does is change the state of a connection. /** * Prepares to perform a commit. */ public int prepare(Xid xid) throws XAException { StandardXAStatefulConnection stateCon = checkPreparedState (xid);// do generic state checking etc. ConnectionExtensions con = (ConnectionExtensions)stateCon.con; // get the InstantDB connection int status = con.prepare(); // prepare to commit if (status == XA_RDONLY) { // if transaction didn't update the database xaDataSource.freeConnection (xid, false); // free the connection } // if return status; } // We don't override commit or rollback. Connection.commit and // Connection.rollback already know that they're part of a global // transaction and will behave accordingly. /** * Checks to see if two XAResource objects correspond to the * same Resource Manager. This can go one better than its * super class as it can actually check the InstantDB database * objects. */ public boolean isSameRM(XAResource xares) throws XAException { if (super.isSameRM(xares)) { // if super class can figure it out return true; // then accept its conclusion } // if if (xares instanceof IdbXAConnection) { // if it's one of our wrappers IdbXAConnection xac = (IdbXAConnection)xares; // cast to something more convenient IdbXADataSource cmpds = (IdbXADataSource)xac.dataSource;// get the data source to compare IdbXADataSource ds = (IdbXADataSource)dataSource;// get our own data source if (ds.databaseId.equals (cmpds.databaseId)) { // if using the same database return true; // they're the same resource } // if } // if return false; } } xapool-1.5.0-src/src/org/enhydra/jdbc/instantdb/IdbXADataSource.java0000644000175000017500000000560510235646676025234 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.instantdb; import java.sql.SQLException; import java.util.Hashtable; import org.enhydra.instantdb.jdbc.ConnectionExtensions; import org.enhydra.jdbc.standard.StandardXADataSource; import javax.sql.XADataSource; import javax.sql.XAConnection; import javax.naming.Context; import javax.naming.Name; import javax.naming.Reference; /** * Data source for creating IdbXAConnections. */ public class IdbXADataSource extends StandardXADataSource implements XADataSource { String databaseId; // unique string identifying an InstantDB database instance /** * Constructor. */ public IdbXADataSource () { // Required by JNDI super(); } /** * Creates an XA connection using the default username and password. */ public XAConnection getXAConnection () throws SQLException { return getXAConnection (user, password); } /** * Creates an XA connection using the supplied username and password. */ public XAConnection getXAConnection (String user, String password) throws SQLException { IdbXAConnection xac = new IdbXAConnection (this, user, password); xac.setTransactionManager(transactionManager); if (databaseId == null) { // if this is the first connection databaseId = ((ConnectionExtensions)xac.con).getDatabaseId();// save the database id } // if connectionCount++; return xac; } /** * The factory interface. */ public Object getObjectInstance(Object refObj, Name name, Context nameCtx, Hashtable env) throws Exception { Reference ref = (Reference)refObj; if (ref.getClassName().equals(getClass().getName())) { IdbXADataSource dataSource = new IdbXADataSource (); dataSource.setDriverName((String)ref.get("driverName").getContent()); dataSource.setUrl((String)ref.get("url").getContent()); return dataSource; } else { return null; } } } xapool-1.5.0-src/src/org/enhydra/jdbc/oracle/0000755000175000017500000000000010235646676020740 5ustar twernertwernerxapool-1.5.0-src/src/org/enhydra/jdbc/oracle/OracleXAConnection.java0000644000175000017500000001143110235646676025261 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.oracle; import oracle.jdbc.xa.client.OracleXAResource; import oracle.jdbc.xa.OracleXid; import org.enhydra.jdbc.standard.StandardXAConnection; import org.enhydra.jdbc.standard.StandardXADataSource; import javax.transaction.xa.XAResource; import javax.transaction.xa.XAException; import javax.transaction.xa.Xid; import java.util.Hashtable; import java.sql.SQLException; /** * Provides an Oracle specific instance of StandardXAConnection. Almost all of * the required functionality is provided curtesy of the generic super class * which looks after most of the transaction state management. Oracle's * own resource manager is informed that it is part of a global transaction * and looks after the detail thereafter. */ public final class OracleXAConnection extends StandardXAConnection { private XAResource xarsrc = null; private static Hashtable txctxs = new Hashtable(); /** * Creates the first free connection. */ public OracleXAConnection (StandardXADataSource dataSource, String user, String password) throws SQLException { super (dataSource, user, password); // creates the first Connection object } private OracleXid getOracleXid(Xid xid) throws XAException { if (!(xid instanceof OracleXid)) { byte[] txctx = (byte[])txctxs.get(xid); dataSource.log.debug("txctx is " + txctx); OracleXid newXid = new OracleXid(xid.getFormatId(), xid.getGlobalTransactionId(), xid.getBranchQualifier(), txctx); return newXid; } else { return (OracleXid)xid; } } public void commit(Xid xid, boolean flag) throws XAException { dataSource.log.debug("commit:" + xid.getGlobalTransactionId()); xarsrc.commit(getOracleXid(xid), flag); xaDataSource.freeConnection(xid, false); txctxs.remove(xid); } public void end(Xid xid, int flags) throws XAException { dataSource.log.debug("end" + ":" + xid.getFormatId() + ":" + xid.getGlobalTransactionId() + ":" + xid.getBranchQualifier() + ":" + flags); xarsrc.end(getOracleXid(xid), flags); } public void forget(Xid xid) throws XAException { dataSource.log.debug("forget" + ":" + xid.getGlobalTransactionId()); xarsrc.forget(getOracleXid(xid)); xaDataSource.freeConnection(xid, false); txctxs.remove(xid); } public int prepare(Xid xid) throws XAException { dataSource.log.debug("prepare" + ":" + xid.getGlobalTransactionId()); int res = xarsrc.prepare(getOracleXid(xid)); if (res == XA_RDONLY) { xaDataSource.freeConnection(xid, false); txctxs.remove(xid); } return res; } public void rollback(Xid xid) throws XAException { dataSource.log.debug("rollback" + ":" + xid.getGlobalTransactionId()); xarsrc.rollback(getOracleXid(xid)); xaDataSource.freeConnection(xid, false); txctxs.remove(xid); } public void start(Xid xid, int flags) throws XAException { dataSource.log.debug("start" + ":" + xid.getFormatId() + ":" + xid.getGlobalTransactionId() + ":" + xid.getBranchQualifier() + ":" + flags); doStart(xid, flags); xarsrc = new OracleXAResource(curCon.con); OracleXid oXid = getOracleXid(xid); xarsrc.start(oXid, flags); txctxs.put(xid, oXid.getTxContext()); curCon = null; con = null; } public boolean isSameRM(XAResource res) throws XAException { if (!(res instanceof OracleXAConnection)) { dataSource.log.debug("isSameRM returning false"); return false; } OracleXAConnection ores = (OracleXAConnection)res; if (ores.xarsrc.isSameRM(xarsrc)) { dataSource.log.debug("isSameRM returning true"); return true; } dataSource.log.debug("isSameRM returning false"); return false; } } xapool-1.5.0-src/src/org/enhydra/jdbc/oracle/OracleXADataSource.java0000644000175000017500000000510410235646676025214 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.oracle; import org.enhydra.jdbc.standard.StandardXADataSource; import javax.sql.XADataSource; import javax.sql.XAConnection; import javax.naming.Reference; import javax.naming.Context; import javax.naming.Name; import java.sql.SQLException; import java.util.Hashtable; /** * Data source for creating IdbXAConnections. */ public class OracleXADataSource extends StandardXADataSource implements XADataSource { /** * Constructor. */ public OracleXADataSource () { // Required by JNDI super(); } /** * Creates an XA connection using the default username and password. */ public XAConnection getXAConnection () throws SQLException { return getXAConnection (user, password); } /** * Creates an XA connection using the supplied username and password. */ public XAConnection getXAConnection (String user, String password) throws SQLException { OracleXAConnection xac = new OracleXAConnection (this, user, password); xac.setTransactionManager(transactionManager); connectionCount++; return xac; } /** * The factory interface. */ public Object getObjectInstance(Object refObj, Name name, Context nameCtx, Hashtable env) throws Exception { Reference ref = (Reference)refObj; if (ref.getClassName().equals(getClass().getName())) { OracleXADataSource dataSource = new OracleXADataSource (); dataSource.setDriverName((String)ref.get("driverName").getContent()); dataSource.setUrl((String)ref.get("url").getContent()); return dataSource; } else { return null; } } } xapool-1.5.0-src/src/org/enhydra/jdbc/pool/0000755000175000017500000000000010235646676020444 5ustar twernertwernerxapool-1.5.0-src/src/org/enhydra/jdbc/pool/GenericPool.java0000644000175000017500000006320310235646676023521 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.pool; import java.util.Hashtable; import java.util.Enumeration; import java.util.Vector; import org.enhydra.jdbc.core.JdbcThreadFactory; import org.enhydra.jdbc.util.Logger; /** * GenericPool is the main class of the Pool. It works with any kind * of object that's implement PoolHelper (must provide specific * operation on the specific object) * Objects stored in hashtables are GenerationObject object. These objects * allow to store multiples things in them, in particular, the * generation number to identify the generation of an object. */ public class GenericPool { private long lifeTime; // lifetime of an object in the pool private Hashtable locked, unlocked; // two hashtables, to stock objects in use and free objects private Vector hitList; // holds expired objects until they are killed. private JdbcThreadFactory threadFactory; // thread factory private int minSize; // minimum size of the pool, set to 0 private int maxSize; // maximum size of the pool, if set to 0 : unlimited private PoolHelper poolHelper; // object type private int count; // count the number of object in the pool private boolean gc; // gc system call private boolean debug; // debug flag private long deadLockMaxWait; // time to wait before deadlock (return exception) private long deadLockRetryWait; // time to wait before 2 try of loop private Logger log; /** * checking level object * 0 = no special checking * 1 = just a check on an object * 2 = test the object * 3 = just a check on an object (for all the objects) * 4 = test the object (for all the objects) */ private int checkLevelObject; protected Thread keeper; // thread to clean up dead objects protected PoolKeeper poolKeeper; private long sleepTime; // sleeptime for the pool keeper /** * Generation number. When an error occurs, all objects of the * same generation or earlier are dropped. */ protected int generation = 1; // Default values public static final long DEFAULT_EXPIRATION = 600000; // 10 minutes //public static final long DEFAULT_EXPIRATION = 30000; // 30 secondes public static final long DEFAULT_SLEEPTIME = 300000; // 5 minutes public static final int DEFAULT_MINSIZE = 2; // 2 objects public static final int DEFAULT_MAXSIZE = 50; // 50 objects public static final int DEFAULT_DEADLOCKMAXWAIT = 300000; // 5 minutes public static final int DEFAULT_DEADLOCKRETRYWAIT = 10000; // 10 seconds /** * Creates an GenericPool with the default params. */ public GenericPool(PoolHelper helper) { this( helper, DEFAULT_MINSIZE, DEFAULT_MAXSIZE, DEFAULT_EXPIRATION, DEFAULT_SLEEPTIME); } public GenericPool(PoolHelper helper, int initSize) { this( helper, DEFAULT_MINSIZE, initSize, DEFAULT_EXPIRATION, DEFAULT_SLEEPTIME); } /** * Constructor, set the two hashtables and set by default the other values */ public GenericPool( PoolHelper helper, int minSize, int maxSize, long lifeTime, long sleepTime) { this.threadFactory = null; this.lifeTime = lifeTime; this.minSize = minSize; this.maxSize = maxSize; this.poolHelper = helper; // helper is the type of the object (interface) this.sleepTime = sleepTime; this.checkLevelObject = 0; this.deadLockMaxWait = DEFAULT_DEADLOCKMAXWAIT; this.deadLockRetryWait = DEFAULT_DEADLOCKRETRYWAIT; } /** * Start method, to initialize independant values of the pool */ public synchronized void start() { locked = new Hashtable(); // create locked objects pool unlocked = new Hashtable(); // create unlocked objects pool hitList = new Vector(); count = 0; // 0 element to start gc = false; // do not actions concerning garbage collector long now = System.currentTimeMillis(); // current time // to obtain to the beginning minSize objects in the pool for (int i = 0; i < minSize; i++) { // count have to be equal to minSize try { GenerationObject genObject = poolHelper.create(); unlocked.put(genObject, new Long(now)); // put it in the unlocked pool } catch (Exception e) { log.error("Error Exception in GenericPool:start " + e); } ++count; // there is one more element in the pool } //keeper removes dead or useless objects if (threadFactory != null) { try { this.poolKeeper = new PoolKeeper(sleepTime, this); this.keeper = threadFactory.getThread(poolKeeper); } catch (Exception e) { throw new IllegalStateException(e.getMessage()); } } else { //keep a handle to the poolkeeper so we can destroy it later this.poolKeeper = new PoolKeeper(sleepTime, this); this.keeper = new Thread(poolKeeper); } keeper.start(); // start the thread to verify element in the pool(unlocked) log.debug("GenericPool:start pool started"); } /* * Returns object from the pool or creates a connection * outside synchronization to prevent hanging. */ private Object getFromPool(String user, String password) throws Exception { long now = System.currentTimeMillis(); // current time to compare if (getUnlockedObjectCount() > 0) { // now, we have to return an object to the user GenerationObject o = null; Object realObject = null; Long life = null; Enumeration e = unlocked.keys(); // then take them while (e.hasMoreElements()) { // for each objects ... synchronized (this) { if (!e.hasMoreElements()) break; // recheck for synchronization. o = (GenerationObject) e.nextElement(); life = (Long) unlocked.get(o); unlocked.remove(o); // In any case the object will be removed. // Prevents others accessing the object while we are // not synchronized. realObject = o.getObj(); } // first, verify if the object is not dead (lifetime) if ((now - life.longValue()) > lifeTime) { // object has expired log.debug("GenericPool:getFromPool an object has expired"); removeUnlockedObject(o); } else { log.debug( "GenericPool:getFromPool check the owner of the connection"); if (checkOwner(o, user, password)) { log.debug("GenericPool:getFromPool owner is verified"); // second, verification of the object if needed if ((checkLevelObject == 0) || ((checkLevelObject == 1) && poolHelper.checkThisObject(realObject)) || ((checkLevelObject == 2) && poolHelper.testThisObject(realObject))) { locked.put(o, new Long(now)); // put it in the locked pool log.debug( "GenericPool:getFromPool return an object (after verification if needed)"); return (o.getObj()); // return this element } else { // object failed validation log.debug( "GenericPool:getFromPool kill an object from the pool"); removeUnlockedObject(o); } } else log.debug("GenericPool:getFromPool owner is FALSE"); } } } // if getUnlockedObjectCount() > 0 // if no objects available, create a new one boolean create = false; synchronized (this) { if (count < maxSize) { create = true; count++; // assume we can create a connection. } } if (create) { // if number of pooled object is < max size of the pool log.debug( "GenericPool:getFromPool no objects available, create a new one"); try { GenerationObject genObject = poolHelper.create(user, password); locked.put(genObject, new Long(now)); // put it in the locked pool return (genObject.getObj()); // and return this element } catch (Exception excp) { synchronized (this) { count--; // our assumption failed. rollback. } log.error( "GenericPool:getFromPool Error Exception in GenericPool:getFromPool"); // cney: rethrow exception thrown by create throw excp; } } return null; } public synchronized boolean checkOwner( GenerationObject genObject, String user, String password) { return equals(user, genObject.getUser()) && equals(password, genObject.getPassword()); } JdbcThreadFactory getThreadFactory() { return threadFactory; } void setThreadFactory(JdbcThreadFactory tf) { threadFactory = tf; } private boolean equals(String a, String b) { if (a == null) return (b == null); if (b == null) return (a == null); return a.equals(b); } /** * return pooled object */ public Object checkOut(String user, String password) throws Exception { log.debug("GenericPool:checkOut an object"); long now = System.currentTimeMillis(); // current time to compare GenerationObject o; Enumeration e; Object realObject; log.debug( "GenericPool:checkOut UnlockedObjectCount=" + getUnlockedObjectCount()); log.debug( "GenericPool:checkOut LockedObjectCount=" + getLockedObjectCount()); log.debug( "GenericPool:checkOut count=" + count + " maxSize=" + maxSize); if (getUnlockedObjectCount() > 0) { // if there are objects in the unlocked pool if ((checkLevelObject == 3) || (checkLevelObject == 4)) { //need to verify all the objects e = unlocked.keys(); while (e.hasMoreElements()) { o = (GenerationObject) e.nextElement(); realObject = o.getObj(); // take the current object // first, verify if the object is not dead (lifetime) if ((now - ((Long) unlocked.get(o)).longValue()) > lifeTime) { // object has expired log.debug("GenericPool:checkOut an object has expired"); removeUnlockedObject(o); //minimumObject(user, password); // build object in the pool if it is lesser than minSize } else { log.debug( "GenericPool:checkOut check the owner of the connection"); if (checkOwner(o, user, password)) { if (((checkLevelObject == 3) && !poolHelper.checkThisObject(realObject)) || ((checkLevelObject == 4) && !poolHelper.testThisObject(realObject))) { log.debug( "GenericPool:checkOut remove object checkLevelObject=" + checkLevelObject); removeUnlockedObject(o); //minimumObject(user, password); // build object in the pool if it is lesser than minSize } } } } } } int currentWait = 0; Object obj = getFromPool(user, password); while ((obj == null) && (currentWait < getDeadLockMaxWait())) { log.info("GenericPool:checkOut waiting for an object :"+this.poolHelper.toString()); try { synchronized (this) { wait(getDeadLockRetryWait()); } } catch (InterruptedException excp) { log.error( "GenericPool:checkOut ERROR Failed while waiting for an object: " + excp); } currentWait += getDeadLockRetryWait(); obj = getFromPool(user, password); } if (obj == null) throw new Exception("GenericPool:checkOut ERROR impossible to obtain a new object from the pool"); return obj; } synchronized public void minimumObject() { minimumObject(null, null); } synchronized public void minimumObject(String user, String password) { log.debug( "GenericPool:minimumObject create object if there are less than minSize objects in the pool count =" + count); if ((count < minSize) && (unlocked != null)) { // if pool has less than minSize elements long now = System.currentTimeMillis(); // current time for (int i = count; i < minSize; i++) { //count have to be equal to minSize try { GenerationObject genObject; if ((user != null) && (password != null)) genObject = poolHelper.create(); else genObject = poolHelper.create(user, password); unlocked.put(genObject, new Long(now)); // put it in the unlocked pool } catch (Exception e) { log.error( "GenericPool:minimumObject Error Exception in GenericPool:minimumObject"); } } log.debug( "GenericPool:minimumObject count=" + count + " Unlocked=" + this.getUnlockedObjectCount() + " locked=" + this.getLockedObjectCount()); count = minSize; // pool has now minSize element } } /** * remove object from locked pool */ public synchronized void checkIn(Object o) { log.debug("GenericPool:checkIn return an object to the pool"); for (Enumeration enum = locked.keys(); enum.hasMoreElements(); ) { // for each object of GenerationObject obj = (GenerationObject) enum.nextElement(); // the locked pool if (obj.getObj().equals(o)) { locked.remove(obj); // remove the object from the locked pool unlocked.put(obj, new Long(System.currentTimeMillis())); // we have to verify if the generation of the object is still valid int genObj = obj.getGeneration(); // get the generation number // if the generation number of the object is not valid, test the object if (generation > genObj) { if (!poolHelper.checkThisObject(obj.getObj())) // if the object is not valid removeUnlockedObject(obj); } notifyAll(); } } if (count > maxSize) { // if we have more than maxSize object in the pool log.info( "GenericPool:checkIn more than maxSize object in the pool"); Enumeration enum = unlocked.keys(); // get the unlocked pool for (int i = maxSize; i < count; i++) { // try to remove object from this pool if (getUnlockedObjectCount() > 0) { GenerationObject obj = (GenerationObject) enum.nextElement(); removeUnlockedObject(obj); } } // now, the size of the pool is changed // NOTE : count number ca be greater than maxSize here, in case of there is no // available object to delete in the unlocked pool count = getUnlockedObjectCount() + getLockedObjectCount(); if (count > maxSize) log.warn( "GenericPool:checkIn Be careful, the maximum size of the pool does not correspond" + " to your data. When objects will be check in, the pool " + "will decrease"); } } synchronized private void removeUnlockedObject(GenerationObject obj) { --count; notifyAll(); // there is room for new connections. unlocked.remove(obj); hitList.add(obj); // killing is done by the keeper thread. } public void setDebug(boolean debug) { this.debug = debug; } public boolean isDebug() { return debug; } public synchronized void setMinSize(int min) throws Exception { if (min < 0) throw new Exception("GenericPool:setMinSize Minimum size of the pool can't be lesser than 0"); else if (min > maxSize) throw new Exception( "GenericPool:setMinSize Minimum size of the pool can't be greater than the maxSize (" + maxSize + ")"); else { this.minSize = min; //minimumObject(); // build object in the pool if it is lesser than minSize } } public synchronized void setMaxSize(int max) throws Exception { if (max < 0) throw new Exception("GenericPool:setMaxSize Maximum size of the pool can't be lesser than 0"); else if (max < minSize) throw new Exception( "GenericPool:setMaxSize Maximum size of the pool can't be lesser than the minSize (" + minSize + ")"); else { this.maxSize = max; if (count > max) { // if pool has more than max element log.info( "GenericPool:setMaxSize pool has more than max element"); // we try to remove element from the unlocked pool Enumeration enum = unlocked.keys(); for (int i = max; i < count; i++) { if (getUnlockedObjectCount() > 0) { // if there is element in the unlocked pool GenerationObject o = (GenerationObject) enum.nextElement(); removeUnlockedObject(o); } } // new size is : count = getUnlockedObjectCount() + getLockedObjectCount(); // if there is still more than max element, the objects will be removed // when the check in operation will be performed. if (count > max) log.warn( "GenericPool:setMaxSize Be careful, the maximum size of " + "the pool does not correspond to your data. When objects " + "will be check in, the pool will decrease"); } } } public void setLifeTime(long lifeTime) { this.lifeTime = lifeTime; } public void setSleepTime(long sleepTime) { this.sleepTime = sleepTime; } public void setGeneration(int generation) { this.generation = generation; log.debug( "GenericPool:setGeneration Be careful, it is very dangerous to change " + "the generation number, many objects could be destroyed"); } public void setGC(boolean gc) { this.gc = gc; } /** * level are accepted between 0 and 4 */ public void setCheckLevelObject(int level) { if ((level > 0) && (level <= 4)) this.checkLevelObject = level; } public void setDeadLockMaxWait(long deadLock) { this.deadLockMaxWait = deadLock; } public void setDeadLockRetryWait(long deadLockRetryWait) { this.deadLockRetryWait = deadLockRetryWait; } public int getMinSize() { return minSize; } public int getMaxSize() { return maxSize; } public long getLifeTime() { return lifeTime; } public boolean isGC() { return gc; } public int getCount() { return count; } public long getSleepTime() { return sleepTime; } public int getGeneration() { return generation; } public int getCheckLevelObject() { return checkLevelObject; } /** * switch off the pool */ public void stop() { log.debug("GenericPool:stop start to stop the pool"); if ((getLockedObjectCount() != 0) || (getUnlockedObjectCount() != 0)) { expireAll(); // try to kill all the objects in the 2 pools if (poolKeeper != null) poolKeeper.stop(); // release the pool. keeper.interrupt(); // and interrupt the pool keeper locked.clear(); // clear the locked pool unlocked.clear(); // clear the unlocked pool locked = null; unlocked = null; count = 0; // there is no element in the pool } log.debug("GenericPool:stop pool stopped"); } /** * returns the current number of objects that are locked */ public int getLockedObjectCount() { if (locked != null) return locked.size(); else return 0; } /** * returns the current number of objects that are unlocked */ public int getUnlockedObjectCount() { if (unlocked != null) return unlocked.size(); else return 0; } public long getDeadLockMaxWait() { return this.deadLockMaxWait; } public long getDeadLockRetryWait() { return this.deadLockRetryWait; } /** * returns information from the pool */ public String toString() { StringBuffer sb = new StringBuffer(); sb.append("GenericPool:\n"); sb.append(" num of element =<"+ count+">\n"); sb.append(" minSize =<"+ minSize+">\n"); sb.append(" maxSize =<"+ maxSize+">\n"); sb.append(" lifeTime =<"+ lifeTime+">\n"); sb.append(" ngeneration =<"+ generation+">\n"); sb.append(" getLockedObjectCount() =<"+ getLockedObjectCount()+">\n"); sb.append(" getUnlockedObjectCount() =<"+ getUnlockedObjectCount()+">\n"); sb.append(" getDeadLockMaxWait() =<"+ getDeadLockMaxWait()+">\n"); sb.append(" getDeadLockRetryWait() =<"+ getDeadLockRetryWait()+">\n"); if (unlocked != null) { sb.append("Unlocked pool:\n"); Enumeration e = unlocked.keys(); while (e.hasMoreElements()) { GenerationObject o = (GenerationObject) e.nextElement(); sb.append(o.getObj().toString()); } } if (locked != null) { sb.append("Locked pool:\n"); Enumeration e = unlocked.keys(); while (e.hasMoreElements()) { GenerationObject o = (GenerationObject) e.nextElement(); sb.append(o.getObj().toString()); } } return sb.toString(); } /** * Remove unusable objects from the pool, called by PoolKeeper * Check the unlocked objects for expired members. */ protected void cleanUp() { // During shutdown, unlocked may be null. synchronized (this) { if (unlocked == null) return; } long now = System.currentTimeMillis(); // current time synchronized (this) { for (Enumeration enum = unlocked.keys(); enum.hasMoreElements(); ) { // for each object of the GenerationObject o = (GenerationObject) enum.nextElement(); // unlocked pool long lasttouch = ((Long) unlocked.get(o)).longValue(); // birth day of the pool if ((now - lasttouch) > lifeTime) { // if the object has expired log.debug("GenericPool:cleanUp clean up the pool"); removeUnlockedObject(o); } } } // Kill every object in the hit list. We do this outside synchronization // in case it takes too long. Note that hitList only grows so this is // a safe way to do this. while (hitList.size() > 0) { // kill each object. // this might take a while, lets do it outside synchronization. GenerationObject obj = (GenerationObject) hitList.remove(0); log.debug("GenericPool:cleanUp killing an object"); poolHelper.expire(obj.getObj()); // try to "kill" it obj.killObject(); } if (isGC()) // if the pool is GCeable System.gc(); // launch system call to clean up unused objects boolean resize = false; // Lets keep the look outside synchronization as object creation // may take a while. synchronized (this) { resize = count < minSize; } if (resize) { // if there is less than minSize objects in the pool log.info( "GenericPool:cleanUp less than minSize objects in the pool " + "min=" + minSize + " max=" + maxSize + " count=" + count); while (true) { try { GenerationObject genObject = poolHelper.create(); synchronized (this) { unlocked.put(genObject, new Long(now)); // put it in the unlocked pool ++count; // there is one more element in the pool notifyAll(); if (count >= minSize) break; // we want to make the test inside sync but leave the loop // outside sync. } } catch (Exception e) { log.error( "GenericPool:cleanUp Error Exception in GenericPool:cleanUp"); } synchronized (this) { notifyAll(); } } log.info( "GenericPool:cleanUp done " + "min=" + minSize + " max=" + maxSize + " count=" + count); } } /** * close all object in the unlocked and locked structures */ void expireAll() { log.debug( "GenericPool:expireAll close all object in the unlocked and locked structures"); for (Enumeration enum = unlocked.keys(); enum.hasMoreElements(); ) { // for each object of GenerationObject o = (GenerationObject) enum.nextElement(); // the unlocked pool poolHelper.expire(o.getObj()); // try to "kill" the object o.killObject(); o = null; } for (Enumeration enum = locked.keys(); enum.hasMoreElements(); ) { // for each object of GenerationObject o = (GenerationObject) enum.nextElement(); // the locked pool poolHelper.expire(o.getObj()); // try to "kill" the object o.killObject(); o = null; } } /** * Allows to verify if objects from the pool - for the o generation - * are valid or not. (only for the unlocked pool, to avoid to allocate * non-valid object */ public void nextGeneration(Object obj) { log.debug("GenericPool:nextGeneration"); int genObj = 0; for (Enumeration enum = locked.keys(); enum.hasMoreElements(); ) { // for each object of GenerationObject o = (GenerationObject) enum.nextElement(); // the locked pool if (o.getObj().equals(obj)) genObj = o.getGeneration(); // get the generation number } for (Enumeration enum = unlocked.keys(); enum.hasMoreElements(); ) { // for each object of GenerationObject o = (GenerationObject) enum.nextElement(); // the unlocked pool if (o.getGeneration() <= genObj) { // all objects of the same generation // or earlier are dropped if (!poolHelper.checkThisObject(o.getObj())) // if the object is not valid removeUnlockedObject(o); } } ++this.generation; // now, we work with the next generation of object } /** * removes an object for the locked pool, when an error has occurred */ synchronized public void removeLockedObject(Object obj) { log.debug("GenericPool:removeObject remove an object"); for (Enumeration enum = locked.keys(); enum.hasMoreElements(); ) { // for each object of GenerationObject o = (GenerationObject) enum.nextElement(); // the locked pool if (o.getObj().equals(obj)) { locked.remove(o); // remove the object from the locked pool --count; o.killObject(); o = null; } } } /** * Outputs a log message to the log writer. */ public void setLogger(Logger alog) { log = alog; } public Hashtable getLockedObject() { return locked; } } xapool-1.5.0-src/src/org/enhydra/jdbc/pool/GenerationObject.java0000644000175000017500000000421010235646676024526 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.pool; /** * This class allows to store multiple things in the Generic * Pool hashtable. In our first implementation, we store the * generation number. It is used to close down all pooled objects * that were open when a error occured, allowing new pooled objects * to be allocated */ public class GenerationObject { Object obj; // object to store // generation number of the object // generation property is managed by GenericPool object int generation; String user; String password; /** * constructor */ public GenerationObject(Object o, int generation) { this.obj = o; this.generation = generation; } /** * constructor */ public GenerationObject(Object o, int generation, String user, String password) { this.obj = o; this.generation = generation; this.user = user; this.password = password; } public int getGeneration() { return this.generation; } public Object getObj() { return this.obj; } public String getUser() { return this.user; } public String getPassword() { return this.password; } public void killObject() { obj = null; } } xapool-1.5.0-src/src/org/enhydra/jdbc/pool/PoolHelper.java0000644000175000017500000000302110235646676023354 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.pool; import java.sql.SQLException; /** * PoolHelper defines methods allowing to make some specific * operation on object. These operations are required to work * the Generic Pool */ public interface PoolHelper { public void expire(Object o); // object specific work to kill the object public boolean checkThisObject(Object o); // check if the object is still valid public boolean testThisObject(Object o); // check if the object is closed public GenerationObject create() throws SQLException; public GenerationObject create(String _user, String _password) throws SQLException; public String toString(); } xapool-1.5.0-src/src/org/enhydra/jdbc/pool/PoolKeeper.java0000644000175000017500000000361310235646676023357 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.pool; /** * PoolKeeper class allows to clean up automatically dead and * expired objects. */ public class PoolKeeper implements Runnable { private long sleepTime; // timeout between 2 clean up private GenericPool pool; // the pool to clean up private boolean running = true; /** * constructor, called by GenericPool (any kind of object) */ public PoolKeeper(long sleepTime, GenericPool pool) { this.sleepTime = sleepTime; this.pool = pool; } public void stop() { synchronized (this ) { running = false; } } /** * run method. allows to clean up the pool */ public void run() { while (running && !Thread.interrupted()) { try { synchronized (this) { wait(this.sleepTime); // wait for timeout ms before attack } } catch (InterruptedException e) { break; } this.pool.cleanUp(); // clean up the Pool and reallocate objects } // release the pool. this.pool = null; } }xapool-1.5.0-src/src/org/enhydra/jdbc/pool/StandardPoolDataSource.java0000644000175000017500000004100310235646676025652 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.pool; import java.io.PrintWriter; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import java.util.Hashtable; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.Name; import javax.naming.NamingException; import javax.naming.Reference; import javax.naming.StringRefAddr; import javax.sql.ConnectionEvent; import javax.sql.ConnectionEventListener; import javax.sql.ConnectionPoolDataSource; import javax.sql.DataSource; import javax.sql.PooledConnection; import org.enhydra.jdbc.core.CoreDataSource; import org.enhydra.jdbc.core.JdbcThreadFactory; import org.enhydra.jdbc.util.Logger; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * StandardPoolDataSource class allows to make some operations on * PooledConnection. It implements PoolHelper for the 3 methods :

* create : create a PooledConnection

* create(user,password) : create a PooledConnection with an other user/password

* testThisObject : check if the object is still valid

* checkThisObject : check if the object is closed

* expire : kill the object

*/ public class StandardPoolDataSource extends CoreDataSource implements DataSource, PoolHelper, ConnectionEventListener { public ConnectionPoolDataSource cpds; // object to build PooledConnection public GenericPool pool; // pool to store StandardDataSource object public String dataSourceName; // jndi name for DataSource Factory public String jdbcTestStmt; // JDBC test statement for checkLevelObject=1 or 2 public boolean onOff; // If the pool is started or not public Context ictx; // the initial context public Log glog = LogFactory.getLog("org.enhydra.jdbc.xapool"); /** * Constructor */ public StandardPoolDataSource() { log = new Logger(glog); super.setLogWriter(log); pool = new GenericPool(this); // create the pool with StandardPoolDataSource object pool.setLogger(log); onOff = false; dataSourceName = null; } /** * Constructor */ public StandardPoolDataSource(int initSize) { // with an init Max size log = new Logger(glog); super.setLogWriter(log); pool = new GenericPool(this, initSize); // create the pool with StandardPoolDataSource object pool.setLogger(log); onOff = false; dataSourceName = null; } /** * Constructor */ public StandardPoolDataSource(ConnectionPoolDataSource cc) { cpds = cc; log = new Logger(glog); super.setLogWriter(log); pool = new GenericPool(this); // create the pool with StandardPoolDataSource object pool.setLogger(log); try { cpds.setLogWriter(log); } catch (SQLException sqle) { } onOff = false; dataSourceName = null; } /** * Constructor */ public StandardPoolDataSource( ConnectionPoolDataSource cc, int initSize) { // with an init Max size cpds = cc; log = new Logger(glog); super.setLogWriter(log); pool = new GenericPool(this, initSize); // create the pool with StandardPoolDataSource object pool.setLogger(log); onOff = false; dataSourceName = null; } /** * Set up the data source name, get the initial context, * and lookup in JNDI to obtain a reference of the DataSourceName * this method must be called before a getConnection (in this case * an exception is returned */ public void setDataSourceName(String dataSourceName) { log.debug("StandardPoolDataSource:setDataSourceName"); this.dataSourceName = dataSourceName; // set up the data source name /* synchronized(this) { if (onOff) { pool.stop(); onOff = false; } } */ } public String getDataSourceName() { return dataSourceName; // return the dataSourceName (jndi mechanism) } /** * getConnection allows to get an object from the pool and returns it * to the user. In this case, we return an PooledConnection */ public Connection getConnection() throws SQLException { return getConnection(getUser(), getPassword()); } /** * getConnection allows to get an object from the pool and returns it * to the user. In this case, we return an PooledConnection */ public Connection getConnection(String _user, String _password) throws SQLException { log.debug("StandardPoolDataSource:getConnection"); Connection ret = null; PooledConnection con = null; synchronized (this) { if (!onOff) { log.debug( "StandardPoolDataSource:getConnection must configure the pool..."); pool.start(); // the pool starts now onOff = true; // and is initialized log.debug( "StandardPoolDataSource:getConnection pool config : \n" + pool.toString()); } } try { try { log.debug( "StandardPoolDataSource:getConnection Try to give a " + "connection (checkOut)"); con = (PooledConnection) pool.checkOut(_user, _password); // get a connection from the pool log.debug( "StandardPoolDataSource:getConnection checkOut return" + "a new connection"); } catch (Exception e) { e.printStackTrace(); log.debug( "StandardPoolDataSource:getConnection SQLException in StandardPoolDataSource:getConnection" + e); throw new SQLException( "SQLException in StandardPoolDataSource:getConnection no connection available " + e); } ret = con.getConnection(); } catch (Exception e) { log.debug("StandardPoolDataSource:getConnection exception" + e); e.printStackTrace(); SQLException sqle = new SQLException( "SQLException in StandardPoolDataSource:getConnection exception: " + e); if (e instanceof SQLException) sqle.setNextException((SQLException) e); if (con != null) { pool.checkIn(con); } throw sqle; } log.debug("StandardPoolDataSource:getConnection return a connection"); return ret; } /** * connectionErrorOccurred and connectionClosed are methods * from ConnectionEventListener interface * * Invoked when a fatal connection error occurs, * just before an SQLException is thrown to the application */ public void connectionErrorOccurred(ConnectionEvent event) { Object obj = event.getSource(); PooledConnection pc = (PooledConnection) obj; pool.nextGeneration(pc); pool.removeLockedObject(pc); // remove the object from the locked pool expire(pc); // kill the connection (from super) log.debug( "StandardXAPoolDataSource:connectionErrorOccurred remove the object from the pool"); } /** * Invoked when the application calls close() * on its representation of the connection */ public void connectionClosed(ConnectionEvent event) { log.debug( "StandardPoolDataSource:connectionClosed close the connection"); Object obj = event.getSource(); pool.checkIn(obj); } /** * object specific work to kill the object */ public void expire(Object o) { log.debug( "StandardPoolDataSource:expire expire a connection, remove from the pool"); if (o == null) return; try { PooledConnection pooledCon = (PooledConnection) o; pooledCon.close(); // call close() of PooledConnection pooledCon.removeConnectionEventListener(this); log.debug("StandardPoolDataSource:expire close the connection"); } catch (java.sql.SQLException e) { log.error( "StandardPoolDataSource:expire Error java.sql.SQLException in StandardPoolDataSource:expire"); } } /** * This method tests if a connection is closed or not */ public boolean checkThisObject(Object o) { PooledConnection con; Connection ret; log.debug( "StandardPoolDataSource:checkThisObject verify the current object"); try { con = (PooledConnection) o; ret = con.getConnection(); // get the connection from the pool if (ret.isClosed()) { return false; } try { ret.close(); } catch (Exception e) { log.error( "StandardPoolDataSource:checkThisObject can't closed the connection: " + e); } return true; } catch (java.sql.SQLException e) { log.error( "StandardPoolDataSource:checkThisObject Error java.sql.SQLException in StandardPoolDataSource:checkThisObject"); return false; } } /** * This method tests if a connection is valid or not */ public boolean testThisObject(Object o) { Connection ret = null; log.debug( "StandardPoolDataSource:testThisObject verify the current object"); try { PooledConnection con = (PooledConnection) o; ret = con.getConnection(); Statement s = ret.createStatement(); s.execute(jdbcTestStmt); s.close(); try { ret.close(); } catch (Exception e) { log.error( "StandardPoolDataSource:checkThisObject can't closed the connection: " + e); } return true; } catch (java.sql.SQLException e) { log.error( "StandardPoolDataSource:checkThisObject Error java.sql.SQLException in StandardPoolDataSource:testThisObject"); return false; } } public GenerationObject create() throws SQLException { return create(getUser(), getPassword()); } public GenerationObject create(String _user, String _password) throws SQLException { log.debug( "StandardPoolDataSource:create create a connection for the pool"); GenerationObject genObject; PooledConnection pooledCon = cpds.getPooledConnection(_user, _password); // get the pooled connection pooledCon.addConnectionEventListener(this); // add it to the event listener log.debug("StandardPoolDataSource:create create a object for the pool"); genObject = new GenerationObject( pooledCon, pool.getGeneration(), _user, _password); return genObject; // return a connection } /** * stop method to switch off the pool */ public void stopPool() { pool.stop(); onOff = false; log.debug("StandardPoolDataSource:stopPool stop now the pool"); } public void shutdown(boolean force) { stopPool(); } /** * set the logwriter for the current object, the logwriter will be use by * the current object and by the generic pool * @param logWriter a PrintWriter object */ public void setLogWriter(PrintWriter logWriter) { pool.setLogger(log); super.setLogger(log); } /** * set the debug flag * @param debug a boolean flag */ public void setDebug(boolean debug) { super.setDebug(debug); pool.setDebug(debug); } /** * set the minimum size of the pool * @param minSize minimum size of the pool * @throws Exception */ public void setMinSize(int minSize) throws Exception { pool.setMinSize(minSize); } /** * set the maximum size of the pool * @param maxSize maximum size of the pool * @throws Exception */ public void setMaxSize(int maxSize) throws Exception { pool.setMaxSize(maxSize); } /** * set the life time of the pooled objects * @param lifeTime life time of the pooled objects (in milliseconds) */ public void setLifeTime(long lifeTime) { pool.setLifeTime(lifeTime); } /** * set the sleep time of pooled objects * @param sleepTime sleep time of the pooled objects (in milliseconds) */ public void setSleepTime(long sleepTime) { pool.setSleepTime(sleepTime); } /** * set the garbage collection option * @param gc true: the garbage collector will be launched when clean up of the * pool, else false */ public void setGC(boolean gc) { pool.setGC(gc); } /** * set the check level of the pooled object before using them * @param checkLevelObject (
* 0 = no special checking * 1 = just a check on an object * 2 = test the object * 3 = just a check on an object (for all the objects) * 4 = test the object (for all the objects) */ public void setCheckLevelObject(int checkLevelObject) { pool.setCheckLevelObject(checkLevelObject); } /** * set the String to test the jdbc connection before using it * @param jdbcTestStmt an sql statement */ public void setJdbcTestStmt(String jdbcTestStmt) { this.jdbcTestStmt = jdbcTestStmt; } /** * set the generation number for future connection, the generation number * is used to identify a group a created objects * @param generation an integer value which represents a generation */ public void setGeneration(int generation) { pool.setGeneration(generation); } /** * set the global time the pool can wait for a free object * @param deadLock in milliseconds */ public void setDeadLockMaxWait(long deadLock) { pool.setDeadLockMaxWait(deadLock); } /** * set the time before 2 tries when trying to obtain an object from the pool * @param loopWait in milliseconds */ public void setDeadLockRetryWait(long loopWait) { pool.setDeadLockRetryWait(loopWait); } public PrintWriter getLogWriter() { return log; } public int getMinSize() { return pool.getMinSize(); } public int getMaxSize() { return pool.getMaxSize(); } public long getLifeTime() { return pool.getLifeTime(); } public long getSleepTime() { return pool.getSleepTime(); } public int getGeneration() { return pool.generation; } public boolean isGC() { return pool.isGC(); } public int getLockedObjectCount() { return pool.getLockedObjectCount(); } public int getUnlockedObjectCount() { return pool.getUnlockedObjectCount(); } public int getCheckLevelObject() { return pool.getCheckLevelObject(); } public String getJdbcTestStmt() { return jdbcTestStmt; } public long getDeadLockMaxWait() { return pool.getDeadLockMaxWait(); } public long getDeadLockRetryWait() { return pool.getDeadLockRetryWait(); } public String toString() { StringBuffer sb = new StringBuffer(); sb.append("StandardPoolDataSource:\n"); sb.append(" data source name=<"+this.dataSourceName+">\n"); sb.append(" jdbc test stmt=<"+this.jdbcTestStmt+">\n"); sb.append(" user=<"+this.user+">\n"); if (this.cpds != null) sb.append(this.cpds.toString()); sb.append(pool.toString()); return sb.toString(); } /** * Retrieves the Reference of this object. Used at binding time by JNDI * to build a reference on this object. * * @return The non-null Reference of this object. * @exception NamingException If a naming exception was encountered while * retrieving the reference. */ public Reference getReference() throws NamingException { log.debug( "StandardPoolDataSource:getReference return a reference of the object"); Reference ref = super.getReference(); ref.add( new StringRefAddr( "checkLevelObject", Integer.toString(getCheckLevelObject()))); ref.add(new StringRefAddr("lifeTime", Long.toString(getLifeTime()))); ref.add(new StringRefAddr("jdbcTestStmt", getJdbcTestStmt())); ref.add(new StringRefAddr("maxSize", Integer.toString(getMaxSize()))); ref.add(new StringRefAddr("minSize", Integer.toString(getMinSize()))); ref.add(new StringRefAddr("dataSourceName", getDataSourceName())); return ref; } /* (non-Javadoc) * @see javax.naming.spi.ObjectFactory#getObjectInstance(java.lang.Object, javax.naming.Name, javax.naming.Context, java.util.Hashtable) */ public Object getObjectInstance( Object refObj, Name name, Context nameCtx, Hashtable env) throws Exception { super.getObjectInstance(refObj, name, nameCtx, env); Reference ref = (Reference) refObj; this.setLifeTime( Long.parseLong((String) ref.get("lifeTime").getContent())); this.setJdbcTestStmt((String) ref.get("jdbcTestStmt").getContent()); this.setMaxSize( Integer.parseInt((String) ref.get("maxSize").getContent())); this.setMinSize( Integer.parseInt((String) ref.get("minSize").getContent())); this.setDataSourceName((String) ref.get("dataSourceName").getContent()); InitialContext ictx = new InitialContext(env); cpds = (ConnectionPoolDataSource) ictx.lookup(this.dataSourceName); return this; } /** * Override this so that the pool's tf gets set as well */ public void setThreadFactory(JdbcThreadFactory tf) { super.setThreadFactory(tf); pool.setThreadFactory(tf); } }xapool-1.5.0-src/src/org/enhydra/jdbc/pool/StandardXAPoolDataSource.java0000644000175000017500000002347310235646676026116 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.pool; import java.sql.SQLException; import java.util.Hashtable; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.Name; import javax.naming.NamingException; import javax.naming.Reference; import javax.naming.StringRefAddr; import javax.sql.ConnectionEvent; import javax.sql.XAConnection; import javax.sql.XADataSource; import javax.transaction.TransactionManager; import javax.transaction.Transaction; import javax.transaction.SystemException; import javax.transaction.xa.XAResource; import org.enhydra.jdbc.standard.StandardXADataSource; import org.enhydra.jdbc.standard.StandardXAConnection; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import java.sql.Connection; import java.sql.Statement; import javax.sql.PooledConnection; import javax.transaction.Status; /** * StandardXAPoolDataSource class allows to make some operations on * XAConnection. It implements PoolHelper for the 3 methods :

* create : create an XAConnection

* create(user,password) : create a PooledConnection with an other user/password

* testThisObject : check if the object is still valid

* checkThisObject : check if the object is closed

* expire : kill the object

*/ public class StandardXAPoolDataSource extends StandardPoolDataSource { public XADataSource xads; // object to build XAConnection public TransactionManager transactionManager; // the current Transaction Manager public Log glog = LogFactory.getLog("org.enhydra.jdbc.xapool"); /** * Constructor */ public StandardXAPoolDataSource() { super(); } /** * Constructor */ public StandardXAPoolDataSource(int initSize) { super(initSize); } /** * Constructor */ public StandardXAPoolDataSource(StandardXADataSource ds) { super(ds); setDataSource(ds); } /** * Constructor */ public StandardXAPoolDataSource(StandardXADataSource ds, int initSize) { super(ds, initSize); setDataSource(ds); } public void setTransactionManager(TransactionManager tm) { log.debug("StandardXAPoolDataSource:setTransactionManager"); transactionManager = tm; } /** * Invoked when the application calls close() * on its representation of the connection */ public void connectionClosed(ConnectionEvent event) { Object obj = event.getSource(); log.debug("StandardXAPoolDataSource:connectionClosed"); XAConnection xac = (XAConnection) obj; // cast it into an xaConnection Transaction tx = null; try { if (transactionManager == null) { TransactionManager tm = ((StandardXADataSource) xads).getTransactionManager(); if (tm == null) { throw new NullPointerException("TM is null"); } else // here we use tm instead to setup transactionManager = tm // if the current transactionManager property is null, it stays // there, and we continue to use the TM from the XADataSource tx = tm.getTransaction(); } else { tx = transactionManager.getTransaction(); } log.debug( "StandardXAPoolDataSource:connectionClosed get a transaction"); } catch (NullPointerException n) { // current is null: we are not in EJBServer. log.error( "StandardXAPoolDataSource:connectionClosed should not be used outside an EJBServer"); } catch (SystemException e) { log.error( "StandardXAPoolDataSource:connectionClosed getTransaction failed:" + e); } // delist Resource if in transaction // We must keep the connection till commit or rollback if ((tx != null) && (((StandardXAConnection) xac).connectionHandle.isReallyUsed)) { try { tx.delistResource(xac.getXAResource(), XAResource.TMSUCCESS); // delist the xaResource log.debug( "StandardXAPoolDataSource:connectionClosed the resourse is delisted"); } catch (Exception e) { log.error( "StandardXAPoolDataSource:connectionClosed Exception in connectionClosed:" + e); } } log.debug( "StandardXAPoolDataSource:connectionClosed checkIn an object to the pool"); pool.checkIn(obj); // return the connection to the pool } public GenerationObject create(String _user, String _password) throws SQLException { GenerationObject genObject; XAConnection xaCon = xads.getXAConnection(_user, _password); // get the xa connection xaCon.addConnectionEventListener(this); // add it to the event listener log.debug( "StandardXAPoolDataSource:create create a object for the pool"); genObject = new GenerationObject(xaCon, pool.getGeneration(), _user, _password); return genObject; } /** * Retrieves the Reference of this object. Used at binding time by JNDI * to build a reference on this object. * * @return The non-null Reference of this object. * @exception NamingException If a naming exception was encountered while * retrieving the reference. */ public Reference getReference() throws NamingException { log.debug( "StandardXAPoolDataSource:getReference return a reference of the object"); Reference ref = super.getReference(); ref.add( new StringRefAddr("transactionManagerName", "TransactionManager")); return ref; } /* (non-Javadoc) * @see javax.naming.spi.ObjectFactory#getObjectInstance(java.lang.Object, javax.naming.Name, javax.naming.Context, java.util.Hashtable) */ public Object getObjectInstance( Object refObj, Name name, Context nameCtx, Hashtable env) throws Exception { super.getObjectInstance(refObj, name, nameCtx, env); Reference ref = (Reference) refObj; InitialContext ictx = new InitialContext(env); this.setTransactionManager( (TransactionManager) ictx.lookup( "javax.transaction.TransactionManager")); this.setDataSource((XADataSource) ictx.lookup(this.dataSourceName)); log.debug("StandardPoolDataSource:getObjectInstance: instance created"); return this; } /** Getter for property dataSource. * @return Value of property dataSource. */ public XADataSource getDataSource() { return xads; } /** Setter for property dataSource. * @param dataSource New value of property dataSource. */ public void setDataSource(XADataSource dataSource) { this.xads = dataSource; if (transactionManager != null) ((StandardXADataSource) dataSource).setTransactionManager( transactionManager); } public String toString() { StringBuffer sb = new StringBuffer(); sb.append("StandardXAPoolDataSource:\n"); if (this.transactionManager != null) sb.append(" transaction manager=<"+this.transactionManager.toString()+">\n"); if (this.xads != null) sb.append(this.xads.toString()); sb.append(super.toString()); return sb.toString(); } /** * This method tests if a connection is valid or not. It overrides the * method in StandardPoolDataSource to take into account global transactions: * if global transaction is in progress - suspend it so that * connection testing happens ouside of transaction. * If connection testing fails - it will not affect transaction * and next good connection can join the transaction */ public boolean testThisObject(Object o) { Connection ret = null; log.debug( "StandardPoolDataSource:testThisObject verify the current object"); Transaction suspended = null; try { Transaction tx = transactionManager == null ? null : transactionManager.getTransaction(); boolean isActive = tx == null ? false : tx.getStatus() == Status.STATUS_ACTIVE; if (isActive) { suspended = transactionManager.suspend(); } PooledConnection con = (PooledConnection) o; ret = con.getConnection(); Statement s = ret.createStatement(); s.execute(jdbcTestStmt); s.close(); try { ret.close(); } catch (Exception e) { log.error( "StandardPoolDataSource:checkThisObject can't closed the connection: " + e); } return true; } catch (SQLException e) { log.error( "StandardXAPoolDataSource:checkThisObject Error java.sql.SQLException in StandardXAPoolDataSource:testThisObject"); return false; } catch (SystemException e) { log.error( "StandardXAPoolDataSource:checkThisObject Error java.sql.SystemException in StandardXAPoolDataSource:testThisObject"); return false; } finally { if (suspended != null) { try { transactionManager.resume(suspended); } catch (Exception ex) { log.error( "StandardXAPoolDataSource:checkThisObject Error Exception in StandardXAPoolDataSource:testThisObject"); return false; } } } } }xapool-1.5.0-src/src/org/enhydra/jdbc/pool/StandardXAPoolDataSource.java~0000644000175000017500000001644710235646676026317 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.pool; import java.sql.SQLException; import java.util.Hashtable; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.Name; import javax.naming.NamingException; import javax.naming.Reference; import javax.naming.StringRefAddr; import javax.sql.ConnectionEvent; import javax.sql.XAConnection; import javax.sql.XADataSource; import javax.transaction.TransactionManager; import javax.transaction.Transaction; import javax.transaction.SystemException; import javax.transaction.xa.XAResource; import org.enhydra.jdbc.standard.StandardXADataSource; import org.enhydra.jdbc.standard.StandardXAConnection; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * StandardXAPoolDataSource class allows to make some operations on * XAConnection. It implements PoolHelper for the 3 methods :

* create : create an XAConnection

* create(user,password) : create a PooledConnection with an other user/password

* testThisObject : check if the object is still valid

* checkThisObject : check if the object is closed

* expire : kill the object

*/ public class StandardXAPoolDataSource extends StandardPoolDataSource { public XADataSource xads; // object to build XAConnection public TransactionManager transactionManager; // the current Transaction Manager public Log glog = LogFactory.getLog("org.enhydra.jdbc.xapool"); /** * Constructor */ public StandardXAPoolDataSource() { super(); } /** * Constructor */ public StandardXAPoolDataSource(int initSize) { super(initSize); } /** * Constructor */ public StandardXAPoolDataSource(StandardXADataSource ds) { super(ds); setDataSource(ds); } /** * Constructor */ public StandardXAPoolDataSource(StandardXADataSource ds, int initSize) { super(ds, initSize); setDataSource(ds); } public void setTransactionManager(TransactionManager tm) { log.debug("StandardXAPoolDataSource:setTransactionManager"); transactionManager = tm; } /** * Invoked when the application calls close() * on its representation of the connection */ public void connectionClosed(ConnectionEvent event) { Object obj = event.getSource(); log.debug("StandardXAPoolDataSource:connectionClosed"); XAConnection xac = (XAConnection) obj; // cast it into an xaConnection Transaction tx = null; try { if (transactionManager == null) { TransactionManager tm = ((StandardXADataSource) xads).getTransactionManager(); if (tm == null) { throw new NullPointerException("TM is null"); } else // here we use tm instead to setup transactionManager = tm // if the current transactionManager property is null, it stays // there, and we continue to use the TM from the XADataSource tx = tm.getTransaction(); } else { tx = transactionManager.getTransaction(); } log.debug( "StandardXAPoolDataSource:connectionClosed get a transaction"); } catch (NullPointerException n) { // current is null: we are not in EJBServer. log.error( "StandardXAPoolDataSource:connectionClosed should not be used outside an EJBServer"); } catch (SystemException e) { log.error( "StandardXAPoolDataSource:connectionClosed getTransaction failed:" + e); } // delist Resource if in transaction // We must keep the connection till commit or rollback if ((tx != null) && (((StandardXAConnection) xac).connectionHandle.isReallyUsed)) { try { tx.delistResource(xac.getXAResource(), XAResource.TMSUCCESS); // delist the xaResource log.debug( "StandardXAPoolDataSource:connectionClosed the resourse is delisted"); } catch (Exception e) { log.error( "StandardXAPoolDataSource:connectionClosed Exception in connectionClosed:" + e); } } log.debug( "StandardXAPoolDataSource:connectionClosed checkIn an object to the pool"); pool.checkIn(obj); // return the connection to the pool } public GenerationObject create(String _user, String _password) throws SQLException { GenerationObject genObject; XAConnection xaCon = xads.getXAConnection(_user, _password); // get the xa connection xaCon.addConnectionEventListener(this); // add it to the event listener log.debug( "StandardXAPoolDataSource:create create a object for the pool"); genObject = new GenerationObject(xaCon, pool.getGeneration(), _user, _password); return genObject; } /** * Retrieves the Reference of this object. Used at binding time by JNDI * to build a reference on this object. * * @return The non-null Reference of this object. * @exception NamingException If a naming exception was encountered while * retrieving the reference. */ public Reference getReference() throws NamingException { log.debug( "StandardXAPoolDataSource:getReference return a reference of the object"); Reference ref = super.getReference(); ref.add( new StringRefAddr("transactionManagerName", "TransactionManager")); return ref; } /* (non-Javadoc) * @see javax.naming.spi.ObjectFactory#getObjectInstance(java.lang.Object, javax.naming.Name, javax.naming.Context, java.util.Hashtable) */ public Object getObjectInstance( Object refObj, Name name, Context nameCtx, Hashtable env) throws Exception { super.getObjectInstance(refObj, name, nameCtx, env); Reference ref = (Reference) refObj; InitialContext ictx = new InitialContext(env); this.setTransactionManager( (TransactionManager) ictx.lookup( "javax.transaction.TransactionManager")); this.setDataSource((XADataSource) ictx.lookup(this.dataSourceName)); log.debug("StandardPoolDataSource:getObjectInstance: instance created"); return this; } /** Getter for property dataSource. * @return Value of property dataSource. */ public XADataSource getDataSource() { return xads; } /** Setter for property dataSource. * @param dataSource New value of property dataSource. */ public void setDataSource(XADataSource dataSource) { this.xads = dataSource; if (transactionManager != null) ((StandardXADataSource) dataSource).setTransactionManager( transactionManager); } public String toString() { StringBuffer sb = new StringBuffer(); sb.append("StandardXAPoolDataSource:\n"); if (this.transactionManager != null) sb.append(" transaction manager=<"+this.transactionManager.toString()+">\n"); sb.append(this.xads.toString()); sb.append(super.toString()); return sb.toString(); } }xapool-1.5.0-src/src/org/enhydra/jdbc/pool/GenericPool.java~0000644000175000017500000006317610235646676023730 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.pool; import java.util.Hashtable; import java.util.Enumeration; import java.util.Vector; import org.enhydra.jdbc.core.JdbcThreadFactory; import org.enhydra.jdbc.util.Logger; /** * GenericPool is the main class of the Pool. It works with any kind * of object that's implement PoolHelper (must provide specific * operation on the specific object) * Objects stored in hashtables are GenerationObject object. These objects * allow to store multiples things in them, in particular, the * generation number to identify the generation of an object. */ public class GenericPool { private long lifeTime; // lifetime of an object in the pool private Hashtable locked, unlocked; // two hashtables, to stock objects in use and free objects private Vector hitList; // holds expired objects until they are killed. private JdbcThreadFactory threadFactory; // thread factory private int minSize; // minimum size of the pool, set to 0 private int maxSize; // maximum size of the pool, if set to 0 : unlimited private PoolHelper poolHelper; // object type private int count; // count the number of object in the pool private boolean gc; // gc system call private boolean debug; // debug flag private long deadLockMaxWait; // time to wait before deadlock (return exception) private long deadLockRetryWait; // time to wait before 2 try of loop private Logger log; /** * checking level object * 0 = no special checking * 1 = just a check on an object * 2 = test the object * 3 = just a check on an object (for all the objects) * 4 = test the object (for all the objects) */ private int checkLevelObject; protected Thread keeper; // thread to clean up dead objects protected PoolKeeper poolKeeper; private long sleepTime; // sleeptime for the pool keeper /** * Generation number. When an error occurs, all objects of the * same generation or earlier are dropped. */ protected int generation = 1; // Default values public static final long DEFAULT_EXPIRATION = 600000; // 10 minutes //public static final long DEFAULT_EXPIRATION = 30000; // 30 secondes public static final long DEFAULT_SLEEPTIME = 300000; // 5 minutes public static final int DEFAULT_MINSIZE = 2; // 2 objects public static final int DEFAULT_MAXSIZE = 50; // 50 objects public static final int DEFAULT_DEADLOCKMAXWAIT = 300000; // 5 minutes public static final int DEFAULT_DEADLOCKRETRYWAIT = 10000; // 10 seconds /** * Creates an GenericPool with the default params. */ public GenericPool(PoolHelper helper) { this( helper, DEFAULT_MINSIZE, DEFAULT_MAXSIZE, DEFAULT_EXPIRATION, DEFAULT_SLEEPTIME); } public GenericPool(PoolHelper helper, int initSize) { this( helper, DEFAULT_MINSIZE, initSize, DEFAULT_EXPIRATION, DEFAULT_SLEEPTIME); } /** * Constructor, set the two hashtables and set by default the other values */ public GenericPool( PoolHelper helper, int minSize, int maxSize, long lifeTime, long sleepTime) { this.threadFactory = null; this.lifeTime = lifeTime; this.minSize = minSize; this.maxSize = maxSize; this.poolHelper = helper; // helper is the type of the object (interface) this.sleepTime = sleepTime; this.checkLevelObject = 0; this.deadLockMaxWait = DEFAULT_DEADLOCKMAXWAIT; this.deadLockRetryWait = DEFAULT_DEADLOCKRETRYWAIT; } /** * Start method, to initialize independant values of the pool */ public synchronized void start() { locked = new Hashtable(); // create locked objects pool unlocked = new Hashtable(); // create unlocked objects pool hitList = new Vector(); count = 0; // 0 element to start gc = false; // do not actions concerning garbage collector long now = System.currentTimeMillis(); // current time // to obtain to the beginning minSize objects in the pool for (int i = 0; i < minSize; i++) { // count have to be equal to minSize try { GenerationObject genObject = poolHelper.create(); unlocked.put(genObject, new Long(now)); // put it in the unlocked pool } catch (Exception e) { log.error("Error Exception in GenericPool:start " + e); } ++count; // there is one more element in the pool } //keeper removes dead or useless objects if (threadFactory != null) { try { this.poolKeeper = new PoolKeeper(sleepTime, this); this.keeper = threadFactory.getThread(poolKeeper); } catch (Exception e) { throw new IllegalStateException(e.getMessage()); } } else { //keep a handle to the poolkeeper so we can destroy it later this.poolKeeper = new PoolKeeper(sleepTime, this); this.keeper = new Thread(poolKeeper); } keeper.start(); // start the thread to verify element in the pool(unlocked) log.debug("GenericPool:start pool started"); } /* * Returns object from the pool or creates a connection * outside synchronization to prevent hanging. */ private Object getFromPool(String user, String password) throws Exception { long now = System.currentTimeMillis(); // current time to compare if (getUnlockedObjectCount() > 0) { // now, we have to return an object to the user GenerationObject o = null; Object realObject = null; Long life = null; Enumeration e = unlocked.keys(); // then take them while (e.hasMoreElements()) { // for each objects ... synchronized (this) { if (!e.hasMoreElements()) break; // recheck for synchronization. o = (GenerationObject) e.nextElement(); life = (Long) unlocked.get(o); unlocked.remove(o); // In any case the object will be removed. // Prevents others accessing the object while we are // not synchronized. realObject = o.getObj(); } // first, verify if the object is not dead (lifetime) if ((now - life.longValue()) > lifeTime) { // object has expired log.debug("GenericPool:getFromPool an object has expired"); removeUnlockedObject(o); } else { log.debug( "GenericPool:getFromPool check the owner of the connection"); if (checkOwner(o, user, password)) { log.debug("GenericPool:getFromPool owner is verified"); // second, verification of the object if needed if ((checkLevelObject == 0) || ((checkLevelObject == 1) && poolHelper.checkThisObject(realObject)) || ((checkLevelObject == 2) && poolHelper.testThisObject(realObject))) { locked.put(o, new Long(now)); // put it in the locked pool log.debug( "GenericPool:getFromPool return an object (after verification if needed)"); return (o.getObj()); // return this element } else { // object failed validation log.debug( "GenericPool:getFromPool kill an object from the pool"); removeUnlockedObject(o); } } else log.debug("GenericPool:getFromPool owner is FALSE"); } } } // if getUnlockedObjectCount() > 0 // if no objects available, create a new one boolean create = false; synchronized (this) { if (count < maxSize) { create = true; count++; // assume we can create a connection. } } if (create) { // if number of pooled object is < max size of the pool log.debug( "GenericPool:getFromPool no objects available, create a new one"); try { GenerationObject genObject = poolHelper.create(user, password); locked.put(genObject, new Long(now)); // put it in the locked pool return (genObject.getObj()); // and return this element } catch (Exception excp) { synchronized (this) { count--; // our assumption failed. rollback. } log.error( "GenericPool:getFromPool Error Exception in GenericPool:getFromPool"); // cney: rethrow exception thrown by create throw excp; } } return null; } public synchronized boolean checkOwner( GenerationObject genObject, String user, String password) { return equals(user, genObject.getUser()) && equals(password, genObject.getPassword()); } JdbcThreadFactory getThreadFactory() { return threadFactory; } void setThreadFactory(JdbcThreadFactory tf) { threadFactory = tf; } private boolean equals(String a, String b) { if (a == null) return (b == null); if (b == null) return (a == null); return a.equals(b); } /** * return pooled object */ public Object checkOut(String user, String password) throws Exception { log.debug("GenericPool:checkOut an object"); long now = System.currentTimeMillis(); // current time to compare GenerationObject o; Enumeration e; Object realObject; log.debug( "GenericPool:checkOut UnlockedObjectCount=" + getUnlockedObjectCount()); log.debug( "GenericPool:checkOut LockedObjectCount=" + getLockedObjectCount()); log.debug( "GenericPool:checkOut count=" + count + " maxSize=" + maxSize); if (getUnlockedObjectCount() > 0) { // if there are objects in the unlocked pool if ((checkLevelObject == 3) || (checkLevelObject == 4)) { //need to verify all the objects e = unlocked.keys(); while (e.hasMoreElements()) { o = (GenerationObject) e.nextElement(); realObject = o.getObj(); // take the current object // first, verify if the object is not dead (lifetime) if ((now - ((Long) unlocked.get(o)).longValue()) > lifeTime) { // object has expired log.debug("GenericPool:checkOut an object has expired"); removeUnlockedObject(o); //minimumObject(user, password); // build object in the pool if it is lesser than minSize } else { log.debug( "GenericPool:checkOut check the owner of the connection"); if (checkOwner(o, user, password)) { if (((checkLevelObject == 3) && !poolHelper.checkThisObject(realObject)) || ((checkLevelObject == 4) && !poolHelper.testThisObject(realObject))) { log.debug( "GenericPool:checkOut remove object checkLevelObject=" + checkLevelObject); removeUnlockedObject(o); //minimumObject(user, password); // build object in the pool if it is lesser than minSize } } } } } } int currentWait = 0; Object obj = getFromPool(user, password); while ((obj == null) && (currentWait < getDeadLockMaxWait())) { log.info("GenericPool:checkOut waiting for an object :"+this.poolHelper.toString()); try { synchronized (this) { wait(getDeadLockRetryWait()); } } catch (InterruptedException excp) { log.error( "GenericPool:checkOut ERROR Failed while waiting for an object: " + excp); } currentWait += getDeadLockRetryWait(); obj = getFromPool(user, password); } if (obj == null) throw new Exception("GenericPool:checkOut ERROR impossible to obtain a new object from the pool"); return obj; } synchronized public void minimumObject() { minimumObject(null, null); } synchronized public void minimumObject(String user, String password) { log.debug( "GenericPool:minimumObject create object if there are less than minSize objects in the pool count =" + count); if ((count < minSize) && (unlocked != null)) { // if pool has less than minSize elements long now = System.currentTimeMillis(); // current time for (int i = count; i < minSize; i++) { //count have to be equal to minSize try { GenerationObject genObject; if ((user != null) && (password != null)) genObject = poolHelper.create(); else genObject = poolHelper.create(user, password); unlocked.put(genObject, new Long(now)); // put it in the unlocked pool } catch (Exception e) { log.error( "GenericPool:minimumObject Error Exception in GenericPool:minimumObject"); } } log.debug( "GenericPool:minimumObject count=" + count + " Unlocked=" + this.getUnlockedObjectCount() + " locked=" + this.getLockedObjectCount()); count = minSize; // pool has now minSize element } } /** * remove object from locked pool */ public synchronized void checkIn(Object o) { log.debug("GenericPool:checkIn return an object to the pool"); for (Enumeration enum = locked.keys(); enum.hasMoreElements(); ) { // for each object of GenerationObject obj = (GenerationObject) enum.nextElement(); // the locked pool if (obj.getObj().equals(o)) { locked.remove(obj); // remove the object from the locked pool unlocked.put(obj, new Long(System.currentTimeMillis())); // we have to verify if the generation of the object is still valid int genObj = obj.getGeneration(); // get the generation number // if the generation number of the object is not valid, test the object if (generation > genObj) { if (!poolHelper.checkThisObject(obj.getObj())) // if the object is not valid removeUnlockedObject(obj); } notifyAll(); } } if (count > maxSize) { // if we have more than maxSize object in the pool log.info( "GenericPool:checkIn more than maxSize object in the pool"); Enumeration enum = unlocked.keys(); // get the unlocked pool for (int i = maxSize; i < count; i++) { // try to remove object from this pool if (getUnlockedObjectCount() > 0) { GenerationObject obj = (GenerationObject) enum.nextElement(); removeUnlockedObject(obj); } } // now, the size of the pool is changed // NOTE : count number ca be greater than maxSize here, in case of there is no // available object to delete in the unlocked pool count = getUnlockedObjectCount() + getLockedObjectCount(); if (count > maxSize) log.warn( "GenericPool:checkIn Be careful, the maximum size of the pool does not correspond" + " to your data. When objects will be check in, the pool " + "will decrease"); } } synchronized private void removeUnlockedObject(GenerationObject obj) { --count; notifyAll(); // there is room for new connections. unlocked.remove(obj); hitList.add(obj); // killing is done by the keeper thread. } public void setDebug(boolean debug) { this.debug = debug; } public boolean isDebug() { return debug; } public synchronized void setMinSize(int min) throws Exception { if (min < 0) throw new Exception("GenericPool:setMinSize Minimum size of the pool can't be lesser than 0"); else if (min > maxSize) throw new Exception( "GenericPool:setMinSize Minimum size of the pool can't be greater than the maxSize (" + maxSize + ")"); else { this.minSize = min; //minimumObject(); // build object in the pool if it is lesser than minSize } } public synchronized void setMaxSize(int max) throws Exception { if (max < 0) throw new Exception("GenericPool:setMaxSize Maximum size of the pool can't be lesser than 0"); else if (max < minSize) throw new Exception( "GenericPool:setMaxSize Maximum size of the pool can't be lesser than the minSize (" + minSize + ")"); else { this.maxSize = max; if (count > max) { // if pool has more than max element log.info( "GenericPool:setMaxSize pool has more than max element"); // we try to remove element from the unlocked pool Enumeration enum = unlocked.keys(); for (int i = max; i < count; i++) { if (getUnlockedObjectCount() > 0) { // if there is element in the unlocked pool GenerationObject o = (GenerationObject) enum.nextElement(); removeUnlockedObject(o); } } // new size is : count = getUnlockedObjectCount() + getLockedObjectCount(); // if there is still more than max element, the objects will be removed // when the check in operation will be performed. if (count > max) log.warn( "GenericPool:setMaxSize Be careful, the maximum size of " + "the pool does not correspond to your data. When objects " + "will be check in, the pool will decrease"); } } } public void setLifeTime(long lifeTime) { this.lifeTime = lifeTime; } public void setSleepTime(long sleepTime) { this.sleepTime = sleepTime; } public void setGeneration(int generation) { this.generation = generation; log.debug( "GenericPool:setGeneration Be careful, it is very dangerous to change " + "the generation number, many objects could be destroyed"); } public void setGC(boolean gc) { this.gc = gc; } /** * level are accepted between 0 and 4 */ public void setCheckLevelObject(int level) { if ((level > 0) && (level <= 4)) this.checkLevelObject = level; } public void setDeadLockMaxWait(long deadLock) { this.deadLockMaxWait = deadLock; } public void setDeadLockRetryWait(long deadLockRetryWait) { this.deadLockRetryWait = deadLockRetryWait; } public int getMinSize() { return minSize; } public int getMaxSize() { return maxSize; } public long getLifeTime() { return lifeTime; } public boolean isGC() { return gc; } public int getCount() { return count; } public long getSleepTime() { return sleepTime; } public int getGeneration() { return generation; } public int getCheckLevelObject() { return checkLevelObject; } /** * switch off the pool */ public void stop() { log.debug("GenericPool:stop start to stop the pool"); if ((getLockedObjectCount() != 0) || (getUnlockedObjectCount() != 0)) { expireAll(); // try to kill all the objects in the 2 pools if (poolKeeper != null) poolKeeper.stop(); // release the pool. keeper.interrupt(); // and interrupt the pool keeper locked.clear(); // clear the locked pool unlocked.clear(); // clear the unlocked pool locked = null; unlocked = null; count = 0; // there is no element in the pool } log.debug("GenericPool:stop pool stopped"); } /** * returns the current number of objects that are locked */ public int getLockedObjectCount() { if (locked != null) return locked.size(); else return 0; } /** * returns the current number of objects that are unlocked */ public int getUnlockedObjectCount() { if (unlocked != null) return unlocked.size(); else return 0; } public long getDeadLockMaxWait() { return this.deadLockMaxWait; } public long getDeadLockRetryWait() { return this.deadLockRetryWait; } /** * returns information from the pool */ public String toString() { StringBuffer sb = new StringBuffer(); sb.append("GenericPool:\n"); sb.append(" num of element =<"+ count+">\n"); sb.append(" minSize =<"+ minSize+">\n"); sb.append(" maxSize =<"+ maxSize+">\n"); sb.append(" lifeTime =<"+ lifeTime+">\n"); sb.append(" ngeneration =<"+ generation+">\n"); sb.append(" getLockedObjectCount() =<"+ getLockedObjectCount()+">\n"); sb.append(" getUnlockedObjectCount() =<"+ getUnlockedObjectCount()+">\n"); sb.append(" getDeadLockMaxWait() =<"+ getDeadLockMaxWait()+">\n"); sb.append(" getDeadLockRetryWait() =<"+ getDeadLockRetryWait()+">\n"); if (unlocked != null) { sb.append("Unlocked pool:\n"); Enumeration e = unlocked.keys(); while (e.hasMoreElements()) { GenerationObject o = (GenerationObject) e.nextElement(); sb.append(o.getObj().toString()); } } if (locked != null) { sb.append("Locked pool:\n"); Enumeration e = unlocked.keys(); while (e.hasMoreElements()) { GenerationObject o = (GenerationObject) e.nextElement(); sb.append(o.getObj().toString()); } } return sb.toString(); } /** * Remove unusable objects from the pool, called by PoolKeeper * Check the unlocked objects for expired members. */ protected void cleanUp() { // During shutdown, unlocked may be null. synchronized (this) { if (unlocked == null) return; } long now = System.currentTimeMillis(); // current time synchronized (this) { for (Enumeration enum = unlocked.keys(); enum.hasMoreElements(); ) { // for each object of the GenerationObject o = (GenerationObject) enum.nextElement(); // unlocked pool long lasttouch = ((Long) unlocked.get(o)).longValue(); // birth day of the pool if ((now - lasttouch) > lifeTime) { // if the object has expired log.debug("GenericPool:cleanUp clean up the pool"); removeUnlockedObject(o); } } } // Kill every object in the hit list. We do this outside synchronization // in case it takes too long. Note that hitList only grows so this is // a safe way to do this. while (hitList.size() > 0) { // kill each object. // this might take a while, lets do it outside synchronization. GenerationObject obj = (GenerationObject) hitList.remove(0); log.debug("GenericPool:cleanUp killing an object"); poolHelper.expire(obj.getObj()); // try to "kill" it obj.killObject(); } if (isGC()) // if the pool is GCeable System.gc(); // launch system call to clean up unused objects boolean resize = false; // Lets keep the look outside synchronization as object creation // may take a while. synchronized (this) { resize = count < minSize; } if (resize) { // if there is less than minSize objects in the pool log.info( "GenericPool:cleanUp less than minSize objects in the pool " + "min=" + minSize + " max=" + maxSize + " count=" + count); while (true) { try { GenerationObject genObject = poolHelper.create(); synchronized (this) { unlocked.put(genObject, new Long(now)); // put it in the unlocked pool ++count; // there is one more element in the pool notifyAll(); if (count >= minSize) break; // we want to make the test inside sync but leave the loop // outside sync. } } catch (Exception e) { log.error( "GenericPool:cleanUp Error Exception in GenericPool:cleanUp"); } synchronized (this) { notifyAll(); } } log.info( "GenericPool:cleanUp done " + "min=" + minSize + " max=" + maxSize + " count=" + count); } } /** * close all object in the unlocked and locked structures */ void expireAll() { log.debug( "GenericPool:expireAll close all object in the unlocked and locked structures"); for (Enumeration enum = unlocked.keys(); enum.hasMoreElements(); ) { // for each object of GenerationObject o = (GenerationObject) enum.nextElement(); // the unlocked pool poolHelper.expire(o.getObj()); // try to "kill" the object o.killObject(); o = null; } for (Enumeration enum = locked.keys(); enum.hasMoreElements(); ) { // for each object of GenerationObject o = (GenerationObject) enum.nextElement(); // the locked pool poolHelper.expire(o.getObj()); // try to "kill" the object o.killObject(); o = null; } } /** * Allows to verify if objects from the pool - for the o generation - * are valid or not. (only for the unlocked pool, to avoid to allocate * non-valid object */ public void nextGeneration(Object obj) { log.debug("GenericPool:nextGeneration"); int genObj = 0; for (Enumeration enum = locked.keys(); enum.hasMoreElements(); ) { // for each object of GenerationObject o = (GenerationObject) enum.nextElement(); // the locked pool if (o.getObj().equals(obj)) genObj = o.getGeneration(); // get the generation number } for (Enumeration enum = unlocked.keys(); enum.hasMoreElements(); ) { // for each object of GenerationObject o = (GenerationObject) enum.nextElement(); // the unlocked pool if (o.getGeneration() <= genObj) { // all objects of the same generation // or earlier are dropped if (!poolHelper.checkThisObject(o.getObj())) // if the object is not valid removeUnlockedObject(o); } } ++this.generation; // now, we work with the next generation of object } /** * removes an object for the locked pool, when an error has occurred */ synchronized public void removeLockedObject(Object obj) { log.debug("GenericPool:removeObject remove an object"); for (Enumeration enum = locked.keys(); enum.hasMoreElements(); ) { // for each object of GenerationObject o = (GenerationObject) enum.nextElement(); // the locked pool if (o.getObj().equals(obj)) { locked.remove(o); // remove the object from the locked pool --count; o.killObject(); o = null; } } } /** * Outputs a log message to the log writer. */ public void setLogger(Logger alog) { log = alog; } public Hashtable getLockedObject() { return locked; } }xapool-1.5.0-src/src/org/enhydra/jdbc/standard/0000755000175000017500000000000010235646676021273 5ustar twernertwernerxapool-1.5.0-src/src/org/enhydra/jdbc/standard/PreparedStatementCache.java0000644000175000017500000000351210235646676026512 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.standard; import org.enhydra.jdbc.util.LRUCache; import java.sql.PreparedStatement; import java.sql.SQLException; /** * Implementation of LRUCache to handle prepared statements * TODO: Override put to check type */ public class PreparedStatementCache extends LRUCache { /** * Constructor */ public PreparedStatementCache(int maxSize) { super(maxSize); } /** * Overriden to close the statement */ protected void cleanupObject(Object obj) { if (obj != null) { log.debug( "PreparedStatementCache:cleanupObject class='" + obj.getClass() + "'"); log.debug( "PreparedStatementCache:cleanupObject close a PreparedStatement o=" + "'" + obj.toString() + "'"); } try { ((PreparedStatement) obj).close(); //obj = null; } catch (SQLException e) { log.error( "PreparedStatementCache:cleanupObject problem to close" + "a PreparedStatement: " + e); } } } xapool-1.5.0-src/src/org/enhydra/jdbc/standard/StandardConnectionHandle.java0000644000175000017500000003106710235646676027041 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.standard; import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.Enumeration; import java.util.Hashtable; import java.sql.Connection; import org.enhydra.jdbc.core.CoreConnection; import org.enhydra.jdbc.util.LRUCache; /** * This is an implementation of java.sql.Connection which simply * delegates almost everything to an underlying physical implemention * of the same interface. * * It relies on a StandardPooledConnection to create it and to supply the * physical connection and a cache of PreparedStatements. This class will * try to re-use PreparedStatements wherever possible and will add to the * cache when totally new PreparedStatements get created. */ public class StandardConnectionHandle extends CoreConnection { StandardPooledConnection pooledCon; // the pooled connection that created this object protected Hashtable masterPrepStmtCache; // the hashtable of caches, indexed by physical connection int preparedStmtCacheSize; // the size of the connection-specific cache protected LRUCache preparedStatementCache = null; // prepared statements indexed by SQL string public Hashtable inUse; // prepared statements that are currently in use private boolean closed; // set true when this connection has been closed public boolean isReallyUsed = false; /** * Constructor. */ public StandardConnectionHandle( StandardPooledConnection pooledCon, Hashtable preparedStatementCache, int preparedStmtCacheSize) { super(pooledCon.getPhysicalConnection()); // get the real connection this.pooledCon = pooledCon; // first save parameters masterPrepStmtCache = preparedStatementCache; this.preparedStmtCacheSize = preparedStmtCacheSize; log = pooledCon.dataSource.log; setupPreparedStatementCache(); inUse = new Hashtable(10, 0.5f); log.debug( "StandardConnectionHandle:new StandardConnectionHandle with " + preparedStmtCacheSize + " prepared statement"); } protected void setupPreparedStatementCache() { log.debug("StandardConnectionHandle:setupPreparedStatementCache start"); if (preparedStmtCacheSize == 0) { log.debug( "StandardConnectionHandle:setupPreparedStatementCache return with 0"); preparedStatementCache = null; return; } if (con == null) log.warn("Connection is null"); else { preparedStatementCache = (LRUCache) masterPrepStmtCache.get(con.toString()); if (preparedStatementCache == null) { preparedStatementCache = new PreparedStatementCache(preparedStmtCacheSize); preparedStatementCache.setLogger(log); masterPrepStmtCache.put(con.toString(), preparedStatementCache); log.debug( "StandardConnectionHandle:setupPreparedStatementCache " + "preparedStatementCache.size(lru)='" + preparedStatementCache.LRUSize() + "' " + "preparedStatementCache.size(cache)='" + preparedStatementCache.cacheSize() + "' " + "masterPrepStmtCache.size='" + masterPrepStmtCache.size() + "' "); } else preparedStatementCache.setLogger(log); } log.debug("StandardConnectionHandle:setupPreparedStatementCache end"); } /** * Pre-invokation of the delegation, in case of connection is * closed, we throw an exception */ public void preInvoke() throws SQLException { if (closed) throw new SQLException("Connection is closed"); } /** * Exception management : catch or throw the exception */ public void catchInvoke(SQLException e) throws SQLException { //ConnectionEvent event = new ConnectionEvent (pooledCon);// create event associate with the connection //pooledCon.connectionErrorOccurred(event); // ppoled have to be closed throw (e); // throw the exception } /** * Closes this StandardConnectionHandle and prevents it * from being reused. It also returns used PreparedStatements * to the PreparedStatement cache and notifies all listeners. */ synchronized public void close() throws SQLException { log.debug("StandardConnectionHandle:close"); // Note - we don't check to see if already closed. Some servers get confused. closed = true; // connection now closed Enumeration keys = inUse.keys(); // get any prepared statements in use while (keys.hasMoreElements()) { // while more prepared statements used Object key = keys.nextElement(); // get next key returnToCache(key); // return prepared statement to cache } pooledCon.closeEvent(); // notify listeners if (preparedStatementCache != null) preparedStatementCache.cleanupAll(); if ((preparedStatementCache != null) && (masterPrepStmtCache != null) && (log != null)) log.debug( "StandardConnectionHandle:close " + "preparedStatementCache.size(lru)='" + preparedStatementCache.LRUSize() + "' " + "preparedStatementCache.size(cache)='" + preparedStatementCache.cacheSize() + "' " + "masterPrepStmtCache.size='" + masterPrepStmtCache.size() + "' "); } /** * Removes a prepared statement from the inUse list * and returns it to the cache. */ void returnToCache(Object key, Connection theCon) { Object value = inUse.remove(key); // remove key/value from used statements if (value != null) { LRUCache theCache = (LRUCache) masterPrepStmtCache.get(theCon.toString()); theCache.put(key, value); // place back in cache, ready for re-use } } void returnToCache(Object key) { returnToCache(key, con); } /** * Checks to see if a prepared statement with the same concurrency * has already been created. If not, then a new prepared statement * is created and added to the cache. * * If a prepared statement is found in the cache then it is removed * from the cache and placed on the "inUse" list. This ensures that * if multiple threads use the same StandardConnectionHandle, or a single * thread does multiple prepares using the same SQL, then DIFFERENT * prepared statements will be returned. */ synchronized PreparedStatement checkPreparedCache( String sql, int type, int concurrency, int holdability) throws SQLException { log.debug( "StandardConnectionHandle:checkPreparedCache sql='" + sql + "'"); PreparedStatement ret = null; // the return value // NOTE - We include the Connection in the lookup key. This has no // effect here but is needed by StandardXAConnection where the the physical // Connection used can vary over time depending on the global transaction. String lookupKey = sql + type + concurrency; // used to lookup statements if (preparedStatementCache != null) { Object obj = preparedStatementCache.get(lookupKey); // see if there's a PreparedStatement already if (obj != null) { // if there is ret = (PreparedStatement) obj; // use as return value try { ret.clearParameters(); // make it look like new } catch (SQLException e) { // Bad statement, so we have to create a new one ret = createPreparedStatement(sql, type, concurrency, holdability); } preparedStatementCache.remove(lookupKey); // make sure it cannot be re-used inUse.put(lookupKey, ret); // make sure it gets reused by later delegates } else { // no PreparedStatement ready ret = createPreparedStatement(sql, type, concurrency, holdability); inUse.put(lookupKey, ret); // will get saved in prepared statement cache } } else { ret = createPreparedStatement(sql, type, concurrency, holdability); } // We don't actually give the application a real PreparedStatement. Instead // they get a StandardPreparedStatement that delegates everything except // PreparedStatement.close(); ret = new StandardPreparedStatement(this, ret, lookupKey); return ret; } synchronized PreparedStatement checkPreparedCache( String sql, int autogeneratedkeys) throws SQLException { log.debug( "StandardConnectionHandle:checkPreparedCache sql='" + sql + "'"); PreparedStatement ret = null; // the return value // NOTE - We include the Connection in the lookup key. This has no // effect here but is needed by StandardXAConnection where the the physical // Connection used can vary over time depending on the global transaction. String lookupKey = sql + autogeneratedkeys; // used to lookup statements if (preparedStatementCache != null) { Object obj = preparedStatementCache.get(lookupKey); // see if there's a PreparedStatement already if (obj != null) { // if there is ret = (PreparedStatement) obj; // use as return value try { ret.clearParameters(); // make it look like new } catch (SQLException e) { // Bad statement, so we have to create a new one ret = createPreparedStatement(sql, autogeneratedkeys); } preparedStatementCache.remove(lookupKey); // make sure it cannot be re-used inUse.put(lookupKey, ret); // make sure it gets reused by later delegates } else { // no PreparedStatement ready ret = createPreparedStatement(sql, autogeneratedkeys); inUse.put(lookupKey, ret); // will get saved in prepared statement cache } } else { ret = createPreparedStatement(sql, autogeneratedkeys); } // We don't actually give the application a real PreparedStatement. Instead // they get a StandardPreparedStatement that delegates everything except // PreparedStatement.close(); ret = new StandardPreparedStatement(this, ret, lookupKey); return ret; } protected PreparedStatement createPreparedStatement( String sql, int type, int concurrency, int holdability) throws SQLException { log.debug( "StandardConnectionHandle:createPreparedStatement type ='" + type + "'"); if (type == 0 && holdability == 0) { // if no type or concurrency specified return con.prepareStatement(sql); // create new prepared statement } else if (holdability == 0) { return con.prepareStatement(sql, type, concurrency); // create new prepared statement } else return con.prepareStatement(sql, type, concurrency, holdability); } protected PreparedStatement createPreparedStatement( String sql, int autogeneratedkeys) throws SQLException { log.debug( "StandardConnectionHandle:createPreparedStatement autogeneratedkeys ='" + autogeneratedkeys + "'"); return con.prepareStatement(sql, autogeneratedkeys); // create new prepared statement } /** * Creates a PreparedStatement for the given SQL. If possible, the * statement is fetched from the cache. */ public PreparedStatement prepareStatement(String sql) throws SQLException { log.debug( "StandardConnectionHandle:prepareStatement sql='" + sql + "'"); preInvoke(); try { return checkPreparedCache(sql, 0, 0, 0); } catch (SQLException e) { catchInvoke(e); } return null; } /** * Creates a PreparedStatement for the given SQL, type and concurrency. * If possible, the statement is fetched from the cache. */ public PreparedStatement prepareStatement( String sql, int resultSetType, int resultSetConcurrency) throws SQLException { preInvoke(); try { return checkPreparedCache(sql, resultSetType, resultSetConcurrency, 0); } catch (SQLException e) { catchInvoke(e); } return null; } public PreparedStatement prepareStatement( String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { preInvoke(); try { return checkPreparedCache(sql, resultSetType, resultSetConcurrency, resultSetHoldability); } catch (SQLException e) { catchInvoke(e); } return null; } public boolean isClosed() throws SQLException { return closed; } public CallableStatement prepareCall( String sql, int resultSetType, int resultSetConcurrency) throws SQLException { preInvoke(); try { return con.prepareCall(sql, resultSetType, resultSetConcurrency); } catch (SQLException e) { catchInvoke(e); } return null; } } xapool-1.5.0-src/src/org/enhydra/jdbc/standard/StandardConnectionPoolDataSource.java0000644000175000017500000000647110235646676030533 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.standard; import java.sql.SQLException; import java.util.Hashtable; import javax.sql.ConnectionPoolDataSource; import javax.sql.PooledConnection; import java.util.Enumeration; import org.enhydra.jdbc.util.LRUCache; /** * A data source used to create generic pooled connections (factory) */ public class StandardConnectionPoolDataSource extends StandardDataSource implements ConnectionPoolDataSource { private Hashtable masterPrepStmtCache; int preparedStmtCacheSize; // size of prepared statement cache public static final int DEFAULT_PREPAREDSTMTCACHESIZE = 16; /** * Constructor. */ public StandardConnectionPoolDataSource() { super(); masterPrepStmtCache = new Hashtable(); preparedStmtCacheSize = DEFAULT_PREPAREDSTMTCACHESIZE; } /** * Create a pooled connection using the default username and password. */ public PooledConnection getPooledConnection() throws SQLException { log.debug( "StandardConnectionPoolDataSource:getPooledConnection(0) return a pooled connection"); return getPooledConnection(user, password); } /** * Create a standard pooled connection using the supplied username and password. */ synchronized public PooledConnection getPooledConnection( String user, String password) throws SQLException { log.debug( "StandardConnectionPoolDataSource:getPooledConnection(2) return a pooled connection"); StandardPooledConnection spc = new StandardPooledConnection(this, user, password); spc.setLogger(log); return spc; } public Hashtable getMasterPrepStmtCache() { return masterPrepStmtCache; } /** * Gets the size of the prepared statement cache */ public int getPreparedStmtCacheSize() { return preparedStmtCacheSize; } /** * Sets the size of the prepared statement cache */ public void setPreparedStmtCacheSize(int value) { preparedStmtCacheSize = value; if (preparedStmtCacheSize <= 0) { masterPrepStmtCache.clear(); } else { Enumeration enum = masterPrepStmtCache.elements(); while (enum.hasMoreElements()) { ((LRUCache) enum.nextElement()).resize(value); } } } public String toString() { StringBuffer sb = new StringBuffer(); sb.append("StandardConnectionPoolDataSource:\n"); sb.append(" master prepared stmt cache size=<"+this.masterPrepStmtCache.size()+">\n"); sb.append(" prepared stmt cache size =<"+this.preparedStmtCacheSize+">\n"); sb.append(super.toString()); return sb.toString(); } } xapool-1.5.0-src/src/org/enhydra/jdbc/standard/StandardDataSource.java0000644000175000017500000002223310235646676025653 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.standard; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Hashtable; import javax.naming.Context; import javax.naming.Name; import javax.naming.NamingException; import javax.naming.Reference; import javax.naming.StringRefAddr; import javax.sql.DataSource; import org.enhydra.jdbc.core.CoreDataSource; import java.sql.Driver; import java.util.Properties; import org.enhydra.jdbc.util.Logger; import org.apache.commons.logging.LogFactory; /** * Provides a Data Source which can be used to generate JDBC connections. *

* This class is generic in the sense that it does not rely upon anything other * than standard Java APIs. It uses java.sql.DriverManager and preconfigured * properties to construct a JDBC connection. * Important : networkProtocol, portNumber, serverName are not used. Please use * instead the url property. */ public class StandardDataSource extends CoreDataSource implements DataSource { // Standard Data Source properties transient Driver driver; String driverName; // name of the Standard JDBC driver String url; // an explicit JDBC URL used to access this data source private int transIsolation; // transaction isolation level private boolean loadedFromCCL = false; /** * Constructors */ public StandardDataSource() { // This constructor is needed by the object factory super(); driver = null; driverName = ""; url = ""; transIsolation = -1; //use default setLogger(new Logger(LogFactory.getLog("org.enhydra.jdbc.xapool"))); } protected StandardDataSource(Driver drv) throws SQLException { this(); driver = drv; driverName = drv.getClass().getName(); setLogger(new Logger(LogFactory.getLog("org.enhydra.jdbc.xapool"))); } /** * return the name of the driver * @return the string representation of the driver name */ public String getDriverName() { return driverName; } /** * return the url of the database * @return the string representation of the database url */ public String getUrl() { return url; } /** * set the name of the jdbc driver * @param driverName the string representation of the jdbc driver name * @throws SQLException */ public void setDriverName(String driverName) throws SQLException { if (!this.driverName.equals(driverName)) { this.driverName = driverName; driver = null; } /* try { driver= (Driver)Class.forName (driverName).newInstance(); log("StandardDataSource:setDriverName a new driver instance is created"); } catch (Exception e) { throw new SQLException ("Error trying to load driver: "+driverName+"\n"+e.getMessage()); } // try-catch */ } /** * set the database url * @param url the string representation of the database url */ public void setUrl(String url) { this.url = url; } /** * set the level of the transaction isolation for the current database * @param level the integer level */ public void setTransactionIsolation(int level) { transIsolation = level; } /** * return the transaction isolation level defined for the current database * @return the transaction isolation level */ public int getTransactionIsolation() { return transIsolation; } /** * * @return * @throws SQLException */ synchronized public Connection getConnection() throws SQLException { return getConnection(user, password); } /** * * @param u * @param p * @return * @throws SQLException */ synchronized public Connection getConnection(String u, String p) throws SQLException { Connection ret = null; // the connection that gets returned Properties prop = new Properties(); if (u != null) prop.put("user", u); if (p != null) prop.put("password", p); if (url == null) { // if no explicit url provided // Build URL from serverName, NetworkProtocol etc. } else { // explicit URL provided if (driver == null) { try { driver = (Driver) Class.forName(driverName).newInstance(); loadedFromCCL = false; log.debug( "StandardDataSource:getConnection a new driver instance is created"); } catch (Exception e) { try { driver = (Driver) Class .forName( driverName, true, Thread .currentThread() .getContextClassLoader()) .newInstance(); loadedFromCCL = true; } catch (Exception e2) { throw new SQLException( "Error trying to load driver: " + driverName + " : " + e2.getMessage()); } } } // commenting out since at least one driver will complain if you // instantiate the driver outside the Driver Manager // (ie. Cloudscape RMI) /* if (!driver.acceptsURL(url)) { log("Driver does not accept url "+url); throw new SQLException("Driver does not accept url "+url); } */ try { if (loadedFromCCL) { ret = driver.connect(url, prop); // Driver creates the connection } else { ret = DriverManager.getConnection(url, prop); // DriverManager creates the connection } int transIsolation = getTransactionIsolation(); if (transIsolation >= 0) { ret.setTransactionIsolation(transIsolation); } log.debug( "StandardDataSource:getConnection Connection from DriverManager is returned"); } catch (SQLException e) { throw new SQLException( "Cannot get connection for URL " + url + " : " + e.getMessage()); } } return ret; } /** * Methods inherited from referenceable */ public Reference getReference() throws NamingException { // Note that we use getClass().getName() to provide the factory // class name. It is assumed that this class, and all of its // descendants are their own factories. Reference ref = new Reference(getClass().getName(), getClass().getName(), null); ref.add(new StringRefAddr("driverName", getDriverName())); ref.add(new StringRefAddr("url", getUrl())); ref.add(new StringRefAddr("user", getUser())); ref.add(new StringRefAddr("password", getPassword())); ref.add(new StringRefAddr("description", getDescription())); ref.add( new StringRefAddr( "loginTimeout", Integer.toString(getLoginTimeout()))); ref.add( new StringRefAddr( "transIsolation", Integer.toString(getTransactionIsolation()))); log.debug("StandardDataSource:getReference object returned"); return ref; } /** * Methods inherited from ObjectFactory */ public Object getObjectInstance( Object refObj, Name name, Context nameCtx, Hashtable env) throws Exception { Reference ref = (Reference) refObj; this.setDriverName((String) ref.get("driverName").getContent()); this.setUrl((String) ref.get("url").getContent()); this.setUser((String) ref.get("user").getContent()); this.setPassword((String) ref.get("password").getContent()); this.setDescription((String) ref.get("description").getContent()); this.setLoginTimeout( Integer.parseInt((String) ref.get("loginTimeout").getContent())); this.setTransactionIsolation( Integer.parseInt((String) ref.get("transIsolation").getContent())); return this; } public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } return false; /* if (obj instanceof StandardDataSource) { StandardDataSource other = (StandardDataSource)obj; if (!(this.url == null || this.user == null)) { return (this.url.equals(other.url) && this.user.equals(other.user)); } else if (this.url != null) { return (this.url.equals(other.url) && this.user == other.user); } else if (this.user != null) { return (this.url == other.url && this.user.equals(other.user)); } else { return (this.url == other.url && this.user == other.user); } } else { return false; } */ } /* (non-Javadoc) * @see java.lang.Object#toString() */ public String toString() { StringBuffer sb = new StringBuffer(); sb.append("StandardDataSource:\n"); sb.append(" driver=<" + driver +">\n"); sb.append(" url=<" + url + ">\n"); sb.append(" user=<" + user + ">\n"); sb.append(super.toString()); return sb.toString(); } public int hashCode() { return toString().hashCode(); } }xapool-1.5.0-src/src/org/enhydra/jdbc/standard/StandardPooledConnection.java0000644000175000017500000001252410235646676027065 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.standard; import org.enhydra.jdbc.util.Logger; import java.sql.Connection; import java.sql.SQLException; import java.util.Vector; import javax.sql.ConnectionEvent; import javax.sql.ConnectionEventListener; import javax.sql.PooledConnection; /** * Provides an implementation of javax.sql.PooledConnection which * is completely generic (i.e. it relies only on JDBC 1 functionality). * * This class maintains a physical database connection which is * passed to each StandardXAConnectionHandle when it is created. It is the * StandardXAConnectionHandle object which the application receives and which * it perceives as the java.sql.Connection object. * * StandardXAConnectionHandle objects pass PreparedStatements back to the * StandardPooledConnection so that they can be retained across * StandardXAConnectionHandle instantiations. */ public class StandardPooledConnection implements PooledConnection { protected StandardConnectionPoolDataSource dataSource; public Connection con; // the physical database connection public StandardConnectionHandle connectionHandle; // the last StandardConnectionHandle created Vector listeners; // objects listening for events on this connection boolean isClosed; // true if this connection has been closed public Logger log; /** * Creates the physical database connection. */ public StandardPooledConnection( StandardConnectionPoolDataSource dataSource, String user, String password) throws SQLException { this.dataSource = dataSource; con = dataSource.getConnection(user, password); listeners = new Vector(5, 5); } /** * Creates a new StandardConnectionHandle for use by an application. * If there is already a StandardConnectionHandle in use then it is * closed (i.e. the application has the connection withdrawn). */ synchronized public Connection getConnection() throws java.sql.SQLException { if (connectionHandle != null) { // if there's already a connection handle if (!connectionHandle.isClosed()) { // and it hasn't been closed connectionHandle.close(); // close it now } } newConnectionHandle(); return connectionHandle; } protected void newConnectionHandle() { log.debug("StandardPooledConnection:newConnectionHandle"); connectionHandle = new StandardConnectionHandle( this, dataSource.getMasterPrepStmtCache(), dataSource.getPreparedStmtCacheSize()); } public void close() throws java.sql.SQLException { con.close(); dataSource.getMasterPrepStmtCache().remove(con.toString()); } public void addConnectionEventListener(ConnectionEventListener listener) { listeners.addElement(listener); } public void removeConnectionEventListener(ConnectionEventListener listener) { listeners.removeElement(listener); } /** * Notifies all listeners that the StandardConnectionHandle created by this * PooledConnection has been closed. */ void closeEvent() { ConnectionEvent event = new ConnectionEvent(this); // create the event that we'll send for (int i = 0; i < listeners.size(); i++) { // for each listener Object obj = listeners.elementAt(i); // get next listener ConnectionEventListener cel = (ConnectionEventListener) obj; //cast to something more useful cel.connectionClosed(event); // notify this listener } } /** * Invoked when a fatal connection error occurs, * just before an SQLException is thrown to the application * * This method is automatically called when a fatal error * is detected on the base connection. The base connection * is the actual connection that backs the connection * handle provided by the getConnection() method */ public void connectionErrorOccurred(ConnectionEvent event) { for (int i = 0; i < listeners.size(); i++) { // for each listener Object obj = listeners.elementAt(i); // get next listener ConnectionEventListener cel = (ConnectionEventListener) obj; //cast to something more useful cel.connectionErrorOccurred(event); // notify this listener //cel.connectionClosed (event); // notify this listener } } /** * Access method allowing access to the underlying physical connection. */ public Connection getPhysicalConnection() { return con; } public void setLogger(Logger alog) { log = alog; } public String toString() { StringBuffer sb = new StringBuffer(); sb.append("StandardPooledConnection:\n"); sb.append(" is closed =<"+this.isClosed + ">\n"); sb.append(" connection =<"+this.con + ">\n"); return sb.toString(); } } xapool-1.5.0-src/src/org/enhydra/jdbc/standard/StandardPreparedStatement.java0000644000175000017500000000537110235646676027254 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.standard; import java.sql.PreparedStatement; import java.sql.SQLException; import org.enhydra.jdbc.core.CorePreparedStatement; /** * A very simple implementation of PreparedStatement. When created * it is supplied with another PreparedStatement to which nearly all * of this class' methods delegate their work. * * Close() is overridden to prevent the statement from actually * being closed. */ public class StandardPreparedStatement extends CorePreparedStatement { public Object key; // key that StandardConnectionHandle uses to return to cache private StandardConnectionHandle con; // the StandardConnectionHandle that created this object public boolean closed; // true when the PreparedStatement has been closed /** * Constructor. */ StandardPreparedStatement( StandardConnectionHandle con, PreparedStatement preparedStatement, Object key) { this.con = con; this.key = key; ps = preparedStatement; } StandardPreparedStatement() { super(); } /** * Close this statement. */ public void close() throws SQLException { // Note no check for already closed - some servers make mistakes closed = true; if (con.preparedStmtCacheSize == 0) { // no cache, so we just close if (ps != null) { ps.close(); } } else { con.returnToCache(key); // return the underlying statement to the cache } } /** * Pre-invokation of the delegation, in case of the Statement is * closed, we throw an exception */ public void preInvoke() throws SQLException { if (closed) throw new SQLException("Prepare Statement is closed"); } /** * Exception management : catch or throw the exception */ public void catchInvoke(SQLException sqlException) throws SQLException { //ConnectionEvent event = new ConnectionEvent(con.pooledCon); //con.pooledCon.connectionErrorOccurred(event); throw (sqlException); } } xapool-1.5.0-src/src/org/enhydra/jdbc/standard/StandardXACallableStatement.java0000644000175000017500000001032410235646676027434 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.standard; import java.sql.SQLException; import java.sql.CallableStatement; import org.enhydra.jdbc.core.CoreCallableStatement; import javax.transaction.Transaction; import javax.transaction.SystemException; import javax.transaction.RollbackException; public class StandardXACallableStatement extends CoreCallableStatement { private StandardXAConnectionHandle con; // the StandardConnectionHandle that created this object private boolean closed; // true when the Statement has been closed private String sql; private int resultSetType; private int resultSetConcurrency; private int resultSetHoldability; /** * Constructor. */ StandardXACallableStatement( StandardXAConnectionHandle con, String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { this.con = con; this.sql = sql; this.resultSetType = resultSetType; this.resultSetConcurrency = resultSetConcurrency; this.resultSetHoldability = resultSetHoldability; log = con.log; //cs = newStatement(); } private CallableStatement newStatement() throws SQLException { if (resultSetType == 0 && resultSetConcurrency == 0 && resultSetHoldability == 0) { return con.con.prepareCall(sql); } else if (resultSetHoldability == 0) { return con.con.prepareCall( sql, resultSetType, resultSetConcurrency); } else return con.con.prepareCall( sql, resultSetType, resultSetConcurrency, resultSetHoldability); } /** * Close this statement. */ public synchronized void close() throws SQLException { super.close(); // we do not reuse the Statement, we have to close it closed = true; } /** * Pre-invokation of the delegation, in case of the Statement is * closed, we throw an exception */ public synchronized void preInvoke() throws SQLException { if (closed) throw new SQLException("Prepare Statement is closed"); Transaction ntx = null; if (con.tx == null) { try { try { ntx = (con.transactionManager != null) ? con.transactionManager.getTransaction() : null; if (ntx != null) { con.tx = ntx; con.xacon.thisAutoCommit = con.getAutoCommit(); con.setAutoCommit(false); try { con.tx.enlistResource(con.xacon.getXAResource()); // enlist the xaResource in the transaction if (cs != null) { cs.close(); cs = null; } } catch (RollbackException n) { throw new SQLException( "StandardXAStatement:preInvoke enlistResource exception: " + n.toString()); } } //else con.setAutoCommit(true); } catch (SystemException n) { throw new SQLException( "StandardXAStatement:preInvoke getTransaction exception: " + n.toString()); } } catch (NullPointerException n) { // current is null: we are not in EJBServer. throw new SQLException( "StandardXAStatement:preInvoke should not be used outside an EJBServer: " + n.toString()); } } if (cs == null) { cs = newStatement(); } } /** * Exception management : catch or throw the exception */ public void catchInvoke(SQLException sqlException) throws SQLException { //ConnectionEvent event = new ConnectionEvent (con.pooledCon); //con.pooledCon.connectionErrorOccurred(event); throw (sqlException); } } xapool-1.5.0-src/src/org/enhydra/jdbc/standard/StandardXAConnection.java0000644000175000017500000006550110235646676026156 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.standard; import java.sql.Connection; import java.sql.SQLException; import javax.sql.XAConnection; import javax.transaction.xa.XAException; import javax.transaction.xa.XAResource; import javax.transaction.xa.Xid; import javax.naming.NamingException; import javax.naming.Reference; import javax.naming.Referenceable; import javax.naming.StringRefAddr; import javax.transaction.Status; import javax.transaction.TransactionManager; /** * Provides a generic wrapper for JDBC 1 drivers. JDBC 1 drivers always * associate a single transaction at every point in time with a physical * connection. J2EE drivers, on the other hand, allow an XAResource (and * therefore an XAConnection with which it has a one to one mapping) to * switch between global transactions. *

* To accomodate this, the StandardXADataSource class maintains a list of * Connection objects. When the Transaction Manager associates an XID * with a StandardXAConnection, it looks for a physical connection which * is associated with that transaction. *

* The "current" connection (super.con and curCon) is the connection * currently being used by the application (i.e. getConnection has * been called, but not Connection.close()). The current connection * is removed and handed to the data source if it becomes associated * with a global transaction. */ public class StandardXAConnection extends StandardPooledConnection implements XAConnection, XAResource, Referenceable, Runnable { protected StandardXAStatefulConnection curCon; // the "current" stateful connection, null if none private boolean commitOnPrepare; // true if commit takes place during prepare call boolean isClosed; // true if this connection has been closed private int timeoutSecs; // timeout in seconds private long timeoutPeriod = 60000; // interval in ms to check for timeouts private long nextTimeout; // time when next timeout occurs public Thread timerThread; // the thread that checks for timeouts public TransactionManager transactionManager; public StandardXAConnectionHandle connectionHandle; protected StandardXADataSource xaDataSource; public boolean thisAutoCommit = true; /** * Creates the first free connection. */ public StandardXAConnection( StandardXADataSource dataSource, String user, String password) throws SQLException { super(dataSource, user, password); // creates the first Connection object // Save the constructor parameters. this.xaDataSource = dataSource; curCon = new StandardXAStatefulConnection(dataSource, con); // wrap connection as a stateful connection // NOTE - the current connection is not made known to the data source // so it is not eligible for re-use. It only goes on the data source list // if it ever becomes associated with a global transaction. /* // get the timer thread if (xaDataSource.getThreadFactory() != null) { dataSource.log.debug("StandardXAConnection: Getting thread from factory"); timerThread = xaDataSource.getThreadFactory().getThread(this); dataSource.log.debug("StandardXAConnection: Got thread from factory"); } else { dataSource.log.debug("StandardXAConnection: Getting thread from new Thread()"); timerThread = new Thread (this); // create the backgroup thread to check for timeouts } timerThread.start(); // start the timer thread //timerThread.suspend(); // and suspend until some timeouts get set up */ dataSource.log.debug("StandardXAConnection created"); } /** * We are required to maintain a 1-1 mapping between an XAConnection * and its corresponding XAResource. We achieve this by implementing * both interfaces in the same class. */ public XAResource getXAResource() { return this; } /** * Creates a new StandardXAConnectionHandle for use by an application. * If there is already an StandardXAConnectionHandle in use then it is * closed (i.e. the application has the connection withdrawn). *

* This method always returns a Connection in the free state (i.e. * (not associated with an Xid). This is necessary since, unless * Start (Xid, flags) gets called, the Connection must do local * transaction processing. */ public synchronized Connection getConnection() throws SQLException { dataSource.log.debug("StandardXAConnection:getConnection"); if (connectionHandle != null) { // if there's already a delegated connection if (!connectionHandle.isClosed()) // and it hasn't been closed connectionHandle.close(); // close it now } if (curCon == null) { // if there's no current connection curCon = xaDataSource.getFreeConnection(); // find or create a free connection con = curCon.con; // save it's Connection } // Note that we share the PreparedStatement cache across many physical // connections. This is OK since the connection is used in the lookup key. this.newConnectionHandle(); dataSource.log.debug( "StandardXAConnection:getConnection return a connection"); return connectionHandle; } protected void newConnectionHandle() { connectionHandle = new StandardXAConnectionHandle( this, dataSource.getMasterPrepStmtCache(), dataSource.getPreparedStmtCacheSize(), transactionManager); } public void setTransactionManager(TransactionManager tm) { this.transactionManager = tm; } /** * Close this XA connection. */ public synchronized void close() throws java.sql.SQLException { dataSource.log.debug("StandardXAConnection:close the XAConnection"); // if (con != null) { // if we have a current connection // con.close(); // then close it // dataSource.getMasterPrepStmtCache().remove(con.toString()); // } //commenented by karthicks - in case of transacted connection curcon will be null and physical connection con will not be null //and physical will be part of freeconnection which would be used by some other instance of XAConnection object at this instant //so only the curCon and its is associated connected should be closed //it will happen fro non transacted connections. //in case of tx connectioins else part will come to play and close any freeconnections if (curCon != null && !curCon.con.isClosed()) { // if we have a current connection curCon.con.close(); // then close it dataSource.getMasterPrepStmtCache().remove(curCon.toString()); } else { // no "current" connection if (xaDataSource.freeConnections.size() > 1) { // if there are some free connections //curCon.con.setAutoCommit(thisAutoCommit); curCon = xaDataSource.getFreeConnection(); // get one of the free connections curCon.con.close(); // close it dataSource.getMasterPrepStmtCache().remove( curCon.con.toString()); } } curCon = null; // remove stateful connection con = null; // and physical connection xaDataSource.connectionClosed(); // tell data source that connection's gone isClosed = true; // connection is now closed connectionHandle = null; //timerThread.resume(); // stop the timeout checking nextTimeout = 0; // I don't know how the above line was // supposed to stop the thread but we // should really just set the condition // and let the thread stop itself } /** * Does most of the work of the start() call (below). Kept as * a separate method so that subclasses can call it and retain * the curCon property. */ public synchronized void doStart(Xid xid, int flags) throws XAException { dataSource.log.debug( "StandardXAConnection:doStart xid='" + xid + "' flags='" + flags + "'"); if (xid == null) throw new XAException(XAException.XAER_INVAL); // should only get called after a new/free connection has been made current /* commented by karthick if (curCon == null) { try { curCon = xaDataSource.getFreeConnection(); } catch (Exception e) { } dataSource.log.debug("StandardXAConnection:doStart curCon is null"); //throw new XAException (XAException.XAER_PROTO); } */ /* if ((curCon.getState() != Status.STATUS_NO_TRANSACTION) && (curCon.xid != xid )){ dataSource.log.error("StandardXAConnection:doStart Invalid state:status=" + curCon.getState() + ":id=" + curCon.id); throw new XAException (XAException.XAER_PROTO); } */ if (flags == TMRESUME || flags == TMJOIN) { // if resuming or joining an existing transaction try { xaDataSource.processToWait(); } catch (Exception e) { throw new XAException("Exception : " + e.toString()); } synchronized (xaDataSource) { if(curCon != null) { //free connections will be added if this is a new XAConnection object or previously an non transacted connection // so no need to check fori contains any as a precaution //commented by karthicks if(!xaDataSource.freeConnections.contains(curCon)) { xaDataSource.freeConnections.addElement(curCon); } } // save the current connection } curCon = xaDataSource.getConnection(xid, true); // must find connection handling xid con = curCon.con; // must use correct physical connection } // else { // xaDataSource.getConnection(xid, false); // // must NOT find connection handling xid // } //commented by karthicks -unnecessary fetch //moved by karthicks // should only get called after a new/free which has been called in different tx earlier if (curCon == null) { try { curCon = xaDataSource.getFreeConnection(); con = curCon.con; } catch (Exception e) { dataSource.log.error("error while gettting connection "+e,e); } dataSource.log.debug("StandardXAConnection:doStart curCon is null"); //throw new XAException (XAException.XAER_PROTO); } //on suspend all enlisted resource will get called so resetonresume will be set "true" to those StdxaconnHandle //on resume viceversa(deleisted resource ) will get enlisted again so start will get called and current tx will be reset //by - karthicks StandardXAConnectionHandle xad = connectionHandle; try { xad.setGlobalTransaction(true); if(flags == TMRESUME && xad.resetTxonResume) { xad.resetTxonResume = false; if(transactionManager != null && xad.tx == null) { try { connectionHandle.tx =transactionManager.getTransaction(); } catch(javax.transaction.SystemException se) { throw new XAException(se.toString()); } } } // delegate must use current physical connection } catch (SQLException e) { throw new XAException(e.toString()); } if (timeoutSecs != 0) { // if a timeout has been defined curCon.timeout = System.currentTimeMillis() // set the timeout +timeoutSecs * 1000; if (nextTimeout == 0) { // if there are currently no timeouts set up nextTimeout = curCon.timeout; // set new timeout notify(); //timerThread.resume(); // start checking for timeouts } else { // some timeouts already exist if (curCon.timeout < nextTimeout) { // if this expires sooner than next timeout nextTimeout = curCon.timeout; // set new timeout } } } curCon.xid = xid; // connection now associated with this XID curCon.timedOut = false; // forget about any old timeouts curCon.commitOnPrepare = commitOnPrepare; // tell it when to do a commit if (!xaDataSource.xidConnections.containsKey(xid)) { try { log.debug("StandardXAConnection:dostart before processToWait"); xaDataSource.processToWait(); log.debug("StandardXAConnection:dostart after processToWait"); } catch (Exception e) { throw new XAException("Exception : " + e.toString()); } synchronized (xaDataSource) { xaDataSource.xidConnections.put(xid, curCon); // place on allocated list } } curCon.setState(Status.STATUS_ACTIVE); // set new connection state } /** * Associates this XAConnection with a global transaction. This * is the only method which can associate the current connection * with a global transaction. It acts only on the current * connection which must have been previously established using * getConnection. */ public synchronized void start(Xid xid, int flags) throws XAException { dataSource.log.debug( "StandardXAConnection:start associate the current connection with a global transaction"); doStart(xid, flags); // do most of the work curCon = null; // no longer owned by this object //con = null; // ditto } /** * Ends a connection's association with a global transaction. *

* It need not act on the current transaction. There is an * interval between being returned to the pool manager and * being invoked by the transaction manager during which the * current connection can change. *

* Note that the only effect is to change the connection state. */ public synchronized void end(Xid xid, int flags) throws XAException { //not tested XS dataSource.log.debug("StandardXAConnection:end"); dataSource.log.debug( "StandardXAConnection:end xid='" + xid + "' flags='" + flags + "'"); if (xid == null) throw new XAException(XAException.XAER_INVAL); StandardXAStatefulConnection statecon = xaDataSource.getConnection(xid, true); // must find connection for this transaction int state = statecon.getState(); // get current state of connection if (state != Status.STATUS_ACTIVE) // must have had start() called throw new XAException(XAException.XAER_PROTO); /*System.out.println("connectionHandle.globalTransaction = false;\n"+ "connectionHandle.setAutoCommit(true);"); connectionHandle.globalTransaction = false; try { connectionHandle.setAutoCommit(true); } catch (SQLException sqle) { dataSource.log("StandardXAConnection pb: "+sqle); }*/ // try { //on suspend all end of enlisted resource will get called so resetonresume will be set "true" to those StdxaconnHandle //on resume viceversa(deleisted resource ) will get enlisted again so start will get called and current tx will be reset //by - karthicks if(connectionHandle.tx != null) { connectionHandle.resetTxonResume =true; } connectionHandle.tx = null; connectionHandle.globalTransaction = false; /* connectionHandle.setGlobalTransaction(false); } catch (SQLException sqle) { dataSource.log.error("StandardXAConnection:end pb "+sqle); } */ } /** * Does most of the work of a generic prepare. Kept as a * separate method so that sub-classes can call it and get * the StandardXAStatefulConnection back. */ public StandardXAStatefulConnection checkPreparedState(Xid xid) throws XAException { dataSource.log.debug("StandardXAConnection:checkPreparedState"); if (xid == null) throw new XAException(XAException.XAER_INVAL); StandardXAStatefulConnection statecon = xaDataSource.getConnection(xid, true); // must find connection for this transaction try { if (statecon.commitOnPrepare) { // if early commit is required statecon.con.commit(); // perform the commit operation now statecon.setState(Status.STATUS_PREPARING); // heuristaclly committed } else { statecon.setState(Status.STATUS_PREPARED); // prepared } } catch (SQLException e) { dataSource.log.error( "StandardXAConnection:checkPrepareState Exception on prepare, rolling back"); statecon.setState(Status.STATUS_NO_TRANSACTION); // release connection throw new XAException(XAException.XA_RBROLLBACK); // rollback will have been performed } return statecon; } /** * Prepares to perform a commit. May actually perform a commit * in the flag commitOnPrepare is set to true. */ public int prepare(Xid xid) throws XAException { dataSource.log.debug( "StandardXAConnection:prepare prepare to perform a commit"); checkPreparedState(xid); return XA_OK; } /** * Performs a commit on this resource manager's branch of * the global transaction. */ public synchronized void commit(Xid xid, boolean onePhase) throws XAException { dataSource.log.debug("StandardXAConnection:commit perform a commit"); if (xid == null) throw new XAException(XAException.XAER_INVAL); StandardXAStatefulConnection statecon = xaDataSource.getConnection(xid, true); // must find connection for this transaction dataSource.log.debug("StandardXAConnection:commit case(state)"); try { switch (statecon.getState()) { // action depends on current state case Status.STATUS_PREPARING : // already commited break; // ...so do nothing case Status.STATUS_PREPARED : // ready to do commit try { dataSource.log.debug( "StandardXAConnection:commit try to commit a connection (STATUS_PREPARED)"); statecon.con.commit(); // perform the commit operation now dataSource.log.debug( "StandardXAConnection:commit commit is ok"); } catch (SQLException e) { throw new XAException(XAException.XA_RBROLLBACK); // rollback will have been performed } break; case Status.STATUS_COMMITTED : // could be a 1-phase commit case Status.STATUS_ACTIVE : if (!onePhase) { // if not a one-phase commit throw new XAException(XAException.XAER_PROTO); } try { dataSource.log.debug( "StandardXAConnection:commit try to commit a connection (STATUS_ACTIVE)"); statecon.con.commit(); // perform the commit operation now dataSource.log.debug( "StandardXAConnection:commit commit is ok"); } catch (SQLException e) { throw new XAException(XAException.XA_RBROLLBACK); // rollback will have been performed } break; default : { dataSource.log.debug( "StandardXAConnection:commit UNKNOWN STATUS!:" + statecon.getState()); throw new XAException(XAException.XAER_PROTO); } } } catch (XAException e) { throw e; } finally { try { dataSource.log.debug( "StandardXAConnection:commit setAutoCommit to '" + thisAutoCommit + "'"); statecon.con.setAutoCommit(thisAutoCommit); } catch (SQLException e) { dataSource.log.debug( "StandardXAConnection:commit setAutoCommit problem"); } xaDataSource.freeConnection(xid, false); } } /** * PERFORMS a rollback on this resource manager's branch of * the global transaction. */ public synchronized void rollback(Xid xid) throws XAException { dataSource.log.debug("StandardXAConnection:rollback"); if (xid == null) throw new XAException(XAException.XAER_INVAL); StandardXAStatefulConnection statecon = xaDataSource.getConnection(xid, true); // must find connection for this transaction try { switch (statecon.getState()) { // action depends on current state case Status.STATUS_PREPARING : // already commited throw new XAException(XAException.XA_HEURCOM); case Status.STATUS_PREPARED : // ready to do rollback case Status.STATUS_ROLLING_BACK : case Status.STATUS_ACTIVE : try { dataSource.log.debug( "StandardXAConnection:rollback try to perform the rollback operation"); statecon.con.rollback(); // perform the rollback operation dataSource.log.debug( "StandardXAConnection:rollback performed the rollback"); } catch (SQLException e) { throw new XAException(XAException.XA_RBROLLBACK); // rollback will have been performed } break; default : throw new XAException(XAException.XAER_PROTO); } } catch (XAException e) { throw e; } finally { try { dataSource.log.debug( "StandardXAConnection:rollback setAutoCommit to '" + thisAutoCommit + "'"); statecon.con.setAutoCommit(thisAutoCommit); } catch (SQLException e) { dataSource.log.debug( "StandardXAConnection:rollback setAutoCommit problem"); } xaDataSource.freeConnection(xid, false); } } public boolean isSameRM(XAResource xares) throws XAException { dataSource.log.debug("StandardXAConnection:isSameRM"); if (equals(xares)) { // if the same object dataSource.log.debug("StandardXAConnection:isSameRM isSameRM"); return true; // then definitely the same RM } if (!(xares instanceof StandardXAConnection)) { // if it's not one of our wrappers dataSource.log.debug("StandardXAConnection:isSameRM not isSameRM"); return false; // then it's definitely not the same RM } StandardXAConnection xac = (StandardXAConnection) xares; // cast to something more convenient if (dataSource.equals(xac.dataSource)) { // if they originate from same data source dataSource.log.debug( "StandardXAConnection:isSameRM isSameRM (equal datasource)"); return true; // then they're the same RM } else { dataSource.log.debug( "StandardXAConnection:isSameRM not isSameRM (not equal datasource)"); return false; } } /** * This is called by a TM when the RM has reported a heuristic * completion. It must retain the transaction context until told * to forget about it. */ public void forget(Xid xid) throws XAException { dataSource.log.debug("StandardXAConnection:forget forget with Xid"); if (xid == null) throw new XAException(XAException.XAER_INVAL); //StandardXAStatefulConnection statecon = xaDataSource.getConnection (xid, true);// must find connection for this transaction xaDataSource.freeConnection(xid, false); // finished with this transaction } /** * Called by the transaction manager during recovery. If it was the * transaction manager or another compoenent which failed then we * can supply our known Xids. However if we failed then this method * does nothing - we need to know about database internals to do that. */ public Xid[] recover(int flag) throws XAException { dataSource.log.debug( "StandardXAConnection:recover recover flag=" + flag); if (flag != TMSTARTRSCAN && flag != TMENDRSCAN && flag != TMNOFLAGS) { throw new XAException(XAException.XAER_INVAL); } Xid[] retval = null; retval = xaDataSource.recover(); // get all valid Xids return retval; } /** * Accessor methods for timeout. */ public boolean setTransactionTimeout(int seconds) { timeoutSecs = seconds; return false; } public int getTransactionTimeout() { return timeoutSecs; } public void setCommitOnPrepare(boolean commitOnPrepare) { this.commitOnPrepare = commitOnPrepare; } public boolean getCommitOnPrepare() { return commitOnPrepare; } /** * Periodically checks for timed out connections. */ public void run() { //dataSource.log.debug("StandardXAConnection:run check for timed out connections"); while (true) { // loop forever /* if (nextTimeout == 0) { // if there are no more timeouts scheduled timerThread.suspend(); // then go to sleep if (isClosed) return; // exit if connection is closed } */ try { synchronized (this) { while (nextTimeout == 0) { wait(); } } } catch (InterruptedException e) { } if (isClosed) { return; } try { Thread.sleep(timeoutPeriod); // sleep for a few seconds if (isClosed) return; // exit if connection is closed } catch (InterruptedException e) { e.printStackTrace(); // we don't expect any of these } long curTime = System.currentTimeMillis(); // get system time if (curTime < nextTimeout) continue; // check for time still to go // One or more transactions have timeout out. try { nextTimeout = xaDataSource.checkTimeouts(curTime); // check to see if connections have timeout out } catch (Exception e) { e.printStackTrace(); // we don't expect any of these } } } public Reference getReference() throws NamingException { // Note that we use getClass().getName() to provide the factory // class name. It is assumed that this class, and all of its // descendants are their own factories. dataSource.log.debug( "StandardXAConnection:getReference return a reference of the object"); Reference ref = new Reference(getClass().getName(), getClass().getName(), null); ref.add( new StringRefAddr( "commitOnPrepare", String.valueOf(getCommitOnPrepare()))); ref.add( new StringRefAddr( "timeoutSecs", Integer.toString(getTransactionTimeout()))); return ref; } public String toString() { StringBuffer sb = new StringBuffer(); sb.append("StandardXAConnection:\n"); sb.append(" commit on prepare =<"+this.commitOnPrepare+">\n"); sb.append(" is closed =<"+this.isClosed + ">\n"); sb.append(" this autoCommit =<"+this.thisAutoCommit + ">\n"); sb.append(" listeners size =<"+this.listeners.size() + ">\n"); sb.append(" next timeOut =<"+this.nextTimeout + ">\n"); sb.append(" timeOut period =<"+this.timeoutPeriod + ">\n"); sb.append(" timeOut secs =<"+this.timeoutSecs + ">\n"); sb.append(" transaction manager=<"+this.transactionManager + ">\n"); sb.append(this.xaDataSource.toString()); sb.append(this.dataSource.toString()); if (curCon != null) sb.append(this.curCon.toString()); if (connectionHandle != null) sb.append(this.connectionHandle.toString()); sb.append(this.con.toString()); return sb.toString(); } } xapool-1.5.0-src/src/org/enhydra/jdbc/standard/StandardXAConnectionHandle.java0000644000175000017500000004056310235646676027273 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.standard; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Statement; import java.sql.CallableStatement; import java.util.Hashtable; import javax.transaction.Transaction; import javax.transaction.TransactionManager; import javax.transaction.RollbackException; import javax.transaction.SystemException; public class StandardXAConnectionHandle extends StandardConnectionHandle { boolean resetTxonResume =false; boolean globalTransaction; // true if a global transaction is in effect public TransactionManager transactionManager; public Transaction tx; public StandardXAConnection xacon; public boolean thisAutoCommit = true; /** * Constructor */ public StandardXAConnectionHandle( StandardXAConnection pooledCon, Hashtable preparedStatementCache, int preparedStmtCacheSize, TransactionManager tm) { super(pooledCon, preparedStatementCache, preparedStmtCacheSize); // setup StandardXAConnectionHandle xacon = pooledCon; transactionManager = tm; log = pooledCon.dataSource.log; // This will have set the Connection to the current Connection. // However this might change if a global transaction gets selected. } public void setTransactionManager(TransactionManager tm) { this.transactionManager = tm; } synchronized public void close() throws SQLException { Transaction ttx = tx; // note: ttx is used instead of tx because super.close(), call end() // on StdXAConnection which call tx = null; super.close(); log.debug("StandardXAConnectionHandle:close"); log.debug( "StandardXAConnectionHandle:close globalTransaction='" + globalTransaction + "' con.getAutoCommit='" + con.getAutoCommit() + "' ttx='" + ttx + "'"); if ((!con.getAutoCommit()) && (ttx == null)) { log.debug( "StandardXAConnectionHandle:close rollback the connection"); con.rollback(); con.setAutoCommit(thisAutoCommit); } else log.debug("StandardXAConnectionHandle:close do nothing else"); isReallyUsed = false; log.debug( "StandardXAConnectionHandle:close AFTER globalTransaction='" + globalTransaction + "' con.getAutoCommit='" + con.getAutoCommit() + "' ttx='" + ttx + "'"); } /** * Called by the StandardXADataSource when a global transaction * gets associated with this connection. */ void setGlobalTransaction(boolean setting) throws SQLException { log.debug( "StandardXAConnectionHandle:setGlobalTransaction gTransaction='" + setting + "'"); globalTransaction = setting; // set global flag con = pooledCon.getPhysicalConnection(); // get the real connection if (con == null) log.warn( "StandardXAConnectionHandle:setGlobalTransaction con is null before setupPreparedStatementCache"); else log.debug( "StandardXAConnectionHandle:setGlobalTransaction con is *NOT* null before setupPreparedStatementCache"); //setupPreparedStatementCache(); if(!isClosed()) super.setAutoCommit(!setting); // commits must be done by transaction manager } public void setAutoCommit(boolean autoCommit) throws SQLException { if (globalTransaction) // if taking part in a global transaction throw new SQLException("StandardXAConnectionHandle:setAutoCommit This connection is part of a global transaction"); super.setAutoCommit(autoCommit); } public void commit() throws SQLException { if (globalTransaction) // if taking part in a global transaction throw new SQLException("StandardXAConnectionHandle:commit:This connection is part of a global transaction"); super.commit(); //tx = null; } public void rollback() throws SQLException { if (globalTransaction) // if taking part in a global transaction throw new SQLException("StandardXAConnectionHandle:rollback:This connection is part of a global transaction"); super.rollback(); //tx = null; } synchronized PreparedStatement checkPreparedCache( String sql, int type, int concurrency, int holdability, Object lookupKey) throws SQLException { PreparedStatement ret = null; // the return value // NOTE - We include the Connection in the lookup key. This has no // effect here but is needed by StandardXAConnection where the the physical // Connection used can vary over time depending on the global transaction. if (preparedStatementCache != null) { Object obj = preparedStatementCache.get(lookupKey); // see if there's a PreparedStatement already if (obj != null) { // if there is log.debug( "StandardXAConnectionHandle:checkPreparedCache object is found"); ret = (PreparedStatement) obj; // use as return value try { ret.clearParameters(); // make it look like new } catch (SQLException e) { // Bad statement, so we have to create a new one ret = createPreparedStatement(sql, type, concurrency, holdability); // create new prepared statement } preparedStatementCache.remove(lookupKey); // make sure it cannot be re-used inUse.put(lookupKey, ret); // make sure it gets reused by later delegates } else { // no PreparedStatement ready log.debug( "StandardXAConnectionHandle:checkPreparedCache object is *NOT* found"); ret = createPreparedStatement(sql, type, concurrency, holdability); // create new prepared statement inUse.put(lookupKey, ret); // will get saved in prepared statement cache } } else { log.debug( "StandardXAConnectionHandle:checkPreparedCache object the cache is out"); ret = createPreparedStatement(sql, type, concurrency, holdability); // create new prepared statement } // We don't actually give the application a real PreparedStatement. Instead // they get a StandardPreparedStatement that delegates everything except // PreparedStatement.close(); log.debug( "StandardXAConnectionHandle:checkPreparedCache pstmt='" + ret.toString() + "'"); return ret; } synchronized PreparedStatement checkPreparedCache( String sql, int autogeneratedkeys, Object lookupKey) throws SQLException { PreparedStatement ret = null; // the return value // NOTE - We include the Connection in the lookup key. This has no // effect here but is needed by StandardXAConnection where the the physical // Connection used can vary over time depending on the global transaction. if (preparedStatementCache != null) { Object obj = preparedStatementCache.get(lookupKey); // see if there's a PreparedStatement already if (obj != null) { // if there is log.debug( "StandardXAConnectionHandle:checkPreparedCache object is found"); ret = (PreparedStatement) obj; // use as return value try { ret.clearParameters(); // make it look like new } catch (SQLException e) { // Bad statement, so we have to create a new one ret = createPreparedStatement(sql, autogeneratedkeys); // create new prepared statement } preparedStatementCache.remove(lookupKey); // make sure it cannot be re-used inUse.put(lookupKey, ret); // make sure it gets reused by later delegates } else { // no PreparedStatement ready log.debug( "StandardXAConnectionHandle:checkPreparedCache object is *NOT* found"); ret = createPreparedStatement(sql, autogeneratedkeys); // create new prepared statement inUse.put(lookupKey, ret); // will get saved in prepared statement cache } } else { log.debug( "StandardXAConnectionHandle:checkPreparedCache object the cache is out"); ret = createPreparedStatement(sql, autogeneratedkeys); // create new prepared statement } // We don't actually give the application a real PreparedStatement. Instead // they get a StandardPreparedStatement that delegates everything except // PreparedStatement.close(); log.debug( "StandardXAConnectionHandle:checkPreparedCache pstmt='" + ret.toString() + "'"); return ret; } /** * Creates a PreparedStatement for the given SQL. If possible, the * statement is fetched from the cache. */ public PreparedStatement prepareStatement(String sql) throws SQLException { return prepareStatement(sql, 0, 0, 0); } public PreparedStatement prepareStatement( String sql, int resultSetType, int resultSetConcurrency) throws SQLException { return prepareStatement(sql, resultSetType, resultSetConcurrency, 0); } /** * Creates a PreparedStatement for the given SQL, type and concurrency. * If possible, the statement is fetched from the cache. */ public PreparedStatement prepareStatement( String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { if (tx == null) { log.debug("StandardXAConnectionHandle:prepareStatement tx==null"); try { try { Transaction ntx = this.getTransaction(); if (ntx != null) { log.debug( "StandardXAConnectionHandle:prepareStatement (found a transaction)"); tx = ntx; xacon.thisAutoCommit = this.getAutoCommit(); if (this.getAutoCommit()) { this.setAutoCommit(false); } try { tx.enlistResource(xacon.getXAResource()); // enlist the xaResource in the transaction } catch (RollbackException n) { log.debug( "StandardXAConnectionHandle:prepareStatemnet enlistResource exception : " + n.toString()); } } else { log.debug( "StandardXAConnectionHandle:prepareStatement (no transaction found)"); } } catch (SystemException n) { n.printStackTrace(); throw new SQLException( "StandardXAConnectionHandle:prepareStatement getTransaction exception: " + n.toString()); } } catch (NullPointerException n) { // current is null: we are not in EJBServer. n.printStackTrace(); throw new SQLException("StandardXAConnectionHandle:prepareStatement should not be used outside an EJBServer"); } } else log.debug("StandardXAConnectionHandle:prepareStatement tx!=null"); // if you want to use a REAL PrepareStatement object, please // uncomment the 2 following lines and comment the last ones. //PreparedStatement ops = con.prepareStatement(sql, resultSetType, resultSetConcurrency); //return ops; isReallyUsed = true; return new StandardXAPreparedStatement( this, sql, resultSetType, resultSetConcurrency, resultSetHoldability); } public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException { if (tx == null) { log.debug("StandardXAConnectionHandle:prepareStatement tx==null"); try { try { Transaction ntx = this.getTransaction(); if (ntx != null) { log.debug( "StandardXAConnectionHandle:prepareStatement (found a transaction)"); tx = ntx; xacon.thisAutoCommit = this.getAutoCommit(); if (this.getAutoCommit()) { this.setAutoCommit(false); } try { tx.enlistResource(xacon.getXAResource()); // enlist the xaResource in the transaction } catch (RollbackException n) { log.debug( "StandardXAConnectionHandle:prepareStatemnet enlistResource exception : " + n.toString()); } } else { log.debug( "StandardXAConnectionHandle:prepareStatement (no transaction found)"); } } catch (SystemException n) { n.printStackTrace(); throw new SQLException( "StandardXAConnectionHandle:prepareStatement getTransaction exception: " + n.toString()); } } catch (NullPointerException n) { // current is null: we are not in EJBServer. n.printStackTrace(); throw new SQLException("StandardXAConnectionHandle:prepareStatement should not be used outside an EJBServer"); } } else log.debug("StandardXAConnectionHandle:prepareStatement tx!=null"); isReallyUsed = true; return new StandardXAPreparedStatement( this, sql, autoGeneratedKeys); } /** * not yet implemented */ public PreparedStatement prepareStatement(String sql, int[] columnIndexes) throws SQLException { throw new UnsupportedOperationException(); } /** * not yet implemented */ public PreparedStatement prepareStatement(String sql, String[] columnNames) throws SQLException { throw new UnsupportedOperationException(); } /** * Creates a CallableStatement for the given SQL, result set type and concurency */ public CallableStatement prepareCall( String sql, int resultSetType, int resultSetConcurrency) throws SQLException { return new StandardXACallableStatement( this, sql, resultSetType, resultSetConcurrency, 0); } /** * Creates a CallableStatement for the given SQL */ public CallableStatement prepareCall(String sql) throws SQLException { return new StandardXACallableStatement(this, sql, 0, 0, 0); } public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { return new StandardXACallableStatement( this, sql, resultSetType, resultSetConcurrency, resultSetHoldability); } public Statement createStatement() throws SQLException { return createStatement(0,0,0); } public Statement createStatement( int resultSetType, int resultSetConcurrency) throws SQLException { return createStatement(resultSetType, resultSetConcurrency, 0); } public Statement createStatement( int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { if (tx == null) { log.debug("StandardXAConnectionHandle:createStatement tx==null"); try { try { Transaction ntx = this.getTransaction(); if (ntx != null) { log.debug( "StandardXAConnectionHandle:createStatement (found a transaction)"); tx = ntx; xacon.thisAutoCommit = this.getAutoCommit(); if (this.getAutoCommit()) { this.setAutoCommit(false); } try { tx.enlistResource(xacon.getXAResource()); // enlist the xaResource in the transaction } catch (RollbackException n) { log.debug( "StandardXAConnectionHandle:createStatement enlistResource exception: " + n.toString()); } } else { log.debug( "StandardXAConnectionHandle:createStatement (no transaction found)"); } } catch (SystemException n) { throw new SQLException( "StandardXAConnectionHandle:createStatement getTransaction exception: " + n.toString()); } } catch (NullPointerException n) { // current is null: we are not in EJBServer. throw new SQLException( "StandardXAConnectionHandle:createStatement should not be used outside an EJBServer: " + n.toString()); } } isReallyUsed = true; return new StandardXAStatement(this, resultSetType, resultSetConcurrency, resultSetHoldability); } private Transaction getTransaction() throws SystemException { Transaction ntx = null; if (transactionManager != null) { ntx = transactionManager.getTransaction(); } else { log.debug( "StandardXAConnectionHandle:getTransaction (null transaction manager)"); } return ntx; } public String toString() { StringBuffer sb = new StringBuffer(); sb.append("StandardXAConnectionHandle:\n"); sb.append(" global transaction =<"+this.globalTransaction+ ">\n"); sb.append(" is really used =<"+this.isReallyUsed+ ">\n"); sb.append(" this autoCommit =<"+this.thisAutoCommit+ ">\n"); sb.append(" in use size =<"+this.inUse.size()+ ">\n"); sb.append(" master prepared stmt cache size =<"+this.masterPrepStmtCache.size()+ ">\n"); sb.append(" transaction =<"+this.tx+ ">\n"); sb.append(" connection =<"+this.con.toString()+ ">\n"); return sb.toString(); } } xapool-1.5.0-src/src/org/enhydra/jdbc/standard/StandardXADataSource.java0000644000175000017500000004666210235646676026120 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.standard; import org.enhydra.jdbc.util.Logger; import org.apache.commons.logging.LogFactory; import java.sql.Connection; import java.sql.SQLException; import java.util.Enumeration; import java.util.Hashtable; import java.util.Vector; import java.util.Iterator; import javax.sql.XAConnection; import javax.sql.XADataSource; import javax.transaction.Status; import javax.transaction.xa.XAException; import javax.transaction.xa.Xid; import javax.transaction.TransactionManager; /** * Data source for creating StandardXAConnections. */ public class StandardXADataSource extends StandardConnectionPoolDataSource implements XADataSource { public int minCon; // minimum number of connections public int maxCon; // maximum number of connections public long deadLockMaxWait; // time (in ms) to wait before return an exception Vector freeConnections; // connections not currently associated with an XID Hashtable xidConnections; // connections currently associated with an XID Hashtable deadConnections; // connections which should be discarded when the transaction finishes public int connectionCount = 0; // total number of connections created public long deadLockRetryWait; // time to wait before 2 try of loop transient public TransactionManager transactionManager; public static final int DEFAULT_MIN_CON = 50; // minimum number of connections public static final int DEFAULT_MAX_CON = 0; // maximum number of connections public static final long DEFAULT_DEADLOCKMAXWAIT = 300000; // 5 minutes public static final int DEFAULT_DEADLOCKRETRYWAIT = 10000; // 10 seconds /** * Constructor */ public StandardXADataSource() { super(); minCon = DEFAULT_MIN_CON; maxCon = DEFAULT_MAX_CON; deadLockMaxWait = DEFAULT_DEADLOCKMAXWAIT; deadLockRetryWait = DEFAULT_DEADLOCKRETRYWAIT; freeConnections = new Vector(minCon, 1); // allow a reasonable size for free connections xidConnections = new Hashtable(minCon * 2, 0.5f); // ...and same for used connections log = new Logger(LogFactory.getLog("org.enhydra.jdbc.xapool")); log.debug("StandardXADataSource is created"); } public int getConnectionCount() { return connectionCount; } public Hashtable getXidConnections() { return xidConnections; } /** * Creates an XA connection using the default username and password. */ public XAConnection getXAConnection() throws SQLException { log.debug( "StandardXADataSource:getXAConnection(0) XA connection returned"); return getXAConnection(user, password); } /** * Creates an XA connection using the supplied username and password. */ public synchronized XAConnection getXAConnection( String user, String password) throws SQLException { log.debug("StandardXADataSource:getXAConnection(user, password)"); StandardXAConnection xac = new StandardXAConnection(this, user, password); xac.setTransactionManager(transactionManager); xac.setLogger(log); connectionCount++; return xac; } public void setTransactionManager(TransactionManager tm) { log.debug("StandardXADataSource:setTransactionManager"); this.transactionManager = tm; } public TransactionManager getTransactionManager() { return transactionManager; } public void setUser(String user) { log.debug("StandardXADataSource:setUser"); if (((user == null) || (getUser() == null)) ? user != getUser() : !user.equals(getUser())) { super.setUser(user); resetCache(); } } public void setPassword(String password) { log.debug("StandardXADataSource:setPassword"); if (((password == null) || (getPassword() == null)) ? password != getPassword() : !password.equals(getPassword())) { super.setPassword(password); resetCache(); } } public void setUrl(String url) { if (((url == null) || (getUrl() == null)) ? url != getUrl() : !url.equals(getUrl())) { super.setUrl(url); resetCache(); } } public void setDriverName(String driverName) throws SQLException { if ((driverName == null && getDriverName() != null) || (!driverName.equals(getDriverName()))) { super.setDriverName(driverName); resetCache(); } } private synchronized void resetCache() { log.debug("StandardXADataSource:resetCache"); // deadConnections will temporarily hold pointers to the // current ongoing transactions. These will be discarded when // freed deadConnections = (Hashtable) xidConnections.clone(); deadConnections.putAll(xidConnections); // now we'll just clear out the freeConnections Enumeration enum = freeConnections.elements(); while (enum.hasMoreElements()) { StandardXAStatefulConnection xasc = (StandardXAStatefulConnection) enum.nextElement(); try { log.debug( "StandardXADataSource:resetCache closing Connection:" + xasc.con); xasc.con.close(); } catch (SQLException e) { log.error( "StandardXADataSource:resetCache Error closing connection:" + xasc.con); } freeConnections.removeElement(xasc); } } /** * Called when an XA connection gets closed. When they have all * been closed then any remaining physical connections are also * closed. */ synchronized void connectionClosed() throws SQLException { log.debug("StandardXADataSource:connectionClosed"); connectionCount--; // one more connection closed if (connectionCount == 0) { // if no connections left // Close any connections still associated with XIDs. Enumeration cons = xidConnections.keys(); // used to iterate through the used connections while (cons.hasMoreElements()) { // while there are more connections Object key = cons.nextElement(); // get the next connection StandardXAStatefulConnection cur = (StandardXAStatefulConnection)xidConnections.remove(key); if(cur != null) { cur.con.close(); // close the physical connection } // cast to something more convenient log.debug( "StandardXADataSource:connectionClosed close physical connection"); } Iterator connIterator = freeConnections.iterator(); while (connIterator.hasNext()) { StandardXAStatefulConnection cur =(StandardXAStatefulConnection)connIterator.next(); cur.con.close(); connIterator.remove(); log.debug( "StandardXADataSource:connectionClosed close any free connections"); } } } /** * Returns the number of connections that are either * prepared or heuristically completed. */ public int getXidCount() { int count = 0; // the return value Enumeration cons = xidConnections.elements(); // used to iterate through the used connections while (cons.hasMoreElements()) { // while there are more connections Object o = cons.nextElement(); // get the next connection StandardXAStatefulConnection cur = (StandardXAStatefulConnection) o; // cast to something more convenient if ((cur.getState() == Status.STATUS_PREPARED) || // if prepared ( cur.getState() == Status.STATUS_PREPARING)) { // ...or heuristically committed count++; // one more connection with a valid xid } } log.debug( "StandardXADataSource:getXidCount return XidCount=<" + count + ">"); return count; } /** * Constructs a list of all prepared connections' xids. */ Xid[] recover() { int nodeCount = getXidCount(); // get number of connections in transactions Xid[] xids = new Xid[nodeCount]; // create the return array int i = 0; // used as xids index Enumeration cons = xidConnections.elements(); // used to iterate through the used connections while (cons.hasMoreElements()) { // while there are more connections Object o = cons.nextElement(); // get the next connection StandardXAStatefulConnection cur = (StandardXAStatefulConnection) o; // cast to something more convenient if ((cur.getState() == Status.STATUS_PREPARED) || // if prepared ( cur.getState() == Status.STATUS_PREPARING)) { // ...or heuristically committed xids[i++] = cur.xid; // save in list } } return xids; } /** * Frees a connection to make it eligible for reuse. The free list * is normally a last in, first out list (LIFO). This is efficient. * However, timed out connections are nice to hang onto for error * reporting, so they can be placed at the start. This is less * efficient, but hopefully is a rare occurence. * * Here, no need to verify the number of connections, we remove an * object from the xidConnections to put it in th freeConnections * */ public synchronized void freeConnection(Xid id, boolean placeAtStart) { log.debug("StandardXADataSource:freeConnection"); Object o = xidConnections.get(id); // lookup the connection by XID StandardXAStatefulConnection cur = (StandardXAStatefulConnection) o; // cast to something more convenient xidConnections.remove(id); // remove connection from in use list log.debug( "StandardXADataSource:freeConnection remove id from xidConnections"); if (!deadConnections.containsKey(id)) { // if this isn't to be discarded /* try { log.debug("StandardXADataSource:freeConnection setAutoCommit(true):" + cur.id); log.debug("con='"+cur.con.toString()+"'"); cur.con.setAutoCommit(acommit); } catch(SQLException e) { log.error("ERROR: Failed while autocommiting a connection: "+e); } */ cur.setState(Status.STATUS_NO_TRANSACTION); // set its new internal state if (!freeConnections.contains(cur)) { if (placeAtStart) { // if we want to keep for as long as possible freeConnections.insertElementAt(cur, 0); // then place it at the start of the list } else { freeConnections.addElement(cur); // otherwise it's a LIFO list } } } else { deadConnections.remove(id); try { cur.con.close(); } catch (SQLException e) { //ignore } } notify(); } /** * Invoked by the timer thread to check all transactions * for timeouts. Returns the time of the next timeout event * after current timeouts have expired. */ synchronized long checkTimeouts(long curTime) throws SQLException { //log.debug("StandardXADataSource:checkTimeouts"); long nextTimeout = 0; // the earliest non-expired timeout in the list Enumeration cons = xidConnections.elements(); // used to iterate through the used connections while (cons.hasMoreElements()) { // while there are more connections Object o = cons.nextElement(); // get the next connection StandardXAStatefulConnection cur = (StandardXAStatefulConnection) o; // cast to something more convenient if ((cur.timeout != 0) && // if connection has a timeout ( curTime > cur.timeout)) { // ...and transaction has timed out //log.debug("StandardXADataSource:checkTimeouts connection timeout"); cur.con.rollback(); // undo everything to do with this transaction cur.timedOut = true; // flag that it has timed out //log.debug(cur.toString()+" timed out"); freeConnection(cur.xid, true); // make the connection eligible for reuse // The timed out connection is eligible for reuse. The Xid and timedOut // flag will nevertheless remain valid until it is reallocated to another // global transaction. This gives the TM a *chance* to get a timeout // exception, but we won't hang on to it forever. } else { // transaction has not timed out if (cur.timeout != 0) { // but it has a timeout scheduled if ((cur.timeout < nextTimeout) || // and it's the next timeout to expire ( nextTimeout == 0)) { // ...or first timeout we've found nextTimeout = cur.timeout; // set up next timeout } } } } return nextTimeout; } /** * Checks the start of the free list to see if the connection * previously associated with the supplied Xid has timed out. *

* Note that this can be an expensive operation as it has to * scan all free connections. so it should only be called in * the event of an error. */ synchronized private void checkTimeouts(Xid xid) throws XAException { log.debug("StandardXADataSource:checkTimeouts"); for (int i = 0; i < freeConnections.size(); i++) { // check each free connection Object o = freeConnections.elementAt(i); // get next connection StandardXAStatefulConnection cur = (StandardXAStatefulConnection) o; // cast to something more convenient if (!cur.timedOut) { // if it hasn't timed out continue; // skip it } log.debug( "StandardXADataSource:checkTimeouts (" + i + "/" + freeConnections.size() + ") xid = " + xid); log.debug( "StandardXADataSource:checkTimeouts cur.xid = " + cur.xid); if (xid.equals(cur.xid)) { // if we've found our xid cur.timedOut = false; // cancel time out throw new XAException(XAException.XA_RBTIMEOUT); } } } /** * Returns the connection associated with a given XID. * is reached, the Xid is found or an exception is thrown. */ synchronized StandardXAStatefulConnection getConnection( Xid xid, boolean mustFind) throws XAException { log.debug( "StandardXADataSource:getConnection (xid=" + xid + ", mustFind=" + mustFind + ")"); Object o = xidConnections.get(xid); // lookup the connection by XID log.debug("XID: " + o); StandardXAStatefulConnection cur = (StandardXAStatefulConnection) o; // cast to something more convenient if (mustFind) { // if we expected to find the connection if (cur == null) { // and we didn't log.debug( "StandardXADataSource:getConnection (StatefulConnection is null)"); checkTimeouts(xid); // see if it's been freed during a timeout throw new XAException(XAException.XAER_NOTA); // not a valid XID } } else { // didn't expect to find the connection if (cur != null) { // but we found it anyway throw new XAException(XAException.XAER_DUPID); // duplicate XID } } log.debug( "StandardXADataSource:getConnection return connection associated with a given XID"); return cur; } /** * Returns a connection from the free list, removing it * in the process. If none area available then a new * connection is created. */ synchronized StandardXAStatefulConnection getFreeConnection() throws SQLException { log.debug("StandardXADataSource:getFreeConnection"); StandardXAStatefulConnection cur = null; // this will be the return value int freeCount = freeConnections.size(); // get number of free connections if (freeCount == 0) { // if there are no free connections log.debug( "StandardXADataSource:getFreeConnection there are no free connections, get a new database connection"); Connection con = super.getConnection(user, password); // get a new database connection cur = new StandardXAStatefulConnection(this, con); // make the connection stateful } else { Object o = freeConnections.lastElement(); // get the last element cur = (StandardXAStatefulConnection) o; // cast to something more convenient freeConnections.removeElementAt(freeCount - 1); // remove from free list cur.timeout = 0; // no timeout until start() called cur.timedOut = false; // cancel any time old out } log.debug( "StandardXADataSource:getFreeConnection return a connection from the free list"); try { log.debug( "StandardXADataSource:getFreeConnection setAutoCommit(true)"); // changed by cney - was false cur.con.setAutoCommit(true); } catch (SQLException e) { log.error( "StandardXADataSource:getFreeConnection ERROR: Failed while autocommiting a connection: " + e); } return cur; } public void closeFreeConnection() { log.debug("StandardXADataSource:closeFreeConnection empty method TBD"); } public void setMinCon(int min) { this.minCon = min; } public void setMaxCon(int max) { this.maxCon = max; } public void setDeadLockMaxWait(long deadLock) { this.deadLockMaxWait = deadLock; } public int getMinCon() { return this.minCon; } public int getMaxCon() { return this.maxCon; } public long getDeadLockMaxWait() { return this.deadLockMaxWait; } public int getAllConnections() { return xidConnections.size() + freeConnections.size(); } public synchronized void processToWait() throws Exception { log.debug("StandardXADataSource:processToWait"); int currentWait = 0; if (maxCon != 0) { while ((getAllConnections() >= maxCon) && (currentWait < getDeadLockMaxWait())) { dump(); try { synchronized (this) { wait(getDeadLockRetryWait()); } } catch (InterruptedException e) { log.error( "StandardXADataSource:processToWait ERROR: Failed while waiting for an object: " + e); } currentWait += getDeadLockRetryWait(); } if (getAllConnections() >= getMaxCon()) throw new Exception("StandardXADataSource:processToWait ERROR : impossible to obtain a new xa connection"); } } public void dump() { for (int i = 0; i < freeConnections.size(); i++) { log.debug( "freeConnection:<" + freeConnections.elementAt(i).toString() + ">"); } for (Enumeration enum = xidConnections.elements(); enum.hasMoreElements(); ) { log.debug("xidConnection:<" + enum.nextElement().toString() + ">"); } } public void setDeadLockRetryWait(long deadLockRetryWait) { this.deadLockRetryWait = deadLockRetryWait; } public long getDeadLockRetryWait() { return this.deadLockRetryWait; } public String toString() { StringBuffer sb = new StringBuffer(); sb.append("StandardXADataSource:\n"); sb.append(" connection count=<"+this.connectionCount+">\n"); if (deadConnections != null) sb.append(" number of dead connection=<"+this.deadConnections.size()+">\n"); sb.append(" dead lock max wait=<"+this.deadLockMaxWait+">\n"); sb.append(" dead lock retry wait=<"+this.deadLockRetryWait+">\n"); if (driver != null) sb.append(" driver=<"+this.driver.toString()+">\n"); sb.append(" driver name=<"+this.driverName+">\n"); if (freeConnections != null) sb.append(" number of *free* connections=<"+this.freeConnections.size()+">\n"); sb.append(" max con=<"+this.maxCon+">\n"); sb.append(" min con=<"+this.minCon+">\n"); sb.append(" prepared stmt cache size=<"+this.preparedStmtCacheSize+">\n"); sb.append(" transaction manager=<"+this.transactionManager+">\n"); sb.append(" xid connection size=<"+this.xidConnections.size()+">\n"); sb.append(super.toString()); return sb.toString(); } } xapool-1.5.0-src/src/org/enhydra/jdbc/standard/StandardXAPreparedStatement.java0000644000175000017500000000747010235646676027507 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.standard; import java.sql.SQLException; public class StandardXAPreparedStatement extends StandardPreparedStatement { private StandardXAConnectionHandle con; // the StandardXAConnectionHandle that created this object public String sql; public int resultSetType; public int resultSetConcurrency; public int resultSetHoldability; public int autoGeneratedKeys; StandardXAPreparedStatement( StandardXAConnectionHandle con_, String sql_, int resultSetType_, int resultSetConcurrency_, int resultSetHoldability_) throws SQLException { this.con = con_; this.sql = sql_; this.key = sql_ + resultSetType_ + resultSetConcurrency_ + resultSetHoldability_; this.resultSetType = resultSetType_; this.resultSetConcurrency = resultSetConcurrency_; this.resultSetHoldability = resultSetHoldability_; log = con_.log; log.debug( "StandardXAPreparedStatement: Create an XAPreparedStatement with sql='" + sql + "'"); key = sql + resultSetType + resultSetConcurrency + resultSetHoldability + ((con.tx != null) ? true : false); ps = con.checkPreparedCache( sql, resultSetType, resultSetConcurrency, resultSetHoldability, key); // from cney // ps = con.checkPreparedCache(sql, resultSetType, resultSetConcurrency,key); } StandardXAPreparedStatement( StandardXAConnectionHandle con_, String sql_, int autoGeneratedKeys_) throws SQLException { this.con = con_; this.sql = sql_; this.key = sql_ + autoGeneratedKeys_; this.autoGeneratedKeys= autoGeneratedKeys_; log = con_.log; log.debug( "StandardXAPreparedStatement: Create an XAPreparedStatement with sql='" + sql + "'"); key = sql + autoGeneratedKeys + ((con.tx != null) ? true : false); ps = con.checkPreparedCache( sql, autoGeneratedKeys, key); // from cney // ps = con.checkPreparedCache(sql, resultSetType, resultSetConcurrency,key); } /** * Close this statement. */ public synchronized void close() throws SQLException { log.debug( "StandardXAPreparedStatement:close the XA prepared statement"); // Note no check for already closed - some servers make mistakes closed = true; if (con.preparedStmtCacheSize == 0) { log.debug( "StandardXAPreparedStatement:close preparedStmtCacheSize == 0"); if (ps != null) { ps.close(); // no cache, so we can close } } else { log.debug( "StandardXAPreparedStatement:close preparedStmtCacheSize=" + "'" + con.preparedStmtCacheSize + "'"); con.returnToCache(key); // return the underlying statement to the cache } } /** * Exception management : catch or throw the exception */ public void catchInvoke(SQLException sqlException) throws SQLException { //ConnectionEvent event = new ConnectionEvent (con.pooledCon); //con.pooledCon.connectionErrorOccurred(event); throw (sqlException); } } xapool-1.5.0-src/src/org/enhydra/jdbc/standard/StandardXAStatefulConnection.java0000644000175000017500000000634010235646676027662 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.standard; import java.sql.Connection; import javax.transaction.xa.Xid; import javax.transaction.Status; /** * Provides a wrapper for a physical database connection. Each connection can be * associated with an XID and can be in one of several states depending on which * XAResource calls have been made against a given XID. This allows a StandardXAConnection * to multiplex between different XIDs by selecting the appropriate stateful * connection. */ public class StandardXAStatefulConnection { public static int nextId; // used to allocate unique IDs public int id; // unique ID for this stateful connection public Connection con; // the phsyical database connection private int state; // one of the states listed below public StandardXADataSource dataSource; // used to log messages Xid xid; // global TX associated with this connection (if any) public boolean commitOnPrepare; // true if commit takes place on prepare long timeout; // time when this transaction times out boolean timedOut; // true if this transaction branch has timed out /** * Creates a new stateful connection in the FREE state (NO_TRANSACTION) */ public StandardXAStatefulConnection( StandardXADataSource dataSource, Connection con) { this.con = con; this.dataSource = dataSource; id = ++nextId; // allocate a unique ID for logging this.state = Status.STATUS_NO_TRANSACTION; dataSource.log.debug("StandardXAStatefulConnection created"); } /** * Accessor methods for "state" property. */ synchronized void setState(int newState) { dataSource.log.debug( "StandardXAStatefulConnection:setState Stateful connection: " + id + " (state before=" + state + ")"); state = newState; dataSource.log.debug( "StandardXAStatefulConnection:setState Stateful connection: " + id + " (state after=" + state + ")"); } int getState() { return state; } public String toString() { StringBuffer sb = new StringBuffer(); sb.append("StandardXAStatefulConnection:\n"); sb.append(" commit on prepare =<"+this.commitOnPrepare+ ">\n"); sb.append(" timed out =<"+this.timedOut+ ">\n"); sb.append(" id =<"+this.id+ ">\n"); sb.append(" state =<"+this.state+ ">\n"); sb.append(" time out =<"+this.timeout+ ">\n"); sb.append(" xid =<"+this.xid+ ">\n"); return sb.toString(); } } xapool-1.5.0-src/src/org/enhydra/jdbc/standard/StandardXAStatement.java0000644000175000017500000000511510235646676026016 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.standard; import java.sql.SQLException; import java.sql.Statement; import org.enhydra.jdbc.core.CoreStatement; public class StandardXAStatement extends CoreStatement { private StandardXAConnectionHandle con; // the StandardConnectionHandle that created this object private boolean closed; // true when the Statement has been closed private int resultSetType; private int resultSetConcurrency; private int resultSetHoldability; /** * Constructor. */ StandardXAStatement( StandardXAConnectionHandle con, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { this.con = con; this.resultSetType = resultSetType; this.resultSetConcurrency = resultSetConcurrency; this.resultSetHoldability = resultSetHoldability; log = con.log; statement = newStatement(); } private Statement newStatement() throws SQLException { if (resultSetType == 0 && resultSetConcurrency == 0 && resultSetHoldability == 0) { return con.con.createStatement(); } else if (resultSetHoldability == 0) { return con.con.createStatement(resultSetType, resultSetConcurrency); } else return con.con.createStatement(resultSetType, resultSetConcurrency, resultSetHoldability); } /** * Close this statement. */ public synchronized void close() throws SQLException { super.close(); // we do not reuse the Statement, we have to close it closed = true; } /** * Exception management : catch or throw the exception */ public void catchInvoke(SQLException sqlException) throws SQLException { //ConnectionEvent event = new ConnectionEvent (con.pooledCon); //con.pooledCon.connectionErrorOccurred(event); throw (sqlException); } } xapool-1.5.0-src/src/org/enhydra/jdbc/standard/PreparedStatementCache.java~0000644000175000017500000000345310235646676026714 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.standard; import org.enhydra.jdbc.util.LRUCache; import java.sql.PreparedStatement; import java.sql.SQLException; /** * Implementation of LRUCache to handle prepared statements * TODO: Override put to check type */ public class PreparedStatementCache extends LRUCache { /** * Constructor */ public PreparedStatementCache(int maxSize) { super(maxSize); } /** * Overriden to close the statement */ protected void cleanupObject(Object obj) { log.debug( "PreparedStatementCache:cleanupObject class='" + obj.getClass() + "'"); log.debug( "PreparedStatementCache:cleanupObject close a PreparedStatement o=" + "'" + obj.toString() + "'"); try { ((PreparedStatement) obj).close(); //obj = null; } catch (SQLException e) { log.error( "PreparedStatementCache:cleanupObject problem to close" + "a PreparedStatement: " + e); } } } xapool-1.5.0-src/src/org/enhydra/jdbc/standard/StandardXADataSource.java~0000644000175000017500000004655310235646676026315 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.standard; import org.enhydra.jdbc.util.Logger; import org.apache.commons.logging.LogFactory; import java.sql.Connection; import java.sql.SQLException; import java.util.Enumeration; import java.util.Hashtable; import java.util.Vector; import java.util.Iterator; import javax.sql.XAConnection; import javax.sql.XADataSource; import javax.transaction.Status; import javax.transaction.xa.XAException; import javax.transaction.xa.Xid; import javax.transaction.TransactionManager; /** * Data source for creating StandardXAConnections. */ public class StandardXADataSource extends StandardConnectionPoolDataSource implements XADataSource { public int minCon; // minimum number of connections public int maxCon; // maximum number of connections public long deadLockMaxWait; // time (in ms) to wait before return an exception Vector freeConnections; // connections not currently associated with an XID Hashtable xidConnections; // connections currently associated with an XID Hashtable deadConnections; // connections which should be discarded when the transaction finishes public int connectionCount = 0; // total number of connections created public long deadLockRetryWait; // time to wait before 2 try of loop transient public TransactionManager transactionManager; public static final int DEFAULT_MIN_CON = 50; // minimum number of connections public static final int DEFAULT_MAX_CON = 0; // maximum number of connections public static final long DEFAULT_DEADLOCKMAXWAIT = 300000; // 5 minutes public static final int DEFAULT_DEADLOCKRETRYWAIT = 10000; // 10 seconds /** * Constructor */ public StandardXADataSource() { super(); minCon = DEFAULT_MIN_CON; maxCon = DEFAULT_MAX_CON; deadLockMaxWait = DEFAULT_DEADLOCKMAXWAIT; deadLockRetryWait = DEFAULT_DEADLOCKRETRYWAIT; freeConnections = new Vector(minCon, 1); // allow a reasonable size for free connections xidConnections = new Hashtable(minCon * 2, 0.5f); // ...and same for used connections log = new Logger(LogFactory.getLog("org.enhydra.jdbc.xapool")); log.debug("StandardXADataSource is created"); } public int getConnectionCount() { return connectionCount; } public Hashtable getXidConnections() { return xidConnections; } /** * Creates an XA connection using the default username and password. */ public XAConnection getXAConnection() throws SQLException { log.debug( "StandardXADataSource:getXAConnection(0) XA connection returned"); return getXAConnection(user, password); } /** * Creates an XA connection using the supplied username and password. */ public synchronized XAConnection getXAConnection( String user, String password) throws SQLException { log.debug("StandardXADataSource:getXAConnection(user, password)"); StandardXAConnection xac = new StandardXAConnection(this, user, password); xac.setTransactionManager(transactionManager); xac.setLogger(log); connectionCount++; return xac; } public void setTransactionManager(TransactionManager tm) { log.debug("StandardXADataSource:setTransactionManager"); this.transactionManager = tm; } public TransactionManager getTransactionManager() { return transactionManager; } public void setUser(String user) { log.debug("StandardXADataSource:setUser"); if (((user == null) || (getUser() == null)) ? user != getUser() : !user.equals(getUser())) { super.setUser(user); resetCache(); } } public void setPassword(String password) { log.debug("StandardXADataSource:setPassword"); if (((password == null) || (getPassword() == null)) ? password != getPassword() : !password.equals(getPassword())) { super.setPassword(password); resetCache(); } } public void setUrl(String url) { if (((url == null) || (getUrl() == null)) ? url != getUrl() : !url.equals(getUrl())) { super.setUrl(url); resetCache(); } } public void setDriverName(String driverName) throws SQLException { if ((driverName == null && getDriverName() != null) || (!driverName.equals(getDriverName()))) { super.setDriverName(driverName); resetCache(); } } private synchronized void resetCache() { log.debug("StandardXADataSource:resetCache"); // deadConnections will temporarily hold pointers to the // current ongoing transactions. These will be discarded when // freed deadConnections = (Hashtable) xidConnections.clone(); deadConnections.putAll(xidConnections); // now we'll just clear out the freeConnections Enumeration enum = freeConnections.elements(); while (enum.hasMoreElements()) { StandardXAStatefulConnection xasc = (StandardXAStatefulConnection) enum.nextElement(); try { log.debug( "StandardXADataSource:resetCache closing Connection:" + xasc.con); xasc.con.close(); } catch (SQLException e) { log.error( "StandardXADataSource:resetCache Error closing connection:" + xasc.con); } freeConnections.removeElement(xasc); } } /** * Called when an XA connection gets closed. When they have all * been closed then any remaining physical connections are also * closed. */ synchronized void connectionClosed() throws SQLException { log.debug("StandardXADataSource:connectionClosed"); connectionCount--; // one more connection closed if (connectionCount == 0) { // if no connections left // Close any connections still associated with XIDs. Enumeration cons = xidConnections.keys(); // used to iterate through the used connections while (cons.hasMoreElements()) { // while there are more connections Object key = cons.nextElement(); // get the next connection StandardXAStatefulConnection cur = (StandardXAStatefulConnection)xidConnections.remove(key); if(cur != null) { cur.con.close(); // close the physical connection } // cast to something more convenient log.debug( "StandardXADataSource:connectionClosed close physical connection"); } Iterator connIterator = freeConnections.iterator(); while (connIterator.hasNext()) { StandardXAStatefulConnection cur =(StandardXAStatefulConnection)connIterator.next(); cur.con.close(); connIterator.remove(); log.debug( "StandardXADataSource:connectionClosed close any free connections"); } } } /** * Returns the number of connections that are either * prepared or heuristically completed. */ public int getXidCount() { int count = 0; // the return value Enumeration cons = xidConnections.elements(); // used to iterate through the used connections while (cons.hasMoreElements()) { // while there are more connections Object o = cons.nextElement(); // get the next connection StandardXAStatefulConnection cur = (StandardXAStatefulConnection) o; // cast to something more convenient if ((cur.getState() == Status.STATUS_PREPARED) || // if prepared ( cur.getState() == Status.STATUS_PREPARING)) { // ...or heuristically committed count++; // one more connection with a valid xid } } log.debug( "StandardXADataSource:getXidCount return XidCount=<" + count + ">"); return count; } /** * Constructs a list of all prepared connections' xids. */ Xid[] recover() { int nodeCount = getXidCount(); // get number of connections in transactions Xid[] xids = new Xid[nodeCount]; // create the return array int i = 0; // used as xids index Enumeration cons = xidConnections.elements(); // used to iterate through the used connections while (cons.hasMoreElements()) { // while there are more connections Object o = cons.nextElement(); // get the next connection StandardXAStatefulConnection cur = (StandardXAStatefulConnection) o; // cast to something more convenient if ((cur.getState() == Status.STATUS_PREPARED) || // if prepared ( cur.getState() == Status.STATUS_PREPARING)) { // ...or heuristically committed xids[i++] = cur.xid; // save in list } } return xids; } /** * Frees a connection to make it eligible for reuse. The free list * is normally a last in, first out list (LIFO). This is efficient. * However, timed out connections are nice to hang onto for error * reporting, so they can be placed at the start. This is less * efficient, but hopefully is a rare occurence. * * Here, no need to verify the number of connections, we remove an * object from the xidConnections to put it in th freeConnections * */ public synchronized void freeConnection(Xid id, boolean placeAtStart) { log.debug("StandardXADataSource:freeConnection"); Object o = xidConnections.get(id); // lookup the connection by XID StandardXAStatefulConnection cur = (StandardXAStatefulConnection) o; // cast to something more convenient xidConnections.remove(id); // remove connection from in use list log.debug( "StandardXADataSource:freeConnection remove id from xidConnections"); if (!deadConnections.containsKey(id)) { // if this isn't to be discarded /* try { log.debug("StandardXADataSource:freeConnection setAutoCommit(true):" + cur.id); log.debug("con='"+cur.con.toString()+"'"); cur.con.setAutoCommit(acommit); } catch(SQLException e) { log.error("ERROR: Failed while autocommiting a connection: "+e); } */ cur.setState(Status.STATUS_NO_TRANSACTION); // set its new internal state if (!freeConnections.contains(cur)) { if (placeAtStart) { // if we want to keep for as long as possible freeConnections.insertElementAt(cur, 0); // then place it at the start of the list } else { freeConnections.addElement(cur); // otherwise it's a LIFO list } } } else { deadConnections.remove(id); try { cur.con.close(); } catch (SQLException e) { //ignore } } notify(); } /** * Invoked by the timer thread to check all transactions * for timeouts. Returns the time of the next timeout event * after current timeouts have expired. */ synchronized long checkTimeouts(long curTime) throws SQLException { //log.debug("StandardXADataSource:checkTimeouts"); long nextTimeout = 0; // the earliest non-expired timeout in the list Enumeration cons = xidConnections.elements(); // used to iterate through the used connections while (cons.hasMoreElements()) { // while there are more connections Object o = cons.nextElement(); // get the next connection StandardXAStatefulConnection cur = (StandardXAStatefulConnection) o; // cast to something more convenient if ((cur.timeout != 0) && // if connection has a timeout ( curTime > cur.timeout)) { // ...and transaction has timed out //log.debug("StandardXADataSource:checkTimeouts connection timeout"); cur.con.rollback(); // undo everything to do with this transaction cur.timedOut = true; // flag that it has timed out //log.debug(cur.toString()+" timed out"); freeConnection(cur.xid, true); // make the connection eligible for reuse // The timed out connection is eligible for reuse. The Xid and timedOut // flag will nevertheless remain valid until it is reallocated to another // global transaction. This gives the TM a *chance* to get a timeout // exception, but we won't hang on to it forever. } else { // transaction has not timed out if (cur.timeout != 0) { // but it has a timeout scheduled if ((cur.timeout < nextTimeout) || // and it's the next timeout to expire ( nextTimeout == 0)) { // ...or first timeout we've found nextTimeout = cur.timeout; // set up next timeout } } } } return nextTimeout; } /** * Checks the start of the free list to see if the connection * previously associated with the supplied Xid has timed out. *

* Note that this can be an expensive operation as it has to * scan all free connections. so it should only be called in * the event of an error. */ synchronized private void checkTimeouts(Xid xid) throws XAException { log.debug("StandardXADataSource:checkTimeouts"); for (int i = 0; i < freeConnections.size(); i++) { // check each free connection Object o = freeConnections.elementAt(i); // get next connection StandardXAStatefulConnection cur = (StandardXAStatefulConnection) o; // cast to something more convenient if (!cur.timedOut) { // if it hasn't timed out continue; // skip it } log.debug( "StandardXADataSource:checkTimeouts (" + i + "/" + freeConnections.size() + ") xid = " + xid); log.debug( "StandardXADataSource:checkTimeouts cur.xid = " + cur.xid); if (xid.equals(cur.xid)) { // if we've found our xid cur.timedOut = false; // cancel time out throw new XAException(XAException.XA_RBTIMEOUT); } } } /** * Returns the connection associated with a given XID. * is reached, the Xid is found or an exception is thrown. */ synchronized StandardXAStatefulConnection getConnection( Xid xid, boolean mustFind) throws XAException { log.debug( "StandardXADataSource:getConnection (xid=" + xid + ", mustFind=" + mustFind + ")"); Object o = xidConnections.get(xid); // lookup the connection by XID log.debug("XID: " + o); StandardXAStatefulConnection cur = (StandardXAStatefulConnection) o; // cast to something more convenient if (mustFind) { // if we expected to find the connection if (cur == null) { // and we didn't log.debug( "StandardXADataSource:getConnection (StatefulConnection is null)"); checkTimeouts(xid); // see if it's been freed during a timeout throw new XAException(XAException.XAER_NOTA); // not a valid XID } } else { // didn't expect to find the connection if (cur != null) { // but we found it anyway throw new XAException(XAException.XAER_DUPID); // duplicate XID } } log.debug( "StandardXADataSource:getConnection return connection associated with a given XID"); return cur; } /** * Returns a connection from the free list, removing it * in the process. If none area available then a new * connection is created. */ synchronized StandardXAStatefulConnection getFreeConnection() throws SQLException { log.debug("StandardXADataSource:getFreeConnection"); StandardXAStatefulConnection cur = null; // this will be the return value int freeCount = freeConnections.size(); // get number of free connections if (freeCount == 0) { // if there are no free connections log.debug( "StandardXADataSource:getFreeConnection there are no free connections, get a new database connection"); Connection con = super.getConnection(user, password); // get a new database connection cur = new StandardXAStatefulConnection(this, con); // make the connection stateful } else { Object o = freeConnections.lastElement(); // get the last element cur = (StandardXAStatefulConnection) o; // cast to something more convenient freeConnections.removeElementAt(freeCount - 1); // remove from free list cur.timeout = 0; // no timeout until start() called cur.timedOut = false; // cancel any time old out } log.debug( "StandardXADataSource:getFreeConnection return a connection from the free list"); try { log.debug( "StandardXADataSource:getFreeConnection setAutoCommit(true)"); // changed by cney - was false cur.con.setAutoCommit(true); } catch (SQLException e) { log.error( "StandardXADataSource:getFreeConnection ERROR: Failed while autocommiting a connection: " + e); } return cur; } public void closeFreeConnection() { log.debug("StandardXADataSource:closeFreeConnection empty method TBD"); } public void setMinCon(int min) { this.minCon = min; } public void setMaxCon(int max) { this.maxCon = max; } public void setDeadLockMaxWait(long deadLock) { this.deadLockMaxWait = deadLock; } public int getMinCon() { return this.minCon; } public int getMaxCon() { return this.maxCon; } public long getDeadLockMaxWait() { return this.deadLockMaxWait; } public int getAllConnections() { return xidConnections.size() + freeConnections.size(); } public synchronized void processToWait() throws Exception { log.debug("StandardXADataSource:processToWait"); int currentWait = 0; if (maxCon != 0) { while ((getAllConnections() >= maxCon) && (currentWait < getDeadLockMaxWait())) { dump(); try { synchronized (this) { wait(getDeadLockRetryWait()); } } catch (InterruptedException e) { log.error( "StandardXADataSource:processToWait ERROR: Failed while waiting for an object: " + e); } currentWait += getDeadLockRetryWait(); } if (getAllConnections() >= getMaxCon()) throw new Exception("StandardXADataSource:processToWait ERROR : impossible to obtain a new xa connection"); } } public void dump() { for (int i = 0; i < freeConnections.size(); i++) { log.debug( "freeConnection:<" + freeConnections.elementAt(i).toString() + ">"); } for (Enumeration enum = xidConnections.elements(); enum.hasMoreElements(); ) { log.debug("xidConnection:<" + enum.nextElement().toString() + ">"); } } public void setDeadLockRetryWait(long deadLockRetryWait) { this.deadLockRetryWait = deadLockRetryWait; } public long getDeadLockRetryWait() { return this.deadLockRetryWait; } public String toString() { StringBuffer sb = new StringBuffer(); sb.append("StandardXADataSource:\n"); sb.append(" connection count=<"+this.connectionCount+">\n"); sb.append(" number of dead connection=<"+this.deadConnections.size()+">\n"); sb.append(" dead lock max wait=<"+this.deadLockMaxWait+">\n"); sb.append(" dead lock retry wait=<"+this.deadLockRetryWait+">\n"); if (driver != null) sb.append(" driver=<"+this.driver.toString()+">\n"); sb.append(" driver name=<"+this.driverName+">\n"); sb.append(" number of *free* connections=<"+this.freeConnections.size()+">\n"); sb.append(" max con=<"+this.maxCon+">\n"); sb.append(" min con=<"+this.minCon+">\n"); sb.append(" prepared stmt cache size=<"+this.preparedStmtCacheSize+">\n"); sb.append(" transaction manager=<"+this.transactionManager+">\n"); sb.append(" xid connection size=<"+this.xidConnections.size()+">\n"); sb.append(super.toString()); return sb.toString(); } } xapool-1.5.0-src/src/org/enhydra/jdbc/standard/StandardXAPreparedStatement.java~0000644000175000017500000000563710235646676027710 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.standard; import java.sql.SQLException; public class StandardXAPreparedStatement extends StandardPreparedStatement { private StandardXAConnectionHandle con; // the StandardXAConnectionHandle that created this object public String sql; public int resultSetType; public int resultSetConcurrency; StandardXAPreparedStatement( StandardXAConnectionHandle con_, String sql_, int resultSetType_, int resultSetConcurrency_) throws SQLException { this.con = con_; this.sql = sql_; this.key = sql_ + resultSetType_ + resultSetConcurrency_; this.resultSetType = resultSetType_; this.resultSetConcurrency = resultSetConcurrency_; log = con_.log; log.debug( "StandardXAPreparedStatement: Create an XAPreparedStatement with sql='" + sql + "'"); key = sql + resultSetType + resultSetConcurrency + ((con.tx != null) ? true : false); ps = con.checkPreparedCache( sql, resultSetType, resultSetConcurrency, key); // from cney // ps = con.checkPreparedCache(sql, resultSetType, resultSetConcurrency,key); } /** * Close this statement. */ public synchronized void close() throws SQLException { log.debug( "StandardXAPreparedStatement:close the XA prepared statement"); // Note no check for already closed - some servers make mistakes closed = true; if (con.preparedStmtCacheSize == 0) { log.debug( "StandardXAPreparedStatement:close preparedStmtCacheSize == 0"); if (ps != null) { ps.close(); // no cache, so we can close } } else { log.debug( "StandardXAPreparedStatement:close preparedStmtCacheSize=" + "'" + con.preparedStmtCacheSize + "'"); con.returnToCache(key); // return the underlying statement to the cache } } /** * Exception management : catch or throw the exception */ public void catchInvoke(SQLException sqlException) throws SQLException { //ConnectionEvent event = new ConnectionEvent (con.pooledCon); //con.pooledCon.connectionErrorOccurred(event); throw (sqlException); } } xapool-1.5.0-src/src/org/enhydra/jdbc/standard/StandardXAStatement.java~0000644000175000017500000000446710235646676026225 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.standard; import java.sql.SQLException; import java.sql.Statement; import org.enhydra.jdbc.core.CoreStatement; public class StandardXAStatement extends CoreStatement { private StandardXAConnectionHandle con; // the StandardConnectionHandle that created this object private boolean closed; // true when the Statement has been closed private int resultSetType; private int resultSetConcurrency; /** * Constructor. */ StandardXAStatement( StandardXAConnectionHandle con, int resultSetType, int resultSetConcurrency) throws SQLException { this.con = con; this.resultSetType = resultSetType; this.resultSetConcurrency = resultSetConcurrency; log = con.log; statement = newStatement(); } private Statement newStatement() throws SQLException { if (resultSetType == 0 && resultSetConcurrency == 0) { return con.con.createStatement(); } else { return con.con.createStatement(resultSetType, resultSetConcurrency); } } /** * Close this statement. */ public synchronized void close() throws SQLException { super.close(); // we do not reuse the Statement, we have to close it closed = true; } /** * Exception management : catch or throw the exception */ public void catchInvoke(SQLException sqlException) throws SQLException { //ConnectionEvent event = new ConnectionEvent (con.pooledCon); //con.pooledCon.connectionErrorOccurred(event); throw (sqlException); } } xapool-1.5.0-src/src/org/enhydra/jdbc/standard/StandardXAConnectionHandle.java~0000644000175000017500000002726710235646676027477 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.standard; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Statement; import java.sql.CallableStatement; import java.util.Hashtable; import javax.transaction.Transaction; import javax.transaction.TransactionManager; import javax.transaction.RollbackException; import javax.transaction.SystemException; public class StandardXAConnectionHandle extends StandardConnectionHandle { boolean resetTxonResume =false; boolean globalTransaction; // true if a global transaction is in effect public TransactionManager transactionManager; public Transaction tx; public StandardXAConnection xacon; public boolean thisAutoCommit = true; /** * Constructor */ public StandardXAConnectionHandle( StandardXAConnection pooledCon, Hashtable preparedStatementCache, int preparedStmtCacheSize, TransactionManager tm) { super(pooledCon, preparedStatementCache, preparedStmtCacheSize); // setup StandardXAConnectionHandle xacon = pooledCon; transactionManager = tm; log = pooledCon.dataSource.log; // This will have set the Connection to the current Connection. // However this might change if a global transaction gets selected. } public void setTransactionManager(TransactionManager tm) { this.transactionManager = tm; } synchronized public void close() throws SQLException { Transaction ttx = tx; // note: ttx is used instead of tx because super.close(), call end() // on StdXAConnection which call tx = null; super.close(); log.debug("StandardXAConnectionHandle:close"); log.debug( "StandardXAConnectionHandle:close globalTransaction='" + globalTransaction + "' con.getAutoCommit='" + con.getAutoCommit() + "' ttx='" + ttx + "'"); if ((!con.getAutoCommit()) && (ttx == null)) { log.debug( "StandardXAConnectionHandle:close rollback the connection"); con.rollback(); con.setAutoCommit(thisAutoCommit); } else log.debug("StandardXAConnectionHandle:close do nothing else"); isReallyUsed = false; log.debug( "StandardXAConnectionHandle:close AFTER globalTransaction='" + globalTransaction + "' con.getAutoCommit='" + con.getAutoCommit() + "' ttx='" + ttx + "'"); } /** * Called by the StandardXADataSource when a global transaction * gets associated with this connection. */ void setGlobalTransaction(boolean setting) throws SQLException { log.debug( "StandardXAConnectionHandle:setGlobalTransaction gTransaction='" + setting + "'"); globalTransaction = setting; // set global flag con = pooledCon.getPhysicalConnection(); // get the real connection if (con == null) log.warn( "StandardXAConnectionHandle:setGlobalTransaction con is null before setupPreparedStatementCache"); else log.debug( "StandardXAConnectionHandle:setGlobalTransaction con is *NOT* null before setupPreparedStatementCache"); //setupPreparedStatementCache(); if(!isClosed()) super.setAutoCommit(!setting); // commits must be done by transaction manager } public void setAutoCommit(boolean autoCommit) throws SQLException { if (globalTransaction) // if taking part in a global transaction throw new SQLException("StandardXAConnectionHandle:setAutoCommit This connection is part of a global transaction"); super.setAutoCommit(autoCommit); } public void commit() throws SQLException { if (globalTransaction) // if taking part in a global transaction throw new SQLException("StandardXAConnectionHandle:commit:This connection is part of a global transaction"); super.commit(); //tx = null; } public void rollback() throws SQLException { if (globalTransaction) // if taking part in a global transaction throw new SQLException("StandardXAConnectionHandle:rollback:This connection is part of a global transaction"); super.rollback(); //tx = null; } synchronized PreparedStatement checkPreparedCache( String sql, int type, int concurrency, Object lookupKey) throws SQLException { PreparedStatement ret = null; // the return value // NOTE - We include the Connection in the lookup key. This has no // effect here but is needed by StandardXAConnection where the the physical // Connection used can vary over time depending on the global transaction. if (preparedStatementCache != null) { Object obj = preparedStatementCache.get(lookupKey); // see if there's a PreparedStatement already if (obj != null) { // if there is log.debug( "StandardXAConnectionHandle:checkPreparedCache object is found"); ret = (PreparedStatement) obj; // use as return value try { ret.clearParameters(); // make it look like new } catch (SQLException e) { // Bad statement, so we have to create a new one ret = createPreparedStatement(sql, type, concurrency); // create new prepared statement } preparedStatementCache.remove(lookupKey); // make sure it cannot be re-used inUse.put(lookupKey, ret); // make sure it gets reused by later delegates } else { // no PreparedStatement ready log.debug( "StandardXAConnectionHandle:checkPreparedCache object is *NOT* found"); ret = createPreparedStatement(sql, type, concurrency); // create new prepared statement inUse.put(lookupKey, ret); // will get saved in prepared statement cache } } else { log.debug( "StandardXAConnectionHandle:checkPreparedCache object the cache is out"); ret = createPreparedStatement(sql, type, concurrency); // create new prepared statement } // We don't actually give the application a real PreparedStatement. Instead // they get a StandardPreparedStatement that delegates everything except // PreparedStatement.close(); log.debug( "StandardXAConnectionHandle:checkPreparedCache pstmt='" + ret.toString() + "'"); return ret; } /** * Creates a PreparedStatement for the given SQL. If possible, the * statement is fetched from the cache. */ public PreparedStatement prepareStatement(String sql) throws SQLException { return prepareStatement(sql, 0, 0); } /** * Creates a PreparedStatement for the given SQL, type and concurrency. * If possible, the statement is fetched from the cache. */ public PreparedStatement prepareStatement( String sql, int resultSetType, int resultSetConcurrency) throws SQLException { if (tx == null) { log.debug("StandardXAConnectionHandle:prepareStatement tx==null"); try { try { Transaction ntx = this.getTransaction(); if (ntx != null) { log.debug( "StandardXAConnectionHandle:prepareStatement (found a transaction)"); tx = ntx; xacon.thisAutoCommit = this.getAutoCommit(); if (this.getAutoCommit()) { this.setAutoCommit(false); } try { tx.enlistResource(xacon.getXAResource()); // enlist the xaResource in the transaction } catch (RollbackException n) { log.debug( "StandardXAConnectionHandle:prepareStatemnet enlistResource exception : " + n.toString()); } } else { log.debug( "StandardXAConnectionHandle:prepareStatement (no transaction found)"); } } catch (SystemException n) { n.printStackTrace(); throw new SQLException( "StandardXAConnectionHandle:prepareStatement getTransaction exception: " + n.toString()); } } catch (NullPointerException n) { // current is null: we are not in EJBServer. n.printStackTrace(); throw new SQLException("StandardXAConnectionHandle:prepareStatement should not be used outside an EJBServer"); } } else log.debug("StandardXAConnectionHandle:prepareStatement tx!=null"); // if you want to use a REAL PrepareStatement object, please // uncomment the 2 following lines and comment the last ones. //PreparedStatement ops = con.prepareStatement(sql, resultSetType, resultSetConcurrency); //return ops; isReallyUsed = true; return new StandardXAPreparedStatement( this, sql, resultSetType, resultSetConcurrency); } /** * Creates a CallableStatement for the given SQL, result set type and concurency */ public CallableStatement prepareCall( String sql, int resultSetType, int resultSetConcurrency) throws SQLException { return new StandardXACallableStatement( this, sql, resultSetType, resultSetConcurrency); } /** * Creates a CallableStatement for the given SQL */ public CallableStatement prepareCall(String sql) throws SQLException { return new StandardXACallableStatement(this, sql, 0, 0); } public Statement createStatement() throws SQLException { if (tx == null) { log.debug("StandardXAConnectionHandle:createStatement tx==null"); try { try { Transaction ntx = this.getTransaction(); if (ntx != null) { log.debug( "StandardXAConnectionHandle:createStatement (found a transaction)"); tx = ntx; xacon.thisAutoCommit = this.getAutoCommit(); if (this.getAutoCommit()) { this.setAutoCommit(false); } try { tx.enlistResource(xacon.getXAResource()); // enlist the xaResource in the transaction } catch (RollbackException n) { log.debug( "StandardXAConnectionHandle:createStatement enlistResource exception: " + n.toString()); } } else { log.debug( "StandardXAConnectionHandle:createStatement (no transaction found)"); } } catch (SystemException n) { throw new SQLException( "StandardXAConnectionHandle:createStatement getTransaction exception: " + n.toString()); } } catch (NullPointerException n) { // current is null: we are not in EJBServer. throw new SQLException( "StandardXAConnectionHandle:createStatement should not be used outside an EJBServer: " + n.toString()); } } isReallyUsed = true; return new StandardXAStatement(this, 0, 0); } public Statement createStatement( int resultSetType, int resultSetConcurrency) throws SQLException { return new StandardXAStatement( this, resultSetType, resultSetConcurrency); } private Transaction getTransaction() throws SystemException { Transaction ntx = null; if (transactionManager != null) { ntx = transactionManager.getTransaction(); } else { log.debug( "StandardXAConnectionHandle:getTransaction (null transaction manager)"); } return ntx; } public String toString() { StringBuffer sb = new StringBuffer(); sb.append("StandardXAConnectionHandle:\n"); sb.append(" global transaction =<"+this.globalTransaction+ ">\n"); sb.append(" is really used =<"+this.isReallyUsed+ ">\n"); sb.append(" this autoCommit =<"+this.thisAutoCommit+ ">\n"); sb.append(" in use size =<"+this.inUse.size()+ ">\n"); sb.append(" master prepared stmt cache size =<"+this.masterPrepStmtCache.size()+ ">\n"); sb.append(" transaction =<"+this.tx+ ">\n"); sb.append(" connection =<"+this.con.toString()+ ">\n"); return sb.toString(); } } xapool-1.5.0-src/src/org/enhydra/jdbc/standard/StandardXACallableStatement.java~0000644000175000017500000000763010235646676027640 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.standard; import java.sql.SQLException; import java.sql.CallableStatement; import org.enhydra.jdbc.core.CoreCallableStatement; import javax.transaction.Transaction; import javax.transaction.SystemException; import javax.transaction.RollbackException; public class StandardXACallableStatement extends CoreCallableStatement { private StandardXAConnectionHandle con; // the StandardConnectionHandle that created this object private boolean closed; // true when the Statement has been closed private String sql; private int resultSetType; private int resultSetConcurrency; /** * Constructor. */ StandardXACallableStatement( StandardXAConnectionHandle con, String sql, int resultSetType, int resultSetConcurrency) throws SQLException { this.con = con; this.sql = sql; this.resultSetType = resultSetType; this.resultSetConcurrency = resultSetConcurrency; log = con.log; //cs = newStatement(); } private CallableStatement newStatement() throws SQLException { if (resultSetType == 0 && resultSetConcurrency == 0) { return con.con.prepareCall(sql); } else { return con.con.prepareCall( sql, resultSetType, resultSetConcurrency); } } /** * Close this statement. */ public synchronized void close() throws SQLException { super.close(); // we do not reuse the Statement, we have to close it closed = true; } /** * Pre-invokation of the delegation, in case of the Statement is * closed, we throw an exception */ public synchronized void preInvoke() throws SQLException { if (closed) throw new SQLException("Prepare Statement is closed"); Transaction ntx = null; if (con.tx == null) { try { try { ntx = (con.transactionManager != null) ? con.transactionManager.getTransaction() : null; if (ntx != null) { con.tx = ntx; con.xacon.thisAutoCommit = con.getAutoCommit(); con.setAutoCommit(false); try { con.tx.enlistResource(con.xacon.getXAResource()); // enlist the xaResource in the transaction if (cs != null) { cs.close(); cs = null; } } catch (RollbackException n) { throw new SQLException( "StandardXAStatement:preInvoke enlistResource exception: " + n.toString()); } } //else con.setAutoCommit(true); } catch (SystemException n) { throw new SQLException( "StandardXAStatement:preInvoke getTransaction exception: " + n.toString()); } } catch (NullPointerException n) { // current is null: we are not in EJBServer. throw new SQLException( "StandardXAStatement:preInvoke should not be used outside an EJBServer: " + n.toString()); } } if (cs == null) { cs = newStatement(); } } /** * Exception management : catch or throw the exception */ public void catchInvoke(SQLException sqlException) throws SQLException { //ConnectionEvent event = new ConnectionEvent (con.pooledCon); //con.pooledCon.connectionErrorOccurred(event); throw (sqlException); } } xapool-1.5.0-src/src/org/enhydra/jdbc/standard/StandardConnectionHandle.java~0000644000175000017500000002377310235646676027244 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.standard; import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.Enumeration; import java.util.Hashtable; import java.sql.Connection; import org.enhydra.jdbc.core.CoreConnection; import org.enhydra.jdbc.util.LRUCache; /** * This is an implementation of java.sql.Connection which simply * delegates almost everything to an underlying physical implemention * of the same interface. * * It relies on a StandardPooledConnection to create it and to supply the * physical connection and a cache of PreparedStatements. This class will * try to re-use PreparedStatements wherever possible and will add to the * cache when totally new PreparedStatements get created. */ public class StandardConnectionHandle extends CoreConnection { StandardPooledConnection pooledCon; // the pooled connection that created this object protected Hashtable masterPrepStmtCache; // the hashtable of caches, indexed by physical connection int preparedStmtCacheSize; // the size of the connection-specific cache protected LRUCache preparedStatementCache = null; // prepared statements indexed by SQL string public Hashtable inUse; // prepared statements that are currently in use private boolean closed; // set true when this connection has been closed public boolean isReallyUsed = false; /** * Constructor. */ public StandardConnectionHandle( StandardPooledConnection pooledCon, Hashtable preparedStatementCache, int preparedStmtCacheSize) { super(pooledCon.getPhysicalConnection()); // get the real connection this.pooledCon = pooledCon; // first save parameters masterPrepStmtCache = preparedStatementCache; this.preparedStmtCacheSize = preparedStmtCacheSize; log = pooledCon.dataSource.log; setupPreparedStatementCache(); inUse = new Hashtable(10, 0.5f); log.debug( "StandardConnectionHandle:new StandardConnectionHandle with " + preparedStmtCacheSize + " prepared statement"); } protected void setupPreparedStatementCache() { log.debug("StandardConnectionHandle:setupPreparedStatementCache start"); if (preparedStmtCacheSize == 0) { log.debug( "StandardConnectionHandle:setupPreparedStatementCache return with 0"); preparedStatementCache = null; return; } if (con == null) log.warn("Connection is null"); else { preparedStatementCache = (LRUCache) masterPrepStmtCache.get(con.toString()); if (preparedStatementCache == null) { preparedStatementCache = new PreparedStatementCache(preparedStmtCacheSize); preparedStatementCache.setLogger(log); masterPrepStmtCache.put(con.toString(), preparedStatementCache); log.debug( "StandardConnectionHandle:setupPreparedStatementCache " + "preparedStatementCache.size(lru)='" + preparedStatementCache.LRUSize() + "' " + "preparedStatementCache.size(cache)='" + preparedStatementCache.cacheSize() + "' " + "masterPrepStmtCache.size='" + masterPrepStmtCache.size() + "' "); } } log.debug("StandardConnectionHandle:setupPreparedStatementCache end"); } /** * Pre-invokation of the delegation, in case of connection is * closed, we throw an exception */ public void preInvoke() throws SQLException { if (closed) throw new SQLException("Connection is closed"); } /** * Exception management : catch or throw the exception */ public void catchInvoke(SQLException e) throws SQLException { //ConnectionEvent event = new ConnectionEvent (pooledCon);// create event associate with the connection //pooledCon.connectionErrorOccurred(event); // ppoled have to be closed throw (e); // throw the exception } /** * Closes this StandardConnectionHandle and prevents it * from being reused. It also returns used PreparedStatements * to the PreparedStatement cache and notifies all listeners. */ synchronized public void close() throws SQLException { log.debug("StandardConnectionHandle:close"); // Note - we don't check to see if already closed. Some servers get confused. closed = true; // connection now closed Enumeration keys = inUse.keys(); // get any prepared statements in use while (keys.hasMoreElements()) { // while more prepared statements used Object key = keys.nextElement(); // get next key returnToCache(key); // return prepared statement to cache } pooledCon.closeEvent(); // notify listeners if (preparedStatementCache != null) preparedStatementCache.cleanupAll(); if ((preparedStatementCache != null) && (masterPrepStmtCache != null) && (log != null)) log.debug( "StandardConnectionHandle:close " + "preparedStatementCache.size(lru)='" + preparedStatementCache.LRUSize() + "' " + "preparedStatementCache.size(cache)='" + preparedStatementCache.cacheSize() + "' " + "masterPrepStmtCache.size='" + masterPrepStmtCache.size() + "' "); } /** * Removes a prepared statement from the inUse list * and returns it to the cache. */ void returnToCache(Object key, Connection theCon) { Object value = inUse.remove(key); // remove key/value from used statements if (value != null) { LRUCache theCache = (LRUCache) masterPrepStmtCache.get(theCon.toString()); theCache.put(key, value); // place back in cache, ready for re-use } } void returnToCache(Object key) { returnToCache(key, con); } /** * Checks to see if a prepared statement with the same concurrency * has already been created. If not, then a new prepared statement * is created and added to the cache. * * If a prepared statement is found in the cache then it is removed * from the cache and placed on the "inUse" list. This ensures that * if multiple threads use the same StandardConnectionHandle, or a single * thread does multiple prepares using the same SQL, then DIFFERENT * prepared statements will be returned. */ synchronized PreparedStatement checkPreparedCache( String sql, int type, int concurrency) throws SQLException { log.debug( "StandardConnectionHandle:checkPreparedCache sql='" + sql + "'"); PreparedStatement ret = null; // the return value // NOTE - We include the Connection in the lookup key. This has no // effect here but is needed by StandardXAConnection where the the physical // Connection used can vary over time depending on the global transaction. String lookupKey = sql + type + concurrency; // used to lookup statements if (preparedStatementCache != null) { Object obj = preparedStatementCache.get(lookupKey); // see if there's a PreparedStatement already if (obj != null) { // if there is ret = (PreparedStatement) obj; // use as return value try { ret.clearParameters(); // make it look like new } catch (SQLException e) { // Bad statement, so we have to create a new one ret = createPreparedStatement(sql, type, concurrency); } preparedStatementCache.remove(lookupKey); // make sure it cannot be re-used inUse.put(lookupKey, ret); // make sure it gets reused by later delegates } else { // no PreparedStatement ready ret = createPreparedStatement(sql, type, concurrency); inUse.put(lookupKey, ret); // will get saved in prepared statement cache } } else { ret = createPreparedStatement(sql, type, concurrency); } // We don't actually give the application a real PreparedStatement. Instead // they get a StandardPreparedStatement that delegates everything except // PreparedStatement.close(); ret = new StandardPreparedStatement(this, ret, lookupKey); return ret; } protected PreparedStatement createPreparedStatement( String sql, int type, int concurrency) throws SQLException { log.debug( "StandardConnectionHandle:createPreparedStatement type ='" + type + "'"); if (type == 0) { // if no type or concurrency specified return con.prepareStatement(sql); // create new prepared statement } else { return con.prepareStatement(sql, type, concurrency); // create new prepared statement } } /** * Creates a PreparedStatement for the given SQL. If possible, the * statement is fetched from the cache. */ public PreparedStatement prepareStatement(String sql) throws SQLException { log.debug( "StandardConnectionHandle:prepareStatement sql='" + sql + "'"); preInvoke(); try { return checkPreparedCache(sql, 0, 0); } catch (SQLException e) { catchInvoke(e); } return null; } /** * Creates a PreparedStatement for the given SQL, type and concurrency. * If possible, the statement is fetched from the cache. */ public PreparedStatement prepareStatement( String sql, int resultSetType, int resultSetConcurrency) throws SQLException { preInvoke(); try { return checkPreparedCache(sql, resultSetType, resultSetConcurrency); } catch (SQLException e) { catchInvoke(e); } return null; } public boolean isClosed() throws SQLException { return closed; } public CallableStatement prepareCall( String sql, int resultSetType, int resultSetConcurrency) throws SQLException { preInvoke(); try { return con.prepareCall(sql, resultSetType, resultSetConcurrency); } catch (SQLException e) { catchInvoke(e); } return null; } }xapool-1.5.0-src/src/org/enhydra/jdbc/sybase/0000755000175000017500000000000010235646676020761 5ustar twernertwernerxapool-1.5.0-src/src/org/enhydra/jdbc/sybase/SybaseConnectionHandle.java0000644000175000017500000000311610235646676026207 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.sybase; import org.enhydra.jdbc.standard.StandardConnectionHandle; import java.util.Hashtable; import java.sql.SQLException; public class SybaseConnectionHandle extends StandardConnectionHandle { public SybaseConnectionHandle (SybasePooledConnection pooledCon, Hashtable preparedStatementCache, int preparedStmtCacheSize) { super (pooledCon, preparedStatementCache,preparedStmtCacheSize); } synchronized public void setAutoCommit(boolean autoCommit) throws SQLException { preInvoke(); try { con.commit(); con.setAutoCommit(autoCommit); } catch (SQLException e) { catchInvoke(e); } } } xapool-1.5.0-src/src/org/enhydra/jdbc/sybase/SybaseConnectionPoolDataSource.java0000644000175000017500000000351310235646676027701 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.sybase; import org.enhydra.jdbc.standard.StandardConnectionPoolDataSource; import javax.sql.PooledConnection; import java.sql.SQLException; public class SybaseConnectionPoolDataSource extends StandardConnectionPoolDataSource { /** * Create a pooled connection using the default username and password. */ public PooledConnection getPooledConnection () throws SQLException { log.debug("SybaseConnectionPoolDataSource:getPooledConnection(0) return a pooled connection"); return getPooledConnection (user, password); } /** * Create a sybase pooled connection using the supplied username and password. */ public PooledConnection getPooledConnection (String user, String password) throws SQLException { log.debug("SybaseConnectionPoolDataSource:getPooledConnection(2) return a pooled connection"); return new SybasePooledConnection (this, user, password); } } xapool-1.5.0-src/src/org/enhydra/jdbc/sybase/SybasePooledConnection.java0000644000175000017500000000311410235646676026234 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.sybase; import org.enhydra.jdbc.standard.StandardPooledConnection; import org.enhydra.jdbc.standard.StandardConnectionPoolDataSource; import javax.sql.ConnectionPoolDataSource; import java.sql.SQLException; public class SybasePooledConnection extends StandardPooledConnection { public SybasePooledConnection (ConnectionPoolDataSource dataSource, String user, String password) throws SQLException { super((StandardConnectionPoolDataSource)dataSource, user, password); } protected void newConnectionHandle() { connectionHandle = new SybaseConnectionHandle (this, dataSource.getMasterPrepStmtCache(), dataSource.getPreparedStmtCacheSize()); } } xapool-1.5.0-src/src/org/enhydra/jdbc/sybase/SybaseXAConnection.java0000644000175000017500000000471210235646676025327 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.sybase; import org.enhydra.jdbc.standard.StandardXAConnection; import java.sql.SQLException; public class SybaseXAConnection extends StandardXAConnection { /** * Creates the first free connection. */ public SybaseXAConnection (SybaseXADataSource dataSource, String user, String password) throws SQLException { super (dataSource, user, password); // creates the first Connection object // Save the constructor parameters. this.dataSource = dataSource; curCon = new SybaseXAStatefulConnection (dataSource, con);// wrap connection as a stateful connection // NOTE - the current connection is not made known to the data source // so it is not eligible for re-use. It only goes on the data source list // if it ever becomes associated with a global transaction. /* // get the timer thread if (dataSource.getThreadFactory() != null) { dataSource.log("StandardXAConnection: Getting thread from factory"); timerThread = dataSource.getThreadFactory().getThread(this); dataSource.log("StandardXAConnection: Got thread from factory"); } else { dataSource.log("StandardXAConnection: Getting thread from new Thread()"); timerThread = new Thread (this); // create the backgroup thread to check for timeouts } timerThread.start(); // start the timer thread //timerThread.suspend(); // and suspend until some timeouts get set up */ dataSource.log.debug("SybaseXAConnection created"); } } xapool-1.5.0-src/src/org/enhydra/jdbc/sybase/SybaseXADataSource.java0000644000175000017500000000477310235646676025271 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.sybase; import org.enhydra.jdbc.standard.StandardXADataSource; import javax.sql.XAConnection; import javax.sql.PooledConnection; import java.sql.SQLException; public class SybaseXADataSource extends StandardXADataSource { /** * Creates an XA connection using the default username and password. */ public XAConnection getXAConnection () throws SQLException { log.debug("SybaseXADataSource:getXAConnection(0) XA connection returned"); return getXAConnection (user, password); } /** * Creates an XA connection using the supplied username and password. */ public XAConnection getXAConnection (String user, String password) throws SQLException { SybaseXAConnection xac = new SybaseXAConnection (this, user, password); connectionCount++; log.debug("SybaseXADataSource:getXAConnection(2) XA connection returned"); return xac; } /** * Create a pooled connection using the default username and password. */ public PooledConnection getPooledConnection () throws SQLException { log.debug("SybaseConnectionPoolDataSource:getPooledConnection(0) return a pooled connection"); return getPooledConnection (user, password); } /** * Create a sybase pooled connection using the supplied username and password. */ public PooledConnection getPooledConnection (String user, String password) throws SQLException { log.debug("SybaseConnectionPoolDataSource:getPooledConnection(2) return a pooled connection"); return new SybasePooledConnection (this, user, password); } } xapool-1.5.0-src/src/org/enhydra/jdbc/sybase/SybaseXAStatefulConnection.java0000644000175000017500000000245710235646676027043 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.sybase; import org.enhydra.jdbc.standard.StandardXAStatefulConnection; import java.sql.Connection; public class SybaseXAStatefulConnection extends StandardXAStatefulConnection { /** * Creates a new stateful connection in the FREE state (NO_TRANSACTION) */ SybaseXAStatefulConnection (SybaseXADataSource dataSource, Connection con) { super(dataSource, con); } } xapool-1.5.0-src/src/org/enhydra/jdbc/util/0000755000175000017500000000000010235646676020450 5ustar twernertwernerxapool-1.5.0-src/src/org/enhydra/jdbc/util/JdbcUtil.java0000644000175000017500000000203610235646676023014 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.util; public class JdbcUtil { public Logger log; public void setLogger(Logger alog) { log = alog; } } xapool-1.5.0-src/src/org/enhydra/jdbc/util/LRUCache.java0000644000175000017500000001074710235646676022712 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.util; import java.util.Hashtable; import java.util.LinkedList; import java.util.ArrayList; import java.util.List; import java.util.Iterator; import java.util.Enumeration; /** * Simple implementation of a cache, using Least Recently Used algorithm * for discarding members when the cache fills up */ public class LRUCache { /** The cache */ private Hashtable cache = new Hashtable(); /** The linked list to keep track of least/most recently used */ private LinkedList lru = new LinkedList(); /** The maximum size of the cache */ private int maxSize; public Logger log; /** * Constructor */ public LRUCache(int maxSize) { this.maxSize = maxSize; } public int LRUSize() { return lru.size(); } public int cacheSize() { return cache.size(); } /** * Puts a new object in the cache. If the cache is full, it removes * the least recently used object. The new object becomes the most * recently used object. */ public void put(Object key, Object value) { List removed = new ArrayList(); synchronized (this) { // make room if needed while (cache.size() + 1 > maxSize) { removed.add(removeLRU()); } // remove the key from the list if it's in the cache already if (cache.containsKey(key)) { lru.remove(key); } // the last item in the list is the most recently used lru.addLast(key); // put it in the actual cache cache.put(key, value); } cleanupAll(removed); } /** * Gets an object from the cache. This object is set to be the * most recenty used */ public synchronized Object get(Object key) { // check for existence in cache if (!cache.containsKey(key)) { return null; } // set to most recently used lru.remove(key); lru.addLast(key); // return the object return cache.get(key); } /** * Removes the object from the cache and the lru list */ public synchronized Object remove(Object key) { // check for existence in cache if (!cache.containsKey(key)) { return null; } // remove from lru list lru.remove(key); // remove from cache Object obj = cache.remove(key); return obj; } private synchronized Object removeLRU() { Object obj = cache.remove(lru.getFirst()); lru.removeFirst(); return obj; } /** * Resize the cache */ public void resize(int newSize) { if (newSize <= 0) { return; } List removed = new ArrayList(); synchronized (this) { maxSize = newSize; while (cache.size() > maxSize) { removed.add(removeLRU()); } } cleanupAll(removed); } private void cleanupAll(List removed) { Iterator it = removed.iterator(); while (it.hasNext()) { cleanupObject(it.next()); } } /** * Override this method to do special cleanup on an object, * such as closing a statement or a connection */ protected void cleanupObject(Object o) {} public void cleanupAll() { for (Enumeration enum = cache.keys();enum.hasMoreElements();) { Object o = remove(enum.nextElement()); cleanupObject(o); } } public void setLogger(Logger alog) { log = alog; } } xapool-1.5.0-src/src/org/enhydra/jdbc/util/Logger.java0000644000175000017500000000351010235646676022531 0ustar twernertwerner/* * XAPool: Open Source XA JDBC Pool * Copyright (C) 2003 Objectweb.org * Initial Developer: Lutris Technologies Inc. * Contact: xapool-public@lists.debian-sf.objectweb.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.enhydra.jdbc.util; import org.apache.commons.logging.Log; import java.io.PrintWriter; public class Logger extends PrintWriter{ private Log log; public Logger(Log log) { super(new PrintWriter(System.err)); this.log = log; } public void debug(Object o) { log.debug(o); } public void debug(Object o, Throwable t) { log.debug(o,t); } public void info(Object o) { log.info(o); } public void info(Object o, Throwable t) { log.info(o,t); } public void warn(Object o) { log.warn(o); } public void warn(Object o, Throwable t) { log.warn(o,t); } public void error(Object o) { log.error(o); } public void error(Object o, Throwable t) { log.error(o,t); } public void fatal(Object o) { log.fatal(o); } public void fatal(Object o, Throwable t) { log.fatal(o,t); } } xapool-1.5.0-src/test/0000755000175000017500000000000010235646676014540 5ustar twernertwernerxapool-1.5.0-src/test/jotmxapooltest/0000755000175000017500000000000010235646676017634 5ustar twernertwernerxapool-1.5.0-src/test/jotmxapooltest/config/0000755000175000017500000000000010235646676021101 5ustar twernertwernerxapool-1.5.0-src/test/jotmxapooltest/config/config.properties0000644000175000017500000000041410235646676024463 0ustar twernertwerner### ## JotmXaPoolTest Dynamic Configuration Settings ### # Name of the database configuration file jdbc.config.file=hsqldb.properties # Name of the table to use for testing table.name=jotm_xapool_test # Number of times to loop for the looping tests loop.amount=500 xapool-1.5.0-src/test/jotmxapooltest/config/hsqldb.properties0000644000175000017500000000161610235646676024500 0ustar twernertwerner### ## JotmXaPoolTest HSQLDB Datasource Configuration ### #################################################### ## HSQLDB Configuration #################################################### # Nmae of the wrapper class (Sybase, Oracle, etc) jdbc.wrapper=org.enhydra.jdbc.standard.StandardXADataSource # JDBC Driver class jdbc.driver=org.hsqldb.jdbcDriver #jdbc.driver=com.p6spy.engine.spy.P6SpyDriver # Connection URL jdbc.url=jdbc:hsqldb:data/jotmxapooltext # Login/Password jdbc.login=sa jdbc.password= # Description of datasource jdbc.description=HSQL # Transaction Isolation Level # None: 0; ReadUnCommited: 1; ReadCommited: 2; # RepeatableRead: 4; Serializable: 8 jdbc.isolation.level=1 # Create Statement - Since databases have different type names # CREATE TABLE [tableName] will be added to the beginning sql.create.columns=(idx_1 BIGINT, col_2 VARCHAR(), col_3 VARCHAR(), stamp_4 TIMESTAMP) xapool-1.5.0-src/test/jotmxapooltest/config/log4j.properties0000644000175000017500000000243410235646676024241 0ustar twernertwerner### ## JotmXaPoolTest Log4J Configuration ### ### ## Root Logger And Appenders (console / file / html) ### log4j.rootCategory=ALL, stdout, file, html ### ## Console Log Settings ### log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%-5r[%24F:%-3L:%-5p]%x %m%n ### ## File Log Settings ### log4j.appender.file=org.apache.log4j.FileAppender log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%-5r[%24F:%-3L:%-5p]%x %m%n log4j.appender.file.File=logs/jotm-xapool-test.log ### ## XAPool Log Settings ### log4j.appender.poolfile=org.apache.log4j.FileAppender log4j.appender.poolfile.layout=org.apache.log4j.PatternLayout log4j.appender.poolfile.layout.ConversionPattern=%-5r[%24F:%-3L:%-5p]%x %m%n log4j.appender.poolfile.File=logs/xapool-detail.log ### ## HTML Log Settings ### log4j.appender.html=org.apache.log4j.FileAppender log4j.appender.html.layout=org.apache.log4j.HTMLLayout log4j.appender.html.File=logs/jotm-xapool-test.html ### ## Log Level Settings (main log: change as needed) ### log4j.category.org.objectweb.carol=INFO log4j.category.org.objectweb.jotm=INFO log4j.category.org.enhydra.jdbc=INFO log4j.category.jotm.test=ALL xapool-1.5.0-src/test/jotmxapooltest/config/mysql.properties0000644000175000017500000000164110235646676024366 0ustar twernertwerner### ## JotmXaPoolTest MySQL Datasource Configuration ### #################################################### ## MySQL Configuration #################################################### # Nmae of the wrapper class (Sybase, Oracle, etc) jdbc.wrapper=org.enhydra.jdbc.standard.StandardXADataSource # JDBC Driver class jdbc.driver=org.gjt.mm.mysql.Driver #jdbc.driver=com.p6spy.engine.spy.P6SpyDriver # Connection URL jdbc.url=jdbc:mysql://localhost/jotmxapooltest # Login/Password jdbc.login=root jdbc.password= # Description of datasource jdbc.description=MySQL # Transaction Isolation Level # None: 0; ReadUnCommited: 1; ReadCommited: 2; # RepeatableRead: 4; Serializable: 8 jdbc.isolation.level=2 # Create Statement - Since databases have different type names # CREATE TABLE [tableName] will be added to the beginning sql.create.columns=(idx_1 DECIMAL(18,0), col_2 VARCHAR(60), col_3 VARCHAR(60), stamp_4 DATETIME) xapool-1.5.0-src/test/jotmxapooltest/config/oracle.properties0000644000175000017500000000165110235646676024467 0ustar twernertwerner### ## JotmXaPoolTest Oracle Datasource Configuration ### #################################################### ## Oracle Configuration #################################################### # Nmae of the wrapper class (Sybase, Oracle, etc) jdbc.wrapper=org.enhydra.jdbc.oracle.OracleXADataSource # JDBC Driver class jdbc.driver=oracle.jdbc.driver.OracleDriver #jdbc.driver=com.p6spy.engine.spy.P6SpyDriver # Connection URL jdbc.url=jdbc:oracle:thin:@localhost:1521:jotmxapoltest # Login/Password jdbc.login= jdbc.password= # Description of datasource jdbc.description=Oracle # Transaction Isolation Level # None: 0; ReadUnCommited: 1; ReadCommited: 2; # RepeatableRead: 4; Serializable: 8 jdbc.isolation.level=2 # Create Statement - Since databases have different type names # CREATE TABLE [tableName] will be added to the beginning sql.create.columns=(idx_1 NUMBER(18,0), col_2 VARCHAR2(60), col_3 VARCHAR2(60), stamp_4 DATE) xapool-1.5.0-src/test/jotmxapooltest/config/postgres.properties0000644000175000017500000000167110235646676025072 0ustar twernertwerner### ## JotmXaPoolTest PostgreSQL Datasource Configuration ### #################################################### ## PostgreSQL Configuration #################################################### # Nmae of the wrapper class (Sybase, Oracle, etc) jdbc.wrapper=org.enhydra.jdbc.standard.StandardXADataSource # JDBC Driver class jdbc.driver=org.postgresql.Driver #jdbc.driver=com.p6spy.engine.spy.P6SpyDriver # Connection URL jdbc.url=jdbc:postgresql://localhost/jotmxapooltest # Login/Password jdbc.login=postgres jdbc.password= # Description of datasource jdbc.description=PostgreSQL # Transaction Isolation Level # None: 0; ReadUnCommited: 1; ReadCommited: 2; # RepeatableRead: 4; Serializable: 8 jdbc.isolation.level=2 # Create Statement - Since databases have different type names # CREATE TABLE [tableName] will be added to the beginning sql.create.columns=(idx_1 NUMERIC(18,0), col_2 VARCHAR(60), col_3 VARCHAR(60), stamp_4 TIMESTAMPTZ) xapool-1.5.0-src/test/jotmxapooltest/config/sapdb.properties0000644000175000017500000000164310235646676024314 0ustar twernertwerner### ## JotmXaPoolTest SAPDB Datasource Configuration ### #################################################### ## SAPDB Configuration #################################################### # Nmae of the wrapper class (Sybase, Oracle, etc) jdbc.wrapper=org.enhydra.jdbc.standard.StandardXADataSource # JDBC Driver class jdbc.driver=com.sap.dbtech.jdbc.DriverSapDB #jdbc.driver=com.p6spy.engine.spy.P6SpyDriver # Connection URL jdbc.url=jdbc:sapdb://localhost/JAVATEST # Login/Password jdbc.login=dba jdbc.password=dba # Description of datasource jdbc.description=SAPDB # Transaction Isolation Level # None: 0; ReadUnCommited: 1; ReadCommited: 2; # RepeatableRead: 4; Serializable: 8 jdbc.isolation.level=2 # Create Statement - Since databases have different type names # CREATE TABLE [tableName] will be added to the beginning sql.create.columns=(idx_1 FIXED(18,0), col_2 VARCHAR(60), col_3 VARCHAR(60), stamp_4 TIMESTAMP) xapool-1.5.0-src/test/jotmxapooltest/config/sybase.properties0000644000175000017500000000230310235646676024503 0ustar twernertwerner### ## JotmXaPoolTest Sybase Datasource Configuration ### #################################################### ## Sybase Configuration #################################################### # Nmae of the wrapper class (Sybase, Oracle, etc) #jdbc.wrapper=org.enhydra.jdbc.sybase.SybaseXADataSource jdbc.wrapper=org.enhydra.jdbc.standard.StandardXADataSource # JDBC Driver class #jdbc.driver=net.sourceforge.jtds.jdbc.Driver #jdbc.driver=com.sybase.jdbc2.jdbc.SybDriver jdbc.driver=com.sybase.jdbc2.jdbc.SybXADataSource #jdbc.driver=com.p6spy.engine.spy.P6SpyDriver # Connection URL #jdbc.url=jdbc:jtds:sybase://localhost:4001/jotmxapooltest;TDS=4.2 jdbc.url=jdbc:sybase:Tds:localhost:4001/tempdb;SETCHAINED_OFF=true&BE_AS_JDBC_COMPLIANT_ AS_POSSIBLE=true # Login/Password jdbc.login=sa jdbc.password= # Description of datasource jdbc.description=Sybase # Transaction Isolation Level # None: 0; ReadUnCommited: 1; ReadCommited: 2; # RepeatableRead: 4; Serializable: 8 jdbc.isolation.level=2 # Create Statement - Since databases have different type names # CREATE TABLE [tableName] will be added to the beginning sql.create.columns=(idx_1 NUMERIC(18,0), col_2 VARCHAR(60), col_3 VARCHAR(60), stamp_4 timestamp) xapool-1.5.0-src/test/jotmxapooltest/.cvsignore0000644000175000017500000000002010235646676021624 0ustar twernertwernerbuild logs data xapool-1.5.0-src/test/jotmxapooltest/README.txt0000644000175000017500000000203110235646676021326 0ustar twernertwerner# # Complete test from Andy Zeneski # this test is used with HSQL by Andy # and can be used with PostgreSQL or MySQL # this test has been modified to be used with postgres. # ORIGINAL test is available at: # http://xapool.experlog.com/pub/test/jotmxapooltest.zip # Scenario: --------- o Various different tests to make sure XAPool and JOTM are working properly. o Used before updating OFBiz. Setup: ------ o A database: - HSQLDB - MySQL - PostgreSQL - Oracle Database Setup: --------------- o configure the database properties in the config directory o configure the properties file to use in config.properties o configure the table name and other options there as well o configure the log4j settings in config/log4j.properties Compilation: ------------ Go to output/dist/test/jotmxapooltest Type $ ant to compile and run the test Run the test: ---------------- o Just run ant; all the tests will run. There will be a log directory left behind with raw text and html output from the test Usage: ------ $ ant Enjoy! xapool-1.5.0-src/test/jotmxapooltest/build.xml0000644000175000017500000000744710235646676021471 0ustar twernertwerner xapool-1.5.0-src/test/jotmxapooltest/lib/0000755000175000017500000000000010235646676020402 5ustar twernertwernerxapool-1.5.0-src/test/jotmxapooltest/src/0000755000175000017500000000000010235646676020423 5ustar twernertwernerxapool-1.5.0-src/test/jotmxapooltest/src/JotmXaPoolTest.java0000644000175000017500000011506610235646676024173 0ustar twernertwerner// JOTM/XAPool Test Class // This is to test transactions and connection // Written By: Andy Zeneski (jaz@ofbiz.org) import java.io.StringWriter; import java.io.Writer; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.sql.Timestamp; import java.util.Date; import java.util.Properties; import java.util.Random; import javax.sql.XAConnection; import javax.transaction.HeuristicMixedException; import javax.transaction.HeuristicRollbackException; import javax.transaction.InvalidTransactionException; import javax.transaction.NotSupportedException; import javax.transaction.RollbackException; import javax.transaction.SystemException; import javax.transaction.Transaction; import javax.transaction.TransactionManager; import javax.transaction.UserTransaction; import org.apache.log4j.Logger; import org.apache.log4j.Priority; import org.enhydra.jdbc.pool.StandardXAPoolDataSource; import org.enhydra.jdbc.standard.StandardXADataSource; import org.objectweb.jotm.Jotm; import org.objectweb.transaction.jta.TMService; public class JotmXaPoolTest { protected static Logger logger = Logger.getLogger("jotm.test"); protected String createColumns = null; protected String tableName = null; protected int counter = 0; protected int loops = 500; protected TMService jotm = null; protected StandardXAPoolDataSource pool = null; public JotmXaPoolTest() throws Exception { // start JOTM jotm = new Jotm(true, false); logger.info("Started JOTM..."); // need a classloader ClassLoader cl = Thread.currentThread().getContextClassLoader(); // get the datasource config file name String dsConfigName = System.getProperty("jdbc.config.file"); // if not in environment load from datasource.properties if (dsConfigName == null || dsConfigName.length() == 0) { // load the datasource properties Properties dsProps = new Properties(); dsProps.load(cl.getResourceAsStream("config.properties")); dsConfigName = dsProps.getProperty("jdbc.config.file"); tableName = dsProps.getProperty("table.name", "jotm_xapool_test"); String loopAmt = dsProps.getProperty("loop.amount", "500"); try { loops = Integer.parseInt(loopAmt); } catch (NumberFormatException e) { loops = 500; } } // no config we cannot run if (dsConfigName == null || dsConfigName.length() == 0) { throw new IllegalStateException("No datasource properties configured; set the jdbc.config.file variable in the environment or in datasource.properties"); } // if we have the name; load the props Properties props = new Properties(); props.load(cl.getResourceAsStream(dsConfigName)); // set the sql for the create statement createColumns = props.getProperty("sql.create.columns"); // get an instance of the datasource wrapper String defaultWrapper = "org.enhydra.jdbc.standard.StandardXADataSource"; String wrapperName = props.getProperty("jdbc.wrapper", defaultWrapper); Class c = cl.loadClass(wrapperName); Object o = c.newInstance(); // create the datasource StandardXADataSource ds = (StandardXADataSource) o; ds.setTransactionManager(jotm.getTransactionManager()); ds.setDriverName(props.getProperty("jdbc.driver")); ds.setUrl(props.getProperty("jdbc.url")); ds.setUser(props.getProperty("jdbc.login")); ds.setPassword(props.getProperty("jdbc.password", "")); ds.setDescription(props.getProperty("jdbc.description", "NA")); // get the isolation level (default is READ_COMITTED) int isoLevel = 2; try { isoLevel = Integer.parseInt(props.getProperty("jdbc.isolation.level", "2")); } catch (NumberFormatException e) { logger.error("Problems parsing the isolation level (should be a number) using READ_COMMITED"); isoLevel = 2; } ds.setTransactionIsolation(isoLevel); // create the pool pool = new StandardXAPoolDataSource(); pool.setDataSource(ds); pool.setDescription(ds.getDescription()); pool.setUser(ds.getUser()); pool.setPassword(ds.getPassword()); pool.setTransactionManager(jotm.getTransactionManager()); logger.info("Created pool..."); } public void dropTest() throws SQLException { Connection con = pool.getConnection(); Statement s = con.createStatement(); s.executeUpdate("DROP TABLE " + tableName); s.close(); con.close(); logger.info("Table '" + tableName + "' dropped."); } public void createTest() throws SQLException { // get a connection Connection con = pool.getConnection(); logger.info("Isolation level : " + con.getTransactionIsolation()); String sql = "CREATE TABLE " + tableName + " " + this.createColumns; Statement s = con.createStatement(); s.executeUpdate(sql); s.close(); con.close(); logger.info("Table '" + tableName + "' created."); } /** Tests a loop of inserts using different connections and transaction */ public void insertTest() { // start the transaction UserTransaction trans = jotm.getUserTransaction(); logger.info("Beginning multiple insert with unique transactions/connections..."); for (int i = 0; i < loops; i++) { try { trans.begin(); } catch (NotSupportedException e1) { logger.error("Exception", e1); } catch (SystemException e1) { logger.error("Exception", e1); } Connection con = null; try { con = pool.getConnection(); } catch (SQLException e) { logger.error("Problems getting new connection - Test Failed!", e); return; } if (con == null) { logger.error("Pool returned null connection with no exception - Test Failed!"); return; } logger.debug("[A] Looping.. inserting #" + i); try { // insert item String sql1 = "INSERT INTO " + tableName + " VALUES(?,?,?,?)"; PreparedStatement ps1 = con.prepareStatement(sql1); ps1.setInt(1, ++counter); ps1.setString(2, "insTest" + i); ps1.setString(3, "Insert Test"); ps1.setTimestamp(4, new Timestamp(new Date().getTime())); ps1.executeUpdate(); ps1.close(); // select it back String sql2 = "SELECT * FROM " + tableName + " WHERE idx_1 = ?"; PreparedStatement ps2 = con.prepareStatement(sql2); ps2.setInt(1, counter); ResultSet res = ps2.executeQuery(); if (res == null || !res.next()) { logger.error("Could not get inserted item back from select!"); } else { logger.debug(res.getString(1) + " : " + res.getString(2) + "[" + res.getString(3) + "] - " + res.getString(4)); } res.close(); ps2.close(); } catch (Exception e) { logger.error("Exception", e); try { trans.setRollbackOnly(); } catch (IllegalStateException e2) { logger.error("Exception", e2); } catch (SystemException e2) { logger.error("Exception", e2); } } finally { // close the connection try { con.close(); } catch (SQLException e2) { logger.error("Exception", e2); } // commit the transaction try { trans.commit(); } catch (Exception e) { logger.error("Exception", e); } } } } /** Tests a loop of inserts using different connections, same transaction */ public void connectionTest() { // start the transaction UserTransaction trans = jotm.getUserTransaction(); try { trans.begin(); } catch (NotSupportedException e1) { logger.error("Exception", e1); } catch (SystemException e1) { logger.error("Exception", e1); } logger.info("Beginning multiple insert/connection single transaction..."); for (int i = 0; i < loops; i++) { Connection con = null; try { con = pool.getConnection(); } catch (SQLException e) { logger.error("Problems getting new connection - Test Failed!", e); return; } if (con == null) { logger.error("Pool returned null connection with no exception - Test Failed!"); return; } logger.debug("Got connection.. inserting #" + i); try { String sql = "INSERT INTO " + tableName + " VALUES(?,?,?,?)"; PreparedStatement ps = con.prepareStatement(sql); ps.setInt(1, ++counter); ps.setString(2, "conTest" + i); ps.setString(3, "Connection Test"); ps.setTimestamp(4, new Timestamp(new Date().getTime())); ps.executeUpdate(); ps.close(); } catch (Exception e) { e.printStackTrace(); try { trans.setRollbackOnly(); } catch (IllegalStateException e2) { logger.error("Exception", e2); } catch (SystemException e2) { logger.error("Exception", e2); } } finally { try { con.close(); } catch (SQLException e2) { logger.error("Exception", e2); } } } try { trans.commit(); } catch (Exception e) { logger.error("Exception", e); } } /** Tests a loop of inserts using same connection & transaction */ public void loopTest() { // start the transaction UserTransaction trans = jotm.getUserTransaction(); try { trans.begin(); } catch (NotSupportedException e1) { logger.error("Exception", e1); } catch (SystemException e1) { logger.error("Exception", e1); } logger.info("Beginning multiple insert single transaction/connection..."); Connection con = null; try { con = pool.getConnection(); } catch (SQLException e) { logger.error("Problems getting new connection - Test Failed!", e); return; } if (con == null) { logger.error("Pool returned null connection with no exception - Test Failed!"); return; } logger.debug("Got connection.. "); for (int i = 0; i < loops; i++) { logger.debug("[B] Looping.. inserting #" + i); try { String sql = "INSERT INTO " + tableName + " VALUES(?,?,?,?)"; PreparedStatement ps = con.prepareStatement(sql); ps.setInt(1, ++counter); ps.setString(2, "loopTest" + i); ps.setString(3, "Loop Test"); ps.setTimestamp(4, new Timestamp(new Date().getTime())); ps.executeUpdate(); ps.close(); } catch (Exception e) { logger.error("Exception", e); try { trans.setRollbackOnly(); } catch (IllegalStateException e2) { logger.error("Exception", e2); } catch (SystemException e2) { logger.error("Exception", e2); } } } // close the connection try { con.close(); } catch (SQLException e2) { logger.error("Exception", e2); } logger.debug("Closed connection.."); // commit the transaction try { trans.commit(); } catch (Exception e) { logger.error("Exception", e); } } /** Tests multiple inserts; suspending before each one, insert in new trans, resuming to continue */ public void suspendTest() { // start the transaction UserTransaction trans = jotm.getUserTransaction(); TransactionManager tm = jotm.getTransactionManager(); // set the timeout to something reasonable try { trans.setTransactionTimeout(300); } catch (SystemException e) { logger.error("Exception", e); return; } // begin the parent transaction try { trans.begin(); } catch (NotSupportedException e1) { logger.error("Exception", e1); } catch (SystemException e1) { logger.error("Exception", e1); } logger.info("Beginning multiple insert/connection on suspend main transaction..."); for (int i = 0; i < loops; i++) { // suspend the main transaction Transaction transaction = null; try { transaction = tm.suspend(); } catch (SystemException e2) { logger.error("Exception", e2); } logger.debug("Suspended #" + i); // begin a new transaction try { trans.begin(); } catch (NotSupportedException e3) { logger.error("Exception", e3); } catch (SystemException e3) { logger.error("Exception", e3); } logger.debug("Began new transaction."); // do some stuff in the new transaction Connection con1 = null; try { con1 = pool.getConnection(); } catch (SQLException e) { logger.error("Problems getting new (sub) connection - Test Failed!", e); return; } if (con1 == null) { logger.error("Pool returned null connection with no exception - Test Failed!"); return; } logger.debug("Got connection."); try { // insert item String sql1 = "INSERT INTO " + tableName + " VALUES(?,?,?,?)"; PreparedStatement ps1 = con1.prepareStatement(sql1); ps1.setInt(1, ++counter); ps1.setString(2, "susTest" + i); ps1.setString(3, "Suspend Test - Main Suspended"); ps1.setTimestamp(4, new Timestamp(new Date().getTime())); ps1.executeUpdate(); ps1.close(); } catch (Exception e) { logger.error("Exception", e); try { trans.setRollbackOnly(); } catch (IllegalStateException e4) { logger.error("Exception", e4); } catch (SystemException e4) { logger.error("Exception", e4); } } finally { try { con1.close(); } catch (SQLException e5) { logger.error("Exception", e5); } // commit the new transaction try { trans.commit(); } catch (SecurityException e4) { logger.error("Exception", e4); } catch (IllegalStateException e4) { logger.error("Exception", e4); } catch (RollbackException e4) { logger.error("Exception", e4); } catch (HeuristicMixedException e4) { logger.error("Exception", e4); } catch (HeuristicRollbackException e4) { logger.error("Exception", e4); } catch (SystemException e4) { logger.error("Exception", e4); } } logger.debug("Inserted record."); // resume the main transaction try { tm.resume(transaction); } catch (InvalidTransactionException e4) { logger.error("Exception", e4); } catch (IllegalStateException e4) { logger.error("Exception", e4); } catch (SystemException e4) { logger.error("Exception", e4); } logger.debug("Resumed #" + i); // do some stuff in the main transaction Connection con2 = null; try { con2 = pool.getConnection(); } catch (SQLException e) { logger.error("Problems getting new (main) connection - Test Failed!", e); return; } if (con2 == null) { logger.error("Pool returned null connection with no exception - Test Failed!"); return; } try { String sql = "INSERT INTO " + tableName + " VALUES(?,?,?,?)"; PreparedStatement ps = con2.prepareStatement(sql, 0, 0); ps.setInt(1, ++counter); ps.setString(2, "susTest" + i); ps.setString(3, "Suspend Test - Main"); ps.setTimestamp(4, new Timestamp(new Date().getTime())); ps.executeUpdate(); ps.close(); logger.debug("Inserted main transaction."); } catch (Exception e) { logger.error("Exception", e); try { trans.setRollbackOnly(); } catch (IllegalStateException e5) { logger.error("Exception", e5); } catch (SystemException e5) { logger.error("Exception", e5); } } finally { try { con2.close(); } catch (SQLException e5) { logger.error("Exception", e5); } } // get another connection Connection con3 = null; try { con3 = pool.getConnection(); } catch (SQLException e) { logger.error("Problems getting new (main select) connection - Test Failed!", e); return; } if (con3 == null) { logger.error("Pool returned null connection with no exception - Test Failed!"); return; } // now select it back try { String sql = "SELECT * FROM " + tableName + " WHERE idx_1 = ?"; PreparedStatement ps = con3.prepareStatement(sql); ps.setInt(1, counter); ResultSet res = ps.executeQuery(); if (res == null || !res.next()) { logger.error("Could not get inserted item back from select!"); } else { logger.debug(res.getString(1) + " : " + res.getString(2) + "[" + res.getString(3) + "] - " + res.getString(4)); } res.close(); ps.close(); } catch (Exception e) { logger.error("Exception", e); } finally { try { con3.close(); } catch (SQLException e2) { logger.error("Exception", e2); } } } // commit the main transaction - outside the loop try { trans.commit(); } catch (SecurityException e) { logger.error("Exception", e); } catch (IllegalStateException e) { logger.error("Exception", e); } catch (RollbackException e) { logger.error("Exception", e); } catch (HeuristicMixedException e) { logger.error("Exception", e); } catch (HeuristicRollbackException e) { logger.error("Exception", e); } catch (SystemException e) { logger.error("Exception", e); } } public void transactionTest() { UserTransaction trans = jotm.getUserTransaction(); Connection con = null; String sql = null; PreparedStatement ps = null; logger.info("Beginning transaction test..."); // insert a row - close connection - no transaction try { con = pool.getConnection(); sql = "INSERT INTO " + tableName + " VALUES(?,?,?,?)"; ps = con.prepareStatement(sql); ps.setInt(1, ++counter); ps.setString(2, "transTest"); ps.setString(3, "Transaction Test - This Should Be Updated!"); ps.setTimestamp(4, new Timestamp(new Date().getTime())); ps.executeUpdate(); ps.close(); con.close(); } catch (SQLException e) { logger.error("Transaction test failed on first insert", e); return; } // select the row - close connection - no transaction try { con = pool.getConnection(); sql = "SELECT * FROM " + tableName + " WHERE idx_1 = ?"; ps = con.prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); ps.setInt(1, counter); ResultSet res = ps.executeQuery(); if (!res.next()) { logger.error("Transaction test failed; no results returned from first insert"); return; } else { logger.debug(res.getString(1) + " : " + res.getString(2) + "[" + res.getString(3) + "] - " + res.getString(4)); } res.close(); ps.close(); con.close(); } catch (SQLException e) { logger.error("Transaction test failed; cannot select first insert", e); return; } // start the transaction try { trans.begin(); } catch (NotSupportedException e1) { logger.error("Exception", e1); return; } catch (SystemException e1) { logger.error("Exception", e1); return; } // update the row - close connection try { con = pool.getConnection(); sql = "UPDATE " + tableName + " SET col_3 = ? WHERE idx_1 = ?"; ps = con.prepareStatement(sql); ps.setString(1, "Transaction Test - First Update; One To Go!"); ps.setInt(2, counter); ps.executeUpdate(); ps.close(); con.close(); } catch (SQLException e) { logger.error("Transaction test failed; cannot do first update", e); return; } // select the row - close connection try { con = pool.getConnection(); sql = "SELECT * FROM " + tableName + " WHERE idx_1 = ?"; ps = con.prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); ps.setInt(1, counter); ResultSet res = ps.executeQuery(); if (!res.next()) { logger.error("Transaction test failed; no results returned after first update"); return; } else { logger.debug(res.getString(1) + " : " + res.getString(2) + "[" + res.getString(3) + "] - " + res.getString(4)); } res.close(); ps.close(); con.close(); } catch (SQLException e) { logger.error("Transaction test failed; cannot select first update", e); return; } // commit transaction try { trans.commit(); } catch (SystemException e) { logger.error("Exception", e); return; } catch (SecurityException e) { logger.error("Exception", e); return; } catch (IllegalStateException e) { logger.error("Exception", e); return; } catch (RollbackException re) { logger.error("Transaction rolledback!", re); return; } catch (HeuristicMixedException e) { logger.error("Exception", e); return; } catch (HeuristicRollbackException e) { logger.error("Exception", e); return; } // select row - close connection - no transaction try { con = pool.getConnection(); sql = "SELECT * FROM " + tableName + " WHERE idx_1 = ?"; ps = con.prepareStatement(sql); ps.setInt(1, counter); ResultSet res = ps.executeQuery(); if (!res.next()) { logger.error("Transaction test failed; no results returned from select after commit"); return; } res.close(); ps.close(); con.close(); } catch (SQLException e) { logger.error("Transaction test failed; cannot select after commit", e); return; } // start transaction try { trans.begin(); } catch (NotSupportedException e1) { logger.error("Exception", e1); return; } catch (SystemException e1) { logger.error("Exception", e1); return; } // update row - close connection try { con = pool.getConnection(); sql = "UPDATE " + tableName + " SET col_3 = ? WHERE idx_1 = ?"; ps = con.prepareStatement(sql); ps.setString(1, "Transaction Test - Second Update!"); ps.setInt(2, counter); ps.executeUpdate(); ps.close(); con.close(); } catch (SQLException e) { logger.error("Transaction test failed; cannot do second update", e); return; } // commit transaction try { trans.commit(); } catch (SystemException e) { logger.error("Exception", e); return; } catch (SecurityException e) { logger.error("Exception", e); return; } catch (IllegalStateException e) { logger.error("Exception", e); return; } catch (RollbackException re) { logger.error("Transaction rolledback!", re); return; } catch (HeuristicMixedException e) { logger.error("Exception", e); return; } catch (HeuristicRollbackException e) { logger.error("Exception", e); return; } } public void rollbackOnlyTest() { // start the transaction UserTransaction trans = jotm.getUserTransaction(); try { trans.begin(); } catch (NotSupportedException e1) { logger.error("Exception", e1); return; } catch (SystemException e1) { logger.error("Exception", e1); return; } logger.info("Beginning rollback test..."); Random rand = new Random(); int randomInt = rand.nextInt(9); for (int i = 0; i < 10; i++) { Connection con = null; try { con = pool.getConnection(); } catch (SQLException e) { logger.error("Problems getting connection - rolling back now.", e); try { trans.rollback(); } catch (IllegalStateException e2) { logger.error("Exception", e2); } catch (SecurityException e2) { logger.error("Exception", e2); } catch (SystemException e2) { logger.error("Exception", e2); } } if (con == null) { logger.error("Pool returned a null connection w/ no exception! Test Failed!"); return; } logger.debug("Got connection.. inserting #" + i); try { String sql = "INSERT INTO " + tableName + " VALUES(?,?,?,?)"; PreparedStatement ps = con.prepareStatement(sql); ps.setInt(1, ++counter); ps.setString(2, "rollTest" + i); ps.setString(3, "Rollback Test - This should not show in selectTest!"); ps.setTimestamp(4, new Timestamp(new Date().getTime())); ps.executeUpdate(); ps.close(); } catch (Exception e) { logger.error("Exception", e); try { trans.setRollbackOnly(); } catch (IllegalStateException e2) { logger.error("Exception", e2); } catch (SystemException e2) { logger.error("Exception", e2); } } finally { try { con.close(); } catch (SQLException e2) { logger.error("Exception", e2); } } // will set rollback only on some random pass if (randomInt == i) { logger.info("Setting rollback only on pass #" + i); try { trans.setRollbackOnly(); } catch (IllegalStateException e2) { logger.error("Exception", e2); } catch (SystemException e2) { logger.error("Exception", e2); } } } try { trans.commit(); } catch (SystemException e) { logger.error("Commit failed; RollbackException not thrown!", e); } catch (SecurityException e) { logger.error("Commit failed; RollbackException not thrown!", e); } catch (IllegalStateException e) { logger.error("Commit failed; RollbackException not thrown!", e); } catch (RollbackException re) { // This SHOULD happen! logger.info("Commit failed (good), transaction rolled back by commit()."); } catch (HeuristicMixedException e) { logger.error("Commit failed; RollbackException not thrown!", e); } catch (HeuristicRollbackException e) { logger.error("Commit failed; RollbackException not thrown!", e); } } public void timeoutTest() { // get the transaction UserTransaction trans = jotm.getUserTransaction(); logger.info("Beginning timeout test..."); Random rand = new Random(); int randomInt = rand.nextInt(60); randomInt++; logger.info("Setting timeout to: " + randomInt); try { trans.setTransactionTimeout(randomInt); // set to new value } catch (SystemException e) { logger.error("Exception", e); } // begin the transaction try { trans.begin(); } catch (NotSupportedException e1) { logger.error("Exception", e1); } catch (SystemException e1) { logger.error("Exception", e1); } logger.info("Began transaction; now waiting..."); // now wait a few seconds long wait = new Date().getTime() + ((randomInt + 2) * 1000); long now = 0; while ((now = new Date().getTime()) < wait) { //logger.info(now + " != " + wait); } // attempt to commit the transaction; should fail try { trans.commit(); logger.info("Transaction commited; shouldn't have happened!"); } catch (SecurityException e) { logger.error("Exception", e); } catch (IllegalStateException e) { logger.error("Exception", e); } catch (RollbackException e) { logger.info("RollBackException caught! Good! The transaction was rolled back."); } catch (HeuristicMixedException e) { logger.error("Exception", e); } catch (HeuristicRollbackException e) { logger.error("Exception", e); } catch (SystemException e) { logger.error("Exception", e); } } public void selectTest() throws SQLException { logger.info("Beginning select test.. We should have exactly " + (loops * 5) + " records."); Connection con = pool.getConnection(); Statement s = con.createStatement(); ResultSet res = s.executeQuery("SELECT * FROM " + tableName + " ORDER BY idx_1"); int rowCount = 0; while (res.next()) { rowCount++; logger.debug(res.getString(1) + " : " + res.getString(2) + "[" + res.getString(3) + "] - " + res.getString(4)); } res.close(); con.close(); logger.info("Total Rows: " + rowCount + " of " + (loops * 5)); if (rowCount == (loops * 5)) logger.info("Looks good..."); } public void close() { pool.shutdown(true); jotm.stop(); logger.info("Shutdown pool and jotm."); } public void runPreTests() { // try to drop the table try { dropTest(); } catch (SQLException e) { // ignore this; the table may not exist } // try to create the table try { createTest(); } catch (SQLException e) { logger.error("Fatal SQL Error", e); this.close(); System.exit(-1); } } public void runPostTests() { // show the results try { selectTest(); } catch (SQLException e) { logger.error("SQL Error", e); } // drop the table try { dropTest(); } catch (SQLException e) { logger.error("Fatal SQL Error", e); this.close(); System.exit(-1); } } public void runAllTests() { runPreTests(); // test some basic inserts (unique transactions/connections) insertTest(); // test connections (same connection) connectionTest(); // test looping (same connection/transaction) loopTest(); // test transactions transactionTest(); // test some suspend/resume inserts suspendTest(); // rollback only test rollbackOnlyTest(); // test transaction timeouts timeoutTest(); runPostTests(); } public static void main(String[] args) throws Exception { JotmXaPoolTest test = new JotmXaPoolTest(); test.runAllTests(); test.close(); System.exit(1); } }xapool-1.5.0-src/test/multithreaded/0000755000175000017500000000000010235646676017373 5ustar twernertwernerxapool-1.5.0-src/test/multithreaded/Connect.java0000644000175000017500000001607710235646676021642 0ustar twernertwernerimport java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Timestamp; import java.util.Properties; import javax.naming.Context; import javax.naming.InitialContext; import javax.sql.DataSource; import javax.transaction.RollbackException; import javax.transaction.Status; import javax.transaction.Transaction; import javax.transaction.TransactionManager; import javax.transaction.UserTransaction; import org.enhydra.jdbc.pool.StandardXAPoolDataSource; import org.enhydra.jdbc.standard.StandardXADataSource; import org.objectweb.jotm.Jotm; import org.objectweb.transaction.jta.TMService; /** * @author jule * * To change this generated comment edit the template variable "typecomment": * Window>Preferences>Java>Templates. * To enable and disable the creation of type comments go to * Window>Preferences>Java>Code Generation. */ public class Connect implements Runnable { String client; int nb; UserTransaction ut; String productlist; private static TMService jotm; private static TransactionManager tm; private Transaction t; private static StandardXAPoolDataSource spds1; private static StandardXAPoolDataSource spds2; /** * Constructor for ConnectOracle. */ public Connect(String s, String mydo, int index) { super(); client = mydo; nb = index; productlist = s; } private static synchronized void init() { String login = null; String password = null; String url = null; String driver = null; //init jotm try { if (jotm == null) jotm = new Jotm(true, false); if (tm == null) tm = jotm.getTransactionManager(); if (tm == null) { System.out.println("moniteur transactionel non initialis"); return; } // first, load the properties from the spy.properties file Properties prop = new Properties(); try { prop.load(ClassLoader.getSystemResourceAsStream("spy.properties")); } catch (Exception e) { System.err.println("problem to load properties."); e.printStackTrace(); System.exit(1); } login = prop.getProperty("login"); password = prop.getProperty("password"); url = prop.getProperty("url"); driver = prop.getProperty("driver"); //init xapool if (spds1 == null) { spds1 = new StandardXAPoolDataSource(4); spds1.setMaxSize(15); spds1.setMinSize(13); spds1.setUser(login); spds1.setPassword(password); StandardXADataSource xds1 = new StandardXADataSource(); xds1.setDriverName(driver); xds1.setUrl(url); xds1.setUser(login); xds1.setPassword(password); spds1.setTransactionManager(tm); spds1.setDataSource(xds1); } if (spds2 == null) { spds2 = new StandardXAPoolDataSource(4); spds2.setMaxSize(15); spds2.setMinSize(13); spds2.setUser(login); spds2.setPassword(password); StandardXADataSource xds2 = new StandardXADataSource(); xds2.setDriverName(driver); xds2.setUrl(url); xds2.setUser(login); xds2.setPassword(password); spds2.setTransactionManager(tm); spds2.setDataSource(xds2); } } catch (Exception e) { System.out.println("Problem jotm/xapool"); System.exit(0); } } public void run() { int res = 0; //NDC.push(Thread.currentThread().toString()); ut = jotm.getUserTransaction(); DataSource hds1 = null; PreparedStatement ps1 = null; Connection conn1 = null; PreparedStatement ps2b = null; Connection conn2b = null; DataSource hds2 = null; PreparedStatement ps2 = null; Connection conn2 = null; for (int tr = 0; tr < productlist.length(); tr++) { try { if (ut == null) throw new Exception("ut is null"); ut.begin(); // int size = 9; char[] cs = new char[size]; char c = productlist.charAt(tr); for (int l = 0; l < size; l++) cs[l] = c; String obj = String.valueOf(cs); String objs = Integer.toString(++nb); Timestamp dtcr = null; try { System.out.println("insert BASE1 "); hds1 = (DataSource) spds1; conn1 = hds1.getConnection(); dtcr = new Timestamp(System.currentTimeMillis()); ps1 = conn1.prepareStatement( "insert into hproduct (name,createdate,updatedate) VALUES (?,?,?)"); ps1.setString(1, obj); ps1.setTimestamp(2, dtcr); ps1.setTimestamp(3, dtcr); res = ps1.executeUpdate(); } catch (Exception e) { System.out.println( "pb insert BASE1: " + e.getClass() + ": " + e.getMessage()); ut.setRollbackOnly(); } finally { try { if (ps1 != null) ps1.close(); if (conn1 != null) conn1.close(); conn1 = null; } catch (SQLException sqle) { System.out.println( "close pb BASE1: " + sqle.getClass() + ": " + sqle.getMessage()); } } // try { System.out.println("insert BASE2 "); hds2 = (DataSource) spds2; conn2b = hds2.getConnection(); dtcr = new Timestamp(System.currentTimeMillis()); ps2b = conn2b.prepareStatement( "insert into horder (ordernum,customer,createdate,updatedate) VALUES (?,?,?,?)"); ps2b.setString(1, objs); ps2b.setString(2, client); ps2b.setTimestamp(3, dtcr); ps2b.setTimestamp(4, dtcr); res = ps2b.executeUpdate(); } catch (Exception e) { System.out.println( "pb insert BASE2: " + e.getClass() + ": " + e.getMessage()); ut.setRollbackOnly(); } finally { try { if (ps2b != null) ps2b.close(); if (conn2b != null) conn2b.close(); conn2b = null; } catch (SQLException sqle) { System.out.println( "close pb BASE2: " + sqle.getClass() + ": " + sqle.getMessage()); } } int stat = ut.getStatus(); if (stat == Status.STATUS_ACTIVE) { System.out.println( "##### ut commit " + obj + " " + objs + " " + client); ut.commit(); } else { System.out.println( "##### ut rollback " + obj + " " + objs + " " + client); ut.rollback(); } } catch (Exception e) { System.out.println( "UT termination: " + e.getClass() + ": " + e.getMessage()); try { if (!(e instanceof RollbackException)) { System.out.println("ut rollback..."); ut.rollback(); } } catch (Exception e1) { System.out.println( "rollback: " + e1.getClass() + ": " + e1.getMessage()); } } } } public static void main(String[] args) { init(); Connect co1 = new Connect("abcdefghijklmnopqrstuvwxyz", "leclerc", 1000); Connect co2 = new Connect("ABCDEFGHIJKLMNOPQRSTUVWXYa", "carrefour", 2000); Thread t1 = new Thread(co1); Thread t2 = new Thread(co2); t1.start(); t2.start(); try { t1.join(); t2.join(); } catch (InterruptedException ie) { } finally { System.exit(0); } } } xapool-1.5.0-src/test/multithreaded/README.txt0000644000175000017500000000276510235646676021103 0ustar twernertwerner# # # Multithreaded test # contribution from Nicolas JULE # Scenario: --------- Setup: ------ o A database: - MySQL - PostgreSQL Database Setup: --------------- The test expects: o a database named javatest o a user of login "mojo" and password "jojo" o tables are in bases.sql files Database configuration are stored in properties file (spy.properties) which contains the following properties: o realdriver - Name of the JDBC driver o url - URL to connect to the data base Compilation: ------------ Go to output/dist/test/multithreaded Type $ ant compile to compile the test Run the test: ---------------- o To run the test, first check that only RMI protocol will be activated (in the ../../config/carol.properties, carol.rmi.activated should be set to jrmp); then type $ rmiregistry -J-classpath -Jjotm.jar:jotm_jrmp_stubs.jar -J-Djava.security.policy=../config/java.policy & to start a RMI registry on default port (i.e. 1099). o Set the classpath $ export CLASSPATH=../../lib/ow_util_log_wrp_log4j.jar:../../lib/jta-spec1_0_1.jar:../../lib/jotm.jar:../../lib/jotm_jrmp_stubs.jar:../../config:.:../../lib/xapool.jar:.:../../lib/commons-logging.jar:../../lib/commons-logging-api.jar:../../lib/p6spy.jar:../../lib/connector-1_5.jar:../../lib/howl.jar:$JDBC_JARS where JDBC_JARS is the location of the JDBC driver jar file(s) you want to use. o Modify ../../config/spy.properties to setup your jdbc properties o Start the test $ java Connect Usage: ------ $ java Connect Enjoy! xapool-1.5.0-src/test/multithreaded/bases.sql0000644000175000017500000000052410235646676021212 0ustar twernertwernercreate table hproduct("NAME" CHAR(10) NOT NULL , "CREATEDATE" TIMESTAMP NOT NULL , "UPDATEDATE" TIMESTAMP NOT NULL ); create table horder("ORDERNUM" CHAR(10) NOT NULL , "CUSTOMER" CHAR(10) NOT NULL , "CREATEDATE" TIMESTAMP NOT NULL , "UPDATEDATE" TIMESTAMP NOT NULL ); xapool-1.5.0-src/test/multithreaded/build.xml0000644000175000017500000000154610235646676021222 0ustar twernertwerner xapool-1.5.0-src/test/testsuite/0000755000175000017500000000000010235646676016571 5ustar twernertwernerxapool-1.5.0-src/test/testsuite/build.xml0000644000175000017500000000414110235646676020412 0ustar twernertwerner xapool-1.5.0-src/test/testsuite/XAPoolTestSuite.java0000644000175000017500000012307210235646676022455 0ustar twernertwerner import junit.framework.Assert; import java.sql.PreparedStatement; import java.util.Map; import java.util.List; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.sql.Connection; import java.sql.ResultSet; import org.enhydra.jdbc.standard.StandardXAConnectionHandle; /** * This object does not contains TestCase from Junit, but only * tests from XAPool. All tests begin with test... * Please see setUp and tearDown from XAPoolTestCase to take a * look to the initialisation of the database (XA) and JOTM */ public class XAPoolTestSuite extends XAPoolTestCase { public XAPoolTestSuite(String strTestName) { super(strTestName); } public void testSimpleStatementCommit() throws Exception { int newValue = 54; String completion = "commit"; System.out.println("SimpleStatementCommit: begin, getConnection, executeUpdate, VERIFY, closeAll, commit, getConnection, VERIFY, close"); try { utx.begin(); conn = spds.getConnection(login, password); PreparedStatement pstmt = conn.prepareStatement(SQL_QUERY); pstmt.setInt(1, newValue); pstmt.executeUpdate(); Assert.assertTrue("executeUpdate with "+newValue+" does not work", getValue() == 54); pstmt.close(); conn.close(); utx.commit(); } catch (Exception e) { System.err.println("Exception of type :" + e.getClass().getName() + " has been thrown"); System.err.println("Exception message :" + e.getMessage()); e.printStackTrace(); throw e; } conn = spds.getConnection(login, password); Assert.assertTrue("after commit with "+newValue+" does not work", getValue() == 54); conn.close(); } public void testSimpleStatementRollback() throws Exception { int newValue = 12; String completion = "rollback"; System.out.println("SimpleStatementRollback: begin, getConnection, executeUpdate, VERIFY, closeAll, rollback, getConnection, VERIFY, close"); try { utx.begin(); conn = spds.getConnection(login, password); PreparedStatement pstmt = conn.prepareStatement(SQL_QUERY); pstmt.setInt(1, newValue); pstmt.executeUpdate(); Assert.assertTrue("executeUpdate with "+newValue+" does not work", getValue() == 12); pstmt.close(); conn.close(); utx.rollback(); } catch (Exception e) { System.err.println("Exception of type :" + e.getClass().getName() + " has been thrown"); System.err.println("Exception message :" + e.getMessage()); e.printStackTrace(); throw e; } conn = spds.getConnection(login, password); Assert.assertTrue("after rollback with "+newValue+" does not work", getValue() == 54); conn.close(); } public void testSaveAutoCommitTrue() throws Exception { int newValue = 12; System.out.println("SaveAutoCommitTrue: getConnection, setAutoCommit(true), begin, executeUpdate, rollback, VERIFY, closeAll"); try { conn = spds.getConnection(login, password); boolean autocom = true; conn.setAutoCommit(autocom); utx.begin(); PreparedStatement pstmt = conn.prepareStatement(SQL_QUERY); pstmt.setInt(1, newValue); pstmt.executeUpdate(); utx.rollback(); Assert.assertTrue("Saveautocommit with TRUE does not work", conn.getAutoCommit() == autocom); pstmt.close(); conn.close(); } catch (Exception e) { System.out.println("Exception of type :" + e.getClass().getName() + " has been thrown"); System.out.println("Exception message :" + e.getMessage()); e.printStackTrace(); throw e; } } public void testSaveAutoCommitFalse() throws Exception{ int newValue = 12; System.out.println("SaveAutoCommitFalse: getConnection, setAutoCommit(false), begin, executeUpdate, rollback, VERIFY, closeAll"); try { conn = spds.getConnection(login, password); boolean autocom = false; conn.setAutoCommit(autocom); utx.begin(); PreparedStatement pstmt = conn.prepareStatement(SQL_QUERY); pstmt.setInt(1, newValue); pstmt.executeUpdate(); utx.rollback(); Assert.assertTrue("Saveautocommit with FALSE does not work", conn.getAutoCommit() == autocom); pstmt.close(); conn.close(); } catch (Exception e) { System.out.println("Exception of type :" + e.getClass().getName() + " has been thrown"); System.out.println("Exception message :" + e.getMessage()); e.printStackTrace(); throw e; } } public void testMultipleConnectionCommit() throws Exception { int newValue = 66; System.out.println("MultipleConnectionCommit: begin, getConnection, executeUpdate, VERIFY, closeAll, getConnection, executeUpdate, VERIFY, closeAll, commit, getConnection, VERIFY, close"); try { utx.begin(); conn = spds.getConnection(login, password); PreparedStatement pstmt = conn.prepareStatement(SQL_QUERY); pstmt.setInt(1, newValue); pstmt.executeUpdate(); Assert.assertTrue("executeUpdate with "+(newValue)+" does not work", getValue() == 66); pstmt.close(); conn.close(); conn = spds.getConnection(login, password); PreparedStatement pstmt2 = conn.prepareStatement(SQL_QUERY); pstmt2.setInt(1, newValue+2); pstmt2.executeUpdate(); Assert.assertTrue("executeUpdate with "+(newValue+2)+" does not work", getValue() == 68); pstmt2.close(); conn.close(); utx.commit(); } catch (Exception e) { System.err.println("Exception of type :" + e.getClass().getName() + " has been thrown"); System.err.println("Exception message :" + e.getMessage()); e.printStackTrace(); throw e; } conn = spds.getConnection(login, password); Assert.assertTrue("after commit with "+(newValue+2)+" does not work", getValue() == 68); conn.close(); } public void testMultipleConnectionRollback() throws Exception { int newValue = 900; System.out.println("MultipleConnectionCommit: begin, getConnection, executeUpdate, VERIFY, closeAll, getConnection, executeUpdate, VERIFY, closeAll, rollback, getConnection, VERIFY, close"); try { utx.begin(); conn = spds.getConnection(login, password); PreparedStatement pstmt = conn.prepareStatement(SQL_QUERY); pstmt.setInt(1, newValue); pstmt.executeUpdate(); Assert.assertTrue("executeUpdate with "+(newValue)+" does not work", getValue() == 900); pstmt.close(); conn.close(); conn = spds.getConnection(login, password); PreparedStatement pstmt2 = conn.prepareStatement(SQL_QUERY); pstmt2.setInt(1, newValue+2); pstmt2.executeUpdate(); Assert.assertTrue("executeUpdate with "+(newValue+2)+" does not work", getValue() == 902); pstmt2.close(); conn.close(); utx.rollback(); // ***** ROLLBACK ****** } catch (Exception e) { System.err.println("Exception of type :" + e.getClass().getName() + " has been thrown"); System.err.println("Exception message :" + e.getMessage()); e.printStackTrace(); throw e; } conn = spds.getConnection(login, password); Assert.assertTrue("after rollback with "+(newValue+2)+" does not work", getValue() == 68); conn.close(); } public void testMultipleTransaction() throws Exception { System.out.println("MultipleTransaction: getConnection, begin, executeUpdate, VERIFY, commit, VERIFY, begin, executeUpdate, VERIFY, rollback, VERIFY, close"); try { conn = spds.getConnection(login, password); } catch(Exception e) { System.out.println("problem"); if (conn == null) { System.out.println("the connection is null"); // do some work } else { System.out.println("the connection is not null"); // do some work } } int newValue = 44; try { utx.begin(); PreparedStatement pstmt0 = conn.prepareStatement(SQL_QUERY); pstmt0.setInt(1, 13); pstmt0.executeUpdate(); pstmt0.close(); Assert.assertTrue("executeUpdate with 13 does not work", getValue() == 13); utx.commit(); Assert.assertTrue("after commit with 13 does not work", getValue() == 13); utx.begin(); PreparedStatement pstmt = conn.prepareStatement(SQL_QUERY); pstmt.setInt(1, newValue); pstmt.executeUpdate(); pstmt.close(); Assert.assertTrue("executeUpdate with "+newValue+" does not work", getValue() == 44); utx.rollback(); Assert.assertTrue("after rollback with "+newValue+" does not work", getValue() == 13); } catch (Exception e) { System.err.println("Exception of type :" + e.getClass().getName() + " has been thrown"); System.err.println("Exception message :" + e.getMessage()); e.printStackTrace(); throw e; } conn.close(); } public void testPotentialDeadLock() throws Exception { System.out.println("PotentialDeadLock: begin, getConnection, executeUpdate, VERIFY, pclose, VERIFY, close, VERIFY, commit, VERIFY"); int newValue = 44; try { utx.begin(); conn = spds.getConnection(login, password); PreparedStatement pstmt0 = conn.prepareStatement(SQL_QUERY); pstmt0.setInt(1, 133); pstmt0.executeUpdate(); Assert.assertTrue("executeUpdate with 133 does not work", getValue() == 133); pstmt0.close(); Assert.assertTrue("after stmt.close: executeUpdate with 133 does not work", getValue() == 133); conn.close(); Assert.assertTrue("after con.close: executeUpdate with 133 does not work (value is "+getValue()+") ", getValue() == 133); utx.commit(); Assert.assertTrue("after commit with 133 does not work", getValue() == 133); } catch (Exception e) { System.err.println("Exception of type :" + e.getClass().getName() + " has been thrown"); System.err.println("Exception message :" + e.getMessage()); e.printStackTrace(); throw e; } } public void testMiroRequestConnectionCountInTransaction() throws Exception { StandardXAConnectionHandle tempCon = null; StringBuffer sbBuffer = new StringBuffer(); String strCon; PreparedStatement insertStatement = null;; Map mpReturnPatternMap = new HashMap(); Map mpConnections = new HashMap(); Map mpUsedConnections = new HashMap(); List lstConnections = new ArrayList(); int iTable1Index = 0; int iInsertCount; System.out.println("RequestConnectionCountInTransaction: Request multiple connections in one transactions over and over and see if they will be returned in the same order."); try { try { utx.begin(); for (int iIndex = 0; iIndex < 10; iIndex++) { try { sbBuffer.delete(0, sbBuffer.length()); for (int iCon = 0; iCon < 4; iCon++) { conn = spds.getConnection(); Assert.assertTrue("XAPool no longer returns instance" + " of StandardXAConnectionHandle", conn instanceof StandardXAConnectionHandle); tempCon = (StandardXAConnectionHandle)conn; strCon = tempCon.con.toString(); sbBuffer.append(strCon); sbBuffer.append("::"); lstConnections.add(conn); mpConnections.put(strCon, strCon); try { insertStatement = conn.prepareStatement(SQL_QUERY); insertStatement.setInt(1, iTable1Index++); iInsertCount = insertStatement.executeUpdate(); Assert.assertEquals("One record should have been inserted.", 1, iInsertCount); } finally { insertStatement.close(); insertStatement = null; } tempCon = (StandardXAConnectionHandle)conn; strCon = tempCon.con.toString(); mpUsedConnections.put(strCon, strCon); } mpReturnPatternMap.put(sbBuffer.toString(), sbBuffer.toString()); } finally { for (int iCon = 0; iCon < 4; iCon++) { ((Connection)lstConnections.remove(0)).close(); } } } /* System.out.println("Total allocated connections = "+ mpConnections.size()); System.out.println("Total used connections = " + mpUsedConnections.size()); System.out.println("Connections return pattern count = " + mpReturnPatternMap.size()); for (Iterator itrElements = mpReturnPatternMap.values().iterator(); itrElements.hasNext();) { System.out.println(itrElements.next().toString()); } */ Assert.assertEquals("More than expected number of connections were used.", 4, mpUsedConnections.size()); Assert.assertEquals("More than expected number of connections were allocated.", 4, mpConnections.size()); utx.commit(); } catch (Throwable throwable) { utx.rollback(); } } finally { /* PreparedStatement deleteStatement = null; utx.begin(); try { try { deleteStatement = m_connection.prepareStatement(DELETE_ALL1); int iDeleteCount = DatabaseUtils.executeUpdateAndClose(deleteStatement); } finally { DatabaseUtils.closeStatement(deleteStatement); deleteStatement = null; } utx.commit(); } catch (Throwable throwable) { utx.rollback(); } */ } } public void testMiroRequestConnectionCountOutOfTransaction() throws Exception { Connection con = null; StandardXAConnectionHandle tempCon; String strCon; int iInsertCount; PreparedStatement insertStatement = null;; Map mpReturnPatternMap = new HashMap(); Map mpConnections = new HashMap(); Map mpUsedConnections = new HashMap(); List lstConnections = new ArrayList(); int iTable1Index = 0; int iIndex; int iCon; StringBuffer sbBuffer = new StringBuffer(); System.out.println("RequestConnectionCountOutOfTransaction: Request multiple connections outside of transactions over and over and see if they will be returned in the same order."); try { for (iIndex = 0; iIndex < 10; iIndex++) { try { sbBuffer.delete(0, sbBuffer.length()); for (iCon = 0; iCon < 4; iCon++) { conn = spds.getConnection(); Assert.assertTrue("XAPool no longer returns instance" + " of StandardXAConnectionHandle", conn instanceof StandardXAConnectionHandle); tempCon = (StandardXAConnectionHandle)conn; strCon = tempCon.con.toString(); sbBuffer.append(strCon); sbBuffer.append("::"); lstConnections.add(conn); mpConnections.put(strCon, strCon); try { insertStatement = conn.prepareStatement(SQL_QUERY); insertStatement.setInt(1, iTable1Index++); iInsertCount = insertStatement.executeUpdate(); Assert.assertEquals("One record should have been inserted.", 1, iInsertCount); } finally { insertStatement.close(); insertStatement = null; } tempCon = (StandardXAConnectionHandle)conn; strCon = tempCon.con.toString(); mpUsedConnections.put(strCon, strCon); // DOn't commit immidiately, commit later so we can simmulate // the jotm transaction behaviour } mpReturnPatternMap.put(sbBuffer.toString(), sbBuffer.toString()); } finally { for (iCon = 0; iCon < 4; iCon++) { try { conn = (Connection)lstConnections.remove(0); } catch (Throwable thr) { } finally { conn.close(); con = null; } } } } /* Log.getInstance().info("testRequestConnectionCountOutOfTransaction ====="); Log.getInstance().info("Total allocated connections = " + mpConnections.size()); Log.getInstance().info("Total used connections = " + mpUsedConnections.size()); Log.getInstance().info("Connections return pattern count = " + mpReturnPatternMap.size()); for (Iterator itrElements = mpReturnPatternMap.values().iterator(); itrElements.hasNext();) { Log.getInstance().info(itrElements.next().toString()); } */ Assert.assertEquals("More than expected number of connections were used.", 4, mpUsedConnections.size()); Assert.assertEquals("More than expected number of connections were allocated.", 4, mpConnections.size()); // Assert.assertEquals("Connections were not returned always in the same order.", // 1, mpReturnPatternMap.size()); } finally { /* PreparedStatement deleteStatement = null; m_transaction.begin(); try { try { deleteStatement = m_connection.prepareStatement(DELETE_ALL1); int iDeleteCount = DatabaseUtils.executeUpdateAndClose(deleteStatement); } finally { DatabaseUtils.closeStatement(deleteStatement); deleteStatement = null; } m_transaction.commit(); } catch (Throwable throwable) { m_transaction.rollback(); throw throwable; } */ } } public void testMiroRepeatedRequestConnectionInTransaction() throws Throwable { System.out.println("RepeatedRequestConnectionInTransaction: Request one connection over and over in one transactions and see if the same connection will be returned."); try { // Just get connections and return try { StandardXAConnectionHandle tempCon; String strCon; int iInsertCount; PreparedStatement insertStatement = null;; int iTable1Index = 0; int iIndex; int iConChange = 0; String strLastCon = null; Map mpConnections = new HashMap(); utx.begin(); for (iIndex = 0; iIndex < 10; iIndex++) { try { conn = spds.getConnection(); Assert.assertTrue("XAPool no longer returns instance" + " of StandardXAConnectionHandle", conn instanceof StandardXAConnectionHandle); tempCon = (StandardXAConnectionHandle)conn; strCon = tempCon.con.toString(); if (strLastCon == null) { strLastCon = strCon; } else { if (!strCon.equals(strLastCon)) { // The connection has changed, count how many times // it has changed strLastCon = strCon; iConChange++; } } mpConnections.put(strCon, strCon); // Don't do anything here, just get and return } finally { conn.close(); conn = null; } } /* Log.getInstance().info("testRepeatedRequestConnectionInTransaction ====="); for (Iterator itrElements = mpConnections.values().iterator(); itrElements.hasNext();) { Log.getInstance().info(itrElements.next().toString()); } Log.getInstance().info("Total allocated connections = " + mpConnections.size()); Log.getInstance().info("How many times pool returned different connection = " + iConChange); */ Assert.assertEquals("More than expected number of connections were allocated.", 1, mpConnections.size()); utx.commit(); } catch (Throwable throwable) { utx.rollback(); throw throwable; } } finally { /* PreparedStatement deleteStatement = null; m_transaction.begin(); try { try { deleteStatement = m_connection.prepareStatement(DELETE_ALL1); int iDeleteCount = DatabaseUtils.executeUpdateAndClose(deleteStatement); } finally { DatabaseUtils.closeStatement(deleteStatement); deleteStatement = null; } m_transaction.commit(); } catch (Throwable throwable) { m_transaction.rollback(); throw throwable; } */ } } public void testMiroRepeatedRequestConnectionWithSelectInTransaction() throws Throwable { System.out.println("RepeatedRequestConnectionWithSelectInTransaction: Request one connection over and over in one transactions and do select and then see if the same connection will be returned and used"); try { // Get connection, select and return try { StandardXAConnectionHandle tempCon; String strCon; PreparedStatement selectStatement = null; int iTable1Index = 0; int iIndex; int iConChange = 0; String strLastCon = null; ResultSet rsResults = null; Map mpConnections = new HashMap(); Map mpUsedConnections = new HashMap(); utx.begin(); for (iIndex = 0; iIndex < 10; iIndex++) { try { conn = spds.getConnection(); Assert.assertTrue("XAPool no longer returns instance" + " of StandardXAConnectionHandle", conn instanceof StandardXAConnectionHandle); tempCon = (StandardXAConnectionHandle)conn; strCon = tempCon.con.toString(); if (strLastCon == null) { strLastCon = strCon; } else { if (!strCon.equals(strLastCon)) { // The connection has changed, count how many times // it has changed strLastCon = strCon; iConChange++; } } mpConnections.put(strCon, strCon); // Now try to select using this connection try { selectStatement = conn.prepareStatement(SQL_REQUEST); rsResults = selectStatement.executeQuery(); rsResults.close(); } finally { selectStatement.close(); rsResults = null; selectStatement = null; } tempCon = (StandardXAConnectionHandle)conn; strCon = tempCon.con.toString(); mpUsedConnections.put(strCon, strCon); } finally { conn.close(); conn = null; } } /* Log.getInstance().info("testRepeatedRequestConnectionInTransaction ====="); Log.getInstance().info("Total allocated connections when selecting = " + mpConnections.size()); for (Iterator itrElements = mpConnections.values().iterator(); itrElements.hasNext();) { Log.getInstance().info(itrElements.next().toString()); } Log.getInstance().info("Total used connections when selecting = " + mpUsedConnections.size()); for (Iterator itrElements = mpUsedConnections.values().iterator(); itrElements.hasNext();) { Log.getInstance().info(itrElements.next().toString()); } Log.getInstance().info("How many times pool returned different connection" + " when selecting = " + iConChange); */ Assert.assertEquals("More than expected number of connections were used" + " when selecting.", 1, mpUsedConnections.size()); // This really doesn't mean anything, two connections were taken from the pool // but only 1 was used so that should be OK // Assert.assertEquals("More than expected number of connections were allocated" + // " when selecting.", 1, mpConnections.size()); utx.commit(); } catch (Throwable throwable) { utx.rollback(); throw throwable; } } finally { /* PreparedStatement deleteStatement = null; m_transaction.begin(); try { try { deleteStatement = m_connection.prepareStatement(DELETE_ALL1); int iDeleteCount = DatabaseUtils.executeUpdateAndClose(deleteStatement); } finally { DatabaseUtils.closeStatement(deleteStatement); deleteStatement = null; } m_transaction.commit(); } catch (Throwable throwable) { m_transaction.rollback(); throw throwable; } */ } } public void testMiroRepeatedRequestConnectionWithSelectOutOfTransaction() throws Throwable { System.out.println("RepeatedRequestConnectionWithSelectOutOfTransaction: Request one connection over and over without transactions and do select and then see if the same connection will be returned and used"); try { StandardXAConnectionHandle tempCon; String strCon; PreparedStatement selectStatement = null;; int iTable1Index = 0; int iIndex; int iConChange = 0; String strLastCon = null; ResultSet rsResults = null; Map mpConnections = new HashMap(); Map mpUsedConnections = new HashMap(); for (iIndex = 0; iIndex < 10; iIndex++) { try { conn = spds.getConnection(); Assert.assertTrue("XAPool no longer returns instance" + " of StandardXAConnectionHandle", conn instanceof StandardXAConnectionHandle); tempCon = (StandardXAConnectionHandle)conn; strCon = tempCon.con.toString(); if (strLastCon == null) { strLastCon = strCon; } else { if (!strCon.equals(strLastCon)) { // The connection has changed, count how many times // it has changed strLastCon = strCon; iConChange++; } } mpConnections.put(strCon, strCon); // Now try to select using this connection try { selectStatement = conn.prepareStatement(SQL_REQUEST); rsResults = selectStatement.executeQuery(); rsResults.close(); } finally { selectStatement.close(); rsResults = null; selectStatement = null; } tempCon = (StandardXAConnectionHandle)conn; strCon = tempCon.con.toString(); mpUsedConnections.put(strCon, strCon); } finally { conn.close(); conn = null; } } /* Log.getInstance().info("testRepeatedRequestConnectionWithSelectOutOfTransaction ====="); Log.getInstance().info("Total allocated connections when selecting = " + mpConnections.size()); for (Iterator itrElements = mpConnections.values().iterator(); itrElements.hasNext();) { Log.getInstance().info(itrElements.next().toString()); } Log.getInstance().info("Total used connections when selecting = " + mpUsedConnections.size()); for (Iterator itrElements = mpUsedConnections.values().iterator(); itrElements.hasNext();) { Log.getInstance().info(itrElements.next().toString()); } Log.getInstance().info("How many times pool returned different connection" + " when selecting = " + iConChange); */ Assert.assertEquals("More than expected number of connections were used" + " when selecting.", 1, mpUsedConnections.size()); Assert.assertEquals("More than expected number of connections were allocated" + " when selecting.", 1, mpConnections.size()); } finally { /* PreparedStatement deleteStatement = null; m_transaction.begin(); try { try { deleteStatement = m_connection.prepareStatement(DELETE_ALL1); int iDeleteCount = DatabaseUtils.executeUpdateAndClose(deleteStatement); } finally { DatabaseUtils.closeStatement(deleteStatement); deleteStatement = null; } m_transaction.commit(); } catch (Throwable throwable) { m_transaction.rollback(); throw throwable; } */ } } public void testMiroRepeatedRequestConnectionWithInsertInTransaction() throws Throwable { System.out.println("RepeatedRequestConnectionWithInsertInTransaction: Request one connection over and over in one transactions and do insert and then see if the same connection will be returned and used"); try { try { StandardXAConnectionHandle tempCon; String strCon; int iInsertCount; PreparedStatement insertStatement = null;; int iTable1Index = 0; int iIndex; int iConChange = 0; String strLastCon = null; Map mpConnections = new HashMap(); Map mpUsedConnections = new HashMap(); utx.begin(); for (iIndex = 0; iIndex < 10; iIndex++) { try { conn = spds.getConnection(); Assert.assertTrue("XAPool no longer returns instance" + " of StandardXAConnectionHandle", conn instanceof StandardXAConnectionHandle); tempCon = (StandardXAConnectionHandle)conn; strCon = tempCon.con.toString(); if (strLastCon == null) { strLastCon = strCon; } else { if (!strCon.equals(strLastCon)) { // The connection has changed, count how many times // it has changed strLastCon = strCon; iConChange++; } } mpConnections.put(strCon, strCon); // Now try to insert using this connection try { insertStatement = conn.prepareStatement(SQL_QUERY); insertStatement.setInt(1, iTable1Index++); iInsertCount = insertStatement.executeUpdate(); Assert.assertEquals("One record should have been inserted.", 1, iInsertCount); } finally { insertStatement.close(); insertStatement = null; } tempCon = (StandardXAConnectionHandle)conn; strCon = tempCon.con.toString(); mpUsedConnections.put(strCon, strCon); } finally { conn.close(); conn = null; } } /* Log.getInstance().info("testRepeatedRequestConnectionWithInsertInTransaction ====="); Log.getInstance().info("Total allocated connections when inserting = " + mpConnections.size()); for (Iterator itrElements = mpConnections.values().iterator(); itrElements.hasNext();) { Log.getInstance().info(itrElements.next().toString()); } Log.getInstance().info("Total used connections when inserting = " + mpUsedConnections.size()); for (Iterator itrElements = mpUsedConnections.values().iterator(); itrElements.hasNext();) { Log.getInstance().info(itrElements.next().toString()); } Log.getInstance().info("How many times pool returned different connection" + " when inserting = " + iConChange); */ Assert.assertEquals("More than expected number of connections were used" + " when inserting.", 1, mpUsedConnections.size()); // This really doesn't mean anything, two connections were taken from the pool // but only 1 was used so that should be OK // Assert.assertEquals("More than expected number of connections were allocated" + // " when inserting.", 1, mpConnections.size()); utx.commit(); } catch (Throwable throwable) { utx.rollback(); throw throwable; } } finally { /* PreparedStatement deleteStatement = null; m_transaction.begin(); try { try { deleteStatement = m_connection.prepareStatement(DELETE_ALL1); int iDeleteCount = DatabaseUtils.executeUpdateAndClose(deleteStatement); } finally { DatabaseUtils.closeStatement(deleteStatement); deleteStatement = null; } m_transaction.commit(); } catch (Throwable throwable) { m_transaction.rollback(); throw throwable; } */ } } public void testMiroInsertSelectInTransaction() throws Throwable { System.out.println("InsertSelectInTransaction: We try to simulate situation, when xapool returns different connections for first and second request inside of the same transaction and see if it affects functionality."); try { Map mpConnections = new HashMap(); Map mpUsedConnections = new HashMap(); int iConChange = 0; try { StandardXAConnectionHandle tempCon; String strCon; int iInsertCount; PreparedStatement insertStatement = null; PreparedStatement selectStatement = null; ResultSet rsResults = null; int iTable1Index = 0; int iIndex; String strLastCon = null; utx.begin(); try { conn = spds.getConnection(); Assert.assertTrue("XAPool no longer returns instance" + " of StandardXAConnectionHandle", conn instanceof StandardXAConnectionHandle); tempCon = (StandardXAConnectionHandle)conn; strCon = tempCon.con.toString(); if (strLastCon == null) { strLastCon = strCon; } else { if (!strCon.equals(strLastCon)) { // The connection has changed, count how many times // it has changed strLastCon = strCon; iConChange++; } } mpConnections.put(strCon, strCon); // Now try to insert using this connection try { insertStatement = conn.prepareStatement(SQL_QUERY); insertStatement.setInt(1, iTable1Index++); iInsertCount = insertStatement.executeUpdate(); Assert.assertEquals("One record should have been inserted.", 1, iInsertCount); } finally { insertStatement.close(); insertStatement = null; } tempCon = (StandardXAConnectionHandle)conn; strCon = tempCon.con.toString(); mpUsedConnections.put(strCon, strCon); } finally { conn.close(); conn = null; } try { conn = spds.getConnection(); Assert.assertTrue("XAPool no longer returns instance" + " of StandardXAConnectionHandle", conn instanceof StandardXAConnectionHandle); tempCon = (StandardXAConnectionHandle)conn; strCon = tempCon.con.toString(); if (strLastCon == null) { strLastCon = strCon; } else { if (!strCon.equals(strLastCon)) { // The connection has changed, count how many times // it has changed strLastCon = strCon; iConChange++; } } mpConnections.put(strCon, strCon); // Now try to select using this connection try { selectStatement = conn.prepareStatement(SQL_REQUEST); rsResults = selectStatement.executeQuery(); Assert.assertTrue("Select didn't find inserted record in the database.", rsResults.next()); } finally { rsResults.close(); selectStatement.close(); rsResults = null; selectStatement = null; } tempCon = (StandardXAConnectionHandle)conn; strCon = tempCon.con.toString(); mpUsedConnections.put(strCon, strCon); } finally { conn.close(); conn = null; } utx.commit(); } catch (Throwable throwable) { utx.rollback(); throw throwable; } /* Log.getInstance().info("testInsertSelectInTransaction ====="); Log.getInstance().info("Total allocated connections when insert/select = " + mpConnections.size()); for (Iterator itrElements = mpConnections.values().iterator(); itrElements.hasNext();) { Log.getInstance().info(itrElements.next().toString()); } Log.getInstance().info("Total used connections when insert/select = " + mpUsedConnections.size()); for (Iterator itrElements = mpUsedConnections.values().iterator(); itrElements.hasNext();) { Log.getInstance().info(itrElements.next().toString()); } Log.getInstance().info("How many times pool returned different connection" + " when insert/select = " + iConChange); */ Assert.assertEquals("More than expected number of connections were used" + " when insert/select.", 1, mpUsedConnections.size()); // This really doesn't mean anything, two connections were taken from the pool // but only 1 was used so that should be OK // Assert.assertEquals("More than expected number of connections were allocated" + // " when insert/select.", 1, mpConnections.size()); } finally { /* PreparedStatement deleteStatement = null; m_transaction.begin(); try { try { deleteStatement = m_connection.prepareStatement(DELETE_ALL1); int iDeleteCount = DatabaseUtils.executeUpdateAndClose(deleteStatement); } finally { DatabaseUtils.closeStatement(deleteStatement); deleteStatement = null; } m_transaction.commit(); } catch (Throwable throwable) { m_transaction.rollback(); throw throwable; } */ } } public void testMiroEmptyRequestReturnConnection() throws Throwable { System.out.println("EmptyRequestReturnConnection: This test triggers bug in out modified XAPool 1.3.1 which doesn't occur with latest the original XAPool or the latest XAPool."); Connection con1 = null; Connection con2 = null; StandardXAConnectionHandle tempCon; String strCon1; String strCon2; int iInsertCount; PreparedStatement insertStatement = null;; PreparedStatement selectStatement = null;; ResultSet rsResults = null; try { try { utx.begin(); final int VALUE_TEST_1 = 0; Map mpConnectionMap = new HashMap(); // Request a connection insert a record and return it to the pool try { con1 = spds.getConnection(); Assert.assertTrue("XAPool no longer returns instance of StandardXAConnectionHandle", con1 instanceof StandardXAConnectionHandle); tempCon = (StandardXAConnectionHandle)con1; strCon1 = tempCon.con.toString(); mpConnectionMap.put(strCon1, new Integer(0)); // Inserted record 0 insertStatement = con1.prepareStatement(SQL_QUERY); insertStatement.setInt(1, VALUE_TEST_1); iInsertCount = insertStatement.executeUpdate(); Assert.assertEquals("One record should have been inserted.", 1, iInsertCount); } finally { insertStatement.close(); insertStatement = null; con1.close(); con1 = null; } boolean bDetectedTheSame = false; int iIndex; // Now request a connection from the pool, if it is a connection which // was already requested before, just return it to the pool. // ----------------------------------------------------------------- // This should trigger bug in our modified XAPool 1.3.1 which will cause rollback // on the record inserted before using the same connection. // ----------------------------------------------------------------- // If it is not the same connection, then insert new record and return // connection to the pool. // Loop till 100 which is hopefully less than max connection count // therefore we should get at some point the same connection for (iIndex = 1; iIndex < 100; iIndex++) { try { con2 = spds.getConnection(); Assert.assertTrue("XAPool no longer returns instance" + " of StandardXAConnectionHandle", con2 instanceof StandardXAConnectionHandle); tempCon = (StandardXAConnectionHandle)con2; strCon2 = tempCon.con.toString(); if (mpConnectionMap.get(strCon2) == null) { // This is highly undesirable, since it can cause deadlock, // but I will let it be for now and use other test to deal with it // Inserted record 1, 2, ... insertStatement = con2.prepareStatement(SQL_QUERY); insertStatement.setInt(1, iIndex); iInsertCount = insertStatement.executeUpdate(); Assert.assertEquals("One record should have been inserted.", 1, iInsertCount); } else { // Retrieve the index which was already inserted iIndex = ((Integer)mpConnectionMap.get(strCon2)).intValue(); bDetectedTheSame = true; // Just let it close the connection without doing anything // ----------------------------------------------------------------- // This should trigger bug in our modified XAPool 1.3.1 which will // cause rollback on the record inserted before using the same connection. // ----------------------------------------------------------------- break; } mpConnectionMap.put(strCon2, new Integer(iIndex)); } finally { if (insertStatement != null) insertStatement.close(); insertStatement = null; con2.close(); con2 = null; } } Assert.assertTrue("Unable to get the same connection from the pool.", bDetectedTheSame); // ----------------------------------------------------------------- // This detects bug in our modified XAPool 1.3.1 since the inserted record is // not there // ----------------------------------------------------------------- try { con1 = spds.getConnection(); selectStatement = con1.prepareStatement(SQL_QUERY); selectStatement.setInt(1, iIndex); try { rsResults = selectStatement.executeQuery(); Assert.assertTrue("Canot find inserted record with index " + iIndex, rsResults.next()); rsResults.close(); } catch (Exception e) { // in case rsReults contains no data } } finally { selectStatement.close(); selectStatement = null; con1.close(); con1 = null; } utx.commit(); } catch (Throwable throwable) { utx.rollback(); throw throwable; } } finally { utx.begin(); try { conn = spds.getConnection(); /* PreparedStatement deleteStatement = conn.prepareStatement(DELETE_ALL); int iDeleteCount = DatabaseUtils.executeUpdateAndClose(deleteStatement); */ conn.close(); utx.commit(); } catch (Throwable throwable) { utx.rollback(); throw throwable; } } } } xapool-1.5.0-src/test/testsuite/README.txt0000644000175000017500000000375410235646676020300 0ustar twernertwerner# # # Test Suite # # Scenario: --------- Setup: ------ o A database: - MySQL - PostgreSQL Database Setup: --------------- The test expects: o a database named javatest o a user of login "mojo" and password "jojo" o a table named testdata which is like +----+-------+ | ID | FOO | +----+-------+ | 1 | 1 | +----+-------+ o id being an int (primary key) o foo being an int For test on MySQL: mysql> GRANT ALL PRIVILEGES ON *.* TO mojo -> IDENTIFIED BY 'jojo' WITH GRANT OPTION; mysql> create database javatest; mysql> use javatest; mysql> create table testdata ( -> id int not null auto_increment primary key, -> foo int)type=bdb; mysql> insert into testdata values(null, 1); Database configuration are stored in properties file (spy.properties) which contains the following properties: o realdriver - Name of the JDBC driver o url - URL to connect to the data base Compilation: ------------ Go to output/dist/test/testsuite Type $ ant compile to compile the test Run the test: ---------------- o To run the test, first check that only RMI protocol will be activated (in the ../../config/carol.properties, carol.rmi.activated should be set to jrmp); then type $ rmiregistry -J-classpath -Jjotm.jar:jotm_jrmp_stubs.jar -J-Djava.security.policy=../config/java.policy & to start a RMI registry on default port (i.e. 1099). o Set the classpath $ export CLASSPATH=../../lib/ow_util_log_wrp_log4j.jar:../../lib/jta-spec1_0_1.jar:../../lib/jotm.jar:../../lib/jotm_jrmp_stubs.jar:../../config:.:../../lib/xapool.jar:.:../../lib/commons-logging.jar:../../lib/commons-logging-api.jar:../../lib/p6spy.jar:../../lib/junit.jar:../../lib/connector-1_5.jar:../../lib/howl.jar:$JDBC_JARS where JDBC_JARS is the location of the JDBC driver jar file(s) you want to use. o Modify ../../config/spy.properties to setup your jdbc properties o Start the test $ java junit.textui.TestRunner XAPoolTestSuite Usage: ------ $ java junit.textui.TestRunner XAPoolTestSuite Enjoy! xapool-1.5.0-src/test/testsuite/XAPoolTestCase.java0000644000175000017500000001234010235646676022232 0ustar twernertwernerimport junit.framework.Test; import junit.framework.TestSuite; import junit.framework.TestCase; import java.util.Properties; import org.enhydra.jdbc.pool.StandardXAPoolDataSource; import org.enhydra.jdbc.standard.StandardXADataSource; import org.objectweb.jotm.Jotm; import org.objectweb.transaction.jta.TMService; import javax.naming.InitialContext; import javax.naming.Context; import javax.transaction.UserTransaction; import java.util.Properties; import java.sql.ResultSet; import java.sql.PreparedStatement; import java.sql.Connection; import java.sql.Statement; public class XAPoolTestCase extends TestCase { public String login = null; public String password = null; public String url = null; public String driver = null; public TMService jotm; public String USER_TRANSACTION_JNDI_NAME = "UserTransaction"; public UserTransaction utx = null; public StandardXAPoolDataSource spds; public StandardXADataSource xads; public Connection conn; public String SQL_REQUEST = "select id, foo from testdata where id=1"; public String SQL_QUERY = "update testdata set foo = ? where id=1"; public String datasourceClassName; public XAPoolTestCase(String strTestName) { super(strTestName); //System.out.println("New Object"); } public static Test suite() { return new TestSuite(XAPoolTestSuite.class); } protected void setUp() throws Exception { //System.out.println("setUp"); // first, load the properties from the spy.properties file Properties prop = new Properties(); try { prop.load(ClassLoader.getSystemResourceAsStream("spy.properties")); } catch (Exception e) { System.err.println("problem to load properties."); e.printStackTrace(); throw e; } login = prop.getProperty("login"); password = prop.getProperty("password"); url = prop.getProperty("url"); driver = prop.getProperty("driver"); // TML -Allow overriding the datasource class name in order to // support Sybase, IDB, etc. Defaults to the Standard implementation datasourceClassName = prop.getProperty("datasource-class", StandardXADataSource.class.getName()); // Get a transaction manager try { // creates an instance of JOTM with a local transaction factory which is not bound to a registry jotm = new Jotm(true, false); //InitialContext ictx = new InitialContext(); //ictx.rebind(USER_TRANSACTION_JNDI_NAME, jotm.getUserTransaction()); } catch (Exception e) { System.err.println("JOTM problem."); e.printStackTrace(); throw e; } try { //Context ictx = new InitialContext(); //utx = (UserTransaction) ictx.lookup(USER_TRANSACTION_JNDI_NAME); utx = jotm.getUserTransaction(); } catch (Exception e) { System.err.println("Exception of type :" + e.getClass().getName() + " has been thrown"); System.err.println("Exception message :" + e.getMessage()); e.printStackTrace(); throw e; } // create an XA pool datasource with a minimum of 4 objects spds = new StandardXAPoolDataSource(2); spds.setMaxSize(15); spds.setMinSize(13); spds.setUser(login); spds.setPassword(password); // create an XA datasource which will be given to the XA pool Class datasourceClass=Class.forName(datasourceClassName, true, getClass().getClassLoader()); xads = (StandardXADataSource)datasourceClass.newInstance(); try { xads.setDriverName(driver); xads.setUrl(url); xads.setUser(login); xads.setPassword(password); } catch (Exception e) { e.printStackTrace(); throw e; } spds.setTransactionManager(jotm.getTransactionManager()); // give the XA datasource to the pool (to create futur objects) spds.setDataSource(xads); } public int getValue() { try { // some tests close the connection, here, we need to get it // and do not forget to close it after use !!! boolean toClose = false; if (conn.isClosed()) { toClose = true; conn = spds.getConnection(login, password); } Statement st = conn.createStatement(); ResultSet rset = st.executeQuery(SQL_REQUEST); int numcols = rset.getMetaData().getColumnCount(); int res; rset.next(); res = Integer.parseInt(rset.getString(2)); rset.close(); st.close(); // here, we need to close the connection because it was // closed at the beginning of the method if (toClose) conn.close(); return res; } catch (Exception e) { e.printStackTrace(); } return 0; } protected void tearDown() throws Exception { //System.out.println("tearDown"); try { //InitialContext ictx = new InitialContext(); //ictx.unbind(USER_TRANSACTION_JNDI_NAME); } catch (Exception e) { throw e; } jotm.stop(); jotm = null; spds.stopPool(); xads = null; spds = null; } } xapool-1.5.0-src/test/testsuite/setup-sybase.sql0000644000175000017500000000021510235646676021734 0ustar twernertwernerCREATE TABLE testdata ( id NUMERIC(9,0) IDENTITY NOT NULL PRIMARY KEY, foo INTEGER NOT NULL ) go insert into testdata (foo) values(1) go xapool-1.5.0-src/output/0000755000175000017500000000000010235647332015107 5ustar twernertwernerxapool-1.5.0-src/output/build/0000755000175000017500000000000010235647004016202 5ustar twernertwernerxapool-1.5.0-src/output/build/classes/0000755000175000017500000000000010235647010017634 5ustar twernertwernerxapool-1.5.0-src/output/build/classes/org/0000755000175000017500000000000010235647010020423 5ustar twernertwernerxapool-1.5.0-src/output/build/classes/org/enhydra/0000755000175000017500000000000010235647010022055 5ustar twernertwernerxapool-1.5.0-src/output/build/classes/org/enhydra/jdbc/0000755000175000017500000000000010235647011022760 5ustar twernertwernerxapool-1.5.0-src/output/build/classes/org/enhydra/jdbc/core/0000755000175000017500000000000010235647010023707 5ustar twernertwernerxapool-1.5.0-src/output/build/classes/org/enhydra/jdbc/core/CoreCallableStatement.class0000644000175000017500000007003310235647010031136 0ustar twernertwerner.H                                                                                                                         ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C DEFGcsLjava/sql/CallableStatement;()VCodeLineNumberTableLocalVariableTablethis-Lorg/enhydra/jdbc/core/CoreCallableStatement;getArray(I)Ljava/sql/Array;eLjava/sql/SQLException;iI Exceptions getBigDecimal(I)Ljava/math/BigDecimal;(II)Ljava/math/BigDecimal;scalegetBlob(I)Ljava/sql/Blob; getBoolean(I)ZgetByte(I)BgetBytes(I)[BgetClob(I)Ljava/sql/Clob;getDate(I)Ljava/sql/Date;&(ILjava/util/Calendar;)Ljava/sql/Date;calLjava/util/Calendar; getDouble(I)DgetFloat(I)FgetInt(I)IgetLong(I)J getObject(I)Ljava/lang/Object;$(ILjava/util/Map;)Ljava/lang/Object;mapLjava/util/Map;getRef(I)Ljava/sql/Ref;getShort(I)S getString(I)Ljava/lang/String;getTime(I)Ljava/sql/Time;&(ILjava/util/Calendar;)Ljava/sql/Time; getTimestamp(I)Ljava/sql/Timestamp;+(ILjava/util/Calendar;)Ljava/sql/Timestamp;registerOutParameter(II)VsqlType(III)V(IILjava/lang/String;)VtypeNameLjava/lang/String;wasNull()ZaddBatchclearParametersexecute executeQuery()Ljava/sql/ResultSet; executeUpdate()I getMetaData()Ljava/sql/ResultSetMetaData;setArray(ILjava/sql/Array;)VxLjava/sql/Array;setAsciiStream(ILjava/io/InputStream;I)VparameterIndexLjava/io/InputStream;length setBigDecimal(ILjava/math/BigDecimal;)VLjava/math/BigDecimal;setBinaryStreamsetBlob(ILjava/sql/Blob;)VLjava/sql/Blob; setBoolean(IZ)VZsetByte(IB)VBsetBytes(I[B)V[BsetCharacterStream(ILjava/io/Reader;I)VreaderLjava/io/Reader;setClob(ILjava/sql/Clob;)VLjava/sql/Clob;setDate(ILjava/sql/Date;)VLjava/sql/Date;'(ILjava/sql/Date;Ljava/util/Calendar;)V setDouble(ID)VDsetFloat(IF)VFsetIntsetLong(IJ)VJsetNull paramIndex setObject(ILjava/lang/Object;)VLjava/lang/Object;(ILjava/lang/Object;I)V targetSqlType(ILjava/lang/Object;II)VsetRef(ILjava/sql/Ref;)VLjava/sql/Ref;setShort(IS)VS setString(ILjava/lang/String;)VsetTime(ILjava/sql/Time;)VLjava/sql/Time;'(ILjava/sql/Time;Ljava/util/Calendar;)V setTimestamp(ILjava/sql/Timestamp;)VLjava/sql/Timestamp;,(ILjava/sql/Timestamp;Ljava/util/Calendar;)VsetUnicodeStreamclose executeBatch()[IgetMaxFieldSizesetMaxFieldSize(I)Vmax getMaxRows setMaxRowssetEscapeProcessing(Z)VenablegetQueryTimeoutsetQueryTimeoutsecondscancel getWarnings()Ljava/sql/SQLWarning; clearWarnings setCursorName(Ljava/lang/String;)Vname getResultSetgetUpdateCountgetMoreResultssetFetchDirection directiongetFetchDirection setFetchSizerows getFetchSizegetResultSetConcurrencygetResultSetType getConnection()Ljava/sql/Connection; clearBatchs(Ljava/lang/String;)Z((Ljava/lang/String;)Ljava/sql/ResultSet;(Ljava/lang/String;)I(Ljava/lang/String;I)ZsqlautoGeneratedKeys(Ljava/lang/String;[I)Z columnIndexes[I((Ljava/lang/String;[Ljava/lang/String;)Z columnNames[Ljava/lang/String;(Ljava/lang/String;I)I(Ljava/lang/String;[I)I((Ljava/lang/String;[Ljava/lang/String;)IgetGeneratedKeyscurrentgetResultSetHoldabilitygetParameterMetaData()Ljava/sql/ParameterMetaData;setURL(ILjava/net/URL;)VLjava/net/URL;$(Ljava/lang/String;)Ljava/sql/Array; parameterName*(Ljava/lang/String;)Ljava/math/BigDecimal;#(Ljava/lang/String;)Ljava/sql/Blob;(Ljava/lang/String;)B(Ljava/lang/String;)[B#(Ljava/lang/String;)Ljava/sql/Clob;#(Ljava/lang/String;)Ljava/sql/Date;7(Ljava/lang/String;Ljava/util/Calendar;)Ljava/sql/Date;(Ljava/lang/String;)D(Ljava/lang/String;)F(Ljava/lang/String;)J&(Ljava/lang/String;)Ljava/lang/Object;5(Ljava/lang/String;Ljava/util/Map;)Ljava/lang/Object;"(Ljava/lang/String;)Ljava/sql/Ref;(Ljava/lang/String;)S&(Ljava/lang/String;)Ljava/lang/String;#(Ljava/lang/String;)Ljava/sql/Time;7(Ljava/lang/String;Ljava/util/Calendar;)Ljava/sql/Time;((Ljava/lang/String;)Ljava/sql/Timestamp;<(Ljava/lang/String;Ljava/util/Calendar;)Ljava/sql/Timestamp;getURL(I)Ljava/net/URL;"(Ljava/lang/String;)Ljava/net/URL;(Ljava/lang/String;I)V(Ljava/lang/String;II)V((Ljava/lang/String;ILjava/lang/String;)V+(Ljava/lang/String;Ljava/io/InputStream;I)V+(Ljava/lang/String;Ljava/math/BigDecimal;)V(Ljava/lang/String;Z)V(Ljava/lang/String;B)V(Ljava/lang/String;[B)V&(Ljava/lang/String;Ljava/io/Reader;I)V$(Ljava/lang/String;Ljava/sql/Date;)V8(Ljava/lang/String;Ljava/sql/Date;Ljava/util/Calendar;)V(Ljava/lang/String;D)V(Ljava/lang/String;F)V(Ljava/lang/String;J)V'(Ljava/lang/String;Ljava/lang/Object;)V((Ljava/lang/String;Ljava/lang/Object;I)V)(Ljava/lang/String;Ljava/lang/Object;II)Vsacle(Ljava/lang/String;S)V'(Ljava/lang/String;Ljava/lang/String;)V$(Ljava/lang/String;Ljava/sql/Time;)V8(Ljava/lang/String;Ljava/sql/Time;Ljava/util/Calendar;)V)(Ljava/lang/String;Ljava/sql/Timestamp;)V=(Ljava/lang/String;Ljava/sql/Timestamp;Ljava/util/Calendar;)V#(Ljava/lang/String;Ljava/net/URL;)V preInvoke catchInvoke(Ljava/sql/SQLException;)V SourceFileCoreCallableStatement.java  java/sql/SQLException                 " $ %& () +, -. -0 12 14 5 6 78 9 :; = >; ?@ B C; E FG H IJ L M N O; Q R; T U V WX Y J [ \ ] ^ a d g h i j N l mn op r t u [ v w x y z { | ] } ~                                ( + - - 1 1 o+org/enhydra/jdbc/core/CoreCallableStatementorg/enhydra/jdbc/util/JdbcUtiljava/sql/CallableStatement!/*1 m**M*,9;<=? m**M*,BDEFH w**N*-LNOPR*m**M*,UWXY[ m** M*,^`abd m** M*,gijkm m** M*,prstv m** M*,y{|} m** M*, x**,N*-*m**M*, m**M*,  m**M*, m**M*,  m**M*, x**,N*-*m**M*, m**M*, m**M*, m**M*, x**,N*-*m**M*, x**,N*-*}** N*-  *** :*4**- :*" !#4b**L*+ %'()+g**  L*+ /1 4235g**! L*+ 8: =;<>b**"L*+ ACDEGb**#L*+ KMNOQb**$L*+ UWXY[b**%L*+ _abce}**,& N*-iknlmo***,' :*suxvwy4}**,( N*-}***,) :*4}**,* N*-*}**+ N*-*}**, N*-*}**,- N*-* **,. :*4    }**,/ N*-*}**,0 N*-***,-1 :*4**(2 :**}**$3 N*-*}**4 N*-*** 5 :**}**6 N*-***-7 :*  4 }**,8 N*-*!"**,9 :* #!"$4!#$**,: :*,.1/02>!#%&}**,; N*-57:89;*'()}**< N*->@CABD**+,}**,= N*-GILJKM*-.}**,> N*-PRUSTV*/-0**,-? :*Z\_]^`4/12}**,@ N*-dfighj*314**,-A :*npsqrt435**,B :*xz}{|~46C* *C 78b**DL*+ 9b**EL*+ :;r**F M*, <=b**GL*+ >;r**H M*, <?@r**I M*, ABb**JL*+ C;r**K M*, DEg**L L*+  FGb**ML*+ Hg**N L*+  IJr**+O M*, KLb**PL*+ Mb**QL*+  Nb**RL*+ O;r**S M*, PQb**TL*+ !#$%'R;r**U M*,+-0./1 STb**VL*+ 4678:Ub**WL*+ >@ABDVb**XL*+ HJKLNWXb**YL*+ RTUVXYg**Z L*+ \^ a_`bJr**+[ M*,egjhik Z[m**+\M*,npqrt Z\m**+]M*,xz{|~ Z]m**+^M*, Z^x**+_N*-*_`ax**+,`N*-*_bcdx**+,aN*-*_efgx**+bN*-*_`hx**+,cN*-*_bcix**+,dN*-*_efjb**eL*+ Nm**fM*, klb**gL*+ mnb**hL*+ op}**,i N*-*qrm**+jM*, stm**+kM*, sum**+lM*, s[m**+mM*, "#$& svm**+nM*,)+,-/ swm**+oM*,24568 sxm**+pM*,;=>?A sym**+qM*,DFGHJ szx**+,rN*-NPQRT*s{m**+sM*,WYZ[] s|m**+tM*, `bcdf s]m**+uM*,iklmo s}m**+vM*, rtuvx s~m**+wM*,{}~ sx**+,xN*-*sm**+yM*, sm**+zM*, sm**+{M*, sm**+|M*, sx**+,}N*-*sm**+~M*, sx**+,N*-*sm**M*, m**+M*, s}**+ N*-*s**+ :*4s**+- :*4s**+, :*    4s}**+, N*-*s**+, :* #!"$4s}**+ N*-'),*+-*s}**+ N*-/14235*s}**+, N*-79<:;=*s**+, :*CEHFGI4s  }**+, N*-LNQOPR*s**+,- :*XZ][\^4s**+( :*`becdf*s}**+$ N*-hjmkln*s}**+ N*-prustv*s**+  :*xz}{|~*s}**+ N*-*s**+- :*4s}**+, N*-*s!**+, :*4s!#**+, :*>s!#(}**+ N*-*s*+}**+, N*-*s-}**+, N*-*s/-**+,- :*4s/1}**+, N*-*s31**+,- :*4s3o}**+, N*-*sqxapool-1.5.0-src/output/build/classes/org/enhydra/jdbc/core/CoreConnection.class0000644000175000017500000001660010235647010027651 0ustar twernertwerner. 2 1 1 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1      3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3conLjava/sql/Connection;(Ljava/sql/Connection;)VCodeLineNumberTableLocalVariableTablethis&Lorg/enhydra/jdbc/core/CoreConnection;()V clearWarningseLjava/sql/SQLException; ExceptionsclosecommitcreateStatement()Ljava/sql/Statement;(II)Ljava/sql/Statement; resultSetTypeIresultSetConcurrency getAutoCommit()Z getCatalog()Ljava/lang/String; getMetaData()Ljava/sql/DatabaseMetaData;getTransactionIsolation()I getTypeMap()Ljava/util/Map; getWarnings()Ljava/sql/SQLWarning; isReadOnly nativeSQL&(Ljava/lang/String;)Ljava/lang/String;sqlLjava/lang/String; prepareCall0(Ljava/lang/String;)Ljava/sql/CallableStatement;prepareStatement0(Ljava/lang/String;)Ljava/sql/PreparedStatement;2(Ljava/lang/String;II)Ljava/sql/PreparedStatement;rollback setAutoCommit(Z)V autoCommitZ setCatalog(Ljava/lang/String;)Vcatalog setReadOnlyreadOnlysetTransactionIsolation(I)Vlevel setTypeMap(Ljava/util/Map;)VmapLjava/util/Map;(III)Ljava/sql/Statement;resultSetHoldabilitygetHoldability3(Ljava/lang/String;III)Ljava/sql/CallableStatement;1(Ljava/lang/String;I)Ljava/sql/PreparedStatement;autoGeneratedKeys3(Ljava/lang/String;III)Ljava/sql/PreparedStatement;2(Ljava/lang/String;[I)Ljava/sql/PreparedStatement; columnIndexes[IC(Ljava/lang/String;[Ljava/lang/String;)Ljava/sql/PreparedStatement; columnNames[Ljava/lang/String;releaseSavepoint(Ljava/sql/Savepoint;)V savepointLjava/sql/Savepoint;setHoldability holdability setSavepoint()Ljava/sql/Savepoint;((Ljava/lang/String;)Ljava/sql/Savepoint;name preInvoke catchInvoke(Ljava/sql/SQLException;)V SourceFileCoreConnection.java 6= 45 = >=java/sql/SQLException B= C= DE DF JK LM NO PQ RS TU VK WX [\ ]^ ]_ `= java/lang/StringBuffer.CoreConnection:Setautocommit autoCommit was = M CoreConnection:Setautocommit = ab ef hb jk mn Dq sQ [t ]u ]w ]x ]{ ~ ` k $org/enhydra/jdbc/core/CoreConnectionorg/enhydra/jdbc/util/JdbcUtiljava/sql/ConnectionlogLorg/enhydra/jdbc/util/Logger;append,(Ljava/lang/String;)Ljava/lang/StringBuffer;(Z)Ljava/lang/StringBuffer;toStringorg/enhydra/jdbc/util/Loggerdebug(Ljava/lang/Object;)V!12345&678F **+9./ 0: ;< 456=83*9 23: ;<>=8g** L*+ 968 ;9:<:?@;<AB=8g** L*+ 9?A DBCE:?@;<AC=8g** L*+ 9HJ MKLN:?@;<ADE8b** L*+ 9QSTUW:?@;<ADF8x** N*-9^`abd:*?@;<GHIHAJK8b** L*+ 9hjkln:?@;<ALM8b** L*+ 9rtuvx:?@;<ANO8b** L*+ 9|~:?@;<APQ8b**L*+ 9:?@;<ARS8b**L*+ 9:?@;<ATU8b**L*+ 9:?@;<AVK8b**L*+ 9:?@;<AWX8m**+M*,9: ?@;<YZA[\8m**+M*,9: ?@;<YZA]^8m**+M*,9: ?@;<YZA]_8**+:*9:4?@;<YZGHIHA`=8g** L*+ 9 :?@;<Aab8T*Y* *Y**  M*,@JM9""<@JMNS: N?@T;<TcdAef8r**+! M*,9: ?@;<gZAhb8r**" M*,9: ?@;<idAjk8r**# M*,9 : ?@;<lHAmn8r**+$ M*,9 : ?@;<opADq8**%:*9 !"$:4?@;<GHIHrHAsQ8b**&L*+ 9')*+-:?@;<A[t8**+':*95789;:>?@;<YZGHIHrHA]u8x**+(N*-9ACDEG:*?@;<YZvHA]w8**+):* 9OQRSU:>?@;<YZGHIHrHA]x8x**+,*N*-9Y[\]_:*?@;<YZyzA]{8x**+,+N*-9cefgi:*?@;<YZ|}A~8r**+, M*,9morpqt: ?@;<A`8r**+- M*,9vx{yz|: ?@;<Ak8r**. M*,9~: ?@;<HA8b**/L*+ 9:?@;<A8m**+0M*,9: ?@;<ZA=AAxapool-1.5.0-src/output/build/classes/org/enhydra/jdbc/core/CoreDataSource.class0000644000175000017500000001140710235647010027604 0ustar twernertwerner. 5 4 4 4 4 4 4 4 4 4 = 4  ? 4@ 49 4   4 4 4 4 ' ' ' ' ' loginTimeoutI logWriterLjava/io/PrintWriter;userLjava/lang/String;password descriptiondebugZverbose threadFactory)Lorg/enhydra/jdbc/core/JdbcThreadFactory;()VCodeLineNumberTableLocalVariableTablethis&Lorg/enhydra/jdbc/core/CoreDataSource;getDescription()Ljava/lang/String; getPasswordgetUsergetThreadFactory+()Lorg/enhydra/jdbc/core/JdbcThreadFactory;isDebug()Z isVerbosesetDescription(Ljava/lang/String;)V setPasswordsetUsersetDebug(Z)V setVerbosesetThreadFactory,(Lorg/enhydra/jdbc/core/JdbcThreadFactory;)Vf getLogWriter()Ljava/io/PrintWriter; setLogWriter(Ljava/io/PrintWriter;)VoutshutdownforcesetLoginTimeout(I)VsecondsgetLoginTimeout()I getReference()Ljavax/naming/Reference;refLjavax/naming/Reference; ExceptionsgetObjectInstanced(Ljava/lang/Object;Ljavax/naming/Name;Ljavax/naming/Context;Ljava/util/Hashtable;)Ljava/lang/Object;refObjLjava/lang/Object;nameLjavax/naming/Name;nameCtxLjavax/naming/Context;envLjava/util/Hashtable;toStringsbLjava/lang/StringBuffer; SourceFileCoreDataSource.java FG 9: ;< => ?> @> AB CB DE org/enhydra/jdbc/util/Loggerjavax/naming/Reference  N Fjavax/naming/StringRefAddr PN F ON MN jk }+CoreDataSource:getReference object returned A  java/lang/String YW XW VW gh1CoreDataSource:getObjectInstance instance createdjava/lang/StringBufferCoreDataSource :  debug =< > }N description =< login time out =<  user =< verbose =<$org/enhydra/jdbc/core/CoreDataSourceorg/enhydra/jdbc/util/JdbcUtiljavax/naming/Referenceablejavax/naming/spi/ObjectFactoryjava/io/Serializablejavax/naming/NamingExceptionjava/lang/ExceptionlogLorg/enhydra/jdbc/util/Logger;java/lang/ObjectgetClass()Ljava/lang/Class;java/lang/ClassgetName9(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V'(Ljava/lang/String;Ljava/lang/String;)Vadd(Ljavax/naming/RefAddr;)Vjava/lang/Integer(I)Ljava/lang/String;(Ljava/lang/Object;)Vget*(Ljava/lang/String;)Ljavax/naming/RefAddr;javax/naming/RefAddr getContent()Ljava/lang/Object;parseInt(Ljava/lang/String;)Iappend,(Ljava/lang/String;)Ljava/lang/StringBuffer;(Z)Ljava/lang/StringBuffer;(I)Ljava/lang/StringBuffer;!456789:;<=>?>@>ABCBDEFGH|.**<******* I* >? @ABCD#E(F-GJ .KLMNH/*IMJ KLONH/*IPJ KLPNH/*ISJ KLQRH/* IVJ KLSTH/*IYJ KLUTH/*I\J KLVWH>*+I `aJKL@>XWH>*+I cdJKL?>YWH>*+I fgJKL=>Z[H>*I ijJKLAB\[H>*I lmJKLCB]^H>*+ I opJKL_E`aH/* IsJ KLbcHA *+ I wxJ KL d<e[H5IJKLfBghH>*I JKLi:jkH/*IJ KLlmHi Y* * L+Y*+Y*+Y*+Y** +I(9J^gJiKLRnopqrsHX+ :* !* "* #* $%* &*I(9MVJ>XKLXtuXvwXxyXz{Rnop|}NH'Y(L+)*W+'Y(+**,-*.*W+'Y(/***-*.*W+'Y(0**1-*.*W+'Y(2***-*.*W+'Y(3**,-*.*W+.I"/OoJKL~xapool-1.5.0-src/output/build/classes/org/enhydra/jdbc/core/JdbcThreadFactory.class0000644000175000017500000000100310235647010030252 0ustar twernertwerner.   getThread((Ljava/lang/Runnable;)Ljava/lang/Thread; Exceptions:(Ljava/lang/Runnable;Ljava/lang/String;)Ljava/lang/Thread;?(Ljava/lang/ThreadGroup;Ljava/lang/Runnable;)Ljava/lang/Thread;Q(Ljava/lang/ThreadGroup;Ljava/lang/Runnable;Ljava/lang/String;)Ljava/lang/Thread; SourceFileJdbcThreadFactory.java'org/enhydra/jdbc/core/JdbcThreadFactoryjava/lang/Objectjava/sql/SQLException   xapool-1.5.0-src/output/build/classes/org/enhydra/jdbc/core/CorePreparedStatement.class0000644000175000017500000003261010235647010031200 0ustar twernertwerner.S Q P P R P R R R R R R R R R R R R R R R R R R R R R R R R R R R R! R" R# R$ R% R& R' R( R) R* R+ R, R- R. R/ R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R: R; R< R= R> R? R@ RA RB RC RD RE RF RG RH RI RJ RK RL RM RNOPQpsLjava/sql/PreparedStatement;()VCodeLineNumberTableLocalVariableTablethis-Lorg/enhydra/jdbc/core/CorePreparedStatement; setLogger!(Lorg/enhydra/jdbc/util/Logger;)ValogLorg/enhydra/jdbc/util/Logger;addBatcheLjava/sql/SQLException; ExceptionsclearParametersexecute()Z executeQuery()Ljava/sql/ResultSet; executeUpdate()I getMetaData()Ljava/sql/ResultSetMetaData;setArray(ILjava/sql/Array;)ViIxLjava/sql/Array;setAsciiStream(ILjava/io/InputStream;I)VparameterIndexLjava/io/InputStream;length setBigDecimal(ILjava/math/BigDecimal;)VLjava/math/BigDecimal;setBinaryStreamsetBlob(ILjava/sql/Blob;)VLjava/sql/Blob; setBoolean(IZ)VZsetByte(IB)VBsetBytes(I[B)V[BsetCharacterStream(ILjava/io/Reader;I)VreaderLjava/io/Reader;setClob(ILjava/sql/Clob;)VLjava/sql/Clob;setDate(ILjava/sql/Date;)VLjava/sql/Date;'(ILjava/sql/Date;Ljava/util/Calendar;)VcalLjava/util/Calendar; setDouble(ID)VDsetFloat(IF)VFsetInt(II)VsetLong(IJ)VJsetNullsqlType(IILjava/lang/String;)V paramIndextypeNameLjava/lang/String; setObject(ILjava/lang/Object;)VLjava/lang/Object;(ILjava/lang/Object;I)V targetSqlType(ILjava/lang/Object;II)VscalesetRef(ILjava/sql/Ref;)VLjava/sql/Ref;setShort(IS)VS setString(ILjava/lang/String;)VsetTime(ILjava/sql/Time;)VLjava/sql/Time;'(ILjava/sql/Time;Ljava/util/Calendar;)V setTimestamp(ILjava/sql/Timestamp;)VLjava/sql/Timestamp;,(ILjava/sql/Timestamp;Ljava/util/Calendar;)VsetUnicodeStreamclose executeBatch()[IgetMaxFieldSizesetMaxFieldSize(I)Vmax getMaxRows setMaxRowssetEscapeProcessing(Z)VenablegetQueryTimeoutsetQueryTimeoutsecondscancel getWarnings()Ljava/sql/SQLWarning; clearWarnings setCursorName(Ljava/lang/String;)Vname getResultSetgetUpdateCountgetMoreResultssetFetchDirection directiongetFetchDirection setFetchSizerows getFetchSizegetResultSetConcurrencygetResultSetType getConnection()Ljava/sql/Connection; clearBatchs(Ljava/lang/String;)Z((Ljava/lang/String;)Ljava/sql/ResultSet;(Ljava/lang/String;)I(Ljava/lang/String;I)ZsqlautoGeneratedKeys(Ljava/lang/String;[I)Z columnIndexes[I((Ljava/lang/String;[Ljava/lang/String;)Z columnNames[Ljava/lang/String;(Ljava/lang/String;I)I(Ljava/lang/String;[I)I((Ljava/lang/String;[Ljava/lang/String;)IgetGeneratedKeys(I)ZcurrentgetResultSetHoldabilitygetParameterMetaData()Ljava/sql/ParameterMetaData;setURL(ILjava/net/URL;)VLjava/net/URL; preInvoke catchInvoke(Ljava/sql/SQLException;)V SourceFileCorePreparedStatement.java UV R_ ST `Vjava/sql/SQLException dV ef gh ij kl mn st xy {t |}  t V j j j V V h j f j j j j V ` e g i e e e i i i h j +org/enhydra/jdbc/core/CorePreparedStatementorg/enhydra/jdbc/util/JdbcUtiljava/sql/PreparedStatementlog!PQRSTNUVW/*X2Y Z[\]W>*+X :;YZ[^_`VW_* L*+ X@ C A BDY abZ[cdVW_* L*+ XI L J KMY abZ[cefWZ*L*+ XR S TVY abZ[cghWZ* L*+ X\ ] ^`Y abZ[cijWZ* L*+ Xf g hjY abZ[cklWZ* L*+ Xp q rtY abZ[cmnWu*,  N*- Xz }{|~Y*abZ[opqrcstW*,  :* X Y4abZ[upqvwpcxyWu*, N*- X Y*abZ[upqzc{tW*, :* X Y4abZ[upqvwpc|}Wu*, N*- X Y*abZ[opq~cWu* N*- X Y*abZ[upqcWu* N*- X Y*abZ[upqcWu*, N*- X Y*abZ[upqcW*, :* X Y4abZ[upwpcWu*, N*- X Y*abZ[opqcWu*, N*- X Y*abZ[upqcW*,- :* X Y4abZ[upqcWw*( :* X Y*abZ[upqcWu*$ N*- X Y*abZ[upqcWu* N*- X Y*abZ[upqpcWw*  :* X     Y*abZ[upqcWu* N*- X Y*abZ[uppcW*- :* X  Y4abZ[ppcWu*, N*- X% (&')Y*abZ[upqcW*, :* X/ 2013Y4abZ[upqpcW*,  :*X=@>?AY>abZ[upqppcWu*,! N*- XF IGHJY*abZ[opqcWu*" N*- XO RPQSY*abZ[upqcWu*,# N*- XX [YZ\Y*abZ[upqcWu*,$ N*- Xa dbceY*abZ[upqcW*,-% :* Xk nlmoY4abZ[upqcWu*,& N*- Xu xvwyY*abZ[upqcW*,-' :* X Y4abZ[upqctW*,( :* X Y4abZ[upqvwpcVWC* *)XY Z[cWZ**L*+ X  Y abZ[cjWZ*+L*+ X  Y abZ[cWj*, M*, X  Y abZ[pcjWZ*-L*+ X  Y abZ[cWj*. M*, X  Y abZ[pcWj*/ M*, X  Y abZ[cjWZ*0L*+ X  Y abZ[cWj*1 M*, X  Y abZ[pcVW_*2 L*+ X   Y abZ[cWZ*3L*+ X  Y abZ[cVW_*4 L*+ X   Y abZ[cWj*+5 M*, X  Y abZ[chWZ*6L*+ X   Y abZ[cjWZ*7L*+ X  Y abZ[cfWZ*8L*+ X  !#Y abZ[cWj*9 M*, X) , *+-Y abZ[pcjWZ*:L*+ X2 3 46Y abZ[cWj*; M*, X< ? =>@Y abZ[pcjWZ*<L*+ XE F GIY abZ[cjWZ*=L*+ XO P QSY abZ[cjWZ*>L*+ XY Z []Y abZ[cWZ*?L*+ Xc d egY abZ[cVW_*@ L*+ Xm p n oqY abZ[c`Wj*+A M*, Xv y wxzY abZ[ceWe*+BM*, X  Y  abZ[cgWe*+CM*, X  Y  abZ[ciWe*+DM*, X  Y  abZ[ceWp*+EN*- X  Y* abZ[pceWp*+,FN*- X  Y* abZ[ceWp*+,GN*- X  Y* abZ[ciWp*+HN*- X  Y* abZ[pciWp*+,IN*- X  Y* abZ[ciWp*+,JN*- X  Y* abZ[chWZ*KL*+ X  Y abZ[cWe*LM*, X  Y  abZ[pcjWZ*ML*+ X  Y abZ[cWZ*NL*+ X  Y abZ[cWu*,O N*- X Y*abZ[upqcVccxapool-1.5.0-src/output/build/classes/org/enhydra/jdbc/core/CoreStatement.class0000644000175000017500000001455710235647010027527 0ustar twernertwerner. + * , * , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , statementLjava/sql/Statement;()VCodeLineNumberTableLocalVariableTablethis%Lorg/enhydra/jdbc/core/CoreStatement;addBatch(Ljava/lang/String;)VeLjava/sql/SQLException;sLjava/lang/String; Exceptionscancel clearBatch clearWarningscloseexecute(Ljava/lang/String;)Z executeBatch()[I executeQuery((Ljava/lang/String;)Ljava/sql/ResultSet; executeUpdate(Ljava/lang/String;)I getConnection()Ljava/sql/Connection;getFetchDirection()I getFetchSizegetGeneratedKeys()Ljava/sql/ResultSet;getMaxFieldSize getMaxRowsgetMoreResults()ZgetQueryTimeout getResultSetgetResultSetConcurrencygetResultSetTypegetUpdateCount getWarnings()Ljava/sql/SQLWarning; setCursorNamenamesetEscapeProcessing(Z)VenableZsetFetchDirection(I)V directionI setFetchSizerowssetMaxFieldSizemax setMaxRowssetQueryTimeoutseconds(Ljava/lang/String;I)ZsqlautoGeneratedKeys(Ljava/lang/String;[I)Z columnIndexes[I((Ljava/lang/String;[Ljava/lang/String;)Z columnNames[Ljava/lang/String;(Ljava/lang/String;I)I(Ljava/lang/String;[I)I((Ljava/lang/String;[Ljava/lang/String;)I(I)ZcurrentgetResultSetHoldability catchInvoke(Ljava/sql/SQLException;)V SourceFileCoreStatement.java /0 -. 67java/sql/SQLException {| =0 >0 ?0 @0 AB CD EF GH IJ KL ML NO PL QL RS TL UO VL WL XL YZ [7 ]^ ab eb gb ib jb Al Ao Ar Gu Gv Gw Rx zL#org/enhydra/jdbc/core/CoreStatementorg/enhydra/jdbc/util/JdbcUtiljava/sql/Statement!*+,-.'/01/*2%3 45671j*+ M*, 2- 0 ./13 8945:;<=01_* L*+ 26 9 7 8:3 8945<>01_* L*+ 2? B @ AC3 8945<?01_* L*+ 2H K I JL3 8945<@01C* * 2OPR3 45<AB1e*+ M*, 2W X Y[3  8945:;<CD1Z* L*+ 2a b ce3 8945<EF1e*+ M*, 2k l mo3  8945:;<GH1e*+ M*, 2u v wy3  8945:;<IJ1Z*L*+ 2 3 8945<KL1Z*L*+ 2 3 8945<ML1Z*L*+ 2 3 8945<NO1Z*L*+ 2 3 8945<PL1Z*L*+ 2 3 8945<QL1Z*L*+ 2 3 8945<RS1Z*L*+ 2 3 8945<TL1Z*L*+ 2 3 8945<UO1Z*L*+ 2 3 8945<VL1Z*L*+ 2 3 8945<WL1Z*L*+ 2 3 8945<XL1Z*L*+ 2 3 8945<YZ1Z*L*+ 2 3 8945<[71j*+ M*, 2  3 8945\;<]^1j* M*, 2    3 8945_`<ab1j* M*, 2  3 8945cd<eb1j* M*, 2   3 8945fd<gb1j* M*, 2% ( &')3 8945hd<ib1j*  M*, 2. 1 /023 8945hd<jb1j*! M*, 27 : 89;3 8945kd<Al1p*+"N*- 2E F GI3* 8945m;nd<Ao1p*+,#N*- 2N O PR3* 8945m;pq<Ar1p*+,$N*- 2W X Y[3* 8945m;st<Gu1p*+%N*- 2` a bd3* 8945m;nd<Gv1p*+,&N*- 2i j km3* 8945m;pq<Gw1p*+,'N*- 2r s tv3* 8945m;st<Rx1e*(M*, 2{ | }3  8945yd<zL1Z*)L*+ 2  3 8945<{|<}~xapool-1.5.0-src/output/build/classes/org/enhydra/jdbc/util/0000755000175000017500000000000010235647010023734 5ustar twernertwernerxapool-1.5.0-src/output/build/classes/org/enhydra/jdbc/util/JdbcUtil.class0000644000175000017500000000074110235647010026465 0ustar twernertwerner.  logLorg/enhydra/jdbc/util/Logger;()VCodeLineNumberTableLocalVariableTablethis Lorg/enhydra/jdbc/util/JdbcUtil; setLogger!(Lorg/enhydra/jdbc/util/Logger;)Valog SourceFile JdbcUtil.java  org/enhydra/jdbc/util/JdbcUtiljava/lang/Object! /*    >*+   xapool-1.5.0-src/output/build/classes/org/enhydra/jdbc/util/Logger.class0000644000175000017500000000324110235647010026202 0ustar twernertwerner.?' () * + , -. -/ -0 -1 -2 -3 -4 -5 -6 -78log Lorg/apache/commons/logging/Log;#(Lorg/apache/commons/logging/Log;)VCodeLineNumberTableLocalVariableTablethisLorg/enhydra/jdbc/util/Logger;debug(Ljava/lang/Object;)VoLjava/lang/Object;*(Ljava/lang/Object;Ljava/lang/Throwable;)VtLjava/lang/Throwable;infowarnerrorfatal SourceFile Logger.javajava/io/PrintWriter9 :; < = >   ! ! " " # # $ $org/enhydra/jdbc/util/Loggerjava/lang/SystemerrLjava/io/PrintStream;(Ljava/io/OutputStream;)V(Ljava/io/Writer;)Vorg/apache/commons/logging/Log! P*Y*+ !"C *+ % &  N *+, ( )     !C *+ + ,  !N *+,  . /     "C *+  1 2  "N *+,  4 5     #C *+  7 8  #N *+,  : ;     $C *+ = >  $N *+, @ A     %&xapool-1.5.0-src/output/build/classes/org/enhydra/jdbc/util/LRUCache.class0000644000175000017500000000555310235647010026361 0ustar twernertwerner. "ST S !UV S !W !X Y YZ S ![ \] ^ _ ` a !b c d e f \g hi hj !k l mn mo !d !pqrcacheLjava/util/Hashtable;lruLjava/util/LinkedList;maxSizeIlogLorg/enhydra/jdbc/util/Logger;(I)VCodeLineNumberTableLocalVariableTablethis Lorg/enhydra/jdbc/util/LRUCache;LRUSize()I cacheSizeput'(Ljava/lang/Object;Ljava/lang/Object;)VkeyLjava/lang/Object;valueremovedLjava/util/List;get&(Ljava/lang/Object;)Ljava/lang/Object;removeobj removeLRU()Ljava/lang/Object;resizenewSize cleanupAll(Ljava/util/List;)VitLjava/util/Iterator; cleanupObject(Ljava/lang/Object;)Vo()VenumLjava/util/Enumeration; setLogger!(Lorg/enhydra/jdbc/util/Logger;)Valog SourceFile LRUCache.java +Kjava/util/Hashtable #$java/util/LinkedList %& '( s3java/util/ArrayList @At uv wv >v xI 5y DE <= >= zA {A |}~  A HI  A )*org/enhydra/jdbc/util/LRUCachejava/lang/Objectsizejava/util/Listadd(Ljava/lang/Object;)Z containsKeyaddLast8(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;getFirst removeFirstiterator()Ljava/util/Iterator;java/util/IteratorhasNext()Znextkeys()Ljava/util/Enumeration;java/util/EnumerationhasMoreElements nextElement!!"#$%&'()* +,-d **Y*Y*.0%'12/ 01 '(23-2* .5/ 0143-2* .9/ 0156-e Y N*Y:* `*-* W*+ *+W*+*+,Wç :*- TWW\W.. CD FG+J6K?NGPQQ_RdS/*e01e78e98]:;!<=-k'*+*+W*+*+.[ \ _`b/'01'78!>=-o!*+*+W*+M,.j k npq/ !01!78?8"@A-U**L*W+.uvw/01 ?8B,-D Y M*YN** *,* W-ç :-*,477;7.* ~ $2>C/ D01DC( 7:;DE-h+M,*,./ 01:;FGHI-5./01J8DK-o%*L+*+M*,.$/ J8LM%01NO->*+ . /01P*QRxapool-1.5.0-src/output/build/classes/org/enhydra/jdbc/informix/0000755000175000017500000000000010235647010024612 5ustar twernertwernerxapool-1.5.0-src/output/build/classes/org/enhydra/jdbc/informix/InformixConnectionHandle.class0000644000175000017500000000305210235647010032570 0ustar twernertwerner.E * +, -. / 0 1 23 4 5678 lockModeWaitIM(Lorg/enhydra/jdbc/informix/InformixPooledConnection;Ljava/util/Hashtable;I)VCodeLineNumberTableLocalVariableTablethis4Lorg/enhydra/jdbc/informix/InformixConnectionHandle; pooledCon4Lorg/enhydra/jdbc/informix/InformixPooledConnection;preparedStatementCacheLjava/util/Hashtable;preparedStmtCacheSizesetLockModeToWait(I)Vseconds Exceptions9execute(Ljava/lang/String;)VsqlLjava/lang/String;statLjava/sql/Statement; SourceFileInformixConnectionHandle.java : java/lang/StringBuffer ;SET LOCK MODE TO WAIT <= <> ?@ "#SET LOCK MODE TO NOT WAIT ABC "D2org/enhydra/jdbc/informix/InformixConnectionHandle2org/enhydra/jdbc/standard/StandardConnectionHandlejava/sql/SQLExceptionM(Lorg/enhydra/jdbc/standard/StandardPooledConnection;Ljava/util/Hashtable;I)V()Vappend,(Ljava/lang/String;)Ljava/lang/StringBuffer;(I)Ljava/lang/StringBuffer;toString()Ljava/lang/String;createStatement()Ljava/sql/Statement;java/sql/Statement(Ljava/lang/String;)Z! ] *+,*# $*    !?*9*Y  * * *"'( )&**+3-9/>1?? !!"#T* M,+ W45 6 $% &' !()xapool-1.5.0-src/output/build/classes/org/enhydra/jdbc/informix/InformixPooledConnection.class0000644000175000017500000000245410235647010032624 0ustar twernertwerner.1  ! " # $%&K(Ljavax/sql/ConnectionPoolDataSource;Ljava/lang/String;Ljava/lang/String;)VCodeLineNumberTableLocalVariableTablethis4Lorg/enhydra/jdbc/informix/InformixPooledConnection; dataSource$Ljavax/sql/ConnectionPoolDataSource;userLjava/lang/String;password Exceptions'newConnectionHandle()V SourceFileInformixPooledConnection.java:org/enhydra/jdbc/standard/StandardConnectionPoolDataSource (2org/enhydra/jdbc/informix/InformixConnectionHandle ) *+ ,- . /02org/enhydra/jdbc/informix/InformixPooledConnection2org/enhydra/jdbc/standard/StandardPooledConnectionjava/sql/SQLExceptionc(Lorg/enhydra/jdbc/standard/StandardConnectionPoolDataSource;Ljava/lang/String;Ljava/lang/String;)V()VCodeLineNumberTableLocalVariableTablethisW(Lorg/enhydra/jdbc/informix/InformixXADataSource;Ljava/lang/String;Ljava/lang/String;)VCodeLineNumberTableLocalVariableTablethis0Lorg/enhydra/jdbc/informix/InformixXAConnection; dataSource0Lorg/enhydra/jdbc/informix/InformixXADataSource;userLjava/lang/String;password Exceptions) SourceFileInformixXAConnection.java * +6org/enhydra/jdbc/informix/InformixXAStatefulConnection ,- . /01 23InformixXAConnection created4 56.org/enhydra/jdbc/informix/InformixXAConnection.org/enhydra/jdbc/standard/StandardXAConnectionjava/sql/SQLExceptionW(Lorg/enhydra/jdbc/standard/StandardXADataSource;Ljava/lang/String;Ljava/lang/String;)V()VCodeLineNumberTableLocalVariableTablethis0Lorg/enhydra/jdbc/informix/InformixXADataSource;getXAConnection()Ljavax/sql/XAConnection; Exceptions<>(Ljava/lang/String;Ljava/lang/String;)Ljavax/sql/XAConnection;userLjava/lang/String;passwordxac0Lorg/enhydra/jdbc/informix/InformixXAConnection;getPooledConnection()Ljavax/sql/PooledConnection;B(Ljava/lang/String;Ljava/lang/String;)Ljavax/sql/PooledConnection; SourceFileInformixXADataSource.java  =>>InformixXADataSource:getXAConnection(0) XA connection returned? @A  ! .org/enhydra/jdbc/informix/InformixXAConnection B CD>InformixXADataSource:getXAConnection(2) XA connection returnedRInformixConnectionPoolDataSource:getPooledConnection(0) return a pooled connection $&RInformixConnectionPoolDataSource:getPooledConnection(2) return a pooled connection2org/enhydra/jdbc/informix/InformixPooledConnection E.org/enhydra/jdbc/informix/InformixXADataSource.org/enhydra/jdbc/standard/StandardXADataSourcejava/sql/SQLExceptionlogLorg/enhydra/jdbc/util/Logger;org/enhydra/jdbc/util/Loggerdebug(Ljava/lang/Object;)VW(Lorg/enhydra/jdbc/informix/InformixXADataSource;Ljava/lang/String;Ljava/lang/String;)VconnectionCountIK(Ljavax/sql/ConnectionPoolDataSource;Ljava/lang/String;Ljava/lang/String;)V!/* D**** $ % t Y*+, N*Y ` * -, -./*    !  "#$%D* ***  6 7 $&V*Y*+, > ?  ! '(xapool-1.5.0-src/output/build/classes/org/enhydra/jdbc/informix/InformixXAStatefulConnection.class0000644000175000017500000000122710235647010033417 0ustar twernertwerner. H(Lorg/enhydra/jdbc/informix/InformixXADataSource;Ljava/sql/Connection;)VCodeLineNumberTableLocalVariableTablethis8Lorg/enhydra/jdbc/informix/InformixXAStatefulConnection; dataSource0Lorg/enhydra/jdbc/informix/InformixXADataSource;conLjava/sql/Connection; SourceFile!InformixXAStatefulConnection.java 6org/enhydra/jdbc/informix/InformixXAStatefulConnection6org/enhydra/jdbc/standard/StandardXAStatefulConnectionH(Lorg/enhydra/jdbc/standard/StandardXADataSource;Ljava/sql/Connection;)V!I*+, "#    xapool-1.5.0-src/output/build/classes/org/enhydra/jdbc/standard/0000755000175000017500000000000010235647011024560 5ustar twernertwernerxapool-1.5.0-src/output/build/classes/org/enhydra/jdbc/standard/StandardConnectionHandle.class0000644000175000017500000001632010235647010032504 0ustar twernertwerner. Q P P P P P P P? P      P       P - P   P  > P  B P   P P P  pooledCon4Lorg/enhydra/jdbc/standard/StandardPooledConnection;masterPrepStmtCacheLjava/util/Hashtable;preparedStmtCacheSizeIpreparedStatementCache Lorg/enhydra/jdbc/util/LRUCache;inUseclosedZ isReallyUsedM(Lorg/enhydra/jdbc/standard/StandardPooledConnection;Ljava/util/Hashtable;I)VCodeLineNumberTableLocalVariableTablethis4Lorg/enhydra/jdbc/standard/StandardConnectionHandle;setupPreparedStatementCache()V preInvoke Exceptions catchInvoke(Ljava/sql/SQLException;)VeLjava/sql/SQLException;closekeyLjava/lang/Object;keysLjava/util/Enumeration; returnToCache*(Ljava/lang/Object;Ljava/sql/Connection;)VtheCachetheConLjava/sql/Connection;value(Ljava/lang/Object;)VcheckPreparedCache3(Ljava/lang/String;III)Ljava/sql/PreparedStatement;objsqlLjava/lang/String;type concurrency holdabilityretLjava/sql/PreparedStatement; lookupKey1(Ljava/lang/String;I)Ljava/sql/PreparedStatement;autogeneratedkeyscreatePreparedStatementprepareStatement0(Ljava/lang/String;)Ljava/sql/PreparedStatement;2(Ljava/lang/String;II)Ljava/sql/PreparedStatement; resultSetTyperesultSetConcurrencyresultSetHoldabilityisClosed()Z prepareCall2(Ljava/lang/String;II)Ljava/sql/CallableStatement; SourceFileStandardConnectionHandle.java ^ XY ]\ RS TU VW  efjava/util/Hashtable ^ ZUjava/lang/StringBuffer ^f;StandardConnectionHandle:new StandardConnectionHandle with  prepared statement  x:StandardConnectionHandle:setupPreparedStatementCache startBStandardConnectionHandle:setupPreparedStatementCache return with 0 vConnection is null x org/enhydra/jdbc/util/LRUCache0org/enhydra/jdbc/standard/PreparedStatementCache ^ WStandardConnectionHandle:setupPreparedStatementCache preparedStatementCache.size(lru)=' ' $preparedStatementCache.size(cache)=' masterPrepStmtCache.size=' 8StandardConnectionHandle:setupPreparedStatementCache end [\java/sql/SQLExceptionConnection is closed ^StandardConnectionHandle:close p   rx  f  fAStandardConnectionHandle:close preparedStatementCache.size(lru)='   rs1StandardConnectionHandle:checkPreparedCache sql=''java/sql/PreparedStatement f z3org/enhydra/jdbc/standard/StandardPreparedStatement ^ 8StandardConnectionHandle:createPreparedStatement type =' zEStandardConnectionHandle:createPreparedStatement autogeneratedkeys =' /StandardConnectionHandle:prepareStatement sql=' gf yz ij 2org/enhydra/jdbc/standard/StandardConnectionHandle$org/enhydra/jdbc/core/CoreConnection2org/enhydra/jdbc/standard/StandardPooledConnectiongetPhysicalConnection()Ljava/sql/Connection;(Ljava/sql/Connection;)V dataSource:?:*+@:*AW*#W*+@:*#W*+@:BY*C:X_b-aJ":ALQX_bdoyb\ d klLS{ocd|}~WWW":}h- y`X* Y;+<NY+:*X*=:3>N-? :*+DN*AW*-#W*+DN*-#W *+DNBY*-CN-RX[-aJ!5<GLRX[]dn|  bH]klGG{ocd|}W!5q}h-z`T* YE<*+F*+G*+Ha!%(&3'8(E*b4TcdT|}T~WTWTWh-`m+* YI<*+Ja 26b +cd+|}+Wh-`4* YK+<*L*+MM*,N#+,-a>@#B,C-D2Fb -kl4cd4|}h-`*L*+M:*N -aRT UVXb4klcd|}WWh-z`*L*+M:*N -aacdegb>klcd|}WWWh-`/*,akb cdh-`*L*+O:*N-asuvwyb4klcd|}WWh-xapool-1.5.0-src/output/build/classes/org/enhydra/jdbc/standard/StandardPooledConnection.class0000644000175000017500000000754610235647010032545 0ustar twernertwerner. +c *d ef *gh i *j *k l m *n *op qrs et eu v wm +x yz { |} ~     c  *  x  dataSourcec(Lorg/enhydra/jdbc/standard/StandardConnectionPoolDataSource;Ljava/lang/String;Ljava/lang/String;)VCodeLineNumberTableLocalVariableTablethis4Lorg/enhydra/jdbc/standard/StandardPooledConnection;userLjava/lang/String;password Exceptions getConnection()Ljava/sql/Connection;newConnectionHandle()VcloseaddConnectionEventListener&(Ljavax/sql/ConnectionEventListener;)Vlistener#Ljavax/sql/ConnectionEventListener;removeConnectionEventListener closeEventobjLjava/lang/Object;celiIeventLjavax/sql/ConnectionEvent;connectionErrorOccurred(Ljavax/sql/ConnectionEvent;)VgetPhysicalConnection setLogger!(Lorg/enhydra/jdbc/util/Logger;)ValogtoString()Ljava/lang/String;sbLjava/lang/StringBuffer; SourceFileStandardPooledConnection.java 9H -. E /0java/util/Vector 9 34 12 5 IH GH 78,StandardPooledConnection:newConnectionHandle 2org/enhydra/jdbc/standard/StandardConnectionHandle 9 ]^ javax/sql/ConnectionEvent 9 !javax/sql/ConnectionEventListener X WXjava/lang/StringBufferStandardPooledConnection:  is closed =< 56 >  connection =< 2org/enhydra/jdbc/standard/StandardPooledConnectionjava/lang/Objectjavax/sql/PooledConnectionjava/sql/SQLException:org/enhydra/jdbc/standard/StandardConnectionPoolDataSource;(Ljava/lang/String;Ljava/lang/String;)Ljava/sql/Connection;(II)V()Zorg/enhydra/jdbc/util/Loggerdebug(Ljava/lang/Object;)VgetMasterPrepStmtCache()Ljava/util/Hashtable;getPreparedStmtCacheSize()IM(Lorg/enhydra/jdbc/standard/StandardPooledConnection;Ljava/util/Hashtable;I)Vjava/sql/Connectionjava/util/Hashtableremove&(Ljava/lang/Object;)Ljava/lang/Object; addElement removeElement(Ljava/lang/Object;)Z(Ljavax/sql/PooledConnection;)Vsize elementAt(I)Ljava/lang/Object;connectionClosedappend,(Ljava/lang/String;)Ljava/lang/StringBuffer;(Z)Ljava/lang/StringBuffer;,(Ljava/lang/Object;)Ljava/lang/StringBuffer;!*+,-./012345678 9:;y!**+*+,-*Y<?@ AB C=*!>?!-.!@A!BACD!EF;[!** * * *<LNORS= !>?CDGH;V$*  *Y***<W X#]= $>?IH;N***W<` ab= >?CDJK;A *+< ef= >? LMNK;B *+W< i j= >? LMOH;4Y*L=* *N-:+۱<q stu%w-s3z=4PQ%RM (ST4>? +UVWX;+=* *N-:+۱< $*=4PQRM(ST+>?+UVYF;/*<= >?Z[;>*+ < =>?\8]^;TY L+!"W+Y #"*$%&"'"W+Y ("*)&"'"W+'</O=T>?L_`ab././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootxapool-1.5.0-src/output/build/classes/org/enhydra/jdbc/standard/StandardConnectionPoolDataSource.classxapool-1.5.0-src/output/build/classes/org/enhydra/jdbc/standard/StandardConnectionPoolDataSource.cla0000644000175000017500000000560410235647010033632 0ustar twernertwerner. "KL K !M !N !OP QR !S !T !UVW X Y Z [ \] \^_ `a Kb cd e fg hi "hjklmasterPrepStmtCacheLjava/util/Hashtable;preparedStmtCacheSizeIDEFAULT_PREPAREDSTMTCACHESIZE ConstantValue()VCodeLineNumberTableLocalVariableTablethis EF prepared stmt cache size =<:org/enhydra/jdbc/standard/StandardConnectionPoolDataSource,org/enhydra/jdbc/standard/StandardDataSource"javax/sql/ConnectionPoolDataSourcejava/sql/SQLExceptionlogLorg/enhydra/jdbc/util/Logger;org/enhydra/jdbc/util/Loggerdebug(Ljava/lang/Object;)Vc(Lorg/enhydra/jdbc/standard/StandardConnectionPoolDataSource;Ljava/lang/String;Ljava/lang/String;)V setLogger!(Lorg/enhydra/jdbc/util/Logger;)Vclearelements()Ljava/util/Enumeration;java/util/EnumerationhasMoreElements()Z nextElement()Ljava/lang/Object;resizeappend,(Ljava/lang/String;)Ljava/lang/StringBuffer;size(I)Ljava/lang/StringBuffer;!!"#$%&'(')*+,-L**Y*../01/ 0123-D*** * . 7 9/ 0145!26-r*  Y*+,N-*-.C EGH/*017898 :;45<=-/*.L/ 01>?-/*.S/ 01@A-8** *$*M,,.Z[ \^_'`7c/ BC8018D'EF-`YL+W+Y*W+Y*W+* W+.fgh2iRj[l/`01XGHIJxapool-1.5.0-src/output/build/classes/org/enhydra/jdbc/standard/StandardDataSource.class0000644000175000017500000001415310235647010031325 0ustar twernertwerner.0 Z Y Y Y Y Y  Y Y G Y Y Y    Y   $ $  $ #  Y  # 3^ Y 5 3` Y Y Y Y Y a 3  Y Y Y Y Y Y Y $ Z Y GdriverLjava/sql/Driver; driverNameLjava/lang/String;urltransIsolationI loadedFromCCLZ()VCodeLineNumberTableLocalVariableTablethis.Lorg/enhydra/jdbc/standard/StandardDataSource;(Ljava/sql/Driver;)Vdrv Exceptions getDriverName()Ljava/lang/String;getUrl setDriverName(Ljava/lang/String;)VsetUrlsetTransactionIsolation(I)VlevelgetTransactionIsolation()I getConnection()Ljava/sql/Connection;;(Ljava/lang/String;Ljava/lang/String;)Ljava/sql/Connection;e2Ljava/lang/Exception;eLjava/sql/SQLException;upretLjava/sql/Connection;propLjava/util/Properties; getReference()Ljavax/naming/Reference;refLjavax/naming/Reference;getObjectInstanced(Ljava/lang/Object;Ljavax/naming/Name;Ljavax/naming/Context;Ljava/util/Hashtable;)Ljava/lang/Object;refObjLjava/lang/Object;nameLjavax/naming/Name;nameCtxLjavax/naming/Context;envLjava/util/Hashtable;equals(Ljava/lang/Object;)ZobjtoStringsbLjava/lang/StringBuffer;hashCode SourceFileStandardDataSource.java ef cd \] ^_ `_ aborg/enhydra/jdbc/util/Loggerorg.enhydra.jdbc.xapool e   p _ _ z|java/util/Propertiesuser password   java/sql/Driver   AStandardDataSource:getConnection a new driver instance is created   java/lang/Exception   java/sql/SQLExceptionjava/lang/StringBufferError trying to load driver:  : p p es  z xy uvJStandardDataSource:getConnection Connection from DriverManager is returnedCannot get connection for URL javax/naming/Reference ejavax/naming/StringRefAddr op e  qp p  p description !p loginTimeout "y# $/StandardDataSource:getReference object returned %&' ( java/lang/String rs ts )s *s +s ,- .vStandardDataSource:  driver=< />  url=< user=< y,org/enhydra/jdbc/standard/StandardDataSource$org/enhydra/jdbc/core/CoreDataSourcejavax/sql/DataSourcejavax/naming/NamingException%org/apache/commons/logging/LogFactorygetLog4(Ljava/lang/String;)Lorg/apache/commons/logging/Log;#(Lorg/apache/commons/logging/Log;)V setLogger!(Lorg/enhydra/jdbc/util/Logger;)Vjava/lang/ObjectgetClass()Ljava/lang/Class;java/lang/ClassgetNameput8(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;forName%(Ljava/lang/String;)Ljava/lang/Class; newInstance()Ljava/lang/Object;logLorg/enhydra/jdbc/util/Logger;debug(Ljava/lang/Object;)Vjava/lang/Thread currentThread()Ljava/lang/Thread;getContextClassLoader()Ljava/lang/ClassLoader;=(Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;append,(Ljava/lang/String;)Ljava/lang/StringBuffer; getMessageconnect?(Ljava/lang/String;Ljava/util/Properties;)Ljava/sql/Connection;java/sql/DriverManagerjava/sql/Connection9(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V'(Ljava/lang/String;Ljava/lang/String;)Vadd(Ljavax/naming/RefAddr;)VgetUser getPasswordgetDescriptiongetLoginTimeoutjava/lang/Integer(I)Ljava/lang/String;get*(Ljava/lang/String;)Ljavax/naming/RefAddr;javax/naming/RefAddr getContentsetUser setPasswordsetDescriptionparseInt(Ljava/lang/String;)IsetLoginTimeout,(Ljava/lang/Object;)Ljava/lang/StringBuffer;!YZ[\]^_`_abcdefgv0*******Y h"?8 @ABCD/Ei 0jkelgi%* *+*+*Y hHI JK$Li%jk%m]n#opg/*hSi jkqpg/*h[i jkrsgV*+ *+*hd efpijk^_n#tsg>*+h wxijk`_uvg>*h ijkwbxyg/*hi jk!z{g7 ***hi  jkn#!z|gNY:+ +W, ,W**t****R:** !"*0:#Y$Y%&'*'(')'*+***,N *-N*.6 -/*00:#Y$Y%1'*'('2'*+-6UXZwz#hv %/6GLUXZrwz|i\ |+}~ZM~ab+jk__ n#g3Y**4L+5Y6*789+5Y:*;89+5Y*<89+5Y*=89+5Y>*?89+5Y@*AB89+5YC*.B89*D+h* (9J[lijkng+3:*6EFGH*:EFGI*EFGJ*EFGK*>EFGL*@EFGMN*CEFGMO*h& ( 9 J [ oi>jkngS*++h  ijkpg}$Y%L+P'W+$Y%Q'*RS'*'W+$Y%T'*'S'*'W+$Y%U'*'S'*'W+*V'W+*h234/5O6o7x9i}jkuyg2*WXh=i jkxapool-1.5.0-src/output/build/classes/org/enhydra/jdbc/standard/StandardXAConnection.class0000644000175000017500000003270510235647010031626 0ustar twernertwerner.  ` w w w w  w   w  w     w!"# $ % w& '( ) ) * +, - ./ 0* 1 w2 w34 (56 (7 (89 (:; (*< 1= >?@ 6* 1A .B .C DE FG H I J KLM D*N F* wO PQ R 0S T U wV V W +X wYZ +[ \] w^_` a bc )de fg whijklmno (p )qr stu )vwxyz 0{|}~ {  0    6 0   w    w  w ( * * *curCon8Lorg/enhydra/jdbc/standard/StandardXAStatefulConnection;commitOnPrepareZisClosed timeoutSecsI timeoutPeriodJ nextTimeout timerThreadLjava/lang/Thread;transactionManager&Ljavax/transaction/TransactionManager;connectionHandle6Lorg/enhydra/jdbc/standard/StandardXAConnectionHandle; xaDataSource0Lorg/enhydra/jdbc/standard/StandardXADataSource;thisAutoCommitW(Lorg/enhydra/jdbc/standard/StandardXADataSource;Ljava/lang/String;Ljava/lang/String;)VCodeLineNumberTableLocalVariableTablethis0Lorg/enhydra/jdbc/standard/StandardXAConnection; dataSourceuserLjava/lang/String;password Exceptions getXAResource#()Ljavax/transaction/xa/XAResource; getConnection()Ljava/sql/Connection;newConnectionHandle()VsetTransactionManager)(Ljavax/transaction/TransactionManager;)VtmclosedoStart(Ljavax/transaction/xa/Xid;I)VeLjava/lang/Exception;se#Ljavax/transaction/SystemException;Ljava/sql/SQLException;xidLjavax/transaction/xa/Xid;flagsxadstartendstateconstatecheckPreparedStateT(Ljavax/transaction/xa/Xid;)Lorg/enhydra/jdbc/standard/StandardXAStatefulConnection;prepare(Ljavax/transaction/xa/Xid;)Icommit(Ljavax/transaction/xa/Xid;Z)V"Ljavax/transaction/xa/XAException;onePhaserollback(Ljavax/transaction/xa/Xid;)VisSameRM$(Ljavax/transaction/xa/XAResource;)Zxares!Ljavax/transaction/xa/XAResource;xacforgetrecover(I)[Ljavax/transaction/xa/Xid;flagretvaljavax/transaction/xa/Xid;setTransactionTimeout(I)ZsecondsgetTransactionTimeout()IsetCommitOnPrepare(Z)VgetCommitOnPrepare()Zrun Ljava/lang/InterruptedException;curTime getReference()Ljavax/naming/Reference;refLjavax/naming/Reference;toString()Ljava/lang/String;sbLjava/lang/StringBuffer; SourceFileStandardXAConnection.java  6org/enhydra/jdbc/standard/StandardXAStatefulConnection    StandardXAConnection created  "StandardXAConnection:getConnection  6StandardXAConnection:getConnection return a connection4org/enhydra/jdbc/standard/StandardXAConnectionHandle   +StandardXAConnection:close the XAConnection      java/lang/StringBuffer "StandardXAConnection:doStart xid='   ' flags=' ' javax/transaction/xa/XAException  java/lang/Exception Exception :     error while gettting connection +StandardXAConnection:doStart curCon is null    !javax/transaction/SystemExceptionjava/sql/SQLException       1StandardXAConnection:dostart before processToWait0StandardXAConnection:dostart after processToWait  UStandardXAConnection:start associate the current connection with a global transaction StandardXAConnection:endStandardXAConnection:end xid='  'StandardXAConnection:checkPreparedState IStandardXAConnection:checkPrepareState Exception on prepare, rolling back 8StandardXAConnection:prepare prepare to perform a commit ,StandardXAConnection:commit perform a commit'StandardXAConnection:commit case(state)HStandardXAConnection:commit try to commit a connection (STATUS_PREPARED)(StandardXAConnection:commit commit is okFStandardXAConnection:commit try to commit a connection (STATUS_ACTIVE),StandardXAConnection:commit UNKNOWN STATUS!:.StandardXAConnection:commit setAutoCommit to '  1StandardXAConnection:commit setAutoCommit problem StandardXAConnection:rollbackCStandardXAConnection:rollback try to perform the rollback operation 4StandardXAConnection:rollback performed the rollback0StandardXAConnection:rollback setAutoCommit to '3StandardXAConnection:rollback setAutoCommit problemStandardXAConnection:isSameRM &StandardXAConnection:isSameRM isSameRM.org/enhydra/jdbc/standard/StandardXAConnection*StandardXAConnection:isSameRM not isSameRM9StandardXAConnection:isSameRM isSameRM (equal datasource)AStandardXAConnection:isSameRM not isSameRM (not equal datasource)+StandardXAConnection:forget forget with Xid*StandardXAConnection:recover recover flag=  java/lang/InterruptedException   BStandardXAConnection:getReference return a reference of the objectjavax/naming/Reference   javax/naming/StringRefAddr      StandardXAConnection:  commit on prepare =<>  is closed =< this autoCommit =< listeners size =<  next timeOut =<  timeOut period =< timeOut secs =< transaction manager=<2org/enhydra/jdbc/standard/StandardPooledConnectionjavax/sql/XAConnectionjavax/transaction/xa/XAResourcejavax/naming/Referenceablejava/lang/Runnablejavax/naming/NamingExceptionc(Lorg/enhydra/jdbc/standard/StandardConnectionPoolDataSource;Ljava/lang/String;Ljava/lang/String;)VconLjava/sql/Connection;H(Lorg/enhydra/jdbc/standard/StandardXADataSource;Ljava/sql/Connection;)V.org/enhydra/jdbc/standard/StandardXADataSourcelogLorg/enhydra/jdbc/util/Logger;org/enhydra/jdbc/util/Loggerdebug(Ljava/lang/Object;)V*+ !* * 3* $* ** !W=*"#/** * ** $!W* **%*&** '> ".CQ\h} F!M*(Y)*++,-+./+0 + 1Y23 4}*5"N1Y(Y)7+-8+09*YN* "*"* :*"* ;-ç :-**+< ** * G** ** "N*(Y)=+-,0->*? *N-@3?-A8-A*,-B%**CB:1YE9:1YG9*HL* I*HhaJ*' ** J'*K* J*'** J'* +L* M* *NO*P+Qf*RS *5*RT $:1Y(Y)7+8+09*Y:*P+* UWç :* V ELO6u64DGDVYF6&9<<A<8+/9ELOPnu|   #%&!(&)4-D2G/I1V9Y7[8h;o<>@ADFKLMOQRSVTUW&X6ZD\L]\ PI [ MMM>1!b*W *+X* g ijl 1! *Y *(Y)Z++,-+./+0 + 1Y2*+@AEIFGJL>  $1f*t *+u*v +w*x +wM*,y*z *{ 6 O PQ R"T)V5W7Y<[J]V_Xadc ff<*1h$*| + 1Y2*+mm nor#t$$1C*(Y)}+.0 ~ 1Y2M*M,}-79A CC9 1?*H /*H >*N /*N 6h*YL*' *+çM+,L*&**&L+I@*'**'N-!*8<Q]`6Z !")*189<=AENQ]`ae4"=aE hM* Y**L+Y*+Y*+ #7KM#*a(Y)L++W+(Y)+*Nj+0+W+(Y)+*&j+0+W+(Y)+*j+0+W+(Y)+*#.+0+W+(Y)+*'+0+W+(Y)+*+0+W+(Y)+*H.+0+W+(Y)+*,+0+W+*+W+*+W* +* +W*+*+W+*$+W+0J/Oo*1=DP\aY    xapool-1.5.0-src/output/build/classes/org/enhydra/jdbc/standard/StandardXADataSource.class0000644000175000017500000003167510235647010031566 0ustar twernertwerner.  ! " # $' %& ' ()? * +,- ./ 0 12 34 5 6 789 : ; < =>? @ AB C DE F G H I J KL M N O P QR QSTU 8 V 8W 7X 8Y 8Z [\]^ _ `a b cd e fg fh fij P 7kl 8mn op 7qr st u 7v w x y z{ 7| [} 7~    zB j 8   7   [      z   zZ 8    ZminConImaxCondeadLockMaxWaitJfreeConnectionsLjava/util/Vector;xidConnectionsLjava/util/Hashtable;deadConnectionsconnectionCountdeadLockRetryWaittransactionManager&Ljavax/transaction/TransactionManager;DEFAULT_MIN_CON ConstantValue2DEFAULT_MAX_CONDEFAULT_DEADLOCKMAXWAITDEFAULT_DEADLOCKRETRYWAIT'()VCodeLineNumberTableLocalVariableTablethis0Lorg/enhydra/jdbc/standard/StandardXADataSource;getConnectionCount()IgetXidConnections()Ljava/util/Hashtable;getXAConnection()Ljavax/sql/XAConnection; Exceptions>(Ljava/lang/String;Ljava/lang/String;)Ljavax/sql/XAConnection;userLjava/lang/String;passwordxac0Lorg/enhydra/jdbc/standard/StandardXAConnection;setTransactionManager)(Ljavax/transaction/TransactionManager;)VtmgetTransactionManager(()Ljavax/transaction/TransactionManager;setUser(Ljava/lang/String;)V setPasswordsetUrlurl setDriverName driverName resetCacheeLjava/sql/SQLException;xasc8Lorg/enhydra/jdbc/standard/StandardXAStatefulConnection;enumLjava/util/Enumeration;connectionClosedkeyLjava/lang/Object;curcons connIteratorLjava/util/Iterator; getXidCountocountrecover()[Ljavax/transaction/xa/Xid; nodeCountxidsjavax/transaction/xa/Xid;ifreeConnection(Ljavax/transaction/xa/Xid;Z)VidLjavax/transaction/xa/Xid; placeAtStartZ checkTimeouts(J)JcurTime nextTimeout(Ljavax/transaction/xa/Xid;)Vxid getConnectionU(Ljavax/transaction/xa/Xid;Z)Lorg/enhydra/jdbc/standard/StandardXAStatefulConnection;mustFindgetFreeConnection:()Lorg/enhydra/jdbc/standard/StandardXAStatefulConnection;conLjava/sql/Connection; freeCountcloseFreeConnection setMinCon(I)Vmin setMaxConmaxsetDeadLockMaxWait(J)VdeadLock getMinCon getMaxCongetDeadLockMaxWait()JgetAllConnections processToWait Ljava/lang/InterruptedException; currentWaitdumpsetDeadLockRetryWaitgetDeadLockRetryWaittoString()Ljava/lang/String;sbLjava/lang/StringBuffer; SourceFileStandardXADataSource.java java/util/Vector  java/util/Hashtable  org/enhydra/jdbc/util/Loggerorg.enhydra.jdbc.xapool   StandardXADataSource is created >StandardXADataSource:getXAConnection(0) XA connection returned 4StandardXADataSource:getXAConnection(user, password).org/enhydra/jdbc/standard/StandardXAConnection  *StandardXADataSource:setTransactionManagerStandardXADataSource:setUser    StandardXADataSource:setPassword    StandardXADataSource:resetCache     6org/enhydra/jdbc/standard/StandardXAStatefulConnectionjava/lang/StringBuffer3StandardXADataSource:resetCache closing Connection:     java/sql/SQLException9StandardXADataSource:resetCache Error closing connection:  %StandardXADataSource:connectionClosed  ?StandardXADataSource:connectionClosed close physical connection    @StandardXADataSource:connectionClosed close any free connections 2StandardXADataSource:getXidCount return XidCount=< > javax/transaction/xa/Xid #StandardXADataSource:freeConnection AStandardXADataSource:freeConnection remove id from xidConnections          "StandardXADataSource:checkTimeouts  $StandardXADataSource:checkTimeouts (/ ) xid = -StandardXADataSource:checkTimeouts cur.xid =  javax/transaction/xa/XAException (StandardXADataSource:getConnection (xid= , mustFind= )XID: ?StandardXADataSource:getConnection (StatefulConnection is null) PStandardXADataSource:getConnection return connection associated with a given XID&StandardXADataSource:getFreeConnectiondStandardXADataSource:getFreeConnection there are no free connections, get a new database connection    MStandardXADataSource:getFreeConnection return a connection from the free list:StandardXADataSource:getFreeConnection setAutoCommit(true) WStandardXADataSource:getFreeConnection ERROR: Failed while autocommiting a connection: 9StandardXADataSource:closeFreeConnection empty method TBD"StandardXADataSource:processToWait      java/lang/InterruptedExceptionNStandardXADataSource:processToWait ERROR: Failed while waiting for an object: java/lang/ExceptionSStandardXADataSource:processToWait ERROR : impossible to obtain a new xa connection freeConnection:<xidConnection:<StandardXADataSource:  connection count=<>  number of dead connection=< dead lock max wait=<  dead lock retry wait=<  driver=< driver name=< # number of *free* connections=< max con=< min con=< prepared stmt cache size=<  transaction manager=< xid connection size=<.org/enhydra/jdbc/standard/StandardXADataSource:org/enhydra/jdbc/standard/StandardConnectionPoolDataSourcejavax/sql/XADataSource(II)V(IF)V%org/apache/commons/logging/LogFactorygetLog4(Ljava/lang/String;)Lorg/apache/commons/logging/Log;#(Lorg/apache/commons/logging/Log;)VlogLorg/enhydra/jdbc/util/Logger;debug(Ljava/lang/Object;)VW(Lorg/enhydra/jdbc/standard/StandardXADataSource;Ljava/lang/String;Ljava/lang/String;)V setLogger!(Lorg/enhydra/jdbc/util/Logger;)VgetUserjava/lang/Stringequals(Ljava/lang/Object;)Z getPasswordgetUrl getDriverNameclone()Ljava/lang/Object;putAll(Ljava/util/Map;)Velements()Ljava/util/Enumeration;java/util/EnumerationhasMoreElements()Z nextElementappend,(Ljava/lang/String;)Ljava/lang/StringBuffer;,(Ljava/lang/Object;)Ljava/lang/StringBuffer;java/sql/Connectioncloseerror removeElementkeysremove&(Ljava/lang/Object;)Ljava/lang/Object;iterator()Ljava/util/Iterator;java/util/IteratorhasNextnextgetState(I)Ljava/lang/StringBuffer;get containsKeysetStatecontainsinsertElementAt(Ljava/lang/Object;I)V addElementjava/lang/ObjectnotifytimeoutrollbacktimedOutsize elementAt(I)Ljava/lang/Object;(Z)Ljava/lang/StringBuffer;;(Ljava/lang/String;Ljava/lang/String;)Ljava/sql/Connection;H(Lorg/enhydra/jdbc/standard/StandardXADataSource;Ljava/sql/Connection;)V lastElementremoveElementAt setAutoCommit(Z)Vwait(J)Ljava/lang/StringBuffer;driverLjava/sql/Driver;preparedStmtCacheSize! !_***2*** * Y* *Y*h*Y*. G8 HIJK"L2NEQUR^S _/*V /*Z D**** a c @!0*Y*+,N-* !-*"*Y`-m npq$r.s*000@K*#*+ w xy/* | x4*$+ *%+*%+*%& *+'*( */344x4*)+ **+**+**& *++*( */344k++ *,+*,+*,& *+-*(!&*++` + *.+*.& *+/*( @"*0**12*2*3* 4L+5`+67M*8Y9:;,<=>,<?!N*8Y9A;,<=>B* ,CW=cf@6 "*3=Zcfg*g=P*g **D*Yd*v*EL+5/+6M*,F7N- -<?*G* HM,I(,J7N-<?,K*LձF "+2>BKW_hr{>2">r"k_.@Z<*MM,5),6N-7:N N*8Y9O;PQ;>&   39X4 ZX PR*R<SM>*M:546:7:N N,TS,*    (/BPH(%/RM H F=!&*U*+VN-7:*+FW*W*2+X3Y* Z8* ['* \*2+FW<?:*]nx{@F+ ,-/!0*35><@HALBYEeJnLxO{M}QS>}pj { B*M:5g6:7:^ *^ <_`*Ta#^ ^! ! ^B!6 \] _`a%c9iCkImVt`upzy>X%Q{{y p@")*b=* c* dN-7:`o*8Y9e;Pf;* cPg;+=>*8Y9h;T=>+Ti`jYjkl:  %-0b4}%w j *8Y9l;+=m;no;>*+VN*8Y9p;-=>-7: **q*+rjYk jYk*s6 (1KQUZchrw41\Q<j C*tL* c=&*u***vN7Y*-wL$* xN-7L* dy+ ^+`*z*{+<|N*8Y9};-=>B+dwz@N   -:BGQV[dmwz{>- B{ @8 *~    >*   >*    >* /* /* /* :** c` !*<*q**Q*G**YM**,çN,-M*8Y9;,=>B*a<** Y/9<<?<+AD>  '+/ 7!A&D"E#_'k)v*, E vx<* c2*8Y9;* d;Q;>*ML+5-*8Y9;+6;Q;>б/ 06/<5D6M8w; :D3x >*  >?/* B :8Y9L+;W+8Y9;*P;>;W*2&+8Y9;*2P;>;W+8Y9;*;>;W+8Y9;* ;>;W*&+8Y9;*;;>;W+8Y9;*;;>;W* &+8Y9;* cP;>;W+8Y9;*P;>;W+8Y9;*P;>;W+8Y9;*P;>;W+8Y9;* =;>;W+8Y9;*P;>;W+*;W+>NFGH/I6JYKyLMNOPQ R-SMTmUVWXxapool-1.5.0-src/output/build/classes/org/enhydra/jdbc/standard/StandardXAStatefulConnection.class0000644000175000017500000000444110235647010033332 0ustar twernertwerner.v #E "F "G "H "I "J KLM NOP EQ R STU VWXY "Z [\] "^_`a "b cd "e fghnextIdIidconLjava/sql/Connection;state dataSource0Lorg/enhydra/jdbc/standard/StandardXADataSource;xidLjavax/transaction/xa/Xid;commitOnPrepareZtimeoutJtimedOutH(Lorg/enhydra/jdbc/standard/StandardXADataSource;Ljava/sql/Connection;)VCodeLineNumberTableLocalVariableTablethis8Lorg/enhydra/jdbc/standard/StandardXAStatefulConnection;setState(I)VnewStategetState()ItoString()Ljava/lang/String;sbLjava/lang/StringBuffer; SourceFile!StandardXAStatefulConnection.java 3i '( *+ $% &% )%j kl$StandardXAStatefulConnection createdm nojava/lang/StringBuffer;StandardXAStatefulConnection:setState Stateful connection: pq pr (state before=) ?@ (state after=StandardXAStatefulConnection:  commit on prepare =< ./ ps>  timed out =< 2/ id =< state =< time out =< 01 pt xid =< ,- pu6org/enhydra/jdbc/standard/StandardXAStatefulConnectionjava/lang/Object()V.org/enhydra/jdbc/standard/StandardXADataSourcelogLorg/enhydra/jdbc/util/Logger;org/enhydra/jdbc/util/Loggerdebug(Ljava/lang/Object;)Vappend,(Ljava/lang/String;)Ljava/lang/StringBuffer;(I)Ljava/lang/StringBuffer;(Z)Ljava/lang/StringBuffer;(J)Ljava/lang/StringBuffer;,(Ljava/lang/Object;)Ljava/lang/StringBuffer;!"# $%&%'()%*+,-./012/345+**,*+*`Y*+ 645 678!9*:7 +89+*++'( :;5h* Y  * *  ** Y  * *  6@1F6GgM7h89h<%=>5/*6P7 89?@5(Ի Y L+ W+ Y  *  W+ Y  *  W+ Y  *  W+ Y  *  W+ Y  *  W+ Y  * !  W+6& TUV/WOXoYZ[]789ABCDxapool-1.5.0-src/output/build/classes/org/enhydra/jdbc/standard/StandardXAConnectionHandle.class0000644000175000017500000002716710235647010032750 0ustar twernertwerner.n r q q q q q q r   q  q     q q   q r ( r r q  2 q  q   q q  q  q q   F J J N R R U W q !"#$%& N' a( ) *+,-./0 1 23 q45678resetTxonResumeZglobalTransactiontransactionManager&Ljavax/transaction/TransactionManager;txLjavax/transaction/Transaction;xacon0Lorg/enhydra/jdbc/standard/StandardXAConnection;thisAutoCommito(Lorg/enhydra/jdbc/standard/StandardXAConnection;Ljava/util/Hashtable;ILjavax/transaction/TransactionManager;)VCodeLineNumberTableLocalVariableTablethis6Lorg/enhydra/jdbc/standard/StandardXAConnectionHandle; pooledConpreparedStatementCacheLjava/util/Hashtable;preparedStmtCacheSizeItmsetTransactionManager)(Ljavax/transaction/TransactionManager;)Vclose()Vttx ExceptionssetGlobalTransaction(Z)Vsetting setAutoCommit autoCommitcommitrollbackcheckPreparedCacheE(Ljava/lang/String;IIILjava/lang/Object;)Ljava/sql/PreparedStatement;eLjava/sql/SQLException;objLjava/lang/Object;sqlLjava/lang/String;type concurrency holdability lookupKeyretLjava/sql/PreparedStatement;C(Ljava/lang/String;ILjava/lang/Object;)Ljava/sql/PreparedStatement;autogeneratedkeysprepareStatement0(Ljava/lang/String;)Ljava/sql/PreparedStatement;2(Ljava/lang/String;II)Ljava/sql/PreparedStatement; resultSetTyperesultSetConcurrency3(Ljava/lang/String;III)Ljava/sql/PreparedStatement;n%Ljavax/transaction/RollbackException;ntx#Ljavax/transaction/SystemException; Ljava/lang/NullPointerException;resultSetHoldability1(Ljava/lang/String;I)Ljava/sql/PreparedStatement;autoGeneratedKeys2(Ljava/lang/String;[I)Ljava/sql/PreparedStatement; columnIndexes[IC(Ljava/lang/String;[Ljava/lang/String;)Ljava/sql/PreparedStatement; columnNames[Ljava/lang/String; prepareCall2(Ljava/lang/String;II)Ljava/sql/CallableStatement;0(Ljava/lang/String;)Ljava/sql/CallableStatement;3(Ljava/lang/String;III)Ljava/sql/CallableStatement;createStatement()Ljava/sql/Statement;(II)Ljava/sql/Statement;(III)Ljava/sql/Statement;getTransaction!()Ljavax/transaction/Transaction;toString()Ljava/lang/String;sbLjava/lang/StringBuffer; SourceFileStandardXAConnectionHandle.java }9 st |t z{ vw: ;<= >? xy  StandardXAConnectionHandle:close@ ABjava/lang/StringBuffer }4StandardXAConnectionHandle:close globalTransaction=' CD ut CE' con.getAutoCommit=' FGH IJ' ttx=' CK' 8StandardXAConnectionHandle:close rollback the connection 0StandardXAConnectionHandle:close do nothing else Lt:StandardXAConnectionHandle:close AFTER globalTransaction='>StandardXAConnectionHandle:setGlobalTransaction gTransaction=' MN OP^StandardXAConnectionHandle:setGlobalTransaction con is null before setupPreparedStatementCache QBdStandardXAConnectionHandle:setGlobalTransaction con is *NOT* null before setupPreparedStatementCache RJjava/sql/SQLExceptionXStandardXAConnectionHandle:setAutoCommit This connection is part of a global transaction }SQStandardXAConnectionHandle:commit:This connection is part of a global transaction SStandardXAConnectionHandle:rollback:This connection is part of a global transaction TU VW=StandardXAConnectionHandle:checkPreparedCache object is foundjava/sql/PreparedStatement X Y ZW [\ ]^CStandardXAConnectionHandle:checkPreparedCache object is *NOT* foundEStandardXAConnectionHandle:checkPreparedCache object the cache is out5StandardXAConnectionHandle:checkPreparedCache pstmt='_ Y 4StandardXAConnectionHandle:prepareStatement tx==null AStandardXAConnectionHandle:prepareStatement (found a transaction) `ab cd#javax/transaction/RollbackExceptionGStandardXAConnectionHandle:prepareStatemnet enlistResource exception : BStandardXAConnectionHandle:prepareStatement (no transaction found)!javax/transaction/SystemException eFStandardXAConnectionHandle:prepareStatement getTransaction exception: java/lang/NullPointerExceptionSStandardXAConnectionHandle:prepareStatement should not be used outside an EJBServer4StandardXAConnectionHandle:prepareStatement tx!=null5org/enhydra/jdbc/standard/StandardXAPreparedStatement }f }g'java/lang/UnsupportedOperationException5org/enhydra/jdbc/standard/StandardXACallableStatement 3StandardXAConnectionHandle:createStatement tx==null@StandardXAConnectionHandle:createStatement (found a transaction)EStandardXAConnectionHandle:createStatement enlistResource exception: AStandardXAConnectionHandle:createStatement (no transaction found)EStandardXAConnectionHandle:createStatement getTransaction exception: TStandardXAConnectionHandle:createStatement should not be used outside an EJBServer: -org/enhydra/jdbc/standard/StandardXAStatement }hiDStandardXAConnectionHandle:getTransaction (null transaction manager)StandardXAConnectionHandle:  global transaction =<>  is really used =< this autoCommit =< in use size =< jk Cl' master prepared stmt cache size =< m transaction =< connection =<4org/enhydra/jdbc/standard/StandardXAConnectionHandle2org/enhydra/jdbc/standard/StandardConnectionHandleM(Lorg/enhydra/jdbc/standard/StandardPooledConnection;Ljava/util/Hashtable;I)V.org/enhydra/jdbc/standard/StandardXAConnection dataSource*+ >?w!+* L* * * Y**+ *)+%* *** * ** Y**+ 2 BE FGNP^QgSpTVWX`y(`* Y  ***!"**#$ *% *&*'& gk$l/m6nBqKtRu_w``t(W* (Y)**'z{|}t(L* (Y+**, (L* (Y-**. (  :*/v*/0:C*1 2:3:*+4:*/5W*67W#*8 *+4:*67W*9 *+4:* Y:; *14(N #*146AKZcn}\ 6 e( `:*/l*/-0:>*1 2:3 :*+<:*/-5W*6-7W*8 *+<:*6-7W*9 *+<:* Y:; )03(N ")035=FT]es|H5\(= *+= (Q *+=*   (* *> *?:`*@ * **AB*A*C* *DEW/:* YGH *I ):K(Y YLM*:O(YP**Q *RY*+SARUFJNj$*5<A!R'U#W$u'x)1,-.62458?@\ Wky$(* *> *?N-_*@ *- **AB*A*C* *DEW/:* YGH *I &N-K(Y YL-M*N-O(YP**Q *RY*+T>ORF~JNjJKNOP"R'S2T9U>XO^RZT[r^u`~hcdemikloqrHTiy"(FUYV| (FUYV (U WY*+X*   (A WY*+X (`WY*+X4(2*Y (F*Y (* *Z *?:`*[ * **AB*A*C* *DEW/:* Y\H *] $:(Y Y^M*$:(Y Y_`**aY*bARUFJN^$*5<ARUWuxRWky(e!L**cL *d + !yJU YL+eW+ Yf*gW+ Yh*gW+ Yi*gW+ Yj*6klgW+ Ym*nklgW+ Yo* gW+ Yp*;gW+* /Ooxapool-1.5.0-src/output/build/classes/org/enhydra/jdbc/standard/PreparedStatementCache.class0000644000175000017500000000256210235647011032167 0ustar twernertwerner.J & '( )* + ,- ./ 0 123 ,04 567 189:(I)VCodeLineNumberTableLocalVariableTablethis2Lorg/enhydra/jdbc/standard/PreparedStatementCache;maxSizeI cleanupObject(Ljava/lang/Object;)VeLjava/sql/SQLException;objLjava/lang/Object; SourceFilePreparedStatementCache.java  ;<java/lang/StringBuffer =,PreparedStatementCache:cleanupObject class=' >?@ AB >C' DEF GBPreparedStatementCache:cleanupObject close a PreparedStatement o='java/sql/PreparedStatement H=java/sql/SQLExceptionJPreparedStatementCache:cleanupObject problem to closea PreparedStatement: I0org/enhydra/jdbc/standard/PreparedStatementCacheorg/enhydra/jdbc/util/LRUCachelogLorg/enhydra/jdbc/util/Logger;()Vappend,(Ljava/lang/String;)Ljava/lang/StringBuffer;java/lang/ObjectgetClass()Ljava/lang/Class;,(Ljava/lang/Object;)Ljava/lang/StringBuffer;toString()Ljava/lang/String;org/enhydra/jdbc/util/Loggerdebugcloseerror!>* '(p+G*Y+  *Y +   +M*Y, HQT"./&3H:QAT<U=oB U !pp"#$%xapool-1.5.0-src/output/build/classes/org/enhydra/jdbc/standard/StandardPreparedStatement.class0000644000175000017500000000277110235647011032726 0ustar twernertwerner.> ' ( ) * + ,- ./ ,012 345keyLjava/lang/Object;con4Lorg/enhydra/jdbc/standard/StandardConnectionHandle;closedZe(Lorg/enhydra/jdbc/standard/StandardConnectionHandle;Ljava/sql/PreparedStatement;Ljava/lang/Object;)VCodeLineNumberTableLocalVariableTablethis5Lorg/enhydra/jdbc/standard/StandardPreparedStatement;preparedStatementLjava/sql/PreparedStatement;()Vclose Exceptions preInvoke catchInvoke(Ljava/sql/SQLException;)V sqlExceptionLjava/sql/SQLException; SourceFileStandardPreparedStatement.java    6 7 89:  ;<java/sql/SQLExceptionPrepare Statement is closed =3org/enhydra/jdbc/standard/StandardPreparedStatement+org/enhydra/jdbc/core/CorePreparedStatementps2org/enhydra/jdbc/standard/StandardConnectionHandlepreparedStmtCacheSizeIjava/sql/PreparedStatement returnToCache(Ljava/lang/Object;)V(Ljava/lang/String;)V! l**+*-*,23 456*3* 9: l.******ABDE"H-K .  D* Y RST  !"6+\#$ %&xapool-1.5.0-src/output/build/classes/org/enhydra/jdbc/standard/StandardXACallableStatement.class0000644000175000017500000000705310235647011033112 0ustar twernertwerner. ,P +Q +R +S +T +U VW +W VX YZ Y[ Y\ ,] +^_` a Vb Vc de Vf Vg hi Vj hk lm +n o]pq Pr s t tuv $twx 't +yz{con6Lorg/enhydra/jdbc/standard/StandardXAConnectionHandle;closedZsqlLjava/lang/String; resultSetTypeIresultSetConcurrencyresultSetHoldabilityN(Lorg/enhydra/jdbc/standard/StandardXAConnectionHandle;Ljava/lang/String;III)VCodeLineNumberTableLocalVariableTablethis7Lorg/enhydra/jdbc/standard/StandardXACallableStatement; Exceptions newStatement()Ljava/sql/CallableStatement;close()V preInvoken%Ljavax/transaction/RollbackException;#Ljavax/transaction/SystemException; Ljava/lang/NullPointerException;ntxLjavax/transaction/Transaction; catchInvoke(Ljava/sql/SQLException;)V sqlExceptionLjava/sql/SQLException; SourceFile StandardXACallableStatement.java 7B -. 12 34 54 64| }~ - AB /0java/sql/SQLExceptionPrepare Statement is closed 7 I   0  #javax/transaction/RollbackExceptionjava/lang/StringBuffer8StandardXAStatement:preInvoke enlistResource exception: !javax/transaction/SystemException8StandardXAStatement:preInvoke getTransaction exception: java/lang/NullPointerExceptionGStandardXAStatement:preInvoke should not be used outside an EJBServer: ?@5org/enhydra/jdbc/standard/StandardXACallableStatement+org/enhydra/jdbc/core/CoreCallableStatement4org/enhydra/jdbc/standard/StandardXAConnectionHandlelogLorg/enhydra/jdbc/util/Logger;Ljava/sql/Connection;java/sql/Connection prepareCall0(Ljava/lang/String;)Ljava/sql/CallableStatement;2(Ljava/lang/String;II)Ljava/sql/CallableStatement;3(Ljava/lang/String;III)Ljava/sql/CallableStatement;(Ljava/lang/String;)VtxtransactionManager&Ljavax/transaction/TransactionManager;$javax/transaction/TransactionManagergetTransaction!()Ljavax/transaction/Transaction;xacon0Lorg/enhydra/jdbc/standard/StandardXAConnection; getAutoCommit()Z.org/enhydra/jdbc/standard/StandardXAConnectionthisAutoCommit setAutoCommit(Z)V getXAResource#()Ljavax/transaction/xa/XAResource;javax/transaction/TransactionenlistResource$(Ljavax/transaction/xa/XAResource;)ZcsLjava/sql/CallableStatement;java/sql/CallableStatementappend,(Ljava/lang/String;)Ljava/lang/StringBuffer;toString()Ljava/lang/String;!+,-./012345464789(**+*,****+:"23 45678':;>(<=(-.(12(34(54(64>?@9c*"*** * ** *** * **** :=>&?-@FD; c<=>!AB9< * *:QR S;  <=>!CB9* YL***L+r*+*****W***"MYY !,"!#"MYY%!,&!#"MYY(!,)!#* ***]$':fZ[]^a8e<fDgUh]jtl{mntpq|xy};4DEDFDG<=HI>JK96+:;<=LM>NOxapool-1.5.0-src/output/build/classes/org/enhydra/jdbc/standard/StandardXAPreparedStatement.class0000644000175000017500000000575610235647011033165 0ustar twernertwerner.~ B C DE B F G H I J K L MN NOP QR MS T MU V W MXY Z M[\ ]^_ M`abcon6Lorg/enhydra/jdbc/standard/StandardXAConnectionHandle;sqlLjava/lang/String; resultSetTypeIresultSetConcurrencyresultSetHoldabilityautoGeneratedKeysN(Lorg/enhydra/jdbc/standard/StandardXAConnectionHandle;Ljava/lang/String;III)VCodeLineNumberTableLocalVariableTablethis7Lorg/enhydra/jdbc/standard/StandardXAPreparedStatement;con_sql_resultSetType_resultSetConcurrency_resultSetHoldability_ ExceptionscL(Lorg/enhydra/jdbc/standard/StandardXAConnectionHandle;Ljava/lang/String;I)VautoGeneratedKeys_close()V catchInvoke(Ljava/sql/SQLException;)V sqlExceptionLjava/sql/SQLException; SourceFile StandardXAPreparedStatement.java *; !" #$java/lang/StringBuffer de df gh ij %& '& (&k lmEStandardXAPreparedStatement: Create an XAPreparedStatement with sql=''n op qr ds tu vw )& tx;StandardXAPreparedStatement:close the XA prepared statement yz {&G.>/01"2$3&4&5&67*8,**+*,*Y, **+ *Y**Y*** ***** -* MN OP$Q)S1TSY]d.*/01"2$9&67!:;,e*****?*3*Y*** -& k nop!r(s4vY{d~. e/067<=,6+-./0>?67@Axapool-1.5.0-src/output/build/classes/org/enhydra/jdbc/standard/StandardXAStatement.class0000644000175000017500000000310510235647011031464 0ustar twernertwerner.J - . / 0 1 23 3 4 5 26 78 79 7: ; <=>con6Lorg/enhydra/jdbc/standard/StandardXAConnectionHandle;closedZ resultSetTypeIresultSetConcurrencyresultSetHoldability<(Lorg/enhydra/jdbc/standard/StandardXAConnectionHandle;III)VCodeLineNumberTableLocalVariableTablethis/Lorg/enhydra/jdbc/standard/StandardXAStatement; Exceptions? newStatement()Ljava/sql/Statement;close()V catchInvoke(Ljava/sql/SQLException;)V sqlExceptionLjava/sql/SQLException; SourceFileStandardXAStatement.java &    @ AB #$ CD EF G$ GH GI %& -org/enhydra/jdbc/standard/StandardXAStatement#org/enhydra/jdbc/core/CoreStatementjava/sql/SQLException4org/enhydra/jdbc/standard/StandardXAConnectionHandlelogLorg/enhydra/jdbc/util/Logger; statementLjava/sql/Statement;Ljava/sql/Connection;java/sql/ConnectioncreateStatement(II)Ljava/sql/Statement;(III)Ljava/sql/Statement;!***+****+** "-. /012!3)44* ****!"#$W**** ** ** * *** 78"9):>; W !"!%&< **BC D   !"'(6+M )*!"+,xapool-1.5.0-src/output/build/classes/org/enhydra/jdbc/instantdb/0000755000175000017500000000000010235647010024745 5ustar twernertwernerxapool-1.5.0-src/output/build/classes/org/enhydra/jdbc/instantdb/IdbDataSource.class0000644000175000017500000000253210235647010030447 0ustar twernertwerner.C ,-./ 0 1 2 34 5 ,6 7 89: 1;<=*class$org$enhydra$instantdb$jdbc$idbDriverLjava/lang/Class; Synthetic()VCodeLineNumberTableLocalVariableTablethis*Lorg/enhydra/jdbc/instantdb/IdbDataSource; Exceptions(Ljava/sql/Driver;)VdriverLjava/sql/Driver; setDriverName(Ljava/lang/String;)V driverNameLjava/lang/String;class$%(Ljava/lang/String;)Ljava/lang/Class;x1"Ljava/lang/ClassNotFoundException;x0 SourceFileIdbDataSource.java> ?& java/lang/ClassNotFoundExceptionjava/lang/NoClassDefFoundError @A "  $org.enhydra.instantdb.jdbc.idbDriver %& BA !" java/sql/SQLException+Cannot change driver name for IdbDataSource(org/enhydra/jdbc/instantdb/IdbDataSource,org/enhydra/jdbc/standard/StandardDataSourcejavax/sql/DataSourcejava/lang/ClassforName getMessage()Ljava/lang/String;getName!S!** Y )* + ! >*+  12  !"> Y5  #$ %&N*LY+* '()$*+xapool-1.5.0-src/output/build/classes/org/enhydra/jdbc/instantdb/IdbXAConnection.class0000644000175000017500000000454710235647010030755 0ustar twernertwerner.f ; < = >? >@A B @ C D E FG HI JK L MNOW(Lorg/enhydra/jdbc/standard/StandardXADataSource;Ljava/lang/String;Ljava/lang/String;)VCodeLineNumberTableLocalVariableTablethis,Lorg/enhydra/jdbc/instantdb/IdbXAConnection; dataSource0Lorg/enhydra/jdbc/standard/StandardXADataSource;userLjava/lang/String;password ExceptionsPstart(Ljavax/transaction/xa/Xid;I)VxidLjavax/transaction/xa/Xid;flagsIconExt1Lorg/enhydra/instantdb/jdbc/ConnectionExtensions;Qprepare(Ljavax/transaction/xa/Xid;)IstateCon8Lorg/enhydra/jdbc/standard/StandardXAStatefulConnection;constatusisSameRM$(Ljavax/transaction/xa/XAResource;)Zxaccmpds,Lorg/enhydra/jdbc/instantdb/IdbXADataSource;dsxares!Ljavax/transaction/xa/XAResource; SourceFileIdbXAConnection.java  R# S.T UV /W/org/enhydra/instantdb/jdbc/ConnectionExtensions XY Z[ +\ ]^ _` 12*org/enhydra/jdbc/instantdb/IdbXAConnection a*org/enhydra/jdbc/instantdb/IdbXADataSource bc de.org/enhydra/jdbc/standard/StandardXAConnectionjava/sql/SQLException javax/transaction/xa/XAExceptiondoStartcurCon6org/enhydra/jdbc/standard/StandardXAStatefulConnectioncommitOnPrepareZLjava/sql/Connection;startGlobalTransaction(Ljavax/transaction/xa/Xid;)VcheckPreparedStateT(Ljavax/transaction/xa/Xid;)Lorg/enhydra/jdbc/standard/StandardXAStatefulConnection;()I xaDataSource.org/enhydra/jdbc/standard/StandardXADataSourcefreeConnection(Ljavax/transaction/xa/Xid;Z)V()VCodeLineNumberTableLocalVariableTablethis,Lorg/enhydra/jdbc/instantdb/IdbXADataSource;getXAConnection()Ljavax/sql/XAConnection; Exceptions_>(Ljava/lang/String;Ljava/lang/String;)Ljavax/sql/XAConnection;userpasswordxac,Lorg/enhydra/jdbc/instantdb/IdbXAConnection;getObjectInstanced(Ljava/lang/Object;Ljavax/naming/Name;Ljavax/naming/Context;Ljava/util/Hashtable;)Ljava/lang/Object; dataSourcerefObjLjava/lang/Object;nameLjavax/naming/Name;nameCtxLjavax/naming/Context;envLjava/util/Hashtable;refLjavax/naming/Reference;` SourceFileIdbXADataSource.java ! , - '+*org/enhydra/jdbc/instantdb/IdbXAConnection a bc de  fg/org/enhydra/instantdb/jdbc/ConnectionExtensions hi jkjavax/naming/Reference lim nop qi rs*org/enhydra/jdbc/instantdb/IdbXADataSource driverName tuv wxjava/lang/String yzurl {z.org/enhydra/jdbc/standard/StandardXADataSourcejavax/sql/XADataSourcejava/sql/SQLExceptionjava/lang/ExceptionW(Lorg/enhydra/jdbc/standard/StandardXADataSource;Ljava/lang/String;Ljava/lang/String;)VtransactionManager&Ljavax/transaction/TransactionManager;setTransactionManager)(Ljavax/transaction/TransactionManager;)VconLjava/sql/Connection; getDatabaseId()Ljava/lang/String;connectionCountI getClassNamejava/lang/ObjectgetClass()Ljava/lang/Class;java/lang/ClassgetNameequals(Ljava/lang/Object;)Zget*(Ljava/lang/String;)Ljavax/naming/RefAddr;javax/naming/RefAddr getContent()Ljava/lang/Object; setDriverName(Ljava/lang/String;)VsetUrl! !"3*# 12$ %&'("7 ***#8$  %&)*'+"6Y*+,N-** *-  *Y ` -#? @AB*D4E$*6%&6,6- +./)*01"J+:*3Y:#LMN!O3PEQHS$H!'2&J%&J34J56J78J9:D;<)=>?xapool-1.5.0-src/output/build/classes/org/enhydra/jdbc/oracle/0000755000175000017500000000000010235647010024224 5ustar twernertwernerxapool-1.5.0-src/output/build/classes/org/enhydra/jdbc/oracle/OracleXAConnection.class0000644000175000017500000001037610235647010030740 0ustar twernertwerner. 4g .hi .j 2kJ .l mno pq r s t uv wx wy wz {| .} ~ . 2  ~ ~ ~ ~ . . & ~  2 . ~ 2pxarsrc!Ljavax/transaction/xa/XAResource;txctxsLjava/util/Hashtable;W(Lorg/enhydra/jdbc/standard/StandardXADataSource;Ljava/lang/String;Ljava/lang/String;)VCodeLineNumberTableLocalVariableTablethis,Lorg/enhydra/jdbc/oracle/OracleXAConnection; dataSource0Lorg/enhydra/jdbc/standard/StandardXADataSource;userLjava/lang/String;password Exceptions getOracleXid6(Ljavax/transaction/xa/Xid;)Loracle/jdbc/xa/OracleXid;txctx[BnewXidLoracle/jdbc/xa/OracleXid;xidLjavax/transaction/xa/Xid;commit(Ljavax/transaction/xa/Xid;Z)VflagZend(Ljavax/transaction/xa/Xid;I)VflagsIforget(Ljavax/transaction/xa/Xid;)Vprepare(Ljavax/transaction/xa/Xid;)IresrollbackstartoXidisSameRM$(Ljavax/transaction/xa/XAResource;)Zores()V SourceFileOracleXAConnection.java 9: 56oracle/jdbc/xa/OracleXid 78 @ java/lang/StringBuffer 9d txctx is   9commit: GH PQ A Q end: : TUforget: XYprepare: Z[ rollback: ]Ystart: U&oracle/jdbc/xa/client/OracleXAResource  9 ^U *org/enhydra/jdbc/oracle/OracleXAConnectionisSameRM returning false `aisSameRM returning truejava/util/Hashtable.org/enhydra/jdbc/standard/StandardXAConnectionjava/sql/SQLException javax/transaction/xa/XAExceptionget&(Ljava/lang/Object;)Ljava/lang/Object;? @A BC DCEFGH;Q+H+M* Y  , Y+++,N-+<9:;/<J=L?=*:IJJKLQ>?QMNEOPQ;C* Y  + **+*++W<D"E1F:GBH= C>?CMNCRSEOTU;W* Y  + +  +  **+<KGLVM= W>?WMNWVWEOXY;B* Y  + **+*++W<P"Q0R9SAT=B>?BMNEOZ[;I* Y  + **+!=*++W<W"X1Y6Z?[G]= I>?IMN1\WEO]Y;B* Y " + **+#*++W<a"b0c9dAe=B>?BMNEO^U;* Y $ + +  +  *+%*&Y*'()*+N*-*+-+,W*'*-<& hGiMj_kelpm|nop=*>?MNVWe"_LEO`a;F+.*/+.M,*0*1*/<& stuwx*y6z8|D}= F>?F\6,b?EOcd;# 2Y3</efxapool-1.5.0-src/output/build/classes/org/enhydra/jdbc/oracle/OracleXADataSource.class0000644000175000017500000000427210235647010030671 0ustar twernertwerner.p ; < = >? @ A B CD E FG HI JK ;L M NOP QR STU()VCodeLineNumberTableLocalVariableTablethis,Lorg/enhydra/jdbc/oracle/OracleXADataSource;getXAConnection()Ljavax/sql/XAConnection; ExceptionsV>(Ljava/lang/String;Ljava/lang/String;)Ljavax/sql/XAConnection;userLjava/lang/String;passwordxac,Lorg/enhydra/jdbc/oracle/OracleXAConnection;getObjectInstanced(Ljava/lang/Object;Ljavax/naming/Name;Ljavax/naming/Context;Ljava/util/Hashtable;)Ljava/lang/Object; dataSourcerefObjLjava/lang/Object;nameLjavax/naming/Name;nameCtxLjavax/naming/Context;envLjava/util/Hashtable;refLjavax/naming/Reference;W SourceFileOracleXADataSource.java  &' (' !%*org/enhydra/jdbc/oracle/OracleXAConnection X YZ [\ ]^javax/naming/Reference _`a bcd e` fg*org/enhydra/jdbc/oracle/OracleXADataSource driverName hij kljava/lang/String mnurl on.org/enhydra/jdbc/standard/StandardXADataSourcejavax/sql/XADataSourcejava/sql/SQLExceptionjava/lang/ExceptionW(Lorg/enhydra/jdbc/standard/StandardXADataSource;Ljava/lang/String;Ljava/lang/String;)VtransactionManager&Ljavax/transaction/TransactionManager;setTransactionManager)(Ljavax/transaction/TransactionManager;)VconnectionCountI getClassName()Ljava/lang/String;java/lang/ObjectgetClass()Ljava/lang/Class;java/lang/ClassgetNameequals(Ljava/lang/Object;)Zget*(Ljava/lang/String;)Ljavax/naming/RefAddr;javax/naming/RefAddr getContent()Ljava/lang/Object; setDriverName(Ljava/lang/String;)VsetUrl!3* ,-  !"7 ***3   #$!%sY*+,N-**Y ` -: ;<=* &'(' )*#$+,J+ : * 3Y:DEF!G3HEIHKH!'- J J./J01J23J45D67#89:xapool-1.5.0-src/output/build/classes/org/enhydra/jdbc/pool/0000755000175000017500000000000010235647011023731 5ustar twernertwernerxapool-1.5.0-src/output/build/classes/org/enhydra/jdbc/pool/GenericPool.class0000644000175000017500000004025310235647010027171 0ustar twernertwerner. ' 7 8 9 : ; < = > ? @ A' BC 8 D EF 8 G H I JK LMN O PQ RS #8T #U #V #W XYZ *[ \ ]^ _` !a /bc 2d 2ef Xg h i jk jlm n o ;p qr st uv Lw Lxyz{| L}~ ;  ;  #    W X   !b   ;  X    * 2   #   L ;  JlifeTimeJlockedLjava/util/Hashtable;unlockedhitListLjava/util/Vector; threadFactory)Lorg/enhydra/jdbc/core/JdbcThreadFactory;minSizeImaxSize poolHelper"Lorg/enhydra/jdbc/pool/PoolHelper;countgcZdebugdeadLockMaxWaitdeadLockRetryWaitlogLorg/enhydra/jdbc/util/Logger;checkLevelObjectkeeperLjava/lang/Thread; poolKeeper"Lorg/enhydra/jdbc/pool/PoolKeeper; sleepTime generationDEFAULT_EXPIRATION ConstantValueDEFAULT_SLEEPTIMEDEFAULT_MINSIZEDEFAULT_MAXSIZE2DEFAULT_DEADLOCKMAXWAITDEFAULT_DEADLOCKRETRYWAIT'%(Lorg/enhydra/jdbc/pool/PoolHelper;)VCodeLineNumberTableLocalVariableTablethis#Lorg/enhydra/jdbc/pool/GenericPool;helper&(Lorg/enhydra/jdbc/pool/PoolHelper;I)VinitSize)(Lorg/enhydra/jdbc/pool/PoolHelper;IIJJ)Vstart()V genObject(Lorg/enhydra/jdbc/pool/GenerationObject;eLjava/lang/Exception;inow getFromPool8(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Object;o realObjectLjava/lang/Object;lifeLjava/lang/Long;Ljava/util/Enumeration;excpuserLjava/lang/String;passwordcreate Exceptions checkOwnerO(Lorg/enhydra/jdbc/pool/GenerationObject;Ljava/lang/String;Ljava/lang/String;)ZgetThreadFactory+()Lorg/enhydra/jdbc/core/JdbcThreadFactory;setThreadFactory,(Lorg/enhydra/jdbc/core/JdbcThreadFactory;)Vtfequals'(Ljava/lang/String;Ljava/lang/String;)ZabcheckOut Ljava/lang/InterruptedException; currentWaitobj minimumObject'(Ljava/lang/String;Ljava/lang/String;)VcheckIn(Ljava/lang/Object;)VgenObjenumremoveUnlockedObject+(Lorg/enhydra/jdbc/pool/GenerationObject;)VsetDebug(Z)VisDebug()Z setMinSize(I)Vmin setMaxSizemax setLifeTime(J)V setSleepTime setGenerationsetGCsetCheckLevelObjectlevelsetDeadLockMaxWaitdeadLocksetDeadLockRetryWait getMinSize()I getMaxSize getLifeTime()JisGCgetCount getSleepTime getGenerationgetCheckLevelObjectstopgetLockedObjectCountgetUnlockedObjectCountgetDeadLockMaxWaitgetDeadLockRetryWaittoString()Ljava/lang/String;sbLjava/lang/StringBuffer;cleanUp lasttouchresize expireAllnextGenerationremoveLockedObject setLogger!(Lorg/enhydra/jdbc/util/Logger;)ValoggetLockedObject()Ljava/util/Hashtable; SourceFileGenericPool.java java/util/Hashtable java/util/Vector   java/lang/Long  java/lang/Exception java/lang/StringBuffer%Error Exception in GenericPool:start   &'  org/enhydra/jdbc/pool/PoolKeeper    java/lang/IllegalStateException ' java/lang/Thread  GenericPool:start pool started #   &org/enhydra/jdbc/pool/GenerationObject    -GenericPool:getFromPool an object has expired 9GenericPool:getFromPool check the owner of the connection )GenericPool:getFromPool owner is verified  GGenericPool:getFromPool return an object (after verification if needed)4GenericPool:getFromPool kill an object from the pool&GenericPool:getFromPool owner is FALSE>GenericPool:getFromPool no objects available, create a new one BGenericPool:getFromPool Error Exception in GenericPool:getFromPool ' ' GenericPool:checkOut an object)GenericPool:checkOut UnlockedObjectCount= 'GenericPool:checkOut LockedObjectCount= "GenericPool:checkOut count= maxSize=*GenericPool:checkOut an object has expired6GenericPool:checkOut check the owner of the connection4GenericPool:checkOut remove object checkLevelObject= $,GenericPool:checkOut waiting for an object :  % java/lang/InterruptedException?GenericPool:checkOut ERROR Failed while waiting for an object: KGenericPool:checkOut ERROR impossible to obtain a new object from the pool bGenericPool:minimumObject create object if there are less than minSize objects in the pool count =FGenericPool:minimumObject Error Exception in GenericPool:minimumObject GenericPool:minimumObject count= Unlocked= locked=0GenericPool:checkIn return an object to the pool  8GenericPool:checkIn more than maxSize object in the poolGenericPool:checkIn Be careful, the maximum size of the pool does not correspond to your data. When objects will be check in, the pool will decrease   FGenericPool:setMinSize Minimum size of the pool can't be lesser than 0SGenericPool:setMinSize Minimum size of the pool can't be greater than the maxSize ()FGenericPool:setMaxSize Maximum size of the pool can't be lesser than 0RGenericPool:setMaxSize Maximum size of the pool can't be lesser than the minSize (5GenericPool:setMaxSize pool has more than max elementGenericPool:setMaxSize Be careful, the maximum size of the pool does not correspond to your data. When objects will be check in, the pool will decrease{GenericPool:setGeneration Be careful, it is very dangerous to change the generation number, many objects could be destroyed'GenericPool:stop start to stop the pool - !  GenericPool:stop pool stopped  GenericPool:  num of element =<>  minSize =< maxSize =< lifeTime =<  ngeneration =< getLockedObjectCount() =< getUnlockedObjectCount() =< getDeadLockMaxWait() =< getDeadLockRetryWait() =<Unlocked pool:  Locked pool: %GenericPool:cleanUp clean up the pool %GenericPool:cleanUp killing an object    >GenericPool:cleanUp less than minSize objects in the pool min= max= count=:GenericPool:cleanUp Error Exception in GenericPool:cleanUpGenericPool:cleanUp done min=LGenericPool:expireAll close all object in the unlocked and locked structuresGenericPool:nextGeneration)GenericPool:removeObject remove an object!org/enhydra/jdbc/pool/GenericPooljava/lang/Objectjava/lang/SystemcurrentTimeMillis org/enhydra/jdbc/pool/PoolHelper*()Lorg/enhydra/jdbc/pool/GenerationObject;put8(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;append,(Ljava/lang/String;)Ljava/lang/StringBuffer;,(Ljava/lang/Object;)Ljava/lang/StringBuffer;org/enhydra/jdbc/util/Loggererror'(JLorg/enhydra/jdbc/pool/GenericPool;)V'org/enhydra/jdbc/core/JdbcThreadFactory getThread((Ljava/lang/Runnable;)Ljava/lang/Thread; getMessage(Ljava/lang/String;)V(Ljava/lang/Runnable;)Vkeys()Ljava/util/Enumeration;java/util/EnumerationhasMoreElements nextElement()Ljava/lang/Object;get&(Ljava/lang/Object;)Ljava/lang/Object;removegetObj longValuecheckThisObject(Ljava/lang/Object;)ZtestThisObjectN(Ljava/lang/String;Ljava/lang/String;)Lorg/enhydra/jdbc/pool/GenerationObject;getUser getPasswordjava/lang/String(I)Ljava/lang/StringBuffer;infowait notifyAllwarnadd interruptclearsize(J)Ljava/lang/StringBuffer;(I)Ljava/lang/Object;expire killObject!-G*+2 Y_P*+ b h =**** * * *+ * ***2 rJ stuvw#y)z.{5|<}>======!*Y*Y*Y**@>* P* :*Y W :*"#Y$%&'()*Y`*4**Y* *+,***,-./N/Y-01**Y* *+,*2Y*,3.*.4*"569VY!!j !&+/19DVY[v>D[1U /1 B*7:::*8:9*Y: 9  ç:;:*<:*=W>: ç :   !?e* *"@6*A*"B6*+,Cr*"D6*/** E*2* F$*Y! W*"G6>*"H6*A*"I66*Y:** 6*Y`ç :  \*"J6* +,K:*Y! W>:*Y:*Ydç :  *"L),9m<jmmrm-HKKPKa!- ',<HV`gu%(-8;ESXanp n)(!!f*,+MN*-+ON*/* >*+ p"+ ,, ++,P """ *"Q6B*"#Y$R&*7S(6*"#Y$T&*US(6*"#Y$V&*SW&* S(6*7* **8:9:;:>:!*<?e* *"X6*A*"Y6*+,C** E** F{*"#Y$Z&*S(6*AU6*+,[:  *\t*"#Y$]&* ^&(_*Y: **`a ç :   : *"#Y$c& '()*`a6*+,[:  !Yde ~yb"( ) -*0G2p5w7:;<=?ABFHIM5P>]A_I`Yayc~dejfgkloprf   AI !!5*f vw !}*"#Y$g&*S(6** *B*6* L+,* :* +,K:*Y! W:*"h)*"#Y$i&*Sj&*7Sk&*US(6** Bwz!Bz}/39BJXewz|RUe| 9R3!*"l6*8M,9_,:;N->+mG*-=W*-Y W-n6** ->E*-A*o** `*"p_*8M* >*!*7,:;:*A**7*U`** *"qrf $/8KQZjovRQ"$Oe&L"e!*Yd*o*+=W*+sW  !!>*t /*t ! ? !Yue* &!Y#Y$v&* Sw&(e* 9>?? !!  0 !Yxe* &!Y#Y$y&* Sw&(e* *Z*"z_*8M>*!*7,:;:*A**7*U`* *"{rF9>FOWahsy 4sY&WF ! >*  >*   K**"|6"#&>* )* K *0 12>* 56>* 9:/* = /* A /* E /*I /*M /* Q /*U  /*Y !W*"}6*U *79*~*, *,*.******"66 ` abc"d)e0f7g>hCiHjMlVm W"C* *stv #C* *}~ $/* %/* &'\#Y$L+&W+#Y$&*S&(&W+#Y$&* S&(&W+#Y$&* S&(&W+#Y$&* &(&W+#Y$&*S&(&W+#Y$&*US&(&W+#Y$&*7S&(&W+#Y$&*\&(&W+#Y$&*`&(&W*4+&W*8M,9,:;N+->^&W*4+&W*8M,9,:;N+->^&W+(b/Oo/6=ENXgnu}>X E" }"()*N *YL*+ñ+çM+,@*YN*8:9>:;:*<?7e* *"6*A-ç :-*,*;N*"6* ->-*>*Y:** >ç :  *"#Y$&* S&* S&*S(_* :*Y:*Y W*Y`*o** ç6ç :  :*")*Y:*oç:  *"#Y$&* S&* S&*S(_  pssws&T]WZ]]b]Th!Weh!x*  )3?P\enz!&8BFWehjsx| \ ?,P+)E!Dj ,-l*"6*8L+9#+:;M* ,>,M*8L+9#+:;M* ,>,Mڱ: $15:BKUb f!k#4$)UB)l.$*"6=*8N-9#-:;:>+m n=*8N-91-:;:n* >E *A*Y`>+ , -.0'334<7D8M:X=a@rB{FHH')X D7 {!/L*"6*8M,94,:;N->+m*-=W*Yd-Nɱ* N OPR$T/U8VBWFXK[*$$:LL01>*+" ab234/*e 56xapool-1.5.0-src/output/build/classes/org/enhydra/jdbc/pool/PoolHelper.class0000644000175000017500000000075410235647010027036 0ustar twernertwerner.expire(Ljava/lang/Object;)VcheckThisObject(Ljava/lang/Object;)ZtestThisObjectcreate*()Lorg/enhydra/jdbc/pool/GenerationObject; ExceptionsN(Ljava/lang/String;Ljava/lang/String;)Lorg/enhydra/jdbc/pool/GenerationObject;toString()Ljava/lang/String; SourceFilePoolHelper.java org/enhydra/jdbc/pool/PoolHelperjava/lang/Objectjava/sql/SQLException       xapool-1.5.0-src/output/build/classes/org/enhydra/jdbc/pool/GenerationObject.class0000644000175000017500000000222210235647010030177 0ustar twernertwerner.* # $ % & '()objLjava/lang/Object; generationIuserLjava/lang/String;password(Ljava/lang/Object;I)VCodeLineNumberTableLocalVariableTablethis(Lorg/enhydra/jdbc/pool/GenerationObject;o:(Ljava/lang/Object;ILjava/lang/String;Ljava/lang/String;)V getGeneration()IgetObj()Ljava/lang/Object;getUser()Ljava/lang/String; getPassword killObject()V SourceFileGenerationObject.java    &org/enhydra/jdbc/pool/GenerationObjectjava/lang/Object!  Y**+**+ ,-   **+**-*23 45674    /*: /*> /*B /*F  4* JK !"xapool-1.5.0-src/output/build/classes/org/enhydra/jdbc/pool/PoolKeeper.class0000644000175000017500000000204210235647010027022 0ustar twernertwerner.4 ! " # $% &' ()*+, sleepTimeJpool#Lorg/enhydra/jdbc/pool/GenericPool;runningZ'(JLorg/enhydra/jdbc/pool/GenericPool;)VCodeLineNumberTableLocalVariableTablethis"Lorg/enhydra/jdbc/pool/PoolKeeper;stop()Vrune Ljava/lang/InterruptedException; SourceFilePoolKeeper.java   - ./ 01java/lang/InterruptedException2 3 org/enhydra/jdbc/pool/PoolKeeperjava/lang/Objectjava/lang/Runnablejava/lang/Thread interrupted()Zwait(J)V!org/enhydra/jdbc/pool/GenericPoolcleanUp!   b****-% &'(  Z*YL*+çM+, +, -. :*0**YL**+çM+,L **! #&* 4 678#;&9':*<4?9@':xapool-1.5.0-src/output/build/classes/org/enhydra/jdbc/pool/StandardPoolDataSource.class0000644000175000017500000003176710235647011031343 0ustar twernertwerner. $% &' () * + ,- . / 0 1 2 3 4 ,56 7 8 9 :;< => $? @ A AB CDEF %GH IJ K #LMN O PQ RS T U VWXY #Z #[\] ^_ `a `Zbcd `e f gh gZi jk l #mno p Mq rs t 0 u u v w x y z { | } ~             A    s            x   w v     cpds$Ljavax/sql/ConnectionPoolDataSource;pool#Lorg/enhydra/jdbc/pool/GenericPool;dataSourceNameLjava/lang/String; jdbcTestStmtonOffZictxLjavax/naming/Context;glog Lorg/apache/commons/logging/Log;()VCodeLineNumberTableLocalVariableTablethis.Lorg/enhydra/jdbc/pool/StandardPoolDataSource;(I)VinitSizeI'(Ljavax/sql/ConnectionPoolDataSource;)VsqleLjava/sql/SQLException;cc((Ljavax/sql/ConnectionPoolDataSource;I)VsetDataSourceName(Ljava/lang/String;)VgetDataSourceName()Ljava/lang/String; getConnection()Ljava/sql/Connection; Exceptions;(Ljava/lang/String;Ljava/lang/String;)Ljava/sql/Connection;eLjava/lang/Exception;_user _passwordretLjava/sql/Connection;conLjavax/sql/PooledConnection;connectionErrorOccurred(Ljavax/sql/ConnectionEvent;)VeventLjavax/sql/ConnectionEvent;objLjava/lang/Object;pcconnectionClosedexpire(Ljava/lang/Object;)V pooledConocheckThisObject(Ljava/lang/Object;)ZtestThisObjectsLjava/sql/Statement;create*()Lorg/enhydra/jdbc/pool/GenerationObject;N(Ljava/lang/String;Ljava/lang/String;)Lorg/enhydra/jdbc/pool/GenerationObject; genObject(Lorg/enhydra/jdbc/pool/GenerationObject;stopPoolshutdown(Z)Vforce setLogWriter(Ljava/io/PrintWriter;)V logWriterLjava/io/PrintWriter;setDebugdebug setMinSizeminSize setMaxSizemaxSize setLifeTime(J)VlifeTimeJ setSleepTime sleepTimesetGCgcsetCheckLevelObjectcheckLevelObjectsetJdbcTestStmt setGeneration generationsetDeadLockMaxWaitdeadLocksetDeadLockRetryWaitloopWait getLogWriter()Ljava/io/PrintWriter; getMinSize()I getMaxSize getLifeTime()J getSleepTime getGenerationisGC()ZgetLockedObjectCountgetUnlockedObjectCountgetCheckLevelObjectgetJdbcTestStmtgetDeadLockMaxWaitgetDeadLockRetryWaittoStringsbLjava/lang/StringBuffer; getReference()Ljavax/naming/Reference;refLjavax/naming/Reference;getObjectInstanced(Ljava/lang/Object;Ljavax/naming/Name;Ljavax/naming/Context;Ljava/util/Hashtable;)Ljava/lang/Object;refObjnameLjavax/naming/Name;nameCtxenvLjava/util/Hashtable;Ljavax/naming/InitialContext;setThreadFactory,(Lorg/enhydra/jdbc/core/JdbcThreadFactory;)Vtf)Lorg/enhydra/jdbc/core/JdbcThreadFactory; SourceFileStandardPoolDataSource.java org.enhydra.jdbc.xapool  org/enhydra/jdbc/util/Logger   !org/enhydra/jdbc/pool/GenericPool    java/sql/SQLException(StandardPoolDataSource:setDataSourceName   $StandardPoolDataSource:getConnection?StandardPoolDataSource:getConnection must configure the pool... java/lang/StringBuffer4StandardPoolDataSource:getConnection pool config :   HStandardPoolDataSource:getConnection Try to give a connection (checkOut) javax/sql/PooledConnectionDStandardPoolDataSource:getConnection checkOut returna new connectionjava/lang/Exception YStandardPoolDataSource:getConnection SQLException in StandardPoolDataSource:getConnection MSQLException in StandardPoolDataSource:getConnection no connection available .StandardPoolDataSource:getConnection exception@SQLException in StandardPoolDataSource:getConnection exception:  8StandardPoolDataSource:getConnection return a connection    PStandardXAPoolDataSource:connectionErrorOccurred remove the object from the poolStandardPoolDataSource:create create a connection for the pool  :StandardPoolDataSource:create create a object for the pool&org/enhydra/jdbc/pool/GenerationObject   1StandardPoolDataSource:stopPool stop now the pool           StandardPoolDataSource:  data source name=<>  jdbc test stmt=< user=< DStandardPoolDataSource:getReference return a reference of the object javax/naming/StringRefAddr        javax/naming/Reference  java/lang/String   javax/naming/InitialContext  "javax/sql/ConnectionPoolDataSource ,org/enhydra/jdbc/pool/StandardPoolDataSource$org/enhydra/jdbc/core/CoreDataSourcejavax/sql/DataSource org/enhydra/jdbc/pool/PoolHelper!javax/sql/ConnectionEventListenerjavax/naming/NamingException%org/apache/commons/logging/LogFactorygetLog4(Ljava/lang/String;)Lorg/apache/commons/logging/Log;#(Lorg/apache/commons/logging/Log;)VlogLorg/enhydra/jdbc/util/Logger;%(Lorg/enhydra/jdbc/pool/PoolHelper;)V setLogger!(Lorg/enhydra/jdbc/util/Logger;)V&(Lorg/enhydra/jdbc/pool/PoolHelper;I)VgetUser getPasswordstartappend,(Ljava/lang/String;)Ljava/lang/StringBuffer;checkOut8(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Object;printStackTrace,(Ljava/lang/Object;)Ljava/lang/StringBuffer;setNextException(Ljava/sql/SQLException;)VcheckInjavax/sql/ConnectionEvent getSource()Ljava/lang/Object;nextGenerationremoveLockedObjectcloseremoveConnectionEventListener&(Ljavax/sql/ConnectionEventListener;)Verrorjava/sql/ConnectionisClosedcreateStatement()Ljava/sql/Statement;java/sql/Statementexecute(Ljava/lang/String;)ZgetPooledConnectionB(Ljava/lang/String;Ljava/lang/String;)Ljavax/sql/PooledConnection;addConnectionEventListener:(Ljava/lang/Object;ILjava/lang/String;Ljava/lang/String;)Vstopuserjava/lang/Objectjava/lang/Integer(I)Ljava/lang/String;'(Ljava/lang/String;Ljava/lang/String;)Vadd(Ljavax/naming/RefAddr;)Vjava/lang/Long(J)Ljava/lang/String;get*(Ljava/lang/String;)Ljavax/naming/RefAddr;javax/naming/RefAddr getContent parseLong(Ljava/lang/String;)JparseInt(Ljava/lang/String;)I(Ljava/util/Hashtable;)Vlookup&(Ljava/lang/String;)Ljava/lang/Object;!.F***Y**** Y* * * * *& HC IJ$L0N;O@PEQ FG***Y**** Y* * * * *& VC WX$Z1\<]A^F_GG\***+*Y**** Y* * * **M* *@MP6 dC ef!h)i5k@mMpPnQrVs[t Q\\L***+*Y**** Y* * * * ** {C |}!~)6AFK LLLK**+ /* 7 ***  >6*N:*Y:* 8** * *Y*  ç :*!* +,"#:*$A:&*Y'( YY)( *+Ne:*Y,( &YY-( *: . * /*0-RUUZU]}%]%~ #*/O]ft}(+4R<#`666 +()+1M,#N* -2* -3*-4*5 (*))$ a*6+1M* ,/   7*7++#M,8,*9*: M*;<),.       ), -6*- 77U*=+#M,+N->-? :*Y@( <:*A< &)% H GH6   #&()$+%F*H+J,S.>+:3J UUfM*B+#N-+M,C:*DEWF,? :*Y@( <N*G<28;% YZ>67 :;<=+>2@8E;A=BXFZG[HdJH=J;[ ffd7 ***HO  <*I*+,J:*K*LMY* N+,ON-T WZ\']:c4<<<:&L* P* *Qjk lm =*R pqP* * **Sy z{J*T* U A * V  %A * W  %A * X  A * Y  A * Z  A * [  >*+D A * \  A * ]  A * ^  /* 2* _ 2* ` 2* a 2* b 2* c 2* d 2* e 2* f  2* g  /*D  2* h  2* i  YL+jW+Yk*l W+Ym*Dl W+Yn*ol W*+*pW+* W+ & /Oov*q*rL+sYt*uvwx+sYy*z{wx+sY|*}wx+sY~*vwx+sY*vwx+sY*wx+& ) +,"061G2[3o45t*+,-W+:*y*|*~**Y:**** B CD$F5GII]KnLyMNH{y%J*+* +UV W !"#xapool-1.5.0-src/output/build/classes/org/enhydra/jdbc/pool/StandardXAPoolDataSource.class0000644000175000017500000002050110235647011031554 0ustar twernertwerner.U \ [ \ \ [ \ [ [  [   @      !   [ C  0 \ 5 ; \ < < [ [   \  @ N  [         @xadsLjavax/sql/XADataSource;transactionManager&Ljavax/transaction/TransactionManager;glog Lorg/apache/commons/logging/Log;()VCodeLineNumberTableLocalVariableTablethis0Lorg/enhydra/jdbc/pool/StandardXAPoolDataSource;(I)VinitSizeI3(Lorg/enhydra/jdbc/standard/StandardXADataSource;)Vds0Lorg/enhydra/jdbc/standard/StandardXADataSource;4(Lorg/enhydra/jdbc/standard/StandardXADataSource;I)VsetTransactionManager)(Ljavax/transaction/TransactionManager;)VtmconnectionClosed(Ljavax/sql/ConnectionEvent;)Vn Ljava/lang/NullPointerException;e#Ljavax/transaction/SystemException;Ljava/lang/Exception;eventLjavax/sql/ConnectionEvent;objLjava/lang/Object;xacLjavax/sql/XAConnection;txLjavax/transaction/Transaction;createN(Ljava/lang/String;Ljava/lang/String;)Lorg/enhydra/jdbc/pool/GenerationObject;_userLjava/lang/String; _password genObject(Lorg/enhydra/jdbc/pool/GenerationObject;xaCon Exceptions getReference()Ljavax/naming/Reference;refLjavax/naming/Reference;getObjectInstanced(Ljava/lang/Object;Ljavax/naming/Name;Ljavax/naming/Context;Ljava/util/Hashtable;)Ljava/lang/Object;refObjnameLjavax/naming/Name;nameCtxLjavax/naming/Context;envLjava/util/Hashtable;ictxLjavax/naming/InitialContext; getDataSource()Ljavax/sql/XADataSource; setDataSource(Ljavax/sql/XADataSource;)V dataSourcetoString()Ljava/lang/String;sbLjava/lang/StringBuffer;testThisObject(Ljava/lang/Object;)ZisActiveZconLjavax/sql/PooledConnection;sLjava/sql/Statement;Ljava/sql/SQLException;exoretLjava/sql/Connection; suspended SourceFileStandardXAPoolDataSource.java cdorg.enhydra.jdbc.xapool  ab cj c c .StandardXAPoolDataSource:setTransactionManager  _`  !)StandardXAPoolDataSource:connectionClosedjavax/sql/XAConnection ]^.org/enhydra/jdbc/standard/StandardXADataSource "#java/lang/NullPointerException TM is null c$ %&;StandardXAPoolDataSource:connectionClosed get a transactionQStandardXAPoolDataSource:connectionClosed should not be used outside an EJBServer '!javax/transaction/SystemExceptionjava/lang/StringBuffer@StandardXAPoolDataSource:connectionClosed getTransaction failed: () (* .org/enhydra/jdbc/standard/StandardXAConnection +,- . /01 23BStandardXAPoolDataSource:connectionClosed the resourse is delistedjava/lang/ExceptionHStandardXAPoolDataSource:connectionClosed Exception in connectionClosed:GStandardXAPoolDataSource:connectionClosed checkIn an object to the pool 456 7 89 :;FStandardXAPoolDataSource:getReference return a reference of the object javax/naming/StringRefAddrtransactionManagerNameTransactionManager c? @A javax/naming/Referencejavax/naming/InitialContext cB$javax.transaction.TransactionManager CD$javax/transaction/TransactionManager qr Ejavax/sql/XADataSource:StandardPoolDataSource:getObjectInstance: instance createdStandardXAPoolDataSource:  transaction manager=<F> ?StandardPoolDataSource:testThisObject verify the current object G= H&javax/sql/PooledConnection IJK LM NO PQ RdDStandardPoolDataSource:checkThisObject can't closed the connection: java/sql/SQLExceptionoStandardXAPoolDataSource:checkThisObject Error java.sql.SQLException in StandardXAPoolDataSource:testThisObjectrStandardXAPoolDataSource:checkThisObject Error java.sql.SystemException in StandardXAPoolDataSource:testThisObject STcStandardXAPoolDataSource:checkThisObject Error Exception in StandardXAPoolDataSource:testThisObject.org/enhydra/jdbc/pool/StandardXAPoolDataSource,org/enhydra/jdbc/pool/StandardPoolDataSourcejavax/naming/NamingException%org/apache/commons/logging/LogFactorygetLog4(Ljava/lang/String;)Lorg/apache/commons/logging/Log;'(Ljavax/sql/ConnectionPoolDataSource;)V((Ljavax/sql/ConnectionPoolDataSource;I)VlogLorg/enhydra/jdbc/util/Logger;org/enhydra/jdbc/util/Loggerdebug(Ljava/lang/Object;)Vjavax/sql/ConnectionEvent getSource()Ljava/lang/Object;getTransactionManager(()Ljavax/transaction/TransactionManager;(Ljava/lang/String;)VgetTransaction!()Ljavax/transaction/Transaction;errorappend,(Ljava/lang/String;)Ljava/lang/StringBuffer;,(Ljava/lang/Object;)Ljava/lang/StringBuffer;connectionHandle6Lorg/enhydra/jdbc/standard/StandardXAConnectionHandle;4org/enhydra/jdbc/standard/StandardXAConnectionHandle isReallyUsed getXAResource#()Ljavax/transaction/xa/XAResource;javax/transaction/TransactiondelistResource%(Ljavax/transaction/xa/XAResource;I)Zpool#Lorg/enhydra/jdbc/pool/GenericPool;!org/enhydra/jdbc/pool/GenericPoolcheckIngetXAConnection>(Ljava/lang/String;Ljava/lang/String;)Ljavax/sql/XAConnection;addConnectionEventListener&(Ljavax/sql/ConnectionEventListener;)V getGeneration()I:(Ljava/lang/Object;ILjava/lang/String;Ljava/lang/String;)V'(Ljava/lang/String;Ljava/lang/String;)Vadd(Ljavax/naming/RefAddr;)V(Ljava/util/Hashtable;)Vlookup&(Ljava/lang/String;)Ljava/lang/Object;dataSourceNamejava/lang/Object getStatussuspend getConnection()Ljava/sql/Connection;java/sql/ConnectioncreateStatement()Ljava/sql/Statement; jdbcTestStmtjava/sql/Statementexecute(Ljava/lang/String;)Zcloseresume"(Ljavax/transaction/Transaction;)V![\]^_`ab cde@**fE? Fg hicjeK**fL?MghiklcmeT*+**+fS?TUghinocpe_*+**+f[?\]g hinoklqreK*  *+ f` abghis`tue+ M*  ,N:* **: Y:* :*  .:*  :* Y I-!"#<-$%&W* ' :* Y) * * *+,,X[Xi(fjijkmop)r.s8xDzO|X[~]fikg\ )s`] vwkxyxzhi{|}~e3*+,-:*.* / 0Y*+1+,2N-f 1g43hi331 &Ve_* 3 *4L+5Y6789+f ghieD*+,-:W+;:?@A**B?C* D *f )9BgHDhiD~DDD4)(e/*fg hieX*+* +* Ef ghi^eZYL+FW* &+YG* HI W*+*HW+*JW+ f"9@LUgZhiReB M* K N*  * :L6 * MN+N:OM,P:*QRWS,T :* YU 66:* W6":* X6:  : -* -Y: * Z u{~( V  (fz #=BLRZ b n u{~!&"#%&gz xz#=gRRbBxxy z hi~ xapool-1.5.0-src/output/build/classes/org/enhydra/jdbc/sybase/0000755000175000017500000000000010235647011024246 5ustar twernertwernerxapool-1.5.0-src/output/build/classes/org/enhydra/jdbc/sybase/SybaseConnectionHandle.class0000644000175000017500000000216010235647011031656 0ustar twernertwerner.3 ! " #$ #%& '()I(Lorg/enhydra/jdbc/sybase/SybasePooledConnection;Ljava/util/Hashtable;I)VCodeLineNumberTableLocalVariableTablethis0Lorg/enhydra/jdbc/sybase/SybaseConnectionHandle; pooledCon0Lorg/enhydra/jdbc/sybase/SybasePooledConnection;preparedStatementCacheLjava/util/Hashtable;preparedStmtCacheSizeI setAutoCommit(Z)VeLjava/sql/SQLException; autoCommitZ Exceptions SourceFileSybaseConnectionHandle.java * +, -./ 0, java/sql/SQLException 12.org/enhydra/jdbc/sybase/SybaseConnectionHandle2org/enhydra/jdbc/standard/StandardConnectionHandleM(Lorg/enhydra/jdbc/standard/StandardPooledConnection;Ljava/util/Hashtable;I)V preInvoke()VconLjava/sql/Connection;java/sql/Connectioncommit catchInvoke(Ljava/sql/SQLException;)V!   T*+,  !*! !*** M*, $& '*() + !!xapool-1.5.0-src/output/build/classes/org/enhydra/jdbc/sybase/SybasePooledConnection.class0000644000175000017500000000243210235647011031707 0ustar twernertwerner.1  ! " # $%&K(Ljavax/sql/ConnectionPoolDataSource;Ljava/lang/String;Ljava/lang/String;)VCodeLineNumberTableLocalVariableTablethis0Lorg/enhydra/jdbc/sybase/SybasePooledConnection; dataSource$Ljavax/sql/ConnectionPoolDataSource;userLjava/lang/String;password Exceptions'newConnectionHandle()V SourceFileSybasePooledConnection.java:org/enhydra/jdbc/standard/StandardConnectionPoolDataSource (.org/enhydra/jdbc/sybase/SybaseConnectionHandle ) *+ ,- . /0.org/enhydra/jdbc/sybase/SybasePooledConnection2org/enhydra/jdbc/standard/StandardPooledConnectionjava/sql/SQLExceptionc(Lorg/enhydra/jdbc/standard/StandardConnectionPoolDataSource;Ljava/lang/String;Ljava/lang/String;)V()VCodeLineNumberTableLocalVariableTablethis8Lorg/enhydra/jdbc/sybase/SybaseConnectionPoolDataSource;getPooledConnection()Ljavax/sql/PooledConnection; Exceptions+B(Ljava/lang/String;Ljava/lang/String;)Ljavax/sql/PooledConnection;userLjava/lang/String;password SourceFile#SybaseConnectionPoolDataSource.java  ,-PSybaseConnectionPoolDataSource:getPooledConnection(0) return a pooled connection. /0   PSybaseConnectionPoolDataSource:getPooledConnection(2) return a pooled connection.org/enhydra/jdbc/sybase/SybasePooledConnection 16org/enhydra/jdbc/sybase/SybaseConnectionPoolDataSource:org/enhydra/jdbc/standard/StandardConnectionPoolDataSourcejava/sql/SQLExceptionlogLorg/enhydra/jdbc/util/Logger;org/enhydra/jdbc/util/Loggerdebug(Ljava/lang/Object;)VK(Ljavax/sql/ConnectionPoolDataSource;Ljava/lang/String;Ljava/lang/String;)V!  /* D**** # $ V* Y*+,  + , xapool-1.5.0-src/output/build/classes/org/enhydra/jdbc/sybase/SybaseXAConnection.class0000644000175000017500000000241010235647011030771 0ustar twernertwerner.7     ! "#$ %&'(S(Lorg/enhydra/jdbc/sybase/SybaseXADataSource;Ljava/lang/String;Ljava/lang/String;)VCodeLineNumberTableLocalVariableTablethis,Lorg/enhydra/jdbc/sybase/SybaseXAConnection; dataSource,Lorg/enhydra/jdbc/sybase/SybaseXADataSource;userLjava/lang/String;password Exceptions) SourceFileSybaseXAConnection.java * +2org/enhydra/jdbc/sybase/SybaseXAStatefulConnection ,- . /01 23SybaseXAConnection created4 56*org/enhydra/jdbc/sybase/SybaseXAConnection.org/enhydra/jdbc/standard/StandardXAConnectionjava/sql/SQLExceptionW(Lorg/enhydra/jdbc/standard/StandardXADataSource;Ljava/lang/String;Ljava/lang/String;)V()VCodeLineNumberTableLocalVariableTablethis,Lorg/enhydra/jdbc/sybase/SybaseXADataSource;getXAConnection()Ljavax/sql/XAConnection; Exceptions<>(Ljava/lang/String;Ljava/lang/String;)Ljavax/sql/XAConnection;userLjava/lang/String;passwordxac,Lorg/enhydra/jdbc/sybase/SybaseXAConnection;getPooledConnection()Ljavax/sql/PooledConnection;B(Ljava/lang/String;Ljava/lang/String;)Ljavax/sql/PooledConnection; SourceFileSybaseXADataSource.java  => ?  ! '(xapool-1.5.0-src/output/build/classes/org/enhydra/jdbc/sybase/SybaseXAStatefulConnection.class0000644000175000017500000000120510235647011032502 0ustar twernertwerner. D(Lorg/enhydra/jdbc/sybase/SybaseXADataSource;Ljava/sql/Connection;)VCodeLineNumberTableLocalVariableTablethis4Lorg/enhydra/jdbc/sybase/SybaseXAStatefulConnection; dataSource,Lorg/enhydra/jdbc/sybase/SybaseXADataSource;conLjava/sql/Connection; SourceFileSybaseXAStatefulConnection.java 2org/enhydra/jdbc/sybase/SybaseXAStatefulConnection6org/enhydra/jdbc/standard/StandardXAStatefulConnectionH(Lorg/enhydra/jdbc/standard/StandardXADataSource;Ljava/sql/Connection;)V!I*+, "#