提交 f5841dd9 编写于 作者: A Alexander Fedorov

#2556 configure procedure call

上级 18fa0bc7
......@@ -23,15 +23,26 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.ListenerList;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.osgi.util.NLS;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.debug.core.DebugCore;
import org.jkiss.dbeaver.debug.internal.DebugMessages;
import org.jkiss.dbeaver.model.DBPDataSource;
import org.jkiss.dbeaver.model.DBPDataSourceContainer;
import org.jkiss.dbeaver.model.DBUtils;
import org.jkiss.dbeaver.model.exec.DBCException;
import org.jkiss.dbeaver.model.exec.DBCExecutionContext;
import org.jkiss.dbeaver.model.exec.DBCSession;
import org.jkiss.dbeaver.model.exec.DBCStatement;
import org.jkiss.dbeaver.model.exec.DBCStatementType;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor;
public abstract class DBGBaseController implements DBGController {
......@@ -203,4 +214,30 @@ public abstract class DBGBaseController implements DBGController {
}
}
protected void executeProcedure(DBPDataSource dataSource, Map<String, Object> configuration, DBRProgressMonitor monitor) throws DBException {
String procedureName = String.valueOf(configuration.get(PROCEDURE_NAME));
String call = String.valueOf(configuration.get(PROCEDURE_CALL));
String taskName = NLS.bind("Execute procedure {0}", procedureName);
Job job = new Job(taskName) {
@Override
protected IStatus run(IProgressMonitor monitor) {
try {
try (final DBCSession execSession = DBUtils.openUtilSession(new VoidProgressMonitor(), dataSource, taskName)) {
try (final DBCStatement dbStat = execSession.prepareStatement(DBCStatementType.EXEC, call, true, false,
false)) {
dbStat.executeStatement();
}
}
} catch (DBCException e) {
log.error(taskName, e);
return DebugCore.newErrorStatus(taskName, e);
}
return Status.OK_STATUS;
}
};
job.schedule();
}
}
......@@ -29,8 +29,11 @@ import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
public interface DBGController {
public static final String DATABASE_NAME = "databaseName"; //$NON-NLS-1$
public static final String SCHEMA_NAME = "schemaName"; //$NON-NLS-1$
public static final String PROCEDURE_OID = "procedureOID"; //$NON-NLS-1$
public static final String PROCESS_ID = "processID"; //$NON-NLS-1$
public static final String PROCEDURE_NAME = "procedureName"; //$NON-NLS-1$
public static final String PROCEDURE_CALL = "procedureCall"; //$NON-NLS-1$
/*
* General lifecycle
......
......@@ -59,17 +59,16 @@ public abstract class DatabaseLaunchDelegate extends LaunchConfigurationDelegate
protected Map<String, Object> extractAttributes(ILaunchConfiguration configuration) throws CoreException {
Map<String, Object> attributes = new HashMap<>();
String databaseName = DebugCore.extractDatabaseName(configuration);
attributes.put(DBGController.DATABASE_NAME, databaseName);
String oid = DebugCore.extractStringAttribute(configuration, DebugCore.ATTR_OID, DebugCore.ATTR_OID_DEFAULT);
attributes.put(DBGController.PROCEDURE_OID, oid);
attributes.put(DBGController.DATABASE_NAME, DebugCore.extractDatabaseName(configuration));
attributes.put(DBGController.SCHEMA_NAME, DebugCore.extractSchemaName(configuration));
attributes.put(DBGController.PROCEDURE_OID, DebugCore.extractProcedureOid(configuration));
attributes.put(DBGController.PROCEDURE_NAME, DebugCore.extractProcedureName(configuration));
attributes.put(DBGController.PROCEDURE_CALL, DebugCore.extractProcedureCall(configuration));
//FIXME:AF:extract from launch configuration
//FIXME -1 - target PID (-1 for ANY PID)
attributes.put(DBGController.PROCESS_ID, -1);
//Well, put it all for now
attributes.putAll(configuration.getAttributes());
//FIXME:AF:and little hack until we implemented the parameter storage during launch config creation
attributes.put("tabname", "pg_class");
return attributes;
}
......
......@@ -18,6 +18,7 @@
package org.jkiss.dbeaver.debug.core;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.eclipse.core.resources.IContainer;
......@@ -31,12 +32,17 @@ import org.eclipse.debug.core.ILaunchConfigurationType;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.core.ILaunchManager;
import org.eclipse.osgi.util.NLS;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.debug.DBGController;
import org.jkiss.dbeaver.debug.DBGException;
import org.jkiss.dbeaver.debug.internal.core.DebugCoreMessages;
import org.jkiss.dbeaver.model.DBPDataSourceContainer;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor;
import org.jkiss.dbeaver.model.struct.DBSObject;
import org.jkiss.dbeaver.model.struct.rdb.DBSProcedure;
import org.jkiss.dbeaver.model.struct.rdb.DBSProcedureParameter;
public class DebugCore {
......@@ -49,17 +55,26 @@ public class DebugCore {
public static final String BREAKPOINT_DATABASE = BUNDLE_SYMBOLIC_NAME + '.' + "databaseBreakpointMarker"; //$NON-NLS-1$
public static final String BREAKPOINT_DATABASE_LINE = BUNDLE_SYMBOLIC_NAME + '.' + "databaseLineBreakpointMarker"; //$NON-NLS-1$
public static final String ATTR_DRIVER = BUNDLE_SYMBOLIC_NAME + '.' + "ATTR_DRIVER"; //$NON-NLS-1$
public static final String ATTR_DRIVER_DEFAULT = ""; //$NON-NLS-1$
public static final String ATTR_DRIVER_ID = BUNDLE_SYMBOLIC_NAME + '.' + "ATTR_DRIVER_ID"; //$NON-NLS-1$
public static final String ATTR_DRIVER_ID_DEFAULT = ""; //$NON-NLS-1$
public static final String ATTR_DATASOURCE = BUNDLE_SYMBOLIC_NAME + '.' + "ATTR_DATASOURCE"; //$NON-NLS-1$
public static final String ATTR_DATASOURCE_DEFAULT = ""; //$NON-NLS-1$
public static final String ATTR_DATASOURCE_ID = BUNDLE_SYMBOLIC_NAME + '.' + "ATTR_DATASOURCE_ID"; //$NON-NLS-1$
public static final String ATTR_DATASOURCE_ID_DEFAULT = ""; //$NON-NLS-1$
public static final String ATTR_DATABASE = BUNDLE_SYMBOLIC_NAME + '.' + "ATTR_DATABASE"; //$NON-NLS-1$
public static final String ATTR_DATABASE_DEFAULT = ""; //$NON-NLS-1$
public static final String ATTR_DATABASE_NAME = BUNDLE_SYMBOLIC_NAME + '.' + "ATTR_DATABASE_NAME"; //$NON-NLS-1$
public static final String ATTR_DATABASE_NAME_DEFAULT = ""; //$NON-NLS-1$
public static final String ATTR_OID = BUNDLE_SYMBOLIC_NAME + '.' + "ATTR_OID"; //$NON-NLS-1$
public static final String ATTR_OID_DEFAULT = ""; //$NON-NLS-1$
public static final String ATTR_SCHEMA_NAME = BUNDLE_SYMBOLIC_NAME + '.' + "ATTR_SCHEMA_NAME"; //$NON-NLS-1$
public static final String ATTR_SCHEMA_NAME_DEFAULT = ""; //$NON-NLS-1$
public static final String ATTR_PROCEDURE_OID = BUNDLE_SYMBOLIC_NAME + '.' + "ATTR_PROCEDURE_OID"; //$NON-NLS-1$
public static final String ATTR_PROCEDURE_OID_DEFAULT = ""; //$NON-NLS-1$
public static final String ATTR_PROCEDURE_NAME = BUNDLE_SYMBOLIC_NAME + '.' + "ATTR_PROCEDURE_NAME"; //$NON-NLS-1$
public static final String ATTR_PROCEDURE_NAME_DEFAULT = ""; //$NON-NLS-1$
public static final String ATTR_PROCEDURE_CALL = BUNDLE_SYMBOLIC_NAME + '.' + "ATTR_PROCEDURE_CALL"; //$NON-NLS-1$
public static final String ATTR_PROCEDURE_CALL_DEFAULT = ""; //$NON-NLS-1$
private static Log log = Log.getLog(DebugCore.class);
......@@ -75,6 +90,35 @@ public class DebugCore {
return abort(message, null);
}
public static String composeProcedureCall(DBSProcedure procedure, DBRProgressMonitor monitor) throws DBException {
StringBuilder sb = new StringBuilder();
sb.append("select").append(' ').append(procedure.getName());
sb.append('(');
Collection<? extends DBSProcedureParameter> parameters = procedure.getParameters(monitor);
int size = parameters.size();
if (size > 0) {
for (int i = 0; i < size; i++) {
Object value = '?';
sb.append(value);
sb.append(',');
}
sb.deleteCharAt(sb.length()-1);
}
sb.append(')');
String call = sb.toString();
return call;
}
public static String composeProcedureCall(DBSProcedure procedure) {
try {
return composeProcedureCall(procedure, new VoidProgressMonitor());
} catch (DBException e) {
String message = NLS.bind("Failed to compose call for {0}", procedure);
log.error(message , e);
return ATTR_PROCEDURE_CALL_DEFAULT;
}
}
public static ILaunchConfigurationWorkingCopy createConfiguration(IContainer container, String typeName, String name)
throws CoreException {
ILaunchManager manager = DebugPlugin.getDefault().getLaunchManager();
......@@ -112,15 +156,31 @@ public class DebugCore {
}
public static String extractDriverId(ILaunchConfiguration configuration) {
return extractStringAttribute(configuration, ATTR_DRIVER, ATTR_DRIVER_DEFAULT);
return extractStringAttribute(configuration, ATTR_DRIVER_ID, ATTR_DRIVER_ID_DEFAULT);
}
public static String extractDatasourceId(ILaunchConfiguration configuration) {
return extractStringAttribute(configuration, ATTR_DATASOURCE, ATTR_DATASOURCE_DEFAULT);
return extractStringAttribute(configuration, ATTR_DATASOURCE_ID, ATTR_DATASOURCE_ID_DEFAULT);
}
public static String extractDatabaseName(ILaunchConfiguration configuration) {
return extractStringAttribute(configuration, ATTR_DATABASE, ATTR_DATABASE_DEFAULT);
return extractStringAttribute(configuration, ATTR_DATABASE_NAME, ATTR_DATABASE_NAME_DEFAULT);
}
public static String extractSchemaName(ILaunchConfiguration configuration) {
return extractStringAttribute(configuration, ATTR_SCHEMA_NAME, ATTR_SCHEMA_NAME_DEFAULT);
}
public static String extractProcedureOid(ILaunchConfiguration configuration) {
return extractStringAttribute(configuration, ATTR_PROCEDURE_OID, ATTR_PROCEDURE_OID_DEFAULT);
}
public static String extractProcedureName(ILaunchConfiguration configuration) {
return extractStringAttribute(configuration, ATTR_PROCEDURE_NAME, ATTR_PROCEDURE_NAME_DEFAULT);
}
public static String extractProcedureCall(ILaunchConfiguration configuration) {
return extractStringAttribute(configuration, ATTR_PROCEDURE_CALL, ATTR_PROCEDURE_CALL_DEFAULT);
}
public static String extractStringAttribute(ILaunchConfiguration configuration, String attributeName,
......
......@@ -28,12 +28,18 @@ public class DebugUIMessages extends NLS {
public static String DatabaseTab_driver_group_text;
public static String DatabaseTab_driver_label_text;
public static String DatabaseTab_database_group_text;
public static String DatabaseTab_database_label_text;
public static String DatabaseTab_datasource_group_text;
public static String DatabaseTab_datasource_label_text;
public static String DatabaseTab_database_group_text;
public static String DatabaseTab_database_label_text;
public static String DatabaseTab_schema_group_text;
public static String DatabaseTab_schema_label_text;
public static String DatabaseTab_oid_group_text;
public static String DatabaseTab_oid_label_text;
public static String DatabaseTab_name_group_text;
public static String DatabaseTab_name_label_text;
public static String DatabaseTab_call_group_text;
public static String DatabaseTab_call_label_text;
public static String DatabaseTab_name;
......
......@@ -19,12 +19,18 @@ DatabaseStandardBreakpointPane_description=Breakpoint settings
DatabaseTab_driver_group_text=Driver
DatabaseTab_driver_label_text=Driver
DatabaseTab_database_group_text=Database
DatabaseTab_database_label_text=Database
DatabaseTab_datasource_group_text=Connection
DatabaseTab_datasource_label_text=Connection
DatabaseTab_database_group_text=Database
DatabaseTab_database_label_text=Database
DatabaseTab_schema_group_text=Schema
DatabaseTab_schema_label_text=Schema
DatabaseTab_oid_group_text=OID
DatabaseTab_oid_label_text=OID
DatabaseTab_name_group_text=Name
DatabaseTab_name_label_text=Name
DatabaseTab_call_group_text=Call
DatabaseTab_call_label_text=Call
DatabaseTab_name=&Main
......
......@@ -17,7 +17,6 @@
*/
package org.jkiss.dbeaver.debug.ui;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.ui.AbstractLaunchConfigurationTab;
......@@ -45,7 +44,10 @@ public class DatabaseTab extends AbstractLaunchConfigurationTab {
private Text driverText;
private Text datasourceText;
private Text databaseText;
private Text schemaText;
private Text oidText;
private Text nameText;
private Text callText;
/**
* Modify listener that simply updates the owning launch configuration
......@@ -76,7 +78,10 @@ public class DatabaseTab extends AbstractLaunchConfigurationTab {
createDriverComponent(comp);
createDatasourceComponent(comp);
createDatabaseComponent(comp);
createSchemaComponent(comp);
createOidComponent(comp);
createNameComponent(comp);
createCallComponent(comp);
}
protected void createDriverComponent(Composite comp)
......@@ -84,7 +89,7 @@ public class DatabaseTab extends AbstractLaunchConfigurationTab {
Group driverGroup = UIUtils.createControlGroup(comp, DebugUIMessages.DatabaseTab_driver_group_text, 2, GridData.FILL_HORIZONTAL,
SWT.DEFAULT);
driverText = UIUtils.createLabelText(driverGroup, DebugUIMessages.DatabaseTab_driver_label_text, DebugCore.ATTR_DRIVER_DEFAULT);
driverText = UIUtils.createLabelText(driverGroup, DebugUIMessages.DatabaseTab_driver_label_text, DebugCore.ATTR_DRIVER_ID_DEFAULT);
driverText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
driverText.addModifyListener(modifyListener);
driverText.setEditable(false);
......@@ -95,7 +100,7 @@ public class DatabaseTab extends AbstractLaunchConfigurationTab {
Group datasourceGroup = UIUtils.createControlGroup(comp, DebugUIMessages.DatabaseTab_datasource_group_text, 2, GridData.FILL_HORIZONTAL,
SWT.DEFAULT);
datasourceText = UIUtils.createLabelText(datasourceGroup, DebugUIMessages.DatabaseTab_datasource_label_text, DebugCore.ATTR_DATASOURCE_DEFAULT);
datasourceText = UIUtils.createLabelText(datasourceGroup, DebugUIMessages.DatabaseTab_datasource_label_text, DebugCore.ATTR_DATASOURCE_ID_DEFAULT);
datasourceText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
datasourceText.addModifyListener(modifyListener);
datasourceText.setEditable(false);
......@@ -105,27 +110,57 @@ public class DatabaseTab extends AbstractLaunchConfigurationTab {
{
Group databaseGroup = UIUtils.createControlGroup(comp, DebugUIMessages.DatabaseTab_database_group_text, 2, GridData.FILL_HORIZONTAL, SWT.DEFAULT);
databaseText = UIUtils.createLabelText(databaseGroup, DebugUIMessages.DatabaseTab_database_label_text, DebugCore.ATTR_DATABASE_DEFAULT);
databaseText = UIUtils.createLabelText(databaseGroup, DebugUIMessages.DatabaseTab_database_label_text, DebugCore.ATTR_DATABASE_NAME_DEFAULT);
databaseText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
databaseText.addModifyListener(modifyListener);
}
protected void createSchemaComponent(Composite comp)
{
Group databaseGroup = UIUtils.createControlGroup(comp, DebugUIMessages.DatabaseTab_schema_group_text, 2, GridData.FILL_HORIZONTAL, SWT.DEFAULT);
schemaText = UIUtils.createLabelText(databaseGroup, DebugUIMessages.DatabaseTab_schema_label_text, DebugCore.ATTR_SCHEMA_NAME_DEFAULT);
schemaText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
schemaText.addModifyListener(modifyListener);
}
protected void createOidComponent(Composite comp)
{
Group datasourceGroup = UIUtils.createControlGroup(comp, DebugUIMessages.DatabaseTab_oid_group_text, 2, GridData.FILL_HORIZONTAL, SWT.DEFAULT);
Group oidGroup = UIUtils.createControlGroup(comp, DebugUIMessages.DatabaseTab_oid_group_text, 2, GridData.FILL_HORIZONTAL, SWT.DEFAULT);
oidText = UIUtils.createLabelText(datasourceGroup, DebugUIMessages.DatabaseTab_oid_label_text, DebugCore.ATTR_OID_DEFAULT);
oidText = UIUtils.createLabelText(oidGroup, DebugUIMessages.DatabaseTab_oid_label_text, DebugCore.ATTR_PROCEDURE_OID_DEFAULT);
oidText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
oidText.addModifyListener(modifyListener);
}
protected void createNameComponent(Composite comp)
{
Group oidGroup = UIUtils.createControlGroup(comp, DebugUIMessages.DatabaseTab_name_group_text, 2, GridData.FILL_HORIZONTAL, SWT.DEFAULT);
nameText = UIUtils.createLabelText(oidGroup, DebugUIMessages.DatabaseTab_name_label_text, DebugCore.ATTR_PROCEDURE_NAME_DEFAULT);
nameText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
nameText.addModifyListener(modifyListener);
}
protected void createCallComponent(Composite comp)
{
Group callGroup = UIUtils.createControlGroup(comp, DebugUIMessages.DatabaseTab_call_group_text, 2, GridData.FILL_HORIZONTAL, SWT.DEFAULT);
callText = UIUtils.createLabelText(callGroup, DebugUIMessages.DatabaseTab_call_label_text, DebugCore.ATTR_PROCEDURE_CALL_DEFAULT);
callText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
callText.addModifyListener(modifyListener);
}
@Override
public void setDefaults(ILaunchConfigurationWorkingCopy configuration)
{
configuration.setAttribute(DebugCore.ATTR_DRIVER, DebugCore.ATTR_DRIVER);
configuration.setAttribute(DebugCore.ATTR_DATASOURCE, DebugCore.ATTR_DATASOURCE_DEFAULT);
configuration.setAttribute(DebugCore.ATTR_DATABASE, DebugCore.ATTR_DATABASE_DEFAULT);
configuration.setAttribute(DebugCore.ATTR_OID, DebugCore.ATTR_OID_DEFAULT);
configuration.setAttribute(DebugCore.ATTR_DRIVER_ID, DebugCore.ATTR_DRIVER_ID);
configuration.setAttribute(DebugCore.ATTR_DATASOURCE_ID, DebugCore.ATTR_DATASOURCE_ID_DEFAULT);
configuration.setAttribute(DebugCore.ATTR_DATABASE_NAME, DebugCore.ATTR_DATABASE_NAME_DEFAULT);
configuration.setAttribute(DebugCore.ATTR_SCHEMA_NAME, DebugCore.ATTR_SCHEMA_NAME_DEFAULT);
configuration.setAttribute(DebugCore.ATTR_PROCEDURE_OID, DebugCore.ATTR_PROCEDURE_OID_DEFAULT);
configuration.setAttribute(DebugCore.ATTR_PROCEDURE_NAME, DebugCore.ATTR_PROCEDURE_NAME_DEFAULT);
configuration.setAttribute(DebugCore.ATTR_PROCEDURE_CALL, DebugCore.ATTR_PROCEDURE_CALL_DEFAULT);
}
@Override
......@@ -134,7 +169,10 @@ public class DatabaseTab extends AbstractLaunchConfigurationTab {
initializeDriver(configuration);
initializeDatasource(configuration);
initializeDatabase(configuration);
initializeSchema(configuration);
initializeOid(configuration);
initializeName(configuration);
initializeCall(configuration);
}
protected void initializeDriver(ILaunchConfiguration configuration)
......@@ -155,17 +193,28 @@ public class DatabaseTab extends AbstractLaunchConfigurationTab {
databaseText.setText(extracted);
}
protected void initializeSchema(ILaunchConfiguration configuration)
{
String extracted = DebugCore.extractSchemaName(configuration);
schemaText.setText(extracted);
}
protected void initializeOid(ILaunchConfiguration configuration)
{
String oid = null;
try {
oid = configuration.getAttribute(DebugCore.ATTR_OID, (String)null);
} catch (CoreException e) {
}
if (oid == null) {
oid = DebugCore.ATTR_OID_DEFAULT;
}
oidText.setText(oid);
String extracted = DebugCore.extractProcedureOid(configuration);
oidText.setText(extracted);
}
protected void initializeName(ILaunchConfiguration configuration)
{
String extracted = DebugCore.extractProcedureName(configuration);
nameText.setText(extracted);
}
protected void initializeCall(ILaunchConfiguration configuration)
{
String extracted = DebugCore.extractProcedureCall(configuration);
callText.setText(extracted);
}
@Override
......@@ -192,10 +241,13 @@ public class DatabaseTab extends AbstractLaunchConfigurationTab {
@Override
public void performApply(ILaunchConfigurationWorkingCopy configuration)
{
configuration.setAttribute(DebugCore.ATTR_DRIVER, driverText.getText());
configuration.setAttribute(DebugCore.ATTR_DATASOURCE, datasourceText.getText());
configuration.setAttribute(DebugCore.ATTR_DATABASE, databaseText.getText());
configuration.setAttribute(DebugCore.ATTR_OID, oidText.getText());
configuration.setAttribute(DebugCore.ATTR_DRIVER_ID, driverText.getText());
configuration.setAttribute(DebugCore.ATTR_DATASOURCE_ID, datasourceText.getText());
configuration.setAttribute(DebugCore.ATTR_DATABASE_NAME, databaseText.getText());
configuration.setAttribute(DebugCore.ATTR_SCHEMA_NAME, schemaText.getText());
configuration.setAttribute(DebugCore.ATTR_PROCEDURE_OID, oidText.getText());
configuration.setAttribute(DebugCore.ATTR_PROCEDURE_NAME, nameText.getText());
configuration.setAttribute(DebugCore.ATTR_PROCEDURE_CALL, callText.getText());
}
@Override
......
......@@ -49,16 +49,20 @@ public class PostgreSqlDebugCore {
PostgreSchema schema = procedure.getContainer();
String databaseName = database.getName();
Object[] bindings = new Object[] {dataSourceContainer.getName(), databaseName,
procedure.getName(), schema.getName()};
String schemaName = schema.getName();
String procedureName = procedure.getName();
Object[] bindings = new Object[] { dataSourceContainer.getName(), databaseName, procedureName, schemaName };
String name = NLS.bind(PostgreDebugCoreMessages.PostgreSqlDebugCore_launch_configuration_name, bindings);
//Let's use metadata area for storage
IContainer container = null;
ILaunchConfigurationWorkingCopy workingCopy = DebugCore.createConfiguration(container, CONFIGURATION_TYPE, name);
workingCopy.setAttribute(DebugCore.ATTR_DRIVER, dataSourceContainer.getDriver().getId());
workingCopy.setAttribute(DebugCore.ATTR_DATASOURCE, dataSourceContainer.getId());
workingCopy.setAttribute(DebugCore.ATTR_DATABASE, databaseName);
workingCopy.setAttribute(DebugCore.ATTR_OID, String.valueOf(procedure.getObjectId()));
workingCopy.setAttribute(DebugCore.ATTR_DRIVER_ID, dataSourceContainer.getDriver().getId());
workingCopy.setAttribute(DebugCore.ATTR_DATASOURCE_ID, dataSourceContainer.getId());
workingCopy.setAttribute(DebugCore.ATTR_DATABASE_NAME, databaseName);
workingCopy.setAttribute(DebugCore.ATTR_SCHEMA_NAME, schemaName);
workingCopy.setAttribute(DebugCore.ATTR_PROCEDURE_OID, String.valueOf(procedure.getObjectId()));
workingCopy.setAttribute(DebugCore.ATTR_PROCEDURE_NAME, procedureName);
workingCopy.setAttribute(DebugCore.ATTR_PROCEDURE_CALL, DebugCore.composeProcedureCall(procedure));
return workingCopy;
}
}
......@@ -22,46 +22,23 @@ import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.osgi.util.NLS;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.debug.DBGBaseController;
import org.jkiss.dbeaver.debug.DBGException;
import org.jkiss.dbeaver.debug.DBGSession;
import org.jkiss.dbeaver.debug.DBGSessionInfo;
import org.jkiss.dbeaver.debug.core.DebugCore;
import org.jkiss.dbeaver.ext.postgresql.model.PostgreDataSource;
import org.jkiss.dbeaver.ext.postgresql.model.PostgreDatabase;
import org.jkiss.dbeaver.ext.postgresql.model.PostgreProcedure;
import org.jkiss.dbeaver.ext.postgresql.model.PostgreSchema;
import org.jkiss.dbeaver.model.DBPDataKind;
import org.jkiss.dbeaver.model.DBPDataSource;
import org.jkiss.dbeaver.model.DBPDataSourceContainer;
import org.jkiss.dbeaver.model.DBUtils;
import org.jkiss.dbeaver.model.exec.DBCException;
import org.jkiss.dbeaver.model.exec.DBCExecutionContext;
import org.jkiss.dbeaver.model.exec.DBCSession;
import org.jkiss.dbeaver.model.exec.DBCStatement;
import org.jkiss.dbeaver.model.exec.DBCStatementType;
import org.jkiss.dbeaver.model.impl.jdbc.JDBCExecutionContext;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor;
import org.jkiss.dbeaver.model.struct.DBSTypedObject;
import org.jkiss.dbeaver.model.struct.rdb.DBSProcedure;
import org.jkiss.dbeaver.model.struct.rdb.DBSProcedureParameter;
public class PostgreDebugController extends DBGBaseController {
private static Log log = Log.getLog(PostgreDebugController.class);
private static final String SQL_SESSION = "select pid,usename,application_name,state,query from pg_stat_activity"; //$NON-NLS-1$
private static final String SQL_OBJECT = "select p.oid,p.proname,u.usename as owner,n.nspname, l.lanname as lang " //$NON-NLS-1$
......@@ -94,7 +71,7 @@ public class PostgreDebugController extends DBGBaseController {
throw new DBGException("Error getting session");
} catch (SQLException e) {
throw new DBGException("SQ Lerror", e);
throw new DBGException("SQL error", e);
}
}
......@@ -169,79 +146,9 @@ public class PostgreDebugController extends DBGBaseController {
//FIXME -1 - target PID (-1 for ANY PID)
int oid = Integer.parseInt(String.valueOf(configuration.get(PROCEDURE_OID)));
int pid = Integer.parseInt(String.valueOf(configuration.get(PROCESS_ID)));
String databaseName = String.valueOf(configuration.get(DATABASE_NAME));
pgSession.attach(sessionJdbc, oid, pid);
DBPDataSource dataSource = sessionContext.getDataSource();
executeProcedure(configuration, monitor, oid, databaseName, dataSource);
}
private void executeProcedure(Map<String, Object> configuration, DBRProgressMonitor monitor, int oid,
String databaseName, DBPDataSource dataSource) throws DBException {
if (dataSource instanceof PostgreDataSource) {
PostgreDataSource pgDS = (PostgreDataSource) dataSource;
PostgreDatabase database = pgDS.getDatabase(databaseName);
PostgreSchema schema = database.getSchema(monitor, "public");
PostgreProcedure procedure = schema.getProcedure(monitor, oid);
String call = composeProcedureCall(procedure, configuration, monitor);
String taskName = NLS.bind("Execute procedure {0}", procedure.getName());
Job job = new Job(taskName) {
@Override
protected IStatus run(IProgressMonitor monitor) {
try {
try (final DBCSession execSession = DBUtils.openUtilSession(new VoidProgressMonitor(), dataSource, taskName)) {
try (final DBCStatement dbStat = execSession.prepareStatement(DBCStatementType.EXEC, call, true, false,
false)) {
dbStat.executeStatement();
}
}
} catch (DBCException e) {
log.error(taskName, e);
return DebugCore.newErrorStatus(taskName, e);
}
return Status.OK_STATUS;
}
};
job.schedule();
}
}
private String composeProcedureCall(DBSProcedure procedure, Map<String, Object> configuration,
DBRProgressMonitor monitor) throws DBException {
StringBuilder sb = new StringBuilder();
sb.append("select").append(' ').append(procedure.getName());
sb.append('(');
Collection<? extends DBSProcedureParameter> parameters = procedure.getParameters(monitor);
if (parameters.size() > 0) {
for (DBSProcedureParameter parameter : parameters) {
String name = parameter.getName();
Object value = configuration.get(name);
if (value == null) {
value = '?';
sb.append(value);
} else {
DBSTypedObject parameterType = parameter.getParameterType();
DBPDataKind dataKind = parameterType.getDataKind();
switch (dataKind) {
case STRING:
sb.append('\'');
sb.append(value);
sb.append('\'');
break;
default:
sb.append(value);
break;
}
}
sb.append(',');
}
sb.deleteCharAt(sb.length()-1);
}
sb.append(')');
String call = sb.toString();
return call;
executeProcedure(dataSource, configuration, monitor);
}
}
......@@ -77,13 +77,19 @@ public class PgSqlLaunchShortcut extends LaunchShortcut {
}
String database = DebugCore.extractDatabaseName(config);
String databaseName = launchable.getDataSource().getName();
String databaseName = procedure.getDatabase().getName();
if (!database.equals(databaseName)) {
return false;
}
String schema = DebugCore.extractSchemaName(config);
String schemaName = procedure.getContainer().getName();
if (!schema.equals(schemaName)) {
return false;
}
try {
String oid = config.getAttribute(DebugCore.ATTR_OID, String.valueOf(0));
String oid = config.getAttribute(DebugCore.ATTR_PROCEDURE_OID, String.valueOf(0));
long objectId = procedure.getObjectId();
if (!(Long.parseLong(oid)==objectId)) {
return false;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册