From dc5840df35705e8b38058de862b6409135293c53 Mon Sep 17 00:00:00 2001 From: wyaadarsh Date: Wed, 25 Jan 2017 00:08:46 +0530 Subject: [PATCH] SQLyog 12.4.0 --- include/ConnectionBase.h | 8 +- include/FrameWindowHelper.h | 6 +- include/Global.h | 2 +- include/QueryThread.h | 1 + include/SQLyog.rc | 4 +- include/resource.h | 1 + lib/win32/release/auth_gssapi_client.dll | Bin 0 -> 127488 bytes lib/x64/release/auth_gssapi_client.dll | Bin 0 -> 140288 bytes src/CommonHelper.cpp | 3 +- src/ConnectionBase.cpp | 173 +++++++++++++++++++++-- src/ConnectionCommunity.cpp | 21 ++- src/DataView.cpp | 54 +++++-- src/ExportAsSQL.cpp | 3 +- src/FrameWindow.cpp | 151 +++++++++++++++----- src/FrameWindowHelper.cpp | 130 ++++++++++++++++- src/GUIHelper.cpp | 120 +++++++++++++--- src/MDIWindow.cpp | 14 +- src/ObjectBrowser.cpp | 86 ++++++++++- src/OtherDialogs.cpp | 38 ++++- src/QueryThread.cpp | 32 ++++- src/ResultView.cpp | 13 +- src/TabEditor.cpp | 7 + src/TabModule.cpp | 8 +- src/UserManager.cpp | 45 ++++-- 24 files changed, 805 insertions(+), 115 deletions(-) create mode 100644 lib/win32/release/auth_gssapi_client.dll create mode 100644 lib/x64/release/auth_gssapi_client.dll diff --git a/include/ConnectionBase.h b/include/ConnectionBase.h index 3ee1a69..cb35a67 100644 --- a/include/ConnectionBase.h +++ b/include/ConnectionBase.h @@ -124,7 +124,11 @@ class ConnectionBase @returns wyTrue if ent else wyFalse */ wyBool IsEnt(); - + + static LRESULT CALLBACK StaticDlgProcLinkCursor (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); + + WNDPROC m_wpstaticorigproc; + void OnInitConnDialog(HWND hwnd); /// Helps to show the user name (Registered) in the about window @@ -287,6 +291,8 @@ class ConnectionBase */ wyInt32 OnWmCtlColorStatic(HWND hwnd, WPARAM wparam, LPARAM lparam); + + /// Handles the color static for status bar /** @param hwnd : IN Window HANDLE diff --git a/include/FrameWindowHelper.h b/include/FrameWindowHelper.h index 02c49d1..24e9490 100644 --- a/include/FrameWindowHelper.h +++ b/include/FrameWindowHelper.h @@ -768,8 +768,10 @@ const wyChar *LeftPadText(const wyChar *text); */ wyBool ChangeContextDB(Tunnel * tunnel, PMYSQL mysql, const wyChar *query, wyBool changeincombo = wyTrue); #ifndef COMMUNITY -wyBool ChangeTransactionState(MDIWindow *wnd, const wyChar *query); -wyBool CheckTransactionStart(MDIWindow *wnd, const wyChar *query); +wyBool ChangeTransactionState(MDIWindow *wnd, const wyChar *query); +wyBool CheckTransactionStart(MDIWindow *wnd, const wyChar *query); +wyBool ReadOnlyQueryAllow(wyString *str); +wyString RemoveExtraSpaces(wyString query); #endif /// Gets the database name from the query. /** diff --git a/include/Global.h b/include/Global.h index 84352a9..0ba96c6 100644 --- a/include/Global.h +++ b/include/Global.h @@ -392,7 +392,7 @@ struct ConnectionInfo //wyBool m_ispwdcleartext; wyBool m_isdeftimeout; wyString m_strwaittimeout; - + wyBool m_isreadonly; wyString m_title; MYSQL *m_mysql; Tunnel *m_tunnel; diff --git a/include/QueryThread.h b/include/QueryThread.h index 4df97ca..fd487b7 100644 --- a/include/QueryThread.h +++ b/include/QueryThread.h @@ -37,6 +37,7 @@ #define ERROR_ERROR 1 #define ERROR_RESULT 2 #define ERROR_NONRESULT 3 +#define ERROR_READONLY 4 class QueryResultList : public List diff --git a/include/SQLyog.rc b/include/SQLyog.rc index 3634c97..9dfa208 100644 --- a/include/SQLyog.rc +++ b/include/SQLyog.rc @@ -894,13 +894,15 @@ BEGIN LTEXT "Pr&ivate Key",IDC_SSHPRIVATEKEYTITLE,125,173,52,8,NOT WS_VISIBLE | WS_DISABLED LTEXT "(Use ';' to separate multiple databases. Leave blank to display all)",IDC_COLONST,119,160,242,18,WS_DISABLED CONTROL "Use Co&mpressed Protocol",IDC_COMPRESS,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,119,175,95,10 - PUSHBUTTON "?",IDC_COMPRESSHELP,340,159,16,11 + PUSHBUTTON "?",IDC_COMPRESSHELP,340,175,16,11 + CONTROL "Read-Only Connection",IDC_READONLY,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,228,175,86,10 GROUPBOX "Session Idle Timeout",IDC_TIMEOUT,119,188,139,28 CONTROL "De&fault",IDC_TIMEOUTDEF,"Button",BS_AUTORADIOBUTTON | WS_DISABLED | WS_GROUP,124,200,38,10 CONTROL "",IDC_TIMEOUTOPT,"Button",BS_AUTORADIOBUTTON | WS_DISABLED,164,200,12,10 EDITTEXT IDC_TIMEOUTEDIT,176,198,40,12,ES_AUTOHSCROLL | ES_NUMBER | WS_DISABLED LTEXT "(seconds)",IDC_TIMESEC,221,200,33,12 GROUPBOX "&Keep-Alive Interval",IDC_KEEPALIVE,264,188,92,28,WS_DISABLED + LTEXT "Need Help?", IDC_LINK,310,218,44,8, NOT WS_VISIBLE | SS_NOTIFY | SS_CENTERIMAGE EDITTEXT IDC_PINGINTERVAL,270,198,45,12,ES_AUTOHSCROLL | ES_NUMBER | WS_DISABLED LTEXT "(seconds)",IDC_KEEPALIVESEC,320,200,32,8,WS_DISABLED GROUPBOX "",IDC_TUNNELGRP,117,72,242,154,NOT WS_VISIBLE diff --git a/include/resource.h b/include/resource.h index c10daa3..6f2d3ec 100644 --- a/include/resource.h +++ b/include/resource.h @@ -772,6 +772,7 @@ #define IDC_TIMEOUTOPT 1526 #define IDC_TIMEOUTEDIT 1527 #define IDC_COMPRESSHELP 1533 +#define IDC_READONLY 10289 #define IDC_TIMEOUTHELP 1534 #define IDC_TIMESEC 1535 #define IDC_SHOWWARNING 1536 diff --git a/lib/win32/release/auth_gssapi_client.dll b/lib/win32/release/auth_gssapi_client.dll new file mode 100644 index 0000000000000000000000000000000000000000..00b5d83e63d3aaaa3d496587453db64f3d121a59 GIT binary patch literal 127488 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 Lz<>rWt_J=S>6rrh literal 0 HcmV?d00001 diff --git a/lib/x64/release/auth_gssapi_client.dll b/lib/x64/release/auth_gssapi_client.dll new file mode 100644 index 0000000000000000000000000000000000000000..fca1b089d1a24836cb120feedc111a32ab43839b GIT binary patch literal 140288 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
  • {|i{6I@SB@{{!qD{|T1cjulwu%5i7W3)`{c zzK*u!`IyXj!0Fc!2pkt1|6fVolsW`&{+Lb#6_!sn<#2f+SKZmqvGA>9BYB!q$Zki= z_=Sp8#Bsr$9Qz_yhQQP;mrzRmFD+s6Wt!q{i5+~EvpWwCt zMC48@eulFihey)G5xCNg?NBD{giC8RQmBv4gUbb62jHCZ1)T7CfFcGf33knjjuVa} z(0*Y##KW*~eApix0ka>uH{q8!&c#cAQF?%iVm2+^@Yi7#HrC$lVik|}n*@Du{l?0> z7{9)XK`HBIV_`WB=nJq-ymurHYo139(#FzaetB$(r{(Th_?0Ah6u_z7$<452v%D9T zuoTqVX1NgX?D!*wQF~w9qVs2X%6gJUz2s5I!dq|*LNyhlrr-r^J4%Fa84v&S7j_ti zxA?xeRDT=LRrF-(=sd)+OAy9o5-ZdM?(1-{(jN0*FKS0zyDcB8?`$mhrTMgd#PK6- zH3Q+&;=~4%-vWRw8p`K`Z*!$_gmzy(dR#>Hp^@Lg_WOk4y67MTc>ErzVJuJoR^QhG zUp55jb6Y7o@a1;Vd8z)7+;q~9nRqk#2uH?kVUsCa!|hPcKlEEwRs07QVfXBlHolE1 z(xvTz`(`KJy<+t*3X@o2S*4bV&XbN^NLu?!ya@pFlKH9tU6O|O>BA3NU&NBE7cFo<7B-cd(m6Uck6DfKM5(dIW=k>2k) z2M@iDpiOQRj&rNPBHVEe3jV~S*%?}Z|3O6w-3L~&|9vS`lcMbkUb@9YO{F^X z;e8-|A%2(=*W4oTE0*;)WPK0V+GXnkXk`znnh*}JgWzj!Pn-?mam9E_HEbt=%d@aa zwO~zNaj_DXB{)&7$WWSl&^P=+$Lj83XXS%2V4K5rcQ4JAf3(?l?VVA--Nz~iz3>m{8+1@^n~(k(a&_R@3%~Eoxk9V} zUTI_Xbj-_J@uCVpP2=~n#^X^bMY}ByK_NTjO<07X;os4zgy!`?%=chxhB4rlHTDL* zsDa0QOT%RsE3~-u17P9aC~|Xi!ZY0iYra?HUYg9!ADFv9 z-j57*+>JITiku60d)|ThP=;BW$c2-#S*tRz)+n@U;9HQ)EgzV> z3%R`33cySnT=U;V*~uJY;o#g~h}qPF1WG-Bs`g1Q6 zxiF`hJz6<1ceKbYP2@gMi=iF}& zcnAPQl?T=%18w;Uav%=XqJ~+?8a527VU7TpodkGp5I~^-fFaw&fm{p*HX#XsvLrxc z5Wv5ov;wzlk^t?40A3RSc=y_DqH_?yUj;yM5`YYZ198v=KuHpydl0~n1;CX_05%AK z-r3-k>_G;w^$_I1Ch|oMQp9Clz1mG3``ALA{K>#p@ z3rc#C!37;K!cXIr_25(hvX8w703?k|)}R1T3IHe*r;b?`3-4(8AdttBAn6GZ zdbbU=&{9U?Xr*Wcsu~&&-?5KZQw10?B)-to6^IDffCC)(rw^7XV3-{lFuG0G!~>NeA+ilQ?t^ z0*DBJq&R@{ekX501E)Xkz>f<;|Gkmlo#Y=Q$-E^qP=HO z4PymBzi5vS0yqIh7nSylb_+}}0|)D%0O%L(xQu%SK(heg5}hN9w=m8C_^klw7wtKN z0PYq5{i5AH2wD?lnPvHY1Tu9+|5iX|i%OdQh@N*)pQ237`Tu$LfM7WB=4~pR#UW z^%U+A;Vue)EW+Is?h;`};oTzKL*a-B$0__z5w?K!*#;4IQ222X&Z6)-5ze7-y$HK0 zyi$boDZE^S3n{!%go`OWSA@M3Rzz5#@Kg~lr*NSNS5P=lgcnjcM}(JBI8%hHC~Oho zl@$K!9!`f^3NsOIr0_c;ypF=1BK!!2w~6q23O9@J1`7XGgrB4EdJ%4>@WT}5R`}%p z8uxj)AE&m;4QmQK(k6d?Gki*CZ;qgVut(qYFk!_XwlaS$GQfWqqn%a2Mgof$u3Nzm z=p;eyVuffU*43sh#DL%*{WgmJuA)Csfe0QTP}6!0ai=Zx6eW>)oV#|?4IiM!eZgSE zfpx-HoUV>)N|{=?did0mwZkSAHsadJR$p;O@bIzLsh%LNGH;ceyjHo9o_@yNn=fM@ zqF=BrE$NqG>59ks6EG`|<9-8c6=WG+Xm?hMlzNeZUvqHYC{n6LN(EAWAyO8Kl!ZuX z5Gnr;d+!1sRdw}^pWI*wi4!!@0A2OsLL^{*;%AWqcu4=0R^pCpY5Q{S9*Nb(u<{w zW-U#Zpk@}d;Pzkt)RU`Vfd(2%!rlh~CDlOCUr4+B;~!8x725SQKtCZs!yo$SliBMa zWYEeKz<4k1Az=@C4q`jFLNK(7k1E@n0sn)(^jWuFY-~+oX^truu}GAqv2`cX`O=L$ zH(}Le$C}Th^5s9%PCGNmvEwZHsL$sTF(FB zd@#1sObpKndpZVlgNsdymbFyBMJD*HXEJ=2ai8Vf2ZyJU3%SoC?vo848~2&T zeRAM)1NXU-`#||9`C9Ii#(k>cGmrbkai0eGWOJX-C03ti_)OzIZ!;gZ_``Do_k59i z5)}Z?RPOmK_uRrgM{>`t_tS(;rKxMgl*OrrNmZD# zA&^KSo3ji%invaB)_pVuduhTZ?gFHRz*U%>+5~<0-tYt^D<4KwD0q@4Xu7d=E^;Gn z)U_-UoAb#O>0>t=<-wQPOvN4!whjb4wm{MundiUh6MdqL+=Zx^J|=NDsa3F9i<$H( zMMNab*AI5`7*HpstqCngP>lfzV>e=myDy?Z#%WVYG#x+IOZgd#k&YNnY=JVi0pS6J zYmQlSFm0iHc02|ru zD=AX9+eG8K?ktV#BT8Z;8{bMSdmjya_%*qQ!RA=;88*M_+pxJm?Ou=?$kU01@q#A8 z9(VDj5;v_SW#}#&oX{>0yHm&wOs~eam699iUUQd|yIkxUK{J~0zCrB4<%|Rn`7RUQ z{|fgrd_M^n_iF3FSbPKbQ#uv*JAA($g8S*p@jD`MKlW{~U#5IhZ2$q8uy3{U?DmYyX9x}1t^!uQimr}PG;fu%nP zy8=1XHp=3Nybn8z=YW(iQC;{M(;4LDd=xAWRM zH{A+!g5zQKJ{$_g7GVA&zhkPt1qdM=-vWekSSQ>2yA+4K*xug;+WQN+pXeE>?*09_ zo?yY8)sAVtpn_!SY%;H2TF-M_U($hUS!79=;6@N0ChS>S<)fhQ zu%?949z-;@b;%XEaiAM(inXoZeZA~#AYPp|#m%1^?~AAIlC9Mkt&{ci$cy0%*b_rO zfnLB14Ig&z(+({!$TWxF_hh?j;eAhI>yMF>zW4d(I%+>NX>*>|e(ZgcT`O#T)ge`(NP-$PsjnQA2#+ z@&@@Onjz!aX0r(sh2}^Opy;UVRky}pL=`u!(l@;~JIuZ7N--~hAphOgc*vkm4`Sm6 zY>hu#s}GN1x5k}p*8meGu2Z?{mk`u3BS&0Y>?L-qp*mvj2UUgflID<|HQEYx1wCA<_HaSOUU>uUl{W*smQ(*y^9)05R=xq{+g0Y|kD!6sRED!pU=~-C za;V&ggFCjabGYv}gmudDPhjaeBSVteJ9i#%c#Jd&+{cADwmuqqsbhD42?i;cwELg* zO4xlGuTa`8I0D2|`Ywh>1Qe9#g3weCE*0X_3k79@0*iv zq4abElWXJ|`-W)n2L%K@PCC9LX{d8*a zg{TKkE=FA0MJ+})DKKw0=|SY9_P53_am5_8C&vc0DT@qc>QDW*CPC=)3#tc{Y~%w> zqyeAxzd$Q+IM|=?lm~|eH)Oy%aE{TBbK$@`eGBD_PXSkOyV6uj77pi}((YG2Y4jcf zOit&*xYU@V*-`{4LBV*B!dc!w)m@K*kT)u3+1Xndg*6CEwG(i zMe##v#}JjW2GzmbPr)4oa9(1OZajb>n{Osg*q`1UBP_~9MR)x|p0-E%xjfC*7sPQy zbYr|78jxMejgGipxu>f)!4lU?_{tQdyIV^sFEo4y(g!ZXw6mB$G`9T*S`_LDkkv(g zZ~DT6iqL|=!xjx-wVmKgsj4rGL28*drJ093KE;a6r%Vo^=K`8C=tLMISk`@HC1?@@+KY*l{O4lK z2|_AK%3p~nl#};ypAe2R&~2Z=NnCqSJ)H%;U+v&rfPujMx^X9Q#-s#^dB}C4q1w!K z0j=nVEl_S`wknM~PjX-5V^BidsT*$!_l0ivqJ-;36`(tC9ivVDiYv#uxpJ%p7f4Sc zsc1YjX(w=bYdKfhqAego4YVK?fYpFHtX+Ot8RaL5#qwV3tjbhrBCY8oj5|iI^u<}S zUH$B$K~49RNjrj18h03BU#M4c;9LTU7#{#!L3{ODWFJwfqW4V9rYzC?`G!oo))gZS zQ~yVuSTXm|`5U&70tbLJ{4ItDCB$Gk-&Wbe^ghj}8n3WquZnS-WadGYFt%QYd4-so zrfuK~xRnObd0ZoRNKLV-1!5704tz1e4X*>ZSp(|9*K%twp(2xPiw~tuKuypTW{5iY zYxEUlZ~+e{FFw^@guOiPCr~6$#np{i&z&>hgiV)>bVufKr*YmZE{A;aq!cvMX?~^Y z!j)pnyTU1_|6$nF2#E*c$XCMQUZe%a#yEQ+B}^Bn^k~-1kUu|0x$;qr4u4r3RndIO z?%QL8jV@ay3}hv^AWFvCdWxBXNIG>|O!vA|l#4L8aX{5QBGkjs@7dH1*B~+=2@ofp zqT?E&wA2MKfVxfuJt|!E~WjE0h5GQ6KKBbG=W-IlPspw zS+>_R;^xFkH};9_Mp*ZC@~q7DxNc|DR7H4+I<6>%2;zgvLMSnrdn6<7pKa}2Z}j$l zgWG3=BiUuPK%&@rq|-`V**4qe8_m}>EM!!4#910RTu+nlA%{Zv6fMHv*eH%8$Hr!fAR8E#f4&Z(j+y@e){1PzOGV@KkR+IO_ z%=J)c_j^#Jqml&6Z$jp{&^xDBa91ysQ+sjqs@HuhN?i>dy)6iTj>2)Kly%Wek*vF) zuh3AYdo(A84uDI_2#%-4>Ow?;6)t5g4-}0SGJy|*Gi@EqBlTTmdq1+p9qmA-A>K*v zJ%p@~tI=|fBQ)SLGAV(HUQQhbb_#dFL?J_LPMVBi3o5e!E%`7*gebw-z!bJc?h2*-;R%&BOkl@>jXPm)^YBDi{$)qijs$*)mZIMSGJmUm zwjm>hElDOcMA=F;J*Z5AR+xs0lx8@{Fcn=~Otrc|S;>8{t8-FX$FNu^;ct~7uyWH0 z=}46j_kIXBY<=6kbG{a&On%tzCG4(Xb^e-Uy%5Fbn%JQ_UmR_(3BKG6+}s-+i#7Xe zoVlYzcs;oWdf9x70PoQ)i_&Aq;8samci70|R2s=s(L!2njvN7^p20xbH!qzfmEWLE zkQbF7VwGyCOb>mArL!^v6P~WpsZ7Cx0Y@LdSfa7A>$IB5DZk^yZW3Ak{amSo7Mac8 z3^tNZYIfp4f_B>F+G@g`BsNqg{FtrI!C54kb^uZs49ArFXfT{~lAsNidtQT=7?$Ru;4D{zcnx;COdD8xOUR1URwY(;D+W2G4HV&QoabMf@WOW?>HvD2O|VxGPou z0)N09Zd?kX9Ex!DE6-6HOrsVubq}L7zlEDwFGoTQQ)6ozvV#25*t&szyl-r6Vjr+w za2xx8C4~xn_|hRomAl(x;tts2UYbi2cf&tOw;a>6A(Xav8(R@uuR~NE{clJx-kph0 zB526YVS)L;rs*)@wbl(iH%G?0?6Gc>amP)eU?OhXjeBk0fp`<#FkrUn?{q>udud2| zOSY2P!fdx67k=xVu1eH*h!Qp;WPNj3Xc5dN+C5{cThvTsh2jH`)T%Q>+Bv z-IS}{e;4<>oARVn?Y_GSrv@R5hk#u%B2#MCNcKLagqD)~C8ZB<`ERs2@F{(D2a6$# zrZROoyFZ~R04r(mLXkgVK|U_6#(C9GnJ2GD3u~P}q4@6@6i+iM($_+@A?o)Ywv9oj z$z3SN;eUila3Fch#@=fVq;IwXd#@k?CM!)?Vr{DB5_9sWH$=+M|Gt39&$Aw z3Y<*mSJ4SlLSPRN8HwUNR1q$ZpEw}DpAN|HF`i%VfAai9+*w4Kv3dlVz*&>yy9T6N z#nWxm(h)JKrTfExbW;bUo6gfU@N^IaC$WSm4>VpC4w2!3!)3dG(|`(+1;7-v@E*7z z2gB?NrKSA}2-26Z0~sNyO+DiyC;y6h;0j6Pc;*}k(X_)qXHghzFoQYy0cuL6KvI?8 zRp_hG!}np^s3$m|(Mq$G`yt2zC4!SGZ(NRwV9nXljbQ>_5>8x6oPcbC7l2}9r;8Gm zZA%c}TRB;5H8b$tPgZZUA-lMQoYyih~!k(zN(zjO$Je zr7go3%n?8?4_+=!sX^g5w>M9(1Gh==ArfNRU7%d02PhZb%SZugRROh1Tt;?`INu8D z7SrV<_3rH{ba{9P{BLNXp&3R)W7~1=KGwLSD`+6II#)u`jf_RbkBSS%;%*D%grluT z+D>e8sC3H!yTW!Xu<|MSjhv1Em@}+vIUPqshm|(K+IwTj9pCom=8rfh@ULW);ftgQ z^tiA-9V7|VACbF7o@kd9b{T>@$?k1t)sGnyya7ZNDs`>c;e-GmCBGVaNjVS2+C%$M zvUI-Je6=)&hdh0w@+C-!w$qzm_L>DL&f=R$*`thFvd=+s1Ogc7ZN{rmJ2ktj;$m+5 zDGTZ8q8^}o&>62?qtY2|2US${I*ri=cK6|aY@r{K_@EfPwSk4+eFO=+>^ci=iC!geb?K+z}QOWJH7oyZnw9; z)Y$qObKMMkul*Iq)@0_Y#Le+Y7RUs-X_rUZy*&n6UZ>k+9LEK6xWc#>1@HM_bkq4i zfrJdwEkVfK_i}&WG|)f4ZTJ%+Zski-XtZKj^gaX{{#E#iefzV}Jm3Lbf-%}IUj}nC za?fr+W3$l$qtQJE#7IF5W9ukni_)|LV1)CMLs-s{UEp05I4GxZO81qxCnmoivZhWV ztZYuXTX_Vl0A1|e=^l&x=rD>9G>RPy`r#rnKxnrj^776=HtGn!X7Up~n3>+AITRqu zU(hAdmjb>BwgB=%U>O6p%Xm*55_$VqZ93uYuQ9fMj4*G1ow0R0`>5xVE^mK>yVBd= zWNaNt2&x|!VDD$)&BnHFWVGu_xPk?tgY0?@EX!T7;2uxeG7sBcJ`*$n5CnkE=?nnD z#Lz)Y_843{&$rt%4+90*0(T&vyQDek zWI}gLEC(Z7Ep3W4lEz0;(y@AU4>T)^Bdu;#CN<^ zUeM3n$vC9E-eB)LNzE}(u8Azy#yG3o*%n$ql5L9Mc6#pzeWLlSXv{wggjz*A^8TMv z7+qX+XyS{24Qwogj@Y-}mOV4sjS$RzP1sG~z;O#WOMq-y-?h6_yDaFIogYdWnW1a!e z`25$l%F~FvE0k9H5XJ$JJ=t1B^RhrQH{)`8d``wEj=a8tPZMJ73c(QlH!UA|ke?fe z!Dk_FSTmQCFGRMu7l-9j;=!asM5_2W7#^VT&oI)kPxKQiM-BIwr$X11`hv{QVOA$T z09pXR!ayPTSZ2X=pRw&`G>!G&HPl;%rjaz{rlOlp?~ie(kRy|I901}7j)8Bin?*4N z6-b~QWb+NOC|u%a$*e-AnI9oal5{>30-=r2E`8dheAGwui*>6i8lq$P@&WC*|E2wG z#KK}UlEx2Anx#B}q$mi24FIFqy$S-yN*h>nlRkjbu+OM z(s4O0YHi;;gV-2niCBV00_y-umh2L?z&p37+s`DG@e^f1tj}%8o(yT3Fwg1kJfIit zs5lv_z<9B{=i*uIo`z?wI~mV)(iR#bqk}%r>{?ic5A7poQeYjh9&kkpGf;~UQ@{nE zj#vsc&bdxX_1qqFEiV6o5jEx&pcQh?Oy)mB_y4CcFpd1Hu%6Ky==M^21Ib=UZ(vm- z#O5>`TSw3v3*0%7PqZeL(>TTs6x3{rK>{7v3F}j*0gX(88oCiXE@H zYwJEE325REj5;1s)!`p#K`Chc)sji%7?h?vtr%pWR+P`tAg}});qWKzrA6Dn!FHVD z1a4&!zM@)L0yk;dj2AiL#E2>djo{0s0PoTGzLP;CI=B>Sp! z_ceHCx-Z9bs`~;wvy5%0v8#t141rJiM||LY{t**+lRnT7BLgpUuh_srd{C8|>9LF+ zrSx!E<&U-2kh?hW7$Pc{6ze2d;+?`@jaZbs{Ff()Jg;pRPgFD)&mu z?AP69eAc_aho|J8j%Ty`Dm+Ww6Op*eeTiju7jS~7zutX5o{~EW&t~@sJWHk3h*;$| zQ7+^0S?^B6Q*s;eY^DmK{IjK0K4Pg{G5$j+eIX&(F{FnKw9`N`7+xaUmUDJe(;GBMDH)t@gwFUYx;I$gqzHP#7 z8Cd;DrrTDHZ89=q4qnTNEy;Je!3gMOF>dQ~-^T4QR*&giKvUYcaf?DS7}^06!Jzv# zZd1+{uyy`8aax(mr*Ns9)*G8>zHG>728WELyFtanqTCa>4P+ZJS;n@XW0=!|8~8nP z@u#hrMBG)+0PgDEssEO{T8$_=ch&P9xvP2Ms!rFciuTW%Vx_v_n5w13R z-+c^R(izq9m?Y3pgrGO>u*2tU$JB3MOP(qtHXb4;{}ccKh&6&8 z!`umuz$46*L9_~{3~Co;hz-^(hFCLjW*pvFhm6<$*EX}w|TNNqzuQbk_U0W3Z&Cm9#Ph=atLgc%^O3Z=c&eMM{t}& zwmt~8w06dCmTcv15zSvn-^cEBJLN9!!d@fJ>zz*>?c7EQVEB_qbolKt*37eL2(_Jn zL)Lq)vtoH^{}M(-J+m^5Z9#m9-cXg%{|?y|#cF0TgAvT9UF)3SD8_X5P>Ayx(hL0! zMmX`B8`bv&^*tQ}o&3kC?>bbA+}qJ8;yK?&Je}t}f)*QFSAt7qJm(5H8PB-^4QD)O z0rLURxqy8X!H_2l!m=!brttRPjO)0G@0`xU!FOWs4@<%OsK3R#achhOYg*O^(Oe8U zluRgpG-?7WDF=)e7#u8H9~g{YvM&wFvUF;=gk{kzZ9A%>gUwX7QD5 zVflx!kb`ml%LK;gDZhb4BlzJ!UKiRf@?Ul#JFv{hF|*np2GH#CrPSWQ0elaPt}@i_ zbpT5u_^tC8Tr3Mte8(SYofqIbQ3xEUXzc1d0DYh-$!SelS_gd=gG%dt5hSexBJK_yJ;t1qFn1xv;>xU6&OYeWb`rf&wNp zD9r-3R{)v8(m*Tu>tX|mS!cD3R)VYfw7Vg4+Ld6khKCoIeQ5n`le3k{+qL=8+6yrQ zro97mn~54mLe#)dl44$10-xbb2*}s4tf7FWzOf0L(^8U?PxgQx9l)Xe7CJdxu;hw> zHjQhH10i5WiR>2jz#8NLl17|ziBl$H)t7MGr}x?D@0<*ekBaw)IJwgJhEts1e|(q+CGJb`Sm-nUU6G|tIf|C@wpEp49}TYmtKSQqBB!GR=}7$6>! z=19aYGfd7b4ih?``h`ARulb5L(5(*!4x#(m93V_3pF%?tf%|MEAq?6jVu@EtB4IOI zaJISMn9mdzRYA~IVL{MCiz#c8#`g}A1=)UqtSqxiwn{kk$2ts=l%R=s+7~EZ?Q5-@ zZ8FrwoeG3FV=o1v$mK?%w2XF=<$z|@g+@*&3TQGTTUchK43HUN7vCmG7a_OzAUO`D z{q=6jhWKe+W@Mrz4p;3W&Q2C*_kcJ-GVwn|cyzQC`%AQ#2Pe}L zTPX-}1TWJoJ5VsRn<|3{ZJo_bjOAt$Fs-sC#forRAE5|I+xVlDx3GEQ@VRJiiJ;LKVm>$18#VI33S`eS0V4jW+>}5IeL;$1Y`Y6%p3sdb^YsJYTzBtgz2)e6v zijEG24V2f|0)K^{C^LDDEpVJ1timty3MYv&qpt#wz&)_ep8zHNt2#@|Q1AAMs0t(K zseYK^Am|y9NmUok`z*%%gmXn2_mV9u&*2wO13Cp{eq!!Osf)1J)$8X$onf=j;Ymd=`i8o zAW&vI<0ZRM_<(rN5`<;|o721@CXKbm+A%?vw$l8QOP*oU(>p%LjABga%n;`KDDPL0 zq0+WIs%F7fp_FF@Z*Rx8ue0(+oKtLu<%Ay*dm%6E$8npn_)Ejz82r&ix})%yfUCKs zQEb9XeeW6#! z_T#x)XyqBG6FhSSDM*iasZCCJFE2)5MmoJA+zph|x{Hp)Nr~n&(j}*J%46IYDQ$?( zG&`~5p)^xkbGQ3aSD@-#d<8E$ZH1Fos?J3=yE*E5lzkyuqUu~^;~2?kc=do! zko$w@DWBb-<&W+}zz+}?$|K{Ie<*){ZD&} z^4hgb0kjWO9XJ@KWax;XlChk`I;Y)n zPTvhqtY2f58LVnd1N1Ufjf_nP-Ur5jIx@tm-fvzFd5fj`UQ1nKbCS@2)SwcVM0CeGmkgr$OylKJ zy!pko7kgid2aKh0*h$PeeZU}%h0AWVzC9C{J&MMszKJ`dg26BT5%_&GBE?IW;u#~& zkq>x#W8DT^(1~SZ-6)_+Xij{+Hbd!{Lu2f6cvD268Yn)Um(y_|Blh&k@u9xA#kj9o z$J%|AQ>;6-?``T!I=G>qm!L7J^*$LNA8@K;fH@K}MRG@^N*vh=!*Li`T4tKOvl3pq zj@<@l!uXO#L0tD5_ERu14=FXER4_VW?;G*i%{F$qi>IQoh&61176W*P;>>M9UJ$aV zD#D<)O>he=+s#_G=j(|m&7dr`B+4hmwW;T9nAzhJ(!t^;Q(nk|c|pbN8PsPv&|d`^aO9205ynw0PF zXXIvTwsmk{1YxVkY7!^DFr*W0@-tkQ5ywfPWwgB8J6HT3YDIUoCQQB%sI!vk+E3iq zO$yJa&yn)HoNzhfpbz~CSJ4M4%uLm7!+_izZ!^E>z7WDr|e=0IhOHZg#P z@2!Wj{VfXsI&O$Sl#hGfjXnLw_(R^aA@_B_)3dy1acBn%98}I;o29R5-8h^qKg#03|T;eKXbT`1pG+G5(CZj?&U%~^30T)eKxUPaI zgzH@T60G<}dmz&!5>0Cpzo$EJ8&lYW^(Sf~DaK+e94>#tjg&jKWkx8{bj0D&AF83o zng#cq-B=<8<#C>TwDR&s1jwT)my5i!1RPWHCv3bx%V7y%w1uZAMGm`?Pd&MZV`>9| zFck%84GR=u!Vg$)m1Jy;!khpbSpJ2$Kh;KVW_Zh}+@DPlq{?9L=@zAHGbn}ku_Nb@ zAM1pt!#5sAwrDxVvS8p<_$R6WrTo##mJNEfx}cS?7s6sX_x36e&o$smb2xuZ3JW-d zkM$^vYFXADDC2dUiAz4Py}Ze8!C1w08Bjndq6--?{pdoBW>Sg&ht1oAqap#k&{pU{ z!ji#AWgkTOz+7WO-R5N(4IAF28Ho*Mx-O?G!vuNoA&ktKCx9%ztYY9me`8mM?grpC zwQ#pH&N85+EL>+J?jlJDX?lIG^kb9R1HC&k>`p2d9`iIwbog^)L=WyyzkUy4ew+VZ z4_=s*A?2B^Y=Rlu@463O!9znT&_orO39~tApYBIebXN;1&&0=HA%(-AkuG-3$-ugk z3wkKW=zSl)IiAooW9u9E@|WZ|2yX#?FDVOHVO&5oq@YA9h>rf`@O)^nBA+q{E%0UY z=jHfIZsd6>=N@D9?}8zj?5|{*#7Y&&B&F$=oK~FlLM~IJ0=3mV2L=aaC(A~QZzi9gx)N4rWI#OTB~{9dt`O z19%xu$>dO%TmqeihrvW>S197ZCbvjJs^l(8!&t{W>We3d({ zCcrKzC;8L`@?nG-;tsR0a-|Gm4&UZ-{1w=I>q>3DdYet&A9xjmhsOGiEbX^uZQ{Ym zdT_DjN<0g@yB(dNm4J6C{%nD@$Ucl7xLvv9<*aM5KOT9BYRf16$N)>;k6@~YZR)mW z^fI4kGH4Nl5f2c&Hu+<8yYinoG}hW1;P3G7s>X{rZeTQU+wE@VyRDC2Afj>Tf$p`3 zNTGErylixa<^guix1C@xl$gTO_glu&=Gl_B3130LD@5wZ)&UtR|0qN2=%kgOYz4ud*jz7K(KHz+tmwSN1E6wA{P9cHG^!X( zkKL(y5>6wDSOGjSl$9OedTB%{EHaMQ5%UbpfEda{*y^N=j<7HgB(yu7!y*`W=EU!z zQhhO0qzS{wl6|B5JbTO6tS$*o`Rm|Fn}6~gwakoGp* zW4K7oPN%aEE7DbfJ%DflDcj_TyW&{|UQ(9BABW0R*iCF@nIzcd{lRHNX7|xs2}pzI z{7&*ER`4F)^D~bq?N_3(mKSJfL~yuRcp$GGdQL}El{1)|313+x+dM^PmGTW4&gONc-&=$0qZNcBO2+A60Akg^m+Y*$y7|%Ep zMici3ERxf|E{>vA6DBB~C&%yPeE?VSBEMxb2$uK-Hu*ROmn-iAO7enuJA^JVGy)pz zerG&F3Y14cThIvV#z>`}F1P!wpj)9$jg)2^9s9EJoag!CcPc+YMz|6YVlCVwN-PWQ z^Rl(ww;&!yupU8c<<{5e2->U#@$Lx_-7$yFcMpFgO`yy+cbuD6tkFif#$Uwhk(2L8{eXeme+%(u`(@z|bPh$6x=6xroTdZdY-}omTnC%tIVO z#_plkxnaE8D(t2mgq0J(NO#8CLr1XTCa3))6=T5f1eT{$SjsJ!GGwyIcz>7gUJt4P zQuWvLM(NOMJ?3L|lkXxg-`xh}M`zw)4+B8(Eif$d$8QE*@uNQyD366w_o3)3(OYzz zF|7~i=rb8aNn?Kkz6JAr7w-hv0)Ju)W3rR*+AN5>DN(T*R#y{gm2#L%m3>HN@A?pv zCFus`SvW8?%mspGsm$T4HJ1kVQZ|F9OzSN}a48){K$9>97C};|V$x3dutoh07zGne z>O^H1@IqiF4Gbt@4al z%EM5uz%)6Jyp%i$FC1nCXvUw=LGipVq>G^gFln^uh%K}qWu~(-k1AV%fm8xJ5x0?= zjcug%D|*i*Y{q>6P`+g})P9cKntsgiQUy(uERh|6ZMR&UrTmseu;|cO+~yniSCFJo z_X&05ZEU*)G!?BC&oHPSQ>yz21Kg8AFeQxe{^f8(`w~u-z8ID?etjvrN;eZmb1(~Q zhmLrZPqEEHHTWgyaDP2@5p-Be*m{tql%tIZ8_TLqWWq7!3>F7MPYGE1a2)3VRDQkt z!Kfu{dI5xjvF#>Qo2fj2w07eATWN9=$bLECJ(I95li0{BI6Vc$RyvPrR3^-!<}&_e zvhrt~=hgTZ&SHSV!W!l#Y7X*QkXdvB8h5boW}N5yW+aA?3-wH-#pC1zs7vgoU=t>p zvY!P*`o+UXE4wHhi?5l?uT4THf0TeRZ2k(TOn{a+H~S^v?Y$CReoWa2917NmHfCN` z`Z1mffRMAr!8U;b79f;AuVolw5^;&jEy$c0saJR^rM`jOhm~CT!vgJjHaQo|Jiwv8 zx&vbgZh>wrEE08J2`@HL9WJ*UvAYwJ|UfYExy zm;4NTAk$-1Hm}kOUZua-{4&)_`8fmRG39oYf7(mUij^Fe)=3Wmdw|bU>+Vm!9i6F2 zhz#Qtb@;Z+UR4~>j+k(%;(&43@DOEoVVp1FdvNe#4`T)eAr(2Mj6p&4ev%sO{RNc> ze9sQ7gLYDFB~&w-pWD76-k0lRl9rZyi0Ig48tn$!y|~!YK1Mk+IegRF2iWWd4~W5h zOE;b4fI>Yk`+iaS0!c98+Q$Ts+cOV}9m2f!_!wrk+MPh*pHjFH;mU6*x64tl;C68O z&oU-kPS|~xPzG3I^g~B1roTge!{JMUA|Axu^nd{p2Y7S&<>1A*AGH(zy}cvtT}oWX z!4vP!Go;4jCO5Gojtv^v%6`+3ngPZAP#5#S?Qd4&j#!90DTVi)k*~ZvuQfH^{k9z^ zp0N0v2wPouDL|)6)G(-zMA$#cd>O~_Pj`)UkMD??*O5AE_C9Gb8jhReme~5bu%jnP zA8xTfC&aK{%R+zZsFf}6hKws)zUnuw!)<;sFqZ*S-TS1y_C29Xta&*w0Td4y3s8wSFYUBdcu8W>uL8yTi3@a_#Th%i_~u;zDINK_}0^s zj1*epVPy7WzMHv&1#wS&F#$KQY(yNsn$r+@+lmU=yu*0Bn*)!Ymp3{9{h#rJ2p$#%`q&mnga8R*Qzg#2wM=2RV! z4(f|ds(0sq+ z(DBw260Y{cErLgm%skN%gCRCY+z>zK=1n7}R6r0PAKDiT$om+LpTduSf~MIn5D*g9 zffZ0`nyt*|b>)#6gbXnJ`W2wnkbK`Vz`gHvYPU(;-Hce{Psj)5Q!Vc%oWkDAzE}vA zLTR4?E8`?BUDWqj0TMvw6m;U0y^T5zi!gK?QLjS?)_|k?oB2o=t2# z<-L!R#rt+v;pN*&%bm;)%XcZUeaF4MP-4C(gVhnUu5%oap8pYMUlNDZ({VuEgahjQ zOevF^l31$T{}8DtF*jBW~y<%)t`gA@UUJA#yx>Vn(FAp&sM7SCoT5t&0y8s zQ^1vh&vXjI!L&OVpdjTm1S{r~?ibm#;Qft3okN3~t=!{(<~P$t%dg$py_*zIx27{ zayiXnS=R>9#s5@1~CdIV|CW;40OVcY3VvG3s>X@e06_rIBXyjDs`y7}ypg zO~yrq{^TAIsVmK6-Qz;IIk_v=`xT9xgE2l!Q(L}*XD{8XW?49(MpyD0%>{?8qAn93-fTG2xDKU_ z=Uq5fzMC@Eia`S{-9F|ubbhh1i1}515uab3=vO|!R)^;ojpvA=eC?M*hVs&B`cR$* zQc1p#0L4+rprIT&D z&Mhx=;zbCF(@AueLdM-e2W|xo3row%Ylz=~aX*}N@fBUn21O`sD|+g5Zc4lqA2wnX zk$#kNH1>d5J-E;N;4+y>@sOu+7=m@ox*(jwi zH$?z&+(!C9EcXbMJ2J9dko{OrK&o|m&WIZlJZEm+WbgzkJZHwPdlE~^2LtN$_vNfv zdYwQDUL8?59j{Ug|5Mq}CjN_}_EJ$y|AOOC)o4VP6QUjxUVg580v^ide=rBFVal;B zix{O4c#pclKR*X{D{Z6^fVnn~B!SCL6fm>*vqF-$|DJgB?manhDt|c5CU)b{9Il}pZl)ae(if;6 zzV&u3kt)-b$Cpt*GB~N7iB3dK=Yf?CrM2Fw0&Xl-GgU4zx!s-je@%b1jtX(Y@+p-<1`$cs$s=;={?{{UZzp53X&ow=r!J}c7XW~}sW zjK_B@4(1qJNeZ?r71(0sEUO?*gXrtGJJ8`d@FsIQC&22U`PU2)0kzn{ouWW-H$`>I zFYMt9VlwvAkYFxa>jWv3vxn#&9tr1$K_ej$iLgS#*w6hL9=vhUyFr1>&U3 zz;wBdJRD*c3YR{|dEf5wox~MvL8Mss^>hx*j2v#U$s(@%u_PKKAVv}Q{8$oGq`COS z4JekxbP4k1E|VSRl8@S9yFx9*{jipPJmWnO{278r2EF9e|Ky}GHse8?@euBd=A}nA z4&UMSQKcmtW0Jy55ViF(&Mu)L;Fy-6G44F@Oba!h>77B05_BeXMrl8*n^!S}8K$+k zQ~Oj1Y?I0^bp?|MG#c0Q-Fc;UN`@Awyyx6cF#;oa&o>=1&MRHa&0UhsOYojBZUW{w zI6>t-*%%(efa1EQSmHf{mqNpav}`(gymv;zm~PxF?}Fu&F0+TatQ|2{#CwCp=PL8L z+em8&bV;D^5e%SiC=DztSm-YB7<;|_p#DW~Crpeb;%u*9WIl1|U6LawSj=7Smo1rH zqRiWc>SBjkvumu{PtBnVo1iA8s)fX1!=13~WMwRbIjUS{!~(7uH9%ix7jV|*;A#>) zLB3|~^){yp(xupmq3y9^1TxKyMG@*Z!5eIuea0P0;L%_Cm7ek1eb5WNr1Iflg*G{177mP7qD**kYG)DZ-Uu7;P!Da+IKx-W!!0jnya<9-ON zTkp_UfM`JC*y#IRd=qbF@y|;Pq`d_P7<<)u9XYkIGj9$E8y6Xt3{(`6j_4Tbua{{W zn9*stO@5!Kb`d(QYiOs@Oh~js(t@5l(Tpl0`Mf$Z-5Opt!trI zq-$0M7uYh-p=)vVCc5@&kmkl6us%@Ii>|#GE?ejTHW}OowSQk7wtqGB8PUgNrp%Jw5Y~lU*#5EFOrR>h#Zx@h^J2?`+;Q3CP$9D7K#@Fd_9@66OLX;4I)(R}?VkrtitQI477;qn)*ggt~0X|Oi z!Nvfg5z=V^qpFK27;eKRO`>#O+aY$Y!vtsw!34HXqI?Xn06wtNOgM06CyQx7%y=}V zkA!ec=aWZaad#hw1M% zm=atxnA%jJ+F;14?=*xQ!^4#*KL*%W!+^aKr39+}TY!y#*C-6l2!IWQDTmi;E+R$Ul3wo~u5@}KDV?%K1TTrmjn+(9NvD}Bc706-&W|Xy z5~HLpu(Z2UpyM~@fc1QCs56+Ze0jb~_j3c(2u?X*9fSOwz1W(h+CbsJnF8fMoT!8g zV+hJqRuclVfEKvk2s8yv@=f4j(BxGQQ(?x|LUe<-KgPJjYI2VNSk+((13{ z9rgZ@JJOwUo%a0;-WOA@I!4!sVyR2kD z_LTBPmaZ^74I2Q`)k+MStm2%{ZUipfkOBT7iS{+K)WhT0!gw1Mz^)Q$5Pu!J;V_;V zoA-+y5|{|gBGMsV9@Zfq$3$;AP_g7n#JR7L#2@i=En*6b&?3(1m`Pg1&&y9RD~>sy zbEHXp6q>~NgeEZ$C-s*r;6cj5e%%i(i3@kVa^Z(nkpR`))#&h zj1t>UQuT#@9R&DEUw92zXNFM;hcNswNV!*8q{ZO0sdw&8#B>d>FPyJsd!e3)@*R|= zt}lEF3q42Yp-EF9UJOl|#-3U1IfFf~WzXx_Gn+kUv*#T4yn#J)*mE9xTG(?wd)nA@ zA$vO5GmkwB*t3v5i`jEAdzP~2&Fs01J#S^ta`s%oo>lC*l0B>0^EURZWzRbHY+%nu z_H?u7TJ~&a&)eB^1AA^_PY-+E$)2t3c^7-Ovu6i;-ou{vvga1|`~iF3&z?VK&j;D_ zA@+QPJs)Myt?c=8_WUJ#{+d0vvFGFL`2>6Zjy<=t=kM9`o;>Q8P3+mgo-5e1m_4an z47TVm3V|pDq7aBeAPRvf1fmd#LLdr(C5N=Bnl-nYLhD*9IB3w_3tIhAEcBM_hg_%QI1%sHW!=-}%*Pjg22Jgml!EHe3 z--ZiSo_KzkG_WT>^H57R?2pscmNNbghAnToJY1F>Xbs;UR5DzU>?}|=;NpQH?WKUq z;R2N1wsE=?JmZ1DPB3$ny??#g# zU1_TPyv#maaD?H;nJyiz7xnP_Ov&AnekJ^T-9ohI* za)&E|w`uZlLAFXKrU9;COKW+SY!j!xsBFDBoVzxe^xE>Q{t8RWL%<6|#97Kk5sCFg z2(c;O0LH_od2hH7*_os4fGzwXNhsi_!v*lsGB2WPgZcp1B?-#q5#f3T`4}7-5i}?% zn}Qz&hG{iVdL$xfP*PUv6W%3V|pDq7aBeAPRvf1fmd# zLLdr(CH1XzShg%QP@Nw5QV_M zhk&UoI$t88l-e4FM_53taV$t4xJ8mDO%nqn1nfO{J8rYHF%zs41(g ztwDi2%(gTuD~rmb3h@AwtFf`Z(KM+koO-zMtmaA0rm2X=9$H*`U5&e@qPFICSCOky zYOHau&#kX>yPDPFgpxW}bAzkWjfOY6ni}fsnp~!pjrD6x|1P0gz#7+@`o{I9irU(G z4lrI@t$0DK{JvDv=*n$$RS{4tYMX2obyc-4Ey5yK;|f<}z23Gw*Q$C%b88Wbthr^@ zvb_A_vZ9iLg8af_tA!=i{L6|8oaDjX&XVF1(NQLr6x+(?i*|<^Sr0E*R5GKaEZ16C z%z{e_tt>M=JTJd2H$Sh~T3S5NzaZaX&s|!U=O}iT<>xt;YN1-W7OTU$KrFWB=auoO zdIVlCd){KvVYieOh=rolT5K&G6u!uk%WG9=U7WutTx%_VJ=|JaU@sgRZZ9e-vF9x) z%N5H?@`?*fiU6iEB+`pf;X~Qy@_OdapYO2eSqH|_%F8XxFDfduiVkO4MAHbO5g=ok zhx_5$lCpxra6hR<^Y9|4SXi7Z7Fu{KhqOW~w_uSy&t6=X>#$q%hICOxdBe0rZL13J zVc@|lG;Do_KwYbkC4WiYf!t7 z@X&?~Pv73iB5fT8jqMKRgZ``3o>v1~o#5t2z$yFj>l+cBCrKRU5*~0bC2jG7By- z*8s=;i}Ul#oMPTm6mHMUwHJsE4YF$eidkRf7A`G7`-Wl_4gOBdpt5<9lY^&silrPX zg~++gTAFLMS|VqomR>EOXelP56To1zU#lv6^ZfYG$;FJuc((&{*~C1HBit)merT_~ zpiHz_2%uK2O_UMO2jRsFicz%!4L5QBlDzqtP(?Oi0~N2a`8;GCBX&uly?ANaP5DIw z5hu?_bS%h6xXn4JH?;CCR@UOdNL8<&HSb@Cvw1WCEAVoezdB$U*wpsg9fWTkWln%& zz_e4t!$`0&KVKW7ECZfzu^j`eXpwaZ&s47`?+<mQtCaCS^ix5WGAat*$C;U*bXn~!tg;Wck4^JPjs7 z^FT}Fq^=u?fAUL;%kt-!710#V%N;u2)Jm0!4y;uJ2Do0%zigj|V}?fJ>G|x(ptoz8 z>-pN91=hl%{5-Zw4TkSc`31wyTCM%LVjfNE0x@@ynw00O;jCgTu6Znk`>XNoc}2wo zdQ;1fG6Oo(v7qLU)Br!L%6#DOa5w1v3%KQBfLaR+^TUh1-cQA1;R0*1hKj?j)bfwS ztz>IAn?gBUKsguh1oqj)Bkce0Sk-o=7L z$QO$6FEWl6igpWjAx~KFEun&7L29QUvRK3Cz={zHh3kYYVJ7}j-cymEh}yYPuQfsg z-X{Fj<0+v%R9`16*?})=T@~|N$y%_6#jQrmn($SDC#6^;tU$Zh!>0;)G$OQ4SOr%d zVh|M8vK+#BQFsjtsX)3K@E<&0J^T}eVnNHF;#DEMl7+j}GEFE=V);|J3FX$aQmH-- z_(wVN6g3E`L%)~+A!;SB^&0p#F*n6rjk@u=yHPH+o_ezhIo7f`^}g z!=K@l7FH)Ga-e!mW4%i~uJ!i}y}#>_13|!rcm%CgXsZb&G$3syYxPRCj9R>TYY7&V zFArIRm|E?_BXr>Sx<)T=`0+)#4eWO+LxX!R>Rk*s^$+y{58;p|m{C2a{a+a$T6;9O zW$EqE>ZHMMxE56DaOcp_;6Fpi*7Kp>uVAx;w~J=maCw>77^HEm)hXPcGlc8){IvRf zxBgs*vW72l_&()um;tPz;fwEH9?dM8v;Up)zNeShfHBI)z*^+hh&(00uNF`nI+L`y z8HSiv|7-R9zI*-4Q1d#Bv}Tm+#vCRHX)YR(S}%r6)B5`wVU}LraQ$76UZwuxSe52? zJ;N4+HC@1wgtc5O2W=c_Z{D7328}1G73E0yf#V#)Uo>|9)mji9PuE0@C#vtz{MG>K zgaru_)vP}%7;fV@V)eI{qt*AnGkyk^RK?(5F$gMJ{^5B_y+T;S4ZKVEwi@YZg<64D zX)xy)oFEn1cVT#BMfBfyA1{K?_N!tqCWIHztPQ&in4YPd;tk5S#7KjrbySKSS&`vTRSqPo*n_tr;v{IROLKy{B( z-MtU<@bRjaJGZ zBu}NEO?7|GokEW4#&I|HGpTMToBKo$5KdUh`e-rysGm62%M~*5&x93{W-84{PFXte zwE`oAMhUM)qDos*0n^w&L70QSrrcMtm_&2XYQ%G({8qCOunx}~SiJ_9VnsSmzfM5z zi9*4E+-4&`{)@qj#tNPFisxSJnSk?kbi_>iT>^Jx_>Tv<{cvkzjMCgY$bH`+_m)BK z{}|-{!65e!2f3e#9a!G8gWS{}8snY#qXScu0V%?awZJv>n_MT=*78s09w7)L1OOvN zh#Mh{h)s#NTCEB6`(74cM+r>X1*Ibm!u45MOA1B`g2}|1YbdWS$4?NN8=CPmAcinf zFc|PM;2$~JuV{Uf+qGuCR98vT_^g@Nss183g2kZi3qbGA6lS3JE#NT14EX|=#=9)3 zsjI4ASLEj6eE63%xf=6V+y4ZF;~EyANdge=sAzJFC~mE*puRzB;03~;`|<1q zC%B@DRjzsU%{*lZ_y{Y;?BKfC1e-7$<8KX~#6f7kD&QUZHw7cgss5wYk^8L22&aDn z3z^RRr>i~!+RQ}WXgz;Zo)%y-T2qNXAs$Too1nqV)ykoKh}t2_i`Lz6d*;KZCc>{6 zHK$lj5q`){Sb};~p~l2NMdnb9*pYrt)Soyzt&Ads4|G#KsD4zgz&Jul&!60sAGL$> zp?Xt#;9J}5HEU)QXU>0B_)Rf6@iWoKdi+>`(>cAWYC3n&PKl@v8H=mZwFWycTKc^D zwFBJwmF{{9E^;+s{_%*Sv`T71Wfw}dEc1m@9qV|pp|OVg+gZ_AsrR#MMWa;Fr~`Ik zMICdZTmfYX$e;2SkSFDbzdEE}FCZ_y-MF{_k5x(2M$Qb~cVAKI_g|6h-Qm=^tC z%y;~0JxK36W5WMpW4_xzE&b5e|5ttf-3*|TQt?kKkzC>L6yZBISdBI~{&#C_I97@f z{^nmXpyt9qPs^R&*0#IuZufP__xSI+eoe&nZ*KDPB|KmWxq zfA#C%Z2Qm0fBVFfzk6!?)4%`2GtchWxoh{H=l=Mo=l6DY?dyJF|AC%^hh98<Gbc{q=8e_rCM)d+&en;YUi~xO6GflXBV#cH^uAF?; z)tOVKPMe-}&5W7Xe($>LvuDjV&zXC}jX4!7Dyv*8S5?>Cwz_srU46s%8=KtH+I7wA zZ@*>P@>|Qwzdihp4I4LY{(s&6|JUXJkKr%Q%e7eNFR~80@$AF>S}{wWOGBqx`u`!{Ej2Hj5a3)yz@$& z)d5c|KK41BhPXF_Cfx;e!=~l2l*Sea{q=w{x3Yr{r{)a`P+xfcbd*Z*|aI(6$POT ze`fs6#UFuqE;;a%pfBaBn%V?*(M80y>Rw$_x2mdsjUc!iYwAFSR++9afk3WURnJlh zLQ_2yx~8tKZ*)~KAMUPL*$6!{@?dV$pm0+}cy0aKiq+7cmt2kR`l(39b8cvyT3KCF z$1_Df4UHzQ*uT%G+IxX4f*+VpObgv8qc=6@mmnNT^%Wx*DC~XjVusVLaMe;{`FN+A(s-tyT4T7GGwfCY zqJ``8ef_}su7&e?9iGRUKg~`0Y3|!FTB)-&H*_Kggk$v9tXSdVofMId#wz`^bZ8KC zIm2!MYCyO;Z+RkwR7q}tPX~iQ^PC2SyAg0Ak(%1ontu}zT?GaYubrUBZ>m|-P+POI z1}roCY4Hi)M4%fjKE3f*E$AJ>lL=Z)SO>GA!~?W?M+_wvp!u6r0I1mrn!o1O-Vg5N z>zOsLgn4-exvK}cOLe!%;uomyJjXod&e6m9LOe%x-)yt7@NC^}XYMT3oog#%?sPqz z#}@{LD?507Z?^ID$5nT(t(c|nRNY#AwyAEdeGlqxUjKI8&1Ip@x|`R(TzB*K73gkW zeva;5$lIg4Z|3dM-MoGM&uZ}I^;LBD0v7+I?&ke*aFBbK>YiW7>$6RF^ZIVl-Ml>> z-ObByP~8?QZ-1%o=IL{EH&36XyLoz(>V_&3t8a?xwre_>syk0r<58aB?bY1Jb$1?1 zze{x&6!Z3MRo$8*ux?is&#iEE5AT@^Zw7#-JFh{th*Pp z`01*FLGcd`a(AlkJO}TO?W)_hh}Unc7Jf7D-$w?yx2SHde9s_vgX)G(BCCJ3>MmNm zh`CEu_st@QmrZpqQpaodpzz6q!c$ataWNln8hkbQ2x_?IKK1lKcxv$1;G2{*E@@=S zb@54tsqt~~Nhv9YOAPtB1%ik_`sL~LN8SMXg9Sz(Q3ymK5QRV#0#OJ=ArOT?6aqqF zk)>!&LeHqA_c|8sS$uM5#|P*3#sV(6vzL(`OVhH7imHmnrs`#u`gL`+^%Yf3%ODao z;biHu6;e%Y)v|Rpb=O_Htf5v~Ra1x9kWwxybk#1YaaUVhD@Xx``3*dZI<28zzT;zrcrNx5n15odkT_#RmL6^#f&4}aM!>>2V{`*mH6ne% z7&ZP|Q@Fn$%FR#VuiQnk^l}PDr5S`YccPG1HA+ak7T<+qI<+)wpa6ZnNf7Qr8Z+K8 zgUXCa{XgxU4_sX3neX2LVh9j2ki-lLCSw{SU87ErT3TZq@^5i3wqrsJ)>I*3BIpE0 znB)>aZado4a(83JH0x#edfVZTX84yQ-vAEp_89ZCy*f_Lg?l z-0ySFb6_%orrm9K@3ze6^YHyW=e*}V@B6%e&N(xjbJESC>TI*9e7;#!lw}qjc89HU zb3k-urI;*Nj&bTSNvW&U??Tl2UvN8#tH!{Uk!CW`#K|rP@tfQ}ah<*IKu&&!$**2u z@{6)feuHQH;?YIJxr6SoQ~$=xjk&+Tn9g%!=5x(UG4r<0@#S5aX_i&rY?hS=%(9{n zn`N#)GIkDj|M92%(*65f-Yny-&N1F{xA9U2Z$tk0(oxUw#e<8c%CBYBc+sv?b(C_l z3-jRB^iOO^%lSC^6gK9RJ7JroxCbWlU6^JT7R@ya3l~`RmweZ(HRe_P~ucX33*?_@=I8LNnzgTl3~hd z_3=#lREAlwH8X6Nc|LW?qAr=#g}OD6E-|Kw+8Pt=hk7rf-poy5J8in%FPEg7C5*Kt z<&bzUDO?ynFODASO6)x3;UN#|9d^wSi#%VZSy5DNR=7T5+~e7!S;HBF>EXGR7wH@} zL__9XMIEb8QqR9Om$<%SvIn!mnYw;-4lzqCf8w~?#X74#N%503vM!nQ8J9JmFpn@d zEvD>?3v&kTJd$GK?8h04=WjRcjKk~rx#R%0-syJ<<(;SbIB9=Qx_2KC&>mq<9KOjvg*;YiOt(`Or~V0T-dB)l2+!Qm{_22B{pQIN{YQLmB0y%cfeNKHob(b;!9edTO&vdc9 zdY)MxdD<+mK5mv5J!O`=`i)!1QCP;2(~edQ=33+3$^RJt4>N~fn%{Bqm$V%7^H!uA zcM<>7*f2G6rQXF-2dUo!3HeH!oMaB-csr<=39+^97f%U_c3d}4D0R_4^#DZA4zX7Z<7F6Upe+~I}KQ5YksCU3*y@FJfv zPF)u^bN>Yvbjq~QWfn>sI9%c~OQ!P|Ggs0N7C)ICo?n?2n4DYP7a4c;eELY1aUaeK z+wC%s;}hdWj!!exHSfy#n^#0~IX}r^K5?6c8?z5*jHi!YG@Lf*oZtGTk67(LpZv09 z{7vPzEW<2|WV8Kzvy64i8mwb)z?Ge1vI{eO)^;49rp~?e{4_s{b1FB-=JU_1CbwOY zWmZJoW(DV7D>(02F?H@`*IVMF_4-xnVa*X%J#r|I+bnn?Gt74HlYJ~>A4}NB!fUb{ zlIu^iY5fj&1PH9Gl(_k7uMN~Y@b3I@Be}^aqOsWUx5DFlg9i_QhqtsF_baLc}?=U{3oB{ zoDh4}*=C;0%-co%wJgc=;m+gye-ZWvH9D6_e>l0|+&*!5QGnvvZIzplm(>Tt8XoUt1TC%h{e2pKAwrRvlKU`M&cdV?Kl5;_Sz%qjjx7 zpDmm^rk)|)8(5E%*167-aTl4(xPygRgVs5J;T-4KqsK?eL#(GeKK|q{jal+#WB#Y+ zo40m8{e78PQNENupU3%Hu9>>xu&)=GHYWSM)BmUC0}1J-n~SHZ=iFzF$-%zs)YFMc z&P67NbK0CjIn$V$vmYkyi`dW4P49F4hR;o{V@V{%%qimT6}wFTf_=2QR=7Uxn(kOq zlSQnii_r}APCaAHE8oC;P`@Fp=J6Rdif8H`A_GTacVwEsIQYpFX^Ag_UJaJ&@W;SI(aOa zW0ve%7|yNC3AmXU?du-x-&`YEeSE8PeKa+;UDkZh^)ufAO$?*Dg0P7B)dy{N||~mjCmPr z)41I5bLIx@8TB7z-4OowoVaNl=5c(NYa%&!^OBEzqzC=dYfY#9t@g6d7xPxlHM!MG zO)hgpuIpkW-|R@9G0Dq1HgO$W&b1WRj&f~jr7zDX{W8*fCew4cG4^+2%lJ;rGx?pE zET0@_&i)CP6PnTTJMzXkW$>cc8^-F_$>KJYvGdO=> z{W8`sV?E~)Q|puGe>tvBH-0XZF83mndvc-4jpUfz7cv8OpUk08avs81P5f@hnopSw7RP=CJqKJ~NJcdNfZ{qZAqdEDv`tDmEOT>XpHZ&81V z`eF4w>Ic;Ks$Zb~rRt}vzf%3N&)EB4rT(z`m#N>c{%ZAG)W2N)CiM%{uT=lN>igCA zsqa;Pt@=j&LiI-v+vT}N{Q>oh)Q_qEKJ}yOU#otF`tMiYr+%^e>FR$#{qaZa{e4jV zA@#3QKd$~d^;^`xUj4B8>(wt+{|5C7)c32Ou6~L7V=eanH>f|P{zmoV>Tg!RS^X{Q zht>Z>^#kgcs$Z=Bjp}>U52!!!u)Y7A)gM-WtNQ)wZ&SZT{c`nd)ZebYU;SIu_o}}` z{qaxR`>RlYNc~&YkE#C=^`q+FrhcXRA64J4{_W~})xSf1qkfh8V-MN;-=+SL`n%PS ztMAMwt?E1TPgH%KzGk5jC~W`km4AMPF@N__?+bfgI(t^ms4m9jI3gz3<3jmY4K9HV zKe6zXJ9&tf{oJj&kgs>RiQMKqWd@XWnV7Rq@|A6c3oyyojmfecjIS>(ljWCUviyCR z_$BJgT}9#tFxh4+Ch6qvC?P-VS^3`zW#1u8mhZ*9SQwLM&NX0CR;h=SCyGg#?^iwm zW&I~GS$`0dd>+Bxi+xu8HYnxk#AJU*F-gbQpH}&vgR=f*OxAk{ip0x_*;ziglOOTr z6P3dJ20!i&d;A!ONqM_2;3ut~{64~2p1i%Y++p(i3;E7=4wKV6%N-`KzmV^2=kP-5 zlh-@j{l2r}Vf%dXH$@rWiJ!5fcE3HN995oHjwoMJ4l9S0gUSJAT-mBTq>L)>Q#L6h z%CIt|tWj1gE0sHy70PmDKv}9RR<2R5QabtPtG`H@r8LTkC+xV4DMysU%2UcgWn9^+ zoX3Qo*r!``d9yOAY*L1mHOfk5KsYL1kR|nDU4+s;p4@m5DJah z>A&>cdD!t?iIcbX?DH~9SRmItiJK&>npR4BvDwdT1ZE@fFOR^xe0PvIj;;-om)PU{U(1i{XOZT6O7s17>73`i*?sQ$o76`>Z|QQGQ=~q>&fG%s+0SeQW+N~g zf#3NE_&7J~!75I<%rIQVm*f#Nzw4T3u=~*Cu#qp@ThTH2(?!M{M!ham++lBKM?py(*pkwwh1l&H5qJVK z!!C0Q{?Rr3K7=lV&tqQnFx+0m{Ws_eIEn?(!YAL)zR}0w<;DCigD!v-A0R&HN_h2k z{I5RR2Uo8%=A@*7`8+)LCA6>{dmSx2giWANh`xb7^9^DGZ}ane4SFa1K?!{W{W^ST z17(vm@D0q59)~3xxmOA;@3HkHG9I z>iZJqf#1M9=yBM(i}pebW7X6bExas9zd;wkpJA2gMSF-9R)dbhK`e|Og=u&4`X96# z7GP1d53a=yqW!Q0Yeq+EjQOWp`V)E_{^4E34P6TV3hPC`1*3OU7ql?UkCdZm;UCm7 zF8-cz2Tx#Y(89I%Fc+bV;6W^a7Vc`K{OD?U2x~zLS4XHnx&Zz&)`@-_KCqAZ6MYcA zhMh!@!QJ~Q4|-jbF<-z=qffw_5776}s3f%<1jz!U@ z;1!=BCg>u#=pbc73$Mdk(d*#nuoyZ9zk$Wk{!jA1@>oB*2KHeC=zjP!Y!L1K6zz!( zp@lWru%w4auo1Ly5F14c?`~%7phNH>Y|+c~8TbV(AAKBt8(W1w4d21mpv`|_&cTY% zHE_+JvTwA|kCmZ?U&hMOC!qTfb0%6Cz#`}nyy78_#preLHtZmJCp`XX+7B&U`Y=8^ zA8yA^qO0MHe?c3eUxLqmmT`;bdFAG#pJPr#KL*odv=LeuZl~{#xJ)nnVh3|9n&+XL zP@J|y3p=q*k_LVsD?_JsaUATSF6d#nrJGI zAKeK({q!HS@UO55^cWm}lCk+M#t8h;Q}h}1>u~dN#t6C;-iw_;-v@v4G<_27{-QCr zV-x5~nDHg*{0hfG_({x%ZiX*mezb6KfbotNrv4B58`=%`V<#m&y!9`MEqW*X40alQ z1YY-LVvFYa^5*rg(oeokIpOL-;)Y%a8?iEU1omL%=w5gR+ldygc!vIf_QDNV2)zk@ z1&g2u;p%4@FX#ez7CVkMe@&dR)96z8=hzwaV{q+B;(#uKsn65rPSbYq_F?)ex)MHt z`O$IsbF38oHhkn8lnot&-+GlYpijfrf5gzj+s@Dy=$-I0*h}am@a+GlJZSTM;*Cw9 zg8>8TMgrbU$nzqfeku!LwKa+Wf$nTFi%j3~u-#^OP= z{sVSG((p`;2eE^HXH%XH(u)?#^Ecwp+5AWJ&gY2(Oy!>Mar{i$PUq1}NItvk~~$N5Eg1GMUNYJ5$W) z?i5plIiHN06qC;KnLbfnckNy~%_?QK@)sd{`RmGy$xlA3m4(Xn%5vo{WklJmd`vl@ z{HF4U%6FBXT6;fhlpB-*Tmy1mk;YW8BoTQZzz9T^_m@@_BfdxpLQH( z$LI7T?cZyB?sjdlUeT@Z+b-b=5u3MuXmi;$h1OlECXcuI27??tAv}Zl?1xEa7d% zQ?R zt}UU)ZNbPbRiS-BbI3|lzn9l$RhRK{rV{g9S~+jgs;%P?}rj{au&Xt zw!N;#s&4h>rro@#ncHx;)P^GRR_CYE*ujjeQ&MkiH=+$|R*!uB5t}LQ(7GvgD@v>V2W0-L5+* zlWTKRt@Cns^L5&JH}7~0)YsC$4W?+$4w^ei7=q?**?L=~TDycPdFKCZX%ERQHUu$~$oi3@y=DPj04fS<#1nRgZ*2m~AU$Vjc*O@E+bw8dY@p37@@->o(Mn}ir?A7(g2 zt(qL*6>xjYYxf3A8m&5_%yp?{!K(d?#dCtfxv^_Y6|bQy35TU8l$bYZLH2iEy6Ys? zbk4^5P;g_UA!LWW!PHoFFRSIncy#5G)G{8Mt{(j%OUhGLPb&oNz?vqj+yU`SooMT2 zHtQwbhd19OFSf~IJkdjHt2atlthzI3Ua@-i)}Y<|5h;n(%ju>jX6316BZnswd^$X1 zgom#f>rmC>rMwGEOb+Tp3>z(E@VJnhWJ4zoR-4WSu!U(v=9vvE!9p+(U zk3=cj4(|Qh7^-j7k!C(h@7>o}Bda#-+p~uOY)psjL7qFmDY&PKzEQUE#!Y-zd~U?( zUAeB!b^G>ivl`V7Wg|KKMb9mw%gEWIZ<^(DUr;IQ z!uO<@M_uP`HS3)pfggYQtLtuP+8grjx6c@^U%B=w-%8&8$RV2J)AcL2mv6bUc%_%O zr`A$gy=(@OOlth#tjh;kPL;_Qd!T6Q4)K_?-)+$2_ruSaGa0RuQX- zHN~1^t+9A)AT|^miH*f3V(D$3wt}|ew$e5d_w&0A7>o_Gc9iwwq%dviZEjL|N#`S_ zpS1l)2agUP9X&dJ)WqF!Z`>F6#{==ocsL%7x5Q)d{`g>gI6fL5kDD%cm$%E;)9vo|cKf>h-GT1P?r?XsyQMqU-QPXfJ={IoJ>Jbf zI`(*bd_Df2Ku={)xF_1v(i7|H?-}eF?iuYF?=ijZUT?3j*WVlHt?Ui=MtfU&W4-;o zgT2GOqrKz3rqA8y?W0oT{6@yHE$-O5qFJ_Ylo+cN1}F zCK9d0B2F|0h{g!<7$YJR#3Y@lc!)~@ktrrNr9`KK_|y=gCSue~lv;^XoJb82t0AH_ zLcGR^*aR_4Cu$zzR!rPViChJ-t08(##IKnMwi3fQQ5+zSLqu|fSdJ0R3F4VfL_Nf` zpwHJ=+~@Br?F;l(^i}rN^o9GH`l5Z!eG`42W5vfRjx`+{I5vE24}Pci+clpa(;AF7Er(TketN3HavIDKh=-ZT=IZD&8T5txm@ F{{st8k*)v$ literal 0 HcmV?d00001 diff --git a/src/CommonHelper.cpp b/src/CommonHelper.cpp index dbde330..4c8bd7c 100644 --- a/src/CommonHelper.cpp +++ b/src/CommonHelper.cpp @@ -4091,7 +4091,8 @@ InitConnectionDetails(ConnectionInfo *conn) conn->m_issslchecked = wyFalse; conn->m_iscompress = wyTrue; conn->m_isdeftimeout = wyTrue; - conn->m_strwaittimeout.SetAs("28800"); + conn->m_strwaittimeout.SetAs("28800"); + conn->m_isreadonly = wyFalse; //conn->m_ispwdcleartext = wyFalse; #ifdef _WIN32 diff --git a/src/ConnectionBase.cpp b/src/ConnectionBase.cpp index e45c711..b88d8dc 100644 --- a/src/ConnectionBase.cpp +++ b/src/ConnectionBase.cpp @@ -107,6 +107,25 @@ ConnectionBase::OnInitDialog(HWND hwnd, LPARAM lparam) SendMessage(GetDlgItem(hwnd, IDC_PINGINTERVAL), EM_LIMITTEXT, 6, 0); + ShowWindow(GetDlgItem(hwnd, IDC_LINK), SW_SHOW); + +#ifndef COMMUNITY + // if(pGlobals->m_entlicense.CompareI("Professional") != 0) + // { + ShowWindow(GetDlgItem(hwnd, IDC_COMPRESSHELP), SW_SHOW); + ShowWindow(GetDlgItem(hwnd, IDC_READONLY), SW_SHOW); + // } + /* else + { + ShowWindow(GetDlgItem(hwnd, IDC_COMPRESSHELP), SW_HIDE); + ShowWindow(GetDlgItem(hwnd, IDC_READONLY), SW_HIDE); + } + */ +#else + ShowWindow(GetDlgItem(hwnd, IDC_COMPRESSHELP), SW_HIDE); + ShowWindow(GetDlgItem(hwnd, IDC_READONLY), SW_HIDE); +#endif + PostMessage(hwnd, WM_INITCONNDIALOG, 0, 0); return; } @@ -180,6 +199,21 @@ ConnectionBase::OnAboutInitDialog(HWND hwnd) return 0; } +LRESULT CALLBACK + ConnectionBase::StaticDlgProcLinkCursor (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + ConnectionBase * pdb = (ConnectionBase*)GetWindowLongPtr(hwnd, GWLP_USERDATA); + + switch(message) + { + case WM_MOUSEMOVE: + SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(32649))); + return 0; + } + + return CallWindowProc(pdb->m_wpstaticorigproc, hwnd, message, wParam, lParam); +} + wyInt32 ConnectionBase::OnWmCtlColorStatic(HWND hwnd, WPARAM wparam, LPARAM lparam) { @@ -316,6 +350,23 @@ ConnectionBase::CreateConnectDialogWindows(HWND hwnd, wyBool ispowertools) pGlobals->m_hinstance, NULL); VERIFY(geninfo); ShowWindow(geninfo, SW_SHOW); + ShowWindow(GetDlgItem(hwndtab, IDC_LINK), SW_SHOW); + +/*#ifndef COMMUNITY + if(pGlobals->m_entlicense.CompareI("Professional") == 0) + { + ShowWindow(GetDlgItem(hwndtab, IDC_COMPRESSHELP), SW_HIDE); + ShowWindow(GetDlgItem(hwndtab, IDC_READONLY), SW_HIDE); + } +#else + ShowWindow(GetDlgItem(hwndtab, IDC_COMPRESSHELP), SW_HIDE); + ShowWindow(GetDlgItem(hwndtab, IDC_READONLY), SW_HIDE); +#endif +*/ + #ifdef COMMUNITY + ShowWindow(GetDlgItem(hwndtab, IDC_COMPRESSHELP), SW_HIDE); + ShowWindow(GetDlgItem(hwndtab, IDC_READONLY), SW_HIDE); + #endif return wyTrue; } @@ -536,7 +587,32 @@ ConnectionBase::OnValidConNameChngState(HWND hdlg, BOOL state) VERIFY(hctrl = GetDlgItem(hdlg, id_arr[count])); EnableWindow(hctrl, state); } - +VERIFY(hctrl = GetDlgItem(hdlg, IDC_READONLY)); +/* +#ifndef COMMUNITY + if(pGlobals->m_entlicense.CompareI("Professional") != 0) + { + ShowWindow(GetDlgItem(hdlg, IDC_COMPRESSHELP), SW_SHOW); + ShowWindow(GetDlgItem(hdlg, IDC_READONLY), SW_SHOW); + } // EnableWindow(hctrl, state); + else + { + ShowWindow(GetDlgItem(hdlg, IDC_COMPRESSHELP), SW_HIDE); + ShowWindow(GetDlgItem(hdlg, IDC_READONLY), SW_HIDE); + } //EnableWindow(hctrl, FALSE); +#else + EnableWindow(hctrl, FALSE); +#endif +*/ +/* +#ifndef COMMUNITY + ShowWindow(GetDlgItem(hdlg, IDC_COMPRESSHELP), SW_SHOW); + ShowWindow(GetDlgItem(hdlg, IDC_READONLY), SW_SHOW); +#else + ShowWindow(GetDlgItem(hdlg, IDC_COMPRESSHELP), SW_HIDE); + ShowWindow(GetDlgItem(hdlg, IDC_READONLY), SW_HIDE); +#endif + */ if(m_conndetaildirty == wyTrue) { EnableWindow(GetDlgItem(hdlg, IDC_SAVE), state); @@ -565,7 +641,7 @@ ConnectionBase::ChangeConnStates(HWND hdlg, wyBool state) IDC_DLGCONNECT_PORT, IDC_MYSQLDEFSRVST, IDOK, IDC_TESTCONN, IDC_COMPRESS, IDC_COMPRESSHELP, IDC_TIMEOUT, IDC_TIMEOUTDEF, IDC_TIMEOUTOPT, IDC_TIMEOUTHELP, IDC_TIMESEC , - IDC_KEEPALIVE, IDC_KEEPALIVESEC, IDC_PINGINTERVAL + IDC_KEEPALIVE, IDC_KEEPALIVESEC, IDC_PINGINTERVAL, IDC_READONLY }; HWND hctrl; @@ -575,7 +651,19 @@ ConnectionBase::ChangeConnStates(HWND hdlg, wyBool state) VERIFY(hctrl = GetDlgItem(hdlg, id_arr[count])); EnableWindow(hctrl, state); } +VERIFY(hctrl = GetDlgItem(hdlg, IDC_READONLY)); +#ifndef COMMUNITY +// if(pGlobals->m_entlicense.CompareI("Professional") != 0) + EnableWindow(hctrl, state); +// else +// EnableWindow(hctrl, FALSE); + //ShowWindow(GetDlgItem(hwnd, IDC_READONLY), state); +#else + //EnableWindow(hctrl, FALSE); + ShowWindow(GetDlgItem(hdlg, IDC_READONLY), SW_HIDE); + ShowWindow(GetDlgItem(hdlg, IDC_COMPRESSHELP), SW_HIDE); +#endif if(state == wyFalse) { EnableWindow(GetDlgItem(hdlg, IDC_TIMEOUTEDIT), FALSE); @@ -1040,11 +1128,16 @@ ConnectionBase::ShowSeverTabOptions(HWND hwnd, wyBool enable) IDC_DLGCONNECT_DATABASE, IDC_COLONST, IDC_MYSQLPORTST, IDC_DLGCONNECT_PORT, IDC_MYSQLDEFSRVST, IDC_COMPRESS, IDC_COMPRESSHELP, IDC_TIMEOUT, IDC_TIMEOUTDEF, IDC_TIMEOUTOPT, IDC_TIMESEC, IDC_TIMEOUTEDIT, IDC_TIMEOUTHELP, - IDC_KEEPALIVE, IDC_KEEPALIVESEC, IDC_PINGINTERVAL}; + IDC_KEEPALIVE, IDC_KEEPALIVESEC, IDC_PINGINTERVAL, IDC_READONLY, IDC_LINK}; wyInt32 count = sizeof(serverids)/ sizeof(serverids[0]); ShowOrHide(hwnd, serverids, count, enable); +#ifdef COMMUNITY + ShowWindow(GetDlgItem(hwnd, IDC_READONLY), SW_HIDE); + ShowWindow(GetDlgItem(hwnd, IDC_COMPRESSHELP), SW_HIDE); + +#endif } void @@ -1079,8 +1172,14 @@ ConnectionBase::ShowHttpTabOptions(HWND hwnd, wyBool enable) //enabling the help button EnableWindow(GetDlgItem(hwnd, IDC_TUNNELHELP), TRUE); - +#else + if(enable == wyTrue) + { + ShowWindow(GetDlgItem(hwnd, IDC_COMPRESSHELP), SW_HIDE); + ShowWindow(GetDlgItem(hwnd, IDC_READONLY), SW_HIDE); + } #endif + } void @@ -1117,7 +1216,12 @@ ConnectionBase::ShowSshTabOptions(HWND hwnd, wyBool enable) //enabling the help button EnableWindow(GetDlgItem(hwnd, IDC_SSHHELP), TRUE); - + #else + if(enable == wyTrue) + { + ShowWindow(GetDlgItem(hwnd, IDC_COMPRESSHELP), SW_HIDE); + ShowWindow(GetDlgItem(hwnd, IDC_READONLY), SW_HIDE); + } #endif } @@ -1154,6 +1258,12 @@ ConnectionBase::ShowSslTabOptions(HWND hwnd, wyBool enable) //enabling the help button EnableWindow(GetDlgItem(hwnd, IDC_SSLHELP), TRUE); + #else + if(enable == wyTrue) + { + ShowWindow(GetDlgItem(hwnd, IDC_COMPRESSHELP), SW_HIDE); + ShowWindow(GetDlgItem(hwnd, IDC_READONLY), SW_HIDE); + } #endif } @@ -1173,7 +1283,7 @@ ConnectionBase::ShowOrHide(HWND hwnd, wyInt32 array[], wyInt32 arraycount, wyBoo else ShowWindow(hwndc, SW_HIDE); } - } + } } void @@ -1412,7 +1522,7 @@ ConnectionBase::GetInitialDetails(HWND hdlg) wyWChar directory[MAX_PATH+1]={0}, *lpfileport=0; wyChar pwd[SIZE_512]={0}; wyBool decodepwd = wyTrue; - wyUInt32 ret, usecompress = 1, isdefwaittimeout = 1/*, usecleartext = 0*/; + wyUInt32 ret, usecompress = 1, isdefwaittimeout = 1, readonly = 0/*, usecleartext = 0*/; ConnectionInfo conninfo; // Get the complete path. @@ -1459,7 +1569,23 @@ ConnectionBase::GetInitialDetails(HWND hdlg) //Compressed prtocol usecompress = wyIni::IniGetInt(conn.GetString(), "compressedprotocol", 1, dirstr.GetString()); Button_SetCheck(GetDlgItem(hdlg, IDC_COMPRESS), usecompress); - +#ifndef COMMUNITY +//if(pGlobals->m_entlicense.CompareI("Professional") != 0) +//{ + readonly = wyIni::IniGetInt(conn.GetString(), "readonly", 0, dirstr.GetString()); + Button_SetCheck(GetDlgItem(hdlg, IDC_READONLY), readonly); +//} +//else +//{ +// readonly = 0; +// Button_SetCheck(GetDlgItem(hdlg, IDC_READONLY), readonly); +//} +#else +{ + readonly = 0; + Button_SetCheck(GetDlgItem(hdlg, IDC_READONLY), readonly); +} +#endif /*usecleartext = wyIni::IniGetInt(conn.GetString(), "cleartextpwd", 0, dirstr.GetString()); Button_SetCheck(GetDlgItem(hdlg, IDC_ISCLEARTEXT), usecleartext);*/ @@ -2278,7 +2404,12 @@ ConnectionBase::FillAdvancedTab(HWND hwnd, ConnectionInfo *conninfo) EnableWindow(GetDlgItem(hwnd, IDC_INITCOMMAND), TRUE); EnableWindow(GetDlgItem(hwnd, IDC_EDITINITCOMMAND), TRUE); EnableWindow(GetDlgItem(hwnd, IDC_INITCOMMANDDETAIL), TRUE); - + /* +#ifndef COMMUNITY + ShowWindow(GetDlgItem(hwnd, IDC_COMPRESSHELP), SW_HIDE); + ShowWindow(GetDlgItem(hwnd, IDC_READONLY), SW_HIDE); +#endif + */ //fill connection color ColorComboInitValues(GetDlgItem(hwnd, IDC_COLORCOMBO)); ColorComboFgInitValues(GetDlgItem(hwnd, IDC_COLORCOMBO3)); @@ -2419,7 +2550,12 @@ ConnectionBase::SaveServerDetails(HWND hwnd, const wyChar *conn, const wyChar *d ret = Button_GetState(GetDlgItem(hwnd, IDC_COMPRESS)); (ret == BST_CHECKED) ? value = 1 : value = 0; ret = wyIni::IniWriteInt(conn, "compressedprotocol", value, directory); - +#ifndef COMMUNITY + //readonly + ret = Button_GetState(GetDlgItem(hwnd, IDC_READONLY)); + (ret == BST_CHECKED) ? value = 1 : value = 0; + ret = wyIni::IniWriteInt(conn, "readonly", value, directory); +#endif //Clear text pwd /*ret = Button_GetState(GetDlgItem(hwnd, IDC_ISCLEARTEXT)); (ret == BST_CHECKED) ? value = 1 : value = 0; @@ -2448,6 +2584,19 @@ ConnectionBase::HandleCommonConnectOptions(HWND hwnd, ConnectionInfo *dbname, wy { switch(id) { +#ifndef COMMUNITY + case IDC_READONLY: + if(SendMessage(GetDlgItem(hwnd, IDC_READONLY), BM_GETCHECK, 0, 0)== BST_CHECKED) + // if(pGlobals->m_entlicense.CompareI("Professional") != 0) + dbname->m_isreadonly = wyTrue; + else + dbname->m_isreadonly = wyFalse; + + EnableWindow(GetDlgItem(hwnd, IDC_SAVE), TRUE); + EnableWindow(GetDlgItem(hwnd, IDC_CLONECONN), FALSE); + m_conndetaildirty = wyTrue; + break; +#endif case IDC_COMPRESS: if(SendMessage(GetDlgItem(hwnd, IDC_COMPRESS), BM_GETCHECK, 0, 0)== BST_CHECKED) dbname->m_iscompress = wyTrue; @@ -2528,7 +2677,6 @@ ConnectionBase::HandleCommonConnectOptions(HWND hwnd, ConnectionInfo *dbname, wy break; } - return; } @@ -2589,6 +2737,9 @@ void ConnectionBase::WriteMysqlDefValues(HWND hdlg) SendMessage(GetDlgItem(hdlg, IDC_DLGCONNECT_DATABASE), WM_SETTEXT, 0, (LPARAM)L""); SendMessage(GetDlgItem(hdlg, IDC_DLGCONNECT_PORT), WM_SETTEXT, 0, (LPARAM)L"3306"); Button_SetCheck(GetDlgItem(hdlg, IDC_COMPRESS), 1); +#ifndef COMMUNITY + Button_SetCheck(GetDlgItem(hdlg, IDC_READONLY), 0); +#endif //Button_SetCheck(GetDlgItem(hdlg, IDC_ISCLEARTEXT), 0); Button_SetCheck(GetDlgItem(hdlg, IDC_TIMEOUTDEF), 1); Button_SetCheck(GetDlgItem(hdlg, IDC_TIMEOUTOPT), 0); diff --git a/src/ConnectionCommunity.cpp b/src/ConnectionCommunity.cpp index dc3fc8e..a6f6e7e 100644 --- a/src/ConnectionCommunity.cpp +++ b/src/ConnectionCommunity.cpp @@ -417,6 +417,12 @@ ConnectionCommunity::ConnectToMySQL(HWND hdlg, ConnectionInfo *coninfo) coninfo->m_isssh = wyFalse; coninfo->m_origmysqlport = 0; +#ifndef COMMUNITY + //read only settings + ret =(SendMessage(GetDlgItem(hdlg, IDC_READONLY), BM_GETCHECK, 0, 0)); +// if(pGlobals->m_entlicense.CompareI("Professional") != 0) + (ret == BST_CHECKED) ? coninfo->m_isreadonly = wyTrue : coninfo->m_isreadonly = wyFalse; +#endif //Compress protocol settings ret =(SendMessage(GetDlgItem(hdlg, IDC_COMPRESS), BM_GETCHECK, 0, 0)); (ret == BST_CHECKED) ? coninfo->m_iscompress = wyTrue : coninfo->m_iscompress = wyFalse; @@ -740,6 +746,11 @@ ConnectionCommunity::OnWmCommandConnDialog(HWND hwnd, WPARAM wparam, LPARAM lpar ShowHelp("http://sqlyogkb.webyog.com/article/153-direct-connection-using-mysql-c-api"); break; } + if((HIWORD(wparam)== STN_CLICKED)) + { + if(LOWORD(wparam)== IDC_LINK) + ShowHelp("http://sqlyogkb.webyog.com/article/153-direct-connection-using-mysql-c-api"); + } } wyBool @@ -815,8 +826,13 @@ ConnectionCommunity::ConnectDialogProc(HWND hwnd, UINT message, WPARAM wParam, L case WM_INITCONNDIALOG: pGlobals->m_pcmainwin->m_connection->OnInitConnDialog(hwnd); + pGlobals->m_pcmainwin->m_connection->m_wpstaticorigproc =(WNDPROC)SetWindowLongPtr(GetDlgItem(hwnd, IDC_LINK), GWLP_WNDPROC,(LONG_PTR)StaticDlgProcLinkCursor); + SetWindowLongPtr(GetDlgItem(hwnd, IDC_LINK), GWLP_USERDATA,(LONG_PTR)pGlobals->m_pcmainwin->m_connection); break; + case WM_CTLCOLORSTATIC: + return pGlobals->m_pcmainwin->m_connection->OnWmCtlColorStatic(hwnd, wParam, lParam); + case SHOW_CONFIRM: pGlobals->m_pcmainwin->m_connection->ConfirmAndSaveConnection(hwnd); break; @@ -1414,10 +1430,13 @@ ConnectionCommunity::DlgProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lpar case WM_INITDLGVALUES: hwndactive = GetDlgItem(hwnd, IDC_COMLINK); - pcomm->m_wporigstaticproc = (WNDPROC)SetWindowLongPtr(hwndactive, GWLP_WNDPROC,(LONG_PTR)StaticDlgProc); + pcomm->m_wporigstaticproc = (WNDPROC)SetWindowLongPtr(hwndactive, GWLP_WNDPROC,(LONG_PTR)StaticDlgProc); SetWindowLongPtr(hwndactive, GWLP_USERDATA,(LONG_PTR)pcomm); break; + case WM_CTLCOLORSTATIC: + return pGlobals->m_pcmainwin->m_connection->OnWmCtlColorStatic(hwnd, wparam, lparam); + case WM_COMMAND: pcomm->OnDlgWmCommand(hwnd, wparam); break; diff --git a/src/DataView.cpp b/src/DataView.cpp index cc0b542..f31401a 100644 --- a/src/DataView.cpp +++ b/src/DataView.cpp @@ -791,12 +791,12 @@ DataView::UpdateViewButtons() SendMessage(hwnd, TB_SETSTATE, (WPARAM)ID_VIEW_GRIDVIEW, TBSTATE_ENABLED | TBSTATE_PRESSED); break; - case FORM: - SendMessage(hwnd, TB_SETSTATE, (WPARAM)ID_VIEW_GRIDVIEW, TBSTATE_ENABLED); - SendMessage(hwnd, TB_SETSTATE, (WPARAM)ID_VIEW_TEXTVIEW, TBSTATE_ENABLED); - SendMessage(hwnd, TB_SETSTATE, (WPARAM)ID_VIEW_FORMVIEW, TBSTATE_ENABLED | TBSTATE_PRESSED); - break; - } + case FORM: + SendMessage(hwnd, TB_SETSTATE, (WPARAM)ID_VIEW_GRIDVIEW, TBSTATE_ENABLED); + SendMessage(hwnd, TB_SETSTATE, (WPARAM)ID_VIEW_TEXTVIEW, TBSTATE_ENABLED); + SendMessage(hwnd, TB_SETSTATE, (WPARAM)ID_VIEW_FORMVIEW, TBSTATE_ENABLED | TBSTATE_PRESSED); + break; + } } } @@ -2778,7 +2778,7 @@ DataView::IsCurrRowDuplicatable() } //if it can be ediited - if(m_data->m_db.GetLength() && m_data->m_table.GetLength()) + if(m_data->m_db.GetLength() && m_data->m_table.GetLength() && GetActiveWin()->m_conninfo.m_isreadonly == wyFalse) { return wyTrue; } @@ -3461,8 +3461,11 @@ DataView::HandleBlobValue(WPARAM wparam, LPARAM lparam) pib.m_data = GetCellValue(row, col, &len, wyFalse); //check whether the column is readonly or not - isedit = (IsColumnReadOnly(col) || IsColumnVirtual(col)==1 )? wyFalse : wyTrue; - +#ifndef COMMUNITY + isedit = (IsColumnReadOnly(col) || IsColumnVirtual(col)==1 || GetActiveWin()->m_conninfo.m_isreadonly)? wyFalse : wyTrue; +#else + isedit = (IsColumnReadOnly(col) || IsColumnVirtual(col)==1)? wyFalse : wyTrue; +#endif //if chardown is true then lparam = 1, else 0. if(!pib.m_data) { @@ -4185,6 +4188,16 @@ DataView::EnableToolButtons() //enable/disable the duplicate button EnableToolButton((IsCurrRowDuplicatable() && isenable) ? wyTrue : wyFalse, IDM_DUPLICATE_ROW); +#ifndef COMMUNITY + if(m_wnd->m_conninfo.m_isreadonly == wyTrue) + { + EnableToolButton(wyFalse, IDM_DUPLICATE_ROW); + EnableToolButton(wyFalse, ID_RESULT_SAVE); + EnableToolButton(wyFalse, ID_RESULT_CANCEL); + EnableToolButton(wyFalse, ID_RESULT_DELETE); + EnableToolButton(wyFalse, ID_RESULT_INSERT); + } +#endif } //function to enable toolbar @@ -7649,6 +7662,12 @@ DataView::GridWndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) //begin label edit case GVN_BEGINLABELEDIT: //allow only if the column is not read-only +#ifndef COMMUNITY + if(GetActiveWin()->m_conninfo.m_isreadonly == wyTrue) + { + return FALSE; + } +#endif if(pviewdata->IsColumnReadOnly(lparam)) { return FALSE; @@ -7914,6 +7933,20 @@ DataView::ShowContextMenu(wyInt32 row, wyInt32 col, LPPOINT pt) } } EnableMenuItem(htrackmenu, ID_UNSORT, isunsort == wyFalse ? MF_GRAYED : MF_ENABLED); + +#ifndef COMMUNITY + if(m_wnd->m_conninfo.m_isreadonly == wyTrue) + { + EnableMenuItem(htrackmenu, ID_RESULT_INSERT,MF_GRAYED); + EnableMenuItem(htrackmenu, ID_RESULT_SAVE,MF_GRAYED); + EnableMenuItem(htrackmenu, ID_RESULT_DELETE,MF_GRAYED); + EnableMenuItem(htrackmenu, ID_RESULT_CANCEL,MF_GRAYED); + EnableMenuItem(htrackmenu, IDC_SETEMPTY,MF_GRAYED); + EnableMenuItem(htrackmenu, IDC_SETDEF,MF_GRAYED); + EnableMenuItem(htrackmenu, IDC_SETNULL,MF_GRAYED); + EnableMenuItem(htrackmenu, IDM_DUPLICATE_ROW,MF_GRAYED); + } +#endif //set owner draw property and show menu m_htrackmenu = htrackmenu; wyTheme::SetMenuItemOwnerDraw(m_htrackmenu); @@ -8443,7 +8476,7 @@ DataView::OnTextContextMenu(LPARAM lParam) hmenu = LoadMenu(pGlobals->m_hinstance, MAKEINTRESOURCE(IDR_INFOTABMENU)); LocalizeMenu(hmenu); htrackmenu = GetSubMenu(hmenu, 0); - + if(IsWindowVisible(m_hwndtext) && IsWindowEnabled(m_hwndtext)) { if(SendMessage(m_hwndtext, SCI_GETSELECTIONSTART, 0, 0) == SendMessage(m_hwndtext, SCI_GETSELECTIONEND, 0, 0)) @@ -8459,7 +8492,6 @@ DataView::OnTextContextMenu(LPARAM lParam) { DisableMenuItems(htrackmenu); } - m_htrackmenu = htrackmenu; wyTheme::SetMenuItemOwnerDraw(m_htrackmenu); diff --git a/src/ExportAsSQL.cpp b/src/ExportAsSQL.cpp index 20155b6..34e5668 100644 --- a/src/ExportAsSQL.cpp +++ b/src/ExportAsSQL.cpp @@ -160,7 +160,6 @@ MySQLDump::MySQLDump() m_mysqlwaittimeout.SetAs(WAIT_TIMEOUT_SERVER); m_compressedprotocol = wyTrue; - /* initialize MySQLDump and set to default values */ Initialize(); } @@ -929,7 +928,7 @@ MySQLDump::SetOtherConnectionInfo(ConnectionInfo *conn) m_mysqlwaittimeout.SetAs(WAIT_TIMEOUT_SERVER); } - m_compressedprotocol = conn->m_iscompress; + m_compressedprotocol = conn->m_iscompress; } /* This function allow user to select tables to be dumped*/ diff --git a/src/FrameWindow.cpp b/src/FrameWindow.cpp index 4a00e1e..68414a6 100644 --- a/src/FrameWindow.cpp +++ b/src/FrameWindow.cpp @@ -105,9 +105,9 @@ extern PGLOBALS pGlobals; #define TABBED_INTERFACE_HEIGHT 25 #define TABBED_INTERFACE_TOP_PADDING 10 -#define SCHEMA_DESCRIPTION "11.52" -#define SCHEMA_MAJOR_VERSION "11" -#define SCHEMA_MINOR_VERSION "52" +#define SCHEMA_DESCRIPTION "12.34" +#define SCHEMA_MAJOR_VERSION "12" +#define SCHEMA_MINOR_VERSION "34" #define CONSAVE_INTERVAL 10000 /* some of the features are not available when you connect using tunneling feature */ @@ -122,7 +122,8 @@ extern PGLOBALS pGlobals; #define TABLE_SCHEMADETAILS "CREATE TABLE schema_version (description TEXT, major_version TEXT, minor_version TEXT)" #define TABLE_CONNDETAILS "CREATE TABLE conndetails (Id INTEGER PRIMARY KEY NOT NULL, position INTEGER, ObjectbrowserBkcolor TEXT, ObjectbrowserFgcolor TEXT, isfocussed INTEGER, \ Name TEXT , Host TEXT , User TEXT ,Password TEXT ,Port TEXT, StorePassword TEXT,keep_alive TEXT,Database TEXT ,compressedprotocol TEXT,defaulttimeout TEXT,\ - waittimeoutvalue TEXT,Tunnel TEXT,Http TEXT ,HTTPTime TEXT,HTTPuds TEXT,HTTPudsPath TEXT , Is401 TEXT,IsProxy TEXT,Proxy TEXT , ProxyUser TEXT, ProxyPwd TEXT , ProxyPort TEXT , User401 TEXT , Pwd401 TEXT , ContentType TEXT , HttpEncode TEXT,SSH TEXT,SshUser TEXT,SshPwd TEXT,SshHost TEXT,SshPort TEXT,SshForHost TEXT,SshPasswordRadio TEXT,SSHPrivateKeyPath TEXT,SshSavePassword TEXT,SslChecked TEXT,SshAuth TEXT,Client_Key TEXT,Client_Cert TEXT,CA TEXT,Cipher TEXT,sqlmode_global TEXT,sqlmode_value TEXT,init_command TEXT)" + waittimeoutvalue TEXT,Tunnel TEXT,Http TEXT ,HTTPTime TEXT,HTTPuds TEXT,HTTPudsPath TEXT , Is401 TEXT,IsProxy TEXT,Proxy TEXT , ProxyUser TEXT, ProxyPwd TEXT , ProxyPort TEXT , User401 TEXT , Pwd401 TEXT , ContentType TEXT , HttpEncode TEXT,SSH TEXT,SshUser TEXT,SshPwd TEXT,SshHost TEXT,SshPort TEXT,SshForHost TEXT,SshPasswordRadio TEXT,SSHPrivateKeyPath TEXT,SshSavePassword TEXT,SslChecked TEXT,SshAuth TEXT,Client_Key TEXT,Client_Cert TEXT,CA TEXT,Cipher TEXT,sqlmode_global TEXT,sqlmode_value TEXT,init_command TEXT,readonly TEXT)" + #define TABLE_TABDETAILS "CREATE TABLE tabdetails (Id INTEGER ,\ Tabid INTEGER, Tabtype INTEGER DEFAULT 0, isedited INTEGER DEFAULT 0,position INTEGER, leftortoppercent INTEGER, title TEXT,tooltip TEXT,isfile INTEGER, isfocussed INTEGER, content TEXT, \ FOREIGN KEY(Id) REFERENCES conndetails(Id) ON DELETE CASCADE ) " @@ -2403,9 +2404,9 @@ FrameWindow::AddTextInCombo(const wyWChar * text) seldb.SetAs(text); if(pGlobals->m_pcmainwin->m_sessionname.GetLength()) - title.Sprintf("%s-%s/%s %s",pGlobals->m_pcmainwin->m_sessionname.GetString(), wnd->m_title.GetString(), seldb.GetString(), wnd->m_tunneltitle.GetString()); + title.Sprintf("%s-%s/%s %s %s",pGlobals->m_pcmainwin->m_sessionname.GetString(), wnd->m_title.GetString(), seldb.GetString(), wnd->m_tunneltitle.GetString(), wnd->m_conninfo.m_isreadonly == wyTrue?"- Read-Only":"" ); else - title.Sprintf("%s/%s %s", wnd->m_title.GetString(), seldb.GetString(), wnd->m_tunneltitle.GetString()); + title.Sprintf("%s/%s %s %s", wnd->m_title.GetString(), seldb.GetString(), wnd->m_tunneltitle.GetString(), wnd->m_conninfo.m_isreadonly == wyTrue?"- Read-Only":"" ); SetWindowText(wnd->m_hwnd, title.GetAsWideChar()); @@ -2498,7 +2499,9 @@ FrameWindow::OnWmCommand(WPARAM wParam) ptabdbsearch = (TabDbSearch*) pcquerywnd->m_pctabmodule->GetActiveTabType(); } ptransaction = (Transactions*) GetActiveWin()->m_ptransaction; - + + // if(pcquerywnd && pGlobals->m_entlicense.CompareI("Professional") == 0) + // pcquerywnd->m_conninfo.m_isreadonly = wyFalse; #endif //connection tab object @@ -2705,9 +2708,15 @@ FrameWindow::OnWmCommand(WPARAM wParam) break; #endif - case IDM_EXECUTE: case ACCEL_QUERYUPDATE: case ACCEL_QUERYUPDATE_KEY: +#ifndef COMMUNITY + if(pcquerywnd->m_conninfo.m_isreadonly == wyTrue) + { + break; + } +#endif + case IDM_EXECUTE: case ACCEL_EXECUTE_MENU: if(!ptabeditor) break; @@ -3197,11 +3206,15 @@ pGlobals->m_pcmainwin->m_closealltrans = 1; case ACCEL_IMPORTCSV: case ID_IMPORT_FROMCSV: + if(pcquerywnd->m_conninfo.m_isreadonly == wyTrue) + break; if(hwndactive) pcquerywnd->m_pcqueryobject->ImportFromCSV(pcquerywnd->m_tunnel, &pcquerywnd->m_mysql); break; case ACCEL_IMPORTXML: case ID_IMPORT_FROMXML: + if(pcquerywnd->m_conninfo.m_isreadonly == wyTrue) + break; if(hwndactive) pcquerywnd->m_pcqueryobject->ImportFromXML(pcquerywnd->m_tunnel, &pcquerywnd->m_mysql); break; @@ -3216,6 +3229,12 @@ pGlobals->m_pcmainwin->m_closealltrans = 1; case ACCEL_FLUSH: case ID_TOOLS_FLUSH: +#ifndef COMMUNITY + if(pcquerywnd->m_conninfo.m_isreadonly == wyTrue) + { + break; + } +#endif if(hwndactive) pcquerywnd->ShowFlushDlg(); break; @@ -3276,6 +3295,12 @@ pGlobals->m_pcmainwin->m_closealltrans = 1; case ACCEL_REORDER: case ID_OBJECT_REORDER: +#ifndef COMMUNITY + if(pcquerywnd->m_conninfo.m_isreadonly == wyTrue) + { + break; + } +#endif if(hwndactive ) pcquerywnd->m_pctabmodule->CreateTableTabInterface(pcquerywnd, wyTrue, TABCOLUMNS); //pcquerywnd->m_pcqueryobject->ReorderColumns(); @@ -3416,7 +3441,7 @@ pGlobals->m_pcmainwin->m_closealltrans = 1; case ID_OBJECT_INSERTSTMT: case ACCEL_INSERT: - if(hwndactive && peditorbase) + if(hwndactive && peditorbase && pcquerywnd->m_conninfo.m_isreadonly == wyFalse) { pcquerywnd->m_pcqueryobject->CreateInsertStmt(); EditorFont::SetLineNumberWidth(peditorbase->m_hwnd); @@ -3425,7 +3450,7 @@ pGlobals->m_pcmainwin->m_closealltrans = 1; case ID_OBJECT_DELETESTMT: case ACCEL_DELETE: - if(hwndactive && peditorbase) + if(hwndactive && peditorbase && pcquerywnd->m_conninfo.m_isreadonly == wyFalse) { pcquerywnd->m_pcqueryobject->CreateDeleteStmt(); EditorFont::SetLineNumberWidth(peditorbase->m_hwnd); @@ -3434,7 +3459,7 @@ pGlobals->m_pcmainwin->m_closealltrans = 1; case ID_OBJECT_UPDATESTMT: case ACCEL_UPDATE: - if(hwndactive && peditorbase) + if(hwndactive && peditorbase && pcquerywnd->m_conninfo.m_isreadonly == wyFalse) { pcquerywnd->m_pcqueryobject->CreateUpdateStmt(); EditorFont::SetLineNumberWidth(peditorbase->m_hwnd); @@ -4921,13 +4946,7 @@ FrameWindow::OnActiveConn() wyInt32 itemcount, size; HMENU hmenu; - wyInt32 menugrayitems[] = { IDM_FILE_NEWSAMECONN, IDM_FILE_CLOSECONNECTION, ID_NEW_EDITOR, - ID_OBJECT_CREATEVIEW, ID_DB_CREATEVIEW, ID_OBJECT_CREATESTOREDPROCEDURE, ID_DB_CREATESTOREDPROCEDURE, - ID_OBJECT_CREATEFUNCTION,ID_DB_CREATEFUNCTION, ID_OBJECT_CREATEEVENT, ID_DB_CREATEEVENT, - ID_OBJECT_CREATETRIGGER,ID_DB_CREATETRIGGER, ID_OBJECT_ALTERVIEW, ID_OBJECT_ALTERSTOREDPROCEDURE, - ID_OBJECT_ALTERFUNCTION, ID_OBJECT_ALTERTRIGGER, ID_OBJECT_DROPVIEW, - ID_OBJECT_DROPSTOREDPROCEDURE,ID_OBJECT_DROPFUNCTION, ID_OBJECT_DROPTRIGGER, - ID_OBJECTS_RENAMEVIEW, ID_OBJECTS_RENAMETRIGGER,ID_FILE_RENAMETAB, + wyInt32 menugrayitems[] = { IDM_FILE_NEWSAMECONN, IDM_FILE_CLOSECONNECTION, ID_NEW_EDITOR, ID_FILE_RENAMETAB, ID_FILE_CLOSETAB, IDM_FILE_CLOSECONNECTION, IDM_FILE_CLOASEALL, IDM_FILE_OPENSQL, IDM_FILE_OPENSQLNEW, IDM_FILE_SAVESQL, IDM_FILE_SAVEAS, @@ -4936,25 +4955,33 @@ FrameWindow::OnActiveConn() IDM_EDIT_REPLACE, IDM_EDIT_GOTO, IDM_REFRESHOBJECT, IDM_OBCOLOR , ID_EDIT_INSERTTEMPLATES, IDM_EDIT_RESULT_TEXT, IDC_EDIT_SHOWOBJECT, IDC_EDIT_SHOWRESULT, IDC_EDIT_SHOWEDIT, IDM_EDIT_ADVANCED_UPPER, IDM_EDIT_ADVANCED_LOWER, - IDM_EDIT_ADVANCED_COMMENT, IDM_EDIT_ADVANCED_REMOVE, - IDM_EDIT_MANPF, IDM_EDIT_ADDSQL, - IDM_IMEX_EXPORTDATA, ID_IMPORTEXPORT_EXPORTTABLES,ID_IMEX_TEXTFILE, ID_TOOLS_FLUSH, IDM_TOOLS_TABLEDIAG, ID_HISTORY, ID_INFOTAB, - ID_SHOW_STATUS, ID_SHOW_VARIABLES, ID_SHOW_PROCESSLIST, ID_TOOLS_USERMANAGER, IDC_DIFFTOOL, + IDM_EDIT_ADVANCED_COMMENT, IDM_EDIT_ADVANCED_REMOVE, IDM_DB_REFRESHOBJECT, ID_DATASEARCH, + IDM_EDIT_MANPF, IDM_EDIT_ADDSQL, IDM_TOOLS_TABLEDIAG, ID_HISTORY, ID_INFOTAB, + ID_SHOW_STATUS, ID_SHOW_VARIABLES, ID_SHOW_PROCESSLIST, ID_TOOLS_USERMANAGER, ID_IMPORTEXPORT_DBEXPORTTABLES, + IDM_WINDOW_CASCADE, IDM_WINDOW_TILE, IDM_WINDOWS_ICONARRANGE, ID_REFRESHFAVORITES, ID_OBJECT_SELECTSTMT, + ID_REBUILDTAGS, ID_ORGANIZEFAVORITES, IDM_IMEX_EXPORTDATA, ID_IMPORTEXPORT_EXPORTTABLES,ID_IMEX_TEXTFILE, + ID_OBJECT_MANINDEX, ID_IMPORTEXPORT_TABLESEXPORTTABLES, ID_OBJECT_MAINMANINDEX, IDM_TABLE_RELATION, + ID_IMPORTEXPORT_DBEXPORTTABLES2, ID_IMEX_TEXTFILE2, + ID_EXPORT_EXPORTTABLEDATA, ID_OBJECT_EXPORTVIEW, + ID_EXPORT_AS, ID_EXPORT_ASXML, ID_EXPORT_ASHTML, ID_OBJECT_VIEWDATA, ID_TABLE_OPENINNEWTAB, ID_OBJECT_ADVANCED, + ID_OBJECT_CREATEVIEW, ID_DB_CREATEVIEW, ID_OBJECT_CREATESTOREDPROCEDURE, ID_DB_CREATESTOREDPROCEDURE, + ID_OBJECT_CREATEFUNCTION,ID_DB_CREATEFUNCTION, ID_OBJECT_CREATEEVENT, ID_DB_CREATEEVENT, + ID_OBJECT_CREATETRIGGER,ID_DB_CREATETRIGGER, ID_OBJECT_ALTERVIEW, ID_OBJECT_ALTERSTOREDPROCEDURE, + ID_OBJECT_ALTERFUNCTION, ID_OBJECT_ALTERTRIGGER, ID_OBJECT_DROPVIEW, + ID_OBJECT_DROPSTOREDPROCEDURE,ID_OBJECT_DROPFUNCTION, ID_OBJECT_DROPTRIGGER, + ID_OBJECTS_RENAMEVIEW, ID_OBJECTS_RENAMETRIGGER, + ID_TOOLS_FLUSH, IDC_DIFFTOOL, IDM_CREATEDATABASE,ID_OBJECT_TRUNCATEDATABASE, ID_DB_TABLE_MAKER, ID_TABLE_MAKER, IDM_ALTERDATABASE,ID_OPEN_COPYDATABASE, - ID_IMPORTEXPORT_DBEXPORTTABLES, ID_OBJECT_DROPDATABASE, ID_OBJECT_EMPTYDATABASE, ID_OBJECT_CREATESCHEMA, - ID_OBJECT_TABLEEDITOR, ID_OBJECT_MANINDEX, ID_IMPORTEXPORT_TABLESEXPORTTABLES, - ID_EXPORT_AS, ID_EXPORT_ASXML, ID_EXPORT_ASHTML, + ID_OBJECT_TABLEEDITOR, ID_OBJECT_COPYTABLE, ID_IMPORT_FROMCSV,ID_IMPORT_FROMXML, ID_OBJECT_RENAMETABLE, ID_OBJECT_CLEARTABLE, ID_OBJECT_DROPTABLE, ID_OBJECT_REORDER, ID_OBJECT_CHANGETABLETYPE_ISAM, ID_OBJECT_CHANGETABLETYPE_MYISAM, ID_OBJECT_CHANGETABLETYPE_HEAP, ID_OBJECT_CHANGETABLETYPE_MERGE, ID_OBJECT_CHANGETABLETYPE_INNODB, ID_OBJECT_CHANGETABLETYPE_BDB, ID_OBJECT_CHANGETABLETYPE_GEMINI, - ID_OBJECT_VIEWDATA, ID_TABLE_OPENINNEWTAB, ID_OBJECT_ADVANCED, ID_OBJECT_INSERTSTMT, ID_OBJECT_UPDATESTMT,ID_OBJECT_DELETESTMT, ID_OBJECT_SELECTSTMT, - ID_OBJECT_DROPFIELD, ID_COLUMNS_DROPINDEX, ID_OBJECT_MAINMANINDEX, IDM_TABLE_RELATION, - IDM_WINDOW_CASCADE, IDM_WINDOW_TILE, IDM_WINDOWS_ICONARRANGE, ID_OPEN_COPYTABLE, - ID_IMPORTEXPORT_DBEXPORTTABLES2, ID_IMEX_TEXTFILE2, ID_REBUILDTAGS, ID_ORGANIZEFAVORITES, ID_REFRESHFAVORITES, - ID_EXPORT_EXPORTTABLEDATA, ID_OBJECT_EXPORTVIEW, IDM_DB_REFRESHOBJECT, ID_DATASEARCH, ID_TRANSACTION_SETAUTOCOMMIT, ID_TRX_REPEATABLEREAD, ID_TRX_READCOMMITED, ID_TRX_READUNCOMMITED, + ID_OBJECT_INSERTSTMT, ID_OBJECT_UPDATESTMT,ID_OBJECT_DELETESTMT, + ID_OBJECT_DROPFIELD, ID_COLUMNS_DROPINDEX, ID_OPEN_COPYTABLE, + ID_TRANSACTION_SETAUTOCOMMIT, ID_TRX_REPEATABLEREAD, ID_TRX_READCOMMITED, ID_TRX_READUNCOMMITED, ID_TRX_SERIALIZABLE, ID_WITHCONSISTENTSNAPSHOT_READONLY, ID_WITHCONSISTENTSNAPSHOT_READWRITE, ID_STARTTRANSACTION_READONLY, ID_STARTTRANSACTION_READWRITE, ID_COMMIT_ANDCHAIN, ID_COMMIT_ANDNOCHAIN, ID_COMMIT_RELEASE, @@ -5010,7 +5037,7 @@ FrameWindow::OnActiveConn() else { hmenu = GetMenu(m_hwndmain); - + for(itemcount = 0; itemcount < (sizeof(menugrayitems)/sizeof(menugrayitems[0])); itemcount++) EnableMenuItem(hmenu, menugrayitems[itemcount], MF_ENABLED); @@ -5323,6 +5350,12 @@ FrameWindow::HandleFirstToolBar() for(count = 0; count < size; count++) SendMessage(m_hwndtool, TB_SETSTATE,(WPARAM)nid[count], TBSTATE_ENABLED); } + #ifndef COMMUNITY + if(pcquerywnd->m_conninfo.m_isreadonly == wyTrue) + { + SendMessage(m_hwndtool, TB_SETSTATE,ACCEL_QUERYUPDATE, TBSTATE_INDETERMINATE); + } +#endif } void @@ -7948,6 +7981,12 @@ FrameWindow::OnCreateDatabase(HWND hwndactive, MDIWindow *wnd) { wyWChar *dbname; wyInt32 ret; +#ifndef COMMUNITY + if(GetActiveWin()->m_conninfo.m_isreadonly == wyTrue) + { + return; + } +#endif ret = DialogBoxParam(pGlobals->m_hinstance, MAKEINTRESOURCE(IDD_CREATEDB), hwndactive, FrameWindow::CreateObjectDlgProc,(LPARAM)"CreateDB" ); @@ -8552,6 +8591,12 @@ FrameWindow::OnTableDiag(MDIWindow *wnd) void FrameWindow::OnImportFromSQL(MDIWindow *wnd) { +#ifndef COMMUNITY + if(wnd->m_conninfo.m_isreadonly == wyTrue) + { + return; + } +#endif ImportBatch *cib = new ImportBatch(); if(cib) @@ -9163,7 +9208,12 @@ FrameWindow::EnableToolButtonsAndCombo(HWND hwndtool, HWND hwndsecondtool, HWND for(i = 0; i < count; ++i) { state = TBSTATE_ENABLED; - +#ifndef COMMUNITY + if(wnd->m_conninfo.m_isreadonly == wyTrue && + (tb2id[i] == IDC_DIFFTOOL || tb2id[i] == ID_IMEX_TEXTFILE || + tb2id[i] == ID_OBJECT_MAINMANINDEX || tb2id[i] == ID_OPEN_COPYDATABASE || tb2id[i] == ACCEL_MANREL)) + state = TBSTATE_INDETERMINATE; +#endif if(tb2id[i] == ID_EXPORT_AS || tb2id[i] == ID_OBJECT_MAINMANINDEX || tb2id[i] == ACCEL_MANREL) { id = image; @@ -9251,7 +9301,12 @@ FrameWindow::EnableToolButtonsAndCombo(HWND hwndtool, HWND hwndsecondtool, HWND state = TBSTATE_INDETERMINATE; } } - +#ifndef COMMUNITY + if(wnd->m_conninfo.m_isreadonly == wyTrue && tb1id[i] == ACCEL_QUERYUPDATE) + { + state = TBSTATE_INDETERMINATE; + } +#endif SendMessage(hwndtool, TB_SETSTATE, (WPARAM)tb1id[i], state); } @@ -9259,7 +9314,12 @@ FrameWindow::EnableToolButtonsAndCombo(HWND hwndtool, HWND hwndsecondtool, HWND for(i = 0; i < count; ++i) { - SendMessage(hwndsecondtool, TB_SETSTATE, (WPARAM)tb3id[i], TBSTATE_ENABLED); +#ifndef COMMUNITY + if(wnd->m_conninfo.m_isreadonly == wyTrue && (tb3id[i] != ID_POWERTOOLS_SCHEDULEEXPORT && tb3id[i] != IDC_TOOLS_NOTIFY )) + SendMessage(hwndsecondtool, TB_SETSTATE, (WPARAM)tb3id[i], TBSTATE_INDETERMINATE); + else +#endif + SendMessage(hwndsecondtool, TB_SETSTATE, (WPARAM)tb3id[i], TBSTATE_ENABLED); } } else @@ -11570,6 +11630,29 @@ sessionsavesproc(void *arg) } else { + const wyChar *desc, *majorver , *minorver ; + sqlitequery.Sprintf("SELECT * from schema_version"); + pGlobals->m_sqliteobj->Prepare(&res, sqlitequery.GetString()); + if(pGlobals->m_sqliteobj->Step(&res, wyFalse) && pGlobals->m_sqliteobj->GetLastCode() == SQLITE_ROW) + { + desc = pGlobals->m_sqliteobj->GetText(&res, 0); + majorver = pGlobals->m_sqliteobj->GetText(&res, 1); + minorver = pGlobals->m_sqliteobj->GetText(&res, 2); + } + + if(desc != NULL && (strcmp(SCHEMA_MAJOR_VERSION, majorver) != 0 || strcmp(SCHEMA_MINOR_VERSION, minorver) != 0 )) + { + //common option for version changre + sqlitequery.SetAs(""); + sqlitequery.Sprintf("UPDATE schema_version set description = \"%s\", major_version=\"%s\", minor_version = \"%s\" where description = \"%s\"", SCHEMA_DESCRIPTION, SCHEMA_MAJOR_VERSION, SCHEMA_MINOR_VERSION, desc); + pGlobals->m_sqliteobj->Execute(&sqlitequery, &sqliteerr); + if(strcmp(SCHEMA_DESCRIPTION, "12.34") == 0)//adding cloumn for readonly in version 12.34 + { + sqlitequery.SetAs(""); + sqlitequery.Sprintf("ALTER TABLE conndetails ADD COLUMN 'readonly' INTEGER default 0"); + pGlobals->m_sqliteobj->Execute(&sqlitequery, &sqliteerr); + } + } sqlitequery.Sprintf("SELECT type FROM sqlite_master WHERE name='sessiondetails'"); pGlobals->m_sqliteobj->Prepare(&res, sqlitequery.GetString()); if(!pGlobals->m_sqliteobj->Step(&res, wyFalse) || pGlobals->m_sqliteobj->GetLastCode() != SQLITE_ROW) diff --git a/src/FrameWindowHelper.cpp b/src/FrameWindowHelper.cpp index 2d30543..7e836f6 100644 --- a/src/FrameWindowHelper.cpp +++ b/src/FrameWindowHelper.cpp @@ -51,6 +51,7 @@ #define ONE 1 #define TWO 2 #define IN_TRANSACTION -10 +#define IN_READONLY -20 extern PGLOBALS pGlobals; extern HACCEL g_accel; @@ -105,8 +106,17 @@ wyInt32 my_query(MDIWindow *wnd, Tunnel * tunnel, PMYSQL mysql, const wyChar *qu str.Clear(); } #ifndef COMMUNITY - if(pGlobals->m_entlicense.CompareI("Professional") != 0) - { + // if(pGlobals->m_entlicense.CompareI("Professional") != 0) + // { + if(wnd->m_conninfo.m_isreadonly == wyTrue) + { + if(newquery) + str.SetAs(newquery); + else + str.SetAs(query); + if(ReadOnlyQueryAllow(&str) == wyFalse) + return IN_READONLY; + } if(wnd->m_ptransaction && (wnd->m_ptransaction->m_starttransactionenabled == wyFalse)) { if(newquery) @@ -115,7 +125,7 @@ wyInt32 my_query(MDIWindow *wnd, Tunnel * tunnel, PMYSQL mysql, const wyChar *qu str.SetAs(query); transactioncheck = wnd->m_ptransaction->TransactionContinue(&str, fortransactionprompt); } - } + // } if(transactioncheck == 0) //dosent matter for professional, as initial value of transactioncheck is != 0 return IN_TRANSACTION; #endif @@ -1677,6 +1687,120 @@ CheckTransactionStart(MDIWindow *wnd, const wyChar *query) } return wyFalse; } +wyBool +ReadOnlyQueryAllow(wyString *str) +{ + wyBool ret = wyFalse; + if(str->FindI("SHOW") == 0) + { + ret = wyTrue; + } + else if(str->FindI("Select") == 0) + { + ret = wyTrue; + } + else if(str->FindI("Describe") == 0) + { + ret = wyTrue; + } + else if(str->FindI("Explain") == 0) + { + ret = wyTrue; + } + else if(str->FindI("use") == 0) + { + ret = wyTrue; + } + else if(str->FindI("set") == 0) + { + str->SetAs(RemoveExtraSpaces(str->GetString())); + if(str->FindI("global") == 4) + ret = wyFalse; + else if(str->FindI("@@global") == 4) + ret = wyFalse; + else + ret = wyTrue; + } + else if(str->FindI("help") == 0) + { + ret = wyTrue; + } + else if(str->FindI("handler") == 0) + { + ret = wyTrue; + } + else if(str->FindI("call") == 0) + { + ret = wyTrue; + } + else if(str->FindI("Start") == 0) + { + str->SetAs(RemoveExtraSpaces(str->GetString())); + if(str->FindI("Transaction") == 6) + ret = wyTrue; + } + else if(str->FindI("commit") == 0) + { + ret = wyTrue; + } + else if(str->FindI("rollback") == 0) + { + ret = wyTrue; + } + else if(str->FindI("do") == 0) + { + ret = wyTrue; + } + else if(str->FindI("savepoint") == 0) + { + ret = wyTrue; + } + /* + With create we change return to wyFalse since begin will be present in procedures which we shouldn't allow.. + Begin for starting a transaction should be allowed + */ + else if(str->FindI("create") == 0) + { + ret = wyFalse; + } + else if(str->FindI("begin") == 0) + { + ret = wyTrue; + } + else if(str->FindI("check") == 0) + { + ret = wyTrue; + } + else if(str->FindI("analyze") == 0) + { + ret = wyTrue; + } + else if(str->FindI("optimize") == 0) + { + ret = wyTrue; + } + return ret; +} +wyString +RemoveExtraSpaces(wyString query) +{ + wyInt32 len = query.GetLength(); + for(int i = 0; i < len; i++) + { + if(query.GetCharAt(i) == ' ') + { + wyInt32 j = i + 1; + while(query.GetCharAt(j) == ' ') + j++; + if(j > i+1) + { + query.Replace( i , j - i, " "); + } + break; + } + } + return query.GetString(); +} #endif wyBool ChangeContextDB(Tunnel * tunnel, PMYSQL mysql, const wyChar *query, wyBool changeincombo) diff --git a/src/GUIHelper.cpp b/src/GUIHelper.cpp index 7f6fb4c..975dbcb 100644 --- a/src/GUIHelper.cpp +++ b/src/GUIHelper.cpp @@ -48,7 +48,7 @@ extern PGLOBALS pGlobals; - +#define READONLYUNCHECKTILLHERE 18 #define DEF_BULK_SIZE 1024 DlgControl::DlgControl(HWND hwnd, wyInt32 id, RECT* rect, wyBool issizex, wyBool issizey) @@ -725,6 +725,13 @@ ChangeEditMenuItem(HMENU hmenu) }*/ } +#ifndef COMMUNITY + if(pcquerywnd->m_conninfo.m_isreadonly == wyTrue) + { + VERIFY(EnableMenuItem(hmenu, ACCEL_QUERYUPDATE, MF_GRAYED)!= -1); + } +#endif + // Check if UNDO, REDO and PASTE can be done. if((hwnd == pceditorbase->m_hwnd)&&(SendMessage(hwnd, SCI_CANUNDO, 0, 0))) VERIFY(EnableMenuItem(hmenu, IDM_EDIT_UNDO, MF_ENABLED)!= -1); @@ -1184,6 +1191,13 @@ EnableToolItems(HMENU hmenu) EnableMenuItem(hmenu, IDM_IMEX_EXPORTDATA, MF_GRAYED | MF_BYCOMMAND); } EnableDisableExportMenuItem(); +#ifndef COMMUNITY + if(pcquerywnd->m_conninfo.m_isreadonly == wyTrue) + { + EnableMenuItem(hmenu, ID_TOOLS_FLUSH, MF_GRAYED | MF_BYCOMMAND); + EnableMenuItem(hmenu, ID_IMEX_TEXTFILE2, MF_GRAYED | MF_BYCOMMAND); + } +#endif return wyTrue; } @@ -1228,6 +1242,17 @@ EnableDBItems(HMENU hmenu) //first disable create event menu EnableMenuItem(hmenu, ID_DB_CREATEEVENT, MF_GRAYED| MF_BYCOMMAND); +#ifndef COMMUNITY + if(pcquerywnd->m_conninfo.m_isreadonly == wyTrue) + { + EnableMenuItem(hmenu, ID_IMEX_TEXTFILE, MF_GRAYED| MF_BYCOMMAND); + EnableMenuItem(hmenu, ID_IMPORT_EXTERNAL_DATA, MF_GRAYED| MF_BYCOMMAND); + EnableMenuItem(hmenu, IDM_CREATEDATABASE, MF_GRAYED| MF_BYCOMMAND); + EnableMenuItem(hmenu, ID_OBJECT_CREATESCHEMA, MF_ENABLED| MF_BYCOMMAND); + //EnableMenuItem(hmenu, ID_OPEN_COPYDATABASE, MF_GRAYED| MF_BYCOMMAND); + return wyTrue; + } +#endif // check whether database item is selected or not. image = pcquerywnd->m_pcqueryobject->GetSelectionImage(); @@ -1265,17 +1290,18 @@ EnableTableItems(HMENU hmenu) MDIWindow *pcquerywnd; wyInt32 image, size, count, state, uptorelation = 5; wyInt32 nid[] = {ID_OPEN_COPYTABLE, ID_TABLE_MAKER, ID_OBJECT_TABLEEDITOR, ID_OBJECT_MANINDEX, - IDM_TABLE_RELATION, ID_IMPORTEXPORT_TABLESEXPORTTABLES, ID_EXPORT_AS, - ID_IMPORT_FROMCSV, ID_IMPORT_FROMXML, + IDM_TABLE_RELATION, ID_IMPORT_FROMCSV, ID_IMPORT_FROMXML, ID_OBJECT_COPYTABLE, ID_OBJECT_RENAMETABLE, ID_OBJECT_CLEARTABLE, ID_OBJECT_REORDER, - ID_OBJECT_DROPTABLE, ID_OBJECT_REORDER, ID_OBJECT_VIEWDATA, ID_TABLE_OPENINNEWTAB, - ID_OBJECT_ADVANCED, ID_OBJECT_INSERTSTMT, ID_OBJECT_UPDATESTMT, ID_OBJECT_DELETESTMT, ID_TABLE_MAKER, ID_OBJECT_CREATETRIGGER, - ID_OBJECT_SELECTSTMT, ID_EXPORT_EXPORTTABLEDATA}; + ID_OBJECT_DROPTABLE, ID_OBJECT_REORDER, + ID_OBJECT_INSERTSTMT, ID_OBJECT_UPDATESTMT, ID_OBJECT_DELETESTMT, ID_TABLE_MAKER, ID_OBJECT_CREATETRIGGER, + ID_OBJECT_VIEWDATA, ID_TABLE_OPENINNEWTAB, ID_OBJECT_ADVANCED, + ID_IMPORTEXPORT_TABLESEXPORTTABLES, ID_EXPORT_AS, ID_OBJECT_SELECTSTMT, ID_EXPORT_EXPORTTABLEDATA}; if(pGlobals->m_pcmainwin->m_connection->m_enttype == ENT_PRO) HandleDBMenuOptionsPRO(hmenu); - + VERIFY(pcquerywnd = GetActiveWin()); + // first grey all the item state = MF_GRAYED; @@ -1290,9 +1316,13 @@ EnableTableItems(HMENU hmenu) // check whether database item is selected or not. image = pcquerywnd->m_pcqueryobject->GetSelectionImage(); - if(image == NTABLES || image == NDATABASE) + if((image == NTABLES || image == NDATABASE )) { +#ifndef COMMUNITY + if(pcquerywnd->m_conninfo.m_isreadonly == wyFalse) //For database enable only - 'Create Table' + { +#endif COMMUNITY EnableMenuItem(hmenu, ID_TABLE_MAKER, MF_ENABLED | MF_BYCOMMAND); //for tables folder @@ -1301,12 +1331,19 @@ EnableTableItems(HMENU hmenu) EnableMenuItem(hmenu, ID_OPEN_COPYTABLE, MF_ENABLED | MF_BYCOMMAND); EnableMenuItem(hmenu, ID_IMPORTEXPORT_TABLESEXPORTTABLES, MF_ENABLED | MF_BYCOMMAND); } +#ifndef COMMUNITY + } +#endif COMMUNITY } else if(image == NTABLE || image == NCOLUMN || image == NPRIMARYKEY || image == NINDEX || image == NPRIMARYINDEX) { state = MF_ENABLED; - - for(count = 0; count < size; count++) + count = 0; +#ifndef COMMUNITY + if(pcquerywnd->m_conninfo.m_isreadonly == wyTrue) + count = READONLYUNCHECKTILLHERE; //nid before 18 must remain disabled for readonly +#endif + for(; count < size; count++) EnableMenuItem(hmenu, nid[count], state | MF_BYCOMMAND); if(!IsMySQL5010(pcquerywnd->m_tunnel, &pcquerywnd->m_mysql)) @@ -1317,8 +1354,12 @@ EnableTableItems(HMENU hmenu) } else if(image == NFOLDER) { +#ifndef COMMUNITY + if(pcquerywnd->m_conninfo.m_isreadonly == wyTrue) + state = MF_GRAYED; +#else state = MF_ENABLED; - +#endif for(count = 0; count < uptorelation; count++) VERIFY(EnableMenuItem(hmenu, nid[count], state | MF_BYCOMMAND)!= -1); } @@ -1331,7 +1372,12 @@ EnableTableItems(HMENU hmenu) VERIFY(EnableMenuItem(hmenu, ID_OBJECT_DELETESTMT, MF_GRAYED | MF_BYCOMMAND)!= -1); VERIFY(EnableMenuItem(hmenu, ID_OBJECT_SELECTSTMT, MF_GRAYED | MF_BYCOMMAND)!= -1); } - +#ifndef COMMUNITY + if(pcquerywnd->m_conninfo.m_isreadonly == wyTrue) + { + EnableMenuItem(hmenu, ID_IMPORT_EXTERNAL_DATA, MF_GRAYED | MF_BYCOMMAND); + } +#endif /*Adding Table engines to Table menu. Gets the 'Other Table Option' sub meno @@ -1345,8 +1391,7 @@ EnableTableItems(HMENU hmenu) if(!hmenuengine) return wyFalse; - pcquerywnd->InsertEnginesMenuItems(hmenuengine); - + pcquerywnd->InsertEnginesMenuItems(hmenuengine); return wyTrue; } @@ -1368,10 +1413,24 @@ EnableColumnItems(HMENU hmenu) // if mysql version is below 5.1 then dissable all event menus if(!IsMySQL5010(pcquerywnd->m_tunnel, &pcquerywnd->m_mysql)) DisableAdvMenu(hmenu); - + // check whether database item is selected or not. image = pcquerywnd->m_pcqueryobject->GetSelectionImage(); - +#ifndef COMMUNITY + if(pcquerywnd->m_conninfo.m_isreadonly == wyTrue) + { + DisableAdvMenu(hmenu); + EnableMenuItem(hmenu, ID_TABLE_OPENINNEWTAB, MF_ENABLED | MF_BYCOMMAND); + EnableMenuItem(hmenu, ID_OBJECT_DROPFIELD, MF_GRAYED | MF_BYCOMMAND); + EnableMenuItem(hmenu, ID_OBJECT_MAINMANINDEX, MF_GRAYED | MF_BYCOMMAND); + if(image == NVIEWSITEM) + { + EnableMenuItem(hmenu, ID_OBJECT_VIEWDATA, MF_ENABLED | MF_BYCOMMAND); + EnableMenuItem(hmenu, ID_OBJECT_EXPORTVIEW, MF_ENABLED | MF_BYCOMMAND); + } + return wyTrue; + } +#endif if(image == NCOLUMN || image == NPRIMARYKEY) { DisableAdvMenu(hmenu); @@ -1452,7 +1511,6 @@ EnableColumnItems(HMENU hmenu) EnableMenuItem(hmenu, ID_OBJECT_ALTERTRIGGER, MF_ENABLED | MF_BYCOMMAND); EnableMenuItem(hmenu, ID_OBJECT_DROPTRIGGER, MF_ENABLED | MF_BYCOMMAND); EnableMenuItem(hmenu, ID_OBJECTS_RENAMETRIGGER, MF_ENABLED | MF_BYCOMMAND); - } else { @@ -1584,6 +1642,10 @@ InitConInfo(ConnectionInfo &consrc, ConnectionInfo &contgt) contgt.m_port = consrc.m_port; contgt.m_iscompress = consrc.m_iscompress; +#ifndef COMMUNITY +// if(pGlobals->m_entlicense.CompareI("Professional") != 0) + contgt.m_isreadonly = consrc.m_isreadonly; +#endif contgt.m_isdeftimeout = consrc.m_isdeftimeout; contgt.m_strwaittimeout.SetAs(consrc.m_strwaittimeout); //contgt.m_ispwdcleartext = consrc.m_ispwdcleartext; @@ -9090,7 +9152,10 @@ wyBool GetSessionDetails(wyWChar* conn, wyWChar* path, ConnectionInfo *conninfo, inimgr->IniGetString2(connstr.GetString(), "Database","", &conninfo->m_db, pathstr.GetString()); conninfo->m_iscompress = inimgr->IniGetInt2(connstr.GetString(), "compressedprotocol", 0, pathstr.GetString()) ? wyTrue: wyFalse; - +#ifndef COMMUNITY +// if(pGlobals->m_entlicense.CompareI("Professional") != 0) + conninfo->m_isreadonly = inimgr->IniGetInt2(connstr.GetString(), "readonly", 0, pathstr.GetString()) ? wyTrue: wyFalse; +#endif //Wait_TimeOut conninfo->m_isdeftimeout = inimgr->IniGetInt2(connstr.GetString(), "defaulttimeout", conninfo->m_isdeftimeout, pathstr.GetString())? wyTrue: wyFalse; inimgr->IniGetString2(connstr.GetString(), "waittimeoutvalue", WAIT_TIMEOUT_SERVER, &conninfo->m_strwaittimeout, pathstr.GetString()); @@ -9522,6 +9587,13 @@ wyBool GetSessionDetailsFromTable(wyWChar* path, ConnectionInfo *conninfo, wyInt conninfo->m_strwaittimeout.SetAs(WAIT_TIMEOUT_SERVER); #ifndef COMMUNITY + colval = sqliteobj->GetText(&res , "readonly"); + if(colval) + // if(pGlobals->m_entlicense.CompareI("Professional") != 0) + conninfo->m_isreadonly = sqliteobj->GetInt(&res , "readonly") ? wyTrue:wyFalse; + else + conninfo->m_isreadonly = wyFalse; + colval = sqliteobj->GetText(&res , "Tunnel"); if(colval) conninfo->m_ishttp = sqliteobj->GetInt(&res , "Tunnel") ? wyTrue:wyFalse; @@ -9694,6 +9766,7 @@ wyBool GetSessionDetailsFromTable(wyWChar* path, ConnectionInfo *conninfo, wyInt if(colval) conninfo->m_cipher.SetAs(colval); #endif + colval = sqliteobj->GetText(&res , "ObjectbrowserBkcolor"); if(colval) conninfo->m_rgbconn = sqliteobj->GetInt(&res , "ObjectbrowserBkcolor"); @@ -9824,6 +9897,9 @@ WriteFullSectionToFile(FILE *out_stream, wyInt32 conno, ConnectionInfo *coninfo, fputs(temp.GetString(), out_stream); #ifndef COMMUNITY + temp.Sprintf("readonly=%d\r\n", coninfo->m_isreadonly); + fputs(temp.GetString(), out_stream); + temp.Sprintf("Tunnel=%d\r\n", coninfo->m_ishttp); fputs(temp.GetString(), out_stream); @@ -10023,9 +10099,9 @@ WriteFullSectionToTable(wyString *sqlitequery, wyInt32 id, wyInt32 position, Con sqlite3_stmt* stmt; wySQLite *sqliteobj; sqliteobj = ssnsqliteobj ? ssnsqliteobj : pGlobals->m_sqliteobj; - sqlitequery->Sprintf("INSERT INTO conndetails (Id ,position ,ObjectbrowserBkcolor ,ObjectbrowserFgcolor ,isfocussed ,Name ,Host ,User ,Password ,Port ,StorePassword ,keep_alive ,Database ,compressedprotocol ,defaulttimeout ,waittimeoutvalue ,Tunnel ,Http ,HTTPTime ,HTTPuds ,HTTPudsPath , Is401 ,IsProxy ,Proxy , ProxyUser , ProxyPwd , ProxyPort , User401 , Pwd401 , ContentType , HttpEncode ,SSH ,SshUser ,SshPwd ,SshHost ,SshPort ,SshForHost ,SshPasswordRadio ,SSHPrivateKeyPath ,SshSavePassword ,SslChecked ,SshAuth ,Client_Key ,Client_Cert ,CA ,Cipher ,sqlmode_global ,sqlmode_value ,init_command ) VALUES \ - (? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,?)"); - + + sqlitequery->Sprintf("INSERT INTO conndetails (Id ,position ,ObjectbrowserBkcolor ,ObjectbrowserFgcolor ,isfocussed ,Name ,Host ,User ,Password ,Port ,StorePassword ,keep_alive ,Database ,compressedprotocol ,defaulttimeout ,waittimeoutvalue ,Tunnel ,Http ,HTTPTime ,HTTPuds ,HTTPudsPath , Is401 ,IsProxy ,Proxy , ProxyUser , ProxyPwd , ProxyPort , User401 , Pwd401 , ContentType , HttpEncode ,SSH ,SshUser ,SshPwd ,SshHost ,SshPort ,SshForHost ,SshPasswordRadio ,SSHPrivateKeyPath ,SshSavePassword ,SslChecked ,SshAuth ,Client_Key ,Client_Cert ,CA ,Cipher ,sqlmode_global ,sqlmode_value ,init_command ,readonly ) VALUES \ + (? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,?)"); sqliteobj->Prepare(&stmt,sqlitequery->GetString()); @@ -10196,6 +10272,8 @@ WriteFullSectionToTable(wyString *sqlitequery, wyInt32 id, wyInt32 position, Con sqliteobj->SetText(&stmt, 49, coninfo->m_initcommand.GetLength()?coninfo->m_initcommand.GetString():""); + sqliteobj->SetInt(&stmt, 50, coninfo->m_isreadonly); + sqliteobj->Step(&stmt, wyFalse); sqliteobj->Finalize(&stmt); diff --git a/src/MDIWindow.cpp b/src/MDIWindow.cpp index b78724b..e852710 100644 --- a/src/MDIWindow.cpp +++ b/src/MDIWindow.cpp @@ -143,7 +143,6 @@ MDIWindow::MDIWindow(HWND hwnd, ConnectionInfo * conninfo, wyString &dbname, wyS #ifndef COMMUNITY m_constatusparm = NULL; - m_ptransaction = NULL; #endif @@ -343,9 +342,9 @@ MDIWindow::CreateQueryWindow(HWND hwnd, PMYSQL mysql) title.Sprintf("%s-",pGlobals->m_pcmainwin->m_sessionname.GetString()); if(m_filterdb.GetLength()) - title.AddSprintf("%s/%s %s", m_title.GetString(), m_filterdb.GetString(), m_tunneltitle.GetString()); + title.AddSprintf("%s/%s %s %s", m_title.GetString(), m_filterdb.GetString(), m_tunneltitle.GetString(), GetActiveWin()->m_conninfo.m_isreadonly == wyTrue?"- Read-Only":"" ); else - title.AddSprintf("%s %s", m_title.GetString(), m_tunneltitle.GetString()); + title.AddSprintf("%s %s %s", m_title.GetString(), m_tunneltitle.GetString(),GetActiveWin()? (GetActiveWin()->m_conninfo.m_isreadonly == wyTrue?"- Read-Only":""):""); SetWindowText(hwndquery, title.GetAsWideChar()); @@ -3982,9 +3981,9 @@ MDIWindow::SetQueryWindowTitle() if(pGlobals->m_pcmainwin->m_sessionname.GetLength()) mdititle.Sprintf("%s-",pGlobals->m_pcmainwin->m_sessionname.GetString()); if(m_pcqueryobject->m_seldatabase.GetLength()) - mdititle.AddSprintf("%s/%s %s", m_title.GetString(), m_pcqueryobject->m_seldatabase.GetString(), m_tunneltitle.GetString()); + mdititle.AddSprintf("%s/%s %s %s", m_title.GetString(), m_pcqueryobject->m_seldatabase.GetString(), m_tunneltitle.GetString(), GetActiveWin()->m_conninfo.m_isreadonly == wyTrue?"- Read-Only":""); else - mdititle.AddSprintf("%s %s", m_title.GetString(), m_tunneltitle.GetString()); + mdititle.AddSprintf("%s %s %s", m_title.GetString(), m_tunneltitle.GetString(), GetActiveWin()?(GetActiveWin()->m_conninfo.m_isreadonly == wyTrue?"- Read-Only":""):""); // Setting the MDI window title SetWindowText(m_hwnd, mdititle.GetAsWideChar()); @@ -4310,7 +4309,10 @@ MDIWindow::InsertEnginesMenuItems(HMENU hmenu) state = MFS_GRAYED; else state = MFS_ENABLED; - +#ifndef COMMUNITY + if(GetActiveWin()->m_conninfo.m_isreadonly == wyTrue) + state = MFS_GRAYED; +#endif // remove all existing table engines while(DeleteMenu(hmenu, 0, MF_BYPOSITION)); diff --git a/src/ObjectBrowser.cpp b/src/ObjectBrowser.cpp index b1da8b6..1c67c22 100644 --- a/src/ObjectBrowser.cpp +++ b/src/ObjectBrowser.cpp @@ -1635,6 +1635,13 @@ CQueryObject::LoadTablesMenu(POINT *pnt) // Set menu draw property for drawing icon wyTheme::SetMenuItemOwnerDraw(htrackmenu); +#ifndef COMMUNITY + if(GetActiveWin()->m_conninfo.m_isreadonly == wyTrue) + { + EnableMenuItem(hmenu, ID_OPEN_COPYTABLE, MF_GRAYED | MF_BYCOMMAND); + EnableMenuItem(hmenu, ID_TABLE_MAKER, MF_GRAYED | MF_BYCOMMAND); + } +#endif VERIFY(TrackPopupMenu(htrackmenu, TPM_LEFTALIGN | TPM_RIGHTBUTTON, pnt->x, pnt->y, 0, pGlobals->m_pcmainwin->m_hwndmain, NULL)); @@ -1732,6 +1739,12 @@ CQueryObject::DropDatabase(Tunnel * tunnel, PMYSQL mysql) MYSQL_RES *res; MDIWindow *wnd = GetActiveWin(); wyInt32 isintransaction = 1; +#ifndef COMMUNITY + if(wnd->m_conninfo.m_isreadonly == wyTrue) + { + return wyTrue; + } +#endif item = GetSelectionImage(); VERIFY(hitem = TreeView_GetSelection(m_hwnd)); @@ -1830,6 +1843,12 @@ CQueryObject::DropTable(Tunnel * tunnel, PMYSQL mysql) MYSQL_RES *res; wyInt32 isintransaction = 1; +#ifndef COMMUNITY + if(GetActiveWin()->m_conninfo.m_isreadonly == wyTrue) + { + return wyTrue; + } +#endif VERIFY(hitem = TreeView_GetSelection(m_hwnd)); item = GetSelectionImage(); @@ -1919,7 +1938,12 @@ CQueryObject::DropField(Tunnel * tunnel, PMYSQL mysql) TabObject *pinfotab = NULL; TabMgmt *ptabmgmt = NULL; TabEditor *ptabeditor = NULL; - +#ifndef COMMUNITY + if(wnd->m_conninfo.m_isreadonly == wyTrue) + { + return wyTrue; + } +#endif VERIFY(hitem = TreeView_GetSelection(m_hwnd)); //Checks whether there is only one column in the table if yes cant delete that. @@ -3317,6 +3341,13 @@ CQueryObject::OnSelChanged(HTREEITEM hitem, LPNMTREEVIEW pnmtv) { ptabmgmt->m_pqueryobj->Refresh(); } +#ifndef COMMUNITY + if(wnd->m_conninfo.m_isreadonly == wyTrue) + { + SendMessage(pGlobals->m_pcmainwin->m_hwndsecondtool, TB_SETSTATE,ID_OBJECT_MAINMANINDEX, TBSTATE_INDETERMINATE); + SendMessage(pGlobals->m_pcmainwin->m_hwndsecondtool, TB_SETSTATE,ACCEL_MANREL, TBSTATE_INDETERMINATE); + } +#endif } else if(image == NSPITEM) @@ -3607,6 +3638,14 @@ CQueryObject::OnSelChanged(HTREEITEM hitem, LPNMTREEVIEW pnmtv) ptabmgmt->m_pqueryobj->Refresh(); } } +#ifndef COMMUNITY + if(wnd->m_conninfo.m_isreadonly == wyTrue) + { + SendMessage(pGlobals->m_pcmainwin->m_hwndsecondtool, TB_SETSTATE,ID_OBJECT_MAINMANINDEX, TBSTATE_INDETERMINATE); + SendMessage(pGlobals->m_pcmainwin->m_hwndsecondtool, TB_SETSTATE,ACCEL_MANREL, TBSTATE_INDETERMINATE); + SendMessage(pGlobals->m_pcmainwin->m_hwndsecondtool, TB_SETSTATE,ID_OPEN_COPYDATABASE, TBSTATE_INDETERMINATE); + } +#endif } // now change the default db. @@ -4398,6 +4437,12 @@ CQueryObject::RenameObject() wyInt32 item; HTREEITEM hitem, temp; wyString strtemp; +#ifndef COMMUNITY + if(GetActiveWin()->m_conninfo.m_isreadonly == wyTrue) + { + return wyTrue; + } +#endif VERIFY(hitem = TreeView_GetSelection(m_hwnd)); temp = hitem; @@ -5078,7 +5123,12 @@ CQueryObject::ProcessF6() VERIFY(wnd = GetActiveWin()); image = GetSelectionImage(); - +#ifndef COMMUNITY + if(wnd->m_conninfo.m_isreadonly == wyTrue) + { + return wyTrue; + } +#endif switch(image) { case NDATABASE: @@ -5142,7 +5192,12 @@ CQueryObject::ProcessF4() VERIFY(wnd = GetActiveWin()); image = GetSelectionImage(); - +#ifndef COMMUNITY + if(wnd->m_conninfo.m_isreadonly == wyTrue) + { + return wyTrue; + } +#endif switch(image) { case NDATABASE: @@ -5636,6 +5691,12 @@ CQueryObject::TruncateDatabase(HWND hwnd, Tunnel * tunnel, PMYSQL mysql) MDIWindow *wnd = GetActiveWin(); wyBool ismysql41 = IsMySQL41(tunnel, mysql); wyBool flag = wyFalse, istunnel = wyFalse, retval = wyTrue; +#ifndef COMMUNITY + if(wnd->m_conninfo.m_isreadonly == wyTrue) + { + return wyTrue; + } +#endif VERIFY(hitem = TreeView_GetSelection(m_hwnd)); image = GetSelectionImage(); @@ -6453,6 +6514,13 @@ CQueryObject::DropDatabaseObject(Tunnel * tunnel, PMYSQL mysql, wyChar *objectty HTREEITEM hitem, hitemtemp; wyString objectname; +#ifndef COMMUNITY + if(GetActiveWin()->m_conninfo.m_isreadonly == wyTrue) + { + return wyTrue; + } +#endif + objectname.SetAs(objecttype); VERIFY(hitem = TreeView_GetSelection(m_hwnd)); hitemtemp = hitem; @@ -6502,6 +6570,12 @@ CQueryObject::DropTrigger(Tunnel * tunnel, PMYSQL mysql) wyString query; wyInt32 ret, isintransaction = 1; HTREEITEM hitem, hitemtemp; +#ifndef COMMUNITY + if(GetActiveWin()->m_conninfo.m_isreadonly == wyTrue) + { + return wyTrue; + } +#endif VERIFY(hitem = TreeView_GetSelection(m_hwnd)); hitemtemp = hitem; @@ -7534,6 +7608,12 @@ CQueryObject::OnWmCommand(WPARAM wparam) break; case ID_IMPORT_EXTERNAL_DATA: +#ifndef COMMUNITY + if(wnd->m_conninfo.m_isreadonly == wyTrue) + { + break; + } +#endif conbase->OnSchdOdbcImport(); break; diff --git a/src/OtherDialogs.cpp b/src/OtherDialogs.cpp index a6524a5..89b717b 100644 --- a/src/OtherDialogs.cpp +++ b/src/OtherDialogs.cpp @@ -407,6 +407,10 @@ CShowValue::ShowValueDialogProc(HWND hwnd, wyUInt32 message, WPARAM wparam, LPAR else if(pcshowvalue->m_valtype == PROCESSLIST) { ShowWindow(GetDlgItem(hwnd, IDC_KILL), SW_SHOW); +#ifndef COMMUNITY + if(GetActiveWin()->m_conninfo.m_isreadonly == wyTrue) + EnableWindow(GetDlgItem(hwnd, IDC_KILL), FALSE); +#endif SetInitPos(hwnd, SHOWVALUE_PROCESSLIST_SECTION); } else if(pcshowvalue->m_valtype == STATUS) @@ -640,7 +644,12 @@ CShowValue::CreateColumns(MYSQL_RES *myres) EnableWindow(GetDlgItem(m_hwnddlg, IDC_KILL), FALSE); else EnableWindow(GetDlgItem(m_hwnddlg, IDC_KILL), TRUE); +#ifndef COMMUNITY + if(GetActiveWin()->m_conninfo.m_isreadonly == wyTrue) + EnableWindow(GetDlgItem(m_hwnddlg, IDC_KILL), FALSE); +#endif } + // free the memory allocated for(colcount--; colcount >= 0; colcount--) { @@ -745,7 +754,10 @@ CShowValue::KillProcess() EnableWindow(GetDlgItem(m_hwnddlg, IDC_KILL), FALSE); else EnableWindow(GetDlgItem(m_hwnddlg, IDC_KILL), TRUE); - +#ifndef COMMUNITY + if(GetActiveWin()->m_conninfo.m_isreadonly == wyTrue) + EnableWindow(GetDlgItem(m_hwnddlg, IDC_KILL), FALSE); +#endif m_prow = -1; @@ -3970,6 +3982,18 @@ TableDiag::TableDlgProcInit(HWND phwnd, LPARAM plparam) GetCtrlRects(pctablediag); PositionCtrls(pctablediag); +#ifndef COMMUNITY + if(GetActiveWin()->m_conninfo.m_isreadonly == wyTrue) + { + // EnableWindow(GetDlgItem(phwnd, IDC_DIAG_OPTIMIZE), wyFalse); + // EnableWindow(GetDlgItem(phwnd, IDC_DIAG_OPTIMIZELOCAL), wyFalse); + EnableWindow(GetDlgItem(phwnd, IDC_DIAG_QUICKREPAIR), wyFalse); + EnableWindow(GetDlgItem(phwnd, IDC_DIAG_EXTENDEDREPAIR), wyFalse); + EnableWindow(GetDlgItem(phwnd, IDC_DIAG_USEFRMREPAIR), wyFalse); + EnableWindow(GetDlgItem(phwnd, IDC_DIAG_USELOCALREPAIR), wyFalse); + EnableWindow(GetDlgItem(phwnd, IDC_DIAG_REPAIR), wyFalse); + } +#endif return wyTrue; } @@ -4184,6 +4208,18 @@ TableDiag::EnableDisableTableDiag(HWND thwnd, BOOL flag) EnableWindow(GetDlgItem(thwnd, IDC_DIAG_EXTENDEDREPAIR), flag); EnableWindow(GetDlgItem(thwnd, IDC_DIAG_USELOCALREPAIR), flag); EnableWindow(GetDlgItem(thwnd, IDC_CHECKOPTION), flag); +#ifndef COMMUNITY + if(GetActiveWin()->m_conninfo.m_isreadonly == wyTrue) + { + // EnableWindow(GetDlgItem(thwnd, IDC_DIAG_OPTIMIZE), wyFalse); + // EnableWindow(GetDlgItem(thwnd, IDC_DIAG_OPTIMIZELOCAL), wyFalse); + EnableWindow(GetDlgItem(thwnd, IDC_DIAG_QUICKREPAIR), wyFalse); + EnableWindow(GetDlgItem(thwnd, IDC_DIAG_EXTENDEDREPAIR), wyFalse); + EnableWindow(GetDlgItem(thwnd, IDC_DIAG_USEFRMREPAIR), wyFalse); + EnableWindow(GetDlgItem(thwnd, IDC_DIAG_USELOCALREPAIR), wyFalse); + EnableWindow(GetDlgItem(thwnd, IDC_DIAG_REPAIR), wyFalse); + } +#endif return; } diff --git a/src/QueryThread.cpp b/src/QueryThread.cpp index cfe8c3f..0973582 100644 --- a/src/QueryThread.cpp +++ b/src/QueryThread.cpp @@ -34,7 +34,9 @@ extern PGLOBALS pGlobals; #define SPACE_15 15 #define NO_QUERY_EXECUTED _("No query(s) were executed. Please enter a query in the SQL window or place the cursor inside a query.") #define NO_QUERY_EXECUTED_TRANS _("No query(s) were executed.") +#define NO_QUERY_EXECUTED_READONLY _("Only Read-Only query(s) are allowed for this connection.") #define IN_TRANSACTION -10 +#define IN_READONLY -20 void AddErrorOrMsg(wyInt32 errstatus, wyString& buffer, Tunnel * tunnel, PMYSQL mysql, const wyChar* query, @@ -144,6 +146,21 @@ AddErrorOrMsg(wyInt32 errstatus, wyString& buffer, Tunnel * tunnel, PMYSQL mysql GetWarning(tunnel, mysql, &msg); break; + case ERROR_READONLY: + if(isembedformat == wyTrue) + { + msg.SetAs(""); + } + + if(query) + { + msg.AddSprintf(_("Query: %s"), querystr.GetString()); + } + + msg.Add("\r\n\r\n"); + msg.Add(NO_QUERY_EXECUTED_READONLY); + msg.AddSprintf("\r\n"); + break; default: VERIFY(0); /* should never reach here */ @@ -152,7 +169,8 @@ AddErrorOrMsg(wyInt32 errstatus, wyString& buffer, Tunnel * tunnel, PMYSQL mysql if(query && buffer.GetLength() && msg.GetLength()) { - buffer.Add("--------------------------------------------------\r\n\r\n"); + + buffer.Add("-----------------------------------------------------------\r\n\r\n"); } buffer.Add(msg.GetString()); @@ -201,8 +219,7 @@ HelperExecuteQuery(QUERYTHREADPARAMS * param, const wyChar* query,wyBool ismulti #ifndef COMMUNITY if(pGlobals->m_entlicense.CompareI("Professional") != 0 && param->tunnel->IsTunnel() == wyTrue) { - wyBool start_t = CheckTransactionStart(param->wnd, query); - if(start_t == wyTrue) + if(CheckTransactionStart(param->wnd, query) == wyTrue) return IN_TRANSACTION; } #endif @@ -222,7 +239,14 @@ HelperExecuteQuery(QUERYTHREADPARAMS * param, const wyChar* query,wyBool ismulti param->wnd->SetThreadBusy(wyFalse); if(ret == IN_TRANSACTION) return IN_TRANSACTION; - if(ret) + if(ret == IN_READONLY) + { + elem = new QueryResultElem; + elem->param = NULL; + AddErrorOrMsg(ERROR_READONLY, *param->str, param->tunnel, param->mysql, ptrquery, param->executestatus, param->endpos, 0, param->wnd->m_lastquerytime, param->m_iseditor); + param->list->Insert(elem); + } + else if(ret) { elem = new QueryResultElem; elem->param = NULL; diff --git a/src/ResultView.cpp b/src/ResultView.cpp index d79b741..095913d 100644 --- a/src/ResultView.cpp +++ b/src/ResultView.cpp @@ -1103,7 +1103,6 @@ ResultView::UpdateTableComboItem(wyInt32 index) count = SendMessage(m_hwndtablecombo, CB_GETCOUNT, 0, 0); hfont = (HFONT)SendMessage(m_hwndtablecombo, WM_GETFONT, 0, 0); - //get dc and select the font hdc = GetDC(m_hwndtablecombo); hfont = SelectFont(hdc, hfont); @@ -1113,7 +1112,6 @@ ResultView::UpdateTableComboItem(wyInt32 index) { //get the elements associated with the item pelem = (ResultTabTableElem*)SendMessage(m_hwndtablecombo, CB_GETITEMDATA, i, 0); - //if it is valid if(pelem) { @@ -1227,7 +1225,12 @@ ResultView::SetTablesCombo() { dropdownwidth = rect.right; } - +#ifndef COMMUNITY + if(GetActiveWin()->m_conninfo.m_isreadonly == wyTrue) + { + SendMessage(m_hwndtablecombo, CB_RESETCONTENT, 0, 0); + } +#endif //insert (read-only) in the begining SendMessage(m_hwndtablecombo, CB_INSERTSTRING, 0, (LPARAM)_(L"(Read Only)")); SendMessage(m_hwndtablecombo, CB_SETITEMDATA, 0, NULL); @@ -1311,6 +1314,10 @@ ResultView::EnableToolButtons() void ResultView::EnableDMLButtons(wyBool isenable) { +#ifndef COMMUNITY + if(m_wnd->m_conninfo.m_isreadonly == wyTrue) + return; +#endif EnableToolButton(isenable, ID_RESULT_INSERT); EnableToolButton(isenable, ID_RESULT_DELETE); EnableToolButton(ErrorFlagState() != EFS_MODIFIED ? wyFalse : isenable, ID_RESULT_SAVE); diff --git a/src/TabEditor.cpp b/src/TabEditor.cpp index c5bdfb0..bf6c704 100644 --- a/src/TabEditor.cpp +++ b/src/TabEditor.cpp @@ -234,6 +234,13 @@ TabEditor::OnTabSelChange() else { SendMessage(hwndtoolbar, TB_SETSTATE,(WPARAM)IDM_EXECUTE, TBSTATE_ENABLED); +#ifndef COMMUNITY + if(pcmdiwindow->m_conninfo.m_isreadonly == wyTrue) + { + SendMessage(hwndtoolbar, TB_SETSTATE,ACCEL_QUERYUPDATE, TBSTATE_INDETERMINATE); + } + else +#endif SendMessage(hwndtoolbar, TB_SETSTATE, (WPARAM)ACCEL_QUERYUPDATE, TBSTATE_ENABLED); SendMessage(hwndsecondtool, TB_SETSTATE, (WPARAM)ID_FORMATCURRENTQUERY, TBSTATE_ENABLED); } diff --git a/src/TabModule.cpp b/src/TabModule.cpp index 5af3ea4..c40f648 100644 --- a/src/TabModule.cpp +++ b/src/TabModule.cpp @@ -666,7 +666,13 @@ TabModule::CreateTableTabInterface(MDIWindow *wnd, wyBool isaltertable, wyInt32 CTCITEM item = {0}; TableTabInterface *ptabinterface = NULL; wyString tabtitle, objectname, temptabname; - + +#ifndef COMMUNITY + if(wnd->m_conninfo.m_isreadonly == wyTrue) + { + return wyTrue; + } +#endif if(isaltertable) { if(!IsValidFocusInOB(setfocustotab)) diff --git a/src/UserManager.cpp b/src/UserManager.cpp index f02f724..953ddf6 100644 --- a/src/UserManager.cpp +++ b/src/UserManager.cpp @@ -257,7 +257,13 @@ UserManager::DlgProc(HWND hwnd, wyUInt32 message, WPARAM wparam, LPARAM lparam) //set the initiate flag m_initcompleted = wyTrue; } - +#ifndef COMMUNITY + if(GetActiveWin()->m_conninfo.m_isreadonly == wyTrue) + { + EnableWindow(GetDlgItem(hwnd, IDC_DELUSER), wyFalse); + EnableWindow(GetDlgItem(hwnd, IDC_NEWUSER), wyFalse); + } +#endif break; case WM_COMMAND: @@ -1019,8 +1025,9 @@ UserManager::OnSaveChanges() //reset the flags m_isnewuser = wyFalse; EnableDisableSaveCancel(); - SendMessage(hwndcombo, CB_DELETESTRING, m_selindex, 0); - SetFocus(GetDlgItem(m_hwnd, IDC_OBTREE)); +// SendMessage(hwndcombo, CB_DELETESTRING, m_selindex, 0); + SendMessage(hwndcombo, CB_SETCURSEL,(WPARAM)m_selindex, 0); + SetFocus(GetDlgItem(m_hwnd, IDC_OBTREE)); } else { @@ -1112,7 +1119,8 @@ UserManager::AddNewUser() USERLIST *tempnode = new USERLIST; tempnode->m_uname.SetAs(temp.GetString()); - tempnode->m_dropdown = wyFalse; + //tempnode->m_dropdown = wyFalse; + tempnode->m_dropdown = wyTrue; tempnode->m_itemvalue.Sprintf("%d",m_usercount); tempnode->next = NULL; @@ -1271,6 +1279,13 @@ wyBool UserManager::SavePrompt() { wyInt32 ret; +#ifndef COMMUNITY + if(GetActiveWin()->m_conninfo.m_isreadonly == wyTrue) + { + ApplyChanges(wyFalse); + return wyTrue; + } +#endif //check whether there is an unsaved change if(m_isedited == wyTrue) @@ -1341,6 +1356,12 @@ UserManager::EnableChildren(HWND hwnd, LPARAM lparam) if(ctrlid != IDC_SAVE_CHANGES && ctrlid != IDC_CANCEL_CHANGES) { EnableWindow(hwnd, enable); +#ifndef COMMUNITY + if(GetActiveWin()->m_conninfo.m_isreadonly == wyTrue && (ctrlid == IDC_DELUSER || ctrlid == IDC_NEWUSER)) + { + EnableWindow(hwnd, wyFalse); + } +#endif } return TRUE; @@ -1415,10 +1436,10 @@ UserManager::OnUserComboChange() SendMessage(hwndusercombo, CB_GETLBTEXT, (WPARAM)m_selindex, (LPARAM)buffer); curruser.SetAs(buffer); delete[] buffer; - len = curruser.FindChar('@'); - temp = curruser.Substr(0, len); + len = curruser.FindIWithReverse("@", 0 , wyTrue); + temp = curruser.Substr(0, curruser.GetLength() - len - 1); m_username.SetAs(temp ? temp : ""); - temp = curruser.Substr(len + 1, curruser.GetLength() - len - 1); + temp = curruser.Substr(curruser.GetLength() - len, len); m_host.SetAs(temp ? temp : ""); //delete the user level items @@ -1454,7 +1475,7 @@ UserManager::OnHandleEditChange() len = GetWindowText(hwndusercombo, str, 65); int ret = wcstombs ( str1, str, sizeof(str1) ); if(len) - { + { while(itr) { if(itr->m_uname.GetLength() == 0) @@ -1487,6 +1508,7 @@ UserManager::OnHandleEditChange() } + if(!len || status == 0) { SendMessage(hwndusercombo, CB_SETCURSEL, -1, 0); @@ -2114,6 +2136,13 @@ UserManager::EnableDisableSaveCancel() { EnableWindow(GetDlgItem(m_hwnd, IDC_SAVE_CHANGES), m_isedited); EnableWindow(GetDlgItem(m_hwnd, IDC_CANCEL_CHANGES), m_isedited); +#ifndef COMMUNITY + if(GetActiveWin()->m_conninfo.m_isreadonly == wyTrue) + { + EnableWindow(GetDlgItem(m_hwnd, IDC_SAVE_CHANGES), wyFalse); + EnableWindow(GetDlgItem(m_hwnd, IDC_CANCEL_CHANGES), wyFalse); + } +#endif } //handler function for Cancel button