提交 7ee57d88 编写于 作者: A Andrew Khitrin

#6051 Extension manager

上级 7d3df633
......@@ -114,6 +114,10 @@
<configurator class="org.jkiss.dbeaver.ext.postgresql.edit.PostgreTableColumnConfigurator">
<objectType name="org.jkiss.dbeaver.ext.postgresql.model.PostgreTableColumn"/>
</configurator>
<configurator class="org.jkiss.dbeaver.ext.postgresql.edit.PostgreExtensionConfigurator">
<objectType name="org.jkiss.dbeaver.ext.postgresql.model.PostgreExtension"/>
</configurator>
</extension>
<extension point="org.jkiss.dbeaver.dataManager">
......@@ -212,6 +216,24 @@
label="Disable trigger"
singleton="false">
<objectType name="org.jkiss.dbeaver.ext.postgresql.model.PostgreTrigger" if="object.enabledState != 'D'"/>
</tool>
<tool
class="org.jkiss.dbeaver.ext.postgresql.tools.maintenance.PostgreToolExtensionUninstall"
description="Uninstall extension"
id="org.jkiss.dbeaver.ext.postgresql.tools.maintenance.PostgreToolExtensionUninstall"
group="org.jkiss.dbeaver.ext.postgresql.tools.maintenance"
label="Uninstall"
singleton="false">
<objectType name="org.jkiss.dbeaver.ext.postgresql.model.PostgreExtension"/>
</tool>
<tool
class="org.jkiss.dbeaver.ext.postgresql.tools.maintenance.PostgreToolExtensionUninstall"
description="Uninstall extension"
id="org.jkiss.dbeaver.ext.postgresql.tools.maintenance.PostgreToolExtensionUninstall"
group="org.jkiss.dbeaver.ext.postgresql.tools.maintenance"
label="Uninstall"
singleton="false">
<objectType name="org.jkiss.dbeaver.ext.postgresql.model.PostgreAvailableExtension" if="object.isInstalled()"/>
</tool>
<tool
class="org.jkiss.dbeaver.ext.postgresql.tools.maintenance.PostgreToolTriggerEnable"
......
......@@ -122,6 +122,11 @@ public class PostgreMessages extends NLS {
public static String dialog_create_schema_owner;
public static String dialog_create_schema_title;
/* dialog create extension */
public static String dialog_create_extension_name;
public static String dialog_create_extension_schema;
public static String dialog_create_extension_title;
/* PostgresSSLConfigurator */
public static String dialog_connection_network_postgres_ssl_certificates;
public static String dialog_connection_network_postgres_ssl_certificates_root;
......
......@@ -103,6 +103,16 @@ dialog_create_schema_name=Schema name
dialog_create_schema_owner=Owner
dialog_create_schema_title=Create schema
# dialog create schema #
dialog_create_schema_name=Schema name
dialog_create_schema_owner=Owner
dialog_create_schema_title=Create schema
# dialog create extension #
dialog_create_extension_name=Extension
dialog_create_extension_schema=Schema
dialog_create_extension_title=Install extensions
# PostgresSSLConfigurator #
dialog_connection_network_postgres_ssl_advanced = Advanced
dialog_connection_network_postgres_ssl_advanced_ssl_factory = SSL Factory
......
......@@ -26,6 +26,10 @@ dialog_create_role_title = \u0421\u043E\u0437\u0434\u0430\u0442\u044C \u0440\u04
dialog_create_schema_name = \u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u0441\u0445\u0435\u043C\u044B
dialog_create_schema_owner = \u0412\u043B\u0430\u0434\u0435\u043B\u0435\u0446
dialog_create_schema_title = \u0421\u043E\u0437\u0434\u0430\u0442\u044C \u0441\u0445\u0435\u043C\u0443
# dialog create extension #
dialog_create_extension_name=\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u0435
dialog_create_extension_schema=\u0421\u0445\u0435\u043C\u0430
dialog_create_extension_title=\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u044F
dialog_setting_connection_database = \u0411\u0430\u0437\u0430 \u0434\u0430\u043D\u043D\u044B\u0445
dialog_setting_connection_host = \u0425\u043E\u0441\u0442
dialog_setting_connection_localClient = \u041B\u043E\u043A\u0430\u043B\u044C\u043D\u044B\u0439 \u043A\u043B\u0438\u0435\u043D\u0442
......
/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2019 Serge Rider (serge@jkiss.org)
* Copyright (C) 2019 Andrew Khitrin (ahitrin@gmail.com)
*
* 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.edit;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.jkiss.dbeaver.ext.postgresql.model.PostgreExtension;
import org.jkiss.dbeaver.ext.postgresql.ui.PostgreCreateExtensionDialog;
import org.jkiss.dbeaver.model.edit.DBEObjectConfigurator;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.ui.UITask;
import org.jkiss.dbeaver.ui.UIUtils;
public class PostgreExtensionConfigurator implements DBEObjectConfigurator<PostgreExtension> {
@Override
public PostgreExtension configureObject(DBRProgressMonitor monitor, Object parent, PostgreExtension extension) {
return new UITask<PostgreExtension>() {
@Override
protected PostgreExtension runTask() {
PostgreCreateExtensionDialog dialog = new PostgreCreateExtensionDialog(UIUtils.getActiveWorkbenchShell(), extension);
if (dialog.open() != IDialogConstants.OK_ID) {
return null;
}
extension.setName(dialog.getExtension().getName());
extension.setSchema(dialog.getSchema().getName());
return extension;
}
}.execute();
}
}
/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2019 Serge Rider (serge@jkiss.org)
* Copyright (C) 2019 Andrew Khitrin (ahitrin@gmail.com)
*
* 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.tools.maintenance;
import java.lang.reflect.InvocationTargetException;
import java.util.Collection;
import java.util.List;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.IWorkbenchWindow;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.ext.postgresql.model.PostgreObject;
import org.jkiss.dbeaver.model.navigator.DBNDatabaseNode;
import org.jkiss.dbeaver.model.navigator.DBNUtils;
import org.jkiss.dbeaver.model.struct.DBSObject;
import org.jkiss.dbeaver.runtime.DBWorkbench;
import org.jkiss.dbeaver.ui.UIUtils;
import org.jkiss.dbeaver.ui.tools.IUserInterfaceTool;
import org.jkiss.utils.CommonUtils;
public class PostgreToolExtensionUninstall implements IUserInterfaceTool {
@Override
public void execute(IWorkbenchWindow window, IWorkbenchPart activePart, Collection<DBSObject> objects)
throws DBException {
List<PostgreObject> extensionList = CommonUtils.filterCollection(objects, PostgreObject.class);
if (!extensionList.isEmpty()) {
SQLDialog dialog = new SQLDialog(activePart.getSite(), extensionList);
if (dialog.open() == IDialogConstants.OK_ID) {
refreshObjectsState(extensionList);
}
}
}
private void refreshObjectsState(List<PostgreObject> extList) {
try {
UIUtils.runInProgressDialog(monitor -> {
for (PostgreObject ext : extList) {
try {
DBNDatabaseNode extNode = DBNUtils.getNodeByObject(ext);
if (extNode != null) {
extNode.refreshNode(monitor, PostgreToolExtensionUninstall.this);
}
} catch (DBException e) {
throw new InvocationTargetException(e);
}
}
});
} catch (InvocationTargetException e) {
DBWorkbench.getPlatformUI().showError("Refresh extensions state", "Error refreshign extension state", e.getTargetException());
}
}
class SQLDialog extends TableToolDialog {
public SQLDialog(IWorkbenchPartSite partSite, List<PostgreObject> exts) {
super(partSite, "Uninstall extension", exts);
}
@Override
protected void generateObjectCommand(List<String> lines, PostgreObject object) {
lines.add("DROP EXTENSION " + ((PostgreObject) object).getName() + " CASCADE");
}
@Override
protected void createControls(Composite parent) {
createObjectsSelector(parent);
}
}
}
/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2019 Serge Rider (serge@jkiss.org)
*
* 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.ui;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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.Shell;
import org.eclipse.swt.widgets.Text;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.ext.postgresql.PostgreMessages;
import org.jkiss.dbeaver.ext.postgresql.model.PostgreSchema;
import org.jkiss.dbeaver.ext.postgresql.model.PostgreAvailableExtension;
import org.jkiss.dbeaver.ext.postgresql.model.PostgreExtension;
import org.jkiss.dbeaver.model.runtime.AbstractJob;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.ui.UIUtils;
import org.jkiss.dbeaver.ui.dialogs.BaseDialog;
import org.jkiss.dbeaver.utils.GeneralUtils;
import java.util.ArrayList;
import java.util.List;
/**
* PostgreCreateExtensionDialog
*/
public class PostgreCreateExtensionDialog extends BaseDialog
{
private PostgreAvailableExtension extension;
private final PostgreExtension newextension;
private List<PostgreSchema> allSchemas;
private String name;
private PostgreSchema schema;
private List<PostgreAvailableExtension> installed;
public PostgreCreateExtensionDialog(Shell parentShell, PostgreExtension extension) {
super(parentShell, PostgreMessages.dialog_create_extension_title, null);
this.newextension = extension;
}
private void checkEnabled() {
getButton(IDialogConstants.OK_ID).setEnabled(extension != null && schema != null);
}
@Override
protected Composite createDialogArea(Composite parent) {
final Composite composite = super.createDialogArea(parent);
final Composite group = new Composite(composite, SWT.NONE);
group.setLayout(new GridLayout(2, false));
group.setLayoutData(new GridData(GridData.FILL_BOTH));
final Text databaseText = UIUtils.createLabelText(group, "Database", newextension.getDatabase().getName(), SWT.BORDER | SWT.READ_ONLY); //$NON-NLS-2$
final Combo extensionCombo = UIUtils.createLabelCombo(group, PostgreMessages.dialog_create_extension_name, SWT.BORDER | SWT.DROP_DOWN | SWT.READ_ONLY);
final Combo schemaCombo = UIUtils.createLabelCombo(group, PostgreMessages.dialog_create_extension_schema, SWT.BORDER | SWT.DROP_DOWN | SWT.READ_ONLY);
schemaCombo.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
schema = allSchemas.get(schemaCombo.getSelectionIndex());
checkEnabled();
}
});
extensionCombo.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
extension = installed.get(extensionCombo.getSelectionIndex());
extensionCombo.setToolTipText(installed.get(extensionCombo.getSelectionIndex()).getDescription());
checkEnabled();
}
});
new AbstractJob("Load schemas") {
@Override
protected IStatus run(DBRProgressMonitor monitor) {
try {
allSchemas = new ArrayList<>(newextension.getDatabase().getSchemas(monitor));
UIUtils.syncExec(() -> {
for (PostgreSchema schema : allSchemas) {
schemaCombo.add(schema.getName());
}
});
} catch (DBException e) {
return GeneralUtils.makeExceptionStatus(e);
}
return Status.OK_STATUS;
}
}.schedule();
new AbstractJob("Load available extensions") {
@Override
protected IStatus run(DBRProgressMonitor monitor) {
try {
installed = new ArrayList<>(newextension.getDatabase().getAvailableExtensions(monitor));
UIUtils.syncExec(() -> {
for (PostgreAvailableExtension e : installed) {
extensionCombo.add(e.getName());
}
});
} catch (DBException e) {
return GeneralUtils.makeExceptionStatus(e);
}
return Status.OK_STATUS;
}
}.schedule();
return composite;
}
@Override
protected void createButtonsForButtonBar(Composite parent)
{
super.createButtonsForButtonBar(parent);
getButton(IDialogConstants.OK_ID).setEnabled(false);
}
public PostgreAvailableExtension getExtension() {
return extension;
}
public PostgreSchema getSchema() {
return schema;
}
}
......@@ -178,11 +178,25 @@ meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreDatabase.name.description=
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreDatabase.template.name=Template
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreDatabase.template.description=
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreExtension.name.name=Name
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreExtension.name.description=
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreExtension.name.description=Extension name
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreExtension.schema.name=Schema
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreExtension.schema.description=
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreExtension.schema.description=Installed schema
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreExtension.version.name=Version
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreExtension.version.description=
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreExtension.version.description=Installed version
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreExtension.relocatable.name=Relocatable
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreExtension.relocatable.description=Can be relocated
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreExtension.tables.name=Tables
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreExtension.tables.description=Using tables
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreExtension.conditions.name=Conditions
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreExtension.conditions.description=ExtensionConditions
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAvailableExtension.name.name=Name
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAvailableExtension.name.description=Extension name
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAvailableExtension.version.name=Version
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAvailableExtension.version.description=Extension version
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAvailableExtension.installedVersion.name=Installed
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAvailableExtension.installedVersion.description=Installed version
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAvailableExtension.description.name=Description
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAvailableExtension.description.description=Comment
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAggregate.name.name=Name
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAggregate.name.description=Aggregate function name
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAggregate.inputTypes.name=Inputs
......@@ -576,8 +590,10 @@ tree.database.node.name=Database
tree.databases.node.name=Databases
tree.encoding.node.name=Encoding
tree.encodings.node.name=Encodings
tree.extension.node.name=Extension
tree.extensions.node.name=Extensions
tree.extension.node.name=Installed Extension
tree.extensions.node.name=Installed Extensions
tree.avalextension.node.name=Available Extension
tree.avalextensions.node.name=Available Extensions
tree.foreignDataWrapper.node.name=Foreign data wrapper
tree.foreignDataWrappers.node.name=Foreign data wrappers
tree.foreignServer.node.name=Foreign server
......
......@@ -174,6 +174,20 @@ meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreExtension.schema.name=\u0421\
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreExtension.schema.description=
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreExtension.version.name=\u0412\u0435\u0440\u0441\u0438\u044F
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreExtension.version.description=
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreExtension.relocatable.name=\u041F\u0435\u0440\u0435\u043C\u0435\u0449\u0430\u0435\u043C\u043E\u0435
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreExtension.relocatable.description=\u041C\u043E\u0436\u043D\u043E \u043F\u0435\u0440\u0435\u043C\u0435\u0441\u0442\u0438\u0442\u044C \u0432 \u0434\u0440\u0443\u0433\u0443\u044E \u0441\u0445\u0435\u043C\u0443
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreExtension.tables.name=\u0422\u0430\u0431\u043B\u0438\u0446\u044B
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreExtension.tables.description=\u0442\u0430\u0431\u043B\u0438\u0446\u044B \u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u044F
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreExtension.conditions.name=\u0423\u0441\u043B\u043E\u0432\u0438\u044F
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreExtension.conditions.description=\u0444\u0438\u043B\u044C\u0442\u0440\u0430 WHERE \u0434\u043B\u044F \u0442\u0430\u0431\u043B\u0438\u0446 \u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u044F
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAvailableExtension.name.name=\u0418\u043C\u044F
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAvailableExtension.name.description=\u0418\u043C\u044F \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u044F
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAvailableExtension.version.name=\u0412\u0435\u0440\u0441\u0438\u044F
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAvailableExtension.version.description=\u0412\u0435\u0440\u0441\u0438\u044F \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u044F
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAvailableExtension.installedVersion.name=\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAvailableExtension.installedVersion.description=\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u0430\u044F \u0432\u0435\u0440\u0441\u0438\u044F
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAvailableExtension.description.name=\u041E\u043F\u0438\u0441\u0430\u043D\u0438\u0435
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreAvailableExtension.description.description=\u041A\u0440\u0430\u0442\u043A\u043E\u0435 \u043E\u043F\u0438\u0441\u0430\u043D\u0438\u0435
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreForeignDataWrapper.handler.name=\u0424\u0443\u043D\u043A\u0446\u0438\u044F \u0443\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044F
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreForeignDataWrapper.handler.description=\u0424\u0443\u043D\u043A\u0446\u0438\u044F \u0443\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044F
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreForeignDataWrapper.name.name=\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435
......@@ -493,8 +507,10 @@ tree.database.node.name=\u0411\u0430\u0437\u0430 \u0434\u0430\u043D\u043D\u044B\
tree.databases.node.name=\u0411\u0430\u0437\u044B \u0434\u0430\u043D\u043D\u044B\u0445
tree.encoding.node.name=\u041A\u043E\u0434\u0438\u0440\u043E\u0432\u043A\u0430
tree.encodings.node.name=\u041A\u043E\u0434\u0438\u0440\u043E\u0432\u043A\u0438
tree.extension.node.name=\u041C\u043E\u0434\u0443\u043B\u044C \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u044F
tree.extensions.node.name=\u041C\u043E\u0434\u0443\u043B\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u044F
tree.extension.node.name=\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u043E\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u044F
tree.extensions.node.name=\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u044B\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u044F
tree.avalextension.node.name=\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u044F
tree.avalextensions.node.name=\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u044F
tree.extensions.node.tip=\u0421\u043F\u0438\u0441\u043E\u043A \u0438\u043C\u0435\u043D \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u0439
tree.foreignDataWrapper.node.name=\u041E\u0431\u043E\u043B\u043E\u0447\u043A\u0430 \u0432\u043D\u0435\u0448\u043D\u0438\u0445 \u0434\u0430\u043D\u043D\u044B\u0445
tree.foreignDataWrappers.node.name=\u041E\u0431\u043E\u043B\u043E\u0447\u043A\u0438 \u0432\u043D\u0435\u0448\u043D\u0438\u0445 \u0434\u0430\u043D\u043D\u044B\u0445
......
......@@ -160,11 +160,6 @@
<folder type="org.jkiss.dbeaver.ext.postgresql.model.PostgreAggregate" label="%tree.aggregates.node.name" icon="#functions" description="%tree.aggregates.node.tip" visibleIf="object.dataSource.serverType.supportsAggregates()">
<items label="%tree.aggregate.node.name" path="aggregate" property="aggregateFunctions" icon="#function"/>
</folder>
<folder type="org.jkiss.dbeaver.ext.postgresql.model.PostgreInformation" label="%tree.information.node.name" icon="#folder_info" description="%tree.information.node.tip">
<folder type="org.jkiss.dbeaver.ext.postgresql.model.PostgreExtension" label="%tree.extensions.node.name" icon="#extensions" description="%tree.extensions.node.tip" visibleIf="object.dataSource.serverType.supportsExtensions()">
<items label="%tree.extension.node.name" path="extension" property="extensions" icon="#extension"/>
</folder>
</folder>
</items>
</folder>
......@@ -220,6 +215,9 @@
<folder type="org.jkiss.dbeaver.ext.postgresql.model.PostgreExtension" label="%tree.extensions.node.name" icon="#extensions" description="%tree.extensions.node.tip" visibleIf="object.dataSource.serverType.supportsExtensions()">
<items label="%tree.extension.node.name" path="extension" property="extensions" icon="#extension"/>
</folder>
<folder type="org.jkiss.dbeaver.ext.postgresql.model.PostgreAvailableExtension" label="%tree.avalextensions.node.name" icon="#extensions" description="%tree.extensions.node.tip" visibleIf="object.dataSource.serverType.supportsExtensions()">
<items label="%tree.avalextension.node.name" path="extension" property="availableExtensions" icon="#extension"/>
</folder>
</folder>
</items>
......@@ -447,6 +445,7 @@
<manager class="org.jkiss.dbeaver.ext.postgresql.edit.PostgreTriggerManager" objectType="org.jkiss.dbeaver.ext.postgresql.model.PostgreTrigger"/>
<manager class="org.jkiss.dbeaver.ext.postgresql.edit.PostgreProcedureManager" objectType="org.jkiss.dbeaver.ext.postgresql.model.PostgreProcedure"/>
<manager class="org.jkiss.dbeaver.ext.postgresql.edit.PostgreRoleManager" objectType="org.jkiss.dbeaver.ext.postgresql.model.PostgreRole"/>
<manager class="org.jkiss.dbeaver.ext.postgresql.edit.PostgreExtensionManager" objectType="org.jkiss.dbeaver.ext.postgresql.model.PostgreExtension"/>
</extension>
<extension point="org.jkiss.dbeaver.dataTypeProvider">
......
/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2019 Serge Rider (serge@jkiss.org)
* Copyright (C) 2019 Andrew Khitrin (ahitrin@gmail.com)
*
* 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.edit;
import java.util.List;
import java.util.Map;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.ext.postgresql.model.PostgreDatabase;
import org.jkiss.dbeaver.ext.postgresql.model.PostgreExtension;
import org.jkiss.dbeaver.model.DBPDataSource;
import org.jkiss.dbeaver.model.DBUtils;
import org.jkiss.dbeaver.model.edit.DBECommandContext;
import org.jkiss.dbeaver.model.edit.DBEPersistAction;
import org.jkiss.dbeaver.model.impl.DBSObjectCache;
import org.jkiss.dbeaver.model.impl.edit.SQLDatabasePersistAction;
import org.jkiss.dbeaver.model.impl.sql.edit.SQLObjectEditor;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
public class PostgreExtensionManager extends SQLObjectEditor<PostgreExtension, PostgreDatabase>{
@Override
public long getMakerOptions(DBPDataSource dataSource) {
return FEATURE_SAVE_IMMEDIATELY;
}
@Override
public DBSObjectCache<PostgreDatabase, PostgreExtension> getObjectsCache(PostgreExtension object) {
return object.getDatabase().extensionCache;
}
@Override
protected PostgreExtension createDatabaseObject(DBRProgressMonitor monitor, DBECommandContext context,
Object container, Object copyFrom, Map<String, Object> options) throws DBException {
return new PostgreExtension((PostgreDatabase) container);
}
@Override
protected void addObjectCreateActions(DBRProgressMonitor monitor, List<DBEPersistAction> actions,
SQLObjectEditor<PostgreExtension, PostgreDatabase>.ObjectCreateCommand command,
Map<String, Object> options) {
final PostgreExtension extension = command.getObject();
final StringBuilder script = new StringBuilder("CREATE EXTENSION " + DBUtils.getQuotedIdentifier(extension));
script.append(" SCHEMA ").append(extension.getSchema());
actions.add(
new SQLDatabasePersistAction("Create extension", script.toString()) //$NON-NLS-2$
);
}
@Override
protected void addObjectDeleteActions(List<DBEPersistAction> actions,
SQLObjectEditor<PostgreExtension, PostgreDatabase>.ObjectDeleteCommand command,
Map<String, Object> options) {
}
@Override
public boolean canCreateObject(Object container) {
return true;
}
@Override
public boolean canDeleteObject(PostgreExtension object) {
return false;
}
@Override
public boolean canEditObject(PostgreExtension object) {
return false;
}
}
/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2019 Serge Rider (serge@jkiss.org)
* Copyright (C) 2019 Andrew Khitrin (ahitrin@gmail.com)
*
* 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 java.sql.ResultSet;
import org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils;
import org.jkiss.dbeaver.model.meta.Property;
import org.jkiss.dbeaver.model.struct.DBSObject;
public class PostgreAvailableExtension implements PostgreObject{
private final PostgreDatabase database;
private final String name;
private final long oid;
private final String description;
private final String version;
private final String installed_version;
private final boolean installed;
public PostgreAvailableExtension(PostgreDatabase database,ResultSet dbResult)
{
this.database = database;
this.oid = JDBCUtils.safeGetLong(dbResult, "oid");
this.name = JDBCUtils.safeGetString(dbResult, "name");
this.version = JDBCUtils.safeGetString(dbResult, "default_version");
this.installed_version = JDBCUtils.safeGetString(dbResult, "installed_version");
installed = installed_version != null;
this.description = JDBCUtils.safeGetString(dbResult, "comment");
}
@Override
public DBSObject getParentObject() {
return null;
}
@Override
@Property(viewable = true, order = 1)
public String getName() {
return name;
}
@Property(viewable = true, order = 2)
public String getVersion() {
return version;
}
@Property(viewable = true, order = 3)
public String getInstalledVersion() {
return installed_version;
}
@Override
@Property(viewable = true, order = 4)
public String getDescription() {
return description;
}
@Override
public boolean isPersisted() {
return false;
}
@Override
public long getObjectId() {
return oid;
}
@Override
public PostgreDataSource getDataSource() {
return database.getDataSource();
}
@Override
public PostgreDatabase getDatabase() {
return database;
}
public boolean isInstalled() {
return installed;
}
}
......@@ -22,6 +22,7 @@ import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.ext.postgresql.PostgreConstants;
import org.jkiss.dbeaver.ext.postgresql.PostgreUtils;
import org.jkiss.dbeaver.ext.postgresql.model.PostgreSchema.ExtensionCache;
import org.jkiss.dbeaver.model.*;
import org.jkiss.dbeaver.model.exec.DBCException;
import org.jkiss.dbeaver.model.exec.DBCExecutionPurpose;
......@@ -91,6 +92,8 @@ public class PostgreDatabase extends JDBCRemoteInstance<PostgreDataSource>
public final ForeignServerCache foreignServerCache = new ForeignServerCache();
public final LanguageCache languageCache = new LanguageCache();
public final EncodingCache encodingCache = new EncodingCache();
public final ExtensionCache extensionCache = new ExtensionCache();
public final AvailableExtensionCache availableExtensionCache = new AvailableExtensionCache();
public final CollationCache collationCache = new CollationCache();
public final TablespaceCache tablespaceCache = new TablespaceCache();
public final LongKeyMap<PostgreDataType> dataTypeCache = new LongKeyMap<>();
......@@ -414,7 +417,20 @@ public class PostgreDatabase extends JDBCRemoteInstance<PostgreDataSource>
checkInstanceConnection(monitor);
return encodingCache.getAllObjects(monitor, this);
}
@Association
public Collection<PostgreExtension> getExtensions(DBRProgressMonitor monitor)
throws DBException {
return extensionCache.getAllObjects(monitor, this);
}
@Association
public Collection<PostgreAvailableExtension> getAvailableExtensions(DBRProgressMonitor monitor)
throws DBException {
return availableExtensionCache.getAllObjects(monitor, this);
}
@Association
public Collection<PostgreCollation> getCollations(DBRProgressMonitor monitor)
throws DBException {
......@@ -1016,6 +1032,65 @@ public class PostgreDatabase extends JDBCRemoteInstance<PostgreDataSource>
return new PostgreTablespace(owner, dbResult);
}
}
class AvailableExtensionCache extends JDBCObjectCache<PostgreDatabase, PostgreAvailableExtension> {
@Override
protected JDBCStatement prepareObjectsStatement(@NotNull JDBCSession session, @NotNull PostgreDatabase owner)
throws SQLException {
final JDBCPreparedStatement dbStat = session.prepareStatement(
"SELECT name,default_version,installed_version,comment FROM pg_catalog.pg_available_extensions ORDER BY name"
);
return dbStat;
}
@Override
protected PostgreAvailableExtension fetchObject(@NotNull JDBCSession session, @NotNull PostgreDatabase owner, @NotNull JDBCResultSet dbResult)
throws SQLException, DBException {
return new PostgreAvailableExtension(owner, dbResult);
}
}
class ExtensionCache extends JDBCObjectCache<PostgreDatabase, PostgreExtension> {
@Override
protected JDBCStatement prepareObjectsStatement(@NotNull JDBCSession session, @NotNull PostgreDatabase owner)
throws SQLException {
final JDBCPreparedStatement dbStat = session.prepareStatement(
"SELECT \n" +
" e.oid,\n" +
" a.rolname oname,\n" +
" cfg.tbls,\n" +
" e.* \n" +
"FROM \n" +
" pg_catalog.pg_extension e \n" +
" join pg_authid a on a.oid = e.extowner\n" +
" join pg_namespace n on n.oid =e.extnamespace\n" +
" left join (\n" +
" select\n" +
" ARRAY_AGG(ns.nspname || '.' || cls.relname) tbls, oid_ext\n" +
" from\n" +
" (\n" +
" select\n" +
" unnest(e1.extconfig) oid , e1.oid oid_ext\n" +
" from\n" +
" pg_catalog.pg_extension e1 ) c \n" +
" join pg_class cls on cls.oid = c.oid \n" +
" join pg_namespace ns on ns.oid = cls.relnamespace\n" +
" group by oid_ext \n" +
" ) cfg on cfg.oid_ext = e.oid\n" +
"ORDER BY e.oid"
);
// dbStat.setLong(1, PostgreSchema.this.getObjectId());
return dbStat;
}
@Override
protected PostgreExtension fetchObject(@NotNull JDBCSession session, @NotNull PostgreDatabase owner, @NotNull JDBCResultSet dbResult)
throws SQLException, DBException {
return new PostgreExtension(owner, dbResult);
}
}
public static class SchemaCache extends JDBCObjectLookupCache<PostgreDatabase, PostgreSchema> {
@NotNull
......
......@@ -20,15 +20,16 @@ import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.DBUtils;
import org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils;
import org.jkiss.dbeaver.model.meta.IPropertyValueListProvider;
import org.jkiss.dbeaver.model.meta.Property;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor;
import org.jkiss.dbeaver.model.struct.DBSObject;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedHashMap;
import java.util.Collection;
import java.util.Map;
/**
......@@ -37,17 +38,29 @@ import java.util.Map;
public class PostgreExtension implements PostgreObject, PostgreScriptObject {
private static final Log log = Log.getLog(PostgreExtension.class);
private PostgreDatabase database;
private PostgreSchema schema;
private long oid;
private String name;
private String owner;
private String tables;
private String conditions;
private boolean relocatable;
private String version;
private Map<Long, String> tableConditions;
public PostgreExtension(PostgreDatabase database)
{
this.database = database;
this.owner = "postgres";
}
public PostgreExtension(PostgreSchema schema, ResultSet dbResult)
public PostgreExtension(PostgreDatabase database, ResultSet dbResult)
throws SQLException
{
this.schema = schema;
this.database = database;
this.loadInfo(dbResult);
}
......@@ -57,36 +70,50 @@ public class PostgreExtension implements PostgreObject, PostgreScriptObject {
this.oid = JDBCUtils.safeGetLong(dbResult, "oid");
this.name = JDBCUtils.safeGetString(dbResult, "extname");
this.version = JDBCUtils.safeGetString(dbResult, "extversion");
try {
Long[] extTableIDs = JDBCUtils.safeGetArray(dbResult, "extconfig");
String[] extTableConditions = JDBCUtils.safeGetArray(dbResult, "extcondition");
if (extTableIDs != null && extTableConditions != null) {
if (extTableIDs.length != extTableConditions.length) {
log.error("extconfig.length <> extcondition.length");
} else {
tableConditions = new LinkedHashMap<>();
for (int i = 0; i < extTableIDs.length; i++) {
tableConditions.put(extTableIDs[i], extTableConditions[i]);
}
}
}
} catch (Exception e) {
log.error(e);
}
this.owner = JDBCUtils.safeGetString(dbResult, "oname");
this.tables = JDBCUtils.safeGetString(dbResult, "tbls");
this.relocatable = JDBCUtils.safeGetBoolean(dbResult, "extrelocatable");
this.conditions = JDBCUtils.safeGetString(dbResult, "extcondition");
}
@NotNull
@Override
@Property(viewable = true, order = 1)
@Property(viewable = true,editable = true, order = 1)
public String getName()
{
return name;
}
public void setName(String name) {
this.name = name;
}
@NotNull
@Property(viewable = true, order = 2)
public PostgreSchema getSchema() {
return schema;
@Property(viewable = true, order = 5)
public String getTables() {
return tables;
}
@NotNull
@Property(viewable = true, order = 6)
public String getConditions() {
return conditions;
}
@NotNull
@Property(viewable = true,editable = true,updatable = true, order = 4, listProvider = SchemaListProvider.class)
public String getSchema() {
return owner;
}
public void setSchema(String schema) {
this.owner = schema;
}
@NotNull
@Property(viewable = true, order = 3)
public boolean getRelocatable() {
return relocatable;
}
@Override
......@@ -94,7 +121,7 @@ public class PostgreExtension implements PostgreObject, PostgreScriptObject {
return oid;
}
@Property(viewable = true, order = 4)
@Property(viewable = true, order = 2)
public String getVersion() {
return version;
}
......@@ -117,13 +144,13 @@ public class PostgreExtension implements PostgreObject, PostgreScriptObject {
@Override
public DBSObject getParentObject()
{
return schema;
return database;
}
@NotNull
@Override
public PostgreDataSource getDataSource() {
return schema.getDataSource();
return database.getDataSource();
}
@Override
......@@ -134,7 +161,7 @@ public class PostgreExtension implements PostgreObject, PostgreScriptObject {
@NotNull
@Override
public PostgreDatabase getDatabase() {
return schema.getDatabase();
return database;
}
@Override
......@@ -143,7 +170,7 @@ public class PostgreExtension implements PostgreObject, PostgreScriptObject {
"-- Extension: " + getName() + "\n\n" +
"-- DROP EXTENSION " + getName() + ";\n\n" +
"CREATE EXTENSION " + getName() + "\n\t" +
"SCHEMA " + DBUtils.getQuotedIdentifier(getSchema()) + "\n\t" +
"SCHEMA \"" + getSchema() + "\"\n\t" +
"VERSION " + version;
}
......@@ -151,4 +178,23 @@ public class PostgreExtension implements PostgreObject, PostgreScriptObject {
public void setObjectDefinitionText(String sourceText) throws DBException {
}
public static class SchemaListProvider implements IPropertyValueListProvider<PostgreExtension> {
@Override
public boolean allowCustomValue()
{
return false;
}
@Override
public Object[] getPossibleValues(PostgreExtension object)
{
try {
Collection<PostgreSchema> schemas = object.getDatabase().getSchemas(new VoidProgressMonitor());
return schemas.toArray(new Object[schemas.size()]);
} catch (DBException e) {
log.error(e);
return new Object[0];
}
}
}
}
......@@ -439,9 +439,30 @@ public class PostgreSchema implements DBSSchema, DBPNamedObject2, DBPSaveableObj
protected JDBCStatement prepareObjectsStatement(@NotNull JDBCSession session, @NotNull PostgreSchema owner)
throws SQLException {
final JDBCPreparedStatement dbStat = session.prepareStatement(
"SELECT e.oid,e.* FROM pg_catalog.pg_extension e " +
"\nWHERE e.extnamespace=?" +
"\nORDER BY e.oid"
"SELECT \n" +
" e.oid,\n" +
" a.rolname oname,\n" +
" cfg.tbls,\n" +
" e.* \n" +
"FROM \n" +
" pg_catalog.pg_extension e \n" +
" join pg_authid a on a.oid = e.extowner\n" +
" join pg_namespace n on n.oid =e.extnamespace\n" +
" left join (\n" +
" select\n" +
" ARRAY_AGG(ns.nspname || '.' || cls.relname) tbls, oid_ext\n" +
" from\n" +
" (\n" +
" select\n" +
" unnest(e1.extconfig) oid , e1.oid oid_ext\n" +
" from\n" +
" pg_catalog.pg_extension e1 ) c \n" +
" join pg_class cls on cls.oid = c.oid \n" +
" join pg_namespace ns on ns.oid = cls.relnamespace\n" +
" group by oid_ext \n" +
" ) cfg on cfg.oid_ext = e.oid\n" +
"\nWHERE e.extnamespace=?\n" +
"ORDER BY e.oid"
);
dbStat.setLong(1, PostgreSchema.this.getObjectId());
return dbStat;
......@@ -450,7 +471,8 @@ public class PostgreSchema implements DBSSchema, DBPNamedObject2, DBPSaveableObj
@Override
protected PostgreExtension fetchObject(@NotNull JDBCSession session, @NotNull PostgreSchema owner, @NotNull JDBCResultSet dbResult)
throws SQLException, DBException {
return new PostgreExtension(owner, dbResult);
//return new PostgreExtension(owner, dbResult);
return null;
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册