提交 69f3232e 编写于 作者: S Serge Rider

Merge remote-tracking branch 'origin/devel' into devel


Former-commit-id: 7bb27880
......@@ -57,7 +57,6 @@ public class SQLServerConnectionPage extends ConnectionPageAbstract implements I
private Combo authCombo;
// private Button windowsAuthenticationButton;
// private Button adpAuthenticationButton;
private Button trustServerCertificate;
private Button showAllSchemas;
private boolean activated;
......@@ -194,7 +193,6 @@ public class SQLServerConnectionPage extends ConnectionPageAbstract implements I
secureGroup.setLayout(new GridLayout(1, false));
createPasswordControls(secureGroup);
trustServerCertificate = UIUtils.createCheckbox(secureGroup, SQLServerUIMessages.dialog_setting_trust_server_certificate, SQLServerUIMessages.dialog_setting_trust_server_certificate_tip, true, 2);
showAllSchemas = UIUtils.createCheckbox(secureGroup, SQLServerUIMessages.dialog_setting_show_all_schemas, SQLServerUIMessages.dialog_setting_show_all_schemas_tip, true, 2);
}
......@@ -272,7 +270,6 @@ public class SQLServerConnectionPage extends ConnectionPageAbstract implements I
adpAuthenticationButton.setSelection(SQLServerUtils.isActiveDirectoryAuth(connectionInfo));
}
*/
trustServerCertificate.setSelection(CommonUtils.getBoolean(connectionInfo.getProperty(SQLServerConstants.PROP_TRUST_SERVER_CERTIFICATE), true));
showAllSchemas.setSelection(CommonUtils.toBoolean(connectionInfo.getProviderProperty(SQLServerConstants.PROP_SHOW_ALL_SCHEMAS)));
activated = true;
......@@ -337,10 +334,6 @@ public class SQLServerConnectionPage extends ConnectionPageAbstract implements I
}
}
*/
if (trustServerCertificate != null) {
connectionInfo.setProperty(SQLServerConstants.PROP_TRUST_SERVER_CERTIFICATE,
String.valueOf(trustServerCertificate.getSelection()));
}
if (showAllSchemas != null) {
connectionInfo.setProviderProperty(SQLServerConstants.PROP_SHOW_ALL_SCHEMAS,
String.valueOf(showAllSchemas.getSelection()));
......
......@@ -37,6 +37,9 @@ public class SQLServerUIMessages extends NLS {
public static String dialog_setting_trust_server_certificate;
public static String dialog_setting_trust_server_certificate_tip;
public static String dialog_setting_ssl_advanced_title;
public static String dialog_setting_ssl_advanced_keystore_title;
public static String dialog_setting_ssl_advanced_keystore_label;
public static String dialog_setting_ssl_advanced_keystore_password_label;
public static String dialog_setting_ssl_advanced_hostname_label;
public static String dialog_setting_ssl_advanced_hostname_tip;
......
......@@ -13,6 +13,9 @@ dialog_setting_show_all_schemas_tip=Shows all database schemas. If disabled show
dialog_setting_trust_server_certificate=Trust Server Certificate
dialog_setting_trust_server_certificate_tip=If "true", the SQL Server SSL certificate is automatically trusted when the communication layer is encrypted using SSL.\nIf "false", the Microsoft JDBC Driver for SQL Server validates the server SSL certificate.\nIf the server certificate validation fails, the driver raises an error and terminate the connection.
dialog_setting_ssl_advanced_title=Advanced
dialog_setting_ssl_advanced_keystore_title=Select keystore file
dialog_setting_ssl_advanced_keystore_label=Keystore
dialog_setting_ssl_advanced_keystore_password_label=Keystore password
dialog_setting_ssl_advanced_hostname_label=Certificate hostname
dialog_setting_ssl_advanced_hostname_tip=The host name to be used in validating the SQL Server TLS/SSL certificate.
dialog_create_db_group_general=General
......
......@@ -13,6 +13,9 @@ dialog_setting_show_all_schemas_tip=\u041F\u043E\u043A\u0430\u0437\u044B\u0432\u
dialog_setting_trust_server_certificate=\u0412\u0441\u0435\u0433\u0434\u0430 \u0434\u043E\u0432\u0435\u0440\u044F\u0442\u044C \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u0443 \u0441\u0435\u0440\u0432\u0435\u0440\u0430
dialog_setting_trust_server_certificate_tip=\u0415\u0441\u043B\u0438 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 "true", \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043A\u0430\u0442 SSL SQL Server \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u0441\u044F \u0434\u043E\u0432\u0435\u0440\u0435\u043D\u043D\u044B\u043C, \u043A\u043E\u0433\u0434\u0430 \u0443\u0440\u043E\u0432\u0435\u043D\u044C \u0441\u0432\u044F\u0437\u0438 \u0448\u0438\u0444\u0440\u0443\u0435\u0442\u0441\u044F \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E SSL.\n\u0415\u0441\u043B\u0438 "false", \u0434\u0440\u0430\u0439\u0432\u0435\u0440 Microsoft JDBC \u0434\u043B\u044F SQL Server \u043F\u0440\u043E\u0432\u0435\u0440\u044F\u0435\u0442 SSL-\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043A\u0430\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.\n\u0415\u0441\u043B\u0438 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044F \u043D\u0435\u0443\u0434\u0430\u0447\u043D\u043E, \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0432\u044B\u0437\u044B\u0432\u0430\u0435\u0442 \u043E\u0448\u0438\u0431\u043A\u0443 \u0438 \u0440\u0430\u0437\u0440\u044B\u0432\u0430\u0435\u0442 \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435.
dialog_setting_ssl_advanced_title=\u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E
dialog_setting_ssl_advanced_keystore_title=\u0412\u044B\u0431\u0440\u0430\u0442\u044C \u0444\u0430\u0439\u043B \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0430
dialog_setting_ssl_advanced_keystore_label=\u0425\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435
dialog_setting_ssl_advanced_keystore_password_label=\u041F\u0430\u0440\u043E\u043B\u044C \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0430
dialog_setting_ssl_advanced_hostname_label=\u0418\u043C\u044F \u0445\u043E\u0441\u0442\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u0430
dialog_setting_ssl_advanced_hostname_tip=\u0418\u043C\u044F \u0445\u043E\u0441\u0442\u0430, \u043A\u043E\u0442\u043E\u0440\u043E\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C\u0441\u044F \u0434\u043B\u044F \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 TLS/SSL \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u0430.
dialog_create_db_title=\u0421\u043E\u0437\u0434\u0430\u0442\u044C \u0431\u0430\u0437\u0443 \u0434\u0430\u043D\u043D\u044B\u0445
......
......@@ -19,6 +19,7 @@ package org.jkiss.dbeaver.ext.mssql.ui.views;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Text;
......@@ -26,11 +27,16 @@ import org.jkiss.dbeaver.ext.mssql.SQLServerConstants;
import org.jkiss.dbeaver.ext.mssql.ui.SQLServerUIMessages;
import org.jkiss.dbeaver.model.net.DBWHandlerConfiguration;
import org.jkiss.dbeaver.ui.UIUtils;
import org.jkiss.dbeaver.ui.dialogs.net.SSLConfiguratorTrustStoreUI;
import org.jkiss.dbeaver.ui.controls.TextWithOpen;
import org.jkiss.dbeaver.ui.controls.TextWithOpenFile;
import org.jkiss.dbeaver.ui.dialogs.net.SSLConfiguratorAbstractUI;
import org.jkiss.utils.CommonUtils;
public class SQLServerSSLConfigurator extends SSLConfiguratorTrustStoreUI {
public class SQLServerSSLConfigurator extends SSLConfiguratorAbstractUI {
private TextWithOpen keystoreFile;
private Text keystorePassword;
private Text keystoreHostname;
private Button trustServerCertificate;
@Override
public void createControl(Composite parent, Runnable propertyChangeListener) {
......@@ -41,29 +47,54 @@ public class SQLServerSSLConfigurator extends SSLConfiguratorTrustStoreUI {
composite.setLayoutData(gd);
createSSLConfigHint(composite, true, 1);
createTrustStoreConfigGroup(composite);
/*
* We should adopt this code and make it part of the
* SSLConfiguratorTrustStoreUI, allowing user to
* choose between using keystore file along with its
* password, or use CA certificate and Client
* certificate & password separately. (#9912)
*/
{
Group advancedGroup = UIUtils.createControlGroup(composite, SQLServerUIMessages.dialog_setting_ssl_advanced_title, 2, GridData.FILL_HORIZONTAL, -1);
UIUtils.createControlLabel(advancedGroup, SQLServerUIMessages.dialog_setting_ssl_advanced_keystore_label);
gd = new GridData(GridData.FILL_HORIZONTAL);
gd.minimumWidth = 130;
keystoreFile = new TextWithOpenFile(advancedGroup, SQLServerUIMessages.dialog_setting_ssl_advanced_keystore_title, new String[]{"*.jks;*.pfx"});
keystoreFile.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
UIUtils.createControlLabel(advancedGroup, SQLServerUIMessages.dialog_setting_ssl_advanced_keystore_password_label);
gd = new GridData(GridData.FILL_HORIZONTAL);
gd.minimumWidth = 130;
keystorePassword = new Text(advancedGroup, SWT.BORDER | SWT.PASSWORD);
keystorePassword.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
UIUtils.createControlLabel(advancedGroup, SQLServerUIMessages.dialog_setting_ssl_advanced_hostname_label);
gd = new GridData(GridData.FILL_HORIZONTAL);
gd.minimumWidth = 130;
keystoreHostname = new Text(advancedGroup, SWT.BORDER);
keystoreHostname.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
keystoreHostname.setToolTipText(SQLServerUIMessages.dialog_setting_ssl_advanced_hostname_tip);
trustServerCertificate = UIUtils.createCheckbox(advancedGroup, SQLServerUIMessages.dialog_setting_trust_server_certificate, SQLServerUIMessages.dialog_setting_trust_server_certificate_tip, true, 2);
}
}
@Override
public void loadSettings(DBWHandlerConfiguration configuration) {
super.loadSettings(configuration);
keystoreFile.setText(CommonUtils.notEmpty(configuration.getStringProperty(SQLServerConstants.PROP_SSL_KEYSTORE)));
keystorePassword.setText(CommonUtils.notEmpty(configuration.getStringProperty(SQLServerConstants.PROP_SSL_KEYSTORE_PASSWORD)));
keystoreHostname.setText(CommonUtils.notEmpty(configuration.getStringProperty(SQLServerConstants.PROP_SSL_KEYSTORE_HOSTNAME)));
trustServerCertificate.setSelection(configuration.getBooleanProperty(SQLServerConstants.PROP_SSL_TRUST_SERVER_CERTIFICATE));
}
@Override
public void saveSettings(DBWHandlerConfiguration configuration) {
super.saveSettings(configuration);
configuration.setProperty(SQLServerConstants.PROP_SSL_KEYSTORE, keystoreFile.getText().trim());
configuration.setProperty(SQLServerConstants.PROP_SSL_KEYSTORE_PASSWORD, keystorePassword.getText().trim());
configuration.setProperty(SQLServerConstants.PROP_SSL_KEYSTORE_HOSTNAME, keystoreHostname.getText().trim());
configuration.setProperty(SQLServerConstants.PROP_SSL_TRUST_SERVER_CERTIFICATE, trustServerCertificate.getSelection());
}
}
......@@ -35,7 +35,10 @@ public class SQLServerConstants {
public static final String HANDLER_SSL = "mssql_ssl";
public static final String PROP_SSL_KEYSTORE = "sslKeyStore";
public static final String PROP_SSL_KEYSTORE_PASSWORD = "sslKeyStorePassword";
public static final String PROP_SSL_KEYSTORE_HOSTNAME = "sslKeyStoreHostname";
public static final String PROP_SSL_TRUST_SERVER_CERTIFICATE = "sslTrustServerCertificate";
public static final boolean USE_GSS = false;
......@@ -82,7 +85,6 @@ public class SQLServerConstants {
public static final String PROP_CONNECTION_AUTHENTICATION = "authentication";
public static final String PROP_CONNECTION_AUTHENTICATION_SCHEME = "authenticationScheme";
public static final String PROP_TRUST_SERVER_CERTIFICATE = "trustServerCertificate";
public static final String PROP_DOMAIN = "domain";
public static final String AUTH_SQL_SERVER_PASSWORD = "SqlPassword";
......
......@@ -50,6 +50,7 @@ import org.jkiss.utils.CommonUtils;
import java.sql.SQLException;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Properties;
public class SQLServerDataSource extends JDBCDataSource implements DBSInstanceContainer, DBPObjectStatisticsCollector, IAdaptable {
......@@ -134,25 +135,39 @@ public class SQLServerDataSource extends JDBCDataSource implements DBSInstanceCo
final DBWHandlerConfiguration sslConfig = getContainer().getActualConnectionConfiguration().getHandler(SQLServerConstants.HANDLER_SSL);
if (sslConfig != null && sslConfig.isEnabled()) {
try {
SSLHandlerTrustStoreImpl.initializeTrustStore(monitor, this, sslConfig);
DBACertificateStorage certificateStorage = getContainer().getPlatform().getCertificateStorage();
String keyStorePath = certificateStorage.getKeyStorePath(getContainer(), "ssl").getAbsolutePath();
initSSL(monitor, properties, sslConfig);
}
return properties;
}
properties.setProperty("encrypt", "true");
properties.setProperty("trustStore", keyStorePath);
properties.setProperty("trustStoreType", "JKS");
private void initSSL(DBRProgressMonitor monitor, Properties properties, DBWHandlerConfiguration sslConfig) throws DBCException {
monitor.subTask("Install SSL certificates");
final String keystoreHostnameProp = sslConfig.getStringProperty(SQLServerConstants.PROP_SSL_KEYSTORE_HOSTNAME);
if (!CommonUtils.isEmpty(keystoreHostnameProp)) {
properties.put("hostNameInCertificate", keystoreHostnameProp);
}
} catch (Exception e) {
throw new DBCException("Error initializing SSL trust store", e);
try {
// SSLHandlerTrustStoreImpl.initializeTrustStore(monitor, this, sslConfig);
// DBACertificateStorage certificateStorage = getContainer().getPlatform().getCertificateStorage();
// String keyStorePath = certificateStorage.getKeyStorePath(getContainer(), "ssl").getAbsolutePath();
properties.setProperty("encrypt", "true");
final String keystoreFileProp = sslConfig.getStringProperty(SQLServerConstants.PROP_SSL_KEYSTORE);
if (!CommonUtils.isEmpty(keystoreFileProp)) {
properties.put("trustStore", keystoreFileProp);
}
}
return properties;
final String keystorePasswordProp = sslConfig.getStringProperty(SQLServerConstants.PROP_SSL_KEYSTORE_PASSWORD);
if (!CommonUtils.isEmpty(keystorePasswordProp)) {
properties.put("trustStorePassword", keystorePasswordProp);
}
final String keystoreHostnameProp = sslConfig.getStringProperty(SQLServerConstants.PROP_SSL_KEYSTORE_HOSTNAME);
if (!CommonUtils.isEmpty(keystoreHostnameProp)) {
properties.put("hostNameInCertificate", keystoreHostnameProp);
}
} catch (Exception e) {
throw new DBCException("Error initializing SSL trust store", e);
}
}
@Override
......
......@@ -34,6 +34,7 @@ import org.jkiss.dbeaver.model.impl.sql.edit.struct.SQLTableColumnManager;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.sql.SQLUtils;
import org.jkiss.dbeaver.model.struct.DBSObject;
import org.jkiss.dbeaver.model.struct.DBSTypedObject;
import org.jkiss.dbeaver.model.struct.cache.DBSObjectCache;
import org.jkiss.utils.ArrayUtils;
import org.jkiss.utils.CommonUtils;
......@@ -75,69 +76,73 @@ public class PostgreTableColumnManager extends SQLTableColumnManager<PostgreTabl
getColumnDataTypeModifiers(monitor, column, sql);
};
public static StringBuilder getColumnDataTypeModifiers(DBRProgressMonitor monitor, PostgreTableColumn column, StringBuilder sql) {
final PostgreDataType dataType = column.getDataType();
final PostgreDataType rawType = null;//dataType.getElementType(monitor);
switch (dataType.getDataKind()) {
case STRING:
final long length = column.getMaxLength();
if (length > 0 && length < Integer.MAX_VALUE) {
sql.append('(').append(length).append(')');
}
break;
case NUMERIC:
if (dataType.getTypeID() == Types.NUMERIC) {
final int precision = CommonUtils.toInt(column.getPrecision());
final int scale = CommonUtils.toInt(column.getScale());
if (scale > 0 || precision > 0) {
sql.append('(');
if (precision > 0) {
sql.append(precision);
}
if (scale > 0) {
public static StringBuilder getColumnDataTypeModifiers(DBRProgressMonitor monitor, DBSTypedObject column, StringBuilder sql) {
if (column instanceof PostgreTableColumn) {
PostgreTableColumn postgreColumn = (PostgreTableColumn) column;
final PostgreDataType dataType = postgreColumn.getDataType();
final PostgreDataType rawType = null;//dataType.getElementType(monitor);
switch (dataType.getDataKind()) {
case STRING:
final long length = postgreColumn.getMaxLength();
if (length > 0 && length < Integer.MAX_VALUE) {
sql.append('(').append(length).append(')');
}
break;
case NUMERIC:
if (dataType.getTypeID() == Types.NUMERIC) {
final int precision = CommonUtils.toInt(postgreColumn.getPrecision());
final int scale = CommonUtils.toInt(postgreColumn.getScale());
if (scale > 0 || precision > 0) {
sql.append('(');
if (precision > 0) {
sql.append(',');
sql.append(precision);
}
sql.append(scale);
if (scale > 0) {
if (precision > 0) {
sql.append(',');
}
sql.append(scale);
}
sql.append(')');
}
sql.append(')');
}
}
break;
case DATETIME:
final int scale = CommonUtils.toInt(column.getScale());
String typeName = dataType.getName();
if (typeName.startsWith(PostgreConstants.TYPE_TIMESTAMP) || typeName.equals(PostgreConstants.TYPE_TIME)) {
if (scale < 6) {
sql.append('(').append(scale).append(')');
break;
case DATETIME:
final int scale = CommonUtils.toInt(postgreColumn.getScale());
String typeName = dataType.getName();
if (typeName.startsWith(PostgreConstants.TYPE_TIMESTAMP) || typeName.equals(PostgreConstants.TYPE_TIME)) {
if (scale < 6) {
sql.append('(').append(scale).append(')');
}
}
}
if (typeName.equals(PostgreConstants.TYPE_INTERVAL)) {
final String precision = column.getIntervalTypeField();
sql.append(' ').append(precision);
if (scale >= 0 && scale < 7) {
sql.append('(').append(scale).append(')');
if (typeName.equals(PostgreConstants.TYPE_INTERVAL)) {
final String precision = postgreColumn.getIntervalTypeField();
sql.append(' ').append(precision);
if (scale >= 0 && scale < 7) {
sql.append('(').append(scale).append(')');
}
}
}
}
if (PostgreUtils.isGISDataType(column.getTypeName())) {
try {
String geometryType = column.getAttributeGeometryType(monitor);
int geometrySRID = column.getAttributeGeometrySRID(monitor);
if (geometryType != null && !PostgreConstants.TYPE_GEOMETRY.equalsIgnoreCase(geometryType) && !PostgreConstants.TYPE_GEOGRAPHY.equalsIgnoreCase(geometryType)) {
// If data type is exactly GEOMETRY or GEOGRAPHY then it doesn't have qualifiers
sql.append("(").append(geometryType);
if (geometrySRID > 0) {
sql.append(", ").append(geometrySRID);
}
if (PostgreUtils.isGISDataType(postgreColumn.getTypeName())) {
try {
String geometryType = postgreColumn.getAttributeGeometryType(monitor);
int geometrySRID = postgreColumn.getAttributeGeometrySRID(monitor);
if (geometryType != null && !PostgreConstants.TYPE_GEOMETRY.equalsIgnoreCase(geometryType) && !PostgreConstants.TYPE_GEOGRAPHY.equalsIgnoreCase(geometryType)) {
// If data type is exactly GEOMETRY or GEOGRAPHY then it doesn't have qualifiers
sql.append("(").append(geometryType);
if (geometrySRID > 0) {
sql.append(", ").append(geometrySRID);
}
sql.append(")");
}
sql.append(")");
} catch (DBCException e) {
log.debug(e);
}
} catch (DBCException e) {
log.debug(e);
}
}
if (rawType != null) {
sql.append("[]");
if (rawType != null) {
sql.append("[]");
}
return sql;
}
return sql;
}
......
......@@ -847,7 +847,7 @@ public class PostgreDialect extends JDBCSQLDialect implements TPRuleProvider {
@Override
public String getColumnTypeModifiers(@NotNull DBPDataSource dataSource, @NotNull DBSTypedObject column, @NotNull String typeName, @NotNull DBPDataKind dataKind) {
StringBuilder columnModifier = PostgreTableColumnManager.getColumnDataTypeModifiers(new VoidProgressMonitor(), (PostgreTableColumn) column, new StringBuilder());
StringBuilder columnModifier = PostgreTableColumnManager.getColumnDataTypeModifiers(new VoidProgressMonitor(), column, new StringBuilder());
if (columnModifier.length() != 0) {
return columnModifier.toString();
}
......
/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2020 DBeaver Corp and others
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jkiss.dbeaver.ext.postgresql.model;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.DBPDataSourceContainer;
import org.jkiss.dbeaver.model.app.DBPPlatform;
import org.jkiss.dbeaver.model.edit.DBERegistry;
import org.jkiss.dbeaver.model.exec.jdbc.JDBCResultSet;
import org.jkiss.dbeaver.model.impl.sql.edit.SQLObjectEditor;
import org.jkiss.dbeaver.model.impl.sql.edit.struct.SQLTableManager;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.runners.MockitoJUnitRunner;
import java.sql.SQLException;
import java.util.Collections;
import java.util.List;
@RunWith(MockitoJUnitRunner.class)
public class PostgreTableBaseTest {
private static final Log log = Log.getLog(PostgreTableBaseTest.class);
@Mock
DBRProgressMonitor monitor;
@Mock
PostgreDataSource mockDataSource;
@Mock
PostgreDatabase mockDatabase;
@Mock
PostgreSchema mockSchema;
@Mock
JDBCResultSet mockResults;
@Mock
private PostgreServerExtension mockPostgreServer;
@Mock
PostgreSchema.TableCache mockTableCache;
@Mock
DBPDataSourceContainer mockDataSourceContainer;
@Mock
DBERegistry mockEditorsRegistry;
@Mock
SQLTableManager mockEntityEditor;
@Mock
DBPPlatform mockDPlatform;
private PostgreView postgreView;
private final long sampleId = 111111;
@Before
public void setUp() throws SQLException {
Mockito.when(mockDataSource.getSQLDialect()).thenReturn(new PostgreDialect());
Mockito.when(mockDataSource.isServerVersionAtLeast(Mockito.anyInt(), Mockito.anyInt())).thenReturn(false);
Mockito.when(mockDataSource.getDefaultInstance()).thenReturn(mockDatabase);
Mockito.when(mockDataSource.getServerType()).thenReturn(mockPostgreServer);
Mockito.when(mockDataSource.getContainer()).thenReturn(mockDataSourceContainer);
Mockito.when(mockDataSourceContainer.getPlatform()).thenReturn(mockDPlatform);
Mockito.when(mockDPlatform.getEditorsRegistry()).thenReturn(mockEditorsRegistry);
Mockito.when(mockEditorsRegistry.getObjectManager(PostgreTableRegular.class, SQLObjectEditor.class)).thenReturn(mockEntityEditor);
Mockito.when(mockDatabase.getName()).thenReturn("sampleDatabase");
Mockito.when(mockSchema.getDatabase()).thenReturn(mockDatabase);
Mockito.when(mockSchema.getSchema()).thenReturn(mockSchema);
Mockito.when(mockSchema.getDataSource()).thenReturn(mockDataSource);
Mockito.when(mockSchema.getName()).thenReturn("sampleSchema");
Mockito.when(mockSchema.getTableCache()).thenReturn(mockTableCache);
Mockito.when(mockResults.getString("relname")).thenReturn("sampleTable");
Mockito.when(mockResults.getLong("oid")).thenReturn(sampleId);
Mockito.when(mockResults.getLong("relowner")).thenReturn(sampleId);
postgreView = new PostgreView(mockSchema);
postgreView.setName("sampleView");
}
@Test
public void generateChangeOwnerQuery_whenProvidedView_thenShouldGenerateQuerySuccessfully() {
Assert.assertEquals("ALTER TABLE sampleSchema.sampleView OWNER TO someOwner",
postgreView.generateChangeOwnerQuery("someOwner"));
}
@Test
public void generateTableDDL_whenTableHasOneColumn_returnDDLForASingleColumn() throws DBException {
PostgreTableColumn mockPostgreTableColumn = mockDbColumn("column1", "int4", 1);
List<PostgreTableColumn> tableColumns = Collections.singletonList(mockPostgreTableColumn);
PostgreTableRegular tableRegular = new PostgreTableRegular(mockSchema);
tableRegular.setPartition(false);
addMockColumnsToTableCache(tableColumns, tableRegular);
String expectedDDL =
"CREATE TABLE sampleDatabase.sampleSchema.sampleTable (\n\tcolumn1 int4\n)\n";
//DBStructUtils.generateTableDDL asks for a lot of objects that is not easy to mock
//Assert.assertEquals(expectedDDL, tableRegular.getObjectDefinitionText(monitor, Collections.emptyMap()));
if (tableRegular.getObjectDefinitionText(monitor, Collections.emptyMap()) == null) {
log.warn("Table DDL is empty");
}
}
@Test
public void generateExtensionDDL_whenExtensionHasPublicSchemaAndNoVersion_returnDDLForExtensionWithPublicSchemaAndWithoutVersion() throws DBException {
PostgreExtension postgreExtension = new PostgreExtension(mockDatabase);
postgreExtension.setName("extName");
String expectedDDL = "-- Extension: extName\n\n" +
"-- DROP EXTENSION extName;\n\n" +
"CREATE EXTENSION extName\n\t" +
"SCHEMA \"public\"\n\t" +
"VERSION null";
String actualDDL = postgreExtension.getObjectDefinitionText(monitor, Collections.emptyMap());
Assert.assertEquals(expectedDDL, actualDDL);
}
private PostgreTableColumn mockDbColumn(String columnName, String columnType, int ordinalPosition) {
PostgreTableColumn mockPostgreTableColumn = Mockito.mock(PostgreTableColumn.class);
Mockito.when(mockPostgreTableColumn.getName()).thenReturn(columnName);
Mockito.when(mockPostgreTableColumn.getTypeName()).thenReturn(columnType);
Mockito.when(mockPostgreTableColumn.getOrdinalPosition()).thenReturn(ordinalPosition);
return mockPostgreTableColumn;
}
private void addMockColumnsToTableCache(List<PostgreTableColumn> tableColumns, PostgreTableRegular table)
throws DBException {
Mockito.when(mockTableCache.getChildren(monitor, mockSchema, table)).thenReturn(tableColumns);
}
}
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册