From b6681ea65cbaa136a535777d9dd88535fdffb85a Mon Sep 17 00:00:00 2001 From: Serge Rider Date: Sat, 30 Jun 2018 19:02:03 +0300 Subject: [PATCH] #3717 MySQL: server timezone selector --- .../OSGI-INF/l10n/bundle.properties | 2 +- .../dbeaver/ext/mysql/MySQLConstants.java | 3 ++ .../dbeaver/ext/mysql/MySQLMessages.java | 3 ++ .../ext/mysql/MySQLResources.properties | 3 ++ .../jkiss/dbeaver/ext/mysql/MySQLUtils.java | 6 +++ .../ext/mysql/model/MySQLDataSource.java | 5 ++ .../ext/mysql/views/MySQLConnectionPage.java | 48 +++++++++++++++---- .../src/org/jkiss/dbeaver/ui/UIUtils.java | 12 +++-- 8 files changed, 68 insertions(+), 14 deletions(-) diff --git a/plugins/org.jkiss.dbeaver.ext.mysql/OSGI-INF/l10n/bundle.properties b/plugins/org.jkiss.dbeaver.ext.mysql/OSGI-INF/l10n/bundle.properties index 7fde4847bc..86d242beaa 100644 --- a/plugins/org.jkiss.dbeaver.ext.mysql/OSGI-INF/l10n/bundle.properties +++ b/plugins/org.jkiss.dbeaver.ext.mysql/OSGI-INF/l10n/bundle.properties @@ -1,5 +1,5 @@ -dialog.connection.header=MySQL Connection Settings +dialog.connection.header=Connection Settings tree.databases.node.name=Databases tree.database.node.name=Database diff --git a/plugins/org.jkiss.dbeaver.ext.mysql/src/org/jkiss/dbeaver/ext/mysql/MySQLConstants.java b/plugins/org.jkiss.dbeaver.ext.mysql/src/org/jkiss/dbeaver/ext/mysql/MySQLConstants.java index 7455eb0872..4c70d69a7c 100644 --- a/plugins/org.jkiss.dbeaver.ext.mysql/src/org/jkiss/dbeaver/ext/mysql/MySQLConstants.java +++ b/plugins/org.jkiss.dbeaver.ext.mysql/src/org/jkiss/dbeaver/ext/mysql/MySQLConstants.java @@ -17,6 +17,7 @@ package org.jkiss.dbeaver.ext.mysql; +import org.jkiss.dbeaver.model.DBConstants; import org.jkiss.dbeaver.model.struct.rdb.DBSIndexType; /** @@ -33,6 +34,8 @@ public class MySQLConstants { public static final String HANDLER_SSL = "mysql_ssl"; + public static final String PROP_SERVER_TIMEZONE = DBConstants.INTERNAL_PROP_PREFIX + "serverTimezone@"; + public static final String PROP_REQUIRE_SSL = "ssl.require"; public static final String PROP_VERIFY_SERVER_SERT = "ssl.verify.server"; public static final String PROP_SSL_CIPHER_SUITES = "ssl.cipher.suites"; diff --git a/plugins/org.jkiss.dbeaver.ext.mysql/src/org/jkiss/dbeaver/ext/mysql/MySQLMessages.java b/plugins/org.jkiss.dbeaver.ext.mysql/src/org/jkiss/dbeaver/ext/mysql/MySQLMessages.java index 578ba7a8fa..c4bf696b1f 100644 --- a/plugins/org.jkiss.dbeaver.ext.mysql/src/org/jkiss/dbeaver/ext/mysql/MySQLMessages.java +++ b/plugins/org.jkiss.dbeaver.ext.mysql/src/org/jkiss/dbeaver/ext/mysql/MySQLMessages.java @@ -41,6 +41,9 @@ public class MySQLMessages extends NLS { public static String dialog_connection_port; public static String dialog_connection_test_connection; public static String dialog_connection_user_name; + public static String dialog_connection_server_timezone; + public static String dialog_connection_auto_detect; + public static String dialog_connection_local_client; public static String edit_catalog_manager_dialog_schema_name; public static String edit_command_change_user_action_create_new_user; public static String edit_command_change_user_action_update_user_record; diff --git a/plugins/org.jkiss.dbeaver.ext.mysql/src/org/jkiss/dbeaver/ext/mysql/MySQLResources.properties b/plugins/org.jkiss.dbeaver.ext.mysql/src/org/jkiss/dbeaver/ext/mysql/MySQLResources.properties index 5416435982..caedae5f64 100644 --- a/plugins/org.jkiss.dbeaver.ext.mysql/src/org/jkiss/dbeaver/ext/mysql/MySQLResources.properties +++ b/plugins/org.jkiss.dbeaver.ext.mysql/src/org/jkiss/dbeaver/ext/mysql/MySQLResources.properties @@ -9,6 +9,9 @@ dialog_connection_database=Database dialog_connection_user_name=User name dialog_connection_password=Password dialog_connection_test_connection=Test Connection ... +dialog_connection_server_timezone=Server Time Zone +dialog_connection_auto_detect=Auto-detect +dialog_connection_local_client=Local Client edit_catalog_manager_dialog_schema_name=Schema name edit_command_change_user_action_create_new_user=Create new user diff --git a/plugins/org.jkiss.dbeaver.ext.mysql/src/org/jkiss/dbeaver/ext/mysql/MySQLUtils.java b/plugins/org.jkiss.dbeaver.ext.mysql/src/org/jkiss/dbeaver/ext/mysql/MySQLUtils.java index 380d6d680a..d5cec6b6a1 100644 --- a/plugins/org.jkiss.dbeaver.ext.mysql/src/org/jkiss/dbeaver/ext/mysql/MySQLUtils.java +++ b/plugins/org.jkiss.dbeaver.ext.mysql/src/org/jkiss/dbeaver/ext/mysql/MySQLUtils.java @@ -19,6 +19,7 @@ package org.jkiss.dbeaver.ext.mysql; import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.connection.DBPClientHome; +import org.jkiss.dbeaver.model.connection.DBPDriver; import org.jkiss.dbeaver.model.exec.DBCException; import org.jkiss.dbeaver.model.exec.jdbc.JDBCPreparedStatement; import org.jkiss.dbeaver.model.exec.jdbc.JDBCResultSet; @@ -144,4 +145,9 @@ public class MySQLUtils { } } + public static boolean isMariaDB(DBPDriver driver) { + return MySQLConstants.DRIVER_CLASS_MARIA_DB.equals( + driver.getDriverClassName()); + } + } diff --git a/plugins/org.jkiss.dbeaver.ext.mysql/src/org/jkiss/dbeaver/ext/mysql/model/MySQLDataSource.java b/plugins/org.jkiss.dbeaver.ext.mysql/src/org/jkiss/dbeaver/ext/mysql/model/MySQLDataSource.java index 740fb56f5c..dacd87b647 100644 --- a/plugins/org.jkiss.dbeaver.ext.mysql/src/org/jkiss/dbeaver/ext/mysql/model/MySQLDataSource.java +++ b/plugins/org.jkiss.dbeaver.ext.mysql/src/org/jkiss/dbeaver/ext/mysql/model/MySQLDataSource.java @@ -101,6 +101,11 @@ public class MySQLDataSource extends JDBCDataSource implements DBSObjectSelector // Newer MySQL servers/connectors requires explicit SSL disable props.put("useSSL", "false"); } + + String serverTZ = connectionInfo.getProviderProperty(MySQLConstants.PROP_SERVER_TIMEZONE); + if (!CommonUtils.isEmpty(serverTZ)) { + props.put("serverTimezone", serverTZ); + } /* if (CommonUtils.toBoolean(connectionInfo.getProperty(MySQLConstants.PROP_USE_SSL))) { url.append("?useSSL=true&requireSSL=true"); diff --git a/plugins/org.jkiss.dbeaver.ext.mysql/src/org/jkiss/dbeaver/ext/mysql/views/MySQLConnectionPage.java b/plugins/org.jkiss.dbeaver.ext.mysql/src/org/jkiss/dbeaver/ext/mysql/views/MySQLConnectionPage.java index 7d3eb1027b..16394722f1 100644 --- a/plugins/org.jkiss.dbeaver.ext.mysql/src/org/jkiss/dbeaver/ext/mysql/views/MySQLConnectionPage.java +++ b/plugins/org.jkiss.dbeaver.ext.mysql/src/org/jkiss/dbeaver/ext/mysql/views/MySQLConnectionPage.java @@ -23,12 +23,14 @@ import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.jkiss.dbeaver.ext.mysql.Activator; import org.jkiss.dbeaver.ext.mysql.MySQLConstants; import org.jkiss.dbeaver.ext.mysql.MySQLMessages; +import org.jkiss.dbeaver.ext.mysql.MySQLUtils; import org.jkiss.dbeaver.model.DBPDataSourceContainer; import org.jkiss.dbeaver.model.connection.DBPConnectionConfiguration; import org.jkiss.dbeaver.model.connection.DBPDriver; @@ -39,7 +41,9 @@ import org.jkiss.dbeaver.ui.dialogs.connection.ConnectionPageAbstract; import org.jkiss.dbeaver.ui.dialogs.connection.DriverPropertiesDialogPage; import org.jkiss.utils.CommonUtils; +import java.util.Arrays; import java.util.Locale; +import java.util.TimeZone; /** * MySQLConnectionPage @@ -56,6 +60,7 @@ public class MySQLConnectionPage extends ConnectionPageAbstract implements IComp private static ImageDescriptor MYSQL_LOGO_IMG = Activator.getImageDescriptor("icons/mysql_logo.png"); private static ImageDescriptor MARIADB_LOGO_IMG = Activator.getImageDescriptor("icons/mariadb_logo.png"); + private Combo serverTimezoneCombo; @Override @@ -129,19 +134,26 @@ public class MySQLConnectionPage extends ConnectionPageAbstract implements IComp passwordText.setLayoutData(gd); passwordText.addModifyListener(textListener); - { - Composite clientPanel = UIUtils.createPlaceholder(addrGroup, 1); - gd = new GridData(GridData.FILL_HORIZONTAL); - gd.horizontalSpan = 2; - clientPanel.setLayoutData(gd); - - UIUtils.createHorizontalLine(clientPanel); + UIUtils.createHorizontalLine(addrGroup, 2, 10); - homesSelector = new ClientHomesSelector(clientPanel, SWT.NONE, "Local Client"); - gd = new GridData(GridData.FILL_HORIZONTAL | GridData.HORIZONTAL_ALIGN_BEGINNING); - homesSelector.getPanel().setLayoutData(gd); + if (!MySQLUtils.isMariaDB(getSite().getDriver())) { + serverTimezoneCombo = UIUtils.createLabelCombo(addrGroup, MySQLMessages.dialog_connection_server_timezone, SWT.DROP_DOWN); + serverTimezoneCombo.add(MySQLMessages.dialog_connection_auto_detect); + { + String[] tzList = TimeZone.getAvailableIDs(); + for (String tzID : tzList) { + //TimeZone timeZone = TimeZone.getTimeZone(tzID); + serverTimezoneCombo.add(tzID); + } + } + serverTimezoneCombo.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING)); } + homesSelector = new ClientHomesSelector(addrGroup, SWT.NONE, MySQLMessages.dialog_connection_local_client); + gd = new GridData(GridData.FILL_HORIZONTAL | GridData.HORIZONTAL_ALIGN_BEGINNING); + gd.horizontalSpan = 2; + homesSelector.getPanel().setLayoutData(gd); + createDriverPanel(addrGroup); setControl(addrGroup); } @@ -197,6 +209,15 @@ public class MySQLConnectionPage extends ConnectionPageAbstract implements IComp if (passwordText != null) { passwordText.setText(CommonUtils.notEmpty(connectionInfo.getUserPassword())); } + if (serverTimezoneCombo != null) { + String tzProp = connectionInfo.getProviderProperty(MySQLConstants.PROP_SERVER_TIMEZONE); + if (CommonUtils.isEmpty(tzProp)) { + serverTimezoneCombo.select(0); + } else { + serverTimezoneCombo.setText(tzProp); + } + } + homesSelector.populateHomes(site.getDriver(), connectionInfo.getClientHomeId()); activated = true; @@ -221,6 +242,13 @@ public class MySQLConnectionPage extends ConnectionPageAbstract implements IComp if (passwordText != null) { connectionInfo.setUserPassword(passwordText.getText()); } + if (serverTimezoneCombo != null) { + if (serverTimezoneCombo.getSelectionIndex() == 0 || CommonUtils.isEmpty(serverTimezoneCombo.getText())) { + connectionInfo.removeProviderProperty(MySQLConstants.PROP_SERVER_TIMEZONE); + } else { + connectionInfo.setProviderProperty(MySQLConstants.PROP_SERVER_TIMEZONE, serverTimezoneCombo.getText()); + } + } if (homesSelector != null) { connectionInfo.setClientHomeId(homesSelector.getSelectedHome()); } diff --git a/plugins/org.jkiss.dbeaver.ui/src/org/jkiss/dbeaver/ui/UIUtils.java b/plugins/org.jkiss.dbeaver.ui/src/org/jkiss/dbeaver/ui/UIUtils.java index 8f5ce61e8a..538e80d22f 100644 --- a/plugins/org.jkiss.dbeaver.ui/src/org/jkiss/dbeaver/ui/UIUtils.java +++ b/plugins/org.jkiss.dbeaver.ui/src/org/jkiss/dbeaver/ui/UIUtils.java @@ -761,10 +761,16 @@ public class UIUtils { gd.verticalSpan = verticalSpan; } - public static Label createHorizontalLine(Composite parent) - { + public static Label createHorizontalLine(Composite parent) { + return createHorizontalLine(parent, 1, 0); + } + + public static Label createHorizontalLine(Composite parent, int hSpan, int vIndent) { Label horizontalLine = new Label(parent, SWT.SEPARATOR | SWT.HORIZONTAL); - horizontalLine.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, false, 1, 1)); + GridData gd = new GridData(GridData.FILL, GridData.FILL, true, false, 1, 1); + gd.horizontalSpan = hSpan; + gd.verticalIndent = vIndent; + horizontalLine.setLayoutData(gd); return horizontalLine; } -- GitLab