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 0000000..00b5d83 Binary files /dev/null and b/lib/win32/release/auth_gssapi_client.dll differ diff --git a/lib/x64/release/auth_gssapi_client.dll b/lib/x64/release/auth_gssapi_client.dll new file mode 100644 index 0000000..fca1b08 Binary files /dev/null and b/lib/x64/release/auth_gssapi_client.dll differ 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