From 2f5eb0ed4f09269ca6efef46f84ecf6c2a4bd5f5 Mon Sep 17 00:00:00 2001 From: deffpuzzl Date: Thu, 31 May 2018 18:28:53 +0800 Subject: [PATCH] add replace --- demo/count | Bin 15254 -> 8746 bytes demo/create | Bin 16203 -> 9583 bytes demo/delete | Bin 15013 -> 8577 bytes demo/drop | Bin 14274 -> 7854 bytes demo/extreme | Bin 15284 -> 8800 bytes demo/group | Bin 16192 -> 9564 bytes demo/insert | Bin 15375 -> 8859 bytes demo/makefile | 7 +- demo/press_demo | Bin 16215 -> 9619 bytes demo/query | Bin 16224 -> 9572 bytes demo/query.c | 3 +- demo/select | Bin 15361 -> 9525 bytes demo/select.c | 3 +- demo/truncate | Bin 14313 -> 7861 bytes demo/update | Bin 15141 -> 8681 bytes include/tvm.h | 22 +- src/detvm.c | 6 +- src/makefile | 7 +- src/stvm.c | 442 ++++++++++++++++++++++++++++-- src/tcp.c | 4 +- src/tree.c | 710 +++++++++++++++++++++++++++++++++++++++++++++--- 21 files changed, 1121 insertions(+), 83 deletions(-) diff --git a/demo/count b/demo/count index 7293b34e5853d4c19728a63c0cf6253e4c51df6b..6d7bd5cd09953957ec345e72fe957502d8869dff 100755 GIT binary patch delta 2789 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 z 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 IA3u2TKSEY@F#rGn literal 16203 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 G zi5I8v@y9&m>CPDHU)j<4`fj+WTi?v&Jg8SP!cj&V42OPlqZx2FGH%SmAPC6sbPNsvkyCI+P+Md$o;# zU~p`Rr${mO$89WySGJ7H##4A@gE>Eu!ly&MA+Nbc$C%W5Q5;B?UoaN1WZ^~ZZTSJ5 z5#B~-iLoTM!al;3S7LC)OZ#|G6SOx>*Wems)R3tXaQeu)o0^VA5bL#D_r_ z4&$|`cqbB(T5pL`yFO+pVA7%f-J0YG&p8r-L&j;%^U*JBT=mUSdJG$wd?;P$Nu=v>zDLbaVn7amxc%G>gq~t z`3Es#vU_%;4%gWrg@50j*~=*mMLgeCfeQ^M$A$+Y5fZMGT5d^L=46f;U2(E#|s*a#4&V?U6MG6m`t_1a}1!Ij=9k0d;>vb=lGT0Af%$ z33tT#vyVSQrycrfq}=gA5Bcd>IirtuR0>~`!k5R}V2Q~oZkF|ag`g>K{ksHkEeaq= zbIf5CUpz#Mhx(q%8loTQY*wXbysfFW8rHRHwP%Gi zqlg@~>G;RZV>ZmvLxieV57#Z9ula{Af|>yK zjM3?)7JzGM`NCZgtS%t}ZmVnNkUqdAM&9GgMZrpZOoA3`z7T|N?7a}Pz6E1~C`7^S z$-C2$Ma1yRqYt9De6$nBPw9I$e13K9tpp#d<3o&H9 z%Fm(FG71Iw2+eT z5VRDz%xc*r3-lFvp|m*TNO7s@$tB}2_L<^JY2&a5k$P!`;2a`)+Ned~KB6uKb%B4O z&-CO1+q2MTSKsMP>D++jLTsVS6j5G(Xpa{66m$>#i+pDF;t_4IchPei9Qqc`g)UdF zsoW;}n1q&j`7q|n&FOW>Oo5W!41_MQmKK}hPs@_iP*wW1Q?0+u$-R~tnHTJC2X40A zouf6e5L6)=;>f~!;SEG1*ym`iDCJs z9ObYmyo{&`I#K38Stp`Fs<*r qGhKhw_}dQ0lbpx%byldT(PYUVQh`A2>J>|?w|GiCCFM|48T=Q>*j&T_ literal 15013 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 B7-awe literal 14274 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 C{2oLA diff --git a/demo/extreme b/demo/extreme index 58b53374c80459aa9c824e4fcfa281fae5058b1f..9aefbee0a1c1e6566c1e50a92247df4f0ae89493 100755 GIT binary patch delta 2812 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 diff --git a/demo/group b/demo/group index 5a78ea1fa0ec455cfb020d4644e7946b64a68151..bc259e10fdcd068b78cf987af23b9b73b8d7e47c 100755 GIT binary patch delta 2280 zcmZWq4Qx|Y6u!6ZYv1b+YsY3g2Cjq6HIDVMv90?l9K$M6^6e@}ox)uFZmSP4S90C`8 zC)>wOK8K>wJ_j782g{u!i9Mfp$Iq@WK02}C-_`QPLgP%WlY~b>8YFsp1RRXB8+oV)!NYW^yWpQhbhKR{!K#4S&ZlD_AnF;Zxm=V0)H4 zq7la#HZeS);V&4*`A9ON;lm8Gx+S-3_#nfqF3AoJA7EHyIHch{3`-0*Yj_vKR)!VC z<$qNK!;{ae;Y(`I<>}_t!Lj(1O(E*o@U*7JK0=iUpy#zngjGT96NbSgmN;uL4(WX2 z8;>(YkgR}uv8c*{WGd&3Q|D5Wm#DSBY`QcmT)`n_C3|*aq^+&ZpH=WSrogJWq!spx z3x!m!Rr12O;+zM5xRXk$;l_m8*O)k&!+gSHi5UDXdgKk7X_#61BF$I?wSQg@)(+?Y zO!T5c-;3xz#6lpt))~1*;-^+b{nQew`^tagzwF#o=wpwG+FM;XD+;N zZO{K64+GlA%=g*%!U9_vy$&t5Vt*=k6*`2s-crMz)B17>*v>((KPv*kZJ z%em9A%wcZpF&g(7>=t%(Q08J=j?ILns$fLguYGWnW0hf#GgLmxXcTt3nM~@6*tzyu z6m69Lz=j~|EWnhGItvT}g>z0n^#FCrgB+aVt@%jL7c3V*ev@RSq?`vb1@ErQpDCPOgkm!%=Q!jU8gq;ZbMAt(o|88^i)xms%F z7f0*hgxo~ow8079aDdc+`akI$N3eUfs#Bj0MQyZjl-ukP4ouL)X4ZtDXf)g1X^m{ z82aVfH5huLR-VKDoJ`nf#iS8KWfPV%WY;}jnBFbjh(AwmzRXt?hb?tW={Ov#lQCct z`?HW&FVkrV);D4OqxGe*xjrXv4aV0lY`$CRcrU`ndN+Ml>pOuqxbwo?Grf~(&j|B@ zP=g6f4LS3Vp%+V&{py)$pF8T48jm|*8GNhZX~S&&@>i6mmBGiBt*P)=_^aUjBW?c! Dx!o?b literal 16192 zcmeHOdvF{_neUm^O6%2XEL)DFI8M9)h1d|wvg0^{yw;W_uM$~SBsni2qm_0gEnaEG zJ{&s)FgVFY7zLRlTnYjR62L%l=c9lN&I36QobWUW+?j*}ha;R#lEU2a2v6Vd_f5An zyS56dsJg#sX{Y;p_Sav3-96Ji^Ul_eHruk4Nw&H|5jtEI6O?yVYV36aYFx7lshB!n zy-HOA6T~kj6y{#ZI5QLD}&8&}tWes2`!r z@0$bvdEif{XUQD+x6XlYoC9As2mXz7;0NcxUoZ#$syXnzz%RhBJY5RJ>DtTiIvxMZ zz}Ko@o}60Phth0%7DeJG%ka<7fmevDd|~?tB1z>7$!xKpMp7dKV>{LMo>XCDY9O0S z6jCa)DVHsd39coZY)hvyNi{f@OOF-?$)8UZ)Yzs}p=W*X_7Uny<#H+yL~m;@m(8h6 z`)FDd2XiT?OZT(J#&ybdheooaZoZJn6v{11spuPo@3oMXq+DIhv^7O$r~A%uMR`I?p4a*eM- znFG+ICLi9+C8Ra`@c#KW=EM8vo460pI!x;F;mw>w+Vws>8a$KweE9GTR;ghhzS@T$ z^WpWBDbyW4yyN4K?|vzCEC3H2dp|FiqiylskB1&Rd2zTps!pCC!FB$!7)pePDS7

KN3VuxZ;v4h234U7XM65@wc z6AcxfTCqfmG8%+oPi=hS_9^ImL}XyjJN|?UC_8aC@$vDldI5J&M-Q9>rbifewEJ!{ zP6UtB2+ccj)j0<|^4H?y-#ND1s0z}kuk=Ciz%r`1Mypt(84kr}E%JD$$h!cxKSBXk zS6Rk8aW|bFpV)jv%p3nUnbwo(bWRSDFkb59)#AQj5q)0fH2znApw*?Z7=PE}3{^xrBNv0I zcKq#sjE@&jc+s>{`>W~!2Gol|!7|R7{+FY}KR(7Y4M#f0lMP4X6DzN*h^mf>^P8Cg zf2?D?&~Tz-{MLq7;^S{>z-WG{xnso(>&O4pKK`5d!9NAs$N%HlAAS!5Z-2S4boFzb z=Q_rJ-!cB1jpM&qe{#_eCaxKs&!tk^D}gAGQB{nT792r#$ZS{(2Rd`FMFmIJQj>e$>66nY{q0<^Uc$_sUO2x z+OtdZ!_NX6f1c3rwVJNQ|KBsSuTfs{xm7ViHR}8dopZ{8waRU|?c1_3`c~aF-NcN3joI32ZP_8Jc1}R^=zjzY>&+w@m<3Mf9Wi zg=ohmwB%i=dtP(!L)U^Sd_fS>qCC8~7^1^H5FjBP@r)k3k^#QI;d&-xB{Z zmTSZNaScwfyeRxTR2%#_ZK)4GN}Zozd1?3?EZ@hvqv5AnzMtjg;k(HHY05UK>gM1- z?Lys=f1vVxPXQTW?*$+H0*f&gA7YD@{RNuxFfFf|0{meVq+!cc%`ZSYQaRtc1iAA* zsIRQGXoGUN(NcMa^&w;-XEQ`97Yk79d;}I%o+&`RbD$DHy#P_?E|^kzmH^A0`=PRO zi2zN`(_}kafM(}jYFjG6v~qaQU3soRPbw!y#$^H>R?e4LRaBrO$_W#Cm6e6!qsrmk zLuG?i1awR}ms00z#P$=)S;)FyE6}f$a~a!pp>;C^UQy0IayD80fOc8V&q-Ttr2)O$ zayaW$uCd+*@!giQob|1<7M zejhm=WKo5GOiw+;=7+-1vW{tXT&=1MT|vPRySZu#DB3UmO)NWFupc+rIt;Cf6=+-_ zRPj~F*f)~psy0a4pF|y1SBu{Fpct)svkk_u4Ku24lHdxDqUtJ_eh7tku-r$M+VJz_ zNw8dxYM+2kn`=i^zZ9!k`x3^l{b~q>mP&O`fIDD9Y)h zzDGr0v(v(A9~0ZBmD5P)JT4IYaSov;gc1JeAoMk%!5?R`u0sMHRnGlv$&&)XALmi$ zQzD1K^jdO$U1%6SuO{a=1j6v?VFSJ?5Qa#c(6T-y-{ut&71{soCxUs^)em=?b;kmtfs+s;Fa=&4H|(G%JpK6+3Bq zt6hMI^9+HjY!0|u=T(%sT7Y`zv((%nK-77hMr;<%%bg{pbc*UG=Mpw>i?B62Ut~R9 z0!%CC9_qeE_@3mlY=020UGRAdbldm9;)VA@Q}cD9t@eGmFLWwMxz=7OCcl}LTqj-( zIjbNTx?X^Y^E*~@gUueT^_qF3)KTyJmR7#erhlT&bCh|L0QXlqKcMcLqyhUP&X=g% z73eb&=O^Us6X>%M=SNhZ5a@FeCr7AX?Asr4o}z;W#B~ouoGhWFeE`jTDB^Up@|4&( z9dT}9+XwAW1NnHwu~@^9Ku<=T&k`CI=$jG8rDbW6I~;L-Ov~OPJ~$F_?jUWO*m5-D z+)XHBe+IsKKH@a7z7d-f&-0G+InqY$uYh*vd`!@s5UZxZLW~56wc%Fe=0%Xtna zFS58TY1Pt9a|6oFTqf(@-$Le$w6Yd5sO-I6i!Y&|hT@B_r^R(t9N0Vg_Qlr;NSVOi zJKw&ziEUo=eNa6N&Dj_ypGo!J&MycvEeYD6d4RcVP6>vl@NI6H-g6(ybn{N!m$em%73KnPz7%?pf zEr`lRN!<)6tcx10DIGHu`BXKUscTKcx=3CXkcI!&Wqi3Yggt{$>Bu7 zJ40S24{oc{qXU^@GNpuF1FQPeg?uR{zq1sfRt;xIQmc4&IHN)h@szM}00!_7Fqs-` z9HuFSonxsyiWr-wh)C0?bp`_>j7?|3hcQve7jh^e5_vc&1!y!>goAAcSD@BFrU69 zrMy$imdzbFc2w@bFb@_-TKwy?M69JY03% zu|)DBRcy;7!A7p00?&^}+_8M&x@>M672VQ>!(OoVUc1@t-rCvQzFC^xlj_RmMIAgU zN44%iG3O3sGsO{6)l$rfk8w)fpP|l-XJPM#4!31X=f?J4x2#QY!(7$-CFTO?&eH( zU>i_q=~`)ycN}hFKhu_`BM=88iQKkSjym((H}WhRKIlyCD5$oibcE}AC)8k-&Xt() z+_I&swR?T9xCK7$VU(g-UAffFp6whoN}?}X9L*yZvFE}*bjRRAcJSa}Y5*Wq=M&pg zZhs<=*kl-)2J0~DzOF-BGnh#X<<}^8M8aIZ2;gSglRFSVu)8OLgMBClqO&;SANni>TaeBS#4?4s;IBBLEnzMYJs*}yBYp58|%O9#+&&nt{8Jy*D%^JNHn z<6*Yr^1~zT?0f`wPwE$Os;B3kfeiQ!UvH-hN2-bK?s5 ze8C%#=wk`l&Fh&}`n8Rm%CY``*5t*LWYXGxL znDt7f`NGz*B-#4oFjTqQ#TH|*t7j4NOHk<;&3he`VB~umy^$r64#c&X?_}aY?{uU` z8I1W`yb3|()X4b-VWJzF!D}CwBoeuy0htSQRQBeI7&(;nZ0>JK3=AVKM>!~n-kcwj z-eQn?F`F-R7e{;37_&36?9DTIxChgq48zr4wgx)-Ws-p<9SKh69HbX3w>XN)ExE?L znSv>kQ3$SUvuGD*tAP;?ewlK;KFp_dI7uWESDbkphNko<2DTN)JR{3?C%x`v#BG!g zM$5MKaFn3}%-Q1N?v&?$OkA5g+IxCQ!?c(}7x%XuBlH^$tZ(YC9-Pqbj{W1qVDmM&Vp}Dup+fcozar??FjPEvOne!$D^40-9 zKzOBHP;|<$Ei-XK!y5aO=dsi1L|PyOEn6rQ?kc(mDe8uw3RRK2qx?l~2OueaYutZ=vNQu2DR* z_V7_p&+dGn1l_mB@o~pQGoNuhs+sEfyyM-8@G-*EJUb=vUSH26=mDh~^E*c{w2>Eb zUOsF}m?l!WG1WMlEu(m-Wo>Ir4ZDLmEV=G5rj{8XxaH!dQFMEH@Ddk?4|N3`>n*GqOx=U&F$Wq%^CKfM|N z0%%5lsT~7^&3mmdD$wi&QC^Z(1MQ0!u&F0|D+uQgsp8Y|DF=U*5c@ept)zGXh#g?W`&(aaY1GZ_b-{ z=mTkNAC#mrb!rM!${YXR8HoYHW|Wri6KM8g{AV!xQ1Hu}_qxsd-WM81otM}DkW|~J^ODR1a4nZV1e{-#KmC$;?KUn&1<$kP5M{QSwt z^Ty4e$jfAM&X1-n1bul}*I%x;oR^2-S36z0~$6myh`)Tuep8Ow8;CkRp`;DGXEw9NlS^ILY z$kRN3Dg$v=Hyb;CzWJ~9pqt7B%0RKl%zb|O{cAnwsGf%#0ItK&#IG4wxCNbwT~ETh zPG08a`^%J<*YB4pF9&Fy9V!&#b?t_z2e1m>(tOfU24KuFFphC`Xxf zuoOQZ>sri@l5zm6v01nL!~mkptVgAI3~oKom*VTNZuI$4QV!tlOS3Nci2-#6zQZ~l z|KgeNBue?uoO!>i6ko5*yjzMtOPTq!6u-m|&Xfa+cjKp~z|2=`rL=(JyW6LxfYOss z87ZKam0>(EprUi&&pQRr@nfUk|5z3eoChlKJx{s7QXnjTF;wPfP7jtkwZEDLe`9$ql&Hc0xap?d)Y5-sU#yRj@KNp^6 zJ}C;mX6EQp-kpZN+XU}Ztc&-}f!`1O0yR4?nfqhD0d%_dei!)K)A)y{->2h$k^1fV zYO<`~UlDwr;>R!k6odomPkvs*G%i;h(+OS!zKmzhr>l1@@TdE}E;a{0U&lG!cY0lO z@Lx9vJ^?((Qh6$B{pIuFt#jzX;rD6vd{X#plsQ5+&o_MQVj-U7&GX|-{n*vd_`cm! z134Vo74Zec0QRn0dbf1D+}7kLeeT8*=&BYUDVcSLGTHt_#+98QH&NW7u*)-+NflDb z#&s91TdPRG8O#ns>y)>dlq`;n;4I3kr?qpVRMXbIesim9AXa0_v$e>!lhk64Yi7^O z+)W)@HmvV(x3snOwD!8P$4K+JxrM!^Tw(CwbUaT3g8noZNQh0qUsBop87@ zl`7@-4x_Y16rK6b6O??`9ZrnmNYC`9@$5`{WCzguazSnxBt~+$8lAa;Vr#@-Nbn(h zh}$*Yt>cg!1s9cFVc``PUSX)Fn_Xd>>JzpFc_$1f=;!`3pDo?^>Yma1%(+uLE?NId zB)^qT>5+HhPy1>(=wV$mvt_}4T_-&TF`Wz^y#i)^E;Q-8t8ej`WQsUL*qfD6>^ey@ zHJKTjHDWKW*}`|!u5;|Swsv4wc67`jX^#@u^QkpYMPe(S0sWSf2xo) ziu`PrSpAxW((D*8BTZ>`>x`9<<}|xw)($Tl?eM+9X73fe2{|2f8D)52u;ulqSy=^| z48T02>>o;F%^HO|nr648*{?vmQ4U^9W5t4UpLm)*Gc8K#xNS~Mpds-Fu2$j;h#H5A z{CDajqc13tai!zdb6Is8 z29Ko1MlN=DZ&V_`uUFb{D_C2~ectFHL#*~hbUKw%B6SI+vo3KV2Q5luIB^8tHRt+v zb1KG|&hE8Fq`C@>xVBi_PK;MN(f3z$R};MjKbq%f|Mm~28$LLIp-(Je5r%7Ek@C&s z%-&@<3#AC6D)6Y7#>pS%NKd8+lw&`4?aJ9){EM`0E89!YU+_Zh= zKf`P&ECrL8stB7cCJAGZYi<9=A!aY6jc^0oyFeX2+6sP$Z{Cza^)qpALV5+(PD=>d z9fj!IhiwDI90y>GnrRqnGv)d@;(9F-x>D$sLO&z)Hlbe=`jF5c3Vj^J+T<;X&&pa)R`V&(27xW%*?Q^R?yCw8JuU78u6 z1P7Zu9-YL@P7;QBOJq8Pty`Z(La+`|Gq!Gh4o*xvqA*8uNFxj)YQ@&A&n07U0}&2( zi5nbCvn00lb@zNI4`E{;tn}%K6~-&QbO2m|RWuII1@L2HM~V|dPGW$Q2lNHxy!XX` z`Avg4N04>tGI7A80Xd(&H|cT{*(@Be(+aw(l{nM&RV6eFMrn4zQ+O}4KNAoC$ykPV z?m^c;UzH5ksxm~xUJ;>fQtdV>*&_5VvSxN1%PvgMo0z2)8t2tWDuztr7LrP~*_)rM+Yx@}#zwz9w9|K2mXGm>xp zzWu&EkbBPm{XhTnKj++g&)oO7cC?v>p>#3Tm5R`gKul21RjG{&1$1#uDyU*=fx1vt z1LMbEOen0KmaZpU)w&M4d_L4wY@05^j5!Urp65VH*V;qYv^P~^Zqun3*EpcAm5K<0 za`d&)r8m}W61=W=xqjTO{c+_8Qf{Lwx6zf;^-(HD(Y5X$`^LX{uD*F@3=rWME7c;` zsaj$IT-OVQB-tRJA41T zi$_SCg+CqtU9kw8LE>iPkLA!W|6zM`>knT3(R()P;dTg~>msyiv$Dj2I30cz_(&x) z;P+31zaRM1>8YCr-!%>XhH3DP)8H=yUdI8=Qdx!8>HN818a&hGbb8L2hX1F)*Q!69 zIx=e$T2tj~XcB+00{@+9@Cx~pFKih`#;ANDnJpI7aB8@JbgLQ|$Q1KKYG5>%9w`hE zn@<(g=$cfaXI1Z(VREN(IW=%gE?r2eO#4Val`E(`=)JAETsB8k+U122T8OSxwmmqU z9kKI;M6O`l%D#Gw-JKdt=L@M^b0(3`r}FfuUo*4qG7l%xBcvrWPIjX?S{TZu5=p|1 z%1$K{g#--r<@1gRP$NmTrlWmzv%NgJJbE!=pqB@;tVPH~j`N>W*!qaX%z=yNq-Rk2 z7cPCF8(+>@&JkT2J@}ADqHglw-K9vV8(n+=khV?2CJ$cwO#F}s?_EbnJ$UarGUmb4 zhAulic)ga8w#$P@hf8Iz2S2lfRqAdJKJ3Bo^WZHHKECti;N%~Hn7kF;o%}r3p!m+G zgHN5hcv~={PA%Au>#X@Pvbs|hnyCw2(DnlM9jVpQPE2s1P%HVM3(@C?FTfKf|X_S^RH@7xq0 z|3!S~uTFOLwjZ828j7j-;U|tub@)b9lj|Yyr@edG_xNuAdjb&^|KLQyJatsMzSmne z#K&LgA>)oKj)6}V*FF-*mIblzQtSgS#Rxs|nlHZdB_n?6v3$e8tobbpL7Xt+D1h>3e#@?$0>5@vD`17@$W{{pt&2KeQID}AUbRQZQ_4?=M_Oe?9gsu&OzenTktDg zu=DJxiu|V|ro~7UO$9cmSwFjc7kE{z2tW z|3)SuEO;Av{Ldj3;(P8QYkbeu!9yIW`1mvN@o!HaC-WZvV`UuY9b)dd9FIF3_m^?Z zKg2|LIqq{fZZG2)J%r9^j%^Od&0dZV&4$y5I4@i^8_0z49F9eRMAy;W(cms1gyM%4 zJL>S%N@$67J2u``FHDHQOMitXM0+g}-e{XNFEG>JquQ_0)Db%ywGs6 zV|;tVtMTz08!($*Zt7U{!m9DVwU56Nf8uYx_VFK1?tYE_{ zZ6KUGUp-Yg`w`xTy7Ta*Am;UM%+FU(760JQIA`up&Sx07+HtLC`c0KI_R7dWBArPk z7e}zKUbb*Sa?!#C`9&eMym47mNPl*CG?OZ%l97C|zdx1F4-_+* ztruKy0X8nonuVFlVr=VH##pU!Za5I!i{Wno zjyHvmVi;a!I;^s4Z#SE3s@LuG`Cc@@1sn=_TJZN_q}L!3n$PSL9_mlxk8{}@IqKhz zzhl6UqgK~^*nfMqZN+v5{@%R9x2MY7Xt^dxRZLnI0Zs#JJY8j}tOp!)3D0{37R~oX z2Q0ydTv+do2dZO&(f0uRXFBkoUq6*4VUrodb?O-@R^`B4Xjt}|F;+_7Tl`KSrSzU$ z@4{!ewXWPHM#bEHS;z3C%b>@P8z9SBPNgRNF==W1m<#Ke#$7%xw=CK|QbYQ)(d9?T z1=evo>B3Q$?nwXtU-fffrRATw@i`MoAweZfEiW~!?EctTLVs=xpsU(jEJK}Hp1WduK3g~|;4fHb4}UV;2yKqVgf z_N=46CQ|Q^<~t~M?^VG1gVn)(v}06%g8WNBse11oU;;!xiN7HIxP+eE2n{ou{P$c7 zrceVq;1?Y#^fD0s``W-)6{-c3|9-ZEp$T-*|1q}1A$H&Yakgti2XOW8V|#As6`1uu zKws)Z-=xk@ustvI9NV9y?MUdSY(L2M!q9H=KSbF^HM7b8&pTi{d>4)Ge-_9vhtL1W zzp)u(^HKI#nO~&&$LM)rAK-h@kdDn)H7|p7ta_Gl32N)ZP+whZ&0h+A)sBNAA z6UzEe3Y{;|5oN6<<9vaRDrXD~n5db%Rj^G^wo1sq?Mk`$=WJ zmA2n5(4UlbDf_k9xCH{QDr-ME8;w3dI}GdBq%AYjfNnLcICU;J-V5=ahP8n9RvNnj z?J}$@$a$4M_3s(!Y->}xQe`^IgU|4@5XNR!_ zat947Np39Rdw)63I;jMfqg*He;IFLInaXT@CddJQ>*H&P~ZzzeFZY+2wARfgQWQYYy{Sd z-rLcP1m10eF?0%-z)g}|q1)hIz-AnRq3hvZU=vwtLoc(PV7ne>zY3iuH;q7_H0RR# zIm}=4?NAV$C+406cksMku+{JeU@Z86aR4ZbH+{iRNYIou4#mMw3L$76p~Qm*T|x4k zgpa|05k4eOKWU#58j@!(X%7hv$>S$&zd%Ty^9X%fAZ%C?o(ZBj>#kC>@1f{t3*0lTwcv-vD;b^JwpzADl2=M8jH5sV9s&P?S}mz9&UrlhsVKPl@jn%6bQb^Rz&S z$2o+)DvXH7xfFXwXo$y!v~^gZ@Bm{zL}oS65iu$@x=(ZoAU@J$3%f zV5aQ9QU#b1)FD|DaNz2I3nPoZN%o%`7lWH-kwt>0I zO3>ai0fK7wb5yY0oCBFT-vp(~7rfZqP7UW!!%E>(*7wPFi4dw(fEGTCKb^~WFp-+f z9-wMI2qj&?HuDnf8`d1^SYvV`D=SUIamTRrK1QoufUtFxz||%vT&=Z)GHV5>w+>Qs zhX4`lX*#h^G%vI+Af;1OH(D#$!S%w{WPOQtx&)X|)?L(njqn}ewrqX`p`Cq@0^R1_ z@OaK=psDG);0E)PxFNI*Qm!?Zh|75zxlW=Ov=&1!xKV(x_1`pdy~z=+b-MX3u~BdR z7rnf}WPBplG0NO1z=PG+uc-Sb>A?Q5^%Rxc0)0Ac{hXYe1o}+a`We+H1o~{)$`R@l z{|>JDr2uUBas>qsG16>^?p{@pEjfN4p2seD8M)+a` znHnl|J9=QuAUYWOI`N@qw9g9}Y|rdLdw!@EJ{aMCv`?zgnefY~$pg64bUdMecrw?4 zDI~Drz!Vg?%Yi8?@ID9Lsp0dLnSq~%^<%g^*J!8NTDqxkK=~Gp#kh|*u4l}kk8>#Q zyK~?B&S+s*>V5!O^UjUxOyk$|G%B067SwmJ#(frUcF)SwLX_L4d1vOVf5osHQ4-8M zHz9DmrK(>6r87Ro-P}{QR?k#W1oWSHLjZ>kKr47pV5Sr6A3y zGiJ`D5@JI&C5=rrcpN;-LkmyQu&C4-K1<~Ml(Sr#zrBufv$SKFiX}!dFx#bo5%XMV zei#=ebtO<(=OXrD-9L6Y7NV&$R+L;cF?456alI|vUN^;emcNXzeoE}B@H_DweYT5$ zC)A@Z#&Da855k7=8v0|P5WxSX#e9w@WJ?G8`a?^u6r!F^Yi9~ zbyNQr)R|Y#4bBDWBiBFh;tN~MMRmaouQzepVc2$dV8AZm$RwZMmQv2KPV>4BoW>}- ze~9NT!**s(E?XS!&Sr5iWaqbaW)UZ{i(Dd;9vo42ekhwO^c8VPWM^7?(NSf$ueW(L zV~-YcJX?%3zlq0O+wO_m-K%@MTU)8AEtef;-J46L#J+8hg~(4qy`Z3w&dE>RyAm6I@6i;19@s#lN;SIiblQw99WvOI2WR?V>ougp;C5a zFd`Q|#}@I7Y>y6QM^dh6M+#lEH>b9u%hW;j_5j}0jbzEOE-}`fy=AJ$Jae+`(M0kh zRcy;7!A7p0LIS5`!}e&ta9uXHnTob`;S3C{z1Oa@yEk<9wy%?J_oTYAc~OUm$_bX; zU(DJ4*-UX*R5cfK5@Q_J^<~6K$HU&$9d`5j&X)FGyRD-I7W$eo1n`*yDY4^-q;h#x z=*x5_hEq;gM|hOS7X#pN8SGmUn^Q$bY;?=2WHP6ESFP@7Rf+!of}LjXkT)w=NH}u0 zWU~F6fkKB@NUz$`sZ7!n)8a@TNrHD83~r_^&F~;Qh7-BXu*ryQY2m?LTT+I_ww+@< zu*gtL201}m-__c^s#k)9i1#pO(aEk{>K3OboJC4PN7lHIH|wc3&co zBxOG7F1z{EeO(9p0}*CA)5RXhBnI=#l|3w}@1Bv`nfBxuk_zLAm$H(lKy(&|y^BIJ zH7qI8p6}YMHl#*Cg<_ddY`{_?;|>D(wlcFAbBwTro$fk8U{bkjh3$k~=ASberiLp& zG~CXSM`rh=u95C?c*qM?ZS5FD5ZfhvV6R8)Wjay=l84Bj4Lz;hc6(>rdh&Ir2Zsu3 zAd^KB_4T9@IZQKql*yURB$)#|5N1EHV7N1lO{VX#T}U{|nQG2va2TBIlN96pab_ci zRPuG5y|(pw4248l*{iczghZzd79pm{)^%{y8CWI}=gz83I)S6&Oi$}IbOEtv)hkAk z&Z9}P^~K?+vbTsY+F{#WLdY*UqGVfso7027=0yJxGINCD?B}}tpo|^U z)XCa>p}RQJo5u7lWwW#7)omg0}CBoe)C;V8n)^)V^^wJuZ#1uxjC(cD*t#(E71!uA$dRxSlGbv;e(?tYh zYQ=P>cAndjlVkDLRV{W)Ya8{;O7o=LFmQwB>(M3LsGSXsFQD|Mc&l#9LbpdCXAj^b zfYaImMQ@mue1XGoxD$`>dI-Af9bftol)3mt(41v~j~q^K`S!&wg@kwg?vBh?3-0Q~ zCnaY|=F_t?3Hb8EyMgkl*9{|ISCmgTJ_@@-&d1$~IPsy_-A?%|>rki0l25G8Cd-FZ zt+=%B@L|ne%lSwMx@Ujm1B*^yKBYKRy|D9%#kmXNgMg!XYDMDxzPpTI1eA*Aw+>@w zqb}r}dPujhN~Ch5Dms!aq@t@K%Y}1 zKZUXdn`JsXQU=(dDwXrl6ucz*Erz=WTQV0BBj+$)c$tdmxAH)*iyjQi4>p zzmUaV98Ega&HW%kXJRwrB{y7E9?iqNbZrz+E&i0sg;S&V?{iowvJAF=KA+RD3z?E#&o< zw*Wx)l;r1`F+h0t?kbE3G<89Wmz8CJyz=ifV?uwYE8if{)TL6s1*BJSMy37VWX6EO zt3?;VhjkXr9x2G>veF3%i%ZG>y=Dv$&+nvC2iy+hVNl|vnI<0yrnXJH-X4AH|@VZXN$TH>;7y1HJ`3GL!M`N8rJ7{8(o2jYrN8b7p=CTL07f> zm_H^YzCL4#JJlQFr~7{!=wA5=SAN2k$7^6I1bMbv8NWM#V@&8Di#~Tf;3Bjghw9kU zZPw%X^U5EojuEYnxbg=Cn!3RD1{FmDlIQ z`zp;h6C5a^)W^Nji;6`x8J@o^yaj|ISzc{#VD@p-zpzh7Y6RmFF*_SYmj|!ScV! ze+xWbdHx)VrOTDC^tTfJ9(b85+JAk{tbd1ml*&McjRByiR*x+{%bv* zuDnYwRVx-aO&-R1O9d#uh1R*_<@?K99q6VCfeKLk(QBVq{%+nFpd4}6;Rdu<;!o$V zo>#d4EafhmrLu`Xe?a+Sh4M=K4%g|gK6+=y-azzWwbu7JUZM}4==+y)d{yc9LgjdW z>32fq_-du^Bg*jsrSA{Q@j<2c{c`*arT6o4e5mw$p>q7p(*9eH4`V-#c~R2#shZOF zD_)`xyPn<$%ki_Yuf@D5Y5TCs>wU{h^dYXlx1%kgI`y`Gli&+&q#wokc>MhW9Ie5J2*$_YN@ zE)wNvWT89x-+-TAfpI{eicEvQ;0<`r9~0yLIrlzEGw_>;DtynNVO`Hd!@w67`o2Kp z-!Aw!j#rc5-#A{az|-#03cLJujiILEO#fJJ#vkz$?l|goV+?rei3MY5O_k~VzYQ$( zzo{Zm?iBoNwXh~Or35YBuNkMwx6cAkyQ3BP{{---i`&;kPrcITR@#3aN*nmqpT183 zDCIYDoud|4`1#s2cng6tPLuy<0UyC#OJzP^2>j{3lUXTvj7umcmh^JlHVr@bn>mPs zzRwmRTs8n7(SWB;PJ=KfIr5YgC}$SJgEJ; zcN+Z)ujn(LZShlqnY9Nq*}g=^me)OY zqBy2XKfjKyylCYLMFLJ&#t5xc&Ksj-ad;SqO^%(`&K5D#*1c+7tF0lL(d{WK@@`42 zl+GikPQ>gr9qU)G>af?hwe__2+VUom{__bHjXj-?f!fb2W5B{roRqzMc%|mV2+%t$N5@}=U5eH@FJBbq9Zn6 zW}^olw<_PsgP70SLx~Zb$my}taVt41FY%o3-^wj{K5O%SUNJocupz@H$Tb diff --git a/demo/makefile b/demo/makefile index 0484e7f..c891059 100755 --- a/demo/makefile +++ b/demo/makefile @@ -1,7 +1,7 @@ INCDIR= -I/usr/include -I$(HOME)/include -I./ -I./include -I../include LIBDIR= -L$(HOME)/lib -L../lib -lstvm -lm -lc -ldl -lpthread CC=cc -fPIC -CO=-c -g +CO=-c -pg OUTLIB=../lib OUTBIN=../bin @@ -18,9 +18,10 @@ EXTREME=extreme TRUNCATE=truncate DROP=drop CLICK=click +REPLACE=replace PRESSURE=press_demo -all: $(CREATE) $(INSERT) $(SELECT) $(QUERY) $(DELETE) $(UPDATE) $(COUNT) $(GROUP) $(EXTREME) $(TRUNCATE) $(DROP) $(PRESSURE) $(CLICK) clean +all: $(CREATE) $(INSERT) $(SELECT) $(QUERY) $(DELETE) $(UPDATE) $(COUNT) $(GROUP) $(EXTREME) $(TRUNCATE) $(DROP) $(PRESSURE) $(CLICK) $(REPLACE) clean $(CREATE): create.o $(CC) -o $@ $< $(LIBDIR) $(INSERT): insert.o @@ -45,6 +46,8 @@ $(DROP): drop.o $(CC) -o $@ $< $(LIBDIR) $(CLICK): click.o $(CC) -o $@ $< $(LIBDIR) +$(REPLACE): replace.o + $(CC) -o $@ $< $(LIBDIR) $(PRESSURE): press_demo.o $(CC) -o $@ $< $(LIBDIR) diff --git a/demo/press_demo b/demo/press_demo index b5781115cd99a2a06349320796948a95a19828fe..26fa0b0b5d073cd578ea908ae2fce1d6731f7d4b 100755 GIT binary patch delta 2277 zcmZuzeN0nV6u+-uyw?wCk1Q)UMM&Cpd)9 z9ATS=!nUB=3ByU@gm+@7ZR^mQmED$JY~H8L7-cY{#0xNHWRj{poh95acQtu z*DPFwF`WxM`Y?!kH?--aej`TM*;u?YHH1;m>gy_nZ%0lJ+j{+TRVw0!!M@t{k)Xw+D((Z_DR_&jem+U3+_F3jFi*Jn9_JbJRdJS zX7;dn_E)G=vVzznTuUQI?!-~Dj}WG^j$Bjm=Y;9NM*38Ia6b`r6eFD~v74}gaJ!1P z6UOz}NL0m}2vb!?8dUrNVXDW-HWgP9772$`yoRtuxKhO{2%8B9RlImH5f&omA>no1?*xN&2CO4cWs0>iStDZ+hm zZeiTnD|*;K*?nTqkc!=!h{u&kSxjlh78!{731k0k8hVLnf`yV>u2#eP$a$-g@kSJoAi41&SyAbi?JKeM``)8ljdnzk=aYfr9>_% zk*l$KilF5i`#ilO@@JiV?SM9R*9&9CUd^qJ{Rp<2XXvV)K~QqZ4hoOFnB+7X+iXlu z`d^as;b-$~=`r3T^xrUn-cn^d`IM)E8_$DHmZ|x1XVBzfk-blqNd2g`yA8C=r+qt; z&d_21VN}`6=c6dlVab*r={>BXB|D~vAxo|>3v|{hAq4MP=LuKg3+pNAr+;xg?yv+_ z*#ae-5$&UDEK0T?(k-!>sv7nBYMnKSDuFT`+fr=jaMc1L5^-C)&)Ft~BleK@CebML zlOVaL8D{0SHYup~_*aY#LaRMXXo4=(>2TdH3vLh`@=V2~#nH_ti5Y{c<(aS$tafAx zgHVV1IJ7$U!yQ2cd#ZcgQNF@A+@9k061PL#KH&BVwAw2LH@2a#l{$p!&_iZYDMv$`<5GXI|4hw_(?U(|F|GLKhxgO`%gSV#YOyVk$B- z1zHi+LO=SftO2bnBe7#`4o&M>GVK*(hfzEAb{2-2MJ}NOwG-Yh+Krd#Zjn>(W>K^* zOd1g+`%)#ko;qe@d*HfnXGS|e;>6tRu_Ley)($nruBjco42i23=40&=94THVC~&J- z7NQ{e<&3tMLWk9fT+9ut{nZ%L<(Gv~xa)Tbl`!s?r3F$DBN*EU-jW==&Ff0aaVuY! zxG=T{`*%PH$U0_)g1|D&epetDmIl%?Liihf)hqoWEDE@U-KsvQ>cb$Ex-#e=#H(KK zZz%>sr3NsRrp>&DQK?uHdICt)UpU$uDsN%6-3Ln7>!xUrd@xvEv3&88>Vo`&{6e_> H)}H?W0i#)1 literal 16215 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 Y=h7c=>d#N}Y2e4VtNA$Zj8F{zZx_mf9RL6T diff --git a/demo/query b/demo/query index f42afc5110b7eb14662b39cfde4f9834f7624a4e..f9623c72294f34d31a0d7e50487310a4b358fcef 100755 GIT binary patch delta 2380 zcmZ8jeM}Tb6rbJWj@|p>4#C^2A}f_@1a3Xb$H9SKE9hcrg@mL=6F%C8&?f4kl47D_ zi*30O%;Ad(HK|4asWn>L(nNxhK>ffrM5|32+q8<5Kkg#7l4#Oc<@#oK)}BtX^XB(^ z@6CJjX6ELm_RVaFO3R55BDCo}Ay*b?Q0qb@Km^n*A&dIg^oz4jT{YYPt0E5YIyeDt z?vr$hsU&Aeqa`PtEN)7%+8;e&)kvoHZT6PFW6t_{&_*4R0?r#*+0>*#R@C}OT-o(c={9_j-Xwl|V$K(;}GD-_b!*x-^iI1q! zr?#5Tr$$-Sh;Ab_+Dwi5%=>T`jS2fUWR2+R%WC9WOf}-s00Qx$b0%|MqB~bT<1CEm zYR$P8oK`QN{sg83j}m{3u_Di|{4Peqm9I{fpI^CcXuH+M<=(~vhz7ES8SGgmsF9*& z$u;`@U-;aX&-q}|mYb2tJZhFnWbb1&(s5s}VLK#jGRXEUVWUYVwSBoNRNM2pAndSj z=Er!rYFGH%k04>MZj-6nWKX4q z#Y@^KPyZe^)t327>NooE|2hcwBOB+XFo&gKT79s4l!ySreD z6Tp=&)xW`lH!``6$$d;7Wb!DJUokn#*ho zN;1_&I;>-RMlYrU9YuNKK#s1NgfENE;&!zZd+4SWXPN{ufYQSaQ?$rRjAH2adT$~& zBEuY7+erYW$NRJlNoFSEByCV%l4(jKom4J%5o7I1X2gU~s_KOIN)F;lbC+hCB+`S@ zgX=;Bt4q^GdaQZkAo(yJSPm-!b>2Gm^cxdx!2w6SH2HwXJIJbKoXt+=KZgG6xfqCL z3ctz$J&3|oSB^-llHKxA_d;5 z$nf^FIgAZA=D=%)wx^+`!jm)3=A*9=ZQ4%+%F7y$JC!Byt=lj N&{yayhCfz!{|8YTUV{Jt literal 16224 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 hEL@ literal 15361 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 EFZ4D)2LJ#7 diff --git a/demo/select.c b/demo/select.c index 4f074c8..65b192d 100644 --- a/demo/select.c +++ b/demo/select.c @@ -26,8 +26,9 @@ long lSelectUserInfo() } conditinit(pstSavm, stUser, TBL_USER_INFO); // 绑定变量 + conditnum(pstSavm, stUser, acct_id, 2018053017); // 查询条件赋值 stringset(pstSavm, stUser, user_type, "1"); // 查询条件赋值 - stringset(pstSavm, stUser, user_no, "20180223"); // 查询条件赋值 + stringset(pstSavm, stUser, user_no, "20180224"); // 查询条件赋值 if(RC_SUCC != lSelect(pstSavm, (void *)&stUser)) { diff --git a/demo/truncate b/demo/truncate index 866df003ea9b3fe72590aaa63460cf32accd2e7a..b9664f64b8c21e817a8b4d352acc96f5d6f8079d 100755 GIT binary patch delta 2401 zcmZ8jeQZ-z6u+;pUvKTUc3XKZGS`V)#|Hgka~(?PV8~lEu?U(e0k#+x_yZZzg(gDS zsFKx5((Pcf_>Y|?hN&?SAfO~zGGv>7b%v1nkLkdV)?rc-KS+etbMLz^R8P`#@9+H1 zIrpA(Z*QAFbZKMK>4_M_go>&Ou~jh0RG5T_8JQ=^6JwjkI-_MOrHzERnL$8p#7~U# zv9exf*T(%i21yL;f^1K5uN3!6L5Hx{o|06bloV!@6if-91Riun3f0k9A``Hyq}C!;`hwC&vBaDfKAD@VY8I@ z4fAxd?K7jB6dS%kU0D~#8O8f)Og>vIo+uU@KBflR$$X}W((ob0^yKnshQ}$U&Cj1> z_&thgCHWM?Cn+{ioJ1V>y*n|#M@igK;y)E4JG*Dn1LiPMX08vhVJ3(}?kGC`kxVLa z<2|!7YRJP*qvwPl^N_(8t|sw*ps^XDGQ2cG(e-~sCB7sm9ScXE?ys!tB3N8nP!a|M zIu&caWlp1pzYQ4DvGCTNn})kM6=(-`%}w|B_j@br-oYKxxQ#<1uJekL_&Hj2g_+(> zN6p_%gm9s`Vs>sinWW?nW%!~D8rRF`R=Iu@tN>ew&qG`3a=m;U3IQ~#c3>MTi@6w!Ds_6qGj5z&I;Qp-Ij9Wj<~4%#cI-S=PIPS z@Us%v36}aDgx{nu10PTm3cYAlQcM$K<>Ra&%x2{rD==49CuAXy`W8qQpD+R)7GHgc z`p!3MuHc%4`1O@kXN>w}Ow2e0+wF&%>~_ z3(l@yhVLy~FDMOeL5RSCMxQ+^s)1Shl|Z=#+skA~H#+SX`BpCKRc00B8-38@u|bo^ zZ`U?j;H&}%JU&S)Cj^t8c1df(EG#0*@~vi}zNy`=z1Q?QPqzeoecS;amp#5NS_z3?>oL?+=v`SVT0z(FD{tV-}85(AV5rL06#Y; zOf~z!*WG!El<+CwpxTf z_;X#06rtA&Wgo2ZUd9}YUYQ-MLo|~N9pj5`s=dv#1@Sm1N;G1p(^~b68th=Ho@-@Ysdry5aCOXXayO7KF0MSa^m`9h_E`p z1Fre2ptnqK(2;U-42AlDk z9YdDpx0zsb&?^kV;h^jqC<|-RZ2Sndy1-;m*4ZTZI_PyR{4djO<|N~J3+rW9l%KGc z=MkG!kthU^)y`jIUHA=l6Iy*Avh;DM!hh*WE3#F%#|VtA-zF&V1L_{AZ)cL%tf;W}49C69ZXvT55^Z{2wfc`C9NzX~ R_vS5ogWjOG4c>3x{V!GhDMA1M literal 14313 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 diff --git a/demo/update b/demo/update index f4be5b204403c8a54d77ea012c70bcf8a4e55cd5..f64f5a02493139c8a3b01ddbe801bcc9413eed92 100755 GIT binary patch delta 2884 zcmZWreQZ-z6u-A0>w8_>wcAQt6k7y@ebKG5b|WFY0h7mvaRd|+BbEpYV9*JJz#n8C z6GK@RyBtX*Mne=65Mr1lGG@drpuk@a6V3QX8=SEPG{Z;&sMK@rdv|ttmfm}Rzw>eL zIrrXo_wkSQlQ;EQ zPg0DiMluo+xgy>vER1GC@Lfhx&1wma*Ic>-k(`_q!6M!!ER7~o#M_Jbc||-eN=khZ z@4)#drKw1vOtOq=MLecFDS8oKI>|EDR>ZrC_zgw8$K;{2q@wF%Oh@mzq+BdCRx1%! zm{W^wSy;mn;jLtw&lXVTJV}_Uk{=a#I$Wb~ffir#Cl!T|cg;Z93oROFn=z(L2ft_;#__o^=#UKq4G zOjg~u?%^fVNB*+vJ-4{tJhp3gds%oH!(t6{J#F8DMup0+g;B44J-IZG?Y!}geJKt( zMStDruNJabFJ>~NT&s8A-iu`| z_;;2>m@v#`9~KIFx;3Zww&pHWQnd8t+$mVC1fvIpYJ@bsnYI#C_01^3UBE=c+c{X3jfXKaiKa3m$|(?3u)xBteF zSddjBlN4o=9wx=lq)1Oq@F)hy1P@_BA4%{o#GJF{7yQdnmEQlip58rSWd0dVhw&YQ zbe3+}1xq!@L$J@efdhQ!+`@CvR62);VPok|wGAi64QE|&y)?1VhA2v>y~X2w%d*s6 zvbM)+4Om@r?;;MWzbI@FyQ0e}X+=G3!38#WLkwkIB zP;J~<^ngC7jr-&)ll2HA7KE0%sCv(QV=zKpLQR_AST6Vu?h?vL7^y!OlKWwBMr&mbMq3`h?eA~! zTUC~V5kyx6DrJLk2hk|DeybaGGh+dM0@lR*)-u$si3J*D<)%jUF&41I}p9 zO$!2{N9Sxst%bSSDD2sg!`oQ=akW1wODk@y~53}^qZN&xu?3$i5KZ;XcMDI=i|4#_j9 zEyui4&=OycyOxeeL-N#{SCSn^8?T6PEgt2=z!QNGJ!!=AeZfdnu82=V(+Va&amMncaHa|AM5x!oS{1<40cSHaH literal 15141 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 Lrg^7z;_UwbU9t_D diff --git a/include/tvm.h b/include/tvm.h index 2686174..4779bed 100644 --- a/include/tvm.h +++ b/include/tvm.h @@ -33,11 +33,11 @@ typedef long CREATE; //#pragma pack(4) #define TVM_VKERNEL "1.2.0.0" -#define TVM_VERSION "1.2.3.0" +#define TVM_VERSION "1.2.4.0" /************************************************************************************************* custom macro *************************************************************************************************/ -#define PROT_JAVA 512 +#define FIELD_SEL 512 #define FIRST_ROW 256 #define ORDER_DESC 128 #define ORDER_ASC 64 @@ -66,6 +66,7 @@ typedef long CREATE; #define OPERATE_UPDATE 4 #define OPERATE_SELECT 8 +#define PROTOCAL_JAVA 512 #define OPERAYS_INSERT 1025 #define OPERAYS_DELETE 1026 #define OPERAYS_UPDATE 1027 @@ -112,6 +113,7 @@ typedef long CREATE; #endif #define MAX_FIELD_LEN 32 // maxinum length of Field name +#define ALLOC_CMD_LEN 1024 // maxinum length of command #ifndef MAX_FILED_NUM #define MAX_FILED_NUM 64 // maximum number of fields in a table @@ -635,6 +637,21 @@ typedef struct __TVM_BOOT_PARAM char m_szLog[MAX_STRIG_LEN]; }TBoot; +/************************************************************************************************* + STVM user define + *************************************************************************************************/ +typedef struct __STVM_CUSTOMIZE +{ + Benum m_eDebug; + Benum m_eShow; + long m_lRows; + bool m_bInit; + long m_lKey; + char *m_pszKey; + long m_lWord; + char *m_pszWord; +}TCustom; + /************************************************************************************************* 内部函数 *************************************************************************************************/ @@ -767,6 +784,7 @@ extern long lInsert(SATvm *pstSavm); extern long lTruncate(SATvm *pstSavm, TABLE t); extern long lSelect(SATvm *pstSavm, void *psvOut); extern long lUpdate(SATvm *pstSavm, void *psvUpd); +extern long lReplace(SATvm *pstSavm, void *pvReplace); extern long lCount(SATvm *pstSavm, size_t *plCount); extern long lClick(SATvm *pstSavm, ulong *puHits); extern long lExtreme(SATvm *pstSavm, void *psvOut); diff --git a/src/detvm.c b/src/detvm.c index 541f7a0..74180f9 100644 --- a/src/detvm.c +++ b/src/detvm.c @@ -101,9 +101,9 @@ void vDebugTable(TABLE t, long eType) { fprintf(stdout, "\n---------------------------- TABLE HEAND INFO ----------------------" "----------\n"); - fprintf(stdout, "TABLE:%9d, extern:%10ld, NAME:%s\t\nSHTree:%8ld, SHList:%10ld, " + fprintf(stdout, "TABLE:%9u, extern:%10ld, NAME:%s\t\nSHTree:%8ld, SHList:%10ld, " "TblDef:%11ld\nGroup:%9ld, MaxRow:%10ld, Valid:%12ld\nlNodeNil:%6ld, lIType:%10d, " - "Table:%12ld\nIdxLen:%8ld, TreePos:%9ld, TreeRoot:%9d\nGrpLen:%8ld, GroupPos:%8ld, " + "Table:%12ld\nIdxLen:%8ld, TreePos:%9ld, TreeRoot:%9ld\nGrpLen:%8ld, GroupPos:%8ld, " "GroupRoot:%8ld\nData:%10ld, ReSize:%10ld, Truck:%12ld\nListPos:%7ld, ListOfs:%9ld\n", ((TblDef *)pGetTblDef(t))->m_table, ((TblDef *)pGetTblDef(t))->m_lExtern, ((TblDef *)pGetTblDef(t))->m_szTable, sizeof(SHTree), sizeof(SHList), sizeof(TblDef), @@ -133,7 +133,7 @@ void vDebugTable(TABLE t, long eType) pstKey[i].m_lLen, pstKey[i].m_lAttr, pstKey[i].m_lIsPk, pstKey[i].m_szField); } - fprintf(stdout, "\n--------------------------------UNIQ INDEX FIELD--------------" + fprintf(stdout, "\n-------------------------------CHECK INDEX FIELD--------------" "----------------\n"); for(i = 0, pstKey = pGetTblGrp(t); i < lGetGrpNum(t); i ++) { diff --git a/src/makefile b/src/makefile index df4902f..e005d36 100755 --- a/src/makefile +++ b/src/makefile @@ -3,13 +3,14 @@ LIBDIR= -L$(HOME)/lib -L../lib -lstvm -lreadline -lm -lc -ldl -lpthread AR=ar LD=ld LN=ln -CC=cc -fPIC -CO=-c -g -DMAX_INDEX_LEN=64 -DMAX_FILED_NUM=64 +#CC=cc -fPIC -O2 -Wno-unused-result -m64 -march=native +CC=cc -fPIC -O2 -Wno-unused-result -march=native +CO=-c -g -O2 -DMAX_INDEX_LEN=64 -DMAX_FILED_NUM=64 -Wno-unused-result LDFLAG=-shared -g OUTLIB=../lib OUTBIN=../bin -OBJFILE=tree.o sem.o msg.o tcp.o str.o list.o conf.o +OBJFILE=tree.o sem.o msg.o tcp.o str.o list.o conf.o queue.o TARGET=$(OUTLIB)/libstvm.a TARDLL=$(OUTLIB)/libstvm.so TARVER=$(OUTLIB)/libstvm.so.1.2 diff --git a/src/stvm.c b/src/stvm.c index 46d4185..61c7133 100644 --- a/src/stvm.c +++ b/src/stvm.c @@ -33,7 +33,7 @@ /************************************************************************************************* function *************************************************************************************************/ -Benum elog = 0; +TCustom g_stCustom; extern char **environ; extern long lShutdownTvm(); extern void vSetNode(char *s); @@ -46,7 +46,7 @@ extern long lMountTable(SATvm *pstSavm, char *pszFile); return: RC_SUCC --success RC_FAIL --failure - *************************************************************************************************/ + *************************************************************************************************/ static char* sGetTVMVers() { struct utsname sinf; @@ -110,7 +110,7 @@ void vSCRDebug(const char *fmt, ...) char szMsg[1024]; va_list ap; - if(0 == elog) return ; + if(0 == g_stCustom.m_eDebug) return ; memset(szMsg, 0, sizeof(szMsg)); va_start(ap, fmt); @@ -1183,32 +1183,32 @@ SQLFld* pSortSQLField(SQLFld *pstRoot) *************************************************************************************************/ long lShowTables(SATvm *pstSavm) { - char szTable[128]; + char szTable[128]; TIndex stIndex, *pstIndex = NULL; long i, lRows = 0, lTime = lGetTiskTime(); if(RC_SUCC != lInitSATvm(pstSavm, SYS_TVM_INDEX)) return RC_FAIL; - conditinit(pstSavm, stIndex, SYS_TVM_INDEX); + conditinit(pstSavm, stIndex, SYS_TVM_INDEX); conditnum(pstSavm, stIndex, m_lLocal, RES_LOCAL_SID); if(RC_SUCC != lQuery(pstSavm, &lRows, (void **)&pstIndex)) return RC_FAIL; fprintf(stdout, "table table_name\n"); - for(i = 0; i < lRows; i ++) - { - memset(szTable, 0, sizeof(szTable)); - if(!strcmp(pstIndex[i].m_szPart, pstIndex[i].m_szOwner)) + for(i = 0; i < lRows; i ++) + { + memset(szTable, 0, sizeof(szTable)); + if(!strcmp(pstIndex[i].m_szPart, pstIndex[i].m_szOwner)) strcpy(szTable, pstIndex[i].m_szTable); - else + else snprintf(szTable, sizeof(szTable), "%s@%s", pstIndex[i].m_szPart, pstIndex[i].m_szTable); fprintf(stdout, "%3d %s\n", pstIndex[i].m_table, szTable); - } + } lTime -= lGetTiskTime(); - TFree(pstIndex); + TFree(pstIndex); fprintf(stdout, "---(%ld) records selected, ep(%d), %s---\n", pstSavm->m_lEffect, pstSavm->m_lEType, sGetCostTime(-1 * lTime)); return RC_SUCC; @@ -1263,7 +1263,7 @@ void vPrintAmount(int t, char *pszTable, int nValid, int nMax) void vTableAmount() { size_t i, lOut = 0; - char szTable[128]; + char szTable[128]; RunTime *pstRun = NULL; TIndex stIndex, *pstIndex = NULL; SATvm *pstSavm = (SATvm *)pGetSATvm(); @@ -1292,10 +1292,10 @@ void vTableAmount() if(NULL == (pstRun = pInitHitTest(pstSavm, pstIndex[i].m_table))) continue; - memset(szTable, 0, sizeof(szTable)); - if(!strcmp(pstIndex[i].m_szPart, pstIndex[i].m_szOwner)) + memset(szTable, 0, sizeof(szTable)); + if(!strcmp(pstIndex[i].m_szPart, pstIndex[i].m_szOwner)) strcpy(szTable, pstIndex[i].m_szTable); - else + else snprintf(szTable, sizeof(szTable), "%s@%s", pstIndex[i].m_szPart, pstIndex[i].m_szTable); vPrintAmount(pstIndex[i].m_table, szTable, lGetTblValid(pstIndex[i].m_table), @@ -1308,6 +1308,93 @@ void vTableAmount() return ; } +/************************************************************************************************* + description:show table index + parameters: + return: + RC_SUCC --success + RC_FAIL --failure + *************************************************************************************************/ +long _lShowTableInfo(SATvm *pstSavm, char *pszTable, bool bRmt) +{ + size_t i; + TIndex stIndex; + TblKey *pstKey = NULL; + TField *pstField = NULL; + void *pvWhere = NULL, *pvUpdate = NULL; + + memset(&stIndex, 0, sizeof(TIndex)); + if(!strlen(pszTable)) + { + pstSavm->m_lErrno = SQL_TABLE_NIL; + return RC_FAIL; + } + + strncpy(stIndex.m_szPart, sgetvalue(pszTable, "@", 2), sizeof(stIndex.m_szPart)); + strncpy(stIndex.m_szTable, sgetvalue(pszTable, "@", 1), sizeof(stIndex.m_szTable)); + supper(stIndex.m_szTable); + if(0x00 == stIndex.m_szPart[0]) + strcpy(stIndex.m_szPart, sGetNode()); + + if(bRmt) + { + if(RC_SUCC != lTvmGetTblIndex(pstSavm, stIndex.m_szTable, stIndex.m_szPart, &stIndex)) + return RC_FAIL; + + return RC_FAIL; + } + + if(RC_SUCC != lGetTblIndex(pstSavm, stIndex.m_szTable, stIndex.m_szPart, &stIndex)) + return RC_FAIL; + + if(RC_SUCC != lInitSATvm(pstSavm, stIndex.m_table)) + return RC_FAIL; + + if(NULL == pInitHitTest(pstSavm, pstSavm->tblName)) + { + fprintf(stderr, "hit test table (%d) failed, err:(%d)(%s)\n", stIndex.m_table, + pstSavm->m_lErrno, sGetTError(pstSavm->m_lErrno)); + return ; + } + + if(HAVE_UNIQ_IDX(pstSavm->tblName)) + { + fprintf(stdout, "INDEX-NAME:[\033[4;33mUNIQUE\033[0m] " + "INDEX-TYPE:[\033[4;33mRBTREE\033[0m]\n"); + pstKey = pGetTblIdx(stIndex.m_table); + for(i = 0; i < lGetIdxNum(pstSavm->tblName); i ++) + { + fprintf(stdout, "FROM:%4ld, LEN:%4ld, ATTR:%ld, FIELD:%s\n", pstKey[i].m_lFrom, + pstKey[i].m_lLen, pstKey[i].m_lAttr, pstKey[i].m_szField); + } + } + + if(HAVE_HASH_IDX(pstSavm->tblName) || HAVE_NORL_IDX(pstSavm->tblName)) + { + if(HAVE_HASH_IDX(pstSavm->tblName)) + { + fprintf(stdout, "\nINDEX-NAME:[\033[4;33mQUERY\033[0m] " + "INDEX-TYPE:[\033[4;33mHASH-LIST]\n"); + } + else if(HAVE_NORL_IDX(pstSavm->tblName)) + { + fprintf(stdout, "\nINDEX-NAME:[\033[4;33mQUERY\033[0m] " + "INDEX-TYPE:[\033[4;33mRBTREE-LIST\033[0m]\n"); + } + + pstKey = pGetTblGrp(pstSavm->tblName); + for(i = 0; i < lGetGrpNum(pstSavm->tblName); i ++) + { + fprintf(stdout, "FROM:%4ld, LEN:%4ld, ATTR:%ld, FIELD:%s\n", pstKey[i].m_lFrom, + pstKey[i].m_lLen, pstKey[i].m_lAttr, pstKey[i].m_szField); + } + } + + vTblDisconnect(pstSavm, pstSavm->tblName); + + return RC_SUCC; +} + /************************************************************************************************* description:Printing system index parameters: @@ -2221,13 +2308,13 @@ long _lExeSelect(SATvm *pstSavm, TIndex *pstIndex, SQLFld *pstRoot, char *pvD SQLFld *pstNode = NULL; Rowgrp *pstList = NULL; long lTime = lGetTiskTime(); - size_t i, lOffset, lRows, lRet; - char szDelmit[64], *pvResult = NULL; + size_t i, lOffset, lRows, lRet, j, k, m; + char szDelmit[64], *pvResult = NULL, *p; memset(szDelmit, 0, sizeof(szDelmit)); pstSavm->pstVoid = (void *)pvData; pstSavm->tblName = pstIndex->m_table; - pstSavm->lSize = pstIndex->m_lRowSize; + pstSavm->lSize = pstIndex->m_lRowSize; if(bRmt) lRet = lTvmQuery(pstSavm, &lRows, (void **)&pvResult); else @@ -2243,6 +2330,92 @@ long _lExeSelect(SATvm *pstSavm, TIndex *pstIndex, SQLFld *pstRoot, char *pvD return RC_FAIL; } + lTime -= lGetTiskTime(); + if(g_stCustom.m_eShow && !pszFile) + { + for(lRet = 0, pstNode = pstRoot; pstNode; pstNode = pstNode->pstNext) + { + if(lRet < strlen(pstNode->m_stKey.m_szField)) + lRet = strlen(pstNode->m_stKey.m_szField); + } + + for(i = 0, m = 0, ++ lRet; i < lRows && i < pstSavm->m_lEffect; i ++) + { + lOffset = pstIndex->m_lRowSize * i; + for(k = lRet + 20, pstNode = pstRoot; pstNode; pstNode = pstNode->pstNext) + { + pstKey = &pstNode->m_stKey; + switch(pstKey->m_lAttr) + { + case FIELD_DOUB: + switch(pstKey->m_lLen) + { + case 4: + fprintf(stdout, "%-*s:%f\n", lRet, pstNode->m_stKey.m_szField, + *((float *)(pvResult + lOffset + pstKey->m_lFrom))); + break; + case 8: + fprintf(stdout, "%-*s:%f\n", lRet, pstNode->m_stKey.m_szField, + *((double *)(pvResult + lOffset + pstKey->m_lFrom))); + break; + default: + break; + } + break; + case FIELD_LONG: + switch(pstKey->m_lLen) + { + case 2: + fprintf(stdout, "%-*s:%d\n", lRet, pstNode->m_stKey.m_szField, + *((sint *)(pvResult + lOffset + pstKey->m_lFrom))); + break; + case 4: + fprintf(stdout, "%-*s:%d\n", lRet, pstNode->m_stKey.m_szField, + *((int *)(pvResult + lOffset + pstKey->m_lFrom))); + break; + case 8: + fprintf(stdout, "%-*s:%lld\n", lRet, pstNode->m_stKey.m_szField, + *((llong *)(pvResult + lOffset + pstKey->m_lFrom))); + break; + default: + break; + } + break; + case FIELD_CHAR: + if(strlen(pvResult + lOffset + pstKey->m_lFrom) > k) + k = strlen(pvResult + lOffset + pstKey->m_lFrom); + fprintf(stdout, "%-*s:%.*s\n", lRet, pstNode->m_stKey.m_szField, + (int)pstKey->m_lLen, pvResult + lOffset + pstKey->m_lFrom); + break; + default: + break; + } + } + + if((i + 1) == lRows) // last row + break; + + for(j = 0; j < k; j ++) + fprintf(stdout, "-"); + fprintf(stdout, "\n"); + + if(++ m == g_stCustom.m_lRows) // Total output row number at once + { + m = 0; + fprintf(stdout, "\b\b"); + while(10 != getchar()); + continue; + } + } + fprintf(stdout, "\n"); + fflush(stdout); + TFree(pvResult); + + fprintf(stdout, "---(%ld) records selected, ep(%d), %s---\n", pstSavm->m_lEffect, + pstSavm->m_lEType, sGetCostTime(-1 * lTime)); + return RC_SUCC; + } + if(pszFile) { if(NULL == (fp = fopen(pszFile, "wb"))) @@ -2263,7 +2436,7 @@ long _lExeSelect(SATvm *pstSavm, TIndex *pstIndex, SQLFld *pstRoot, char *pvD fprintf(fp, "%s ", pstNode->m_stKey.m_szField); fprintf(fp, "\n"); - for(i = 0; i < lRows && i < pstSavm->m_lEffect; i ++) + for(m = 0, i = 0; i < lRows && i < pstSavm->m_lEffect; i ++) { lOffset = pstIndex->m_lRowSize * i; for(pstNode = pstRoot; pstNode; pstNode = pstNode->pstNext) @@ -2313,9 +2486,16 @@ long _lExeSelect(SATvm *pstSavm, TIndex *pstIndex, SQLFld *pstRoot, char *pvD } fprintf(fp, "\n"); fflush(fp); + + if(NULL == pszFile && (++ m) == g_stCustom.m_lRows) // Total output row number at once + { + m = 0; + fprintf(stdout, "\b\b"); + while(10 != getchar()); + continue; + } } TFree(pvResult); - lTime -= lGetTiskTime(); if(pszFile) { @@ -2343,6 +2523,7 @@ long lParseSequece(SATvm *pstSavm, char *pszSQName, char *pszFiled, bool bRmt long lRet; ulong ulSeque; +// select nextval from SEQUENCE@SEQ_TEST if(strcasecmp(pszFiled, "nextval")) { pstSavm->m_lErrno = SQL_ERR_FIELD; @@ -3562,6 +3743,45 @@ long _lUnloadSyntax(SATvm *pstSavm, char *pszSQL, bool bRmt) return _lSelectSyntax(pstSavm, p, szFile, szDelmit, bRmt); } +/************************************************************************************************** + description:initial custom tables + parameters: + return: + **************************************************************************************************/ +void vInitTableList(SATvm *pstSavm, bool bRmt) +{ + long lRet; + size_t i, lRows = 0; + TIndex stIndex, *pstIndex = NULL; + + pstSavm->bSearch = TYPE_SYSTEM; +// if(RC_SUCC != lInitSATvm(pstSavm, pstFace->m_table)) +// return RC_FAIL; + + conditinit(pstSavm, stIndex, SYS_TVM_INDEX); + conditnum(pstSavm, stIndex, m_lType, TYPE_CLIENT); + conditnum(pstSavm, stIndex, m_lLocal, RES_LOCAL_SID); + + if(bRmt) + lRet = lTvmQuery(pstSavm, (size_t *)&lRows, (void **)&pstIndex); + else + lRet = lQuery(pstSavm, (size_t *)&lRows, (void *)&pstIndex); + if(RC_SUCC != lRet) + return ; + + for(i = 0, lRet = strlen(g_stCustom.m_pszWord); i < lRows; i ++) + { + lRet += strlen(pstIndex[i].m_szTable) + 1; + if(lRet > ALLOC_CMD_LEN) + break; + strcat(g_stCustom.m_pszWord, pstIndex[i].m_szTable); + strcat(g_stCustom.m_pszWord, ","); + } + + g_stCustom.m_lWord = lgetstrnum(g_stCustom.m_pszWord, ","); + TFree(pstIndex); + return ; +} /************************************************************************************************** description:Parse and execute SQL statements parameters: @@ -3614,6 +3834,8 @@ long lExecuteSQL(SATvm *pstSavm, char *pszSQL) vTableAmount(); return RC_SUCC; } + else if(!strncasecmp(pszSQL, "show index from ", 16)) + return _lShowTableInfo(pstSavm, pszSQL + 16, false); else if(!strncasecmp(pszSQL, "comment ", 8)) return _lCommentSyntax(pstSavm, pszSQL + 8, false); else if(!strncasecmp(pszSQL, "select ", 7)) @@ -3685,6 +3907,8 @@ long lExecuteTvm(SATvm *pstSavm, char *pszSQL) sGetTError(pstSavm->m_lErrno)); return RC_SUCC; } + else if(!strncasecmp(pszSQL, "show index from ", 16)) + return _lShowTableInfo(pstSavm, pszSQL + 16, true); else if(!strncasecmp(pszSQL, "select ", 7)) return _lSelectSyntax(pstSavm, pszSQL, NULL, NULL, true); else if(!strncasecmp(pszSQL, "update ", 7)) @@ -3892,11 +4116,16 @@ void vAddHistory(char *s) { FILE *fp = NULL; char szPath[512]; + static char szCmd[512] = {0}; if(!s || !strlen(s)) return ; + if(!strcmp(szCmd, s)) + return ; + memset(szPath, 0, sizeof(szPath)); + strncpy(szCmd, s, sizeof(szCmd)); snprintf(szPath, sizeof(szPath), "%s/%s", getenv("TVMDBD"), STVM_SQL_LINE); if(NULL == (fp = fopen(szPath, "a+"))) return ; @@ -3950,6 +4179,150 @@ void vSetHistory() rename(szBak, szPath); } +/************************************************************************************************** + description:customization + parameters: + return: + **************************************************************************************************/ +void vCustomization(SATvm *pstSavm, char *s) +{ + strimall(s); + strimcrlf(s); + + if(!strcasecmp(s, "debug on")) + g_stCustom.m_eDebug = 1; + else if(!strcasecmp(s, "debug off")) + g_stCustom.m_eDebug = 0; + else if(!strcasecmp(s, "showmode row")) + g_stCustom.m_eShow = 1; + else if(!strcasecmp(s, "showmode column")) + g_stCustom.m_eShow = 0; + else if(!strncasecmp(s, "showsize ", 9)) + g_stCustom.m_lRows = atol(s + 9); + else + { + pstSavm->m_lErrno = SQL_SYNTX_ERR; + fprintf(stderr, "customizing syntax error, (%d)(%s)\n", pstSavm->m_lErrno, + sGetTError(pstSavm->m_lErrno)); + } + + return ; +} + +/************************************************************************************************* + description:Get the key from matches list + parameters: + pszText --user text + nPos --last pos + return: + char* + *************************************************************************************************/ +char* sCommandKey(const char *pszText, int nPos) +{ + static int i; + char szKey[64]; + + for(i = nPos == 0 ? 0 : i; i < g_stCustom.m_lKey; i ++) + { + memset(szKey, 0, sizeof(szKey)); + strncpy(szKey, sfieldvalue(g_stCustom.m_pszKey, ",", i + 1), sizeof(szKey)); + if(!strncasecmp(szKey, pszText, strlen(pszText))) + { + i ++; + return strdup(szKey); + } + } + + return NULL; +} + +/************************************************************************************************* + description:Get the word from matches list + parameters: + pszText --user text + nPos --last pos + return: + char* + *************************************************************************************************/ +char* sCommandWord(const char *pszText, int nPos) +{ + static int i; + char szWord[64]; + + for(i = nPos == 0 ? 0 : i; i < g_stCustom.m_lWord; i ++) + { + memset(szWord, 0, sizeof(szWord)); + strncpy(szWord, sfieldvalue(g_stCustom.m_pszWord, ",", i + 1), sizeof(szWord)); + if(!strncasecmp(szWord, pszText, strlen(pszText))) + { + i ++; + return strdup(szWord); + } + } + + return NULL; +} + +/************************************************************************************************* + description:Get the matches list + parameters: + pszCmd --user text + return: + char* + *************************************************************************************************/ +char **pMatchCompletion(const char *pszCmd, int nPos, int nEnd) +{ + char **ppszMatch = NULL; + + if(NULL == pszCmd || !strlen(pszCmd)) + return NULL; + + if(nPos == 0) + ppszMatch = rl_completion_matches(pszCmd, sCommandKey); + else + ppszMatch = rl_completion_matches(pszCmd, sCommandWord); + + return ppszMatch; +} + +/************************************************************************************************** + description:initial custom + parameters: + return: + **************************************************************************************************/ +void vInitialCustom() +{ + memset(&g_stCustom, 0, sizeof(TCustom)); + g_stCustom.m_eDebug = 0; + g_stCustom.m_eShow = 0; // 显示模式 记录为单位,行为单位 + g_stCustom.m_lRows = 1; + g_stCustom.m_bInit = false; + g_stCustom.m_lKey = 0; + g_stCustom.m_lWord = 0; + g_stCustom.m_pszKey = NULL; + g_stCustom.m_pszWord = NULL; + + g_stCustom.m_pszKey = (char *)calloc(1, ALLOC_CMD_LEN); + g_stCustom.m_pszWord = (char *)calloc(1, ALLOC_CMD_LEN); + if(NULL == g_stCustom.m_pszKey || NULL == g_stCustom.m_pszWord) + exit(-1); + + snprintf(g_stCustom.m_pszKey, ALLOC_CMD_LEN, "SELECT,INSERT," + "UPDATE,DELETE,DROP,RENAME,TRUNCATE,REPLACE,CLEAR,EXIT,CREATE,BEGIN WORK," + "END WORK,COMMIT WORK,ROLLBACK WORK,SHOW,COMMENT,LOAD,UNLOAD,SET,"); + g_stCustom.m_lKey = lgetstrnum(g_stCustom.m_pszKey, ","); + + //select nextval from SEQUENCE@SEQ_TEST + snprintf(g_stCustom.m_pszWord, ALLOC_CMD_LEN, "SET,FROM,WHERE," + "COUNT(1),MAX,MIN,NEXTVAL,ORDER BY,GROUP BY,SEQUENCE@,SYS_TVM_FIELD," + "SYS_TVM_DOMAIN,SYS_TVM_SEQUE,TABLES,INTO,INFO,INDEX,VALUES,DEBUG [ON|OFF]," + "SHOWMODE [ROW|COLUMN],SHOWSIZE [NUM],"); + g_stCustom.m_lWord = lgetstrnum(g_stCustom.m_pszWord, ","); + + rl_attempted_completion_function = pMatchCompletion; + return ; +} + /************************************************************************************************** description:Execute SQL functions parameters: @@ -3965,10 +4338,18 @@ void vSQLStatement(int argc, char *argv[]) system("stty erase ^?"); system("stty erase ^H"); fprintf(stdout, "\n%s\n", sFuncVersion()); + vInitialCustom(); + // initialize_readline(); for(i = 2; i < argc; i ++) { if(!strcasecmp(argv[i], "--debug=on")) - elog = 1; + g_stCustom.m_eDebug = 1; + else if(!strcasecmp(argv[i], "--showmode=row")) + g_stCustom.m_eShow = 1; + else if(!strcasecmp(argv[i], "--showmode=column")) + g_stCustom.m_eShow = 0; + else if(!strncasecmp(argv[i], "--showsize=", 11)) + g_stCustom.m_lRows = atol(argv[i] + 11); else if(!strncasecmp(argv[i], "--msql=", 7)) { if(NULL == (fp = fopen(argv[i] + 7, "rb"))) @@ -4010,6 +4391,7 @@ void vSQLStatement(int argc, char *argv[]) } vSetHistory(); + vInitTableList(pstSavm, lRemote > 0 ? true : false); while(1) { if(fp) @@ -4030,6 +4412,7 @@ void vSQLStatement(int argc, char *argv[]) continue; } + srtrim(szSQL); if(!strcmp(pszUser, "q") || !strcmp(pszUser, "Q") || !strcmp(pszUser, "exit")) break; @@ -4039,6 +4422,15 @@ void vSQLStatement(int argc, char *argv[]) TFree(pszUser); continue; } + else if(!strncasecmp(pszUser, "set ", 4)) + { + vCustomization(pstSavm, pszUser + 4); + fprintf(stdout, "\n\n\n"); + add_history(pszUser); + vAddHistory(pszUser); + TFree(pszUser); + continue; + } else if(!strncasecmp(pszUser, "create", 6)) { if(lRemote > 0) @@ -4465,14 +4857,14 @@ int main(int argc, char *argv[]) fprintf(stderr, "rebuild index failure, %s\n", sGetTError(pstSavm->m_lErrno)); return RC_SUCC; case 'l': - fprintf(stdout, "Do you want to initialize the lock of table (%d) Y/N?:", atol(optarg)); + fprintf(stdout, "Do you want to initialize the lock of table (%ld) Y/N?:", atol(optarg)); lRet = getchar(); if(0x59 != lRet && 0x79 != lRet) return RC_SUCC; if(RC_SUCC != lResetLock(pstSavm, atol(optarg))) - fprintf(stderr, "重置表(%d)失败, %s\n", atol(optarg), sGetTError(pstSavm->m_lErrno)); + fprintf(stderr, "重置表(%ld)失败, %s\n", atol(optarg), sGetTError(pstSavm->m_lErrno)); else - fprintf(stderr, "重置表(%d)完成, completed successfully !!\n", atol(optarg)); + fprintf(stderr, "重置表(%ld)完成, completed successfully !!\n", atol(optarg)); return RC_SUCC; case 'v': fprintf(stdout, "%s\n", sGetTVMVers()); diff --git a/src/tcp.c b/src/tcp.c index 4934510..6f6c968 100644 --- a/src/tcp.c +++ b/src/tcp.c @@ -1757,9 +1757,9 @@ long lPollRequest(SATvm *pstSovm, SKCon *pstCon, TFace *pstFace, void *pstVoi } } - if(PROT_JAVA & pstFace->m_enum) + if(PROTOCAL_JAVA & pstFace->m_enum) { - pstFace->m_enum = pstFace->m_enum ^ PROT_JAVA; + pstFace->m_enum = pstFace->m_enum ^ PROTOCAL_JAVA; pstFace->m_lDLen = pstRun->m_lRowSize; if(NULL == (pvData = pProtocaJava(pstSovm, pstVoid, pstFace, pvData, pstFace->m_lRows))) { diff --git a/src/tree.c b/src/tree.c index b7b1216..2412a67 100644 --- a/src/tree.c +++ b/src/tree.c @@ -5485,7 +5485,7 @@ long _lSelectIndex(SATvm *pstSavm, void *pvAddr, TABLE t, void *psvOut, size_ if(RC_MISMA == lFeildMatch(&pstSavm->stCond, pstTruck->m_pvData, pstSavm->pstVoid)) { pthread_rwlock_unlock(prwLock); - pstSavm->m_lErrno = SVR_EXCEPTION; + pstSavm->m_lErrno = NO_DATA_FOUND; return RC_FAIL; } @@ -5916,7 +5916,7 @@ long _lQueryIndex(SATvm *pstSavm, void *pvAddr, TABLE t, size_t *plOut, void pstTruck = (PSHTruck)pGetNode(pvAddr, pstTree->m_lData); if(RC_MISMA == lFeildMatch(&pstSavm->stCond, pstTruck->m_pvData, pstSavm->pstVoid)) { - pstSavm->m_lErrno = SVR_EXCEPTION; + pstSavm->m_lErrno = NO_DATA_FOUND; return RC_FAIL; } @@ -6443,6 +6443,12 @@ long __lInsert(SATvm *pstSavm, void *pvAddr, TABLE t, ulong uTimes) { SHTruck *pstTruck = NULL; + if(lGetTblRow(pstSavm->tblName) <= ((TblDef *)pvAddr)->m_lValid) + { + pstSavm->m_lErrno = DATA_SPC_FULL; + return RC_FAIL; + } + if(HAVE_UNIQ_IDX(t)) { if(RC_SUCC != _lInsertIndex(pstSavm, pvAddr, t, &pstTruck)) @@ -6535,14 +6541,6 @@ long lInsert(SATvm *pstSavm) return RC_FAIL; } - if(lGetTblRow(pstSavm->tblName) <= ((TblDef *)pstRun->m_pvAddr)->m_lValid) - { - pthread_rwlock_unlock(prwLock); - pstSavm->m_lErrno = DATA_SPC_FULL; - vTblDisconnect(pstSavm, pstSavm->tblName); - return RC_FAIL; - } - lRet = __lInsert(pstSavm, pstRun->m_pvAddr, pstSavm->tblName, 0); pthread_rwlock_unlock(prwLock); vTblDisconnect(pstSavm, pstSavm->tblName); @@ -6678,7 +6676,7 @@ long _llFetchIndex(SATvm *pstSavm, RunTime *pstRun, TABLE t, void *psvOut) pstTruck = (PSHTruck)pGetNode(pvAddr, pstTree->m_lData); if(RC_MISMA == lFeildMatch(&pstSavm->stCond, pstTruck->m_pvData, pstRun->pstVoid)) { - pstSavm->m_lErrno = SVR_EXCEPTION; + pstSavm->m_lErrno = NO_DATA_FOUND; return RC_FAIL; } @@ -7064,7 +7062,7 @@ long _lNextIndex(SATvm *pstSavm, RunTime *pstRun, TABLE t, void **ppvOAddr) pstTruck = (PSHTruck)pGetNode(pvAddr, pstTree->m_lData); if(RC_MISMA == lFeildMatch(&pstSavm->stCond, pstTruck->m_pvData, pstRun->pstVoid)) { - pstSavm->m_lErrno = SVR_EXCEPTION; + pstSavm->m_lErrno = NO_DATA_FOUND; return RC_FAIL; } @@ -7394,7 +7392,7 @@ long __lIndexUpdate(SATvm *pstSavm, void *pvAddr, TABLE t, SHTruck *pstTruck, pstSavm --stvm handle pstAddr --table handle t --table - pvUpdate --update date + pvUpdate --update data return: RC_SUCC --success RC_FAIL --failure @@ -7448,14 +7446,13 @@ long _lUpdateIndex(SATvm *pstSavm, void *pvAddr, TABLE t, void *pvUpdate) if(RC_MISMA == lFeildMatch(&pstSavm->stCond, pstTruck->m_pvData, pstSavm->pstVoid)) { pthread_rwlock_unlock(prwLock); - pstSavm->m_lErrno = SVR_EXCEPTION; + pstSavm->m_lErrno = NO_DATA_FOUND; TFree(pvData); return RC_FAIL; } - memcpy(pvData, pvUpdate, lGetRowSize(pstSavm->tblName)); - memcpy(pvUpdate, pstTruck->m_pvData, lGetRowSize(pstSavm->tblName)); - if(RC_FAIL == lMergeTruck(pstSavm, &pstSavm->stUpdt, pvData, pvUpdate)) + memcpy(pvData, pstTruck->m_pvData, lGetRowSize(pstSavm->tblName)); + if(RC_FAIL == lMergeTruck(pstSavm, &pstSavm->stUpdt, pvUpdate, pvData)) { pthread_rwlock_unlock(prwLock); TFree(pvData); @@ -7463,7 +7460,7 @@ long _lUpdateIndex(SATvm *pstSavm, void *pvAddr, TABLE t, void *pvUpdate) } memset(szIdx, 0, sizeof(szIdx)); - if(NULL == pPickIndex(lGetIdxNum(t), pGetTblIdx(t), pvUpdate, szIdx)) + if(NULL == pPickIndex(lGetIdxNum(t), pGetTblIdx(t), pvData, szIdx)) { pthread_rwlock_unlock(prwLock); pstSavm->m_lErrno = IDX_FIELD_NIL; @@ -7471,7 +7468,7 @@ long _lUpdateIndex(SATvm *pstSavm, void *pvAddr, TABLE t, void *pvUpdate) return RC_FAIL; } - pstSavm->pstVoid = pvUpdate; + pstSavm->pstVoid = pvData; pstTruck->m_lTimes ++; SET_DATA_TRUCK(pstTruck, DATA_TRUCK_NULL); if(!memcmp(szIdx, szOld, MAX_INDEX_LEN)) @@ -7532,7 +7529,7 @@ long _lUpdateIndex(SATvm *pstSavm, void *pvAddr, TABLE t, void *pvUpdate) return RC_FAIL; } - memcpy(pstTruck->m_pvData, pvUpdate, lGetRowSize(t)); + memcpy(pstTruck->m_pvData, pvData, lGetRowSize(t)); pthread_rwlock_unlock(prwLock); pstSavm->m_lEffect = 1; @@ -7546,7 +7543,7 @@ long _lUpdateIndex(SATvm *pstSavm, void *pvAddr, TABLE t, void *pvUpdate) pstSavm --stvm handle pstAddr --table handle t --table - pvUpdate --update date + pvUpdate --update data return: RC_SUCC --success RC_FAIL --failure @@ -7581,13 +7578,13 @@ long _lUpdateGroup(SATvm *pstSavm, void *pvAddr, TABLE t, void *pvUpdate) if(NULL == (pstRoot = (SHTree *)pGetNode(pvAddr, ((TblDef *)pvAddr)->m_lGroupRoot))) { pstSavm->m_lErrno = SVR_EXCEPTION; - goto GROUP_ERROR; + goto REPGROUP_ERROR; } if(NULL == (pstTree = pSearchTree(pvAddr, pstRoot, szOld, lGetGrpLen(t)))) { pstSavm->m_lErrno = NO_DATA_FOUND; - goto GROUP_ERROR; + goto REPGROUP_ERROR; } pstSavm->m_lEffect = 0; @@ -7606,13 +7603,13 @@ long _lUpdateGroup(SATvm *pstSavm, void *pvAddr, TABLE t, void *pvUpdate) memcpy(pvData, pstTruck->m_pvData, lGetRowSize(t)); if(RC_FAIL == lMergeTruck(pstSavm, &pstSavm->stUpdt, pvUpdate, pvData)) - goto GROUP_ERROR; + goto REPGROUP_ERROR; memset(szIdx, 0, sizeof(szIdx)); if(NULL == pPickIndex(lGetGrpNum(t), pGetTblGrp(t), pvData, szIdx)) { pstSavm->m_lErrno = IDX_FIELD_NIL; - goto GROUP_ERROR; + goto REPGROUP_ERROR; } pstSavm->m_lEffect ++; @@ -7623,7 +7620,7 @@ long _lUpdateGroup(SATvm *pstSavm, void *pvAddr, TABLE t, void *pvUpdate) if(RC_SUCC != __lIndexUpdate(pstSavm, pvAddr, t, pstTruck, pstList->m_lData)) { SET_DATA_TRUCK(pstTruck, DATA_TRUCK_NRML); - goto GROUP_ERROR; + goto REPGROUP_ERROR; } } @@ -7636,7 +7633,7 @@ long _lUpdateGroup(SATvm *pstSavm, void *pvAddr, TABLE t, void *pvUpdate) ((TblDef *)pvAddr)->m_lValid ++; pstSavm->m_lErrno = SVR_EXCEPTION; SET_DATA_TRUCK(pstTruck, DATA_TRUCK_NRML); - goto GROUP_ERROR; + goto REPGROUP_ERROR; } if(SELF_POS_UNUSE == pstTree->m_lData) @@ -7648,7 +7645,7 @@ long _lUpdateGroup(SATvm *pstSavm, void *pvAddr, TABLE t, void *pvUpdate) if(NULL == (pstRoot = pInsertGroup(pstSavm, pstRoot, szIdx, lGetGrpLen(t), &pstTruck))) { SET_DATA_TRUCK(pstTruck, DATA_TRUCK_NRML); - goto GROUP_ERROR; + goto REPGROUP_ERROR; } ((TblDef *)pvAddr)->m_lValid ++; @@ -7656,7 +7653,7 @@ long _lUpdateGroup(SATvm *pstSavm, void *pvAddr, TABLE t, void *pvUpdate) } if(RC_SUCC != lRecordWork(pstSavm, pstTruck->m_pvData, OPERATE_UPDATE)) - goto GROUP_ERROR; + goto REPGROUP_ERROR; memcpy(pstTruck->m_pvData, pvData, lGetRowSize(t)); SET_DATA_TRUCK(pstTruck, DATA_TRUCK_NRML); @@ -7674,7 +7671,7 @@ long _lUpdateGroup(SATvm *pstSavm, void *pvAddr, TABLE t, void *pvUpdate) return RC_SUCC; -GROUP_ERROR: +REPGROUP_ERROR: pthread_rwlock_unlock(prwLock); TFree(pvData); return RC_FAIL; @@ -7686,7 +7683,7 @@ GROUP_ERROR: pstSavm --stvm handle pstAddr --table handle t --table - pvUpdate --update date + pvUpdate --update data return: RC_SUCC --success RC_FAIL --failure @@ -7743,13 +7740,13 @@ long _lUpdateHash(SATvm *pstSavm, void *pvAddr, TABLE t, void *pvUpdate) memcpy(pvData, pstTruck->m_pvData, lGetRowSize(t)); if(RC_FAIL == lMergeTruck(pstSavm, &pstSavm->stUpdt, pvUpdate, pvData)) - goto HASH_ERROR; + goto REPHASH_ERROR; memset(szIdx, 0, sizeof(szIdx)); if(NULL == pPickIndex(lGetGrpNum(t), pGetTblGrp(t), pvData, szIdx)) { pstSavm->m_lErrno = IDX_FIELD_NIL; - goto HASH_ERROR; + goto REPHASH_ERROR; } pstSavm->m_lEffect ++; @@ -7761,7 +7758,7 @@ long _lUpdateHash(SATvm *pstSavm, void *pvAddr, TABLE t, void *pvUpdate) if(RC_SUCC != __lIndexUpdate(pstSavm, pvAddr, t, pstTruck, pstList->m_lData)) { SET_DATA_TRUCK(pstTruck, DATA_TRUCK_NULL); - goto HASH_ERROR; + goto REPHASH_ERROR; } } @@ -7775,7 +7772,7 @@ long _lUpdateHash(SATvm *pstSavm, void *pvAddr, TABLE t, void *pvUpdate) ((TblDef *)pvAddr)->m_lValid ++; pstSavm->m_lErrno = SVR_EXCEPTION; SET_DATA_TRUCK(pstTruck, DATA_TRUCK_NRML); - goto HASH_ERROR; + goto REPHASH_ERROR; } lOffset = ((TblDef *)pvAddr)->m_lGroupPos + lIdx * sizeof(SHTree); @@ -7783,20 +7780,20 @@ long _lUpdateHash(SATvm *pstSavm, void *pvAddr, TABLE t, void *pvUpdate) { pstSavm->m_lErrno = SVR_EXCEPTION; SET_DATA_TRUCK(pstTruck, DATA_TRUCK_NRML); - goto HASH_ERROR; + goto REPHASH_ERROR; } if(RC_SUCC != __lInsertHash(pstSavm, pvAddr, t, pstTree, lOffset, &pstTruck)) { pstSavm->m_lErrno = SVR_EXCEPTION; SET_DATA_TRUCK(pstTruck, DATA_TRUCK_NRML); - goto HASH_ERROR; + goto REPHASH_ERROR; } ((TblDef *)pvAddr)->m_lValid ++; } if(RC_SUCC != lRecordWork(pstSavm, pstTruck->m_pvData, OPERATE_UPDATE)) - goto HASH_ERROR; + goto REPHASH_ERROR; memcpy(pstTruck->m_pvData, pvData, lGetRowSize(t)); SET_DATA_TRUCK(pstTruck, DATA_TRUCK_NRML); @@ -7814,7 +7811,7 @@ long _lUpdateHash(SATvm *pstSavm, void *pvAddr, TABLE t, void *pvUpdate) return RC_SUCC; -HASH_ERROR: +REPHASH_ERROR: pthread_rwlock_unlock(prwLock); TFree(pvData); return RC_FAIL; @@ -7826,7 +7823,7 @@ HASH_ERROR: pstSavm --stvm handle pstAddr --table handle t --table - pvUpdate --update date + pvUpdate --update data return: RC_SUCC --success RC_FAIL --failure @@ -7924,7 +7921,7 @@ TRUCK_ERROR: description:API - Update parameters: pstSavm --stvm handle - pvUpdate --update date + pvUpdate --update data return: RC_SUCC --success RC_FAIL --failure @@ -8742,7 +8739,7 @@ long _lExportContext(FILE *fp, char *s, long lIdx, TblKey *pstIdx, char *f) } break; case FIELD_CHAR: - fprintf(fp, "%.*s", pstIdx[i].m_lLen, s + pstIdx[i].m_lFrom); + fprintf(fp, "%.*s", (int)pstIdx[i].m_lLen, s + pstIdx[i].m_lFrom); break; default: fprintf(stderr, "Export field attribute exception\n"); @@ -9737,7 +9734,7 @@ long _lClickIndex(SATvm *pstSavm, void *pvAddr, TABLE t, ulong *puHits) if(RC_MISMA == lFeildMatch(&pstSavm->stCond, pstTruck->m_pvData, pstSavm->pstVoid)) { pthread_rwlock_unlock(prwLock); - pstSavm->m_lErrno = SVR_EXCEPTION; + pstSavm->m_lErrno = NO_DATA_FOUND; return RC_FAIL; } @@ -10016,6 +10013,631 @@ long lClick(SATvm *pstSavm, ulong *puHits) return lRet; } +/************************************************************************************************* + description:Select the table data according to the Unique index + parameters: + pstSavm --stvm handle + pvAddr --memory address + t --table + psvOut --result data + plData --offset + return: + RC_SUCC --success + RC_FAIL --failure + *************************************************************************************************/ +long _lReplaceIndex(SATvm *pstSavm, void *pvAddr, TABLE t, void *pvUpdate) +{ + size_t lData; + long lRet = RC_SUCC; + void *pvData = NULL; + SHTruck *pstTruck = NULL; + SHTree *pstRoot, *pstTree = NULL; + RWLock *prwLock = (RWLock *)pGetRWLock(pvAddr); + char szOld[MAX_INDEX_LEN], szIdx[MAX_INDEX_LEN]; + + memset(szOld, 0, sizeof(szOld)); + if(NULL == pGetIndex(&pstSavm->stCond, lGetIdxNum(t), pGetTblIdx(t), pstSavm->pstVoid, szOld)) + return RC_CONTU; + + if(NULL == (pvData = (void *)malloc(lGetRowSize(pstSavm->tblName)))) + { + pstSavm->m_lErrno = MALLC_MEM_ERR; + return RC_FAIL; + } + + if(RC_SUCC != pthread_rwlock_wrlock(prwLock)) + { + pstSavm->m_lErrno = LOCK_DOWR_ERR; + TFree(pvData); + return RC_FAIL; + } + + pstSavm->m_lEType = EXE_PLAN_IDX; + if(NULL == (pstRoot = (SHTree *)pGetNode(pvAddr, ((TblDef *)pvAddr)->m_lTreeRoot))) + { + pthread_rwlock_unlock(prwLock); + pstSavm->m_lErrno = SVR_EXCEPTION; + TFree(pvData); + return RC_FAIL; + } + + if(NULL == (pstTree = (SHTree *)pSearchTree(pvAddr, pstRoot, szOld, lGetIdxLen(t)))) + { + // If don't find it, so insert + pstSavm->pstVoid = pvUpdate; + lRet = __lInsert(pstSavm, pvAddr, t, 0); + pthread_rwlock_unlock(prwLock); + TFree(pvData); + return lRet; + } + + lData = pstTree->m_lData; + pstTruck = (PSHTruck)pGetNode(pvAddr, pstTree->m_lData); + if(RC_MISMA == lFeildMatch(&pstSavm->stCond, pstTruck->m_pvData, pstSavm->pstVoid)) + { + pthread_rwlock_unlock(prwLock); + // The uniq index is same, and the new data must trigger the index repetition. + pstSavm->m_lErrno = UNIQ_IDX_REPT; + TFree(pvData); + return RC_FAIL; + } + + memcpy(pvData, pstTruck->m_pvData, lGetRowSize(pstSavm->tblName)); + if(RC_FAIL == lMergeTruck(pstSavm, &pstSavm->stUpdt, pvUpdate, pvData)) + { + pthread_rwlock_unlock(prwLock); + TFree(pvData); + return RC_FAIL; + } + + memset(szIdx, 0, sizeof(szIdx)); + if(NULL == pPickIndex(lGetIdxNum(t), pGetTblIdx(t), pvData, szIdx)) + { + pthread_rwlock_unlock(prwLock); + pstSavm->m_lErrno = IDX_FIELD_NIL; + TFree(pvData); + return RC_FAIL; + } + + pstSavm->pstVoid = pvData; + pstTruck->m_lTimes ++; + SET_DATA_TRUCK(pstTruck, DATA_TRUCK_NULL); + if(!memcmp(szIdx, szOld, MAX_INDEX_LEN)) + { + if(HAVE_NORL_IDX(t)) + lRet = __lUpdateGroup(pstSavm, pvAddr, t, pstTruck, lData); + else if(HAVE_HASH_IDX(t)) + lRet = __lUpdateHash(pstSavm, pvAddr, t, pstTruck, lData); + } + else + { + if(NULL != (SHTree *)pSearchTree(pvAddr, pstRoot, szIdx, lGetIdxLen(t))) + { + SET_DATA_TRUCK(pstTruck, DATA_TRUCK_NRML); + pthread_rwlock_unlock(prwLock); + pstSavm->m_lErrno = UNIQ_IDX_REPT; + TFree(pvData); + return RC_FAIL; + } + + if(NULL == (pstRoot = _pDeleteTree(pvAddr, pstSavm->tblName, pstRoot, pstTree))) + { + SET_DATA_TRUCK(pstTruck, DATA_TRUCK_NRML); + pthread_rwlock_unlock(prwLock); + pstSavm->m_lErrno = SVR_EXCEPTION; + TFree(pvData); + return RC_FAIL; + } + + ((TblDef *)pvAddr)->m_lValid --; + if(NULL == (pstRoot = pInsertTree(pstSavm, pstRoot, szIdx, lGetIdxLen(t), &pstTruck))) + { + SET_DATA_TRUCK(pstTruck, DATA_TRUCK_NRML); + pthread_rwlock_unlock(prwLock); + TFree(pvData); + return RC_FAIL; + } + + ((TblDef *)pvAddr)->m_lValid ++; + ((TblDef *)pvAddr)->m_lTreeRoot = pstRoot->m_lSePos; + if(HAVE_NORL_IDX(t)) + lRet = __lUpdateGroup(pstSavm, pvAddr, t, pstTruck, lData); + else if(HAVE_HASH_IDX(t)) + lRet = __lUpdateHash(pstSavm, pvAddr, t, pstTruck, lData); + } + SET_DATA_TRUCK(pstTruck, DATA_TRUCK_NRML); + if(RC_SUCC != lRet) + { + pthread_rwlock_unlock(prwLock); + TFree(pvData); + return RC_FAIL; + } + + if(RC_SUCC != lRecordWork(pstSavm, pstTruck->m_pvData, OPERATE_UPDATE)) + { + pthread_rwlock_unlock(prwLock); + TFree(pvData); + return RC_FAIL; + } + + memcpy(pstTruck->m_pvData, pvData, lGetRowSize(t)); + pthread_rwlock_unlock(prwLock); + pstSavm->m_lEffect = 1; + + TFree(pvData); + return RC_SUCC; +} + +/************************************************************************************************* + description:Update record index + parameters: + pstSavm --stvm handle + pstAddr --table handle + t --table + pvUpdate --update data + return: + RC_SUCC --success + RC_FAIL --failure + *************************************************************************************************/ +long _lReplaceGroup(SATvm *pstSavm, void *pvAddr, TABLE t, void *pvUpdate) +{ + SHList *pstList = NULL; + SHTruck *pstTruck = NULL; + size_t lOffset, lNext; + SHTree *pstTree, *pstRoot; + void *pvData, *pvCond = NULL; + RWLock *prwLock = (RWLock *)pGetRWLock(pvAddr); + char szOld[MAX_INDEX_LEN], szIdx[MAX_INDEX_LEN]; + + memset(szOld, 0, sizeof(szOld)); + if(NULL == pGetIndex(&pstSavm->stCond, lGetGrpNum(t), pGetTblGrp(t), pstSavm->pstVoid, szOld)) + return RC_CONTU; + + if(NULL == (pvData = (void *)malloc(lGetRowSize(t)))) + { + pstSavm->m_lErrno = MALLC_MEM_ERR; + return RC_FAIL; + } + + if(RC_SUCC != pthread_rwlock_wrlock(prwLock)) + { + pstSavm->m_lErrno = LOCK_DOWR_ERR; + TFree(pvData); + return RC_FAIL; + } + + if(NULL == (pstRoot = (SHTree *)pGetNode(pvAddr, ((TblDef *)pvAddr)->m_lGroupRoot))) + { + pstSavm->m_lErrno = SVR_EXCEPTION; + goto GROUP_ERROR; + } + + if(NULL == (pstTree = pSearchTree(pvAddr, pstRoot, szOld, lGetGrpLen(t)))) + { + TFree(pvData); + // If don't find it, then insert + pstSavm->pstVoid = pvUpdate; + lNext = __lInsert(pstSavm, pvAddr, t, 0); + pthread_rwlock_unlock(prwLock); + return lNext; + } + + pstSavm->m_lEffect = 0; + pvCond = pstSavm->pstVoid; + pstSavm->m_lEType = EXE_PLAN_GRP; + for(pstList = (SHList *)pGetNode(pvAddr, pstTree->m_lData); SELF_POS_UNUSE != pstList->m_lPos; + pstList = (SHList *)pGetNode(pvAddr, lNext)) + { + lNext = pstList->m_lNext; + pstTruck = (PSHTruck)pGetNode(pvAddr, pstList->m_lData); + if(RC_MISMA == lFeildMatch(&pstSavm->stCond, pstTruck->m_pvData, pvCond)) + { + if(SELF_POS_UNUSE == pstList->m_lNext) break; + continue; + } + + memcpy(pvData, pstTruck->m_pvData, lGetRowSize(t)); + if(RC_FAIL == lMergeTruck(pstSavm, &pstSavm->stUpdt, pvUpdate, pvData)) + goto GROUP_ERROR; + + memset(szIdx, 0, sizeof(szIdx)); + if(NULL == pPickIndex(lGetGrpNum(t), pGetTblGrp(t), pvData, szIdx)) + { + pstSavm->m_lErrno = IDX_FIELD_NIL; + goto GROUP_ERROR; + } + + pstSavm->m_lEffect ++; + pstSavm->pstVoid = pvData; + SET_DATA_TRUCK(pstTruck, DATA_TRUCK_NULL); + if(HAVE_UNIQ_IDX(t)) + { + if(RC_SUCC != __lIndexUpdate(pstSavm, pvAddr, t, pstTruck, pstList->m_lData)) + { + SET_DATA_TRUCK(pstTruck, DATA_TRUCK_NRML); + goto GROUP_ERROR; + } + } + + if(memcmp(szIdx, szOld, MAX_INDEX_LEN)) + { + -- ((TblDef *)pvAddr)->m_lValid; + lOffset = lGetListOfs(t) + ((TblDef *)pvAddr)->m_lValid * sizeof(SHList); + if(RC_SUCC != lReleaseList(pvAddr, t, pstTree, pstList, lOffset, &lNext)) + { + ((TblDef *)pvAddr)->m_lValid ++; + pstSavm->m_lErrno = SVR_EXCEPTION; + SET_DATA_TRUCK(pstTruck, DATA_TRUCK_NRML); + goto GROUP_ERROR; + } + + if(SELF_POS_UNUSE == pstTree->m_lData) + { + pstRoot = _pDeleteGroup(pvAddr, t, pstRoot, pstTree, &pstSavm->m_lEffect); + ((TblDef *)pvAddr)->m_lGroupRoot = pstRoot->m_lSePos; + } + + if(NULL == (pstRoot = pInsertGroup(pstSavm, pstRoot, szIdx, lGetGrpLen(t), &pstTruck))) + { + SET_DATA_TRUCK(pstTruck, DATA_TRUCK_NRML); + goto GROUP_ERROR; + } + + ((TblDef *)pvAddr)->m_lValid ++; + ((TblDef *)pvAddr)->m_lGroupRoot = pstRoot->m_lSePos; + } + + if(RC_SUCC != lRecordWork(pstSavm, pstTruck->m_pvData, OPERATE_UPDATE)) + goto GROUP_ERROR; + + memcpy(pstTruck->m_pvData, pvData, lGetRowSize(t)); + SET_DATA_TRUCK(pstTruck, DATA_TRUCK_NRML); + + if(FIRST_ROW & pstSavm->lFind) break; + } + + if(0 == pstSavm->m_lEffect) + { + // If don't find it, then insert + pstSavm->pstVoid = pvUpdate; + lNext = __lInsert(pstSavm, pvAddr, t, 0); + pthread_rwlock_unlock(prwLock); + TFree(pvData); + return lNext; + } + + pthread_rwlock_unlock(prwLock); + TFree(pvData); + return RC_SUCC; + +GROUP_ERROR: + pthread_rwlock_unlock(prwLock); + TFree(pvData); + return RC_FAIL; +} + +/************************************************************************************************* + description:Update record hash index + parameters: + pstSavm --stvm handle + pstAddr --table handle + t --table + pvUpdate --update data + return: + RC_SUCC --success + RC_FAIL --failure + *************************************************************************************************/ +long _lReplaceHash(SATvm *pstSavm, void *pvAddr, TABLE t, void *pvUpdate) +{ + SHList *pstList = NULL; + SHTruck *pstTruck = NULL; + SHTree *pstTree, *pstHash; + void *pvData = NULL, *pvCond; + size_t lOld, lIdx, lOffset, lNext; + RWLock *prwLock = (RWLock *)pGetRWLock(pvAddr); + char szOld[MAX_INDEX_LEN], szIdx[MAX_INDEX_LEN]; + + memset(szOld, 0, sizeof(szOld)); + if(NULL == pGetIndex(&pstSavm->stCond, lGetGrpNum(t), pGetTblGrp(t), pstSavm->pstVoid, szOld)) + return RC_CONTU; + + if(NULL == (pvData = (void *)malloc(lGetRowSize(t)))) + { + pstSavm->m_lErrno = MALLC_MEM_ERR; + return RC_FAIL; + } + + lOld = uGetHash(szOld, lGetGrpLen(t)) % ((TblDef *)pvAddr)->m_lMaxRow; + lOffset = ((TblDef *)pvAddr)->m_lGroupPos + lOld * sizeof(SHTree); + + if(RC_SUCC != pthread_rwlock_wrlock(prwLock)) + { + pstSavm->m_lErrno = LOCK_DOWR_ERR; + TFree(pvData); + return RC_FAIL; + } + + if(NULL == (pstHash = (SHTree *)(pvAddr + lOffset))) + { + // If don't find it, then insert + pstSavm->pstVoid = pvUpdate; + lNext = __lInsert(pstSavm, pvAddr, t, 0); + pthread_rwlock_unlock(prwLock); + TFree(pvData); + return lNext; + } + + pstSavm->m_lEffect = 0; + pvCond = pstSavm->pstVoid; + pstSavm->m_lEType = EXE_PLAN_GRP; + for(pstList = (SHList *)pGetNode(pvAddr, pstHash->m_lData); SELF_POS_UNUSE != pstList->m_lPos; + pstList = (SHList *)pGetNode(pvAddr, lNext)) + { + lNext = pstList->m_lNext; + pstTruck = (PSHTruck)pGetNode(pvAddr, pstList->m_lData); + if(RC_MISMA == lFeildMatch(&pstSavm->stCond, pstTruck->m_pvData, pvCond)) + { + if(SELF_POS_UNUSE == pstList->m_lNext) break; + continue; + } + + memcpy(pvData, pstTruck->m_pvData, lGetRowSize(t)); + if(RC_FAIL == lMergeTruck(pstSavm, &pstSavm->stUpdt, pvUpdate, pvData)) + goto HASH_ERROR; + + memset(szIdx, 0, sizeof(szIdx)); + if(NULL == pPickIndex(lGetGrpNum(t), pGetTblGrp(t), pvData, szIdx)) + { + pstSavm->m_lErrno = IDX_FIELD_NIL; + goto HASH_ERROR; + } + + pstSavm->m_lEffect ++; + pstSavm->pstVoid = pvData; + lIdx = uGetHash(szIdx, lGetGrpLen(t)) % ((TblDef *)pvAddr)->m_lMaxRow; + SET_DATA_TRUCK(pstTruck, DATA_TRUCK_NULL); + if(HAVE_UNIQ_IDX(t)) + { + if(RC_SUCC != __lIndexUpdate(pstSavm, pvAddr, t, pstTruck, pstList->m_lData)) + { + SET_DATA_TRUCK(pstTruck, DATA_TRUCK_NULL); + goto HASH_ERROR; + } + } + + // Index does not match, rebuild inde + if(lOld != lIdx) + { + -- ((TblDef *)pvAddr)->m_lValid; + lOffset = lGetListOfs(t) + ((TblDef *)pvAddr)->m_lValid * sizeof(SHList); + if(RC_SUCC != lReleaseList(pvAddr, t, pstHash, pstList, lOffset, &lNext)) + { + ((TblDef *)pvAddr)->m_lValid ++; + pstSavm->m_lErrno = SVR_EXCEPTION; + SET_DATA_TRUCK(pstTruck, DATA_TRUCK_NRML); + goto HASH_ERROR; + } + + lOffset = ((TblDef *)pvAddr)->m_lGroupPos + lIdx * sizeof(SHTree); + if(NULL == (pstTree = (SHTree *)(pvAddr + lOffset))) + { + pstSavm->m_lErrno = SVR_EXCEPTION; + SET_DATA_TRUCK(pstTruck, DATA_TRUCK_NRML); + goto HASH_ERROR; + } + + if(RC_SUCC != __lInsertHash(pstSavm, pvAddr, t, pstTree, lOffset, &pstTruck)) + { + pstSavm->m_lErrno = SVR_EXCEPTION; + SET_DATA_TRUCK(pstTruck, DATA_TRUCK_NRML); + goto HASH_ERROR; + } + + ((TblDef *)pvAddr)->m_lValid ++; + } + if(RC_SUCC != lRecordWork(pstSavm, pstTruck->m_pvData, OPERATE_UPDATE)) + goto HASH_ERROR; + + memcpy(pstTruck->m_pvData, pvData, lGetRowSize(t)); + SET_DATA_TRUCK(pstTruck, DATA_TRUCK_NRML); + + if(FIRST_ROW & pstSavm->lFind) break; + } + + if(0 == pstSavm->m_lEffect) + { + // If don't find it, then insert + pstSavm->pstVoid = pvUpdate; + lNext = __lInsert(pstSavm, pvAddr, t, 0); + pthread_rwlock_unlock(prwLock); + TFree(pvData); + return lNext; + } + + pthread_rwlock_unlock(prwLock); + TFree(pvData); + return RC_SUCC; + +HASH_ERROR: + pthread_rwlock_unlock(prwLock); + TFree(pvData); + return RC_FAIL; +} + +/************************************************************************************************* + description:Update record truck + parameters: + pstSavm --stvm handle + pstAddr --table handle + t --table + pvUpdate --update data + return: + RC_SUCC --success + RC_FAIL --failure + *************************************************************************************************/ +long _lTruckReplace(SATvm *pstSavm, void *pvAddr, TABLE t, void *pvUpdate) +{ + long lRet = RC_SUCC; + SHTruck *pstTruck = NULL; + void *pvData = NULL, *pvCond; + size_t lRow, lOffset = lGetTblData(t); + RWLock *prwLock = (RWLock *)pGetRWLock(pvAddr); + + if(NULL == (pvData = (void *)malloc(lGetRowSize(t)))) + { + pstSavm->m_lErrno = MALLC_MEM_ERR; + return RC_FAIL; + } + + if(RC_SUCC != pthread_rwlock_wrlock(prwLock)) + { + pstSavm->m_lErrno = LOCK_DOWR_ERR; + TFree(pvData); + return RC_FAIL; + } + + pstSavm->m_lEffect = 0; + pvCond = pstSavm->pstVoid; + pstSavm->m_lEType = EXE_PLAN_ALL; + pstTruck = (PSHTruck)pGetNode(pvAddr, lOffset); + for(lRow = 0; (lRow < ((TblDef *)pvAddr)->m_lValid) && (lOffset < lGetTableSize(t)); + pstTruck = (PSHTruck)pGetNode(pvAddr, lOffset)) + { + if(IS_TRUCK_NULL(pstTruck)) + { + lOffset += lGetRowTruck(t); + continue; + } + + lRow ++; + if(RC_MISMA == lFeildMatch(&pstSavm->stCond, pstTruck->m_pvData, pvCond)) + { + lOffset += lGetRowTruck(t); + continue; + } + + memcpy(pvData, pstTruck->m_pvData, lGetRowSize(t)); + if(RC_FAIL == lMergeTruck(pstSavm, &pstSavm->stUpdt, pvUpdate, pvData)) + goto REPLACE_ERROR; + + pstSavm->m_lEffect ++; + pstSavm->pstVoid = pvData; + SET_DATA_TRUCK(pstTruck, DATA_TRUCK_NULL); + if(HAVE_UNIQ_IDX(t)) + { + if(RC_SUCC != __lIndexUpdate(pstSavm, pvAddr, t, pstTruck, lOffset)) + { + SET_DATA_TRUCK(pstTruck, DATA_TRUCK_NRML); + goto REPLACE_ERROR; + } + } + + if(HAVE_NORL_IDX(t)) + lRet = __lUpdateGroup(pstSavm, pvAddr, t, pstTruck, lOffset); + else if(HAVE_HASH_IDX(t)) + lRet = __lUpdateHash(pstSavm, pvAddr, t, pstTruck, lOffset); + SET_DATA_TRUCK(pstTruck, DATA_TRUCK_NRML); + if(RC_SUCC != lRet) + goto REPLACE_ERROR; + + if(RC_SUCC != lRecordWork(pstSavm, pstTruck->m_pvData, OPERATE_UPDATE)) + goto REPLACE_ERROR; + + memcpy(pstTruck->m_pvData, pvData, lGetRowSize(t)); + if(FIRST_ROW & pstSavm->lFind) break; + lOffset += lGetRowTruck(t); + } + + if(0 == pstSavm->m_lEffect) + { + // If don't find it, so insert + pstSavm->pstVoid = pvUpdate; + lRet = __lInsert(pstSavm, pvAddr, t, 0); + pthread_rwlock_unlock(prwLock); + TFree(pvData); + return lRet; + } + + pthread_rwlock_unlock(prwLock); + TFree(pvData); + return RC_SUCC; + +REPLACE_ERROR: + pthread_rwlock_unlock(prwLock); + TFree(pvData); + return RC_FAIL; +} + +/************************************************************************************************* + description:API - lReplace + parameters: + pstSavm --stvm handle + pvReplace --replace data + return: + RC_SUCC --success + RC_FAIL --failure + *************************************************************************************************/ +long lReplace(SATvm *pstSavm, void *pvReplace) +{ + long lRet; + void *pvData; + RunTime *pstRun = NULL; + + if(!pstSavm || !pstSavm->pstVoid) + { + pstSavm->m_lErrno = CONDIT_IS_NIL; + return RC_FAIL; + } + + pvData = pstSavm->pstVoid; + if(NULL == (pstRun = (RunTime *)pInitMemTable(pstSavm, pstSavm->tblName))) + return RC_FAIL; + + if(RES_REMOT_SID == pstRun->m_lLocal) + { + Tremohold(pstSavm, pstRun); + return RC_FAIL; +// return _lReplaceByRt(pstSavm, psvOut); + } + + if(HAVE_UNIQ_IDX(pstSavm->tblName)) + { + lRet = _lReplaceIndex(pstSavm, pstRun->m_pvAddr, pstSavm->tblName, pvReplace); + if(RC_CONTU != lRet) + { + vTblDisconnect(pstSavm, pstSavm->tblName); + pstSavm->pstVoid = pvData; + return lRet; + } + } + + if(HAVE_NORL_IDX(pstSavm->tblName)) + { + lRet = _lReplaceGroup(pstSavm, pstRun->m_pvAddr, pstSavm->tblName, pvReplace); + if(RC_CONTU != lRet) + { + vTblDisconnect(pstSavm, pstSavm->tblName); + pstSavm->pstVoid = pvData; + return lRet; + } + } + else if(HAVE_HASH_IDX(pstSavm->tblName)) + { + lRet = _lReplaceHash(pstSavm, pstRun->m_pvAddr, pstSavm->tblName, pvReplace); + if(RC_CONTU != lRet) + { + vTblDisconnect(pstSavm, pstSavm->tblName); + pstSavm->pstVoid = pvData; + return lRet; + } + } + + lRet = _lTruckReplace(pstSavm, pstRun->m_pvAddr, pstSavm->tblName, pvReplace); + vTblDisconnect(pstSavm, pstSavm->tblName); + pstSavm->pstVoid = pvData; + return lRet; +} + /************************************************************************************************* description:dump the table data parameters: @@ -10031,7 +10653,7 @@ long lDumpTable(SATvm *pstSavm, TABLE t) char szFile[512]; RunTime *pstRun = NULL; SHTruck *pstTruck = NULL; - long lRow = 0, lOffset; + size_t lRow = 0, lOffset; if(!pstSavm) {