diff --git a/CHANGELOG.md b/CHANGELOG.md index fee3455..18525c1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ java-приложение для работы с блокировками в С * Обновлены библиотеки * Исправлена уязвимость при чтении XML * Обновлены action-ы в gitHubActions +* Прекращена поддержка PostgreSQL версий ниже 10, удалена настройка для отображения типа процесса 1.9.0 diff --git a/README.md b/README.md index 3fd100b..5a30608 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@ pgSqlBlocks - это standalone приложение, написанное на языке программирования Java, которое позволяет легко ориентироваться среди процессов и получать информацию о блокировках и ожидающих запросов в СУБД PostgreSQL. Отображается информация о состоянии подключения к БД, а также информация о процессах в БД. +Поддерживается работа с PostgreSQL 10+. + Требуется Java JRE версии 1.8 и выше для вашей платформы. ### Сборка, запуск тестов, запуск приложения @@ -23,8 +25,6 @@ pgSqlBlocks - это standalone приложение, написанное на ### Запросы -Для получения всех процессов сервера, включая или исключая idle(бездействующие), используется [скрипт](src/main/resources/query_with_idle.sql) или [скрипт](src/main/resources/query.sql) соответственно. - Для версии PostgreSQL 10 и выше, для получения всех процессов сервера, включая или исключая idle(бездействующие), используется [скрипт](src/main/resources/query_with_idle_10.sql) или [скрипт](src/main/resources/query_10.sql) соответственно. Уничтожается процесс командой: _select pg_terminate_backend(?);_ diff --git a/src/main/java/ru/taximaxim/pgsqlblocks/common/DBQueries.java b/src/main/java/ru/taximaxim/pgsqlblocks/common/DBQueries.java index 8b66b61..3748a17 100644 --- a/src/main/java/ru/taximaxim/pgsqlblocks/common/DBQueries.java +++ b/src/main/java/ru/taximaxim/pgsqlblocks/common/DBQueries.java @@ -31,14 +31,10 @@ public final class DBQueries { private static String versionQuery; private static String processesQuery; - private static String processesQueryForTen; private static String processesQueryWithIdle; - private static String processesQueryWithIdleForTen; private static final String PROCESSES_QUERY_FILE_NAME = "query.sql"; - private static final String PROCESSES_QUERY_10_FILE_NAME = "query_10.sql"; private static final String PROCESSES_QUERY_WITH_IDLE_FILE_NAME = "query_with_idle.sql"; - private static final String PROCESSES_QUERY_WITH_IDLE_10_FILE_NAME = "query_with_idle_10.sql"; private static final String PG_SERVER_VERSION_QUERY_FILE_NAME = "version.sql"; public static final String PG_TERMINATE_BACKEND_QUERY = "select pg_terminate_backend(?);"; @@ -52,13 +48,6 @@ public static synchronized String getProcessesQuery() { return processesQuery; } - public static synchronized String getProcessesQueryForTen() { - if (processesQueryForTen == null) { - processesQueryForTen = loadQuery(PROCESSES_QUERY_10_FILE_NAME); - } - return processesQueryForTen; - } - public static synchronized String getProcessesQueryWithIdle() { if (processesQueryWithIdle == null) { processesQueryWithIdle = loadQuery(PROCESSES_QUERY_WITH_IDLE_FILE_NAME); @@ -66,13 +55,6 @@ public static synchronized String getProcessesQueryWithIdle() { return processesQueryWithIdle; } - public static synchronized String getProcessesQueryWithIdleForTen() { - if (processesQueryWithIdleForTen == null) { - processesQueryWithIdleForTen = loadQuery(PROCESSES_QUERY_WITH_IDLE_10_FILE_NAME); - } - return processesQueryWithIdleForTen; - } - public static synchronized String getVersionQuery(){ if (versionQuery == null) { versionQuery = loadQuery(PG_SERVER_VERSION_QUERY_FILE_NAME); diff --git a/src/main/java/ru/taximaxim/pgsqlblocks/common/models/DBModel.java b/src/main/java/ru/taximaxim/pgsqlblocks/common/models/DBModel.java index 5a5aa5b..ee3dede 100644 --- a/src/main/java/ru/taximaxim/pgsqlblocks/common/models/DBModel.java +++ b/src/main/java/ru/taximaxim/pgsqlblocks/common/models/DBModel.java @@ -26,18 +26,16 @@ public class DBModel { private final String dbGroup; private final String user; private final String password; - private final boolean readBackendType; private final boolean enabled; public DBModel(String name, String host, String port, String databaseName, String dbGroup, - String user, String password, boolean readBackendType, boolean enabled) { + String user, String password, boolean enabled) { this.name = name; this.host = host; this.port = port; this.databaseName = databaseName; this.user = user; this.password = password; - this.readBackendType = readBackendType; this.enabled = enabled; this.dbGroup = dbGroup; } @@ -54,10 +52,6 @@ public String getPort() { return port; } - public boolean isReadBackendType() { - return readBackendType; - } - public String getDatabaseName() { return databaseName; } @@ -84,7 +78,7 @@ public boolean isEnabled() { public DBModel copy() { return new DBModel(this.name, this.host, this.port, this.databaseName, this.dbGroup, - this.user, this.password, this.readBackendType, this.enabled); + this.user, this.password, this.enabled); } @Override @@ -97,7 +91,6 @@ public String toString() { ", dbGroup='" + dbGroup + '\'' + ", user='" + user + '\'' + ", password='" + password + '\'' + - ", readBackendType='" + readBackendType + '\'' + ", enabled=" + enabled + '}'; } @@ -121,12 +114,11 @@ public boolean equals(Object obj) { && Objects.equals(name, other.name) && Objects.equals(password, other.password) && Objects.equals(port, other.port) - && readBackendType == other.readBackendType && Objects.equals(user, other.user); } @Override public int hashCode() { - return Objects.hash(databaseName, dbGroup, enabled, host, name, password, port, readBackendType, user); + return Objects.hash(databaseName, dbGroup, enabled, host, name, password, port, user); } } diff --git a/src/main/java/ru/taximaxim/pgsqlblocks/dialogs/AddDatabaseDialog.java b/src/main/java/ru/taximaxim/pgsqlblocks/dialogs/AddDatabaseDialog.java index 6f916a3..afadd1f 100644 --- a/src/main/java/ru/taximaxim/pgsqlblocks/dialogs/AddDatabaseDialog.java +++ b/src/main/java/ru/taximaxim/pgsqlblocks/dialogs/AddDatabaseDialog.java @@ -49,7 +49,6 @@ public class AddDatabaseDialog extends Dialog { protected Text userText; protected Text passwordText; protected Text databaseNameText; - protected Button readBackendTypeButton; protected Button enabledButton; protected ComboViewer cmdDbGroup; private final Set dbGroup; @@ -138,10 +137,6 @@ protected Control createDialogArea(Composite parent) { GridData checkGd = new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1); - readBackendTypeButton = new Button(container, SWT.CHECK); - readBackendTypeButton.setText(resourceBundle.getString("read_backend_type")); - readBackendTypeButton.setLayoutData(checkGd); - enabledButton = new Button(container, SWT.CHECK); enabledButton.setText(resourceBundle.getString("connect_automatically")); enabledButton.setLayoutData(checkGd); @@ -158,7 +153,6 @@ protected void okPressed() { String dbGroup = cmdDbGroup.getCombo().getText(); String user = userText.getText(); String password = passwordText.getText(); - boolean readBackendType = readBackendTypeButton.getSelection(); boolean enabled = enabledButton.getSelection(); if (name.isEmpty()) { displayError("missing_connection_name"); @@ -175,7 +169,7 @@ protected void okPressed() { } createdModel = new DBModel(name, host, port, databaseName, dbGroup, user, - password, readBackendType, enabled); + password, enabled); super.okPressed(); } diff --git a/src/main/java/ru/taximaxim/pgsqlblocks/dialogs/EditDatabaseDialog.java b/src/main/java/ru/taximaxim/pgsqlblocks/dialogs/EditDatabaseDialog.java index 9dc9cf5..cbce192 100644 --- a/src/main/java/ru/taximaxim/pgsqlblocks/dialogs/EditDatabaseDialog.java +++ b/src/main/java/ru/taximaxim/pgsqlblocks/dialogs/EditDatabaseDialog.java @@ -56,7 +56,6 @@ protected Control createDialogArea(Composite parent) { cmdDbGroup.getCombo().setText(editedModel.getDbGroup()); userText.setText(editedModel.getUser()); passwordText.setText(editedModel.getPassword()); - readBackendTypeButton.setSelection(editedModel.isReadBackendType()); enabledButton.setSelection(editedModel.isEnabled()); return dialogArea; } diff --git a/src/main/java/ru/taximaxim/pgsqlblocks/modules/db/controller/DBController.java b/src/main/java/ru/taximaxim/pgsqlblocks/modules/db/controller/DBController.java index b1acf46..a69e627 100644 --- a/src/main/java/ru/taximaxim/pgsqlblocks/modules/db/controller/DBController.java +++ b/src/main/java/ru/taximaxim/pgsqlblocks/modules/db/controller/DBController.java @@ -390,12 +390,7 @@ private void processesLoaded(List loadedProcesses) { } private String getProcessesQuery() { - boolean isTen = model.isReadBackendType(); - if (settings.getShowIdle()) { - return isTen ? DBQueries.getProcessesQueryWithIdleForTen() : DBQueries.getProcessesQueryWithIdle(); - } else { - return isTen ? DBQueries.getProcessesQueryForTen() : DBQueries.getProcessesQuery(); - } + return settings.getShowIdle() ? DBQueries.getProcessesQueryWithIdle() : DBQueries.getProcessesQuery(); } public void addListener(DBControllerListener listener) { diff --git a/src/main/java/ru/taximaxim/pgsqlblocks/xmlstore/DBModelsXmlStore.java b/src/main/java/ru/taximaxim/pgsqlblocks/xmlstore/DBModelsXmlStore.java index d3dbfca..c10bf5a 100644 --- a/src/main/java/ru/taximaxim/pgsqlblocks/xmlstore/DBModelsXmlStore.java +++ b/src/main/java/ru/taximaxim/pgsqlblocks/xmlstore/DBModelsXmlStore.java @@ -37,7 +37,6 @@ public class DBModelsXmlStore extends XmlStore { private static final String ELEMENT_DB_GROUP_NAME = "dbgroup"; private static final String ELEMENT_USER_TAG_NAME = "user"; private static final String ELEMENT_PASSWORD_TAG_NAME = "passwd"; - private static final String ELEMENT_READ_BACKEND_TAG_NAME = "readbt"; private static final String ELEMENT_ENABLED_TAG_NAME = "enabled"; public DBModelsXmlStore() { @@ -59,7 +58,6 @@ protected DBModel parseElement(Node node) { Node dbGroupNode = element.getElementsByTagName(ELEMENT_DB_GROUP_NAME).item(0); Node userNode = element.getElementsByTagName(ELEMENT_USER_TAG_NAME).item(0); Node passwordNode = element.getElementsByTagName(ELEMENT_PASSWORD_TAG_NAME).item(0); - Node readBackendNode = element.getElementsByTagName(ELEMENT_READ_BACKEND_TAG_NAME).item(0); Node enabledNode = element.getElementsByTagName(ELEMENT_ENABLED_TAG_NAME).item(0); String name = getTextContentFromNode(nameNode); @@ -69,10 +67,9 @@ protected DBModel parseElement(Node node) { String dbGroup = getTextContentFromNode(dbGroupNode); String user = getTextContentFromNode(userNode); String password = getTextContentFromNode(passwordNode); - boolean readBackend = readBackendNode != null && Boolean.parseBoolean(getTextContentFromNode(readBackendNode)); boolean enabled = enabledNode != null && Boolean.parseBoolean(getTextContentFromNode(enabledNode)); - return new DBModel(name, host, port, databaseName, dbGroup, user, password, readBackend, enabled); + return new DBModel(name, host, port, databaseName, dbGroup, user, password, enabled); } @Override @@ -88,7 +85,6 @@ protected void appendChildren(Document xml, Element root, List list) { createSubElement(xml, rootElement, ELEMENT_DB_GROUP_NAME, model.getDbGroup()); createSubElement(xml, rootElement, ELEMENT_USER_TAG_NAME, model.getUser()); createSubElement(xml, rootElement, ELEMENT_PASSWORD_TAG_NAME, model.getPassword()); - createSubElement(xml, rootElement, ELEMENT_READ_BACKEND_TAG_NAME, String.valueOf(model.isReadBackendType())); createSubElement(xml, rootElement, ELEMENT_ENABLED_TAG_NAME, String.valueOf(model.isEnabled())); } } diff --git a/src/main/resources/query.sql b/src/main/resources/query.sql index 73e9dfb..4c3cf84 100644 --- a/src/main/resources/query.sql +++ b/src/main/resources/query.sql @@ -27,7 +27,8 @@ SELECT application_name, datname, usename, - CASE WHEN client_port=-1 THEN 'local pipe' + backend_type, + CASE WHEN client_port=-1 THEN 'local pipe' WHEN length(client_hostname)>0 THEN client_hostname||':'||client_port ELSE textin(inet_out(client_addr))||':'||client_port END AS client, @@ -39,8 +40,6 @@ SELECT state, date_trunc('second', state_change) AS state_change, blocks.pid AS blockedby, - /* deprecated - null::text AS blocking_locks,*/ blocks.locktype AS locktype, blocks.relation AS relation, blocks.granted AS granted, diff --git a/src/main/resources/query_10.sql b/src/main/resources/query_10.sql deleted file mode 100644 index 5dc0697..0000000 --- a/src/main/resources/query_10.sql +++ /dev/null @@ -1,60 +0,0 @@ -WITH blocks AS ( - SELECT - blocking_locks.pid as pid, - blocked_locks.pid as blocked_pid, - blocking_locks.locktype as locktype, - blocking_locks.relation::regclass as relation, - blocking_locks.granted as granted - FROM - pg_catalog.pg_locks blocked_locks - JOIN - pg_catalog.pg_locks blocking_locks - ON blocking_locks.locktype = blocked_locks.locktype - AND blocking_locks.DATABASE IS NOT DISTINCT FROM blocked_locks.DATABASE - AND blocking_locks.relation IS NOT DISTINCT FROM blocked_locks.relation - AND blocking_locks.page IS NOT DISTINCT FROM blocked_locks.page - AND blocking_locks.tuple IS NOT DISTINCT FROM blocked_locks.tuple - AND blocking_locks.virtualxid IS NOT DISTINCT FROM blocked_locks.virtualxid - AND blocking_locks.transactionid IS NOT DISTINCT FROM blocked_locks.transactionid - AND blocking_locks.classid IS NOT DISTINCT FROM blocked_locks.classid - AND blocking_locks.objid IS NOT DISTINCT FROM blocked_locks.objid - AND blocking_locks.objsubid IS NOT DISTINCT FROM blocked_locks.objsubid - AND blocking_locks.pid != blocked_locks.pid - WHERE NOT blocked_locks.granted -) -SELECT - procs.pid AS pid, - application_name, - datname, - usename, - backend_type, - CASE WHEN client_port=-1 THEN 'local pipe' - WHEN length(client_hostname)>0 THEN client_hostname||':'||client_port - ELSE textin(inet_out(client_addr))||':'||client_port - END AS client, - date_trunc('second', backend_start) AS backend_start, - CASE WHEN state='active' THEN date_trunc('second', query_start)::text - ELSE '' - END AS query_start, - date_trunc('second', xact_start) AS xact_start, - state, - date_trunc('second', state_change) AS state_change, - blocks.pid AS blockedby, - /* deprecated - null::text AS blocking_locks,*/ - blocks.locktype AS locktype, - blocks.relation AS relation, - blocks.granted AS granted, - query AS query, - CASE WHEN query_start IS NULL OR state<>'active' THEN false - ELSE query_start < now() - '10 seconds'::interval - END AS slowquery -FROM - pg_stat_activity procs - LEFT JOIN blocks - ON blocks.blocked_pid = procs.pid -WHERE - procs.state != 'idle' - OR procs.state IS NULL -ORDER BY - pid diff --git a/src/main/resources/query_with_idle.sql b/src/main/resources/query_with_idle.sql index af7e984..3b97ba2 100644 --- a/src/main/resources/query_with_idle.sql +++ b/src/main/resources/query_with_idle.sql @@ -27,6 +27,7 @@ SELECT application_name, datname, usename, + backend_type, CASE WHEN client_port=-1 THEN 'local pipe' WHEN length(client_hostname)>0 THEN client_hostname||':'||client_port ELSE textin(inet_out(client_addr))||':'||client_port @@ -39,8 +40,6 @@ SELECT state, date_trunc('second', state_change) AS state_change, blocks.pid AS blockedby, - /* deprecated - null::text AS blocking_locks,*/ blocks.locktype AS locktype, blocks.relation AS relation, blocks.granted AS granted, diff --git a/src/main/resources/query_with_idle_10.sql b/src/main/resources/query_with_idle_10.sql deleted file mode 100644 index 7e91301..0000000 --- a/src/main/resources/query_with_idle_10.sql +++ /dev/null @@ -1,57 +0,0 @@ -WITH blocks AS ( - SELECT - blocking_locks.pid as pid, - blocked_locks.pid as blocked_pid, - blocking_locks.locktype as locktype, - blocking_locks.relation::regclass as relation, - blocking_locks.granted as granted - FROM - pg_catalog.pg_locks blocked_locks - JOIN - pg_catalog.pg_locks blocking_locks - ON blocking_locks.locktype = blocked_locks.locktype - AND blocking_locks.DATABASE IS NOT DISTINCT FROM blocked_locks.DATABASE - AND blocking_locks.relation IS NOT DISTINCT FROM blocked_locks.relation - AND blocking_locks.page IS NOT DISTINCT FROM blocked_locks.page - AND blocking_locks.tuple IS NOT DISTINCT FROM blocked_locks.tuple - AND blocking_locks.virtualxid IS NOT DISTINCT FROM blocked_locks.virtualxid - AND blocking_locks.transactionid IS NOT DISTINCT FROM blocked_locks.transactionid - AND blocking_locks.classid IS NOT DISTINCT FROM blocked_locks.classid - AND blocking_locks.objid IS NOT DISTINCT FROM blocked_locks.objid - AND blocking_locks.objsubid IS NOT DISTINCT FROM blocked_locks.objsubid - AND blocking_locks.pid != blocked_locks.pid - WHERE NOT blocked_locks.granted -) -SELECT - procs.pid AS pid, - application_name, - datname, - usename, - backend_type, - CASE WHEN client_port=-1 THEN 'local pipe' - WHEN length(client_hostname)>0 THEN client_hostname||':'||client_port - ELSE textin(inet_out(client_addr))||':'||client_port - END AS client, - date_trunc('second', backend_start) AS backend_start, - CASE WHEN state='active' THEN date_trunc('second', query_start)::text - ELSE '' - END AS query_start, - date_trunc('second', xact_start) AS xact_start, - state, - date_trunc('second', state_change) AS state_change, - blocks.pid AS blockedby, - /* deprecated - null::text AS blocking_locks,*/ - blocks.locktype AS locktype, - blocks.relation AS relation, - blocks.granted AS granted, - query AS query, - CASE WHEN query_start IS NULL OR state<>'active' THEN false - ELSE query_start < now() - '10 seconds'::interval - END AS slowquery -FROM - pg_stat_activity procs - LEFT JOIN blocks - ON blocks.blocked_pid = procs.pid -ORDER BY - pid diff --git a/src/test/java/ru/taximaxim/pgsqlblocks/common/models/DBModelTest.java b/src/test/java/ru/taximaxim/pgsqlblocks/common/models/DBModelTest.java index de87765..afa7850 100644 --- a/src/test/java/ru/taximaxim/pgsqlblocks/common/models/DBModelTest.java +++ b/src/test/java/ru/taximaxim/pgsqlblocks/common/models/DBModelTest.java @@ -23,7 +23,7 @@ public class DBModelTest { @Test public void copyTest() { - DBModel model1 = new DBModel("test", "", "host", "port", "dbName", "user", "password", true, false); + DBModel model1 = new DBModel("test", "", "host", "port", "dbName", "user", "password", false); DBModel model2 = model1.copy(); assertEquals(model1, model2); diff --git a/src/test/java/ru/taximaxim/pgsqlblocks/modules/db/controller/DBControllerTest.java b/src/test/java/ru/taximaxim/pgsqlblocks/modules/db/controller/DBControllerTest.java index 430696a..fbc8158 100644 --- a/src/test/java/ru/taximaxim/pgsqlblocks/modules/db/controller/DBControllerTest.java +++ b/src/test/java/ru/taximaxim/pgsqlblocks/modules/db/controller/DBControllerTest.java @@ -120,7 +120,7 @@ public static void initialize() { .withExposedPorts(5432); postgres.start(); DBModel model = new DBModel("TestDbc", REMOTE_HOST, postgres.getFirstMappedPort().toString(), - REMOTE_DB, "", REMOTE_USERNAME, REMOTE_PASSWORD, true, true); + REMOTE_DB, "", REMOTE_USERNAME, REMOTE_PASSWORD, true); testDbc = new DBController(Settings.getInstance(), model, null); testDbc.connectAsync(); testDbc.addListener(LISTENER);