From 102a90e917976be7e90316699f9e9ce83f6b11c6 Mon Sep 17 00:00:00 2001 From: prabatuty Date: Tue, 19 Feb 2008 08:50:25 +0000 Subject: [PATCH] Recover cache tables from target database --- configure | 3 +- configure.in | 2 +- csql.conf | 9 ++ csql.kdevelop | 1 + csql.kdevelop.pcs | Bin 595614 -> 631382 bytes csql.kdevses | 43 +++----- include/CacheTableLoader.h | 33 ++++++ include/Config.h | 7 ++ include/DataType.h | 2 + include/Makefile.am | 17 ++-- include/Makefile.in | 11 +- src/Makefile.am | 2 +- src/Makefile.in | 2 +- src/cache/CacheTableLoader.cxx | 214 +++++++++++++++++++++++++++++++++++++++ src/{sql => cache}/Makefile | 114 +++++++-------------- src/cache/Makefile.am | 5 + src/{tools => cache}/Makefile.in | 146 ++++++++++++-------------- src/server/Config.cxx | 18 ++++ src/server/DataType.cxx | 48 +++++++-- src/sql/Makefile | 19 ++-- src/tools/Makefile.am | 3 +- src/tools/Makefile.in | 7 +- src/tools/cachetable.cxx | 116 +++++++++++++++++---- 23 files changed, 568 insertions(+), 254 deletions(-) create mode 100644 include/CacheTableLoader.h rewrite include/Makefile.am (81%) create mode 100644 src/cache/CacheTableLoader.cxx copy src/{sql => cache}/Makefile (77%) create mode 100644 src/cache/Makefile.am copy src/{tools => cache}/Makefile.in (73%) diff --git a/configure b/configure index ec08fe17..da2f5f60 100755 --- a/configure +++ b/configure @@ -19946,7 +19946,7 @@ done -ac_config_files="$ac_config_files Makefile src/Makefile include/Makefile src/server/Makefile src/sql/Makefile src/tools/Makefile src/jdbc/Makefile" +ac_config_files="$ac_config_files Makefile src/Makefile include/Makefile src/server/Makefile src/sql/Makefile src/tools/Makefile src/jdbc/Makefile src/cache/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure @@ -20541,6 +20541,7 @@ do "src/sql/Makefile") CONFIG_FILES="$CONFIG_FILES src/sql/Makefile" ;; "src/tools/Makefile") CONFIG_FILES="$CONFIG_FILES src/tools/Makefile" ;; "src/jdbc/Makefile") CONFIG_FILES="$CONFIG_FILES src/jdbc/Makefile" ;; + "src/cache/Makefile") CONFIG_FILES="$CONFIG_FILES src/cache/Makefile" ;; *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 echo "$as_me: error: invalid argument: $ac_config_target" >&2;} diff --git a/configure.in b/configure.in index 279251a8..51642b0b 100644 --- a/configure.in +++ b/configure.in @@ -36,4 +36,4 @@ AC_CHECK_HEADERS(stdio.h sys/mman.h sys/shm.h sys/errno.h crypt.h unistd.h \ -AC_OUTPUT(Makefile src/Makefile include/Makefile src/server/Makefile src/sql/Makefile src/tools/Makefile src/jdbc/Makefile ) +AC_OUTPUT(Makefile src/Makefile include/Makefile src/server/Makefile src/sql/Makefile src/tools/Makefile src/jdbc/Makefile src/cache/Makefile) diff --git a/csql.conf b/csql.conf index e6215bb6..1c469815 100644 --- a/csql.conf +++ b/csql.conf @@ -52,3 +52,12 @@ MUTEX_TIMEOUT_RETRIES=10 LOCK_TIMEOUT_SECS=0 LOCK_TIMEOUT_USECS=100 LOCK_TIMEOUT_RETRIES=10 + +#####################################Cache Section######################## +#DSN Name to connect to the target database +DSN=myodbc3 + +#Give full path for the file where all the cached table information is stored +CACHE_TABLE_FILE=/tmp/csql/cache.table + +#####################################End Section######################## diff --git a/csql.kdevelop b/csql.kdevelop index 83b519b4..d7fa218b 100644 --- a/csql.kdevelop +++ b/csql.kdevelop @@ -29,6 +29,7 @@ + diff --git a/csql.kdevelop.pcs b/csql.kdevelop.pcs index 3b99c3f1d310814c0c49504f54b4116d4d70bdb7..d9613c8081f793df8e5caf139a47e9a81f600a0c 100644 GIT binary patch literal 631382 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 Qb)LI|Kl{n7_YAN958yUy^Z)<= literal 595614 zcwX$i3wRyZaVA&*K?)ZJAP9mW2!crPA&R0Y>S;^1WlIzvB4vuCMN0CUA_|1YWXmtv&TBWxIA11-cXl_)WH+c?uzP~H-=}EdkGr`}cXeXV0@Z`kZ zL^lSHq=#1U%u~UAb96d*?iqRND}twfD0u13$q-)DnooeJ(= z3g`mA>$=}3+BzJ(>#-KT3-ZP{!5jA7@he{@dhd(f9uNs|YWVJc@Hd0^ zzrLmKpEefbO!$ru{7#Ge_1@s#1=F8xjd^JQo2mQr|GdTg>bT|4r)t_9MYN z-rT}>JZSnf?wyt1e8;taN8SJO-?f;R1Hr%Xw`b~ox%+pXX|WwVVC==bdBf{}?{BF4 z#gDi64F`=ye_P$^t-0}z7R%}3;BQNHIYEcl?EV)m*5N~@U(N>_JY$|`Y{I^EUwV|* z96ZwEcO41toeus!Lp%~r*L8W#TRzv~Q7ZW^+vXhk>(9}e#lLBB|2bl;!70L6xEQwC zNA|b)JxApYGiFpodoBI(r)kZ%{~&nJRB7+A<+tnN-_n|2d#uH6cGP^%WBr`DW69!i z{|}$1HNS`P@pQ}IdDM(m&=NdzF8EvU#utN&*8J&~7WeAVV}c~_zi^Iv*8F;lds_I8 z_(tt=(}bc<(~X-y!~vz_nh%=`EBUGYaji)l6cj(Y0HLj z5^dpmT08gY7U^^R?dY%Y6k~S7c&2OLPAeS0vfio@4SwJLzkHO|Ui_O<^f<#lK6vQ1 zf1mGkcDR13xq zO0i5wM3!N6ir;zf`ah<1KmPSnM%N?cj)a7M%({=kTU^P^+WmIulEy?V8GqrfQZ(qO z^{>eLzV(}>^c7c>#Cr439VtbdLaz`u|8&GNT=%PgRf^?Ji!6lR(z<`~Tq!bk#TfX_ zk3IW`wC>Lk-+h;-H)q(z|MG!SdhxNqPMsIIr~1hJ_W$~i!P}o|`P=hiAUYzQrz^TK z|6574GabP^h1TQ2pE*ib^bWO5zxm&Lg5PD$snM&hxcQ%2{?_Ttw;n$`L08=QV=aE` z0i)6Gx1Rj90lH%U%Ud=g@V_zoEtqzls{6~f^|<0q(B74-8@t~qYwmc`1%sDB<$;k;Ln=i z&s|1y`R;wRU=SS&p89ls?zqo9@iD^4b~JeRJA%*r;Kv$$uh9F1ho}^niDip?zn4ga$L;{{LK}=7pC^_lDB^wz?fPGcLhWjeRJJ>%f>nzJ)2~%Bex&eekpk%b zNht)s#tphh~)_SQgV4Bt+rK@ z0S?5{nSZ^{&Jgg!{l|hoHKF^{xbI%3aK!8lFqpP+NT9FYcD4o$n>X@2>S)7#5lIf ze6PX9^rj?E!MJk!vMxX$w1rcn>OIHNp4;nkiI4V4&iqL3Cy4tLXv+9RPa4ita*gu8 z)_i(CK!tZNIqr+v;JD0o#$*;9#jBDVCNnjmh!@A@Hf1=gQf^~Lua+zhG#AB>gpdKz zBlKQMO6XLbkKt5|;9*2~ursChc*6gT;0JwW3jXkl+P?7wX5Uu($BC^r=;jpU=L~A~ z5{3*0JmqKu+7{(`RCtcB(fQ%`eFPn1x*>(%J#`+&Gji^toWwI0{BZI^1iygk9Z61V z-&tO!D#o$lggn$Y929x^omC;HxkqSLg|guc(daGidY^A4st?p-1R&CerxW zxyg7OSdHSoQ=KjU2(h$5(>&V?27fDU`IzCjI=|r}ajSu*`3-!95tAiG=d^~kLMnscJMo9?tslZLzst71+(`oFL6+~_G`bPYc-)aP=eq0y!hfW z*=^i-R4mTt`rtRn*@4BZE`srK;T!b6B;QoK3jFB!J{a(TxsHsv&K8f(i0UJ>HQu)} zCNV-`ghagpU*qKmiLK!W4Gxzz#1*w^J4KQzqc9G-&uB#SeZG3ZCxn|%7=$UK|34#I zSucpj^43vjX4ne+&CU#0qp!T0yta<#;=eCcjCc z-%RaR?~BX~Rf_f+v@e8+5Y&VYM-bN6yGXV2G{x70eW9Ecl(WR1Tslg<@NIVN&Ijf_ zg60jx7R|o!Z`k5dW4oRS?%PX<9{`WPvGZ}_9t3)=pvsn;UQtgGS3B6)2Z?PgXgk~3 z{lqpFw7qRCGR=C0x@|0?i>xWW?ZRt`?E>i4lx@8<*CUMD`a*e3qf^#obsW4xH~`)1;((4C^y;_w2cOh6xPkbC%{{Ij`7<6ML1Z1d zRESF*CFJUyB7b(~c49jNI%;td?ZJaIW3`VjY_|zE&><(bt#wZ$)TPs6wI4SB_i4B9 zB-Sd>^%mx&-5yTh_J#2t!3a9y#Hbgn&!{7|>Id%zL9&ICw$Vmeou+Ok9%DeSv`|Gg zwa>B)esFCf_8UR%9u)T*;}|$gf>KFJQ=h-d`Wm5 zPY3_63hniR2UPo5676>BS2O1Qm?u>&<#E!HiC3hOxb+iQ=3dWvznJ?B2)&Au<0^2q zvId`3P1`Zr7rB6HCDk92s34USMnZ`S+&MUrRnu+guHZSlgW35}PP=b)P{biH)Scy0@%WBCQ*UFKCGeO8cy-snK87i7E1`NVy} z=)RW@nkbJ?4%D`Mh>}_X-+N74qPEw-UL(khp(L``0~*d?lV3wBx{evv;tKsUpRz#K zc}?icsIV+*pBh-EaJ9cb_%(iUgc`}r>Nm1vs|(xVvsK zZ_f$&AOk`%;|bR+61-TPX8TYF0{giqklyP(^YUwg?oTM`Lm>{3t(R4y{_lzP0yJMQ zZInc<&`U^Vos9Q>IsaG0x(9lY3Uglj^1)?dnejM+nr!Es88pZgm^WkP5>19(J!SjXepQ(E=ep~eSi6eoaSko!oqK_<7 zD|}$=Xqhj(%RBV9TvDvY>-|IGnFOfr|0y6v;d13tY}Qwe&m!FW!F);+=Qmv^R4aQF zlV&f4_BF4!CMB7_%ScN29v@Jha&k?*_j{gFro z^yY@7vNCN+-#vOLzkPU*BRjuAto5LcMRs-+kX=<#yuT8h|3JwY587Z&o8$jG z!3nxscxVW3?OTTJm1`{|wUy%QJUSQIWqi&sTiK_K{%>N<1wGJ=jLz;f%c=HCLt`FS z5qsYs+W5r!Q1*_l_^D9&V`p_9-+v-*i@&FEmt#Y1QTqalO4Ucv)~>}38Gfu-O+zi* zycdbeW?355=vrQNzR`asZeP$1)I|FV$IZ`fvV4t3k@%Ec`&jb!^gnQt-+<7@{13P9 zb}Sf|9tdQ&*E25%1l?OG>2;v(vi;(!P(Mtp7ohomaUJE^od`0uKrdM;@g4f=S=24B zXQ{lAST8~Ib4u*CBeH#p>Slv^87M_(boQD@$gz&Iep}_u#A_a)x@WO?tKjOjkXP+B zy^dJN5CnZy!`xucWovXSYo~oOV$@7+5%%eti>c-J0GIdGI{mNG_d*0>K6{>)qo{pNwmt5`3=?x--zZTZ^CcA4$1mJu67h7C?&6PMK%< zZ}+zokE?Gdu7;>rbX?Wkiz@uSDM2`uiExmt>=5r5rv)SERTjo*g--ULm#jLMJ~5sq z9?d~*jU1}aQ=-)_`{`+eyo!E)UgQay-sXC-2US%r>(2^`UnRE(1*^(7zP@f#k(T}v zu~b3r(I}~<6U4Rt&XU&Y41Is!sDDLd2s)ODTJy`Q^7Vc}kb>s9px_z%3r3e z%9T}m0ROEZ1Z`Ij;J*`$pl%O9FN|6vZIBiD9|X@|l6(9@99n16(fUGuvHnM534_|b z-#re5d&2!9{c}P3=LL{1)$gtX>0b!azsN+Y7yDXO<#xPUP@t~7OINl2ef7Q;q|+-j z+t;dgM*RTsJoN#}pQlzmQtcL*?xw7fYE)2$e#~?QSoa84P`mxxXH?xK2tnPW>X0C; z%BQ}c*yjUv`P6!Ko6oCR8T~QA@G){*C#@4YOtOj|%&<{kV#>QzKT0fB&>Jm;?N=-G zBZBlJ8A#)ou33x+x_ydHnWrsU&ptqiCHdsy<$?(GIzb67iT1Vii5252G2bDm?#RSE zX6^l|679Lrh;c2j6LUo_b9`yg6Y;w#FKIo#sY=0<|^f^^Rw-ls7LFl ztHgSzpaD(SWBbB4Z)_<#WH%x@bOv}FxqW&ep2VKI-d8Fb;=O~o-b!xYTyqOiCm_7P zY-HG>IxJM9@LdMQ?g$FKx>LR@7okR7UQbEc;baT6rdEX0k%)6y7mR<_>_8pD0mASfU4qk(0&pt^S>iaCrFMlp|A zn9mrm8)7X9|>^Hd(r8K1T$!!jzo2OeFX7Qla20E z+6M(WsOI5Ekk`I@bXkzcr9B?Oek^z%G#gpJAMZo-Un4`N}%VB-hBHA`Xb)FBJ&&%(v_Y-pps#UJj^ho!4_5`1vcXFqD%%Zi` zP`eh{((V&}^5il~*pWAHq{ID7cQckNom~{JW2Q={_QIiM3Z=8oM4w%?@{?ThJx_s` z!uLcaGr@P8esjW%PCokyR`z>^BF0e6gBhx0@67ERLEM?!mv0X{bNkNRJ`ZzeZr_>P z=OOOQ?K^Y(Jk*`Jefjg`%V%!iC3hiv&Cl%UKH~idpjfZd>Lg>4-$v&ndUfagu3Y4* zrCLSGzVPogm7?25+>)>fYXy-LP3=2pmI2$UW3zhE56Qiw1mDB|oDi{|UZGc0c!j;J z$DmYnzDA18f@?EnWv361}k*GfX{Vfd2T zxJV7uwit1#DLTLNrt3s0&>;qzs0 zCj}X(+un{?$o!238wJ}&%GNgQQ1Lly85LZkl%;J$wCH(mG9kDoGI53bWc(q!L6Cu_ zYgyg}ukWob#2Bw5vNJaq6uu{B8Kbg(n5;xnGCtxcGA^`Oe4c?;=k?eV1|P;!ADGa3 zR|>sLaJgj!EeLD8W}j!3sP+Ezi5|y8{N$cNuj!KNx4j3Eauf=eZ$dFJy=Ow$v*3fEevAFCfVzOsGr#(vjII+}0 z_tWJe^|*!F6a4D}@qP+_l1Ik>kWj2qT@I38ACo-l2+SK^{mC7BK!$|sX_c3{+{a^b z_ifv;cVtMYR`0mfWxgdQ^Mk~Z2BrR_kKIp0Lb0ZNIY>V~vig_$8;GS2dby0Oar=JM z$aul4t$7o%+(9oF`yTgbP*`RHmy4YriAmj`w2`3-X(Jz4vvIPey_Qy+wE4Z|M)B$^Uyc?Y zG%Y+wIFE_Xx+=eI&k(mQD6*~c+g4+CgVIXJnwHr*enLa7JY=}Ro`>e&+pEtg{O0%$ zoXJ>A9Si;yjp6xdyIJD418vmnYE%Nvw%5wEBrf;$DRQ?XNj{`LM=W*FM#rAjDfNjI zsfSS{A2L5jEOXFCV;QSc=3^-`_h(to63ZKOFI^7u9#4_C#xHzGe1=%!px6_7=}UZ5 zhQxhJ{z+oVgEl&YUY(Lpv*%&d$cN0|Ml5sC%fp_hc`kOu$cNPDiKPyDd3Y{7qdHGM zvmlNUOBu9SL@3OH@FnH4XS(t1hiI$pAl^UXoRgbAg7?EB`Din|5N`I+= z-TN7l2$9Z^;m^p=qt-q}thJ!Ua(C1=tUmqgC9SgWL$XJSB@4Qlibz&Yeks_0eZ+eNir|j#r!s&?9t`R>o_6 z*HMhGQRB7QUce;XX!hlo&);W>`2*EGrp@vfyRU8o!o5~ibNe}BZb4VdZKO4+7@u1` z@%cq!K0#N?XY;M|a|^msZkuV9bNY1NmS z6CBFt^Q**sg1(G0$Ne@#{xv}ks&oI07P3aY_!ajWi}2`23qL{3Bj`%Cu=zgci`$buX~;z9bN>2tSw;`1}ae1fi&&*odz7q>q}%q{3jxy@_Uu@pY<4gT}P>F0?#1=Y%Z&2n0- zU908yr-}ImT`9kLEjyCJsUI$J#$=DsyJ=-y7Hie&c>Oprub?aCHLpd}boVvEe||Xq zZ-_YsU8(LCYt?G`{Q@z+peyA!uVvFlo40!6^I2j(L03B36l>QixqXh9ThNtqo7bvo z`a2_UD4$cDo!cYS9ciBgBZA-6Ht+J(HeVLRpet>g<~7k5w_hRV7IdZDW@%z)U8)Gu z&bm}{yhb!H$By_~sp+gsHOp<@h*srF%@?V&F4Y{j&9thom731FRI}VR)2hB!cRK4* z&BVxkt<-eZrJCionLg)hb*Hl~)l8rBwNlermui;VX8N43m731FRI}XXwQ9BNG@W&+ z=K0NQ+3MD6I_px+@tW77)vnWY)}@-~H?L)@T&d}-OEt@FUaNN2r5Z#0W$LU;HOFn1 zCU(htwAB5{j>P6#R+fw`lfWG2|Ca_9OzVI`{~KxX*luv1kE{gcbFaue`C&$F%{4% z()k0bwdV7Sg!6%1yRD;f65P=jAfGpVyV&l`wdRwl;2o}$%B|m5CbM5B zmKmtpGM7&D1W$6+(HkXuMOW{SujP)?8|dNS+hf6RZQb#}Y1b|?Cvq67bwX@Tdx<5{ zoOY~Z?P%cl1vP_;_s5ZBf8-VjpGZ3EGH<8DbUJ7c(Q5M03iOY}k_N?TUh!6#6keiu zhb_F12fv#()n3X+`|kxU=yh$6_CFJ!IRpCA6tuk*_T@p*rz!r{p-~PCpWt{rh2vcT zZzqk1P(J7Xhj0#hV+!Y!!cWvnsSgvLD_<=ae{T>ny(NVUyZsumAB}T;h)x(jeQ^C} z#BB%K+P3q_#orLO9jL#yvn|aV$c$KCxcw*L2(-9e92K;SW{%`_-08ZHc=QLoH3c!a z(G$3u@$?$=7@~4nCpC;b$btS>VqQVh<^Ypa+(+&eF1A{7$d_H(UD-V%en;GwLFJ=^ z2I+a9y`T%{S`P``LfL&jPnOwdd<_~Nx!w-fdnuhe`hDUvS3$>8xSJH@ajc^;tl=G{ zWA4JNe@LiCe&a1tRJ%RT04Yt9md|hIOgww?A;|}b?IoyIvUJUsip)*io@9}>Xb($c zy^(yh0V86H^RIL9a(0!_yQoZA_41fPi-oky#!#(m@6;>o#Kj1w6%v#h%|689R=mG^Z|nZ#XN1T|dH;PV@?$q-?v>?HsWkv5Hhq*BKuDtTX)uBqcG@=QW68buRao5j_)a(mAe~ouUIGwCVXqX)sA~08EboPnvO@aUa*@7HtjnNzy4<`@HY=$jecq3p zzCkP}&~UxE3^}!G9H}zKDRtQlU3tIv732J(pa!k3-}}kj`X;eHgSuL%{q@;b<`&LP z9}>EHy+}W@dMj}+0@WHoEsn!bQOn^gbL%_A`T@Fn^}|o*mejH`boE*uUzuAk5K9Ym zb!b*qnOitDrB~=AW!s(BWNyWL0P?}*`-r&&EgmJ>7DIYe-ZmZhIfxa`5vs_YB|q`( zr-?@h&{r4c!DGHx*J+V5XqYP!)ul^lHHy+TdnwQkf3d}n6U!VlO|yw?zu{a#Nu=}T zah<*E0gYgeOH>_7&EksRrAx61VuT8Vrmt z9gDfF(YY$bzbS~ZD{EIS;wwn!ckQ-6i&4pJxbPkQWaZivzKf#)#pbpR&W77SBmO0^ zM*L1dZ=yVn2*;Zx=ZG5JWtMzW+*7TJ^Z!{m2i16|n{$nPcGHxD@BAIB-E}>QU)Crb zlTKxoy1Ow~=n<-ssdV{F3K#L{Y>3=r73}T_!40Z;294mZxC(UlO@beEUm^UCNOA^0 z9xJtVZxVhswTPdJY94p*5I#Vg(W^np<5tVy0dv-SxjyxUbf&13Fp`5>Cx|T9G=(fcTh^jMFm5;hds;j#1$o8ub5B7>{#vtQwTR zQqdlJ11gYcx6Jvv;ZZcML-ISP4#ns9aUJr!8>0Jwa0{wunKfoLz3+?YzD6*E?k$A5 z4YK;X9~9J}8eeWi(w?guci%2}L7UNxiYf(nzglpEzNQfFJb$K=3cB5Q3m)m zUy>DOo_3!gmL=$=s+C?O+4Zl8eP*1oq9;oiiK(qz0wZbPkz2PsWvzB&Oc)Y+sp^)O zoYw9qh$RVnsaiZw8L!f1dGfT^!_tuJeLj%?y&(Vl zCXk0Y$SP}(xyap*Gjc;8$VIMWO>44}ZQk{bK6#gnDnotqUO`57_g>)_w3!)xTV-~1 z?-p)A4>rM#=6LwDaQ~4pcj27T*2UBPub)>hNt}}jN&YS6ML~(ezFRDkp1l(5%6|5k zf!=+Dxi?g6P~~&KigMAr$Am-B?A0>8T9BE zU))IlDr&|i$nOf-1bt?nP4KuQqWcly9<&jgunP7@bU!S-fi@GZ^;+e*dzYZy)dbot zq*48}-6=b!MqJ2{CCj#Y#5XX%}s#7<6PF{|0hNi2rClauJj59s71rt`77auPckOY$A* zEFmcmpPp4GpMhoVb4|aK&(O(dC~7Y|`3x(>+{tHXnIt>;3_aAzXQ+>;)X8VazoV1S zkYy9Hqbi+zhG_eC@)_J{cL~~EO`z@Odx=k4^)#AxBid6FIv^;>pa{owMz!RzKhFrN znFOlPs>H8xLE1-$gD35xIr0)OB#ChvIv`lk?qSQ~+aZH$Z}8*`glMK0zu%l{(j#=p ziEZ3qdoXzWw6ys`@Epux=DeVkn3|ziIZ?xXuKBJ7qrch4-K!0v&bY9Wi(g5@PL( zUN!esf&g^TiElC$pKqPLSJ2!`Ts1izD_hS)G*4dU@+6U5Lu*b{qZTUPa(ks<0KL+Q zu-70w?8ncbhvcmfnK!#IjRb$=yB;u~!{%J{f)BpW8lhuOe4`e=i^ifKkZ;RJxKR*- zx-Ixn9ihhvhsnfSBeaP0_Lz6UFY;8;)SNB9MyMO%h=mZd+>^m`{YY@L;M<&uZ@7+c zU+~0v^CTbWwg|c{ndk=V==}AH8w43>kzR4ocrRzXU|TQP)@NcHOJMVfaf4vokclzW zyQ2orf~VG<6m*lB=teAbOU6s}CB2slK2UeR2(`~+go(D1u7qS^8&6=f=ltcPyjf7* zoQX2jzem0Hj-7&TXC}H)3*8*OE%-A}Pm>>i{#HQ}FtkO)9!FFyQV*#^8t=>eVfOh7$Ldj*K{G3)km}Wno{)Hd<2|GJCGGMbM=o zF_*}gZ4Uf8cqpe#e?1lSiv8x-X9Lgqg84UM&SlMqqFg*dJm&zN%;SPEqtpnw<_hfy z-V#P}b{XDw%l+W;OrY;4#9Q>k6VAY?3Ek-AX=|OQc+`JegrkQ|Yn-rpuU~H7D%^l> zaB)-n?kil}+!5jCXkdF5&EL)?-nTn=-vwi(eem@<;s`6&Idm_9OY^`7uVl$+;;>o6 zqJQXB$0EPfm9rUohx6`!{hp3T*3Sm%R9!L$XiuS47I1RXj3P_*vnhC%;A#!udWCG6 zno!IT(&ay2=P#~T6Y};2gMQkKS$;JLNP2|ouBK$qc;Oq%4i4@xPoFhy)J{DECyWgU z)ofZ<&%k%Q{x{>?%~nh^w@dzf*n{G4e3&=~`Wf;eg&!f70;ulk%ag*W!2#^Mfn#B#lLpoKh}S!4LN_Xveg4=l15{AZ*MK=tIs6#SpkHi)iVPdd>1 z?NdKa+^0Y_ucewkH74@d7a(6ScGqWrI!D}==ZNR7>23LZk8+jlPos7G=u6XH(Z5^J zgE}>l!mGW|zemu6ZpuNgI@pZomgIVqaILeg12kulKI3_ONA#m6bUo#_U%!P=!k?PZYn=F>`-I|;k4qDEZsSSP0$~a5m<8$aOW)f_8vY?>^*?$*{4Z8dzO}|Z0})*$fbSeY>yIK z5zw1mvJoyDpR=Wn07YbQ%>4 zw<9ZuqbyTqls`>~W0Ws}*Av?=P_4j|(nJ1wxoHWErt%i|3PLGWWh*{JY%4%Fx+Gz7 z>7IM@`>KmFogyAxL7h=1i<5YiX@_~w47E>W<$c6s66mChquu=TvEBG^IIDl^X;Na830cg?L^|}DZl5tz14rEEiDcTtql5S1z~3hEsIjbBG#+7yb2}#7RE!i=Gd8bzUQC`=ZxW8HULANw zcn96);$65>-utMYq2k~_5O~KL!u)za}(qMWj{zd7{p3RdM^Lh$9Q2TDK-e z%cpFvv$ecHWZxl;ur`FhNdMc3Tm9{nWyLuYHf;4dM(B`0cI_UQO|NQo;DSg1)ai)` zXDR{Im^%@%O2zj5$9W$W-ql|{YWhoAdl#a7BT1r1XgQH$o7;879H+gZd|sQ)6JGuK zb(iwW=<1J4cgDZV(;8}Jl3~MXgkt9W9KVqrB4#awLfVP zBqVKp0*)qgx$%Kn_hq3LM;E1Eh=j0IPnr3=&XfFT16E0ELWeC>(d;c7pUzAC;M*ej zK((3)E;|bd=x{Q_Nh@j`Mzs9kyp1>u3siT5vK;N$T95ezND;O0gY0_Zegmo%b#TS^ zfdZ9psofz`1C455Txx>`pU#f_phNAmn$XP_x?a+G4P)D6u<6Kk%seL=RrQ1SocXf#URd(1pC2!mtY2+$izGn%n#$SFh3ZvgSsYkB!V$+Bi9?fa7C~DpnauC6jZAc z;fm)laj)mOtY4eHS>y?tWz$CqyOrZ{0Y4Zw5?f8st1XQ2z2CgHjOtlW1^=J&gzjEq zdwH)Q)N9;G330hIG-vRHF_`=d9?EQq*b lOD4GP8`0ojR(Hm`kW_uMopp24^h&u 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

oFw-`zw}ZGJ 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 X-I(fj_Ytvka)0>eD5xEj(e?iU1|Q&g diff --git a/csql.kdevses b/csql.kdevses index 7b9e844a..741adebb 100644 --- a/csql.kdevses +++ b/csql.kdevses @@ -1,37 +1,22 @@ - - - + + + - - + + - - + + - - + + - - + + - - - - - - - - - - - - - - - @@ -54,12 +39,12 @@ - - - + + + diff --git a/include/CacheTableLoader.h b/include/CacheTableLoader.h new file mode 100644 index 00000000..7d1adda1 --- /dev/null +++ b/include/CacheTableLoader.h @@ -0,0 +1,33 @@ +/*************************************************************************** + * Copyright (C) 2007 by www.databasecache.com * + * Contact: praba_tuty@databasecache.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program 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 General Public License for more details. * + * * + ***************************************************************************/ +#include +#include +#include + +class CacheTableLoader +{ + char tableName[IDENTIFIER_LENGTH]; + public: + CacheTableLoader(){strcpy(tableName,"");} + void setTable(char *tablename) { strcpy(tableName,tablename); } + DbRetVal addToCacheTableFile(); + DbRetVal removeFromCacheTableFile(); + DbRetVal load(char *user, char *pass); + DbRetVal reload(); + DbRetVal unload(); + DbRetVal refresh(); + DbRetVal recoverAllCachedTables(char *user, char *pass); +}; diff --git a/include/Config.h b/include/Config.h index a7782168..ceda722f 100644 --- a/include/Config.h +++ b/include/Config.h @@ -37,6 +37,9 @@ class ConfigValues int lockUSecs; int lockRetries; + char dsn[64]; + char cacheTableFile[256]; + ConfigValues() { @@ -56,6 +59,8 @@ class ConfigValues lockSecs =0; lockUSecs = 10; lockRetries = 10; + strcpy(dsn, "myodbc3"); + strcpy(cacheTableFile, "/tmp/csql/cache.table"); } }; @@ -86,6 +91,8 @@ class Config inline int getLockSecs() { return cVal.lockSecs; } inline int getLockUSecs() { return cVal.lockUSecs; } inline int getLockRetries() { return cVal.lockRetries; } + inline char* getDSN() { return cVal.dsn; } + inline char* getCacheTableFile() { return cVal.cacheTableFile; } }; class Conf diff --git a/include/DataType.h b/include/DataType.h index 2cfed5e9..77861e21 100644 --- a/include/DataType.h +++ b/include/DataType.h @@ -84,6 +84,8 @@ class AllDataType public: static long size(DataType type); static SQLSMALLINT convertToSQLType(DataType type); + static DataType convertFromSQLType(SQLSMALLINT type); + static void copyVal(void* dest, void *src, DataType type, int length = 0); static bool compareVal(void *src1, void *src2, ComparisionOp op, diff --git a/include/Makefile.am b/include/Makefile.am dissimilarity index 81% index 946ce569..81a422f1 100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@ -1,8 +1,9 @@ -INCLUDES = -METASOURCES = AUTO -include_HEADERS = Allocator.h CatalogTables.h CSql.h Database.h \ - DatabaseManager.h DatabaseManagerImpl.h DataType.h Debug.h ErrorType.h Field.h Index.h \ - Info.h Lock.h Mutex.h NanoTimer.h os.h Predicate.h PredicateImpl.h Session.h \ - SessionImpl.h Table.h TableImpl.h Transaction.h UserManager.h UserManagerImpl.h \ - build.h Config.h Process.h Util.h Globals.h SqlConnection.h SqlStatement.h \ - AbsSqlConnection.h AbsSqlStatement.h SqlFactory.h sqlext.h sql.h sqltypes.h sqlucode.h +INCLUDES = +METASOURCES = AUTO +include_HEADERS = Allocator.h CatalogTables.h CSql.h Database.h \ + DatabaseManager.h DatabaseManagerImpl.h DataType.h Debug.h ErrorType.h Field.h Index.h \ + Info.h Lock.h Mutex.h NanoTimer.h os.h Predicate.h PredicateImpl.h Session.h \ + SessionImpl.h Table.h TableImpl.h Transaction.h UserManager.h UserManagerImpl.h \ + build.h Config.h Process.h Util.h Globals.h SqlConnection.h SqlStatement.h \ + AbsSqlConnection.h AbsSqlStatement.h SqlFactory.h sqlext.h sql.h sqltypes.h sqlucode.h \ + CacheTableLoader.h diff --git a/include/Makefile.in b/include/Makefile.in index 0c5ca67e..8d5a083f 100644 --- a/include/Makefile.in +++ b/include/Makefile.in @@ -170,11 +170,12 @@ top_srcdir = @top_srcdir@ INCLUDES = METASOURCES = AUTO include_HEADERS = Allocator.h CatalogTables.h CSql.h Database.h \ - DatabaseManager.h DatabaseManagerImpl.h DataType.h Debug.h ErrorType.h Field.h Index.h \ - Info.h Lock.h Mutex.h NanoTimer.h os.h Predicate.h PredicateImpl.h Session.h \ - SessionImpl.h Table.h TableImpl.h Transaction.h UserManager.h UserManagerImpl.h \ - build.h Config.h Process.h Util.h Globals.h SqlConnection.h SqlStatement.h \ - AbsSqlConnection.h AbsSqlStatement.h SqlFactory.h sqlext.h sql.h sqltypes.h sqlucode.h + DatabaseManager.h DatabaseManagerImpl.h DataType.h Debug.h ErrorType.h Field.h Index.h \ + Info.h Lock.h Mutex.h NanoTimer.h os.h Predicate.h PredicateImpl.h Session.h \ + SessionImpl.h Table.h TableImpl.h Transaction.h UserManager.h UserManagerImpl.h \ + build.h Config.h Process.h Util.h Globals.h SqlConnection.h SqlStatement.h \ + AbsSqlConnection.h AbsSqlStatement.h SqlFactory.h sqlext.h sql.h sqltypes.h sqlucode.h \ + CacheTableLoader.h all: all-am diff --git a/src/Makefile.am b/src/Makefile.am index 68d55ca0..daaed256 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -3,4 +3,4 @@ INCLUDES= $(all_includes) # the library search path. -SUBDIRS = server sql tools jdbc +SUBDIRS = server sql tools jdbc cache diff --git a/src/Makefile.in b/src/Makefile.in index ae7955b7..b6dbb65f 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -171,7 +171,7 @@ top_srcdir = @top_srcdir@ INCLUDES = $(all_includes) # the library search path. -SUBDIRS = server sql tools jdbc +SUBDIRS = server sql tools jdbc cache all: all-recursive .SUFFIXES: diff --git a/src/cache/CacheTableLoader.cxx b/src/cache/CacheTableLoader.cxx new file mode 100644 index 00000000..06965a02 --- /dev/null +++ b/src/cache/CacheTableLoader.cxx @@ -0,0 +1,214 @@ +/*************************************************************************** + * Copyright (C) 2007 by www.databasecache.com * + * Contact: praba_tuty@databasecache.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program 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 General Public License for more details. * + * * + ***************************************************************************/ +#include +DbRetVal CacheTableLoader::addToCacheTableFile() +{ + FILE *fp; + fp = fopen(Conf::config.getCacheTableFile(),"a"); + if( fp == NULL ) { + printError(ErrSysInit, "Invalid path/filename in CACHE_TABLE_FILE.\nTable will not be" + "recovered in case of crash"); + return ErrSysInit; + } + fprintf(fp, "%s\n", tableName); + fclose(fp); + return OK; +} + +DbRetVal CacheTableLoader::removeFromCacheTableFile() +{ + FILE *fp; + fp = fopen(Conf::config.getCacheTableFile(),"a"); + if( fp == NULL ) { + printError(ErrSysInit, "Invalid path/filename in CACHE_TABLE_FILE.\nTable will not be" + "recovered in case of crash"); + return ErrSysInit; + } + //TODO::delete the entry of tableName from the file + fclose(fp); + return OK; +} + +DbRetVal CacheTableLoader::load(char *username, char *password) +{ + //TODO::take exclusive lock on table + + Connection conn; + DbRetVal rv = conn.open(username, password); + if (rv != OK) return ErrSysInit; + DatabaseManager *dbMgr = (DatabaseManager*) conn.getDatabaseManager(); + if (dbMgr == NULL) { printf("Auth failed\n"); return ErrSysInit; } + + char dsn[72]; + sprintf(dsn, "DSN=%s;", Conf::config.getDSN()); + SQLCHAR outstr[1024]; + SQLSMALLINT outstrlen; + + int retValue =0; + SQLHENV henv; + SQLHDBC hdbc; + SQLHSTMT hstmt; + retValue = SQLAllocHandle (SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv); + if (retValue) {printf("Unable to allocate ODBC handle \n"); return ErrSysInit; } + SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void *) SQL_OV_ODBC3, 0); + retValue = SQLAllocHandle (SQL_HANDLE_DBC, henv, &hdbc); + if (retValue) {printf("Unable to allocate ODBC handle \n"); return ErrSysInit; } + retValue = SQLDriverConnect(hdbc, NULL, (SQLCHAR*)dsn, SQL_NTS, + outstr, sizeof(outstr), &outstrlen, + SQL_DRIVER_NOPROMPT); + if (SQL_SUCCEEDED(retValue)) { + printf("Connected to target database using dsn = %s\n", dsn); + } else { + fprintf(stderr, "Failed to connect to target database\n"); + return ErrSysInit; + } + + retValue=SQLAllocHandle (SQL_HANDLE_STMT, hdbc, &hstmt); + if (retValue) {printf("Unable to allocate ODBC handle \n"); return ErrSysInit; } + char stmtBuf[1024]; + sprintf(stmtBuf, "SELECT * FROM %s;", tableName); + retValue = SQLPrepare (hstmt, (unsigned char *) stmtBuf, SQL_NTS); + if (retValue) {printf("Unable to Prepare ODBC statement \n"); return ErrSysInit; } + short totalFields=0; + retValue = SQLNumResultCols (hstmt, &totalFields); + if (retValue) {printf("Unable to retrieve ODBC total columns\n"); return ErrSysInit; } + + UWORD icol; + UCHAR colName[IDENTIFIER_LENGTH]; + SWORD colNameMax; + SWORD nameLength; + SWORD colType; + SQLULEN colLength; + SWORD scale; + SWORD nullable; + TableDef tabDef; + + icol = 1; colNameMax = IDENTIFIER_LENGTH; + while (icol <= totalFields) { + retValue = SQLDescribeCol(hstmt, icol, colName, colNameMax, + &nameLength, &colType, &colLength, + &scale, &nullable); + if (retValue) {printf("Unable to retrieve ODBC column info\n"); return ErrSysInit; } + + //printf("Describe Column %s %d %d %d\n", szColName, pcbColName, colType, colLength); + icol++; + tabDef.addField((char*) colName, AllDataType::convertFromSQLType(colType), colLength); + } + rv = dbMgr->createTable(tableName, tabDef); + if (rv != OK) { printf("Table creation failed in csql for %s\n", tableName); + conn.close(); SQLDisconnect(hdbc); return rv;} + + Table *table = dbMgr->openTable(tableName); + if (table == NULL){ printf("Table creation failed in csql for %s\n", tableName); + conn.close(); SQLDisconnect(hdbc); return ErrSysInit; } + List fNameList = table->getFieldNameList(); + ListIterator fNameIter = fNameList.getIterator(); + FieldInfo *info = new FieldInfo(); + int fcount =1; void *valBuf; int fieldsize=0; + Identifier *elem = NULL; + + //TODO::support for date, time and timestamp data types. + //need to have two buffers as size is different in odbc and csql. + //before we insert into csql, we should convert accordingly + DATE_STRUCT sDate; + TIME_STRUCT sTime; + TIMESTAMP_STRUCT sTimestamp; + + while (fNameIter.hasElement()) { + elem = (Identifier*) fNameIter.nextElement(); + table->getFieldInfo((const char*)elem->name, info); + valBuf = AllDataType::alloc(info->type, info->length); + table->bindFld(elem->name, valBuf); + fieldsize=0; + switch( info->type) + { + case typeString: + fieldsize = info->length; + break; + case typeDate: + //TODO::store valBuf with type in list + fieldsize = sizeof(DATE_STRUCT); + valBuf = &sDate; + break; + } + retValue = SQLBindCol (hstmt, fcount++, AllDataType::convertToSQLType(info->type), + valBuf, fieldsize, NULL); + if (retValue) {printf("Unable to bind columns in ODBC\n"); return ErrSysInit; } + } + delete info; + conn.startTransaction(); + retValue = SQLExecute (hstmt); + if (retValue) {printf("Unable to execute ODBC statement\n"); return ErrSysInit; } + while(true) + { + retValue = SQLFetch (hstmt); + if (retValue) break; + //TODO::convert odbc to csql for date, time, timestamp +/* +ACCESSING MEMBERS of above structures... + sDate.year, sDate.month, sDate.day, + sTime.hour, sTime.minute, sTime.second, + sTimestamp.year, sTimestamp.month, sTimestamp.day, + sTimestamp.hour, sTimestamp.minute, sTimestamp.second, sTimestamp.fraction + +*/ + table->insertTuple(); + } + SQLCloseCursor (hstmt); + conn.commit(); + conn.close(); + SQLFreeHandle (SQL_HANDLE_STMT, hstmt); + SQLDisconnect (hdbc); + SQLFreeHandle (SQL_HANDLE_DBC, hdbc); + SQLFreeHandle (SQL_HANDLE_ENV, henv); + return OK; +} + +DbRetVal CacheTableLoader::reload() +{ + return OK; +} + +DbRetVal CacheTableLoader::unload() +{ + return OK; +} + +DbRetVal CacheTableLoader::refresh() +{ + return OK; +} + +DbRetVal CacheTableLoader::recoverAllCachedTables(char *username, char *password) +{ + FILE *fp; + fp = fopen(Conf::config.getCacheTableFile(),"r"); + if( fp == NULL ) { + printError(ErrSysInit, "Invalid path/filename in CACHE_TABLE_FILE.\nRecovery Failed."); + return ErrSysInit; + } + //TODO::take exclusive lock on database + char tablename[IDENTIFIER_LENGTH]; + while(!feof(fp)) + { + fscanf(fp, "%s\n", tablename); + printf("Recovering Table : %s\n", tablename); + setTable(tablename); + load(username, password); + } + fclose(fp); + return OK; +} \ No newline at end of file diff --git a/src/sql/Makefile b/src/cache/Makefile similarity index 77% copy from src/sql/Makefile copy to src/cache/Makefile index f175edcc..dae0ebc0 100644 --- a/src/sql/Makefile +++ b/src/cache/Makefile @@ -1,5 +1,5 @@ # Makefile.in generated by automake 1.10 from Makefile.am. -# src/sql/Makefile. Generated from Makefile.in by configure. +# src/cache/Makefile. Generated from Makefile.in by configure. # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. @@ -15,7 +15,6 @@ - pkgdatadir = $(datadir)/csql pkglibdir = $(libdir)/csql pkgincludedir = $(includedir)/csql @@ -33,9 +32,8 @@ PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = i686-pc-linux-gnu host_triplet = i686-pc-linux-gnu -subdir = src/sql -DIST_COMMON = README $(noinst_HEADERS) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in dmllex.cxx dmlyacc.cxx +subdir = src/cache +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ @@ -52,15 +50,12 @@ am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; am__installdirs = "$(DESTDIR)$(libdir)" libLTLIBRARIES_INSTALL = $(INSTALL) LTLIBRARIES = $(lib_LTLIBRARIES) -libcsqlsql_la_LIBADD = -am_libcsqlsql_la_OBJECTS = dmlyacc.lo dmllex.lo ParsedData.lo \ - SelStatement.lo InsStatement.lo UpdStatement.lo \ - DelStatement.lo DdlStatement.lo SqlStatement.lo \ - StatementFactory.lo SqlFactory.lo -libcsqlsql_la_OBJECTS = $(am_libcsqlsql_la_OBJECTS) -libcsqlsql_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ +libcacheload_la_LIBADD = +am_libcacheload_la_OBJECTS = CacheTableLoader.lo +libcacheload_la_OBJECTS = $(am_libcacheload_la_OBJECTS) +libcacheload_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ - $(CXXFLAGS) $(libcsqlsql_la_LDFLAGS) $(LDFLAGS) -o $@ + $(CXXFLAGS) $(libcacheload_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I. -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles @@ -73,34 +68,17 @@ CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ -LEXCOMPILE = $(LEX) $(LFLAGS) $(AM_LFLAGS) -LTLEXCOMPILE = $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=compile $(LEX) $(LFLAGS) $(AM_LFLAGS) -YLWRAP = $(top_srcdir)/ylwrap -YACCCOMPILE = $(YACC) $(YFLAGS) $(AM_YFLAGS) -LTYACCCOMPILE = $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=compile $(YACC) $(YFLAGS) $(AM_YFLAGS) -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ -SOURCES = $(libcsqlsql_la_SOURCES) -DIST_SOURCES = $(libcsqlsql_la_SOURCES) -HEADERS = $(noinst_HEADERS) +SOURCES = $(libcacheload_la_SOURCES) +DIST_SOURCES = $(libcacheload_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = ${SHELL} /home1/praba/csql/tst/csql/missing --run aclocal-1.10 -AMTAR = ${SHELL} /home1/praba/csql/tst/csql/missing --run tar +ACLOCAL = ${SHELL} /home1/praba/csql/feb18/csql/missing --run aclocal-1.10 +AMTAR = ${SHELL} /home1/praba/csql/feb18/csql/missing --run tar AR = ar -AUTOCONF = ${SHELL} /home1/praba/csql/tst/csql/missing --run autoconf -AUTOHEADER = ${SHELL} /home1/praba/csql/tst/csql/missing --run autoheader -AUTOMAKE = ${SHELL} /home1/praba/csql/tst/csql/missing --run automake-1.10 +AUTOCONF = ${SHELL} /home1/praba/csql/feb18/csql/missing --run autoconf +AUTOHEADER = ${SHELL} /home1/praba/csql/feb18/csql/missing --run autoheader +AUTOMAKE = ${SHELL} /home1/praba/csql/feb18/csql/missing --run automake-1.10 AWK = gawk CC = gcc CCDEPMODE = depmode=gcc3 @@ -137,7 +115,7 @@ LIBS = LIBTOOL = $(SHELL) $(top_builddir)/libtool LN_S = ln -s LTLIBOBJS = -MAKEINFO = ${SHELL} /home1/praba/csql/tst/csql/missing --run makeinfo +MAKEINFO = ${SHELL} /home1/praba/csql/feb18/csql/missing --run makeinfo MKDIR_P = /bin/mkdir -p OBJEXT = o PACKAGE = csql @@ -153,12 +131,12 @@ SET_MAKE = SHELL = /bin/sh STRIP = strip VERSION = 0.1 -YACC = yacc -vd +YACC = bison -y YFLAGS = -abs_builddir = /home1/praba/csql/tst/csql/src/sql -abs_srcdir = /home1/praba/csql/tst/csql/src/sql -abs_top_builddir = /home1/praba/csql/tst/csql -abs_top_srcdir = /home1/praba/csql/tst/csql +abs_builddir = /home1/praba/csql/feb18/csql/src/cache +abs_srcdir = /home1/praba/csql/feb18/csql/src/cache +abs_top_builddir = /home1/praba/csql/feb18/csql +abs_top_srcdir = /home1/praba/csql/feb18/csql ac_ct_CC = gcc ac_ct_CXX = g++ ac_ct_F77 = gfortran @@ -187,7 +165,7 @@ host_vendor = pc htmldir = ${docdir} includedir = ${prefix}/include infodir = ${datarootdir}/info -install_sh = $(SHELL) /home1/praba/csql/tst/csql/install-sh +install_sh = $(SHELL) /home1/praba/csql/feb18/csql/install-sh libdir = ${exec_prefix}/lib libexecdir = ${exec_prefix}/libexec localedir = ${datarootdir}/locale @@ -196,7 +174,7 @@ mandir = ${datarootdir}/man mkdir_p = /bin/mkdir -p oldincludedir = /usr/include pdfdir = ${docdir} -prefix = /home1/praba/csql/tst/csql/install +prefix = /home1/praba/csql/feb18/csql/install program_transform_name = s,x,x, psdir = ${docdir} sbindir = ${exec_prefix}/sbin @@ -206,21 +184,15 @@ sysconfdir = ${prefix}/etc target_alias = top_builddir = ../.. top_srcdir = ../.. -INCLUDES = -I$(top_srcdir)/include $(all_includes) +INCLUDES = -I$(top_srcdir)/include $(all_includes) METASOURCES = AUTO -lib_LTLIBRARIES = libcsqlsql.la -libcsqlsql_la_LDFLAGS = -avoid-version -module -libcsqlsql_la_SOURCES = dmlyacc.yxx dmllex.lxx ParsedData.cxx SelStatement.cxx \ - InsStatement.cxx UpdStatement.cxx DelStatement.cxx \ - DdlStatement.cxx \ - SqlStatement.cxx StatementFactory.cxx SqlFactory.cxx - -noinst_HEADERS = Parser.h Statement.h -libcsqlsql_a_LIBADD = $(top_builddir)/src/server/libcsql.la +lib_LTLIBRARIES = libcacheload.la +libcacheload_la_SOURCES = CacheTableLoader.cxx +libcacheload_la_LDFLAGS = -lodbc all: all-am .SUFFIXES: -.SUFFIXES: .cxx .lo .lxx .o .obj .yxx +.SUFFIXES: .cxx .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ @@ -230,9 +202,9 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/sql/Makefile'; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/cache/Makefile'; \ cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu src/sql/Makefile + $(AUTOMAKE) --gnu src/cache/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ @@ -277,8 +249,8 @@ clean-libLTLIBRARIES: echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done -libcsqlsql.la: $(libcsqlsql_la_OBJECTS) $(libcsqlsql_la_DEPENDENCIES) - $(libcsqlsql_la_LINK) -rpath $(libdir) $(libcsqlsql_la_OBJECTS) $(libcsqlsql_la_LIBADD) $(LIBS) +libcacheload.la: $(libcacheload_la_OBJECTS) $(libcacheload_la_DEPENDENCIES) + $(libcacheload_la_LINK) -rpath $(libdir) $(libcacheload_la_OBJECTS) $(libcacheload_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -286,17 +258,7 @@ mostlyclean-compile: distclean-compile: -rm -f *.tab.c -include ./$(DEPDIR)/DdlStatement.Plo -include ./$(DEPDIR)/DelStatement.Plo -include ./$(DEPDIR)/InsStatement.Plo -include ./$(DEPDIR)/ParsedData.Plo -include ./$(DEPDIR)/SelStatement.Plo -include ./$(DEPDIR)/SqlFactory.Plo -include ./$(DEPDIR)/SqlStatement.Plo -include ./$(DEPDIR)/StatementFactory.Plo -include ./$(DEPDIR)/UpdStatement.Plo -include ./$(DEPDIR)/dmllex.Plo -include ./$(DEPDIR)/dmlyacc.Plo +include ./$(DEPDIR)/CacheTableLoader.Plo .cxx.o: $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @@ -319,12 +281,6 @@ include ./$(DEPDIR)/dmlyacc.Plo # DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \ # $(LTCXXCOMPILE) -c -o $@ $< -.lxx.cxx: - $(am__skiplex) $(SHELL) $(YLWRAP) $< $(LEX_OUTPUT_ROOT).c $@ -- $(LEXCOMPILE) - -.yxx.cxx: - $(am__skipyacc) $(SHELL) $(YLWRAP) $< y.tab.c $@ y.tab.h $*.h y.output $*.output -- $(YACCCOMPILE) - mostlyclean-libtool: -rm -f *.lo @@ -407,7 +363,7 @@ distdir: $(DISTFILES) done check-am: all-am check: check-am -all-am: Makefile $(LTLIBRARIES) $(HEADERS) +all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ @@ -436,8 +392,6 @@ distclean-generic: maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." - -rm -f dmllex.cxx - -rm -f dmlyacc.cxx clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ diff --git a/src/cache/Makefile.am b/src/cache/Makefile.am new file mode 100644 index 00000000..de71381b --- /dev/null +++ b/src/cache/Makefile.am @@ -0,0 +1,5 @@ +INCLUDES = -I$(top_srcdir)/include $(all_includes) +METASOURCES = AUTO +lib_LTLIBRARIES = libcacheload.la +libcacheload_la_SOURCES = CacheTableLoader.cxx +libcacheload_la_LDFLAGS = -lodbc diff --git a/src/tools/Makefile.in b/src/cache/Makefile.in similarity index 73% copy from src/tools/Makefile.in copy to src/cache/Makefile.in index 030d13d7..4677ecc6 100644 --- a/src/tools/Makefile.in +++ b/src/cache/Makefile.in @@ -32,8 +32,7 @@ PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -bin_PROGRAMS = csql$(EXEEXT) catalog$(EXEEXT) cachetable$(EXEEXT) -subdir = src/tools +subdir = src/cache DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in @@ -42,25 +41,21 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = -am__installdirs = "$(DESTDIR)$(bindir)" -binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) -PROGRAMS = $(bin_PROGRAMS) -am_cachetable_OBJECTS = cachetable.$(OBJEXT) -cachetable_OBJECTS = $(am_cachetable_OBJECTS) -cachetable_DEPENDENCIES = $(top_builddir)/src/server/libcsql.la -cachetable_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(libdir)" +libLTLIBRARIES_INSTALL = $(INSTALL) +LTLIBRARIES = $(lib_LTLIBRARIES) +libcacheload_la_LIBADD = +am_libcacheload_la_OBJECTS = CacheTableLoader.lo +libcacheload_la_OBJECTS = $(am_libcacheload_la_OBJECTS) +libcacheload_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ - $(CXXFLAGS) $(cachetable_LDFLAGS) $(LDFLAGS) -o $@ -am_catalog_OBJECTS = catalog.$(OBJEXT) -catalog_OBJECTS = $(am_catalog_OBJECTS) -catalog_DEPENDENCIES = $(top_builddir)/src/server/libcsql.la -catalog_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ - $(catalog_LDFLAGS) $(LDFLAGS) -o $@ -am_csql_OBJECTS = isql.$(OBJEXT) -csql_OBJECTS = $(am_csql_OBJECTS) -csql_DEPENDENCIES = $(top_builddir)/src/server/.libs/libcsql \ - $(top_builddir)/src/sql/.libs/libcsqlsql + $(CXXFLAGS) $(libcacheload_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles @@ -73,9 +68,8 @@ CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ -SOURCES = $(cachetable_SOURCES) $(catalog_SOURCES) $(csql_SOURCES) -DIST_SOURCES = $(cachetable_SOURCES) $(catalog_SOURCES) \ - $(csql_SOURCES) +SOURCES = $(libcacheload_la_SOURCES) +DIST_SOURCES = $(libcacheload_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) @@ -190,16 +184,11 @@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -INCLUDES = -I$(top_srcdir)/include $(all_includes) -I$(top_srcdir)/src/sql +INCLUDES = -I$(top_srcdir)/include $(all_includes) METASOURCES = AUTO -csql_SOURCES = isql.cxx -csql_LDADD = $(top_builddir)/src/server/.libs/libcsql $(top_builddir)/src/sql/.libs/libcsqlsql -lrt -lpthread -lcrypt -catalog_SOURCES = catalog.cxx -catalog_LDADD = $(top_builddir)/src/server/libcsql.la -catalog_LDFLAGS = -lcrypt -cachetable_LDADD = $(top_builddir)/src/server/libcsql.la -cachetable_LDFLAGS = -lcrypt -lodbc -cachetable_SOURCES = cachetable.cxx +lib_LTLIBRARIES = libcacheload.la +libcacheload_la_SOURCES = CacheTableLoader.cxx +libcacheload_la_LDFLAGS = -lodbc all: all-am .SUFFIXES: @@ -213,9 +202,9 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tools/Makefile'; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/cache/Makefile'; \ cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu src/tools/Makefile + $(AUTOMAKE) --gnu src/cache/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ @@ -233,43 +222,35 @@ $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -install-binPROGRAMS: $(bin_PROGRAMS) +install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) - test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ - if test -f $$p \ - || test -f $$p1 \ - ; then \ - f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ - echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \ - $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \ + test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" + @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + f=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \ else :; fi; \ done -uninstall-binPROGRAMS: +uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ - echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ - rm -f "$(DESTDIR)$(bindir)/$$f"; \ + @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + p=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \ + $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \ done -clean-binPROGRAMS: - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ - echo " rm -f $$p $$f"; \ - rm -f $$p $$f ; \ +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ done -cachetable$(EXEEXT): $(cachetable_OBJECTS) $(cachetable_DEPENDENCIES) - @rm -f cachetable$(EXEEXT) - $(cachetable_LINK) $(cachetable_OBJECTS) $(cachetable_LDADD) $(LIBS) -catalog$(EXEEXT): $(catalog_OBJECTS) $(catalog_DEPENDENCIES) - @rm -f catalog$(EXEEXT) - $(catalog_LINK) $(catalog_OBJECTS) $(catalog_LDADD) $(LIBS) -csql$(EXEEXT): $(csql_OBJECTS) $(csql_DEPENDENCIES) - @rm -f csql$(EXEEXT) - $(CXXLINK) $(csql_OBJECTS) $(csql_LDADD) $(LIBS) +libcacheload.la: $(libcacheload_la_OBJECTS) $(libcacheload_la_DEPENDENCIES) + $(libcacheload_la_LINK) -rpath $(libdir) $(libcacheload_la_OBJECTS) $(libcacheload_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -277,9 +258,7 @@ mostlyclean-compile: distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cachetable.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/catalog.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isql.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CacheTableLoader.Plo@am__quote@ .cxx.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @@ -384,9 +363,9 @@ distdir: $(DISTFILES) done check-am: all-am check: check-am -all-am: Makefile $(PROGRAMS) +all-am: Makefile $(LTLIBRARIES) installdirs: - for dir in "$(DESTDIR)$(bindir)"; do \ + for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am @@ -415,7 +394,8 @@ maintainer-clean-generic: @echo "it deletes files that may require special tools to rebuild." clean: clean-am -clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am +clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ + mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) @@ -437,7 +417,7 @@ install-data-am: install-dvi: install-dvi-am -install-exec-am: install-binPROGRAMS +install-exec-am: install-libLTLIBRARIES install-html: install-html-am @@ -469,23 +449,23 @@ ps: ps-am ps-am: -uninstall-am: uninstall-binPROGRAMS +uninstall-am: uninstall-libLTLIBRARIES .MAKE: install-am install-strip -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ - clean-generic clean-libtool ctags distclean distclean-compile \ - distclean-generic distclean-libtool distclean-tags distdir dvi \ - dvi-am html html-am info info-am install install-am \ - install-binPROGRAMS install-data install-data-am install-dvi \ +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libLTLIBRARIES clean-libtool ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-info install-info-am install-man \ - install-pdf install-pdf-am install-ps install-ps-am \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ - pdf pdf-am ps ps-am tags uninstall uninstall-am \ - uninstall-binPROGRAMS + install-html-am install-info install-info-am \ + install-libLTLIBRARIES install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-libLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/src/server/Config.cxx b/src/server/Config.cxx index eae67ef6..2ee65ac2 100644 --- a/src/server/Config.cxx +++ b/src/server/Config.cxx @@ -66,6 +66,10 @@ int Config::storeKeyVal(char *key, char *value) { cVal.lockUSecs = atoi(value); } else if (strcasestr(key, "LOCK_TIMEOUT_RETRIES") != NULL) { cVal.lockRetries = atoi(value); } + else if (strcasestr(key, "DSN") != NULL) + { strcpy(cVal.dsn , value); } + else if (strcasestr(key, "CACHE_TABLE_FILE") != NULL) + { strcpy(cVal.cacheTableFile , value); } else return 1; return 0; } @@ -135,6 +139,7 @@ int Config::validateValues() } if (0 == strcmp(cVal.logFile,"")) { + //TODO::check whether file exists printError(ErrBadArg, "LOG_FILE is set to NULL"); return 1; } @@ -174,6 +179,17 @@ int Config::validateValues() printError(ErrBadArg, "LOCK_TIMEOUT_RETRY should be >= 0 and <= 100"); return 1; } + if (0 == strcmp(cVal.dsn,"")) + { + printError(ErrBadArg, "DSN is set to NULL"); + return 1; + } + if (0 == strcmp(cVal.cacheTableFile,"")) + { + //TODO::check whether file exists + printError(ErrBadArg, "CACHE_TABLE_FILE is set to NULL"); + return 1; + } return 0; } @@ -240,4 +256,6 @@ void Config::print() printf(" getLockSecs %d\n", getLockSecs()); printf(" getLockUSecs %d\n", getLockUSecs()); printf(" getLockRetries %d\n", getLockRetries()); + printf(" getDSN %s\n", getDSN()); + printf(" getCacheTableFile %s\n", getCacheTableFile()); } diff --git a/src/server/DataType.cxx b/src/server/DataType.cxx index 7835de51..fa0622ed 100644 --- a/src/server/DataType.cxx +++ b/src/server/DataType.cxx @@ -357,31 +357,57 @@ SQLSMALLINT AllDataType::convertToSQLType(DataType type) case typeInt: return SQL_INTEGER; case typeLong: - return SQL_C_LONG; + return SQL_INTEGER; case typeLongLong: - return SQL_C_SBIGINT; + //TODO + return SQL_INTEGER; case typeShort: - return SQL_C_SHORT; + return SQL_SMALLINT; case typeByteInt: - return SQL_C_TINYINT; + //TODO + return SQL_INTEGER; case typeDouble: - return SQL_C_DOUBLE; + return SQL_DOUBLE; case typeFloat: - return SQL_C_FLOAT; + return SQL_REAL; case typeDecimal: //TODO + return SQL_INTEGER; case typeDate: - return SQL_C_TYPE_DATE; + return SQL_TYPE_DATE; case typeTime: - return SQL_C_TYPE_TIME; + return SQL_TYPE_TIME; case typeTimeStamp: - return SQL_C_TYPE_TIMESTAMP; + return SQL_TYPE_TIMESTAMP; case typeString: - return SQL_C_CHAR; + return SQL_CHAR; } return SQL_INTEGER; } - +DataType AllDataType::convertFromSQLType(SQLSMALLINT type) +{ + switch(type) + { + case SQL_INTEGER : + return typeInt; + case SQL_SMALLINT: + return typeShort; + case SQL_DOUBLE: + return typeDouble; + case SQL_FLOAT: + case SQL_REAL: + return typeFloat; + case SQL_TYPE_DATE: + return typeDate; + case SQL_TYPE_TIME : + return typeTime; + case SQL_TYPE_TIMESTAMP : + return typeTimeStamp; + case SQL_CHAR : + return typeString; + } + return typeInt; +} void AllDataType::copyVal(void* dest, void *src, DataType type, int length) { switch(type) diff --git a/src/sql/Makefile b/src/sql/Makefile index f175edcc..1874c127 100644 --- a/src/sql/Makefile +++ b/src/sql/Makefile @@ -95,8 +95,8 @@ HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = ${SHELL} /home1/praba/csql/tst/csql/missing --run aclocal-1.10 -AMTAR = ${SHELL} /home1/praba/csql/tst/csql/missing --run tar +ACLOCAL = ${SHELL} /home1/praba/csql/feb18/csql/missing --run aclocal-1.10 +AMTAR = ${SHELL} /home1/praba/csql/feb18/csql/missing --run tar AR = ar AUTOCONF = ${SHELL} /home1/praba/csql/tst/csql/missing --run autoconf AUTOHEADER = ${SHELL} /home1/praba/csql/tst/csql/missing --run autoheader @@ -137,8 +137,9 @@ LIBS = LIBTOOL = $(SHELL) $(top_builddir)/libtool LN_S = ln -s LTLIBOBJS = -MAKEINFO = ${SHELL} /home1/praba/csql/tst/csql/missing --run makeinfo +MAKEINFO = ${SHELL} /home1/praba/csql/feb18/csql/missing --run makeinfo MKDIR_P = /bin/mkdir -p +>>>>>>> 1.29 OBJEXT = o PACKAGE = csql PACKAGE_BUGREPORT = @@ -155,10 +156,10 @@ STRIP = strip VERSION = 0.1 YACC = yacc -vd YFLAGS = -abs_builddir = /home1/praba/csql/tst/csql/src/sql -abs_srcdir = /home1/praba/csql/tst/csql/src/sql -abs_top_builddir = /home1/praba/csql/tst/csql -abs_top_srcdir = /home1/praba/csql/tst/csql +abs_builddir = /home1/praba/csql/feb18/csql/src/sql +abs_srcdir = /home1/praba/csql/feb18/csql/src/sql +abs_top_builddir = /home1/praba/csql/feb18/csql +abs_top_srcdir = /home1/praba/csql/feb18/csql ac_ct_CC = gcc ac_ct_CXX = g++ ac_ct_F77 = gfortran @@ -187,7 +188,7 @@ host_vendor = pc htmldir = ${docdir} includedir = ${prefix}/include infodir = ${datarootdir}/info -install_sh = $(SHELL) /home1/praba/csql/tst/csql/install-sh +install_sh = $(SHELL) /home1/praba/csql/feb18/csql/install-sh libdir = ${exec_prefix}/lib libexecdir = ${exec_prefix}/libexec localedir = ${datarootdir}/locale @@ -196,7 +197,7 @@ mandir = ${datarootdir}/man mkdir_p = /bin/mkdir -p oldincludedir = /usr/include pdfdir = ${docdir} -prefix = /home1/praba/csql/tst/csql/install +prefix = /home1/praba/csql/feb18/csql/install program_transform_name = s,x,x, psdir = ${docdir} sbindir = ${exec_prefix}/sbin diff --git a/src/tools/Makefile.am b/src/tools/Makefile.am index e33faf5d..11f29436 100644 --- a/src/tools/Makefile.am +++ b/src/tools/Makefile.am @@ -7,6 +7,7 @@ csql_LDADD = $(top_builddir)/src/server/.libs/libcsql $(top_builddir)/src/sql/.l catalog_SOURCES = catalog.cxx catalog_LDADD = $(top_builddir)/src/server/libcsql.la catalog_LDFLAGS = -lcrypt -cachetable_LDADD = $(top_builddir)/src/server/libcsql.la +cachetable_LDADD = $(top_builddir)/src/cache/libcacheload.la \ + $(top_builddir)/src/server/libcsql.la cachetable_LDFLAGS = -lcrypt -lodbc cachetable_SOURCES = cachetable.cxx diff --git a/src/tools/Makefile.in b/src/tools/Makefile.in index 030d13d7..57382e9a 100644 --- a/src/tools/Makefile.in +++ b/src/tools/Makefile.in @@ -47,7 +47,8 @@ binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) PROGRAMS = $(bin_PROGRAMS) am_cachetable_OBJECTS = cachetable.$(OBJEXT) cachetable_OBJECTS = $(am_cachetable_OBJECTS) -cachetable_DEPENDENCIES = $(top_builddir)/src/server/libcsql.la +cachetable_DEPENDENCIES = $(top_builddir)/src/cache/libcacheload.la \ + $(top_builddir)/src/server/libcsql.la cachetable_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(cachetable_LDFLAGS) $(LDFLAGS) -o $@ @@ -197,7 +198,9 @@ csql_LDADD = $(top_builddir)/src/server/.libs/libcsql $(top_builddir)/src/sql/.l catalog_SOURCES = catalog.cxx catalog_LDADD = $(top_builddir)/src/server/libcsql.la catalog_LDFLAGS = -lcrypt -cachetable_LDADD = $(top_builddir)/src/server/libcsql.la +cachetable_LDADD = $(top_builddir)/src/cache/libcacheload.la \ + $(top_builddir)/src/server/libcsql.la + cachetable_LDFLAGS = -lcrypt -lodbc cachetable_SOURCES = cachetable.cxx all: all-am diff --git a/src/tools/cachetable.cxx b/src/tools/cachetable.cxx index dc6c353f..8870a74c 100644 --- a/src/tools/cachetable.cxx +++ b/src/tools/cachetable.cxx @@ -14,19 +14,33 @@ * * ***************************************************************************/ #include -#include -#include +#include void printUsage() { - printf("Usage: cachetable [-u username] [-p passwd] -t tablename \n"); + printf("Usage: cachetable [-u username] [-p passwd] -t tablename [-r]\n"); printf(" tablename -> tablename residing in target database which needs to be cached.\n"); printf(" username -> username to connect with csql.\n"); printf(" passwd -> password for the above username to connect with csql.\n"); + printf(" r -> recover all cached tables from the target database.\n"); return; } +void addToCacheTableFile(char *tablename) +{ + FILE *fp; + printf("CACHE_TABLE_FILE is %s\n", Conf::config.getCacheTableFile()); + fp = fopen(Conf::config.getCacheTableFile(),"a"); + if( fp == NULL ) { + printError(ErrSysInit, "Invalid path/filename in CACHE_TABLE_FILE.\nTable will not be" + "recovered in case of crash"); + return; + } + + fprintf(fp, "%s\n", tablename); + fclose(fp); +} int main(int argc, char **argv) { char username[IDENTIFIER_LENGTH]; @@ -35,7 +49,7 @@ int main(int argc, char **argv) password [0] = '\0'; int c = 0, opt = 10; char tablename[IDENTIFIER_LENGTH]; - while ((c = getopt(argc, argv, "u:p:t:?")) != EOF) + while ((c = getopt(argc, argv, "u:p:t:r?")) != EOF) { switch (c) { @@ -43,6 +57,8 @@ int main(int argc, char **argv) case 'p' : { strcpy(password, argv[optind - 1]); opt=10; break; } case 't' : { strcpy(tablename, argv[optind - 1]); opt = 2; break; } case '?' : { opt = 10; break; } //print help + case 'r' : { opt = 3; break; } //recover all the tables + default: opt=10; } @@ -58,9 +74,33 @@ int main(int argc, char **argv) strcpy(username, "root"); strcpy(password, "manager"); } - //TODO::Read dsn from the cache.conf file + DbRetVal rv = OK; + CacheTableLoader cacheLoader; + + if (opt==2) { + cacheLoader.setTable(tablename); + rv = cacheLoader.load(username, password); + if (rv != OK) exit (1); + rv = cacheLoader.addToCacheTableFile(); + if (rv != OK) exit (2); + }else if (opt==3) + { + rv = cacheLoader.recoverAllCachedTables(username, password); + if (rv != OK) exit (1); + } + +/* + Connection conn; + DbRetVal rv = conn.open(username, password); + if (rv != OK) return 1; + DatabaseManager *dbMgr = (DatabaseManager*) conn.getDatabaseManager(); + if (dbMgr == NULL) { printf("Auth failed\n"); return 2;} - char* dsn = (char *) "DSN=myodbc3;"; + Conf::config.getDSN(); + //char* dsn = (char *) "DSN=myodbc3;"; + char dsn[72]; + sprintf(dsn, "DSN=%s;", Conf::config.getDSN()); + printf("DSN VALUE FROM CONFIG=%s\n", dsn); SQLCHAR outstr[1024]; SQLSMALLINT outstrlen; @@ -82,19 +122,47 @@ int main(int argc, char **argv) fprintf(stderr, "Failed to connect to target database\n"); exit (2); } + + retValue=SQLAllocHandle (SQL_HANDLE_STMT, hdbc, &hstmt); if (retValue) exit(1); char stmtBuf[1024]; sprintf(stmtBuf, "SELECT * FROM %s;", tablename); - SQLPrepare (hstmt, (unsigned char *) stmtBuf, SQL_NTS); + retValue = SQLPrepare (hstmt, (unsigned char *) stmtBuf, SQL_NTS); + if (retValue) exit(1); + short totalFields=0; + retValue = SQLNumResultCols (hstmt, &totalFields); + if (retValue) exit(1); + printf("ODBC Retrieved total columns = %d\n", totalFields); + + UWORD icol; + UCHAR szColName[IDENTIFIER_LENGTH]; + SWORD cbColNameMax; + SWORD pcbColName; + SWORD pfSqlType; + SQLULEN pcbColDef; + SWORD pibScale; + SWORD pfNullable; + TableDef tabDef; + + icol = 1; cbColNameMax = IDENTIFIER_LENGTH; + while (icol <= totalFields) { + retValue = SQLDescribeCol(hstmt, icol, szColName, cbColNameMax, + &pcbColName, &pfSqlType, &pcbColDef, + &pibScale, &pfNullable); + if (retValue ) exit (2); + + printf("Describe Column %s %d %d %d\n", szColName, pcbColName, pfSqlType, pcbColDef); + icol++; + tabDef.addField((char*) szColName, AllDataType::convertFromSQLType(pfSqlType), pcbColDef); + } + rv = dbMgr->createTable(tablename, tabDef); + if (rv != OK) { printf("Table creation failed in csql for %s\n", tablename); + conn.close(); SQLDisconnect(hdbc); exit (1); } - Connection conn; - DbRetVal rv = conn.open(username, password); - if (rv != OK) return 1; - DatabaseManager *dbMgr = (DatabaseManager*) conn.getDatabaseManager(); - if (dbMgr == NULL) { printf("Auth failed\n"); return 2;} Table *table = dbMgr->openTable(tablename); - if (table == NULL) exit (2); + if (table == NULL){ printf("Table creation failed in csql for %s\n", tablename); + conn.close(); SQLDisconnect(hdbc); exit (1); } List fNameList = table->getFieldNameList(); ListIterator fNameIter = fNameList.getIterator(); FieldInfo *info = new FieldInfo(); @@ -123,34 +191,38 @@ int main(int argc, char **argv) } retValue = SQLBindCol (hstmt, fcount++, AllDataType::convertToSQLType(info->type), valBuf, fieldsize, NULL); - if (retValue) exit (2); + if (retValue) exit (12); } delete info; conn.startTransaction(); retValue = SQLExecute (hstmt); - if (retValue) exit (3); + if (retValue) exit (13); while(true) { retValue = SQLFetch (hstmt); if (retValue) break; //TODO::convert odbc to csql for date, time, timestamp -/* -ACCESSING MEMBERS of above structures... - sDate.year, sDate.month, sDate.day, - sTime.hour, sTime.minute, sTime.second, - sTimestamp.year, sTimestamp.month, sTimestamp.day, - sTimestamp.hour, sTimestamp.minute, sTimestamp.second, sTimestamp.fraction -*/ +//ACCESSING MEMBERS of above structures... + // sDate.year, sDate.month, sDate.day, + // sTime.hour, sTime.minute, sTime.second, + // sTimestamp.year, sTimestamp.month, sTimestamp.day, + //sTimestamp.hour, sTimestamp.minute, sTimestamp.second, sTimestamp.fraction + + table->insertTuple(); printf("Inserted tuple\n"); } SQLCloseCursor (hstmt); conn.commit(); + //append the tablename in the cache.table + addToCacheTableFile(tablename); conn.close(); SQLFreeHandle (SQL_HANDLE_STMT, hstmt); SQLDisconnect (hdbc); SQLFreeHandle (SQL_HANDLE_DBC, hdbc); SQLFreeHandle (SQL_HANDLE_ENV, henv); +*/ + return 0; } -- 2.11.4.GIT