diff --git a/README.md b/README.md index bdbbc639f8e929085fddcca6e30c60c5cf798364..b4c3899ec86f9cd97b0ed6cd370f83914567a532 100644 --- a/README.md +++ b/README.md @@ -14,14 +14,14 @@ Supports any database which has JDBC driver (which basically means - ANY databas * Based on Eclipse platform. * Uses plugins architecture and provides additional functionality for the following databases: MySQL/MariaDB, PostgreSQL, Oracle, DB2 LUW, Exasol, SQL Server, Sybase/SAP ASE, SQLite, Firebird, H2, HSQLDB, Derby, Teradata, Vertica, Netezza, Informix, etc. - - - - + + + + ## Download -You can download prebuilt binaries from official web site or directly from GitHub releases. +You can download prebuilt binaries from official web site or directly from GitHub releases. ## Running @@ -57,7 +57,7 @@ Binaries are in `product/standalone/target/products` - If you have any questions, suggestions, ideas, etc - write us. - Pull requests are welcome. -- Visit https://dbeaver.jkiss.org or https://dbeaver.com for more information. +- Visit https://dbeaver.io or https://dbeaver.com for more information. - Thanks for using DBeaver! Star if you like it. ## Contribution: help the Beaver! diff --git a/bundles/org.jkiss.utils/META-INF/MANIFEST.MF b/bundles/org.jkiss.utils/META-INF/MANIFEST.MF index 5cf823ad0dda612b6e457453c401d3e4d4c910b5..19e306914864836a229df28c173e95ad383562b4 100644 --- a/bundles/org.jkiss.utils/META-INF/MANIFEST.MF +++ b/bundles/org.jkiss.utils/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.utils -Bundle-Version: 2.1.65 -Bundle-Release-Date: 20180430 +Bundle-Version: 2.1.66 +Bundle-Release-Date: 20180514 Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Export-Package: org.jkiss.code, org.jkiss.utils, diff --git a/bundles/org.jkiss.utils/pom.xml b/bundles/org.jkiss.utils/pom.xml index 5138ad3a1808112f47597fc6843b55b336dd52cc..8cd363abe62e121c90374fb9b4a898bf7a8ff116 100644 --- a/bundles/org.jkiss.utils/pom.xml +++ b/bundles/org.jkiss.utils/pom.xml @@ -9,6 +9,6 @@ ../../ org.jkiss.utils - 2.1.65 + 2.1.66 eclipse-plugin diff --git a/bundles/org.jkiss.utils/src/org/jkiss/utils/IOUtils.java b/bundles/org.jkiss.utils/src/org/jkiss/utils/IOUtils.java index 0a873361b44d9bba793bc11c0d6da5155daa0671..65586a3193a0d51d9aec96ba7c87cf55091bff92 100644 --- a/bundles/org.jkiss.utils/src/org/jkiss/utils/IOUtils.java +++ b/bundles/org.jkiss.utils/src/org/jkiss/utils/IOUtils.java @@ -39,6 +39,14 @@ public final class IOUtils { } } + public static void close(AutoCloseable closeable) { + try { + closeable.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + public static void fastCopy(final InputStream src, final OutputStream dest) throws IOException { fastCopy(src, dest, DEFAULT_BUFFER_SIZE); } diff --git a/bundles/org.jkiss.wmi/META-INF/MANIFEST.MF b/bundles/org.jkiss.wmi/META-INF/MANIFEST.MF index bfb5b57efa02c39eaa5571726babd6676bbf4a02..9dc888a5f3578f04bf63b69631b62cbd9c938e9e 100644 --- a/bundles/org.jkiss.wmi/META-INF/MANIFEST.MF +++ b/bundles/org.jkiss.wmi/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.wmi -Bundle-Version: 2.0.75 -Bundle-Release-Date: 20180430 +Bundle-Version: 2.0.76 +Bundle-Release-Date: 20180514 Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-Vendor: %Bundle-Vendor Export-Package: org.jkiss.wmi.service diff --git a/bundles/org.jkiss.wmi/pom.xml b/bundles/org.jkiss.wmi/pom.xml index 95f481a815473ef2b7fac954a11752379e6e7d80..e4798abf6a2a52bcec587a46f77460ca7568dbf4 100644 --- a/bundles/org.jkiss.wmi/pom.xml +++ b/bundles/org.jkiss.wmi/pom.xml @@ -9,6 +9,6 @@ ../../ org.jkiss.wmi - 2.0.75 + 2.0.76 eclipse-plugin diff --git a/features/org.jkiss.dbeaver.ce.feature/feature.xml b/features/org.jkiss.dbeaver.ce.feature/feature.xml index e29930d5c66193c2c12719e915f7766e7e1eccf9..33bdeaad7b54d1dc43593262ffc1f3a5eb8d9039 100644 --- a/features/org.jkiss.dbeaver.ce.feature/feature.xml +++ b/features/org.jkiss.dbeaver.ce.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/features/org.jkiss.dbeaver.ce.feature/pom.xml b/features/org.jkiss.dbeaver.ce.feature/pom.xml index 9b5a7e33df0a5195125a9aee6c9ebd4d3b0d39bd..cbb3cea5269efd98fdf6dbf59421c94cae46c7a1 100644 --- a/features/org.jkiss.dbeaver.ce.feature/pom.xml +++ b/features/org.jkiss.dbeaver.ce.feature/pom.xml @@ -10,7 +10,7 @@ ../../ org.jkiss.dbeaver.ce.feature - 5.0.4 + 5.0.5 eclipse-feature diff --git a/features/org.jkiss.dbeaver.core.feature/feature.xml b/features/org.jkiss.dbeaver.core.feature/feature.xml index f71bdb28d183527c7ecb42b31ec5e6af36744c25..f721d55756fabbb408b6ff99bfe565de2308ddce 100644 --- a/features/org.jkiss.dbeaver.core.feature/feature.xml +++ b/features/org.jkiss.dbeaver.core.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/features/org.jkiss.dbeaver.core.feature/pom.xml b/features/org.jkiss.dbeaver.core.feature/pom.xml index 5dc645a79133038753089b8cd7e9293d537bfe35..fcd41281019d18b266c370a46ea7ff25b3950de2 100644 --- a/features/org.jkiss.dbeaver.core.feature/pom.xml +++ b/features/org.jkiss.dbeaver.core.feature/pom.xml @@ -9,6 +9,6 @@ ../../ org.jkiss.dbeaver.core.feature - 5.0.4 + 5.0.5 eclipse-feature diff --git a/features/org.jkiss.dbeaver.debug.feature/feature.xml b/features/org.jkiss.dbeaver.debug.feature/feature.xml index 42d5a736e9037c08383986f5329cdf09d2d7837d..40fcf2b9727b3376f68d09a8f2a46544a4d6cb07 100644 --- a/features/org.jkiss.dbeaver.debug.feature/feature.xml +++ b/features/org.jkiss.dbeaver.debug.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/features/org.jkiss.dbeaver.debug.feature/pom.xml b/features/org.jkiss.dbeaver.debug.feature/pom.xml index 3bf79d8a53408614d6b132588999607886118830..8418c5f26f2ec21c93e480cc36b566bd88085eeb 100644 --- a/features/org.jkiss.dbeaver.debug.feature/pom.xml +++ b/features/org.jkiss.dbeaver.debug.feature/pom.xml @@ -9,6 +9,6 @@ ../../ org.jkiss.dbeaver.debug.feature - 5.0.4 + 5.0.5 eclipse-feature diff --git a/features/org.jkiss.dbeaver.ext.db2.feature/feature.xml b/features/org.jkiss.dbeaver.ext.db2.feature/feature.xml index 75247c92103a193e3fd8cce2b0d07a395c2b4343..dbc59c89620077e519e436fb7f82a0cf98b5c3be 100644 --- a/features/org.jkiss.dbeaver.ext.db2.feature/feature.xml +++ b/features/org.jkiss.dbeaver.ext.db2.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/features/org.jkiss.dbeaver.ext.db2.feature/pom.xml b/features/org.jkiss.dbeaver.ext.db2.feature/pom.xml index bb7c88752d1b4517e4a4c29478e484d14c699484..15e989dc44c7b697e7ddae357279408363e0923a 100644 --- a/features/org.jkiss.dbeaver.ext.db2.feature/pom.xml +++ b/features/org.jkiss.dbeaver.ext.db2.feature/pom.xml @@ -9,6 +9,6 @@ ../../ org.jkiss.dbeaver.ext.db2.feature - 2.1.67 + 2.1.68 eclipse-feature diff --git a/features/org.jkiss.dbeaver.ext.exasol.feature/feature.xml b/features/org.jkiss.dbeaver.ext.exasol.feature/feature.xml index 77940ebcd2ea681e8e13f472a32d57995addf330..9b7a0efd1d88ef3b6eebceb9b4e2be7b5f425dc5 100644 --- a/features/org.jkiss.dbeaver.ext.exasol.feature/feature.xml +++ b/features/org.jkiss.dbeaver.ext.exasol.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/features/org.jkiss.dbeaver.ext.exasol.feature/pom.xml b/features/org.jkiss.dbeaver.ext.exasol.feature/pom.xml index 6a9522883e3c3db9723a7dfb59700340d4a052da..4277d11aad3a5224040a1e92c724c88fb26e6c88 100644 --- a/features/org.jkiss.dbeaver.ext.exasol.feature/pom.xml +++ b/features/org.jkiss.dbeaver.ext.exasol.feature/pom.xml @@ -10,7 +10,7 @@ ../../ org.jkiss.dbeaver.ext.exasol.feature - 1.0.40 + 1.0.41 eclipse-feature diff --git a/features/org.jkiss.dbeaver.ext.generic.feature/feature.xml b/features/org.jkiss.dbeaver.ext.generic.feature/feature.xml index dc8c087e691a509a01e5051d921fc9f92c6b82ae..e82207f41372be7bbff6ef1535863ce20ec12ca5 100644 --- a/features/org.jkiss.dbeaver.ext.generic.feature/feature.xml +++ b/features/org.jkiss.dbeaver.ext.generic.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/features/org.jkiss.dbeaver.ext.generic.feature/pom.xml b/features/org.jkiss.dbeaver.ext.generic.feature/pom.xml index fbe49e6085af2f4f7c42aa2055b20490c8b86685..1f41f172065f7965eb754946e46ffea9ff7c4745 100644 --- a/features/org.jkiss.dbeaver.ext.generic.feature/pom.xml +++ b/features/org.jkiss.dbeaver.ext.generic.feature/pom.xml @@ -9,6 +9,6 @@ ../../ org.jkiss.dbeaver.ext.generic.feature - 2.1.68 + 2.1.69 eclipse-feature diff --git a/features/org.jkiss.dbeaver.ext.mysql.feature/feature.xml b/features/org.jkiss.dbeaver.ext.mysql.feature/feature.xml index 67b6791d98aa6e4000280ee40daa34314109db0d..c70d69e5dc4707ac8b84320596e31f1cebeaf7e4 100644 --- a/features/org.jkiss.dbeaver.ext.mysql.feature/feature.xml +++ b/features/org.jkiss.dbeaver.ext.mysql.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/features/org.jkiss.dbeaver.ext.mysql.feature/pom.xml b/features/org.jkiss.dbeaver.ext.mysql.feature/pom.xml index f08cffe7103dd4c61535e3bbf2c30cb2e192099b..e1ac48f7b2fb47686cbd831dff80de9adba3705f 100644 --- a/features/org.jkiss.dbeaver.ext.mysql.feature/pom.xml +++ b/features/org.jkiss.dbeaver.ext.mysql.feature/pom.xml @@ -9,6 +9,6 @@ ../../ org.jkiss.dbeaver.ext.mysql.feature - 2.1.67 + 2.1.68 eclipse-feature diff --git a/features/org.jkiss.dbeaver.ext.office.feature/feature.xml b/features/org.jkiss.dbeaver.ext.office.feature/feature.xml index 698ead638eea1796664928d4368e754ff5794d03..f5ca2325e74f5c5b7f1fc29f15cedf72dae75243 100644 --- a/features/org.jkiss.dbeaver.ext.office.feature/feature.xml +++ b/features/org.jkiss.dbeaver.ext.office.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/features/org.jkiss.dbeaver.ext.office.feature/pom.xml b/features/org.jkiss.dbeaver.ext.office.feature/pom.xml index 3582b04f52d95c383ec0f6e9029d4e0742cd0186..27e33752a746887d0797642da0cfec7ae35c332c 100644 --- a/features/org.jkiss.dbeaver.ext.office.feature/pom.xml +++ b/features/org.jkiss.dbeaver.ext.office.feature/pom.xml @@ -9,7 +9,7 @@ ../../ org.jkiss.dbeaver.ext.office.feature - 1.1.19 + 1.1.20 eclipse-feature org.jkiss.dbeaver diff --git a/features/org.jkiss.dbeaver.ext.oracle.feature/feature.xml b/features/org.jkiss.dbeaver.ext.oracle.feature/feature.xml index 288e8f64ab1e254deaaecfb2ca1b83139c99b883..26f5195e43d63a38c4301b01b24c49657aeb0829 100644 --- a/features/org.jkiss.dbeaver.ext.oracle.feature/feature.xml +++ b/features/org.jkiss.dbeaver.ext.oracle.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/features/org.jkiss.dbeaver.ext.oracle.feature/pom.xml b/features/org.jkiss.dbeaver.ext.oracle.feature/pom.xml index 8bb2c483db1e42716d4756232429bf34ac519e61..9b7d37262c7dee327c113d7e3c1aedce3c5bf0ca 100644 --- a/features/org.jkiss.dbeaver.ext.oracle.feature/pom.xml +++ b/features/org.jkiss.dbeaver.ext.oracle.feature/pom.xml @@ -9,6 +9,6 @@ ../../ org.jkiss.dbeaver.ext.oracle.feature - 2.1.67 + 2.1.68 eclipse-feature diff --git a/features/org.jkiss.dbeaver.ext.ui.svg.feature/feature.xml b/features/org.jkiss.dbeaver.ext.ui.svg.feature/feature.xml index f7db8f6d093f848d5324dcccca9b34152120a608..95e404d4630dfaa89a525b6bfb0dda028b393f76 100644 --- a/features/org.jkiss.dbeaver.ext.ui.svg.feature/feature.xml +++ b/features/org.jkiss.dbeaver.ext.ui.svg.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/features/org.jkiss.dbeaver.ext.ui.svg.feature/pom.xml b/features/org.jkiss.dbeaver.ext.ui.svg.feature/pom.xml index ed5e7a57e75e68c0459ac687a0d95caf7b8ac46b..dba2284e3db279551e65486d14a273dc79817f37 100644 --- a/features/org.jkiss.dbeaver.ext.ui.svg.feature/pom.xml +++ b/features/org.jkiss.dbeaver.ext.ui.svg.feature/pom.xml @@ -9,7 +9,7 @@ ../../ org.jkiss.dbeaver.ext.ui.svg.feature - 1.0.18 + 1.0.19 eclipse-feature org.jkiss.dbeaver diff --git a/features/org.jkiss.dbeaver.ext.wmi.feature/feature.xml b/features/org.jkiss.dbeaver.ext.wmi.feature/feature.xml index 220721e33feb4a6820fd0b76512e752220d1c310..82d2e71913b82fce02a88f28e40a6c298d40c918 100644 --- a/features/org.jkiss.dbeaver.ext.wmi.feature/feature.xml +++ b/features/org.jkiss.dbeaver.ext.wmi.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/features/org.jkiss.dbeaver.ext.wmi.feature/pom.xml b/features/org.jkiss.dbeaver.ext.wmi.feature/pom.xml index 1ad98517658a81280a611698851e18e719cd2e98..ef37900ec77c702eaf97845e932e3544b0970529 100644 --- a/features/org.jkiss.dbeaver.ext.wmi.feature/pom.xml +++ b/features/org.jkiss.dbeaver.ext.wmi.feature/pom.xml @@ -9,6 +9,6 @@ ../../ org.jkiss.dbeaver.ext.wmi.feature - 2.0.84 + 2.0.85 eclipse-feature diff --git a/features/org.jkiss.dbeaver.net.sshj.feature/feature.xml b/features/org.jkiss.dbeaver.net.sshj.feature/feature.xml index 87115a3c0c91a6c1706f220848ed8060a5f4f9e1..f8c3a8962f2fee90a35be5addd3a78bec668e4a0 100644 --- a/features/org.jkiss.dbeaver.net.sshj.feature/feature.xml +++ b/features/org.jkiss.dbeaver.net.sshj.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/features/org.jkiss.dbeaver.net.sshj.feature/pom.xml b/features/org.jkiss.dbeaver.net.sshj.feature/pom.xml index fe0448564902a7b1de3c6d1fad55d55c0e638072..38f917e2eafe436139555d8264842efe40066616 100644 --- a/features/org.jkiss.dbeaver.net.sshj.feature/pom.xml +++ b/features/org.jkiss.dbeaver.net.sshj.feature/pom.xml @@ -9,6 +9,6 @@ ../../ org.jkiss.dbeaver.net.sshj.feature - 1.0.3 + 1.0.4 eclipse-feature diff --git a/features/org.jkiss.dbeaver.rcp.feature/feature.xml b/features/org.jkiss.dbeaver.rcp.feature/feature.xml index 64ce06df607c6c3d3c67ed9c5104fc760d9d9ee5..ded110052bdb484d8d416a8a362fd4d2a83418e1 100644 --- a/features/org.jkiss.dbeaver.rcp.feature/feature.xml +++ b/features/org.jkiss.dbeaver.rcp.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/features/org.jkiss.dbeaver.rcp.feature/pom.xml b/features/org.jkiss.dbeaver.rcp.feature/pom.xml index 66415f10a34ae6f7b95fb1a434aea728a4077039..7cf13529c9daef2cb29232a74df437e2158b6d06 100644 --- a/features/org.jkiss.dbeaver.rcp.feature/pom.xml +++ b/features/org.jkiss.dbeaver.rcp.feature/pom.xml @@ -9,6 +9,6 @@ ../../ org.jkiss.dbeaver.rcp.feature - 2.1.57 + 2.1.58 eclipse-feature diff --git a/features/org.jkiss.dbeaver.runtime.feature/feature.xml b/features/org.jkiss.dbeaver.runtime.feature/feature.xml index 60182e31496aea7d2e5690683e3c1139d3b2268b..77385b2479b590e9c7f077b5b9fcc159947e450b 100644 --- a/features/org.jkiss.dbeaver.runtime.feature/feature.xml +++ b/features/org.jkiss.dbeaver.runtime.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/features/org.jkiss.dbeaver.runtime.feature/pom.xml b/features/org.jkiss.dbeaver.runtime.feature/pom.xml index 34425585e0991ea11321e8caadcfa6ecc9054b68..05b7639d85f986101fff11a2159bc3866b79773b 100644 --- a/features/org.jkiss.dbeaver.runtime.feature/pom.xml +++ b/features/org.jkiss.dbeaver.runtime.feature/pom.xml @@ -9,6 +9,6 @@ ../../ org.jkiss.dbeaver.runtime.feature - 5.0.4 + 5.0.5 eclipse-feature diff --git a/features/org.jkiss.dbeaver.standalone.feature/feature.xml b/features/org.jkiss.dbeaver.standalone.feature/feature.xml index 0b2b92ef05ebe59ea1cc1f306d4be71c760184a8..e1e619d6dfaf64a24f1fa42f90cb0fba9901e9bf 100644 --- a/features/org.jkiss.dbeaver.standalone.feature/feature.xml +++ b/features/org.jkiss.dbeaver.standalone.feature/feature.xml @@ -2,7 +2,7 @@ @@ -30,10 +30,7 @@ - - diff --git a/features/org.jkiss.dbeaver.standalone.feature/pom.xml b/features/org.jkiss.dbeaver.standalone.feature/pom.xml index 2bdd9f87fb5823353619ee0635e304c3476848e8..a84a2b8318537d67ede748055f5050dce7134932 100644 --- a/features/org.jkiss.dbeaver.standalone.feature/pom.xml +++ b/features/org.jkiss.dbeaver.standalone.feature/pom.xml @@ -10,7 +10,7 @@ ../../ org.jkiss.dbeaver.standalone.feature - 5.0.4 + 5.0.5 eclipse-feature diff --git a/nls/bundles/org.jkiss.dbeaver.core.application.nls/META-INF/MANIFEST.MF b/nls/bundles/org.jkiss.dbeaver.core.application.nls/META-INF/MANIFEST.MF index 53a01bbe8db5ce5e31d07a0f14676fa9e83a8f73..6c729b0b51f4e21fda75fdbf0d0000b4170de817 100644 --- a/nls/bundles/org.jkiss.dbeaver.core.application.nls/META-INF/MANIFEST.MF +++ b/nls/bundles/org.jkiss.dbeaver.core.application.nls/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.core.application.nls -Bundle-Version: 5.0.4 -Bundle-Release-Date: 20180430 +Bundle-Version: 5.0.5 +Bundle-Release-Date: 20180514 Fragment-Host: org.jkiss.dbeaver.core.application Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-Vendor: JKISS diff --git a/nls/bundles/org.jkiss.dbeaver.core.application.nls/pom.xml b/nls/bundles/org.jkiss.dbeaver.core.application.nls/pom.xml index 71ea665d6fc722f5cbea462168b11a078d0bf7e4..9c090185e019afa885436e44b7cc75e123a21b4e 100644 --- a/nls/bundles/org.jkiss.dbeaver.core.application.nls/pom.xml +++ b/nls/bundles/org.jkiss.dbeaver.core.application.nls/pom.xml @@ -9,6 +9,6 @@ ../../../ org.jkiss.dbeaver.core.application.nls - 5.0.4 + 5.0.5 eclipse-plugin diff --git a/nls/bundles/org.jkiss.dbeaver.core.eclipse.nls/META-INF/MANIFEST.MF b/nls/bundles/org.jkiss.dbeaver.core.eclipse.nls/META-INF/MANIFEST.MF index 9f0b84ce63123427af6918aa19d22c2ac8ab74d8..f2d3b4e893c0e1fa1111350dc2c687e3b54ae843 100644 --- a/nls/bundles/org.jkiss.dbeaver.core.eclipse.nls/META-INF/MANIFEST.MF +++ b/nls/bundles/org.jkiss.dbeaver.core.eclipse.nls/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.core.eclipse.nls -Bundle-Version: 5.0.4 -Bundle-Release-Date: 20180430 +Bundle-Version: 5.0.5 +Bundle-Release-Date: 20180514 Fragment-Host: org.jkiss.dbeaver.core.eclipse Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-Vendor: JKISS diff --git a/nls/bundles/org.jkiss.dbeaver.core.eclipse.nls/pom.xml b/nls/bundles/org.jkiss.dbeaver.core.eclipse.nls/pom.xml index 63678b0e78dd1c9a8dcafc8b81fa397242a7e4f8..030af031a14a53c518c1cf9eb334c6330a5b57c1 100644 --- a/nls/bundles/org.jkiss.dbeaver.core.eclipse.nls/pom.xml +++ b/nls/bundles/org.jkiss.dbeaver.core.eclipse.nls/pom.xml @@ -9,6 +9,6 @@ ../../../ org.jkiss.dbeaver.core.eclipse.nls - 5.0.4 + 5.0.5 eclipse-plugin diff --git a/nls/bundles/org.jkiss.dbeaver.core.nls/META-INF/MANIFEST.MF b/nls/bundles/org.jkiss.dbeaver.core.nls/META-INF/MANIFEST.MF index d42f30c14a4168bd1c396f064f51246379483be9..f7b40362aac33c9fe86f8b8aefb0adeb3a414717 100644 --- a/nls/bundles/org.jkiss.dbeaver.core.nls/META-INF/MANIFEST.MF +++ b/nls/bundles/org.jkiss.dbeaver.core.nls/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.core.nls -Bundle-Version: 5.0.4 -Bundle-Release-Date: 20180430 +Bundle-Version: 5.0.5 +Bundle-Release-Date: 20180514 Fragment-Host: org.jkiss.dbeaver.core Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-Vendor: JKISS diff --git a/nls/bundles/org.jkiss.dbeaver.core.nls/pom.xml b/nls/bundles/org.jkiss.dbeaver.core.nls/pom.xml index 44355ed3f9142f9e72d5ce91f596045acbd0f3bb..8cf11f434cf13188cf0a04405b20b0e5bb15b9f4 100644 --- a/nls/bundles/org.jkiss.dbeaver.core.nls/pom.xml +++ b/nls/bundles/org.jkiss.dbeaver.core.nls/pom.xml @@ -9,6 +9,6 @@ ../../../ org.jkiss.dbeaver.core.nls - 5.0.4 + 5.0.5 eclipse-plugin diff --git a/nls/bundles/org.jkiss.dbeaver.core.nls/src/org/jkiss/dbeaver/core/CoreResources_zh.properties b/nls/bundles/org.jkiss.dbeaver.core.nls/src/org/jkiss/dbeaver/core/CoreResources_zh.properties index 56cbc7e89b8c985248df1e7b69d051b29f686856..004a422f886ff5bd2c9118d3a2d0d78d391a00fd 100644 --- a/nls/bundles/org.jkiss.dbeaver.core.nls/src/org/jkiss/dbeaver/core/CoreResources_zh.properties +++ b/nls/bundles/org.jkiss.dbeaver.core.nls/src/org/jkiss/dbeaver/core/CoreResources_zh.properties @@ -1236,7 +1236,7 @@ sql_editor_resultset_filter_panel_menu_stop = \u505C\u6B62 sql_editor_resultset_filter_panel_menu_refresh_interval = \u6BCF {0} \u79D2\u5237\u65B0 sql_editor_resultset_filter_panel_menu_refresh_interval_1 = \u6BCF {0} \u79D2\u5237\u65B0 sql_editor_resultset_filter_panel_control_no_data = \u65E0\u6570\u636E -sql_editor_resultset_filter_panel_control_execute_to_see_reslut = \u6267\u884C\u62C6\u67E5\u8BE2 {0} \u6216\u8005\u811A\u672C {1} \u6765\u67E5\u770B\u7ED3\u679C +sql_editor_resultset_filter_panel_control_execute_to_see_reslut = \u6267\u884C\u67E5\u8BE2 {0} \u6216\u8005\u811A\u672C {1} \u6765\u67E5\u770B\u7ED3\u679C ## SQL editor resultset filter panel ## ## object properties editor ## diff --git a/nls/bundles/org.jkiss.dbeaver.data.office.nls/META-INF/MANIFEST.MF b/nls/bundles/org.jkiss.dbeaver.data.office.nls/META-INF/MANIFEST.MF index 6cb73b015effd7195dea5caa0a2bf12791a156e4..6ae9f1b2e80521f709d5e60ef30ea5102c2ac7e8 100644 --- a/nls/bundles/org.jkiss.dbeaver.data.office.nls/META-INF/MANIFEST.MF +++ b/nls/bundles/org.jkiss.dbeaver.data.office.nls/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.data.office.nls -Bundle-Version: 1.0.14 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.15 +Bundle-Release-Date: 20180514 Fragment-Host: org.jkiss.dbeaver.data.office Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-Vendor: JKISS diff --git a/nls/bundles/org.jkiss.dbeaver.data.office.nls/pom.xml b/nls/bundles/org.jkiss.dbeaver.data.office.nls/pom.xml index 872f359d8ff9b5d0c330da093331ff39f6ad5592..df99746978d0a063154f6da9c438ad452b291783 100644 --- a/nls/bundles/org.jkiss.dbeaver.data.office.nls/pom.xml +++ b/nls/bundles/org.jkiss.dbeaver.data.office.nls/pom.xml @@ -9,6 +9,6 @@ ../../../ org.jkiss.dbeaver.data.office.nls - 1.0.14 + 1.0.15 eclipse-plugin diff --git a/nls/bundles/org.jkiss.dbeaver.ext.db2.nls/META-INF/MANIFEST.MF b/nls/bundles/org.jkiss.dbeaver.ext.db2.nls/META-INF/MANIFEST.MF index 227c2011e57121ccefce97a3831a84a82cc8039f..2c325b5256cf0785893f795ef26304c4e917767d 100644 --- a/nls/bundles/org.jkiss.dbeaver.ext.db2.nls/META-INF/MANIFEST.MF +++ b/nls/bundles/org.jkiss.dbeaver.ext.db2.nls/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.ext.db2.nls -Bundle-Version: 1.0.14 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.15 +Bundle-Release-Date: 20180514 Fragment-Host: org.jkiss.dbeaver.ext.db2 Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-Vendor: JKISS diff --git a/nls/bundles/org.jkiss.dbeaver.ext.db2.nls/pom.xml b/nls/bundles/org.jkiss.dbeaver.ext.db2.nls/pom.xml index de8226ad1da1471c2d27a5c6e2c817bf3543c85a..1bff0e13df22891eaa38532a71b6471bd51a1588 100644 --- a/nls/bundles/org.jkiss.dbeaver.ext.db2.nls/pom.xml +++ b/nls/bundles/org.jkiss.dbeaver.ext.db2.nls/pom.xml @@ -9,6 +9,6 @@ ../../../ org.jkiss.dbeaver.ext.db2.nls - 1.0.14 + 1.0.15 eclipse-plugin diff --git a/nls/bundles/org.jkiss.dbeaver.ext.derby.nls/META-INF/MANIFEST.MF b/nls/bundles/org.jkiss.dbeaver.ext.derby.nls/META-INF/MANIFEST.MF index 6a31d10132381c035a490727702faf99e91a85e1..b115bf1050a63c99175d78cf37a75d8eb367bfce 100644 --- a/nls/bundles/org.jkiss.dbeaver.ext.derby.nls/META-INF/MANIFEST.MF +++ b/nls/bundles/org.jkiss.dbeaver.ext.derby.nls/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.ext.derby.nls -Bundle-Version: 1.0.14 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.15 +Bundle-Release-Date: 20180514 Fragment-Host: org.jkiss.dbeaver.ext.derby Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-Vendor: JKISS diff --git a/nls/bundles/org.jkiss.dbeaver.ext.derby.nls/pom.xml b/nls/bundles/org.jkiss.dbeaver.ext.derby.nls/pom.xml index 346fc59a35715cd76dc473fba05047c83144c2f0..3742889f9dda62fc8c6d78b8b0fffaacc4eb3b3d 100644 --- a/nls/bundles/org.jkiss.dbeaver.ext.derby.nls/pom.xml +++ b/nls/bundles/org.jkiss.dbeaver.ext.derby.nls/pom.xml @@ -9,6 +9,6 @@ ../../../ org.jkiss.dbeaver.ext.derby.nls - 1.0.14 + 1.0.15 eclipse-plugin diff --git a/nls/bundles/org.jkiss.dbeaver.ext.erd.nls/META-INF/MANIFEST.MF b/nls/bundles/org.jkiss.dbeaver.ext.erd.nls/META-INF/MANIFEST.MF index c4956a021b0df298562d8dc260aaf1cf0ad74e62..2740a4f53a3e007cdf8a4b5e37374452a521e557 100644 --- a/nls/bundles/org.jkiss.dbeaver.ext.erd.nls/META-INF/MANIFEST.MF +++ b/nls/bundles/org.jkiss.dbeaver.ext.erd.nls/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.ext.erd.nls -Bundle-Version: 1.0.14 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.15 +Bundle-Release-Date: 20180514 Fragment-Host: org.jkiss.dbeaver.ext.erd Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-Vendor: JKISS diff --git a/nls/bundles/org.jkiss.dbeaver.ext.erd.nls/pom.xml b/nls/bundles/org.jkiss.dbeaver.ext.erd.nls/pom.xml index 282160bee49589bea9a144fc0635065a352d00a5..975f237334d6d5b907580c7acccd060e57183e55 100644 --- a/nls/bundles/org.jkiss.dbeaver.ext.erd.nls/pom.xml +++ b/nls/bundles/org.jkiss.dbeaver.ext.erd.nls/pom.xml @@ -9,6 +9,6 @@ ../../../ org.jkiss.dbeaver.ext.erd.nls - 1.0.14 + 1.0.15 eclipse-plugin diff --git a/nls/bundles/org.jkiss.dbeaver.ext.exasol.nls/META-INF/MANIFEST.MF b/nls/bundles/org.jkiss.dbeaver.ext.exasol.nls/META-INF/MANIFEST.MF index d8b8dd681f5cb33eef236d14ded6b09d164a7390..8624fb8e392baadb0390dd8195c087de04a4b7b2 100644 --- a/nls/bundles/org.jkiss.dbeaver.ext.exasol.nls/META-INF/MANIFEST.MF +++ b/nls/bundles/org.jkiss.dbeaver.ext.exasol.nls/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Exasol extension NLS Bundle-SymbolicName: org.jkiss.dbeaver.ext.exasol.nls -Bundle-Version: 1.0.14 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.15 +Bundle-Release-Date: 20180514 Fragment-Host: org.jkiss.dbeaver.ext.exasol Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-Vendor: JKISS diff --git a/nls/bundles/org.jkiss.dbeaver.ext.exasol.nls/pom.xml b/nls/bundles/org.jkiss.dbeaver.ext.exasol.nls/pom.xml index f5adaf0cb140e08482e9aab108d6d222cfa8e02d..7abef01fb05b5effa4d1705f4eaaa2b4d6cf46bd 100644 --- a/nls/bundles/org.jkiss.dbeaver.ext.exasol.nls/pom.xml +++ b/nls/bundles/org.jkiss.dbeaver.ext.exasol.nls/pom.xml @@ -9,6 +9,6 @@ ../../../ org.jkiss.dbeaver.ext.exasol.nls - 1.0.14 + 1.0.15 eclipse-plugin diff --git a/nls/bundles/org.jkiss.dbeaver.ext.firebird.nls/META-INF/MANIFEST.MF b/nls/bundles/org.jkiss.dbeaver.ext.firebird.nls/META-INF/MANIFEST.MF index f42a2a54c3b0563d1b25d9cebc66668c74ad36b9..fbd8df2c3b9fd4dc19c16d5b1c87abf3730d5cfb 100644 --- a/nls/bundles/org.jkiss.dbeaver.ext.firebird.nls/META-INF/MANIFEST.MF +++ b/nls/bundles/org.jkiss.dbeaver.ext.firebird.nls/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.ext.firebird.nls -Bundle-Version: 1.0.14 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.15 +Bundle-Release-Date: 20180514 Fragment-Host: org.jkiss.dbeaver.ext.firebird Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-Vendor: JKISS diff --git a/nls/bundles/org.jkiss.dbeaver.ext.firebird.nls/pom.xml b/nls/bundles/org.jkiss.dbeaver.ext.firebird.nls/pom.xml index cda95f4794f64b5058e4c4cbe920d0a256ea35aa..ac2a94bcb0aa3e8cec52f470b5265cfbfd006f23 100644 --- a/nls/bundles/org.jkiss.dbeaver.ext.firebird.nls/pom.xml +++ b/nls/bundles/org.jkiss.dbeaver.ext.firebird.nls/pom.xml @@ -9,6 +9,6 @@ ../../../ org.jkiss.dbeaver.ext.firebird.nls - 1.0.14 + 1.0.15 eclipse-plugin diff --git a/nls/bundles/org.jkiss.dbeaver.ext.generic.nls/META-INF/MANIFEST.MF b/nls/bundles/org.jkiss.dbeaver.ext.generic.nls/META-INF/MANIFEST.MF index 717c8008b42ab110f0606928783f240d99235318..a697e99b6a6b2cca6b3ffe5997415ede897aaeb8 100644 --- a/nls/bundles/org.jkiss.dbeaver.ext.generic.nls/META-INF/MANIFEST.MF +++ b/nls/bundles/org.jkiss.dbeaver.ext.generic.nls/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Generic datasources NLS Bundle-SymbolicName: org.jkiss.dbeaver.ext.generic.nls -Bundle-Version: 1.0.14 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.15 +Bundle-Release-Date: 20180514 Fragment-Host: org.jkiss.dbeaver.ext.generic Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-Vendor: JKISS diff --git a/nls/bundles/org.jkiss.dbeaver.ext.generic.nls/pom.xml b/nls/bundles/org.jkiss.dbeaver.ext.generic.nls/pom.xml index e3fd910ab0bf957d7c0e6b91bc82a6d03b8b2ca5..a4b53dcb79f45d7467d5628ad725f406bb25a783 100644 --- a/nls/bundles/org.jkiss.dbeaver.ext.generic.nls/pom.xml +++ b/nls/bundles/org.jkiss.dbeaver.ext.generic.nls/pom.xml @@ -9,6 +9,6 @@ ../../../ org.jkiss.dbeaver.ext.generic.nls - 1.0.14 + 1.0.15 eclipse-plugin diff --git a/nls/bundles/org.jkiss.dbeaver.ext.h2.nls/META-INF/MANIFEST.MF b/nls/bundles/org.jkiss.dbeaver.ext.h2.nls/META-INF/MANIFEST.MF index a0991619239da2593c37e478cb1007e3c448935d..1e26513fd1e8b1e786b6def7b2e72be39084d266 100644 --- a/nls/bundles/org.jkiss.dbeaver.ext.h2.nls/META-INF/MANIFEST.MF +++ b/nls/bundles/org.jkiss.dbeaver.ext.h2.nls/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.ext.h2.nls -Bundle-Version: 1.0.14 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.15 +Bundle-Release-Date: 20180514 Fragment-Host: org.jkiss.dbeaver.ext.h2 Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-Vendor: JKISS diff --git a/nls/bundles/org.jkiss.dbeaver.ext.h2.nls/pom.xml b/nls/bundles/org.jkiss.dbeaver.ext.h2.nls/pom.xml index 12c50e2da25ff53de3a31d3142cf5f55e1ef4a37..03e096a4075f7b2c2d5f020e58abdd55a61b4522 100644 --- a/nls/bundles/org.jkiss.dbeaver.ext.h2.nls/pom.xml +++ b/nls/bundles/org.jkiss.dbeaver.ext.h2.nls/pom.xml @@ -9,6 +9,6 @@ ../../../ org.jkiss.dbeaver.ext.h2.nls - 1.0.14 + 1.0.15 eclipse-plugin diff --git a/nls/bundles/org.jkiss.dbeaver.ext.hsqldb.nls/META-INF/MANIFEST.MF b/nls/bundles/org.jkiss.dbeaver.ext.hsqldb.nls/META-INF/MANIFEST.MF index e9889519b8d22a72f0c8bdaa614bd46a9f2266e4..7c74c34dadddd2f0384f39a4d29d36c24be149ca 100644 --- a/nls/bundles/org.jkiss.dbeaver.ext.hsqldb.nls/META-INF/MANIFEST.MF +++ b/nls/bundles/org.jkiss.dbeaver.ext.hsqldb.nls/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.ext.hsqldb.nls -Bundle-Version: 1.0.14 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.15 +Bundle-Release-Date: 20180514 Fragment-Host: org.jkiss.dbeaver.ext.hsqldb Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-Vendor: JKISS diff --git a/nls/bundles/org.jkiss.dbeaver.ext.hsqldb.nls/pom.xml b/nls/bundles/org.jkiss.dbeaver.ext.hsqldb.nls/pom.xml index b5948c5d22eb7914e32066e95db4f863edda7193..d06e9b5f8d0b896c7c290b3946026c6722f6a7e9 100644 --- a/nls/bundles/org.jkiss.dbeaver.ext.hsqldb.nls/pom.xml +++ b/nls/bundles/org.jkiss.dbeaver.ext.hsqldb.nls/pom.xml @@ -9,6 +9,6 @@ ../../../ org.jkiss.dbeaver.ext.hsqldb.nls - 1.0.14 + 1.0.15 eclipse-plugin diff --git a/nls/bundles/org.jkiss.dbeaver.ext.import_config.nls/META-INF/MANIFEST.MF b/nls/bundles/org.jkiss.dbeaver.ext.import_config.nls/META-INF/MANIFEST.MF index e42d94aa1f993845feb8a2dd23ec852e90d3a8d4..35e7ca98673321a965ba56a246f86259a318f5fa 100644 --- a/nls/bundles/org.jkiss.dbeaver.ext.import_config.nls/META-INF/MANIFEST.MF +++ b/nls/bundles/org.jkiss.dbeaver.ext.import_config.nls/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Import config extension NLS Bundle-SymbolicName: org.jkiss.dbeaver.ext.import_config.nls -Bundle-Version: 1.0.14 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.15 +Bundle-Release-Date: 20180514 Fragment-Host: org.jkiss.dbeaver.ext.import_config Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-Vendor: JKISS diff --git a/nls/bundles/org.jkiss.dbeaver.ext.import_config.nls/pom.xml b/nls/bundles/org.jkiss.dbeaver.ext.import_config.nls/pom.xml index 2a5154b5294dab9fff1b4737a586ebeb7093a80c..c554caae2ed3b0dba841dbe1ef915520b6441296 100644 --- a/nls/bundles/org.jkiss.dbeaver.ext.import_config.nls/pom.xml +++ b/nls/bundles/org.jkiss.dbeaver.ext.import_config.nls/pom.xml @@ -9,6 +9,6 @@ ../../../ org.jkiss.dbeaver.ext.import_config.nls - 1.0.14 + 1.0.15 eclipse-plugin diff --git a/nls/bundles/org.jkiss.dbeaver.ext.informix.nls/META-INF/MANIFEST.MF b/nls/bundles/org.jkiss.dbeaver.ext.informix.nls/META-INF/MANIFEST.MF index 24c4a916cae314bba52d94f668d8d6336da3225a..ede140e0dd5d1d6187802f75a6e37917a59ea2ae 100644 --- a/nls/bundles/org.jkiss.dbeaver.ext.informix.nls/META-INF/MANIFEST.MF +++ b/nls/bundles/org.jkiss.dbeaver.ext.informix.nls/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Informix extension NLS Bundle-SymbolicName: org.jkiss.dbeaver.ext.informix.nls -Bundle-Version: 1.0.14 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.15 +Bundle-Release-Date: 20180514 Fragment-Host: org.jkiss.dbeaver.ext.informix Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-Vendor: JKISS diff --git a/nls/bundles/org.jkiss.dbeaver.ext.informix.nls/pom.xml b/nls/bundles/org.jkiss.dbeaver.ext.informix.nls/pom.xml index 5e9e0d3f6d8f01ea82420bd87087c9aa8c3a2bc8..7652785ed8b21137f04f6b960f9a3d14b7065a91 100644 --- a/nls/bundles/org.jkiss.dbeaver.ext.informix.nls/pom.xml +++ b/nls/bundles/org.jkiss.dbeaver.ext.informix.nls/pom.xml @@ -9,6 +9,6 @@ ../../../ org.jkiss.dbeaver.ext.informix.nls - 1.0.14 + 1.0.15 eclipse-plugin diff --git a/nls/bundles/org.jkiss.dbeaver.ext.mssql.nls/META-INF/MANIFEST.MF b/nls/bundles/org.jkiss.dbeaver.ext.mssql.nls/META-INF/MANIFEST.MF index 3267bd93ab777df91e63b2a9b062a3f22e0bd052..5ea9cb0107a3b4c8f9a8c8647978625f4f6ead3b 100644 --- a/nls/bundles/org.jkiss.dbeaver.ext.mssql.nls/META-INF/MANIFEST.MF +++ b/nls/bundles/org.jkiss.dbeaver.ext.mssql.nls/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: SQL Server extension NLS Bundle-SymbolicName: org.jkiss.dbeaver.ext.mssql.nls -Bundle-Version: 1.0.14 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.15 +Bundle-Release-Date: 20180514 Fragment-Host: org.jkiss.dbeaver.ext.mssql Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-Vendor: JKISS diff --git a/nls/bundles/org.jkiss.dbeaver.ext.mssql.nls/pom.xml b/nls/bundles/org.jkiss.dbeaver.ext.mssql.nls/pom.xml index 4d3298134714f03e0f78a160350189955d2591c2..16e2a16308a3e2d75b1a0ec976a1a4c58d2b9f69 100644 --- a/nls/bundles/org.jkiss.dbeaver.ext.mssql.nls/pom.xml +++ b/nls/bundles/org.jkiss.dbeaver.ext.mssql.nls/pom.xml @@ -9,6 +9,6 @@ ../../../ org.jkiss.dbeaver.ext.mssql.nls - 1.0.14 + 1.0.15 eclipse-plugin diff --git a/nls/bundles/org.jkiss.dbeaver.ext.mysql.nls/META-INF/MANIFEST.MF b/nls/bundles/org.jkiss.dbeaver.ext.mysql.nls/META-INF/MANIFEST.MF index 140b5a3dec22085688d6e88d1fa6099fabb9a06d..479b322a1cf8dcc2a93c977625f6f99a3d4459ea 100644 --- a/nls/bundles/org.jkiss.dbeaver.ext.mysql.nls/META-INF/MANIFEST.MF +++ b/nls/bundles/org.jkiss.dbeaver.ext.mysql.nls/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: MySQL extension NLS Bundle-SymbolicName: org.jkiss.dbeaver.ext.mysql.nls -Bundle-Version: 1.0.14 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.15 +Bundle-Release-Date: 20180514 Fragment-Host: org.jkiss.dbeaver.ext.mysql Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-Vendor: JKISS diff --git a/nls/bundles/org.jkiss.dbeaver.ext.mysql.nls/pom.xml b/nls/bundles/org.jkiss.dbeaver.ext.mysql.nls/pom.xml index 4d6a305ffcc063bde2d74d8dfb1a0605281f6200..a3135939bf7858f19ede0f1f934c7906ebc02542 100644 --- a/nls/bundles/org.jkiss.dbeaver.ext.mysql.nls/pom.xml +++ b/nls/bundles/org.jkiss.dbeaver.ext.mysql.nls/pom.xml @@ -9,6 +9,6 @@ ../../../ org.jkiss.dbeaver.ext.mysql.nls - 1.0.14 + 1.0.15 eclipse-plugin diff --git a/nls/bundles/org.jkiss.dbeaver.ext.netezza.nls/META-INF/MANIFEST.MF b/nls/bundles/org.jkiss.dbeaver.ext.netezza.nls/META-INF/MANIFEST.MF index eafc16f3e4589b315e53d1b8cd8741d28d7bd2d1..1eae38c8f407de1029c1ea8b625cab8845ff5e75 100644 --- a/nls/bundles/org.jkiss.dbeaver.ext.netezza.nls/META-INF/MANIFEST.MF +++ b/nls/bundles/org.jkiss.dbeaver.ext.netezza.nls/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.ext.netezza.nls -Bundle-Version: 1.0.14 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.15 +Bundle-Release-Date: 20180514 Fragment-Host: org.jkiss.dbeaver.ext.netezza Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-Vendor: JKISS diff --git a/nls/bundles/org.jkiss.dbeaver.ext.netezza.nls/pom.xml b/nls/bundles/org.jkiss.dbeaver.ext.netezza.nls/pom.xml index c7d12be972f0fe8505b006d4feebeaf320c4ca79..5f1dcfd8eb1a6d6acb9d767b5ce2601e2fe06dfb 100644 --- a/nls/bundles/org.jkiss.dbeaver.ext.netezza.nls/pom.xml +++ b/nls/bundles/org.jkiss.dbeaver.ext.netezza.nls/pom.xml @@ -9,6 +9,6 @@ ../../../ org.jkiss.dbeaver.ext.netezza.nls - 1.0.14 + 1.0.15 eclipse-plugin diff --git a/nls/bundles/org.jkiss.dbeaver.ext.oracle.nls/META-INF/MANIFEST.MF b/nls/bundles/org.jkiss.dbeaver.ext.oracle.nls/META-INF/MANIFEST.MF index bb0a78f615d76cb3d6c40632c8e4f3510c38cdef..cb1922cec74f99d5d449bc2671f1bdff5d4ded3e 100644 --- a/nls/bundles/org.jkiss.dbeaver.ext.oracle.nls/META-INF/MANIFEST.MF +++ b/nls/bundles/org.jkiss.dbeaver.ext.oracle.nls/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.ext.oracle.nls -Bundle-Version: 1.0.14 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.15 +Bundle-Release-Date: 20180514 Fragment-Host: org.jkiss.dbeaver.ext.oracle Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-Vendor: JKISS diff --git a/nls/bundles/org.jkiss.dbeaver.ext.oracle.nls/pom.xml b/nls/bundles/org.jkiss.dbeaver.ext.oracle.nls/pom.xml index 2338b3b6c9505e0df28ace498dbde3a53530abb2..64abcb97cafeab1f69f50a023fb594062ac555e6 100644 --- a/nls/bundles/org.jkiss.dbeaver.ext.oracle.nls/pom.xml +++ b/nls/bundles/org.jkiss.dbeaver.ext.oracle.nls/pom.xml @@ -9,6 +9,6 @@ ../../../ org.jkiss.dbeaver.ext.oracle.nls - 1.0.14 + 1.0.15 eclipse-plugin diff --git a/nls/bundles/org.jkiss.dbeaver.ext.phoenix.nls/META-INF/MANIFEST.MF b/nls/bundles/org.jkiss.dbeaver.ext.phoenix.nls/META-INF/MANIFEST.MF index 60c44785c13d3c237f0658929cb0234e2ac6c33f..3651efec51872714dab59fe6df7284e130b29d35 100644 --- a/nls/bundles/org.jkiss.dbeaver.ext.phoenix.nls/META-INF/MANIFEST.MF +++ b/nls/bundles/org.jkiss.dbeaver.ext.phoenix.nls/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.ext.phoenix.nls -Bundle-Version: 1.0.14 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.15 +Bundle-Release-Date: 20180514 Fragment-Host: org.jkiss.dbeaver.ext.phoenix Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-Vendor: JKISS diff --git a/nls/bundles/org.jkiss.dbeaver.ext.phoenix.nls/pom.xml b/nls/bundles/org.jkiss.dbeaver.ext.phoenix.nls/pom.xml index 912a7654e468461a86d9fab6e9182f9a505eed29..eef97ae61c0aef8b7d21291404dee5162c025fa2 100644 --- a/nls/bundles/org.jkiss.dbeaver.ext.phoenix.nls/pom.xml +++ b/nls/bundles/org.jkiss.dbeaver.ext.phoenix.nls/pom.xml @@ -9,6 +9,6 @@ ../../../ org.jkiss.dbeaver.ext.phoenix.nls - 1.0.14 + 1.0.15 eclipse-plugin diff --git a/nls/bundles/org.jkiss.dbeaver.ext.postgresql.nls/META-INF/MANIFEST.MF b/nls/bundles/org.jkiss.dbeaver.ext.postgresql.nls/META-INF/MANIFEST.MF index fe5098586d37e71e2b7c69b7d803e3f2e600a213..8559db5136601e695a3c04622657c9c613dc1095 100644 --- a/nls/bundles/org.jkiss.dbeaver.ext.postgresql.nls/META-INF/MANIFEST.MF +++ b/nls/bundles/org.jkiss.dbeaver.ext.postgresql.nls/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.ext.postgresql.nls -Bundle-Version: 1.0.14 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.15 +Bundle-Release-Date: 20180514 Fragment-Host: org.jkiss.dbeaver.ext.postgresql Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-Vendor: JKISS diff --git a/nls/bundles/org.jkiss.dbeaver.ext.postgresql.nls/pom.xml b/nls/bundles/org.jkiss.dbeaver.ext.postgresql.nls/pom.xml index 246fe083a664a172af7df4a21460f29070e3c95e..0b2706f6ba237fa961dc7c7e9deee7c711c8b1b6 100644 --- a/nls/bundles/org.jkiss.dbeaver.ext.postgresql.nls/pom.xml +++ b/nls/bundles/org.jkiss.dbeaver.ext.postgresql.nls/pom.xml @@ -9,6 +9,6 @@ ../../../ org.jkiss.dbeaver.ext.postgresql.nls - 1.0.14 + 1.0.15 eclipse-plugin diff --git a/nls/bundles/org.jkiss.dbeaver.ext.sample.database.nls/META-INF/MANIFEST.MF b/nls/bundles/org.jkiss.dbeaver.ext.sample.database.nls/META-INF/MANIFEST.MF index 6886e6e395633b67241169d3db411451674d0c69..9b2eeb0319539c958de880d42bade5787c504a5a 100644 --- a/nls/bundles/org.jkiss.dbeaver.ext.sample.database.nls/META-INF/MANIFEST.MF +++ b/nls/bundles/org.jkiss.dbeaver.ext.sample.database.nls/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.ext.sample.database.nls -Bundle-Version: 1.0.14 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.15 +Bundle-Release-Date: 20180514 Fragment-Host: org.jkiss.dbeaver.ext.sample.database Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-Vendor: JKISS diff --git a/nls/bundles/org.jkiss.dbeaver.ext.sample.database.nls/pom.xml b/nls/bundles/org.jkiss.dbeaver.ext.sample.database.nls/pom.xml index 3794eda0353f26b3254b469cc98d84cbfd97b511..c33ac81db1efd02d7eaeec5fc57e0bf1d4af37a3 100644 --- a/nls/bundles/org.jkiss.dbeaver.ext.sample.database.nls/pom.xml +++ b/nls/bundles/org.jkiss.dbeaver.ext.sample.database.nls/pom.xml @@ -9,6 +9,6 @@ ../../../ org.jkiss.dbeaver.ext.sample.database.nls - 1.0.14 + 1.0.15 eclipse-plugin diff --git a/nls/bundles/org.jkiss.dbeaver.ext.sqlite.nls/META-INF/MANIFEST.MF b/nls/bundles/org.jkiss.dbeaver.ext.sqlite.nls/META-INF/MANIFEST.MF index f3512580ab367df615ce70a92c55369f1232f3be..71fd33ead6a5a33e83d6e57874a65ca6b32ddc60 100644 --- a/nls/bundles/org.jkiss.dbeaver.ext.sqlite.nls/META-INF/MANIFEST.MF +++ b/nls/bundles/org.jkiss.dbeaver.ext.sqlite.nls/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.ext.sqlite.nls -Bundle-Version: 1.0.14 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.15 +Bundle-Release-Date: 20180514 Fragment-Host: org.jkiss.dbeaver.ext.sqlite Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-Vendor: JKISS diff --git a/nls/bundles/org.jkiss.dbeaver.ext.sqlite.nls/pom.xml b/nls/bundles/org.jkiss.dbeaver.ext.sqlite.nls/pom.xml index 7d97f4de682e9b0bce50d781577ad0cd91a8ff60..277c6ce762f09dd1085b8d77ccf846315107f34f 100644 --- a/nls/bundles/org.jkiss.dbeaver.ext.sqlite.nls/pom.xml +++ b/nls/bundles/org.jkiss.dbeaver.ext.sqlite.nls/pom.xml @@ -9,6 +9,6 @@ ../../../ org.jkiss.dbeaver.ext.sqlite.nls - 1.0.14 + 1.0.15 eclipse-plugin diff --git a/nls/bundles/org.jkiss.dbeaver.ext.teradata.nls/META-INF/MANIFEST.MF b/nls/bundles/org.jkiss.dbeaver.ext.teradata.nls/META-INF/MANIFEST.MF index 599ad2b258cdb54c90dc301cb3742ca0d17c9219..2db01011b1e76c59bdaf547742db129689b22b70 100644 --- a/nls/bundles/org.jkiss.dbeaver.ext.teradata.nls/META-INF/MANIFEST.MF +++ b/nls/bundles/org.jkiss.dbeaver.ext.teradata.nls/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.ext.teradata.nls -Bundle-Version: 1.0.14 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.15 +Bundle-Release-Date: 20180514 Fragment-Host: org.jkiss.dbeaver.ext.teradata Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-Vendor: JKISS diff --git a/nls/bundles/org.jkiss.dbeaver.ext.teradata.nls/pom.xml b/nls/bundles/org.jkiss.dbeaver.ext.teradata.nls/pom.xml index 2b9112b1e91191bb8444dfa1d17a756817de7a02..b84980fbe9b72fc2ede889a5b28cf3b7642d2509 100644 --- a/nls/bundles/org.jkiss.dbeaver.ext.teradata.nls/pom.xml +++ b/nls/bundles/org.jkiss.dbeaver.ext.teradata.nls/pom.xml @@ -9,6 +9,6 @@ ../../../ org.jkiss.dbeaver.ext.teradata.nls - 1.0.14 + 1.0.15 eclipse-plugin diff --git a/nls/bundles/org.jkiss.dbeaver.ext.ui.locks.nls/META-INF/MANIFEST.MF b/nls/bundles/org.jkiss.dbeaver.ext.ui.locks.nls/META-INF/MANIFEST.MF index eef26b1567b02b9f3f181c6141002853f009a716..8ce0d33e0f61612f8f51e7b8d08fd94439377028 100644 --- a/nls/bundles/org.jkiss.dbeaver.ext.ui.locks.nls/META-INF/MANIFEST.MF +++ b/nls/bundles/org.jkiss.dbeaver.ext.ui.locks.nls/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.ext.ui.locks.nls -Bundle-Version: 1.0.14 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.15 +Bundle-Release-Date: 20180514 Fragment-Host: org.jkiss.dbeaver.ext.ui.locks Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-Vendor: JKISS diff --git a/nls/bundles/org.jkiss.dbeaver.ext.ui.locks.nls/pom.xml b/nls/bundles/org.jkiss.dbeaver.ext.ui.locks.nls/pom.xml index b59e099d317180f82b7e8440f85805d2911104ed..f899c93925c2889cd5cd98659f3d44e389f03373 100644 --- a/nls/bundles/org.jkiss.dbeaver.ext.ui.locks.nls/pom.xml +++ b/nls/bundles/org.jkiss.dbeaver.ext.ui.locks.nls/pom.xml @@ -9,6 +9,6 @@ ../../../ org.jkiss.dbeaver.ext.ui.locks.nls - 1.0.14 + 1.0.15 eclipse-plugin diff --git a/nls/bundles/org.jkiss.dbeaver.ext.ui.svg.nls/META-INF/MANIFEST.MF b/nls/bundles/org.jkiss.dbeaver.ext.ui.svg.nls/META-INF/MANIFEST.MF index c4a4e7c6115047370f3c54328e79833bcb8807a7..1fda3d5a91ea1a1665f0fe4fba36390f6f8fce64 100644 --- a/nls/bundles/org.jkiss.dbeaver.ext.ui.svg.nls/META-INF/MANIFEST.MF +++ b/nls/bundles/org.jkiss.dbeaver.ext.ui.svg.nls/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.ext.ui.svg.nls -Bundle-Version: 1.0.14 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.15 +Bundle-Release-Date: 20180514 Fragment-Host: org.jkiss.dbeaver.ext.ui.svg Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-Vendor: JKISS diff --git a/nls/bundles/org.jkiss.dbeaver.ext.ui.svg.nls/pom.xml b/nls/bundles/org.jkiss.dbeaver.ext.ui.svg.nls/pom.xml index d228cb9f6ad1abf41fa10535ff7e12d1fca24b53..97fe7a8d2d6364f389fdd83c374366adf5a0ffa0 100644 --- a/nls/bundles/org.jkiss.dbeaver.ext.ui.svg.nls/pom.xml +++ b/nls/bundles/org.jkiss.dbeaver.ext.ui.svg.nls/pom.xml @@ -9,6 +9,6 @@ ../../../ org.jkiss.dbeaver.ext.ui.svg.nls - 1.0.14 + 1.0.15 eclipse-plugin diff --git a/nls/bundles/org.jkiss.dbeaver.ext.vertica.nls/META-INF/MANIFEST.MF b/nls/bundles/org.jkiss.dbeaver.ext.vertica.nls/META-INF/MANIFEST.MF index b2aec5786addc7708b967e8a4fd5f9b796a645e8..9350079c93948bcb77911b7770436e9e5c4de53a 100644 --- a/nls/bundles/org.jkiss.dbeaver.ext.vertica.nls/META-INF/MANIFEST.MF +++ b/nls/bundles/org.jkiss.dbeaver.ext.vertica.nls/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.ext.vertica.nls -Bundle-Version: 1.0.14 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.15 +Bundle-Release-Date: 20180514 Fragment-Host: org.jkiss.dbeaver.ext.vertica Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-Vendor: JKISS diff --git a/nls/bundles/org.jkiss.dbeaver.ext.vertica.nls/pom.xml b/nls/bundles/org.jkiss.dbeaver.ext.vertica.nls/pom.xml index ea15954339f0a315303c61526f7689748ecbe498..0950c731b55240e69fd7172d197718edd1e2f185 100644 --- a/nls/bundles/org.jkiss.dbeaver.ext.vertica.nls/pom.xml +++ b/nls/bundles/org.jkiss.dbeaver.ext.vertica.nls/pom.xml @@ -9,6 +9,6 @@ ../../../ org.jkiss.dbeaver.ext.vertica.nls - 1.0.14 + 1.0.15 eclipse-plugin diff --git a/nls/bundles/org.jkiss.dbeaver.ext.wmi.nls/META-INF/MANIFEST.MF b/nls/bundles/org.jkiss.dbeaver.ext.wmi.nls/META-INF/MANIFEST.MF index 6c1c62f4caaed9dc08c20c9b3e0e7a9026dc253a..ef42bb0312fd47667d272d559a2573fd98be159f 100644 --- a/nls/bundles/org.jkiss.dbeaver.ext.wmi.nls/META-INF/MANIFEST.MF +++ b/nls/bundles/org.jkiss.dbeaver.ext.wmi.nls/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.ext.wmi.nls -Bundle-Version: 1.0.14 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.15 +Bundle-Release-Date: 20180514 Fragment-Host: org.jkiss.dbeaver.ext.wmi Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-Vendor: JKISS diff --git a/nls/bundles/org.jkiss.dbeaver.ext.wmi.nls/pom.xml b/nls/bundles/org.jkiss.dbeaver.ext.wmi.nls/pom.xml index 63dd4793fe07b4debe8d72dacdb28a9353d62a62..e8faa534cfc2b074755bf458634e0111e4e70c71 100644 --- a/nls/bundles/org.jkiss.dbeaver.ext.wmi.nls/pom.xml +++ b/nls/bundles/org.jkiss.dbeaver.ext.wmi.nls/pom.xml @@ -9,6 +9,6 @@ ../../../ org.jkiss.dbeaver.ext.wmi.nls - 1.0.14 + 1.0.15 eclipse-plugin diff --git a/nls/bundles/org.jkiss.dbeaver.model.nls/META-INF/MANIFEST.MF b/nls/bundles/org.jkiss.dbeaver.model.nls/META-INF/MANIFEST.MF index 187afc474bcce2560097f0c13ebcb77ad5848413..ab69d2a0a7242f07b72a954ab03d69ae27c6854e 100644 --- a/nls/bundles/org.jkiss.dbeaver.model.nls/META-INF/MANIFEST.MF +++ b/nls/bundles/org.jkiss.dbeaver.model.nls/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.model.nls -Bundle-Version: 1.0.14 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.15 +Bundle-Release-Date: 20180514 Fragment-Host: org.jkiss.dbeaver.model Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-Vendor: JKISS diff --git a/nls/bundles/org.jkiss.dbeaver.model.nls/pom.xml b/nls/bundles/org.jkiss.dbeaver.model.nls/pom.xml index ca777fc7ee6468309b3e7520ce6b3dbc977c6dfd..66038172dd98d3533b99dac15a484a6786ee120b 100644 --- a/nls/bundles/org.jkiss.dbeaver.model.nls/pom.xml +++ b/nls/bundles/org.jkiss.dbeaver.model.nls/pom.xml @@ -9,6 +9,6 @@ ../../../ org.jkiss.dbeaver.model.nls - 1.0.14 + 1.0.15 eclipse-plugin diff --git a/nls/bundles/org.jkiss.dbeaver.model.nls/src/org/jkiss/dbeaver/model/messages/ModelResources_zh.properties b/nls/bundles/org.jkiss.dbeaver.model.nls/src/org/jkiss/dbeaver/model/messages/ModelResources_zh.properties index 58f853c53efcb55defcaf55d03cbbf7d7b7c3571..26b2b9b7c503d572f311936b969bd124b2fb1eba 100644 --- a/nls/bundles/org.jkiss.dbeaver.model.nls/src/org/jkiss/dbeaver/model/messages/ModelResources_zh.properties +++ b/nls/bundles/org.jkiss.dbeaver.model.nls/src/org/jkiss/dbeaver/model/messages/ModelResources_zh.properties @@ -93,7 +93,6 @@ model_jdbc_save_to_file_ = \u4FDD\u5B58\u81F3\u6587\u4EF6 ... model_jdbc_scale = \u8303\u56F4 model_jdbc_Schema = \u6A21\u5F0F model_jdbc_Serializable = \u5E8F\u5217\u5316 -model_jdbc_set_to_current_time = \u8BBE\u7F6E\u4E3A\u5F53\u524D\u65F6\u95F4 model_jdbc_type_name = \u7C7B\u578B\u540D\u79F0 model_jdbc_unknown = \u672A\u77E5 model_jdbc_unsupported_column_type_ = \u4E0D\u652F\u6301\u7684\u5217\u7C7B\u578B diff --git a/nls/bundles/org.jkiss.dbeaver.runtime.ide.core.nls/META-INF/MANIFEST.MF b/nls/bundles/org.jkiss.dbeaver.runtime.ide.core.nls/META-INF/MANIFEST.MF index 0c1e012887f5ad738793975c28ba1f6f2fc92019..eec54d078af8d6ec5eaf49c000a5838f42e4a472 100644 --- a/nls/bundles/org.jkiss.dbeaver.runtime.ide.core.nls/META-INF/MANIFEST.MF +++ b/nls/bundles/org.jkiss.dbeaver.runtime.ide.core.nls/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.runtime.ide.core.nls -Bundle-Version: 1.0.14 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.15 +Bundle-Release-Date: 20180514 Fragment-Host: org.jkiss.dbeaver.runtime.ide.core Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-Vendor: JKISS diff --git a/nls/bundles/org.jkiss.dbeaver.runtime.ide.core.nls/pom.xml b/nls/bundles/org.jkiss.dbeaver.runtime.ide.core.nls/pom.xml index 8b9582603d896faa54b4f102fb9ae041b2510d60..95e04a1aa90b71d7926dfc36d4e080f6219cd2eb 100644 --- a/nls/bundles/org.jkiss.dbeaver.runtime.ide.core.nls/pom.xml +++ b/nls/bundles/org.jkiss.dbeaver.runtime.ide.core.nls/pom.xml @@ -9,6 +9,6 @@ ../../../ org.jkiss.dbeaver.runtime.ide.core.nls - 1.0.14 + 1.0.15 eclipse-plugin diff --git a/nls/bundles/org.jkiss.dbeaver.ui.nls/META-INF/MANIFEST.MF b/nls/bundles/org.jkiss.dbeaver.ui.nls/META-INF/MANIFEST.MF index 9bb65d2f8c205e855aaf59d9801756096cbd7f18..71d8604086f47187d15e0692180bfbb459c74e74 100644 --- a/nls/bundles/org.jkiss.dbeaver.ui.nls/META-INF/MANIFEST.MF +++ b/nls/bundles/org.jkiss.dbeaver.ui.nls/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.ui.nls -Bundle-Version: 1.0.14 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.15 +Bundle-Release-Date: 20180514 Fragment-Host: org.jkiss.dbeaver.ui Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-Vendor: JKISS diff --git a/nls/bundles/org.jkiss.dbeaver.ui.nls/pom.xml b/nls/bundles/org.jkiss.dbeaver.ui.nls/pom.xml index 7534ca50d675cf402ec8033d3d2bb2024534a6e6..8b2579dfa1130d86eea22b503a727ea6f593d95b 100644 --- a/nls/bundles/org.jkiss.dbeaver.ui.nls/pom.xml +++ b/nls/bundles/org.jkiss.dbeaver.ui.nls/pom.xml @@ -9,6 +9,6 @@ ../../../ org.jkiss.dbeaver.ui.nls - 1.0.14 + 1.0.15 eclipse-plugin diff --git a/nls/bundles/org.jkiss.utils.nls/META-INF/MANIFEST.MF b/nls/bundles/org.jkiss.utils.nls/META-INF/MANIFEST.MF index d3d1131afce91cdf0dbc7144a16011d1fdb5f066..412da16153399a006d51a156892e737d464155ca 100644 --- a/nls/bundles/org.jkiss.utils.nls/META-INF/MANIFEST.MF +++ b/nls/bundles/org.jkiss.utils.nls/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.utils.nls -Bundle-Version: 1.0.14 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.15 +Bundle-Release-Date: 20180514 Fragment-Host: org.jkiss.utils Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-Vendor: JKISS diff --git a/nls/bundles/org.jkiss.utils.nls/pom.xml b/nls/bundles/org.jkiss.utils.nls/pom.xml index 0f1ca980d4145a547c3c16b1ea7397191276d953..96edcd305fda5d200bb91baa1eb7744b6097a7f0 100644 --- a/nls/bundles/org.jkiss.utils.nls/pom.xml +++ b/nls/bundles/org.jkiss.utils.nls/pom.xml @@ -9,6 +9,6 @@ ../../../ org.jkiss.utils.nls - 1.0.14 + 1.0.15 eclipse-plugin diff --git a/nls/bundles/org.jkiss.wmi.nls/META-INF/MANIFEST.MF b/nls/bundles/org.jkiss.wmi.nls/META-INF/MANIFEST.MF index da66dfc3d8822d04d4a459398312dcc5dc30a3ec..c02182e381d350eb72213edcf8c439c498980c0c 100644 --- a/nls/bundles/org.jkiss.wmi.nls/META-INF/MANIFEST.MF +++ b/nls/bundles/org.jkiss.wmi.nls/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.wmi.nls -Bundle-Version: 1.0.14 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.15 +Bundle-Release-Date: 20180514 Fragment-Host: org.jkiss.wmi Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-Vendor: JKISS diff --git a/nls/bundles/org.jkiss.wmi.nls/pom.xml b/nls/bundles/org.jkiss.wmi.nls/pom.xml index db54eac0c4686087c4c45166819469a8c81a36db..219fc24f3376a7167880893f563a9810c696a3ad 100644 --- a/nls/bundles/org.jkiss.wmi.nls/pom.xml +++ b/nls/bundles/org.jkiss.wmi.nls/pom.xml @@ -9,6 +9,6 @@ ../../../ org.jkiss.wmi.nls - 1.0.14 + 1.0.15 eclipse-plugin diff --git a/nls/features/org.jkiss.dbeaver.ce.nls.feature/feature.xml b/nls/features/org.jkiss.dbeaver.ce.nls.feature/feature.xml index 00ddf77b6ad79be00878d55b182e27cc75be7dd9..8c4a916bcdae871e852c13539e6600616fe330f5 100644 --- a/nls/features/org.jkiss.dbeaver.ce.nls.feature/feature.xml +++ b/nls/features/org.jkiss.dbeaver.ce.nls.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/nls/features/org.jkiss.dbeaver.ce.nls.feature/pom.xml b/nls/features/org.jkiss.dbeaver.ce.nls.feature/pom.xml index 6c29a94056f0793b264d7c4d3ed1e01c45c50f3f..dd31541fdae4d84c4fabeb10c9c0a781da2116d0 100644 --- a/nls/features/org.jkiss.dbeaver.ce.nls.feature/pom.xml +++ b/nls/features/org.jkiss.dbeaver.ce.nls.feature/pom.xml @@ -10,7 +10,7 @@ ../../../ org.jkiss.dbeaver.ce.nls.feature - 1.0.14 + 1.0.15 eclipse-feature diff --git a/nls/features/org.jkiss.dbeaver.ext.db2.nls.feature/feature.xml b/nls/features/org.jkiss.dbeaver.ext.db2.nls.feature/feature.xml index 1dfc3a5d248f3fe41e0449da735988b5fd9b556f..1ba6476c66e14dc5cd171b389d3f89a6db4dfcf9 100644 --- a/nls/features/org.jkiss.dbeaver.ext.db2.nls.feature/feature.xml +++ b/nls/features/org.jkiss.dbeaver.ext.db2.nls.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/nls/features/org.jkiss.dbeaver.ext.db2.nls.feature/pom.xml b/nls/features/org.jkiss.dbeaver.ext.db2.nls.feature/pom.xml index ad4f261c1c4c953df866fdf2ea2a0e485b50ca43..a5361af8b00d303503db668751560cf5c48bef4a 100644 --- a/nls/features/org.jkiss.dbeaver.ext.db2.nls.feature/pom.xml +++ b/nls/features/org.jkiss.dbeaver.ext.db2.nls.feature/pom.xml @@ -10,7 +10,7 @@ ../../../ org.jkiss.dbeaver.ext.db2.nls.feature - 1.0.14 + 1.0.15 eclipse-feature diff --git a/nls/features/org.jkiss.dbeaver.ext.exasol.nls.feature/feature.xml b/nls/features/org.jkiss.dbeaver.ext.exasol.nls.feature/feature.xml index a925bee9253d1eb7bfb89902db9a578f6fc7a076..02855310c51140de5d09a1515b348769845aef9f 100644 --- a/nls/features/org.jkiss.dbeaver.ext.exasol.nls.feature/feature.xml +++ b/nls/features/org.jkiss.dbeaver.ext.exasol.nls.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/nls/features/org.jkiss.dbeaver.ext.exasol.nls.feature/pom.xml b/nls/features/org.jkiss.dbeaver.ext.exasol.nls.feature/pom.xml index e68f02384c3024bcc27d3a7736ab8b834c422b5f..8a2ac28c40a1b7b37c96390b84d9828aecedd99c 100644 --- a/nls/features/org.jkiss.dbeaver.ext.exasol.nls.feature/pom.xml +++ b/nls/features/org.jkiss.dbeaver.ext.exasol.nls.feature/pom.xml @@ -10,7 +10,7 @@ ../../../ org.jkiss.dbeaver.ext.exasol.nls.feature - 1.0.14 + 1.0.15 eclipse-feature diff --git a/nls/features/org.jkiss.dbeaver.ext.generic.nls.feature/feature.xml b/nls/features/org.jkiss.dbeaver.ext.generic.nls.feature/feature.xml index 54ecc92a14d0b04bc54bb943db2e805ba4039744..f0b85123e743f0d5908c3ba3879cc1db6d95d7d7 100644 --- a/nls/features/org.jkiss.dbeaver.ext.generic.nls.feature/feature.xml +++ b/nls/features/org.jkiss.dbeaver.ext.generic.nls.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/nls/features/org.jkiss.dbeaver.ext.generic.nls.feature/pom.xml b/nls/features/org.jkiss.dbeaver.ext.generic.nls.feature/pom.xml index adb675605fb223aee06d11e89063ce500841727a..3242886e46046ee7dc8ac54998e20c2e46672f70 100644 --- a/nls/features/org.jkiss.dbeaver.ext.generic.nls.feature/pom.xml +++ b/nls/features/org.jkiss.dbeaver.ext.generic.nls.feature/pom.xml @@ -10,7 +10,7 @@ ../../../ org.jkiss.dbeaver.ext.generic.nls.feature - 1.0.14 + 1.0.15 eclipse-feature diff --git a/nls/features/org.jkiss.dbeaver.ext.mysql.nls.feature/feature.xml b/nls/features/org.jkiss.dbeaver.ext.mysql.nls.feature/feature.xml index 08fa31ae4ac66cadeb0ae86a64b03ce73b5a5bb4..d37f6f32e1d89ce0daa3a2bbc32e1840371c7f92 100644 --- a/nls/features/org.jkiss.dbeaver.ext.mysql.nls.feature/feature.xml +++ b/nls/features/org.jkiss.dbeaver.ext.mysql.nls.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/nls/features/org.jkiss.dbeaver.ext.mysql.nls.feature/pom.xml b/nls/features/org.jkiss.dbeaver.ext.mysql.nls.feature/pom.xml index 2e30753eaafd8d2b4ac70f07a984f153722eed42..c5bda573dd49e34af817d14fc91b076b41a3d55b 100644 --- a/nls/features/org.jkiss.dbeaver.ext.mysql.nls.feature/pom.xml +++ b/nls/features/org.jkiss.dbeaver.ext.mysql.nls.feature/pom.xml @@ -10,7 +10,7 @@ ../../../ org.jkiss.dbeaver.ext.mysql.nls.feature - 1.0.14 + 1.0.15 eclipse-feature diff --git a/nls/features/org.jkiss.dbeaver.ext.office.nls.feature/feature.xml b/nls/features/org.jkiss.dbeaver.ext.office.nls.feature/feature.xml index 2700ba04ad552d405ef54bf2cde381869379fbc5..c1960f1960e9d67ff84d0dead49db1b3f7759267 100644 --- a/nls/features/org.jkiss.dbeaver.ext.office.nls.feature/feature.xml +++ b/nls/features/org.jkiss.dbeaver.ext.office.nls.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/nls/features/org.jkiss.dbeaver.ext.office.nls.feature/pom.xml b/nls/features/org.jkiss.dbeaver.ext.office.nls.feature/pom.xml index 919215b63f63f0c0ed211f169edc5f6fc0bbe390..9b88a034d59fafc6c86c71fd2d4f1e47b220c79a 100644 --- a/nls/features/org.jkiss.dbeaver.ext.office.nls.feature/pom.xml +++ b/nls/features/org.jkiss.dbeaver.ext.office.nls.feature/pom.xml @@ -10,7 +10,7 @@ ../../../ org.jkiss.dbeaver.ext.office.nls.feature - 1.0.14 + 1.0.15 eclipse-feature diff --git a/nls/features/org.jkiss.dbeaver.ext.oracle.nls.feature/feature.xml b/nls/features/org.jkiss.dbeaver.ext.oracle.nls.feature/feature.xml index 94d708efd7c910c56fb272e80ccb62c65853feb3..e8dfa53494912be5ac6e0a30e2bf97ef6a38f125 100644 --- a/nls/features/org.jkiss.dbeaver.ext.oracle.nls.feature/feature.xml +++ b/nls/features/org.jkiss.dbeaver.ext.oracle.nls.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/nls/features/org.jkiss.dbeaver.ext.oracle.nls.feature/pom.xml b/nls/features/org.jkiss.dbeaver.ext.oracle.nls.feature/pom.xml index a7789808ebac077590b3e6da1cc2ce7236082405..54096fe1bd6588ef94c245d08fb7095b84d3a63c 100644 --- a/nls/features/org.jkiss.dbeaver.ext.oracle.nls.feature/pom.xml +++ b/nls/features/org.jkiss.dbeaver.ext.oracle.nls.feature/pom.xml @@ -10,7 +10,7 @@ ../../../ org.jkiss.dbeaver.ext.oracle.nls.feature - 1.0.14 + 1.0.15 eclipse-feature diff --git a/nls/features/org.jkiss.dbeaver.ext.ui.svg.nls.feature/feature.xml b/nls/features/org.jkiss.dbeaver.ext.ui.svg.nls.feature/feature.xml index 75c641b8ed51a85ee8369d1341d43a51ddd59af8..867914c426728d82d5151a5d498f4141128400ae 100644 --- a/nls/features/org.jkiss.dbeaver.ext.ui.svg.nls.feature/feature.xml +++ b/nls/features/org.jkiss.dbeaver.ext.ui.svg.nls.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/nls/features/org.jkiss.dbeaver.ext.ui.svg.nls.feature/pom.xml b/nls/features/org.jkiss.dbeaver.ext.ui.svg.nls.feature/pom.xml index 3d85a049e82fef9b0d9a3e7c3643459fb2ef0f6b..1692e2ed6464f3024100fb03ca3179e36ae5f3ee 100644 --- a/nls/features/org.jkiss.dbeaver.ext.ui.svg.nls.feature/pom.xml +++ b/nls/features/org.jkiss.dbeaver.ext.ui.svg.nls.feature/pom.xml @@ -10,7 +10,7 @@ ../../../ org.jkiss.dbeaver.ext.ui.svg.nls.feature - 1.0.14 + 1.0.15 eclipse-feature diff --git a/nls/features/org.jkiss.dbeaver.ext.wmi.nls.feature/feature.xml b/nls/features/org.jkiss.dbeaver.ext.wmi.nls.feature/feature.xml index 1de9edcea10a78c82f2bda640d5b7c8a9016e7e6..d3a648cafa30c0925dbd14c6e33010705619da3f 100644 --- a/nls/features/org.jkiss.dbeaver.ext.wmi.nls.feature/feature.xml +++ b/nls/features/org.jkiss.dbeaver.ext.wmi.nls.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/nls/features/org.jkiss.dbeaver.ext.wmi.nls.feature/pom.xml b/nls/features/org.jkiss.dbeaver.ext.wmi.nls.feature/pom.xml index ecd2c404677d11b77e5fbbb97dbe62a1f0a21b57..b0e7fac9080b8274fc711c3462dc0bcf3189072f 100644 --- a/nls/features/org.jkiss.dbeaver.ext.wmi.nls.feature/pom.xml +++ b/nls/features/org.jkiss.dbeaver.ext.wmi.nls.feature/pom.xml @@ -10,7 +10,7 @@ ../../../ org.jkiss.dbeaver.ext.wmi.nls.feature - 1.0.14 + 1.0.15 eclipse-feature diff --git a/nls/features/org.jkiss.dbeaver.ide.nls.feature/feature.xml b/nls/features/org.jkiss.dbeaver.ide.nls.feature/feature.xml index 8244cedb8a3e72835ed73e2a658b0eccec917c3b..a34d69e730ed9818f5af7f4526e0798d8c5b9191 100644 --- a/nls/features/org.jkiss.dbeaver.ide.nls.feature/feature.xml +++ b/nls/features/org.jkiss.dbeaver.ide.nls.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/nls/features/org.jkiss.dbeaver.ide.nls.feature/pom.xml b/nls/features/org.jkiss.dbeaver.ide.nls.feature/pom.xml index bc1cb30b53539aab68f4cf426653dfa0f6daad10..7b5e399d7ca307ca38920d99d192174b7983731f 100644 --- a/nls/features/org.jkiss.dbeaver.ide.nls.feature/pom.xml +++ b/nls/features/org.jkiss.dbeaver.ide.nls.feature/pom.xml @@ -10,7 +10,7 @@ ../../../ org.jkiss.dbeaver.ide.nls.feature - 1.0.14 + 1.0.15 eclipse-feature diff --git a/nls/features/org.jkiss.dbeaver.rcp.nls.feature/feature.xml b/nls/features/org.jkiss.dbeaver.rcp.nls.feature/feature.xml index 54a44d26237c47768887a633d17b473b606d4c7d..c0a807fb9f30597be30f320599a6a4b87a073b58 100644 --- a/nls/features/org.jkiss.dbeaver.rcp.nls.feature/feature.xml +++ b/nls/features/org.jkiss.dbeaver.rcp.nls.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/nls/features/org.jkiss.dbeaver.rcp.nls.feature/pom.xml b/nls/features/org.jkiss.dbeaver.rcp.nls.feature/pom.xml index 6055377171d1905b94998abbaccb30414b676c3b..161e2f967517c0793efc2f2fbb06657a87d0d39f 100644 --- a/nls/features/org.jkiss.dbeaver.rcp.nls.feature/pom.xml +++ b/nls/features/org.jkiss.dbeaver.rcp.nls.feature/pom.xml @@ -10,7 +10,7 @@ ../../../ org.jkiss.dbeaver.rcp.nls.feature - 1.0.14 + 1.0.15 eclipse-feature diff --git a/nls/features/org.jkiss.dbeaver.runtime.nls.feature/feature.xml b/nls/features/org.jkiss.dbeaver.runtime.nls.feature/feature.xml index f66b20e5d48b43645ab634134819edca105237bf..33e1b80bbc7eae8d2f5320351f2ac90943f4a2a9 100644 --- a/nls/features/org.jkiss.dbeaver.runtime.nls.feature/feature.xml +++ b/nls/features/org.jkiss.dbeaver.runtime.nls.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/nls/features/org.jkiss.dbeaver.runtime.nls.feature/pom.xml b/nls/features/org.jkiss.dbeaver.runtime.nls.feature/pom.xml index 4fb1ff495c4a51ce8f50c709b5d437269705c001..21ac798064653a858ef997be7aa7042689bbfb86 100644 --- a/nls/features/org.jkiss.dbeaver.runtime.nls.feature/pom.xml +++ b/nls/features/org.jkiss.dbeaver.runtime.nls.feature/pom.xml @@ -10,7 +10,7 @@ ../../../ org.jkiss.dbeaver.runtime.nls.feature - 1.0.14 + 1.0.15 eclipse-feature diff --git a/nls/features/org.jkiss.dbeaver.standalone.nls.feature/feature.xml b/nls/features/org.jkiss.dbeaver.standalone.nls.feature/feature.xml index f63334854e8aab0efb157defca688ff74aa3be1f..1829f6c4f737c96da29aeeed1721b6efaf49ec01 100644 --- a/nls/features/org.jkiss.dbeaver.standalone.nls.feature/feature.xml +++ b/nls/features/org.jkiss.dbeaver.standalone.nls.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/nls/features/org.jkiss.dbeaver.standalone.nls.feature/pom.xml b/nls/features/org.jkiss.dbeaver.standalone.nls.feature/pom.xml index 2537fb34c2da128af21ad555fed1b038ea2e6048..7c59831023cabde1a48f845584bede6e39a10da5 100644 --- a/nls/features/org.jkiss.dbeaver.standalone.nls.feature/pom.xml +++ b/nls/features/org.jkiss.dbeaver.standalone.nls.feature/pom.xml @@ -10,7 +10,7 @@ ../../../ org.jkiss.dbeaver.standalone.nls.feature - 1.0.14 + 1.0.15 eclipse-feature diff --git a/plugins/org.jkiss.dbeaver.core.application/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.core.application/META-INF/MANIFEST.MF index e900b2c8dbbf3472b13776e2cd2b673f3044299c..fa03d43c98c5e229a9d44ac3ccc3fc21d66c1eab 100644 --- a/plugins/org.jkiss.dbeaver.core.application/META-INF/MANIFEST.MF +++ b/plugins/org.jkiss.dbeaver.core.application/META-INF/MANIFEST.MF @@ -3,8 +3,8 @@ Bundle-ManifestVersion: 2 Bundle-Vendor: %Bundle-Vendor Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.core.application;singleton:=true -Bundle-Version: 5.0.4 -Bundle-Release-Date: 20180430 +Bundle-Version: 5.0.5 +Bundle-Release-Date: 20180514 Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Export-Package: org.jkiss.dbeaver.core.application Bundle-ClassPath: . diff --git a/plugins/org.jkiss.dbeaver.core.application/OSGI-INF/l10n/bundle.properties b/plugins/org.jkiss.dbeaver.core.application/OSGI-INF/l10n/bundle.properties index 66494bc365ef516b0f7ac24de7c14a8a21f2b8bb..891f9a785675e4d9c342146f89ca2106aee95726 100644 --- a/plugins/org.jkiss.dbeaver.core.application/OSGI-INF/l10n/bundle.properties +++ b/plugins/org.jkiss.dbeaver.core.application/OSGI-INF/l10n/bundle.properties @@ -5,7 +5,7 @@ productName = DBeaver productTitle = DBeaver - Universal Database Manager productCopyright = (C) 2018 JKISS project productSubTitle = Universal Database Manager -productWebsite = https://dbeaver.jkiss.org/ +productWebsite = https://dbeaver.io/ productEmail = serge@jkiss.org aboutText = DBeaver - Universal Database Manager extension.standalone.name = DBeaver Standalone diff --git a/plugins/org.jkiss.dbeaver.core.application/pom.xml b/plugins/org.jkiss.dbeaver.core.application/pom.xml index 85f90fd89b286c10786df6fb257da65236000d07..f1a6fd0dc108f7c5bf03be7913a21e004ea3042f 100644 --- a/plugins/org.jkiss.dbeaver.core.application/pom.xml +++ b/plugins/org.jkiss.dbeaver.core.application/pom.xml @@ -9,6 +9,6 @@ ../../ org.jkiss.dbeaver.core.application - 5.0.4 + 5.0.5 eclipse-plugin diff --git a/plugins/org.jkiss.dbeaver.core.eclipse/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.core.eclipse/META-INF/MANIFEST.MF index bac4ed028247a3f213038196b749316bcaeb70bf..077de4547f340d7b4ef4fe9eb6ced001e5b79fb8 100644 --- a/plugins/org.jkiss.dbeaver.core.eclipse/META-INF/MANIFEST.MF +++ b/plugins/org.jkiss.dbeaver.core.eclipse/META-INF/MANIFEST.MF @@ -3,8 +3,8 @@ Bundle-ManifestVersion: 2 Bundle-Vendor: %Bundle-Vendor Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.core.eclipse;singleton:=true -Bundle-Version: 5.0.4 -Bundle-Release-Date: 20180430 +Bundle-Version: 5.0.5 +Bundle-Release-Date: 20180514 Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Require-Bundle: org.eclipse.ui, org.jkiss.dbeaver.core, diff --git a/plugins/org.jkiss.dbeaver.core.eclipse/OSGI-INF/l10n/bundle.properties b/plugins/org.jkiss.dbeaver.core.eclipse/OSGI-INF/l10n/bundle.properties index 9a6af2d639d00dd55171133988518c422917f1f3..cff10de399e12b4a6f6b83459bb8c62c616b01fe 100644 --- a/plugins/org.jkiss.dbeaver.core.eclipse/OSGI-INF/l10n/bundle.properties +++ b/plugins/org.jkiss.dbeaver.core.eclipse/OSGI-INF/l10n/bundle.properties @@ -2,6 +2,13 @@ Bundle-Vendor = JKISS Bundle-Name = DBeaver Eclipse Plugin +productName=DBeaver +productTitle=Universal Database Manager +productCopyright=(C) 2018 JKISS +productSubTitle=DBeaver CE Eclipse Plugin +productWebsite=https://dbeaver.io/ +productEmail=support@jkiss.org + menu.edit=Edit menu.navigate=Navigate diff --git a/plugins/org.jkiss.dbeaver.core.eclipse/build.properties b/plugins/org.jkiss.dbeaver.core.eclipse/build.properties index a248704a298f67f3106ea3ecad5c43595399f6ec..ce94e51dc2120ad4439885948d415a492f91c994 100644 --- a/plugins/org.jkiss.dbeaver.core.eclipse/build.properties +++ b/plugins/org.jkiss.dbeaver.core.eclipse/build.properties @@ -4,5 +4,4 @@ bin.includes = .,\ about.ini,\ about.properties,\ dbeaver32.png,\ - plugin.properties,\ plugin.xml diff --git a/plugins/org.jkiss.dbeaver.core.eclipse/plugin.properties b/plugins/org.jkiss.dbeaver.core.eclipse/plugin.properties deleted file mode 100644 index 52008e4d98384b5a2b2f9f91e6c53be903143b8a..0000000000000000000000000000000000000000 --- a/plugins/org.jkiss.dbeaver.core.eclipse/plugin.properties +++ /dev/null @@ -1,6 +0,0 @@ -productName=DBeaver Enterprise -productTitle=DBeaver - Enterprise Database Manager -productCopyright=(C) 2018 Rider Soft -productSubTitle=Enterprise Database Manager - Eclipse Plugin -productWebsite=https://dbeaver.com/ -productEmail=support@dbeaver.com diff --git a/plugins/org.jkiss.dbeaver.core.eclipse/pom.xml b/plugins/org.jkiss.dbeaver.core.eclipse/pom.xml index b8f6785edf76a2c10c57652ed04595f00eca656f..4c841af00c363e79a83b172e895d5b3783448ba0 100644 --- a/plugins/org.jkiss.dbeaver.core.eclipse/pom.xml +++ b/plugins/org.jkiss.dbeaver.core.eclipse/pom.xml @@ -9,6 +9,6 @@ ../../ org.jkiss.dbeaver.core.eclipse - 5.0.4 + 5.0.5 eclipse-plugin diff --git a/plugins/org.jkiss.dbeaver.core/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.core/META-INF/MANIFEST.MF index 377905de0bc54f11b88266726a5d93c881881190..ed9f86d77fbcf3e637004bddd1882fe8bd551747 100644 --- a/plugins/org.jkiss.dbeaver.core/META-INF/MANIFEST.MF +++ b/plugins/org.jkiss.dbeaver.core/META-INF/MANIFEST.MF @@ -3,8 +3,8 @@ Bundle-ManifestVersion: 2 Bundle-Vendor: %Bundle-Vendor Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.core;singleton:=true -Bundle-Version: 5.0.4 -Bundle-Release-Date: 20180430 +Bundle-Version: 5.0.5 +Bundle-Release-Date: 20180514 Bundle-Activator: org.jkiss.dbeaver.core.DBeaverActivator Bundle-ActivationPolicy: lazy Bundle-RequiredExecutionEnvironment: JavaSE-1.8 diff --git a/plugins/org.jkiss.dbeaver.core/OSGI-INF/l10n/bundle.properties b/plugins/org.jkiss.dbeaver.core/OSGI-INF/l10n/bundle.properties index 4abb20094ebf72c705aa9ec40b51b950a3c76648..f766ed9c3f88c85b61cd2effb7eea6865e5fa752 100644 --- a/plugins/org.jkiss.dbeaver.core/OSGI-INF/l10n/bundle.properties +++ b/plugins/org.jkiss.dbeaver.core/OSGI-INF/l10n/bundle.properties @@ -301,6 +301,8 @@ command.org.jkiss.dbeaver.core.qm.filter.name=Filters ... command.org.jkiss.dbeaver.core.qm.filter.description=Set query manager filter command.org.jkiss.dbeaver.core.qm.clear.name=Clear log command.org.jkiss.dbeaver.core.qm.clear.description=Clear query manager log +command.org.jkiss.dbeaver.core.qm.refresh.name=Refresh query history +command.org.jkiss.dbeaver.core.qm.refresh.description=Refresh query history command.org.jkiss.dbeaver.core.process.stop.name=Terminate process command.org.jkiss.dbeaver.core.process.stop.description=Terminates running process @@ -443,6 +445,14 @@ dataTransfer.processor.xml.description=Export to XML file(s) dataTransfer.processor.xml.propertyGroup.general.label = General dataTransfer.processor.xml.property.extension.label = File extension dataTransfer.processor.xml.property.format.label = Dates/numbers format +dataTransfer.processor.dbunit.name=DbUnit +dataTransfer.processor.dbunit.description=Export to DbUnit XML file(s) +dataTransfer.processor.dbunit.propertyGroup.general.label = General +dataTransfer.processor.dbunit.property.extension.label = File extension +dataTransfer.processor.dbunit.property.uppercase.table.name.label = Force upper case table name +dataTransfer.processor.dbunit.property.uppercase.column.names.label = Force upper case column names +dataTransfer.processor.dbunit.property.include.null.values.label=Include NULL values in export +dataTransfer.processor.dbunit.property.null.value.string.label=Replace NULL values with dataTransfer.processor.json.name=JSON dataTransfer.processor.json.description=Export to JSON file(s) dataTransfer.processor.json.propertyGroup.general.label = General @@ -474,6 +484,7 @@ context.org.jkiss.dbeaver.ui.context.resultset.name = Results viewer context context.org.jkiss.dbeaver.ui.context.resultset.edit.description = Results edit context context.org.jkiss.dbeaver.ui.context.resultset.edit.name = Results edit context context.org.jkiss.dbeaver.ui.editors.sql.name = SQL Editor Context +context.org.jkiss.dbeaver.ui.editors.sql.scriptname = SQL Script Editor Context column.org.jkiss.dbeaver.ui.editors.columns.script.position.name = Script position diff --git a/plugins/org.jkiss.dbeaver.core/plugin.xml b/plugins/org.jkiss.dbeaver.core/plugin.xml index 785446c04ba98f37ee5528ef4ea460d0799d4d46..8647512bce55650d9898a7407a082c25ab6951b8 100644 --- a/plugins/org.jkiss.dbeaver.core/plugin.xml +++ b/plugins/org.jkiss.dbeaver.core/plugin.xml @@ -544,6 +544,7 @@ + @@ -1678,6 +1679,9 @@ + + + @@ -2416,13 +2420,17 @@ + commandId="org.jkiss.dbeaver.core.qm.filter" + label="%command.org.jkiss.dbeaver.core.qm.filter.name" + tooltip="%command.org.jkiss.dbeaver.core.qm.filter.description"/> + commandId="org.jkiss.dbeaver.core.qm.clear" + label="%command.org.jkiss.dbeaver.core.qm.clear.name" + tooltip="%command.org.jkiss.dbeaver.core.qm.clear.description"/> + @@ -2435,6 +2443,10 @@ commandId="org.jkiss.dbeaver.core.qm.clear" label="%command.org.jkiss.dbeaver.core.qm.clear.name" tooltip="%command.org.jkiss.dbeaver.core.qm.clear.description"/> + @@ -2534,25 +2546,25 @@ - - - - - - - - - + + + + + + + + + - - - - - - - - + + + + + + + + @@ -2560,7 +2572,7 @@ - + @@ -2609,6 +2621,12 @@ name="%context.org.jkiss.dbeaver.ui.editors.sql.name" parentId="org.eclipse.ui.textEditorScope"> + + + @@ -3533,6 +3551,20 @@ + + + + + + + + + ../../ org.jkiss.dbeaver.core - 5.0.4 + 5.0.5 eclipse-plugin diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/DBeaverPreferences.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/DBeaverPreferences.java index 25d140d00ba3f3a0f74a2efdda33961a60723d48..b5fc0f217e83b0998aa91df0454a3acbc5cd34ef 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/DBeaverPreferences.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/DBeaverPreferences.java @@ -139,6 +139,7 @@ public final class DBeaverPreferences public static final String RESULT_SET_ROW_BATCH_SIZE = "resultset.show.row.batch.size"; //$NON-NLS-1$ public static final String RESULT_SET_PRESENTATION = "resultset.presentation.active"; //$NON-NLS-1$ public static final String RESULT_SET_STRING_USE_CONTENT_EDITOR = "resultset.string.use.content.editor"; //$NON-NLS-1$ + public static final String RESULT_SET_USE_NAVIGATOR_FILTERS = "resultset.filter.use.navigator"; //$NON-NLS-1$ public static final String RESULT_TEXT_MAX_COLUMN_SIZE = "resultset.text.max.column.size"; //$NON-NLS-1$ public static final String RESULT_TEXT_VALUE_FORMAT = "resultset.text.value.format"; //$NON-NLS-1$ diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/CoreMessages.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/CoreMessages.java index 0e813445597fa5642a1943b7fed8dbeed43d987d..5947d255942e51cb4e887d7128a1e588b18a4c9b 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/CoreMessages.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/CoreMessages.java @@ -763,6 +763,8 @@ public class CoreMessages extends NLS { public static String pref_page_content_editor_checkbox_keys_always_use_all_columns; public static String pref_page_content_editor_checkbox_new_rows_after; public static String pref_page_content_editor_checkbox_refresh_after_update; + public static String pref_page_content_editor_checkbox_use_navigator_filters; + public static String pref_page_content_editor_checkbox_use_navigator_filters_tip; public static String pref_page_content_editor_group_content; public static String pref_page_content_editor_label_max_text_length; public static String pref_page_content_editor_group_hex; @@ -1061,6 +1063,9 @@ public class CoreMessages extends NLS { public static String pref_page_sql_format_label_convert_keyword_case_tip; public static String pref_page_sql_format_label_extract_sql_from_source_code; public static String pref_page_sql_format_label_extract_sql_from_source_code_tip; + public static String pref_page_sql_format_group_style; + public static String pref_page_sql_format_label_bold_keywords; + public static String pref_page_sql_format_label_bold_keywords_tip; public static String pref_page_sql_format_group_formatter; public static String pref_page_sql_format_label_formatter; public static String pref_page_sql_format_label_keyword_case; diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/CoreResources.properties b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/CoreResources.properties index 3480f081cfdf5d9645829e47b33c1136d9aa5387..fd79af28ef637b7720741ce8b50f85be7887ec93 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/CoreResources.properties +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/CoreResources.properties @@ -757,6 +757,8 @@ pref_page_content_editor_checkbox_edit_long_as_lobs = Edit LONG columns as LOBs pref_page_content_editor_checkbox_keys_always_use_all_columns = Always use all table columns as key pref_page_content_editor_checkbox_new_rows_after = Insert new rows after current pref_page_content_editor_checkbox_refresh_after_update = Refresh after update +pref_page_content_editor_checkbox_use_navigator_filters = Use navigator filters +pref_page_content_editor_checkbox_use_navigator_filters_tip = Filter (hide) columns according to database navigator filters pref_page_content_editor_group_content = LOB pref_page_content_editor_group_hex = Binary editor pref_page_content_editor_group_keys = Unique keys @@ -1014,6 +1016,10 @@ pref_page_sql_format_label_convert_keyword_case = Convert keyword case pref_page_sql_format_label_convert_keyword_case_tip = Auto-convert keywords to upper/lower case on enter pref_page_sql_format_label_extract_sql_from_source_code = Extract SQL from source code pref_page_sql_format_label_extract_sql_from_source_code_tip = On source code paste will remove all source language elements like quotes, +, \\n, etc +pref_page_sql_format_group_style = Style +pref_page_sql_format_label_bold_keywords = Use bold font for keywords +pref_page_sql_format_label_bold_keywords_tip = Use bold font for keywords and data types + pref_page_sql_format_group_formatter = Formatter pref_page_sql_format_label_formatter = Formatter pref_page_sql_format_label_keyword_case = Keyword case diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/DBeaverPreferencesInitializer.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/DBeaverPreferencesInitializer.java index 4800b214ac7126f9908c33979b2dccc6caadf30a..a38a7a10de5c02399efb3cf58d9beed8319ffa7e 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/DBeaverPreferencesInitializer.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/DBeaverPreferencesInitializer.java @@ -139,6 +139,7 @@ public class DBeaverPreferencesInitializer extends AbstractPreferenceInitializer PrefUtils.setDefaultPreferenceValue(store, SQLPreferenceConstants.SQL_FORMAT_KEYWORD_CASE_AUTO, true); PrefUtils.setDefaultPreferenceValue(store, SQLPreferenceConstants.SQL_FORMAT_EXTRACT_FROM_SOURCE, true); + PrefUtils.setDefaultPreferenceValue(store, SQLPreferenceConstants.SQL_FORMAT_BOLD_KEYWORDS, true); } PrefUtils.setDefaultPreferenceValue(store, SQLPreferenceConstants.RESET_CURSOR_ON_EXECUTE, false); @@ -191,6 +192,7 @@ public class DBeaverPreferencesInitializer extends AbstractPreferenceInitializer PrefUtils.setDefaultPreferenceValue(store, DBeaverPreferences.RESULT_SET_RIGHT_JUSTIFY_NUMBERS, true); PrefUtils.setDefaultPreferenceValue(store, DBeaverPreferences.RESULT_SET_ROW_BATCH_SIZE, 1); PrefUtils.setDefaultPreferenceValue(store, DBeaverPreferences.RESULT_SET_STRING_USE_CONTENT_EDITOR, false); + PrefUtils.setDefaultPreferenceValue(store, DBeaverPreferences.RESULT_SET_USE_NAVIGATOR_FILTERS, true); PrefUtils.setDefaultPreferenceValue(store, DBeaverPreferences.RESULT_TEXT_MAX_COLUMN_SIZE, 255); PrefUtils.setDefaultPreferenceValue(store, DBeaverPreferences.RESULT_TEXT_VALUE_FORMAT, DBDDisplayFormat.EDIT.name()); diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/WorkbenchContextListener.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/WorkbenchContextListener.java index af83d160a66c38834b172610328d9e301338dff1..eca72c26a42bb66facbe698156ccf37a21da072c 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/WorkbenchContextListener.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/WorkbenchContextListener.java @@ -30,6 +30,7 @@ import org.eclipse.ui.contexts.IContextActivation; import org.eclipse.ui.contexts.IContextService; import org.jkiss.dbeaver.model.runtime.features.DBRFeature; import org.jkiss.dbeaver.model.runtime.features.DBRFeatureRegistry; +import org.jkiss.dbeaver.model.struct.DBSDataContainer; import org.jkiss.dbeaver.ui.DBeaverUIConstants; import org.jkiss.dbeaver.ui.actions.DataSourcePropertyTester; import org.jkiss.dbeaver.ui.controls.resultset.ResultSetViewer; @@ -185,7 +186,9 @@ class WorkbenchContextListener implements IWindowListener, IPageListener, IPartL } activationSQL = contextService.activateContext(SQL_EDITOR_CONTEXT_ID); } - if (part instanceof EntityEditor || part.getAdapter(ResultSetViewer.class) != null) { + if (part.getAdapter(ResultSetViewer.class) != null || ( + part instanceof EntityEditor && ((EntityEditor) part).getDatabaseObject() instanceof DBSDataContainer)) + { if (activationResults != null) { contextService.deactivateContext(activationResults); } diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/runtime/RunnableContextDelegate.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/runtime/RunnableContextDelegate.java index faa40336f698fd79afa307788b5822283897df0e..a3a476ab08d7cb588f629857de9405eb5aee6277 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/runtime/RunnableContextDelegate.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/runtime/RunnableContextDelegate.java @@ -1,48 +1,41 @@ -/* - * DBeaver - Universal Database Manager - * Copyright (C) 2010-2017 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.runtime; - -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.jface.operation.IRunnableContext; -import org.eclipse.jface.operation.IRunnableWithProgress; -import org.jkiss.dbeaver.model.runtime.DBRRunnableContext; -import org.jkiss.dbeaver.model.runtime.DBRRunnableWithProgress; -import org.jkiss.dbeaver.utils.RuntimeUtils; - -import java.lang.reflect.InvocationTargetException; - -/** - * Progress monitor default implementation - */ -public class RunnableContextDelegate implements DBRRunnableContext { - - private final IRunnableContext delegate; - - public RunnableContextDelegate(IRunnableContext delegate) { - this.delegate = delegate; - } - - @Override - public void run(boolean fork, boolean cancelable, final DBRRunnableWithProgress runnable) throws InvocationTargetException, InterruptedException { - delegate.run(fork, cancelable, new IRunnableWithProgress() { - @Override - public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { - runnable.run(RuntimeUtils.makeMonitor(monitor)); - } - }); - } -} +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2017 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.runtime; + +import org.eclipse.jface.operation.IRunnableContext; +import org.jkiss.dbeaver.model.runtime.DBRRunnableContext; +import org.jkiss.dbeaver.model.runtime.DBRRunnableWithProgress; +import org.jkiss.dbeaver.utils.RuntimeUtils; + +import java.lang.reflect.InvocationTargetException; + +/** + * Progress monitor default implementation + */ +public class RunnableContextDelegate implements DBRRunnableContext { + + private final IRunnableContext delegate; + + public RunnableContextDelegate(IRunnableContext delegate) { + this.delegate = delegate; + } + + @Override + public void run(boolean fork, boolean cancelable, final DBRRunnableWithProgress runnable) throws InvocationTargetException, InterruptedException { + delegate.run(fork, cancelable, monitor -> runnable.run(RuntimeUtils.makeMonitor(monitor))); + } +} diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/runtime/qm/DefaultEventFilter.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/runtime/qm/DefaultEventFilter.java index 5b9763e952ec02928e4549c427ff3c4cd0abe295..ba20e5f4dd3f277e9a4da86674d673436f2cfecc 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/runtime/qm/DefaultEventFilter.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/runtime/qm/DefaultEventFilter.java @@ -1,6 +1,6 @@ /* * DBeaver - Universal Database Manager - * Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org) + * Copyright (C) 2010-2018 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. @@ -18,28 +18,15 @@ package org.jkiss.dbeaver.runtime.qm; import org.jkiss.dbeaver.core.DBeaverCore; -import org.jkiss.dbeaver.model.exec.DBCExecutionPurpose; -import org.jkiss.dbeaver.model.preferences.DBPPreferenceStore; -import org.jkiss.dbeaver.model.qm.QMConstants; -import org.jkiss.dbeaver.model.qm.QMEventFilter; -import org.jkiss.dbeaver.model.qm.QMMetaEvent; -import org.jkiss.dbeaver.model.qm.QMObjectType; +import org.jkiss.dbeaver.model.qm.*; import org.jkiss.dbeaver.model.qm.meta.*; -import org.jkiss.utils.CommonUtils; - -import java.util.ArrayList; -import java.util.Collection; /** * Default event filter based on preference settings. */ public class DefaultEventFilter implements QMEventFilter { - private boolean showSessions = false; - private boolean showTransactions = false; - private boolean showQueries = false; - - private java.util.List showPurposes = new ArrayList<>(); + private QMEventCriteria eventCriteria = new QMEventCriteria(); public DefaultEventFilter() { @@ -48,21 +35,7 @@ public class DefaultEventFilter implements QMEventFilter { public void reloadPreferences() { - DBPPreferenceStore store = DBeaverCore.getGlobalPreferenceStore(); - - Collection objectTypes = QMObjectType.fromString(store.getString(QMConstants.PROP_OBJECT_TYPES)); - this.showSessions = objectTypes.contains(QMObjectType.session); - this.showTransactions = objectTypes.contains(QMObjectType.txn); - this.showQueries = objectTypes.contains(QMObjectType.query); - - this.showPurposes.clear(); - for (String queryType : CommonUtils.splitString(store.getString(QMConstants.PROP_QUERY_TYPES), ',')) { - try { - this.showPurposes.add(DBCExecutionPurpose.valueOf(queryType)); - } catch (IllegalArgumentException e) { - // ignore - } - } + eventCriteria = QMUtils.createDefaultCriteria(DBeaverCore.getGlobalPreferenceStore()); } @Override @@ -70,11 +43,12 @@ public class DefaultEventFilter implements QMEventFilter { { QMMObject object = event.getObject(); if (object instanceof QMMStatementExecuteInfo) { - return showQueries && showPurposes.contains(((QMMStatementExecuteInfo) object).getStatement().getPurpose()); + return eventCriteria.hasObjectType(QMObjectType.query) && + eventCriteria.hasQueryType(((QMMStatementExecuteInfo) object).getStatement().getPurpose()); } else if (object instanceof QMMTransactionInfo || object instanceof QMMTransactionSavepointInfo) { - return showTransactions; + return eventCriteria.hasObjectType(QMObjectType.txn); } else if (object instanceof QMMSessionInfo) { - return showSessions; + return eventCriteria.hasObjectType(QMObjectType.session); } return true; } diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/runtime/qm/QMControllerImpl.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/runtime/qm/QMControllerImpl.java index 6c54b959525f49ab4247deb30f30168c6378ef52..15458c87ac6ed39e5b46ac8cf808e2d15ebc7e3a 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/runtime/qm/QMControllerImpl.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/runtime/qm/QMControllerImpl.java @@ -1,6 +1,6 @@ /* * DBeaver - Universal Database Manager - * Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org) + * Copyright (C) 2010-2018 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. @@ -16,14 +16,22 @@ */ package org.jkiss.dbeaver.runtime.qm; +import org.eclipse.core.runtime.Adapters; +import org.jkiss.code.NotNull; +import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.qm.*; +import org.jkiss.dbeaver.model.qm.meta.*; +import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; +import org.jkiss.utils.ArrayUtils; +import org.jkiss.utils.CommonUtils; import java.lang.reflect.InvocationHandler; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; /** @@ -36,6 +44,7 @@ public class QMControllerImpl implements QMController { private QMExecutionHandler defaultHandler; private QMMCollectorImpl metaHandler; private final List handlers = new ArrayList<>(); + private QMEventBrowser eventBrowser; public QMControllerImpl() { defaultHandler = (QMExecutionHandler) Proxy.newProxyInstance( @@ -75,6 +84,19 @@ public class QMControllerImpl implements QMController { return defaultHandler; } + @Override + public synchronized QMEventBrowser getEventBrowser() { + if (eventBrowser == null) { + eventBrowser = Adapters.adapt(this, QMEventBrowser.class); + if (eventBrowser == null) { + // Default browser + eventBrowser = new DefaultEventBrowser(); + } + } + + return eventBrowser; + } + @Override public void registerHandler(QMExecutionHandler handler) { synchronized (handlers) { @@ -103,12 +125,6 @@ public class QMControllerImpl implements QMController { metaHandler.removeListener(metaListener); } - @Override - public List getPastMetaEvents() - { - return metaHandler.getPastEvents(); - } - List getHandlers() { synchronized (handlers) { @@ -150,4 +166,60 @@ public class QMControllerImpl implements QMController { } + private class DefaultEventBrowser implements QMEventBrowser { + @Override + public QMEventCursor getQueryHistoryCursor( + @NotNull DBRProgressMonitor monitor, + @NotNull QMEventCriteria criteria) + throws DBException + { + List pastEvents = metaHandler.getPastEvents(); + if (criteria.getObjectTypes() != null || criteria.getQueryTypes() != null) { + // Filter by query type and object type + for (Iterator iter = pastEvents.iterator(); iter.hasNext(); ) { + QMMetaEvent event = iter.next(); + if (criteria.getObjectTypes() != null) { + if (!matchesObjectType(event.getObject(), criteria.getObjectTypes())) { + iter.remove(); + continue; + } + } + if (criteria.getQueryTypes() != null) { + QMMStatementInfo statementInfo = null; + if (event.getObject() instanceof QMMStatementInfo) { + statementInfo = (QMMStatementInfo) event.getObject(); + } else if (event.getObject() instanceof QMMStatementExecuteInfo) { + statementInfo = ((QMMStatementExecuteInfo) event.getObject()).getStatement(); + } + if (statementInfo != null && + !ArrayUtils.contains(criteria.getQueryTypes(), ((QMMStatementInfo) event.getObject()).getPurpose())) + { + iter.remove(); + } + } + } + } + if (CommonUtils.isEmpty(criteria.getSearchString())) { + return new QMUtils.ListCursorImpl(pastEvents); + } else { + String searchString = criteria.getSearchString().toLowerCase(); + List filtered = new ArrayList<>(); + for (QMMetaEvent event : pastEvents) { + if (event.getObject().getText().toLowerCase().contains(searchString)) { + filtered.add(event); + } + } + return new QMUtils.ListCursorImpl(filtered); + } + } + + private boolean matchesObjectType(QMMObject object, QMObjectType[] objectTypes) { + if (object instanceof QMMSessionInfo) + return ArrayUtils.contains(objectTypes, QMObjectType.session); + else if (object instanceof QMMTransactionInfo || object instanceof QMMTransactionSavepointInfo) + return ArrayUtils.contains(objectTypes, QMObjectType.txn); + else + return ArrayUtils.contains(objectTypes, QMObjectType.query); + } + } } diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/runtime/qm/QMLogFileWriter.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/runtime/qm/QMLogFileWriter.java index ca6f32080ed02f3a440d7751b093a443eebea2c3..647c2e2a1744fcd06186e047a409acefe33f8633 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/runtime/qm/QMLogFileWriter.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/runtime/qm/QMLogFileWriter.java @@ -26,6 +26,7 @@ import org.jkiss.dbeaver.model.qm.QMEventFilter; import org.jkiss.dbeaver.model.qm.QMMetaEvent; import org.jkiss.dbeaver.model.qm.QMMetaListener; import org.jkiss.dbeaver.model.qm.meta.*; +import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.dbeaver.utils.ContentUtils; import org.jkiss.dbeaver.utils.GeneralUtils; import org.jkiss.dbeaver.utils.RuntimeUtils; @@ -85,7 +86,7 @@ public class QMLogFileWriter implements QMMetaListener, DBPPreferenceListener { } @Override - public synchronized void metaInfoChanged(@NotNull List events) + public synchronized void metaInfoChanged(DBRProgressMonitor monitor, @NotNull List events) { if (!enabled || logWriter == null) { return; diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/runtime/qm/QMMCollectorImpl.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/runtime/qm/QMMCollectorImpl.java index 82195fb160e34d8b9b25db56841d2af68267014c..1c06fb09624622a90fae95644eed75628e3a1868 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/runtime/qm/QMMCollectorImpl.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/runtime/qm/QMMCollectorImpl.java @@ -44,7 +44,7 @@ public class QMMCollectorImpl extends DefaultExecutionHandler implements QMMColl private static final Log log = Log.getLog(QMMCollectorImpl.class); private static final long EVENT_DISPATCH_PERIOD = 250; - private static final int MAX_HISTORY_EVENTS = 1000; + private static final int MAX_HISTORY_EVENTS = 10000; // Session map private LongKeyMap sessionMap = new LongKeyMap<>(); @@ -323,10 +323,12 @@ public class QMMCollectorImpl extends DefaultExecutionHandler implements QMMColl } final List listeners = getListeners(); if (!listeners.isEmpty() && !events.isEmpty()) { + // Reverse collection. Fresh events must come first. + Collections.reverse(events); // Dispatch all events for (QMMetaListener listener : listeners) { try { - listener.metaInfoChanged(events); + listener.metaInfoChanged(monitor, events); } catch (Throwable e) { log.error("Error notifying event listener", e); } diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/runtime/sql/ProcedureParameterBindDialog.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/runtime/sql/ProcedureParameterBindDialog.java new file mode 100644 index 0000000000000000000000000000000000000000..4b4cac3feb07f5ae1349016d23deb04a3b03b8cd --- /dev/null +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/runtime/sql/ProcedureParameterBindDialog.java @@ -0,0 +1,166 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2017 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.runtime.sql; + +import org.eclipse.jface.dialogs.IDialogSettings; +import org.eclipse.jface.dialogs.StatusDialog; +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.widgets.*; +import org.jkiss.dbeaver.DBException; +import org.jkiss.dbeaver.core.DBeaverUI; +import org.jkiss.dbeaver.model.DBIcon; +import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor; +import org.jkiss.dbeaver.model.struct.rdb.DBSProcedure; +import org.jkiss.dbeaver.model.struct.rdb.DBSProcedureParameter; +import org.jkiss.dbeaver.runtime.ui.DBUserInterface; +import org.jkiss.dbeaver.ui.DBeaverIcons; +import org.jkiss.dbeaver.ui.UIUtils; +import org.jkiss.dbeaver.ui.controls.CustomTableEditor; +import org.jkiss.dbeaver.utils.GeneralUtils; +import org.jkiss.utils.CommonUtils; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Parameter binding + */ +public class ProcedureParameterBindDialog extends StatusDialog { + + private static final String DIALOG_ID = "DBeaver.ProcedureParameterBindDialog";//$NON-NLS-1$ + + private DBSProcedure procedure; + private List parameters; + private Map values = new HashMap<>(); + + public ProcedureParameterBindDialog(Shell shell, DBSProcedure procedure, Map values) + { + super(shell); + this.procedure = procedure; + this.parameters = new ArrayList<>(); + + try { + this.parameters.addAll(procedure.getParameters(new VoidProgressMonitor())); + } catch (DBException e) { + DBUserInterface.getInstance().showError("Can't get parameters", "Error getting procedure papameters", e); + } + + this.values = new HashMap<>(values); + } + + @Override + protected IDialogSettings getDialogBoundsSettings() + { + return UIUtils.getDialogSettings(DIALOG_ID); + } + + @Override + protected boolean isResizable() + { + return true; + } + + + @Override + protected Control createDialogArea(Composite parent) + { + getShell().setText(procedure.getProcedureType().name() + " " + procedure.getName() + " parameter(s)"); + final Composite composite = (Composite)super.createDialogArea(parent); + + final Table paramTable = new Table(composite, SWT.SINGLE | SWT.FULL_SELECTION | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL); + final GridData gd = new GridData(GridData.FILL_BOTH); + gd.widthHint = 400; + gd.heightHint = 200; + paramTable.setLayoutData(gd); + paramTable.setHeaderVisible(true); + paramTable.setLinesVisible(true); + + final TableColumn nameColumn = UIUtils.createTableColumn(paramTable, SWT.LEFT, "Name"); + nameColumn.setWidth(100); + final TableColumn valueColumn = UIUtils.createTableColumn(paramTable, SWT.LEFT, "Value"); + valueColumn.setWidth(200); + final TableColumn typeColumn = UIUtils.createTableColumn(paramTable, SWT.LEFT, "Type"); + typeColumn.setWidth(60); + final TableColumn kindColumn = UIUtils.createTableColumn(paramTable, SWT.LEFT, "Kind"); + kindColumn.setWidth(40); + + for (DBSProcedureParameter param : parameters) { + TableItem item = new TableItem(paramTable, SWT.NONE); + item.setData(param); + item.setImage(DBeaverIcons.getImage(DBIcon.TREE_ATTRIBUTE)); + item.setText(0, param.getName()); + Object value = values.get(param); + item.setText(1, CommonUtils.toString(value, "")); + item.setText(2, param.getParameterType().getFullTypeName()); + item.setText(3, param.getParameterKind().getTitle()); + } + + final CustomTableEditor tableEditor = new CustomTableEditor(paramTable) { + { + firstTraverseIndex = 1; + lastTraverseIndex = 1; + editOnEnter = false; + } + @Override + protected Control createEditor(Table table, int index, TableItem item) { + if (index != 1) { + return null; + } + DBSProcedureParameter param = (DBSProcedureParameter) item.getData(); + Text editor = new Text(table, SWT.BORDER); + editor.setText(CommonUtils.toString(values.get(param), "")); + editor.selectAll(); + return editor; + } + @Override + protected void saveEditorValue(Control control, int index, TableItem item) { + DBSProcedureParameter param = (DBSProcedureParameter) item.getData(); + String newValue = ((Text) control).getText(); + item.setText(1, newValue); + + values.put(param, newValue); + } + }; + + if (!parameters.isEmpty()) { + DBeaverUI.asyncExec(() -> { + paramTable.select(0); + tableEditor.showEditor(paramTable.getItem(0), 1); + }); + } + + updateStatus(GeneralUtils.makeInfoStatus("Use Tab to switch.")); + return composite; + } + + @Override + protected void okPressed() + { + super.okPressed(); + } + + public List getParameters() { + return parameters; + } + + public Map getValues() { + return values; + } +} diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/runtime/sql/SQLQueryParameterBindDialog.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/runtime/sql/SQLQueryParameterBindDialog.java index 1acd870e1c5e6b53e6663e27e648d6c425a8b979..0245b28f85d6ebc92b1ecda1181119f83e4a59e8 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/runtime/sql/SQLQueryParameterBindDialog.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/runtime/sql/SQLQueryParameterBindDialog.java @@ -45,7 +45,7 @@ public class SQLQueryParameterBindDialog extends StatusDialog { private static Map savedParamValues = new HashMap<>(); - protected SQLQueryParameterBindDialog(Shell shell, List parameters) + public SQLQueryParameterBindDialog(Shell shell, List parameters) { super(shell); this.parameters = parameters; @@ -99,11 +99,7 @@ public class SQLQueryParameterBindDialog extends StatusDialog { for (SQLQueryParameter param : parameters) { if (param.getPrevious() != null) { // Skip duplicates - List dups = dupParameters.get(param.getName()); - if (dups == null) { - dups = new ArrayList<>(); - dupParameters.put(param.getName(), dups); - } + List dups = dupParameters.computeIfAbsent(param.getName(), k -> new ArrayList<>()); dups.add(param); continue; } diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/tools/transfer/stream/IStreamDataExporterSite.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/tools/transfer/stream/IStreamDataExporterSite.java index bb27f10cf08c498ca2f377fc4320db725ea5f7ba..114dc8cd8863b10db9c6111e0437edf9d6757ce7 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/tools/transfer/stream/IStreamDataExporterSite.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/tools/transfer/stream/IStreamDataExporterSite.java @@ -48,5 +48,7 @@ public interface IStreamDataExporterSite { void flush() throws IOException; void writeBinaryData(@NotNull DBDContentStorage cs) throws IOException; + + String getOutputEncoding(); } \ No newline at end of file diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/tools/transfer/stream/StreamTransferConsumer.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/tools/transfer/stream/StreamTransferConsumer.java index bc0ca0df9aa020f3685e67a2dc7a44ee43ccfb2c..14de7cd29fdc80164c00b4107635a0f6d783becd 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/tools/transfer/stream/StreamTransferConsumer.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/tools/transfer/stream/StreamTransferConsumer.java @@ -549,5 +549,10 @@ public class StreamTransferConsumer implements IDataTransferConsumer columns; + private String tableName; + private boolean upperCaseTableName; + private boolean upperCaseColumnNames; + private boolean includeNullValues; + + @Override + public void init(IStreamDataExporterSite site) throws DBException + { + super.init(site); + out = site.getWriter(); + upperCaseTableName = CommonUtils.getBoolean(site.getProperties().get(PROP_UPPER_CASE_TABLE_NAME), true); + upperCaseColumnNames = CommonUtils.getBoolean(site.getProperties().get(PROP_UPPER_CASE_COLUMN_NAMES), true); + includeNullValues = CommonUtils.getBoolean(site.getProperties().get(PROP_INCLUDE_NULL_VALUES), true); + } + + @Override + public void dispose() + { + out = null; + tableName = null; + columns = null; + super.dispose(); + } + + private String getTableName() + { + String result = "UNKNOWN_TABLE_NAME"; + if (getSite() == null || getSite().getAttributes() == null || getSite().getAttributes().isEmpty()) { + return result; + } + DBSAttributeBase metaAttribute = getSite().getAttributes().get(0).getMetaAttribute(); + if (metaAttribute != null && metaAttribute instanceof JDBCColumnMetaData) { + JDBCColumnMetaData metaData = (JDBCColumnMetaData) metaAttribute; + result = metaData.getEntityName(); + } + if (upperCaseTableName) { + result = result == null ? null : result.toUpperCase(); + } + return result; + } + + @Override + public void exportHeader(DBCSession session) throws DBException, IOException + { + columns = getSite().getAttributes(); + tableName = getTableName(); + String outputEncoding = getSite().getOutputEncoding() == null || getSite().getOutputEncoding().length() == 0 ? "UTF-8" : getSite().getOutputEncoding(); + out.append("").append(CommonUtils.getLineSeparator()); + out.append("").append(CommonUtils.getLineSeparator()); + } + + @Override + public void exportRow(DBCSession session, Object[] row) throws DBException, IOException + { + out.write(" <" + tableName); + for (int i = 0; i < row.length; i++) { + if (DBUtils.isNullValue(row[i]) && !includeNullValues) { + continue; + } + DBDAttributeBinding column = columns.get(i); + String columnName = escapeXmlElementName(column.getName()); + if (columnName != null && upperCaseColumnNames) { + columnName = columnName.toUpperCase(); + } + out.write(" " + columnName + "=\""); + if (DBUtils.isNullValue(row[i])) { + writeTextCell("" + getSite().getProperties().get(PROP_NULL_VALUE_STRING)); + } else if (row[i] instanceof DBDContent) { + // Content + // Inline textual content and handle binaries in some special way + DBDContent content = (DBDContent)row[i]; + try { + DBDContentStorage cs = content.getContents(session.getProgressMonitor()); + if (cs != null) { + if (ContentUtils.isTextContent(content)) { + try (Reader reader = cs.getContentReader()) { + writeCellValue(reader); + } + } else { + // BLOB format http://dbunit.sourceforge.net/datatypes.html + out.write("[BASE64]"); + try (final InputStream stream = cs.getContentStream()) { + Base64.encode(stream, cs.getContentLength(), getSite().getWriter()); + } + } + } + } + finally { + content.release(); + } + } else { + writeTextCell(super.getValueDisplayString(column, row[i])); + } + out.write("\""); + } + out.write(">" + CommonUtils.getLineSeparator()); + } + + @Override + public void exportFooter(DBRProgressMonitor monitor) throws IOException + { + out.write("\n"); + } + + private void writeTextCell(@Nullable String value) + { + if (value != null) { + value = value.replace("<", "<").replace(">", ">").replace("&", "&"); + out.write(value); + } + } + + private void writeCellValue(Reader reader) throws IOException + { + // Copy reader + char buffer[] = new char[2000]; + for (;;) { + int count = reader.read(buffer); + if (count <= 0) { + break; + } + for (int i = 0; i < count; i++) { + if (buffer[i] == '<') { + out.write("<"); + } + else if (buffer[i] == '>') { + out.write(">"); + } else if (buffer[i] == '&') { + out.write("&"); + } else { + out.write(buffer[i]); + } + } + } + } + + private String escapeXmlElementName(String name) { + return name.replaceAll("[^\\p{Alpha}\\p{Digit}]+","_"); + } +} diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/ActionUtils.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/ActionUtils.java index 1994327f9b17c6e6197e4ec9bf91726252add34c..76b648bf3939597ba364684b8b528b6a75349fc5 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/ActionUtils.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/ActionUtils.java @@ -51,12 +51,12 @@ public class ActionUtils { private static final Log log = Log.getLog(ActionUtils.class); - public static CommandContributionItem makeCommandContribution(IServiceLocator serviceLocator, String commandId) + public static CommandContributionItem makeCommandContribution(@NotNull IServiceLocator serviceLocator, @NotNull String commandId) { return makeCommandContribution(serviceLocator, commandId, CommandContributionItem.STYLE_PUSH); } - public static CommandContributionItem makeCommandContribution(IServiceLocator serviceLocator, String commandId, int style) + public static CommandContributionItem makeCommandContribution(@NotNull IServiceLocator serviceLocator, @NotNull String commandId, int style) { return new CommandContributionItem(new CommandContributionItemParameter( serviceLocator, @@ -65,7 +65,7 @@ public class ActionUtils style)); } - public static CommandContributionItem makeCommandContribution(IServiceLocator serviceLocator, String commandId, int style, DBPImage icon) + public static CommandContributionItem makeCommandContribution(@NotNull IServiceLocator serviceLocator, @NotNull String commandId, int style, @Nullable DBPImage icon) { CommandContributionItemParameter parameters = new CommandContributionItemParameter( serviceLocator, @@ -82,7 +82,7 @@ public class ActionUtils } public static ContributionItem makeActionContribution( - IAction action, + @NotNull IAction action, boolean showText) { ActionContributionItem item = new ActionContributionItem(action); @@ -93,9 +93,9 @@ public class ActionUtils } public static CommandContributionItem makeCommandContribution( - IServiceLocator serviceLocator, - String commandId, - String name, + @NotNull IServiceLocator serviceLocator, + @NotNull String commandId, + @Nullable String name, @Nullable DBPImage image, @Nullable String toolTip, boolean showText) diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/DBeaverIcons.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/DBeaverIcons.java index 98e04a50232db22135a4c32503f3c16f07c3cc9f..92d69cfce551d19f8619bf00b03db44200ffc0f4 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/DBeaverIcons.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/DBeaverIcons.java @@ -40,6 +40,19 @@ public class DBeaverIcons { private static final Log log = Log.getLog(DBeaverIcons.class); + private static final boolean useLegacyOverlay; + + static { + boolean hasCachedImageDataProvider; + try { + Class.forName("org.eclipse.jface.resource.CompositeImageDescriptor$CachedImageDataProvider"); + hasCachedImageDataProvider = true; + } catch (ClassNotFoundException e) { + hasCachedImageDataProvider = false; + } + useLegacyOverlay = !hasCachedImageDataProvider; + } + private static class IconDescriptor { String id; Image image; @@ -112,12 +125,30 @@ public class DBeaverIcons (image.getBottomRight() == null ? "" : image.getBottomRight().getLocation()); IconDescriptor icon = compositeMap.get(compositeId); if (icon == null) { - OverlayImageDescriptor ovrImage = new OverlayImageDescriptor(mainIcon.imageDescriptor); - if (image.getTopLeft() != null) ovrImage.setTopLeft(new ImageDescriptor[] { getImageDescriptor(image.getTopLeft())} ); - if (image.getTopRight() != null) ovrImage.setTopRight(new ImageDescriptor[]{ getImageDescriptor(image.getTopRight()) }); - if (image.getBottomLeft() != null) ovrImage.setBottomLeft(new ImageDescriptor[]{getImageDescriptor(image.getBottomLeft())}); - if (image.getBottomRight() != null) ovrImage.setBottomRight(new ImageDescriptor[]{getImageDescriptor(image.getBottomRight())}); - Image resultImage = ovrImage.createImage(); + Image resultImage; + if (useLegacyOverlay) { + OverlayImageDescriptorLegacy ovrImage = new OverlayImageDescriptorLegacy(mainIcon.image.getImageData()); + if (image.getTopLeft() != null) + ovrImage.setTopLeft(new ImageDescriptor[]{getImageDescriptor(image.getTopLeft())}); + if (image.getTopRight() != null) + ovrImage.setTopRight(new ImageDescriptor[]{getImageDescriptor(image.getTopRight())}); + if (image.getBottomLeft() != null) + ovrImage.setBottomLeft(new ImageDescriptor[]{getImageDescriptor(image.getBottomLeft())}); + if (image.getBottomRight() != null) + ovrImage.setBottomRight(new ImageDescriptor[]{getImageDescriptor(image.getBottomRight())}); + resultImage = ovrImage.createImage(); + } else { + OverlayImageDescriptor ovrImage = new OverlayImageDescriptor(mainIcon.imageDescriptor); + if (image.getTopLeft() != null) + ovrImage.setTopLeft(new ImageDescriptor[]{getImageDescriptor(image.getTopLeft())}); + if (image.getTopRight() != null) + ovrImage.setTopRight(new ImageDescriptor[]{getImageDescriptor(image.getTopRight())}); + if (image.getBottomLeft() != null) + ovrImage.setBottomLeft(new ImageDescriptor[]{getImageDescriptor(image.getBottomLeft())}); + if (image.getBottomRight() != null) + ovrImage.setBottomRight(new ImageDescriptor[]{getImageDescriptor(image.getBottomRight())}); + resultImage = ovrImage.createImage(); + } icon = new IconDescriptor(compositeId, resultImage); compositeMap.put(compositeId, icon); } diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/OverlayImageDescriptorLegacy.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/OverlayImageDescriptorLegacy.java new file mode 100644 index 0000000000000000000000000000000000000000..d8fe0c90624b3d13c3cad68f525cc71d04643108 --- /dev/null +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/OverlayImageDescriptorLegacy.java @@ -0,0 +1,139 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2017 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.ui; + +import org.eclipse.jface.resource.CompositeImageDescriptor; +import org.eclipse.jface.resource.ImageDescriptor; +import org.eclipse.swt.graphics.ImageData; +import org.eclipse.swt.graphics.Point; + +/** + * Legacy version of OverlayImageDescriptor (for old Eclipse) + */ +@Deprecated +public class OverlayImageDescriptorLegacy extends CompositeImageDescriptor { + + static final int DEFAULT_WIDTH = 16; + static final int DEFAULT_HEIGHT = 16; + + private Point imageSize = null; + + private ImageData baseImageData; + private ImageDescriptor[] topLeft, topRight, bottomLeft, bottomRight; + + public OverlayImageDescriptorLegacy(ImageData baseImageData) { + this.baseImageData = baseImageData; + this.imageSize = new Point(baseImageData.width, baseImageData.height); + } + + public void setTopLeft(ImageDescriptor[] topLeft) + { + this.topLeft = topLeft; + } + + public void setTopRight(ImageDescriptor[] topRight) + { + this.topRight = topRight; + } + + public void setBottomLeft(ImageDescriptor[] bottomLeft) + { + this.bottomLeft = bottomLeft; + } + + public void setBottomRight(ImageDescriptor[] bottomRight) + { + this.bottomRight = bottomRight; + } + + @Override + protected void drawCompositeImage(int width, int height) { + ImageData base = baseImageData; + drawImage(base, 0, 0); + if (topRight != null) + drawTopRight(topRight); + + if (bottomRight != null) + drawBottomRight(bottomRight); + + if (bottomLeft != null) + drawBottomLeft(bottomLeft); + + if (topLeft != null) + drawTopLeft(topLeft); + } + + @Override + protected Point getSize() { + return imageSize; + } + + protected void drawTopLeft(ImageDescriptor[] overlays) { + if (overlays == null) + return; + int length = overlays.length; + int x = 0; + for (int i = 0; i < 3; i++) { + if (i < length && overlays[i] != null) { + ImageData id = overlays[i].getImageData(); + drawImage(id, x, 0); + x += id.width; + } + } + } + protected void drawTopRight(ImageDescriptor[] overlays) { + if (overlays == null) + return; + int length = overlays.length; + int x = getSize().x; + for (int i = 2; i >= 0; i--) { + if (i < length && overlays[i] != null) { + ImageData id = overlays[i].getImageData(); + x -= id.width; + drawImage(id, x, 0); + } + } + } + + protected void drawBottomLeft(ImageDescriptor[] overlays) { + if (overlays == null) + return; + int length = overlays.length; + int x = 0; + for (int i = 0; i < 3; i++) { + if (i < length && overlays[i] != null) { + ImageData id = overlays[i].getImageData(); + drawImage(id, x, getSize().y - id.height); + x += id.width; + } + } + } + protected void drawBottomRight(ImageDescriptor[] overlays) { + if (overlays == null) + return; + int length = overlays.length; + int x = getSize().x; + for (int i = 2; i >= 0; i--) { + if (i < length && overlays[i] != null) { + ImageData id = overlays[i].getImageData(); + x -= id.width; + drawImage(id, x, getSize().y - id.height); + } + } + } + +} \ No newline at end of file diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/actions/datasource/DataSourceHandler.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/actions/datasource/DataSourceHandler.java index d3e8a3dd9962724414cafff40383354b789400d9..75c81847c440c02a005298bd9d4131573af40ba5 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/actions/datasource/DataSourceHandler.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/actions/datasource/DataSourceHandler.java @@ -94,10 +94,10 @@ public class DataSourceHandler if (onFinish != null) { onFinish.onTaskFinished(result); } else if (!result.isOK()) { - DBUserInterface.getInstance().showError( + DBeaverUI.asyncExec(() -> DBUserInterface.getInstance().showError( connectJob.getName(), null,//NLS.bind(CoreMessages.runtime_jobs_connect_status_error, dataSourceContainer.getName()), - result); + result)); } } }; diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/actions/datasource/DataSourceMenuContributor.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/actions/datasource/DataSourceMenuContributor.java index d3ac866c439f20e79326cd4f269503a6250b05b7..2f77a31a8df68e245a398b189a56c6352397c4b2 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/actions/datasource/DataSourceMenuContributor.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/actions/datasource/DataSourceMenuContributor.java @@ -20,7 +20,6 @@ package org.jkiss.dbeaver.ui.actions.datasource; import org.eclipse.jface.action.ActionContributionItem; import org.eclipse.jface.action.IContributionItem; import org.eclipse.ui.actions.CompoundContributionItem; -import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.ui.actions.common.EmptyListAction; import java.util.ArrayList; @@ -28,8 +27,6 @@ import java.util.List; public abstract class DataSourceMenuContributor extends CompoundContributionItem { - private static final Log log = Log.getLog(DataSourceMenuContributor.class); - @Override protected IContributionItem[] getContributionItems() { diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/actions/navigator/NavigatorHandlerCopyAbstract.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/actions/navigator/NavigatorHandlerCopyAbstract.java index 93ec3017d495a00300ea2e52aae9cb43f6ebd109..a13e33e2fbc9c2d9db3e50ebccefa2cecc6ee62c 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/actions/navigator/NavigatorHandlerCopyAbstract.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/actions/navigator/NavigatorHandlerCopyAbstract.java @@ -60,12 +60,8 @@ public abstract class NavigatorHandlerCopyAbstract extends AbstractHandler imple final IWorkbenchWindow workbenchWindow = HandlerUtil.getActiveWorkbenchWindow(event); final IWorkbenchPart activePart = HandlerUtil.getActivePart(event); - DBeaverUI.syncExec(new Runnable() { - @Override - public void run() { - copySelection(workbenchWindow, activePart, selection); - } - }); + DBeaverUI.syncExec(() -> + copySelection(workbenchWindow, activePart, selection)); return null; } diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/actions/navigator/NavigatorHandlerObjectOpen.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/actions/navigator/NavigatorHandlerObjectOpen.java index bbb5d3deb2d22589d43c2a043cc123edfb6c3f5f..9c84e264cddfe7e4bf932329ab82c11798a2ef5b 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/actions/navigator/NavigatorHandlerObjectOpen.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/actions/navigator/NavigatorHandlerObjectOpen.java @@ -40,13 +40,12 @@ import org.jkiss.dbeaver.core.DBeaverUI; import org.jkiss.dbeaver.model.app.DBPResourceHandler; import org.jkiss.dbeaver.model.edit.DBEObjectEditor; import org.jkiss.dbeaver.model.navigator.*; -import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; -import org.jkiss.dbeaver.model.runtime.DBRRunnableWithProgress; import org.jkiss.dbeaver.model.struct.DBSObject; import org.jkiss.dbeaver.model.struct.DBSObjectContainer; import org.jkiss.dbeaver.registry.DataSourceDescriptor; import org.jkiss.dbeaver.registry.editor.EntityEditorsRegistry; import org.jkiss.dbeaver.runtime.ui.DBUserInterface; +import org.jkiss.dbeaver.ui.IRefreshablePart; import org.jkiss.dbeaver.ui.UIUtils; import org.jkiss.dbeaver.ui.controls.folders.ITabbedFolderContainer; import org.jkiss.dbeaver.ui.dialogs.connection.EditConnectionDialog; @@ -125,14 +124,16 @@ public class NavigatorHandlerObjectOpen extends NavigatorHandlerObjectBase imple @Nullable String defaultPageId, IWorkbenchWindow workbenchWindow) { - return openEntityEditor(selectedNode, defaultPageId, null , workbenchWindow); + return openEntityEditor(selectedNode, defaultPageId, null, null, workbenchWindow, true); } public static IEditorPart openEntityEditor( @NotNull DBNNode selectedNode, @Nullable String defaultPageId, + @Nullable String defaultFolderId, @Nullable Map attributes, - IWorkbenchWindow workbenchWindow) + IWorkbenchWindow workbenchWindow, + boolean activate) { if (selectedNode instanceof DBNDataSource) { final DataSourceDescriptor dataSourceContainer = (DataSourceDescriptor) ((DBNDataSource)selectedNode).getDataSourceContainer(); @@ -140,19 +141,34 @@ public class NavigatorHandlerObjectOpen extends NavigatorHandlerObjectBase imple return null; } try { - String defaultFolderId = null; if (selectedNode instanceof DBNDatabaseFolder && !(selectedNode.getParentNode() instanceof DBNDatabaseFolder) && selectedNode.getParentNode() instanceof DBNDatabaseNode) { - defaultFolderId = selectedNode.getNodeType(); + if (defaultFolderId == null) { + defaultFolderId = selectedNode.getNodeType(); + } selectedNode = selectedNode.getParentNode(); } IEditorPart editor = findEntityEditor(workbenchWindow, selectedNode); if (editor != null) { + boolean settingsChanged = false; + IEditorInput editorInput = editor.getEditorInput(); + if (editorInput instanceof DatabaseEditorInput) { + settingsChanged = setInputAttributes((DatabaseEditorInput) editorInput, defaultPageId, defaultFolderId, attributes); + } if (editor instanceof ITabbedFolderContainer && defaultFolderId != null) { // Activate default folder - ((ITabbedFolderContainer) editor).switchFolder(defaultFolderId); + if (((ITabbedFolderContainer) editor).switchFolder(defaultFolderId)) { + settingsChanged = true; + } + } + if (settingsChanged) { + if (editor instanceof IRefreshablePart) { + ((IRefreshablePart) editor).refreshPart(selectedNode, true); + } + } + if (workbenchWindow.getActivePage().getActiveEditor() != editor || activate) { + workbenchWindow.getActivePage().activate(editor); } - workbenchWindow.getActivePage().activate(editor); return editor; } @@ -225,14 +241,11 @@ public class NavigatorHandlerObjectOpen extends NavigatorHandlerObjectBase imple private static void refreshDatabaseNode(@NotNull DBNDatabaseNode selectedNode) throws InvocationTargetException, InterruptedException { final DBNDatabaseNode nodeToRefresh = selectedNode; - DBeaverUI.runInProgressService(new DBRRunnableWithProgress() { - @Override - public void run(DBRProgressMonitor monitor) throws InvocationTargetException, InterruptedException { - try { - nodeToRefresh.refreshNode(monitor, nodeToRefresh); - } catch (DBException e) { - log.error("Error refreshing database object", e); - } + DBeaverUI.runInProgressService(monitor -> { + try { + nodeToRefresh.refreshNode(monitor, nodeToRefresh); + } catch (DBException e) { + log.error("Error refreshing database object", e); } }); } @@ -252,14 +265,26 @@ public class NavigatorHandlerObjectOpen extends NavigatorHandlerObjectBase imple } } - private static void setInputAttributes(DatabaseEditorInput editorInput, String defaultPageId, String defaultFolderId, Map attributes) { - editorInput.setDefaultPageId(defaultPageId); - editorInput.setDefaultFolderId(defaultFolderId); + private static boolean setInputAttributes(DatabaseEditorInput editorInput, String defaultPageId, String defaultFolderId, Map attributes) { + boolean changed = false; + if (defaultPageId != null && !CommonUtils.equalObjects(defaultPageId, editorInput.getDefaultPageId())) { + editorInput.setDefaultPageId(defaultPageId); + changed = true; + } + if (defaultFolderId != null && !CommonUtils.equalObjects(defaultFolderId, editorInput.getDefaultFolderId())) { + editorInput.setDefaultFolderId(defaultFolderId); + changed = true; + } + if (!CommonUtils.isEmpty(attributes)) { for (Map.Entry attr : attributes.entrySet()) { - editorInput.setAttribute(attr.getKey(), attr.getValue()); + if (!CommonUtils.equalObjects(editorInput.getAttribute(attr.getKey()), attr.getValue())) { + editorInput.setAttribute(attr.getKey(), attr.getValue()); + changed = true; + } } } + return changed; } @Override diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/CSmartCombo.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/CSmartCombo.java index 512855cef8a82ed2a8a41f689dd5ce013f0b35c2..ce5f468fd0ed42a3cb98e2f1bc1ff8456f58dfc9 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/CSmartCombo.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/CSmartCombo.java @@ -195,6 +195,9 @@ public class CSmartCombo extends Composite { @Override public void setBackground(Color background) { + if (background == getBackground()) { + return; + } super.setBackground(background); this.imageLabel.setBackground(background); this.text.setBackground(background); @@ -344,7 +347,7 @@ public class CSmartCombo extends Composite { checkWidget(); String itemText; - Image itemImage; + Image itemImage = null; Color itemBackground = null; if (index < 0) { selectedItem = null; @@ -354,7 +357,11 @@ public class CSmartCombo extends Composite { } else { selectedItem = this.items.get(index); itemText = labelProvider.getText(selectedItem); - itemImage = labelProvider.getImage(selectedItem); + try { + itemImage = labelProvider.getImage(selectedItem); + } catch (Exception e) { + // No image + } if (labelProvider instanceof IColorProvider) { itemBackground = ((IColorProvider) labelProvider).getBackground(selectedItem); } diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/DatabaseLabelProviders.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/DatabaseLabelProviders.java new file mode 100644 index 0000000000000000000000000000000000000000..6f2d2edcb7ce233ba40071ce9f58f862c5544ada --- /dev/null +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/DatabaseLabelProviders.java @@ -0,0 +1,105 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2017 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.ui.controls; + +import org.eclipse.jface.viewers.IColorProvider; +import org.eclipse.jface.viewers.LabelProvider; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.Image; +import org.jkiss.dbeaver.core.CoreMessages; +import org.jkiss.dbeaver.core.DBeaverCore; +import org.jkiss.dbeaver.model.DBIcon; +import org.jkiss.dbeaver.model.DBPDataSourceContainer; +import org.jkiss.dbeaver.model.navigator.DBNDatabaseNode; +import org.jkiss.dbeaver.model.navigator.DBNModel; +import org.jkiss.dbeaver.ui.DBeaverIcons; +import org.jkiss.dbeaver.ui.UIUtils; + +/** + * Label providers + */ +public class DatabaseLabelProviders { + + + public static final String EMPTY_SELECTION_TEXT = CoreMessages.toolbar_datasource_selector_empty; + + public static class ConnectionLabelProvider extends LabelProvider implements IColorProvider { + @Override + public Image getImage(Object element) { + if (element == null) { + return DBeaverIcons.getImage(DBIcon.TREE_DATABASE); + } + DBNModel nm = DBeaverCore.getInstance().getNavigatorModel(); + nm.ensureProjectLoaded(((DBPDataSourceContainer) element).getRegistry().getProject()); + final DBNDatabaseNode node = nm.findNode((DBPDataSourceContainer) element); + return node == null ? null : DBeaverIcons.getImage(node.getNodeIcon()); + } + + @Override + public String getText(Object element) { + if (element == null) { + return EMPTY_SELECTION_TEXT; + } + return ((DBPDataSourceContainer) element).getName(); + } + + @Override + public Color getForeground(Object element) { + return null; + } + + @Override + public Color getBackground(Object element) { + return element == null ? null : UIUtils.getConnectionColor(((DBPDataSourceContainer) element).getConnectionConfiguration()); + } + } + + public static class DatabaseLabelProvider extends LabelProvider implements IColorProvider { + @Override + public Image getImage(Object element) { + if (element == null) { + return DBeaverIcons.getImage(DBIcon.TREE_DATABASE); + } + return DBeaverIcons.getImage(((DBNDatabaseNode)element).getNodeIconDefault()); + } + + @Override + public String getText(Object element) { + if (element == null) { + return EMPTY_SELECTION_TEXT; + } + return ((DBNDatabaseNode)element).getNodeName(); + } + + @Override + public Color getForeground(Object element) { + return null; + } + + @Override + public Color getBackground(Object element) { + if (element instanceof DBNDatabaseNode) { + final DBPDataSourceContainer container = ((DBNDatabaseNode) element).getDataSourceContainer(); + if (container != null) { + return UIUtils.getConnectionColor((container.getConnectionConfiguration())); + } + } + return null; + } + } + +} \ No newline at end of file diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/ProgressPageControl.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/ProgressPageControl.java index 0f9da48d0513a59b26b6724b16fe726e0c9a08b7..49b69c9f0b36a1ce57b07d0526edb7938dff6c2d 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/ProgressPageControl.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/ProgressPageControl.java @@ -131,6 +131,9 @@ public class ProgressPageControl extends Composite implements ISearchContextProv public final void substituteProgressPanel(ProgressPageControl externalPageControl) { this.ownerPageControl = externalPageControl; + if (this.ownerPageControl != null) { + this.ownerPageControl.setChildControl(this); + } } public void createOrSubstituteProgressPanel(IWorkbenchPartSite site) { @@ -515,17 +518,12 @@ public class ProgressPageControl extends Composite implements ISearchContextProv public void activate(boolean active) { - if (active && curInfo != null) { - setInfo(curInfo); - } - - if (this.ownerPageControl != null) { - if (active) { + if (active) { + if (curInfo != null) { + setInfo(curInfo); + } + if (this.ownerPageControl != null) { this.ownerPageControl.setChildControl(this); - } else { - // Do NOT set child to NULL because deactivation usually means just focus lost - // and we don't want to deactivate page control on focus loss. - //this.ownerPageControl.setChildControl(null); } } } diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/SelectDataSourceCombo.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/SelectDataSourceCombo.java new file mode 100644 index 0000000000000000000000000000000000000000..e452e6bc4fc4b5e8205170ea9b8405e0eec4b456 --- /dev/null +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/SelectDataSourceCombo.java @@ -0,0 +1,55 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2017 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.ui.controls; + +import org.eclipse.core.resources.IProject; +import org.eclipse.jface.dialogs.IDialogConstants; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Composite; +import org.jkiss.dbeaver.model.DBPDataSourceContainer; +import org.jkiss.dbeaver.ui.dialogs.connection.SelectDataSourceDialog; + +public abstract class SelectDataSourceCombo extends CSmartSelector { + + public SelectDataSourceCombo(Composite comboGroup) { + super(comboGroup, SWT.DROP_DOWN | SWT.READ_ONLY | SWT.BORDER, new DatabaseLabelProviders.ConnectionLabelProvider()); + } + + @Override + protected void dropDown(boolean drop) { + if (!drop) { + return; + } + showConnectionSelector(); + } + + public void showConnectionSelector() { + SelectDataSourceDialog dialog = new SelectDataSourceDialog(getShell(), getActiveProject(), getSelectedItem()); + dialog.setModeless(true); + if (dialog.open() == IDialogConstants.CANCEL_ID) { + return; + } + DBPDataSourceContainer dataSource = dialog.getDataSource(); + this.select(dataSource); + onDataSourceChange(dataSource); + } + + protected abstract IProject getActiveProject(); + + protected abstract void onDataSourceChange(DBPDataSourceContainer dataSource); + +} diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/TableColumnSortListener.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/TableColumnSortListener.java index 71c98feedf3063b6275f11a4b032e06c8cce7f3a..44ab831f32097fe924e3ffa82e8d3798ae7c91bb 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/TableColumnSortListener.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/TableColumnSortListener.java @@ -17,6 +17,7 @@ package org.jkiss.dbeaver.ui.controls; import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Color; import org.eclipse.swt.widgets.*; import java.text.Collator; @@ -41,6 +42,8 @@ public class TableColumnSortListener implements Listener { { int columnCount = table.getColumnCount(); String[] values = new String[columnCount]; + Color[] foregrounds = new Color[columnCount]; + Color[] backgrounds = new Color[columnCount]; TableItem[] items = table.getItems(); for (int i = 1; i < items.length; i++) { for (int j = 0; j < i; j++) { @@ -48,6 +51,8 @@ public class TableColumnSortListener implements Listener { if (comparator.compare(item, items[j]) < 0) { for (int k = 0; k < columnCount; k++) { values[k] = item.getText(k); + foregrounds[k] = item.getForeground(k); + backgrounds[k] = item.getBackground(k); } Object data = item.getData(); boolean checked = item.getChecked(); @@ -57,6 +62,10 @@ public class TableColumnSortListener implements Listener { item.setText(values); item.setData(data); item.setChecked(checked); + for (int k = 0; k < columnCount; k++) { + if (foregrounds[k] != null) item.setForeground(k, foregrounds[k]); + if (backgrounds[k] != null) item.setBackground(k, backgrounds[k]); + } items = table.getItems(); break; } diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/folders/ITabbedFolderContainer.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/folders/ITabbedFolderContainer.java index d4a8366c533e7402a1b0cc9c9c9de953ef66ff59..92a91fe359f697c6101720b2b1cf2a39e9251f7b 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/folders/ITabbedFolderContainer.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/folders/ITabbedFolderContainer.java @@ -31,7 +31,7 @@ public interface ITabbedFolderContainer /** * Switch to specified folder ID. If folderId isnull then switches to default (fuirst) folder */ - void switchFolder(@Nullable String folderId); + boolean switchFolder(@Nullable String folderId); void addFolderListener(ITabbedFolderListener listener); diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/folders/TabbedFolderComposite.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/folders/TabbedFolderComposite.java index a5ba01f2e1010c738d2ae0feb3963ddde3e4c487..ad826bbf9fa19657fbe51e1fe8288e9e8e173733 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/folders/TabbedFolderComposite.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/folders/TabbedFolderComposite.java @@ -368,16 +368,21 @@ public class TabbedFolderComposite extends Composite implements ITabbedFolderCon } @Override - public void switchFolder(@Nullable String folderId) { + public boolean switchFolder(@Nullable String folderId) { for (FolderPane folderPane : folderPanes) { for (int i = 0; i < folderPane.folderList.getNumberOfElements(); i++) { if (folderId == null || folderPane.folderList.getElementAt(i).getInfo().getId().equals(folderId)) { - folderPane.folderList.select(i); - lastActiveFolder = folderPane; - break; + if (folderPane.folderList.getSelectionIndex() != i) { + folderPane.folderList.select(i); + lastActiveFolder = folderPane; + return true; + } else { + return false; + } } } } + return false; } @Override diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/lightgrid/LightGrid.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/lightgrid/LightGrid.java index f6c0da662ca311d782c2756ffb7b148866073cd8..f3983d4f97891602fd712454f400d3377c7cddf8 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/lightgrid/LightGrid.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/lightgrid/LightGrid.java @@ -32,7 +32,6 @@ import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.DBPImage; import org.jkiss.dbeaver.ui.UIUtils; import org.jkiss.dbeaver.ui.dnd.LocalObjectTransfer; -import org.jkiss.dbeaver.ui.dnd.TreeNodeTransfer; import org.jkiss.utils.ArrayUtils; import org.jkiss.utils.CommonUtils; import org.jkiss.utils.IntKeyMap; @@ -2578,12 +2577,7 @@ public abstract class LightGrid extends Canvas { for (Integer columnIndex : columnIndices.keySet()) { selectedColumns.add(columns.get(columnIndex)); } - Collections.sort(selectedColumns, new Comparator() { - @Override - public int compare(GridColumn o1, GridColumn o2) { - return o1.getIndex() - o2.getIndex(); - } - }); + selectedColumns.sort(Comparator.comparingInt(GridColumn::getIndex)); } /** @@ -2591,66 +2585,23 @@ public abstract class LightGrid extends Canvas { */ private void initListeners() { - disposeListener = new Listener() { - @Override - public void handleEvent(Event e) - { - onDispose(e); - } - }; + disposeListener = this::onDispose; addListener(SWT.Dispose, disposeListener); - addPaintListener(new PaintListener() { - @Override - public void paintControl(PaintEvent e) - { - onPaint(e); - } - }); - - addListener(SWT.Resize, new Listener() { - @Override - public void handleEvent(Event e) - { - onResize(); - } - }); + addPaintListener(this::onPaint); + addListener(SWT.Resize, e -> onResize()); if (getVerticalBar() != null) { - getVerticalBar().addListener(SWT.Selection, new Listener() { - @Override - public void handleEvent(Event e) - { - onScrollSelection(); - } - }); + getVerticalBar().addListener(SWT.Selection, e -> onScrollSelection()); } if (getHorizontalBar() != null) { - getHorizontalBar().addListener(SWT.Selection, new Listener() { - @Override - public void handleEvent(Event e) - { - onScrollSelection(); - } - }); + getHorizontalBar().addListener(SWT.Selection, e -> onScrollSelection()); } - addListener(SWT.KeyDown, new Listener() { - @Override - public void handleEvent(Event e) - { - onKeyDown(e); - } - }); + addListener(SWT.KeyDown, this::onKeyDown); - addTraverseListener(new TraverseListener() { - @Override - public void keyTraversed(TraverseEvent e) - { - e.doit = true; - } - }); + addTraverseListener(e -> e.doit = true); addMouseListener(new MouseListener() { @Override @@ -2672,13 +2623,7 @@ public abstract class LightGrid extends Canvas { } }); - addMouseMoveListener(new MouseMoveListener() { - @Override - public void mouseMove(MouseEvent e) - { - onMouseMove(e); - } - }); + addMouseMoveListener(this::onMouseMove); addMouseTrackListener(new MouseTrackListener() { @Override @@ -2715,13 +2660,7 @@ public abstract class LightGrid extends Canvas { // Special code to reflect mouse wheel events if using an external // scroller - addListener(SWT.MouseWheel, new Listener() { - @Override - public void handleEvent(Event e) - { - onMouseWheel(e); - } - }); + addListener(SWT.MouseWheel, this::onMouseWheel); } private void onFocusIn() @@ -2979,12 +2918,7 @@ public abstract class LightGrid extends Canvas { if (focusItem > row) { focusItem = row; } - for (Iterator iter = selectedCells.iterator(); iter.hasNext(); ) { - GridPos pos = iter.next(); - if (pos.row > row) { - iter.remove(); - } - } + selectedCells.removeIf(pos -> pos.row > row); updateSelectionCache(); computeHeaderSizes(); this.scrollValuesObsolete = true; diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/querylog/QueryLogCommandHandler.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/querylog/QueryLogCommandHandler.java index d5510b6ef5c6b7e792a19c1d91a776f227ea033d..e21dc1a297d5e973c6747ddedf152837519a4bc7 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/querylog/QueryLogCommandHandler.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/querylog/QueryLogCommandHandler.java @@ -51,16 +51,19 @@ public class QueryLogCommandHandler extends AbstractHandler { } String actionId = event.getCommand().getId(); - if (actionId.equals(IWorkbenchCommandConstants.EDIT_SELECT_ALL)) { - logViewer.selectAll(); - return null; - } - if (actionId.equals(IWorkbenchCommandConstants.EDIT_COPY)) { - logViewer.copySelectionToClipboard(false); - return null; - } else if (actionId.equals(CoreCommands.CMD_COPY_SPECIAL)) { - logViewer.copySelectionToClipboard(true); - return null; + switch (actionId) { + case IWorkbenchCommandConstants.EDIT_SELECT_ALL: + logViewer.selectAll(); + return null; + case IWorkbenchCommandConstants.EDIT_COPY: + logViewer.copySelectionToClipboard(false); + return null; + case CoreCommands.CMD_COPY_SPECIAL: + logViewer.copySelectionToClipboard(true); + return null; + case IWorkbenchCommandConstants.FILE_REFRESH: + logViewer.refresh(); + return null; } return null; } diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/querylog/QueryLogViewer.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/querylog/QueryLogViewer.java index 74abc58e349dc4242f6689ceb107547a7759e513..c9a798d6ba3bdf03dc568ae02ffac64d294bda67 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/querylog/QueryLogViewer.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/querylog/QueryLogViewer.java @@ -1,7 +1,6 @@ /* * DBeaver - Universal Database Manager - * Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org) - * Copyright (C) 2011-2012 Eugene Fradkin (eugene.fradkin@gmail.com) + * Copyright (C) 2010-2018 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. @@ -19,12 +18,7 @@ package org.jkiss.dbeaver.ui.controls.querylog; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; -import org.eclipse.core.runtime.jobs.IJobChangeEvent; -import org.eclipse.core.runtime.jobs.JobChangeAdapter; -import org.eclipse.jface.action.Action; -import org.eclipse.jface.action.IAction; -import org.eclipse.jface.action.MenuManager; -import org.eclipse.jface.action.Separator; +import org.eclipse.jface.action.*; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.IDialogSettings; import org.eclipse.jface.resource.ColorRegistry; @@ -45,36 +39,43 @@ import org.eclipse.swt.widgets.*; import org.eclipse.ui.IWorkbenchCommandConstants; import org.eclipse.ui.IWorkbenchPartSite; import org.jkiss.code.NotNull; +import org.jkiss.code.Nullable; +import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.core.CoreCommands; import org.jkiss.dbeaver.core.CoreMessages; import org.jkiss.dbeaver.core.DBeaverCore; import org.jkiss.dbeaver.core.DBeaverUI; -import org.jkiss.dbeaver.model.DBConstants; import org.jkiss.dbeaver.model.DBPDataSourceContainer; import org.jkiss.dbeaver.model.exec.DBCExecutionContext; +import org.jkiss.dbeaver.model.exec.DBCExecutionPurpose; import org.jkiss.dbeaver.model.preferences.DBPPreferenceListener; import org.jkiss.dbeaver.model.preferences.DBPPreferenceStore; import org.jkiss.dbeaver.model.qm.*; import org.jkiss.dbeaver.model.qm.meta.*; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; +import org.jkiss.dbeaver.model.runtime.load.AbstractLoadService; import org.jkiss.dbeaver.model.sql.SQLConstants; import org.jkiss.dbeaver.model.sql.SQLDialect; import org.jkiss.dbeaver.registry.DataSourceRegistry; import org.jkiss.dbeaver.runtime.qm.DefaultEventFilter; import org.jkiss.dbeaver.ui.*; +import org.jkiss.dbeaver.ui.controls.ProgressLoaderVisualizer; import org.jkiss.dbeaver.ui.controls.TableColumnSortListener; import org.jkiss.dbeaver.ui.dialogs.sql.BaseSQLDialog; import org.jkiss.dbeaver.ui.editors.sql.handlers.OpenHandler; import org.jkiss.dbeaver.utils.GeneralUtils; +import org.jkiss.dbeaver.utils.PrefUtils; +import org.jkiss.dbeaver.utils.RuntimeUtils; +import org.jkiss.utils.ArrayUtils; import org.jkiss.utils.CommonUtils; import org.jkiss.utils.LongKeyMap; +import java.lang.reflect.InvocationTargetException; import java.text.DateFormat; import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.Locale; +import java.util.*; +import java.util.List; /** * QueryLogViewer @@ -87,7 +88,7 @@ public class QueryLogViewer extends Viewer implements QMMetaListener, DBPPrefere private static final String VIEWER_ID = "DBeaver.QM.LogViewer"; private static final int MIN_ENTRIES_PER_PAGE = 1; - public static final String COLOR_COMMITTED = "org.jkiss.dbeaver.txn.color.committed.background"; //= new RGB(0xBD, 0xFE, 0xBF); + public static final String COLOR_UNCOMMITTED = "org.jkiss.dbeaver.txn.color.committed.background"; //= new RGB(0xBD, 0xFE, 0xBF); public static final String COLOR_REVERTED = "org.jkiss.dbeaver.txn.color.reverted.background"; // = new RGB(0xFF, 0x63, 0x47); public static final String COLOR_TRANSACTION = "org.jkiss.dbeaver.txn.color.transaction.background"; // = new RGB(0xFF, 0xE4, 0xB5); @@ -121,8 +122,8 @@ public class QueryLogViewer extends Viewer implements QMMetaListener, DBPPrefere } private LogColumn COLUMN_TIME = new LogColumn("time", CoreMessages.controls_querylog_column_time_name, CoreMessages.controls_querylog_column_time_tooltip, 80) { - private final DateFormat timeFormat = new SimpleDateFormat(DBConstants.DEFAULT_TIME_FORMAT, Locale.getDefault()); //$NON-NLS-1$ - private final DateFormat timestampFormat = new SimpleDateFormat(DBConstants.DEFAULT_TIMESTAMP_FORMAT, Locale.getDefault()); //$NON-NLS-1$ + private final DateFormat timeFormat = new SimpleDateFormat("MMM-dd HH:mm:ss", Locale.getDefault()); //$NON-NLS-1$ + private final DateFormat timestampFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS", Locale.getDefault()); //$NON-NLS-1$ @Override String getText(QMMetaEvent event) { @@ -147,7 +148,8 @@ public class QueryLogViewer extends Viewer implements QMMetaListener, DBPPrefere if (object instanceof QMMStatementExecuteInfo) { QMMStatementExecuteInfo statement = (QMMStatementExecuteInfo) object; //return SQLUtils.stripTransformations(statement.getQueryString()); - return CommonUtils.truncateString(statement.getQueryString(), 4000); + return CommonUtils.truncateString( + CommonUtils.notEmpty(statement.getQueryString()), 4000); } else if (object instanceof QMMTransactionInfo) { if (((QMMTransactionInfo) object).isCommitted()) { return CoreMessages.controls_querylog_commit; @@ -306,6 +308,7 @@ public class QueryLogViewer extends Viewer implements QMMetaListener, DBPPrefere }; private final IWorkbenchPartSite site; + private final Text searchText; private Table logTable; private java.util.List columns = new ArrayList<>(); private LongKeyMap objectToItemMap = new LongKeyMap<>(); @@ -317,9 +320,12 @@ public class QueryLogViewer extends Viewer implements QMMetaListener, DBPPrefere private final Color colorLightGreen; private final Color colorLightRed; private final Color colorLightYellow; + private final Color shadowColor; private final Font boldFont; + private final Font hintFont; private DragSource dndSource; + private volatile boolean reloadInProgress = false; private int entriesPerPage = MIN_ENTRIES_PER_PAGE; @@ -333,12 +339,29 @@ public class QueryLogViewer extends Viewer implements QMMetaListener, DBPPrefere ColorRegistry colorRegistry = site.getWorkbenchWindow().getWorkbench().getThemeManager().getCurrentTheme().getColorRegistry(); - colorLightGreen = colorRegistry.get(COLOR_COMMITTED); + colorLightGreen = colorRegistry.get(COLOR_UNCOMMITTED); colorLightRed = colorRegistry.get(COLOR_REVERTED); colorLightYellow = colorRegistry.get(COLOR_TRANSACTION); + shadowColor = parent.getDisplay().getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW); boldFont = UIUtils.makeBoldFont(parent.getFont()); + hintFont = UIUtils.modifyFont(parent.getFont(), SWT.ITALIC); boolean inDialog = UIUtils.isInDialog(parent); + // Search field + this.searchText = new Text(parent, SWT.BORDER); + this.searchText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + this.searchText.addPaintListener(e -> { + if (searchText.isEnabled() && searchText.getCharCount() == 0) { + e.gc.setForeground(shadowColor); + e.gc.setFont(hintFont); + e.gc.drawText("Type query part to search in query history", + 2, 0, true); + e.gc.setFont(null); + } + }); + this.searchText.addModifyListener(e -> scheduleLogRefresh()); + UIUtils.enableHostEditorKeyBindingsSupport(site, searchText); + // Create log table logTable = new Table( parent, @@ -384,14 +407,30 @@ public class QueryLogViewer extends Viewer implements QMMetaListener, DBPPrefere this.filter = filter; - reloadEvents(); - // Make sure app is initialized DBeaverCore.getInstance(); // Register QM listener QMUtils.registerMetaListener(this); DBeaverCore.getGlobalPreferenceStore().addPropertyChangeListener(this); + + logTable.addListener(SWT.Resize, new Listener() { + @Override + public void handleEvent(Event event) { + logTable.removeListener(SWT.Resize, this); + reloadEvents(null); + } + }); + } + + private synchronized void scheduleLogRefresh() { + // Many properties could be changed at once + // So here we just schedule single refresh job + if (logRefreshJob == null) { + logRefreshJob = new LogRefreshJob(); + } + logRefreshJob.cancel(); + logRefreshJob.schedule(500); } public void setFilter(QMEventFilter filter) { @@ -452,6 +491,7 @@ public class QueryLogViewer extends Viewer implements QMMetaListener, DBPPrefere UIUtils.dispose(dndSource); UIUtils.dispose(logTable); UIUtils.dispose(boldFont); + UIUtils.dispose(hintFont); } @Override @@ -490,7 +530,7 @@ public class QueryLogViewer extends Viewer implements QMMetaListener, DBPPrefere @Override public void refresh() { - reloadEvents(); + reloadEvents(searchText.getText()); } private static String getObjectType(QMMObject object) @@ -504,7 +544,7 @@ public class QueryLogViewer extends Viewer implements QMMetaListener, DBPPrefere } else { statement = ((QMMStatementExecuteInfo)object).getStatement(); } - return "SQL" + (statement == null ? "" : " / " + statement.getPurpose().name()); //$NON-NLS-1$ + return "SQL" + (statement == null ? "" : " / " + CommonUtils.capitalizeWord(statement.getPurpose().getTitle())); //$NON-NLS-1$ // } else if (object instanceof QMMStatementScripInfo) { // return CoreMessages.controls_querylog_script; } else if (object instanceof QMMTransactionInfo) { @@ -555,11 +595,11 @@ public class QueryLogViewer extends Viewer implements QMMetaListener, DBPPrefere } QMMTransactionSavepointInfo savepoint = exec.getSavepoint(); if (savepoint == null) { - return colorLightGreen; + return null; } else if (savepoint.isClosed()) { return savepoint.isCommitted() ? colorLightGreen : colorLightYellow; } else { - return null; + return colorLightGreen; } } else if (event.getObject() instanceof QMMTransactionInfo || event.getObject() instanceof QMMTransactionSavepointInfo) { QMMTransactionSavepointInfo savepoint; @@ -568,24 +608,36 @@ public class QueryLogViewer extends Viewer implements QMMetaListener, DBPPrefere } else { savepoint = (QMMTransactionSavepointInfo) event.getObject(); } - return savepoint.isCommitted() ? colorLightGreen : colorLightYellow; + return savepoint.isCommitted() ? null : colorLightYellow; } return null; } - private void reloadEvents() + private void reloadEvents(@Nullable String searchString) { + if (reloadInProgress) { + log.debug("Event reload is in progress. Skip"); + return; + } + reloadInProgress = true; DBPPreferenceStore store = DBeaverCore.getGlobalPreferenceStore(); this.entriesPerPage = Math.max(MIN_ENTRIES_PER_PAGE, store.getInt(QMConstants.PROP_ENTRIES_PER_PAGE)); this.defaultFilter = new DefaultEventFilter(); clearLog(); - updateMetaInfo(QMUtils.getPastMetaEvents()); + + // Extract events + + EventHistoryReadService loadingService = new EventHistoryReadService(searchString); + LoadingJob.createService( + loadingService, + new EvenHistoryReadVisualizer(loadingService)) + .schedule(); } @Override - public void metaInfoChanged(@NotNull final java.util.List events) { + public void metaInfoChanged(DBRProgressMonitor monitor, @NotNull final List events) { if (DBeaverCore.isClosing()) { return; } @@ -593,7 +645,7 @@ public class QueryLogViewer extends Viewer implements QMMetaListener, DBPPrefere DBeaverUI.asyncExec(() -> updateMetaInfo(events)); } - private synchronized void updateMetaInfo(final java.util.List events) + private synchronized void updateMetaInfo(final List events) { if (logTable.isDisposed()) { return; @@ -602,12 +654,12 @@ public class QueryLogViewer extends Viewer implements QMMetaListener, DBPPrefere try { // Add events in reverse order int itemIndex = 0; - for (int i = events.size(); i > 0; i--) { + for (int i = 0; i < events.size(); i++) { if (useDefaultFilter && itemIndex >= entriesPerPage) { // Do not add remaining (older) events - they don't fit page anyway break; } - QMMetaEvent event = events.get(i - 1); + QMMetaEvent event = events.get(i); if ((filter != null && !filter.accept(event)) || (useDefaultFilter && !defaultFilter.accept(event))) { continue; } @@ -759,13 +811,69 @@ public class QueryLogViewer extends Viewer implements QMMetaListener, DBPPrefere manager.add(copyAllAction); manager.add(selectAllAction); manager.add(clearLogAction); + manager.add(ActionUtils.makeCommandContribution(site, IWorkbenchCommandConstants.FILE_REFRESH)); //manager.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS)); + + manager.add(new Separator()); + createFiltersMenu(manager); }); menuMgr.setRemoveAllWhenShown(true); logTable.setMenu(menu); site.registerContextMenu(menuMgr, this); } + private void createFiltersMenu(IMenuManager manager) { + DBPPreferenceStore store = DBeaverCore.getGlobalPreferenceStore(); + QMEventCriteria criteria = QMUtils.createDefaultCriteria(store); + for (DBCExecutionPurpose purpose : DBCExecutionPurpose.values()) { + IAction toggleAction = new Action(purpose.getTitle(), Action.AS_CHECK_BOX) { + @Override + public boolean isChecked() { + return criteria.hasQueryType(purpose); + } + @Override + public void run() { + DBCExecutionPurpose[] queryTypes = criteria.getQueryTypes(); + if (isChecked()) { + queryTypes = ArrayUtils.remove(DBCExecutionPurpose.class, queryTypes, purpose); + } else { + queryTypes = ArrayUtils.add(DBCExecutionPurpose.class, queryTypes, purpose); + } + List typeNames = new ArrayList<>(queryTypes.length); + for (DBCExecutionPurpose queryType : queryTypes) typeNames.add(queryType.name()); + store.setValue(QMConstants.PROP_QUERY_TYPES, CommonUtils.makeString(typeNames, ',')); + PrefUtils.savePreferenceStore(store); + scheduleLogRefresh(); + } + }; + manager.add(toggleAction); + } + manager.add(new Separator()); + for (QMObjectType type : QMObjectType.values()) { + IAction toggleAction = new Action(type.getTitle(), Action.AS_CHECK_BOX) { + @Override + public boolean isChecked() { + return criteria.hasObjectType(type); + } + @Override + public void run() { + QMObjectType[] objectTypes = criteria.getObjectTypes(); + if (isChecked()) { + objectTypes = ArrayUtils.remove(QMObjectType.class, objectTypes, type); + } else { + objectTypes = ArrayUtils.add(QMObjectType.class, objectTypes, type); + } + List typeList = new ArrayList<>(); + Collections.addAll(typeList, objectTypes); + store.setValue(QMConstants.PROP_OBJECT_TYPES, QMObjectType.toString(typeList)); + PrefUtils.savePreferenceStore(store); + scheduleLogRefresh(); + } + }; + manager.add(toggleAction); + } + } + private void openSelectionInEditor() { DBPDataSourceContainer dsContainer = null; StringBuilder sql = new StringBuilder(); @@ -890,37 +998,25 @@ public class QueryLogViewer extends Viewer implements QMMetaListener, DBPPrefere return NLS.bind(CoreMessages.controls_querylog_format_minutes, String.valueOf(min), String.valueOf(sec)); } - private ConfigRefreshJob configRefreshJob = null; + private LogRefreshJob logRefreshJob = null; @Override public synchronized void preferenceChange(PreferenceChangeEvent event) { if (event.getProperty().startsWith(QMConstants.PROP_PREFIX)) { - // Many properties could be changed at once - // So here we just schedule single refresh job - if (configRefreshJob == null) { - configRefreshJob = new ConfigRefreshJob(); - configRefreshJob.schedule(250); - configRefreshJob.addJobChangeListener(new JobChangeAdapter() { - @Override - public void done(IJobChangeEvent event) - { - configRefreshJob = null; - } - }); - } + scheduleLogRefresh(); } } - private class ConfigRefreshJob extends AbstractUIJob { - ConfigRefreshJob() + private class LogRefreshJob extends AbstractUIJob { + LogRefreshJob() { super(CoreMessages.controls_querylog_job_refresh); } @Override protected IStatus runInUIThread(DBRProgressMonitor monitor) { - reloadEvents(); + refresh(); return Status.OK_STATUS; } } @@ -1004,7 +1100,10 @@ public class QueryLogViewer extends Viewer implements QMMetaListener, DBPPrefere @Override protected SQLDialect getSQLDialect() { if (object.getObject() instanceof QMMStatementExecuteInfo) { - return ((QMMStatementExecuteInfo) object.getObject()).getStatement().getSession().getSQLDialect(); + SQLDialect dialect = ((QMMStatementExecuteInfo) object.getObject()).getStatement().getSession().getSQLDialect(); + if (dialect != null) { + return dialect; + } } return super.getSQLDialect(); } @@ -1025,4 +1124,74 @@ public class QueryLogViewer extends Viewer implements QMMetaListener, DBPPrefere } } + class EventHistoryReadService extends AbstractLoadService> { + + @Nullable + private String searchString; + + protected EventHistoryReadService(@Nullable String searchString) { + super("Load query history"); + this.searchString = searchString; + } + + @Override + public List evaluate(DBRProgressMonitor monitor) throws InvocationTargetException, InterruptedException { + final List events = new ArrayList<>(); + QMEventBrowser eventBrowser = QMUtils.getEventBrowser(); + if (eventBrowser != null) { + QMEventCriteria criteria = QMUtils.createDefaultCriteria(DBeaverCore.getGlobalPreferenceStore()); + criteria.setSearchString(CommonUtils.isEmptyTrimmed(searchString) ? null : searchString.trim()); + + monitor.beginTask("Load query history", 1); + if (!CommonUtils.isEmpty(searchString)) { + monitor.subTask("Search queries: " + searchString); + } else { + monitor.subTask("Load all queries"); + } + try (QMEventCursor cursor = eventBrowser.getQueryHistoryCursor(monitor, criteria)) { + while (events.size() < entriesPerPage && cursor.hasNextEvent(monitor)) { + if (monitor.isCanceled()) { + break; + } + events.add(cursor.nextEvent(monitor)); + monitor.subTask(events.get(events.size() - 1).toString()); + } + } catch (DBException e) { + throw new InvocationTargetException(e); + } + monitor.done(); + } + return events; + } + + @Override + public Object getFamily() { + return QueryLogViewer.class; + } + + } + + private class EvenHistoryReadVisualizer extends ProgressLoaderVisualizer> { + public EvenHistoryReadVisualizer(EventHistoryReadService loadingService) { + super(loadingService, logTable); + } + + @Override + public void visualizeLoading() { + reloadInProgress = true; + super.visualizeLoading(); + } + + @Override + public void completeLoading(List result) { + try { + super.completeLoading(result); + super.visualizeLoading(); + updateMetaInfo(result); + } finally { + reloadInProgress = false; + } + } + } + } \ No newline at end of file diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetCommandHandler.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetCommandHandler.java index fa211f9050d15a63a4ebb32753e904ab5e5e6880..d58082d1b1e23e18db65a4302b13a2b5058e9d33 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetCommandHandler.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetCommandHandler.java @@ -51,7 +51,6 @@ import org.jkiss.dbeaver.model.data.DBDDisplayFormat; import org.jkiss.dbeaver.model.edit.DBEPersistAction; import org.jkiss.dbeaver.model.runtime.AbstractJob; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; -import org.jkiss.dbeaver.model.runtime.DBRRunnableWithProgress; import org.jkiss.dbeaver.model.sql.SQLUtils; import org.jkiss.dbeaver.runtime.ui.DBUserInterface; import org.jkiss.dbeaver.tools.transfer.IDataTransferProducer; @@ -231,13 +230,10 @@ public class ResultSetCommandHandler extends AbstractHandler { try { final List sqlScript = new ArrayList<>(); try { - DBeaverUI.runInProgressService(new DBRRunnableWithProgress() { - @Override - public void run(DBRProgressMonitor monitor) throws InvocationTargetException, InterruptedException { - List script = rsv.generateChangesScript(monitor); - if (script != null) { - sqlScript.addAll(script); - } + DBeaverUI.runInProgressService(monitor -> { + List script = rsv.generateChangesScript(monitor); + if (script != null) { + sqlScript.addAll(script); } }); } catch (InterruptedException e) { @@ -384,20 +380,17 @@ public class ResultSetCommandHandler extends AbstractHandler { "Go to Row", "Enter row number (1.." + rowCount + ")", String.valueOf(currentRow == null ? 1 : currentRow.getVisualNumber() + 1), - new IInputValidator() { - @Override - public String isValid(String input) { - try { - int i = Integer.parseInt(input); - if (i <= 0 || rowCount < i) { - return "Row number is out of range"; - } - } catch (NumberFormatException x) { - return "Not a number"; + input -> { + try { + int i = Integer.parseInt(input); + if (i <= 0 || rowCount < i) { + return "Row number is out of range"; } - - return null; + } catch (NumberFormatException x) { + return "Not a number"; } + + return null; }); if (d.open() == Window.OK) { int line = Integer.parseInt(d.getValue()); diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetDataContainer.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetDataContainer.java index a0273743463212f289faa11e28719fb95a0a9f0e..2db8944fe9cf2153a952bd961fefcf3ffe508d30 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetDataContainer.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetDataContainer.java @@ -217,20 +217,17 @@ public class ResultSetDataContainer implements DBSDataContainer, IAdaptable { @Override public DBCResultSetMetaData getMeta() throws DBCException { - return new DBCResultSetMetaData() { - @Override - public List getAttributes() { - List attributes = model.getVisibleAttributes(); - List meta = new ArrayList<>(attributes.size()); - boolean selectedColumnsOnly = proceedSelectedColumnsOnly(); - for (DBDAttributeBinding attribute : attributes) { - DBCAttributeMetaData metaAttribute = attribute.getMetaAttribute(); - if (!selectedColumnsOnly || options.getSelectedColumns().contains(metaAttribute.getName())) { - meta.add(metaAttribute); - } + return () -> { + List attributes = model.getVisibleAttributes(); + List meta = new ArrayList<>(attributes.size()); + boolean selectedColumnsOnly = proceedSelectedColumnsOnly(); + for (DBDAttributeBinding attribute : attributes) { + DBCAttributeMetaData metaAttribute = attribute.getMetaAttribute(); + if (!selectedColumnsOnly || options.getSelectedColumns().contains(metaAttribute.getName())) { + meta.add(metaAttribute); } - return meta; } + return meta; }; } diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetDataReceiver.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetDataReceiver.java index ead2c2ee5d61d4c8968d99b885661d02983c69df..cea8070824aa881c822b7c7a22e385111c9b6ca8 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetDataReceiver.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetDataReceiver.java @@ -22,6 +22,8 @@ import org.jkiss.dbeaver.model.DBUtils; import org.jkiss.dbeaver.model.data.DBDAttributeBindingMeta; import org.jkiss.dbeaver.model.data.DBDDataReceiver; import org.jkiss.dbeaver.model.exec.*; +import org.jkiss.dbeaver.model.struct.DBSDataContainer; +import org.jkiss.dbeaver.model.struct.DBSEntity; import java.util.ArrayList; import java.util.HashMap; @@ -140,7 +142,12 @@ class ResultSetDataReceiver implements DBDDataReceiver { if (!nextSegmentRead) { try { // Read locators' metadata - ResultSetUtils.bindAttributes(session, resultSet, metaColumns, rows); + DBSEntity entity = null; + DBSDataContainer dataContainer = resultSetViewer.getDataContainer(); + if (dataContainer instanceof DBSEntity) { + entity = (DBSEntity) dataContainer; + } + ResultSetUtils.bindAttributes(session, entity, resultSet, metaColumns, rows); } catch (Throwable e) { errorList.add(e); } @@ -149,22 +156,19 @@ class ResultSetDataReceiver implements DBDDataReceiver { final List tmpRows = rows; final boolean nextSegmentRead = this.nextSegmentRead; - DBeaverUI.syncExec(new Runnable() { - @Override - public void run() { - // Push data into viewer - if (!nextSegmentRead) { - resultSetViewer.updatePresentation(resultSet); - resultSetViewer.setData(tmpRows, focusRow); - resultSetViewer.getActivePresentation().refreshData(true, false, !resultSetViewer.getModel().isMetadataChanged()); - } else { - resultSetViewer.appendData(tmpRows); - resultSetViewer.getActivePresentation().refreshData(false, true, true); - } - resultSetViewer.updateStatusMessage(); - // Check for more data - hasMoreData = maxRows > 0 && tmpRows.size() >= maxRows; + DBeaverUI.syncExec(() -> { + // Push data into viewer + if (!nextSegmentRead) { + resultSetViewer.updatePresentation(resultSet); + resultSetViewer.setData(tmpRows, focusRow); + resultSetViewer.getActivePresentation().refreshData(true, false, !resultSetViewer.getModel().isMetadataChanged()); + } else { + resultSetViewer.appendData(tmpRows); + resultSetViewer.getActivePresentation().refreshData(false, true, true); } + resultSetViewer.updateStatusMessage(); + // Check for more data + hasMoreData = maxRows > 0 && tmpRows.size() >= maxRows; }); } diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetFilterPanel.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetFilterPanel.java index f0eae3d122ccb9548af89f3438e4ab331ada7876..72dda78dc27e5201099550d1b28de8edde8d2d2b 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetFilterPanel.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetFilterPanel.java @@ -45,7 +45,6 @@ import org.jkiss.dbeaver.model.data.DBDDataFilter; import org.jkiss.dbeaver.model.exec.DBCExecutionContext; import org.jkiss.dbeaver.model.exec.DBCStatistics; import org.jkiss.dbeaver.model.navigator.DBNDatabaseNode; -import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.dbeaver.model.runtime.DBRRunnableWithProgress; import org.jkiss.dbeaver.model.runtime.SystemJob; import org.jkiss.dbeaver.model.sql.SQLSyntaxManager; @@ -64,7 +63,6 @@ import org.jkiss.dbeaver.ui.editors.sql.syntax.SQLWordPartDetector; import org.jkiss.dbeaver.utils.GeneralUtils; import org.jkiss.utils.CommonUtils; -import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -151,20 +149,17 @@ class ResultSetFilterPanel extends Composite implements IContentProposalProvider // Register filters text in focus service UIUtils.addDefaultEditActionsSupport(viewer.getSite(), this.filtersText); - this.filtersText.addPaintListener(new PaintListener() { - @Override - public void paintControl(PaintEvent e) { - /*if (viewer.getModel().hasData())*/ { - final boolean supportsDataFilter = viewer.supportsDataFilter(); - if (!supportsDataFilter || (filtersText.isEnabled() && filtersText.getCharCount() == 0)) { - e.gc.setForeground(shadowColor); - e.gc.setFont(hintFont); - e.gc.drawText(supportsDataFilter ? - CoreMessages.sql_editor_resultset_filter_panel_text_enter_sql_to_filter: - CoreMessages.sql_editor_resultset_filter_panel_text_enter_filter_not_support, - 2, 0, true); - e.gc.setFont(null); - } + this.filtersText.addPaintListener(e -> { + /*if (viewer.getModel().hasData())*/ { + final boolean supportsDataFilter = viewer.supportsDataFilter(); + if (!supportsDataFilter || (filtersText.isEnabled() && filtersText.getCharCount() == 0)) { + e.gc.setForeground(shadowColor); + e.gc.setFont(hintFont); + e.gc.drawText(supportsDataFilter ? + CoreMessages.sql_editor_resultset_filter_panel_text_enter_sql_to_filter: + CoreMessages.sql_editor_resultset_filter_panel_text_enter_filter_not_support, + 2, 0, true); + e.gc.setFont(null); } } }); @@ -274,15 +269,11 @@ class ResultSetFilterPanel extends Composite implements IContentProposalProvider historyForwardButton.addSelectionListener(new HistoryMenuListener(historyForwardButton, false)); } - this.addTraverseListener(new TraverseListener() { - @Override - public void keyTraversed(TraverseEvent e) - { - if (e.detail == SWT.TRAVERSE_RETURN) { - setCustomDataFilter(); - e.doit = false; - e.detail = SWT.TRAVERSE_NONE; - } + this.addTraverseListener(e -> { + if (e.detail == SWT.TRAVERSE_RETURN) { + setCustomDataFilter(); + e.doit = false; + e.detail = SWT.TRAVERSE_NONE; } }); @@ -449,7 +440,7 @@ class ResultSetFilterPanel extends Composite implements IContentProposalProvider private void loadFiltersHistory(String query) { filtersHistory.clear(); try { - final Collection history = ResultSetViewer.getFilterManager().getQueryFilterHistory(query); + final Collection history = viewer.getFilterManager().getQueryFilterHistory(query); filtersHistory.addAll(history); } catch (Throwable e) { log.debug("Error reading history", e); @@ -484,7 +475,7 @@ class ResultSetFilterPanel extends Composite implements IContentProposalProvider filtersHistory.add(whereCondition); if (!oldFilter) { try { - ResultSetViewer.getFilterManager().saveQueryFilterValue(getActiveSourceQuery(), whereCondition); + viewer.getFilterManager().saveQueryFilterValue(getActiveSourceQuery(), whereCondition); } catch (Throwable e) { log.debug("Error saving filter", e); } @@ -587,20 +578,17 @@ class ResultSetFilterPanel extends Composite implements IContentProposalProvider final String word = wordDetector.getFullWord().toLowerCase(Locale.ENGLISH); final List proposals = new ArrayList<>(); - final DBRRunnableWithProgress reader = new DBRRunnableWithProgress() { - @Override - public void run(DBRProgressMonitor monitor) throws InvocationTargetException, InterruptedException { - for (DBDAttributeBinding attribute : viewer.getModel().getAttributes()) { - final String name = DBUtils.getUnQuotedIdentifier(attribute.getDataSource(), attribute.getName()); - if (CommonUtils.isEmpty(word) || name.toLowerCase(Locale.ENGLISH).startsWith(word)) { - final String content = DBUtils.getQuotedIdentifier(attribute) + " "; - proposals.add( - new ContentProposal( - content, - attribute.getName(), - SQLContextInformer.makeObjectDescription(monitor, attribute.getAttribute(), false), - content.length())); - } + final DBRRunnableWithProgress reader = monitor -> { + for (DBDAttributeBinding attribute : viewer.getModel().getAttributes()) { + final String name = DBUtils.getUnQuotedIdentifier(attribute.getDataSource(), attribute.getName()); + if (CommonUtils.isEmpty(word) || name.toLowerCase(Locale.ENGLISH).startsWith(word)) { + final String content = DBUtils.getQuotedIdentifier(attribute) + " "; + proposals.add( + new ContentProposal( + content, + attribute.getName(), + SQLContextInformer.makeObjectDescription(monitor, attribute.getAttribute(), false), + content.length())); } } }; @@ -870,7 +858,7 @@ class ResultSetFilterPanel extends Composite implements IContentProposalProvider if (e.keyCode == SWT.DEL) { final String filterValue = item.getText(); try { - ResultSetViewer.getFilterManager().deleteQueryFilterValue(getActiveSourceQuery(), filterValue); + viewer.getFilterManager().deleteQueryFilterValue(getActiveSourceQuery(), filterValue); } catch (DBException e1) { log.warn("Error deleting filter value [" + filterValue + "]", e1); } diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetModel.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetModel.java index 5922f8d7bcd7d3c0e1ef2d079c4766b99d667b66..6bddbb6249b9ef0f80f1cd2e9bffcd4b1031b16b 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetModel.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetModel.java @@ -21,17 +21,17 @@ import org.eclipse.core.runtime.Status; import org.eclipse.swt.graphics.Color; import org.jkiss.code.NotNull; import org.jkiss.code.Nullable; +import org.jkiss.dbeaver.DBeaverPreferences; import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.DBPDataKind; +import org.jkiss.dbeaver.model.DBPDataSourceContainer; import org.jkiss.dbeaver.model.DBUtils; import org.jkiss.dbeaver.model.data.*; import org.jkiss.dbeaver.model.exec.*; import org.jkiss.dbeaver.model.exec.trace.DBCTrace; import org.jkiss.dbeaver.model.runtime.AbstractJob; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; -import org.jkiss.dbeaver.model.struct.DBSAttributeBase; -import org.jkiss.dbeaver.model.struct.DBSDataManipulator; -import org.jkiss.dbeaver.model.struct.DBSEntity; +import org.jkiss.dbeaver.model.struct.*; import org.jkiss.dbeaver.model.virtual.DBVColorOverride; import org.jkiss.dbeaver.model.virtual.DBVEntity; import org.jkiss.dbeaver.model.virtual.DBVUtils; @@ -544,7 +544,7 @@ public class ResultSetModel { this.dataFilter = createDataFilter(); updateDataFilter(prevFilter); } - Collections.sort(this.visibleAttributes, POSITION_SORTER); + this.visibleAttributes.sort(POSITION_SORTER); { // Check single source flag @@ -597,11 +597,8 @@ public class ResultSetModel { for (DBVColorOverride co : coList) { DBDAttributeBinding binding = getAttributeBinding(entity, co.getAttributeName()); if (binding != null) { - List cmList = colorMapping.get(binding); - if (cmList == null) { - cmList = new ArrayList<>(); - colorMapping.put(binding, cmList); - } + List cmList = + colorMapping.computeIfAbsent(binding, k -> new ArrayList<>()); cmList.add(new AttributeColorSettings(co)); } } @@ -724,12 +721,7 @@ public class ResultSetModel { if (rows != null && !rows.isEmpty()) { // Remove rows (in descending order to prevent concurrent modification errors) List rowsToRemove = new ArrayList<>(rows); - Collections.sort(rowsToRemove, new Comparator() { - @Override - public int compare(ResultSetRow o1, ResultSetRow o2) { - return o1.getVisualNumber() - o2.getVisualNumber(); - } - }); + rowsToRemove.sort(Comparator.comparingInt(ResultSetRow::getVisualNumber)); for (ResultSetRow row : rowsToRemove) { cleanupRow(row); } @@ -858,7 +850,7 @@ public class ResultSetModel { } } - Collections.sort(this.visibleAttributes, POSITION_SORTER); + this.visibleAttributes.sort(POSITION_SORTER); this.dataFilter.setWhere(filter.getWhere()); this.dataFilter.setOrder(filter.getOrder()); @@ -869,42 +861,39 @@ public class ResultSetModel { final boolean hasOrdering = dataFilter.hasOrdering(); // Sort locally final List orderConstraints = dataFilter.getOrderConstraints(); - Collections.sort(curRows, new Comparator() { - @Override - public int compare(ResultSetRow row1, ResultSetRow row2) { - if (!hasOrdering) { - return row1.getRowNumber() - row2.getRowNumber(); + curRows.sort((row1, row2) -> { + if (!hasOrdering) { + return row1.getRowNumber() - row2.getRowNumber(); + } + int result = 0; + for (DBDAttributeConstraint co : orderConstraints) { + final DBDAttributeBinding binding = getAttributeBinding(co.getAttribute()); + if (binding == null) { + continue; } - int result = 0; - for (DBDAttributeConstraint co : orderConstraints) { - final DBDAttributeBinding binding = getAttributeBinding(co.getAttribute()); - if (binding == null) { - continue; - } - Object cell1 = getCellValue(binding, row1); - Object cell2 = getCellValue(binding, row2); - if (cell1 == cell2) { - result = 0; - } else if (DBUtils.isNullValue(cell1)) { - result = 1; - } else if (DBUtils.isNullValue(cell2)) { - result = -1; - } else if (cell1 instanceof Comparable) { - result = ((Comparable) cell1).compareTo(cell2); - } else { - String str1 = String.valueOf(cell1); - String str2 = String.valueOf(cell2); - result = str1.compareTo(str2); - } - if (co.isOrderDescending()) { - result = -result; - } - if (result != 0) { - break; - } + Object cell1 = getCellValue(binding, row1); + Object cell2 = getCellValue(binding, row2); + if (cell1 == cell2) { + result = 0; + } else if (DBUtils.isNullValue(cell1)) { + result = 1; + } else if (DBUtils.isNullValue(cell2)) { + result = -1; + } else if (cell1 instanceof Comparable) { + result = ((Comparable) cell1).compareTo(cell2); + } else { + String str1 = String.valueOf(cell1); + String str2 = String.valueOf(cell2); + result = str1.compareTo(str2); + } + if (co.isOrderDescending()) { + result = -result; + } + if (result != 0) { + break; } - return result; } + return result; }); for (int i = 0; i < curRows.size(); i++) { curRows.get(i).setVisualNumber(i); @@ -914,16 +903,31 @@ public class ResultSetModel { private void fillVisibleAttributes() { this.visibleAttributes.clear(); - if (executionSource != null && executionSource.getDataContainer() instanceof DBSEntity) { - // Filter pseudo attributes if we query single entity - for (DBDAttributeBinding binding : this.attributes) { - if (isVisibleByDefault(binding)) { - // Make visible "real" attributes - this.visibleAttributes.add(binding); + boolean entityDataView = executionSource != null && executionSource.getDataContainer() instanceof DBSEntity; + + DBSObjectFilter columnFilter = null; + if (entityDataView) { + // Detect column filter + DBSEntity entity = (DBSEntity) executionSource.getDataContainer(); + DBPDataSourceContainer container = entity.getDataSource().getContainer(); + if (container.getPreferenceStore().getBoolean(DBeaverPreferences.RESULT_SET_USE_NAVIGATOR_FILTERS) && attributes.length > 0) { + DBSEntityAttribute entityAttribute = attributes[0].getEntityAttribute(); + if (entityAttribute != null) { + columnFilter = container.getObjectFilter(entityAttribute.getClass(), entity, false); } } - } else { - Collections.addAll(this.visibleAttributes, this.attributes); + } + + // Filter pseudo attributes if we query single entity + for (DBDAttributeBinding binding : this.attributes) { + if (!entityDataView || isVisibleByDefault(binding)) { + // Make visible "real" attributes + if (columnFilter != null && !columnFilter.matches(binding.getName())) { + // Filtered out by column filter + continue; + } + this.visibleAttributes.add(binding); + } } } diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetUtils.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetUtils.java index 7e170b6dbf9319f574f8c0925b123093b7d58168..063328b326537a281d478497b6b408611bbd06df 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetUtils.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetUtils.java @@ -66,6 +66,7 @@ public class ResultSetUtils public static void bindAttributes( @NotNull DBCSession session, + @Nullable DBSEntity sourceEntity, @Nullable DBCResultSet resultSet, @NotNull DBDAttributeBindingMeta[] bindings, @Nullable List rows) throws DBException @@ -84,7 +85,9 @@ public class ResultSetUtils try { SQLQuery sqlQuery = null; DBSEntity entity = null; - if (resultSet != null) { + if (sourceEntity != null) { + entity = sourceEntity; + } else if (resultSet != null) { DBCStatement sourceStatement = resultSet.getSourceStatement(); if (sourceStatement != null && sourceStatement.getStatementSource() != null) { DBCExecutionSource executionSource = sourceStatement.getStatementSource(); diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetViewer.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetViewer.java index 9b3cccfe9dbb61082999abdb9e16be2ae9e65dca..637f1415d7a57d2da78d4cb5dc3ae785dbeb8d5f 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetViewer.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetViewer.java @@ -16,10 +16,7 @@ */ package org.jkiss.dbeaver.ui.controls.resultset; -import org.eclipse.core.runtime.IAdaptable; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.*; import org.eclipse.core.runtime.jobs.IJobChangeEvent; import org.eclipse.core.runtime.jobs.JobChangeAdapter; import org.eclipse.jface.action.*; @@ -127,9 +124,7 @@ public class ResultSetViewer extends Viewer private static final DecimalFormat ROW_COUNT_FORMAT = new DecimalFormat("###,###,###,###,###,##0"); - @NotNull - private static IResultSetFilterManager filterManager = new SimpleFilterManager(); - + private IResultSetFilterManager filterManager; @NotNull private final IWorkbenchPartSite site; private final Composite viewerPanel; @@ -199,6 +194,11 @@ public class ResultSetViewer extends Viewer this.container = container; this.dataReceiver = new ResultSetDataReceiver(this); + this.filterManager = Adapters.adapt(this, IResultSetFilterManager.class); + if (this.filterManager == null) { + this.filterManager = new SimpleFilterManager(); + } + loadPresentationSettings(); this.viewerPanel = UIUtils.createPlaceholder(parent, 1); @@ -665,6 +665,9 @@ public class ResultSetViewer extends Viewer PresentationSettings settings = this.presentationSettings.get(activePresentationDescriptor); if (settings == null) { settings = new PresentationSettings(); + // By default panels are visible for column presentations + settings.panelsVisible = activePresentationDescriptor != null && + (activePresentationDescriptor.getPresentationType() == IResultSetPresentation.PresentationType.COLUMNS); this.presentationSettings.put(activePresentationDescriptor, settings); } return settings; @@ -820,7 +823,7 @@ public class ResultSetViewer extends Viewer } boolean isPanelsVisible() { - return viewerSash.getMaximizedControl() == null; + return viewerSash != null && viewerSash.getMaximizedControl() == null; } void showPanels(boolean show) { @@ -954,14 +957,16 @@ public class ResultSetViewer extends Viewer @Override public T getAdapter(Class adapter) { - if (adapter.isAssignableFrom(activePresentation.getClass())) { - return adapter.cast(activePresentation); - } - // Try to get it from adapter - if (activePresentation instanceof IAdaptable) { - T adapted = ((IAdaptable) activePresentation).getAdapter(adapter); - if (adapted != null) { - return adapted; + if (activePresentation != null) { + if (adapter.isAssignableFrom(activePresentation.getClass())) { + return adapter.cast(activePresentation); + } + // Try to get it from adapter + if (activePresentation instanceof IAdaptable) { + T adapted = ((IAdaptable) activePresentation).getAdapter(adapter); + if (adapted != null) { + return adapted; + } } } IResultSetPanel visiblePanel = getVisiblePanel(); @@ -1581,17 +1586,10 @@ public class ResultSetViewer extends Viewer // Context menu & filters @NotNull - static IResultSetFilterManager getFilterManager() { + IResultSetFilterManager getFilterManager() { return filterManager; } - public static void registerFilterManager(@Nullable IResultSetFilterManager filterManager) { - if (filterManager == null) { - filterManager = new SimpleFilterManager(); - } - ResultSetViewer.filterManager = filterManager; - } - void showFiltersMenu() { DBDAttributeBinding curAttribute = getActivePresentation().getCurrentAttribute(); if (curAttribute == null) { @@ -1741,18 +1739,18 @@ public class ResultSetViewer extends Viewer } manager.add(new GroupMarker(MENU_GROUP_EDIT)); + // Filters and View + { + MenuManager filtersMenu = new MenuManager( + CoreMessages.controls_resultset_viewer_action_order_filter, + DBeaverIcons.getImageDescriptor(UIIcon.FILTER), + MENU_ID_FILTERS); //$NON-NLS-1$ + filtersMenu.setActionDefinitionId(ResultSetCommandHandler.CMD_FILTER_MENU); + filtersMenu.setRemoveAllWhenShown(true); + filtersMenu.addMenuListener(manager1 -> fillFiltersMenu(attr, manager1)); + manager.add(filtersMenu); + } if (dataSource != null && attr != null && model.getVisibleAttributeCount() > 0 && !model.isUpdateInProgress()) { - // Filters and View - { - MenuManager filtersMenu = new MenuManager( - CoreMessages.controls_resultset_viewer_action_order_filter, - DBeaverIcons.getImageDescriptor(UIIcon.FILTER), - MENU_ID_FILTERS); //$NON-NLS-1$ - filtersMenu.setActionDefinitionId(ResultSetCommandHandler.CMD_FILTER_MENU); - filtersMenu.setRemoveAllWhenShown(true); - filtersMenu.addMenuListener(manager1 -> fillFiltersMenu(attr, manager1)); - manager.add(filtersMenu); - } { MenuManager viewMenu = new MenuManager( "View/Format", @@ -2084,9 +2082,9 @@ public class ResultSetViewer extends Viewer } } - private void fillFiltersMenu(@NotNull DBDAttributeBinding attribute, @NotNull IMenuManager filtersMenu) + private void fillFiltersMenu(@Nullable DBDAttributeBinding attribute, @NotNull IMenuManager filtersMenu) { - if (supportsDataFilter()) { + if (attribute != null && supportsDataFilter()) { filtersMenu.add(ActionUtils.makeCommandContribution(site, ResultSetCommandHandler.CMD_FILTER_MENU_DISTINCT)); //filtersMenu.add(new FilterByListAction(operator, type, attribute)); @@ -2127,10 +2125,12 @@ public class ResultSetViewer extends Viewer filtersMenu.add(new FilterResetAttributeAction(attribute)); } } - filtersMenu.add(new Separator()); - filtersMenu.add(new OrderByAttributeAction(attribute, true)); - filtersMenu.add(new OrderByAttributeAction(attribute, false)); - filtersMenu.add(ActionUtils.makeCommandContribution(site, ResultSetCommandHandler.CMD_TOGGLE_ORDER)); + if (attribute != null) { + filtersMenu.add(new Separator()); + filtersMenu.add(new OrderByAttributeAction(attribute, true)); + filtersMenu.add(new OrderByAttributeAction(attribute, false)); + filtersMenu.add(ActionUtils.makeCommandContribution(site, ResultSetCommandHandler.CMD_TOGGLE_ORDER)); + } filtersMenu.add(new Separator()); filtersMenu.add(new ToggleServerSideOrderingAction()); filtersMenu.add(new ShowFiltersAction(true)); @@ -2478,14 +2478,11 @@ public class ResultSetViewer extends Viewer final DataFilterRegistry.SavedDataFilter savedConfig = DataFilterRegistry.getInstance().getSavedConfig(dataContainer); if (savedConfig != null) { final DBDDataFilter dataFilter = new DBDDataFilter(); - DBRRunnableWithProgress restoreTask = new DBRRunnableWithProgress() { - @Override - public void run(DBRProgressMonitor monitor) throws InvocationTargetException, InterruptedException { - try { - savedConfig.restoreDataFilter(monitor, dataContainer, dataFilter); - } catch (DBException e) { - throw new InvocationTargetException(e); - } + DBRRunnableWithProgress restoreTask = monitor -> { + try { + savedConfig.restoreDataFilter(monitor, dataContainer, dataFilter); + } catch (DBException e) { + throw new InvocationTargetException(e); } }; RuntimeUtils.runTask(restoreTask, "Restore data filter", 60000); @@ -3797,6 +3794,9 @@ public class ResultSetViewer extends Viewer } static class PresentationSettings { + PresentationSettings() { + } + final Set enabledPanelIds = new LinkedHashSet<>(); String activePanelId; int panelRatio; diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/panel/AggregateColumnsPanel.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/panel/AggregateColumnsPanel.java index cb57596ad16de1fed704583d5e653ddf25dd440b..b7605549292d4b6d726d155ad3e0c4884145f94d 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/panel/AggregateColumnsPanel.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/panel/AggregateColumnsPanel.java @@ -19,9 +19,7 @@ package org.jkiss.dbeaver.ui.controls.resultset.panel; import org.eclipse.jface.action.*; import org.eclipse.jface.dialogs.IDialogSettings; import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ISelectionProvider; -import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.swt.SWT; import org.eclipse.swt.dnd.TextTransfer; import org.eclipse.swt.events.SelectionAdapter; @@ -103,26 +101,19 @@ public class AggregateColumnsPanel implements IResultSetPanel { new TreeColumn(this.aggregateTable, SWT.RIGHT).setText("Value"); if (this.presentation instanceof ISelectionProvider) { - ((ISelectionProvider) this.presentation).addSelectionChangedListener(new ISelectionChangedListener() { - @Override - public void selectionChanged(SelectionChangedEvent event) { - if (presentation.getController().getVisiblePanel() == AggregateColumnsPanel.this) { - refresh(false); - } + ((ISelectionProvider) this.presentation).addSelectionChangedListener(event -> { + if (presentation.getController().getVisiblePanel() == AggregateColumnsPanel.this) { + refresh(false); } }); } MenuManager menuMgr = new MenuManager(); - menuMgr.addMenuListener(new IMenuListener() { - @Override - public void menuAboutToShow(IMenuManager manager) - { - manager.add(new CopyAction()); - manager.add(new CopyAllAction()); - manager.add(new Separator()); - fillToolBar(manager); - } + menuMgr.addMenuListener(manager -> { + manager.add(new CopyAction()); + manager.add(new CopyAllAction()); + manager.add(new Separator()); + fillToolBar(manager); }); menuMgr.setRemoveAllWhenShown(true); @@ -157,12 +148,7 @@ public class AggregateColumnsPanel implements IResultSetPanel { enabledFunctions.add(func); } } - Collections.sort(enabledFunctions, new Comparator() { - @Override - public int compare(AggregateFunctionDescriptor o1, AggregateFunctionDescriptor o2) { - return funcIndexes.get(o1) - funcIndexes.get(o2); - } - }); + enabledFunctions.sort(Comparator.comparingInt(funcIndexes::get)); } if (enabledFunctions.isEmpty()) { @@ -176,12 +162,7 @@ public class AggregateColumnsPanel implements IResultSetPanel { enabledFunctions.add(func); } } - Collections.sort(enabledFunctions, new Comparator() { - @Override - public int compare(AggregateFunctionDescriptor o1, AggregateFunctionDescriptor o2) { - return o1.getLabel().compareTo(o2.getLabel()); - } - }); + enabledFunctions.sort(Comparator.comparing(AggregateFunctionDescriptor::getLabel)); } private void saveSettings() { @@ -241,11 +222,7 @@ public class AggregateColumnsPanel implements IResultSetPanel { DBDAttributeBinding attr = selection.getElementAttribute(element); ResultSetRow row = selection.getElementRow(element); Object cellValue = model.getCellValue(attr, row); - List values = attrValues.get(attr); - if (values == null) { - values = new ArrayList<>(); - attrValues.put(attr, values); - } + List values = attrValues.computeIfAbsent(attr, k -> new ArrayList<>()); values.add(cellValue); } diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/panel/MetaDataPanel.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/panel/MetaDataPanel.java index 5e6b291eb066bbc9bd0a45716f13d8067590376d..b896cbb800e55e5775af3a293bfdbb6382b14561 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/panel/MetaDataPanel.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/panel/MetaDataPanel.java @@ -22,14 +22,11 @@ import org.eclipse.jface.action.ToolBarManager; import org.eclipse.jface.viewers.*; import org.eclipse.swt.SWT; import org.eclipse.swt.dnd.TextTransfer; -import org.eclipse.swt.events.DisposeEvent; -import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.jkiss.code.NotNull; import org.jkiss.code.Nullable; -import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.DBPImage; import org.jkiss.dbeaver.model.DBValueFormatting; import org.jkiss.dbeaver.model.data.DBDAttributeBinding; @@ -56,8 +53,6 @@ import java.util.List; */ public class MetaDataPanel implements IResultSetPanel { - private static final Log log = Log.getLog(MetaDataPanel.class); - public static final String PANEL_ID = "results-metadata"; private IResultSetPresentation presentation; @@ -91,46 +86,36 @@ public class MetaDataPanel implements IResultSetPanel { this.attributeList = new MetaDataTable(parent); this.attributeList.setFitWidth(false); - this.attributeList.getItemsViewer().addSelectionChangedListener(new ISelectionChangedListener() { - @Override - public void selectionChanged(SelectionChangedEvent event) { - DBDAttributeBinding attr = getSelectedAttribute(); - if (attr != null && !updateSelection) { - if (isAttributeVisible(attr)) { - updateSelection = true; - try { - presentation.setCurrentAttribute(attr); - } finally { - updateSelection = false; - } + this.attributeList.getItemsViewer().addSelectionChangedListener(event -> { + DBDAttributeBinding attr = getSelectedAttribute(); + if (attr != null && !updateSelection) { + if (isAttributeVisible(attr)) { + updateSelection = true; + try { + presentation.setCurrentAttribute(attr); + } finally { + updateSelection = false; } } } }); if (this.presentation instanceof ISelectionProvider) { - final ISelectionChangedListener listener = new ISelectionChangedListener() { - @Override - public void selectionChanged(SelectionChangedEvent event) { - if (!updateSelection && MetaDataPanel.this.presentation.getController().getVisiblePanel() == MetaDataPanel.this) { - DBDAttributeBinding attr = presentation.getCurrentAttribute(); - if (attr != null && attr != getSelectedAttribute()) { - updateSelection = true; - try { - attributeList.getItemsViewer().setSelection(new StructuredSelection(attr)); - } finally { - updateSelection = false; - } + final ISelectionChangedListener listener = event -> { + if (!updateSelection && MetaDataPanel.this.presentation.getController().getVisiblePanel() == MetaDataPanel.this) { + DBDAttributeBinding attr = presentation.getCurrentAttribute(); + if (attr != null && attr != getSelectedAttribute()) { + updateSelection = true; + try { + attributeList.getItemsViewer().setSelection(new StructuredSelection(attr)); + } finally { + updateSelection = false; } } } }; ((ISelectionProvider) this.presentation).addSelectionChangedListener(listener); - attributeList.getControl().addDisposeListener(new DisposeListener() { - @Override - public void widgetDisposed(DisposeEvent e) { - ((ISelectionProvider) presentation).removeSelectionChangedListener(listener); - } - }); + attributeList.getControl().addDisposeListener(e -> + ((ISelectionProvider) presentation).removeSelectionChangedListener(listener)); } return this.attributeList; diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/panel/ViewValuePanel.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/panel/ViewValuePanel.java index 01f06383a9fde60edfac36869ce531149592c44d..df15401fe3f82f3ce0e55936784f3141188e1542 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/panel/ViewValuePanel.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/panel/ViewValuePanel.java @@ -24,12 +24,7 @@ import org.eclipse.jface.action.ToolBarManager; import org.eclipse.jface.dialogs.IDialogSettings; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ISelectionProvider; -import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.swt.SWT; -import org.eclipse.swt.events.DisposeEvent; -import org.eclipse.swt.events.DisposeListener; -import org.eclipse.swt.events.PaintEvent; -import org.eclipse.swt.events.PaintListener; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.FillLayout; @@ -108,18 +103,15 @@ public class ViewValuePanel implements IResultSetPanel, IAdaptable { viewPlaceholder = new Composite(parent, SWT.NONE); viewPlaceholder.setLayout(new FillLayout()); - viewPlaceholder.addPaintListener(new PaintListener() { - @Override - public void paintControl(PaintEvent e) { - if (viewPlaceholder.getChildren().length == 0) { - String hidePanelCmd = ActionUtils.findCommandDescription( - ResultSetCommandHandler.CMD_TOGGLE_PANELS, - ViewValuePanel.this.presentation.getController().getSite(), - true); - - UIUtils.drawMessageOverControl(viewPlaceholder, e, "Select a cell to view/edit value", 0); - UIUtils.drawMessageOverControl(viewPlaceholder, e, "Press " + hidePanelCmd + " to hide this panel", 20); - } + viewPlaceholder.addPaintListener(e -> { + if (viewPlaceholder.getChildren().length == 0) { + String hidePanelCmd = ActionUtils.findCommandDescription( + ResultSetCommandHandler.CMD_TOGGLE_PANELS, + ViewValuePanel.this.presentation.getController().getSite(), + true); + + UIUtils.drawMessageOverControl(viewPlaceholder, e, "Select a cell to view/edit value", 0); + UIUtils.drawMessageOverControl(viewPlaceholder, e, "Press " + hidePanelCmd + " to hide this panel", 20); } }); @@ -137,21 +129,13 @@ public class ViewValuePanel implements IResultSetPanel, IAdaptable { if (this.presentation instanceof ISelectionProvider) { final ISelectionProvider selectionProvider = (ISelectionProvider) this.presentation; - final ISelectionChangedListener selectionListener = new ISelectionChangedListener() { - @Override - public void selectionChanged(SelectionChangedEvent event) { - if (ViewValuePanel.this.presentation.getController().getVisiblePanel() == ViewValuePanel.this) { - refreshValue(false); - } + final ISelectionChangedListener selectionListener = event -> { + if (ViewValuePanel.this.presentation.getController().getVisiblePanel() == ViewValuePanel.this) { + refreshValue(false); } }; selectionProvider.addSelectionChangedListener(selectionListener); - viewPlaceholder.addDisposeListener(new DisposeListener() { - @Override - public void widgetDisposed(DisposeEvent e) { - selectionProvider.removeSelectionChangedListener(selectionListener); - } - }); + viewPlaceholder.addDisposeListener(e -> selectionProvider.removeSelectionChangedListener(selectionListener)); } return viewPlaceholder; @@ -264,15 +248,11 @@ public class ViewValuePanel implements IResultSetPanel, IAdaptable { } else { final Composite placeholder = UIUtils.createPlaceholder(viewPlaceholder, 1); placeholder.setBackground(placeholder.getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND)); - placeholder.addPaintListener(new PaintListener() { - @Override - public void paintControl(PaintEvent e) - { - Rectangle bounds = placeholder.getBounds(); - String message = "No editor for [" + previewController.getValueType().getTypeName() + "]"; - Point ext = e.gc.textExtent(message); - e.gc.drawText(message, (bounds.width - ext.x) / 2, bounds.height / 3 + 20); - } + placeholder.addPaintListener(e -> { + Rectangle bounds = placeholder.getBounds(); + String message = "No editor for [" + previewController.getValueType().getTypeName() + "]"; + Point ext = e.gc.textExtent(message); + e.gc.drawText(message, (bounds.width - ext.x) / 2, bounds.height / 3 + 20); }); referenceValueEditor = null; } diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/plaintext/PlainTextPresentation.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/plaintext/PlainTextPresentation.java index 86f562454aff76543d254dd8a9f1d67544e4a707..1ad0acefdd2ea05420bb679b1b40e128809d42ee 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/plaintext/PlainTextPresentation.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/plaintext/PlainTextPresentation.java @@ -100,9 +100,7 @@ public class PlainTextPresentation extends AbstractPresentation implements IAdap fireSelectionChanged(new PlainTextSelectionImpl()); } }); - text.addDisposeListener(e -> { - dispose(); - }); + text.addDisposeListener(e -> dispose()); final ScrollBar verticalBar = text.getVerticalBar(); verticalBar.addSelectionListener(new SelectionAdapter() { @@ -206,12 +204,7 @@ public class PlainTextPresentation extends AbstractPresentation implements IAdap horOffsetEnd - horOffsetBegin - 1, null, curLineColor); - DBeaverUI.asyncExec(new Runnable() { - @Override - public void run() { - text.setStyleRanges(new StyleRange[]{curLineRange}); - } - }); + DBeaverUI.asyncExec(() -> text.setStyleRanges(new StyleRange[]{curLineRange})); } } @@ -582,7 +575,7 @@ public class PlainTextPresentation extends AbstractPresentation implements IAdap public List toList() { return curSelection == null ? - Collections.emptyList() : + Collections.emptyList() : Collections.singletonList(curSelection); } diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/spreadsheet/Spreadsheet.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/spreadsheet/Spreadsheet.java index 3cf75df9e898401b82e8c369edf49bb462eae5dd..a59ed91524d674a44239e2b2ed3254d3d9809abb 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/spreadsheet/Spreadsheet.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/spreadsheet/Spreadsheet.java @@ -16,8 +16,6 @@ */ package org.jkiss.dbeaver.ui.controls.resultset.spreadsheet; -import org.eclipse.jface.action.IMenuListener; -import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.swt.SWT; import org.eclipse.swt.accessibility.Accessible; @@ -25,29 +23,17 @@ import org.eclipse.swt.accessibility.AccessibleEvent; import org.eclipse.swt.accessibility.AccessibleListener; import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.dnd.Clipboard; -import org.eclipse.swt.events.DisposeEvent; -import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.Listener; -import org.eclipse.swt.widgets.Menu; -import org.eclipse.swt.widgets.Text; +import org.eclipse.swt.widgets.*; import org.eclipse.ui.IWorkbenchPartSite; import org.jkiss.code.NotNull; import org.jkiss.code.Nullable; import org.jkiss.dbeaver.DBeaverPreferences; import org.jkiss.dbeaver.core.DBeaverUI; import org.jkiss.dbeaver.model.data.DBDAttributeBinding; -import org.jkiss.dbeaver.ui.controls.lightgrid.GridCell; -import org.jkiss.dbeaver.ui.controls.lightgrid.GridPos; -import org.jkiss.dbeaver.ui.controls.lightgrid.IGridContentProvider; -import org.jkiss.dbeaver.ui.controls.lightgrid.IGridController; -import org.jkiss.dbeaver.ui.controls.lightgrid.IGridLabelProvider; -import org.jkiss.dbeaver.ui.controls.lightgrid.LightGrid; +import org.jkiss.dbeaver.ui.controls.lightgrid.*; import org.jkiss.dbeaver.ui.controls.resultset.AbstractPresentation; /** @@ -130,12 +116,9 @@ public class Spreadsheet extends LightGrid implements Listener { hookAccessibility(); { - super.addDisposeListener(new DisposeListener() { - @Override - public void widgetDisposed(DisposeEvent e) { - if (clipboard != null && !clipboard.isDisposed()) { - clipboard.dispose(); - } + super.addDisposeListener(e -> { + if (clipboard != null && !clipboard.isDisposed()) { + clipboard.dispose(); } }); } @@ -328,12 +311,7 @@ public class Spreadsheet extends LightGrid implements Listener { case LightGrid.Event_NavigateLink: // Perform navigation async because it may change grid content and // we don't want to mess current grid state - DBeaverUI.asyncExec(new Runnable() { - @Override - public void run() { - presentation.navigateLink((GridCell) event.data, event.stateMask); - } - }); + DBeaverUI.asyncExec(() -> presentation.navigateLink((GridCell) event.data, event.stateMask)); break; } } @@ -349,17 +327,13 @@ public class Spreadsheet extends LightGrid implements Listener { { MenuManager menuMgr = new MenuManager(null, AbstractPresentation.RESULT_SET_PRESENTATION_CONTEXT_MENU); Menu menu = menuMgr.createContextMenu(this); - menuMgr.addMenuListener(new IMenuListener() { - @Override - public void menuAboutToShow(IMenuManager manager) - { - // Let controller to provide it's own menu items - GridPos focusPos = getFocusPos(); - presentation.fillContextMenu( - manager, focusPos.col >= 0 && focusPos.col < columnElements.length ? columnElements[focusPos.col] : null, - focusPos.row >= 0 && focusPos.row < rowElements.length ? rowElements[focusPos.row] : null - ); - } + menuMgr.addMenuListener(manager -> { + // Let controller to provide it's own menu items + GridPos focusPos = getFocusPos(); + presentation.fillContextMenu( + manager, focusPos.col >= 0 && focusPos.col < columnElements.length ? columnElements[focusPos.col] : null, + focusPos.row >= 0 && focusPos.row < rowElements.length ? rowElements[focusPos.row] : null + ); }); menuMgr.setRemoveAllWhenShown(true); super.setMenu(menu); @@ -435,12 +409,7 @@ public class Spreadsheet extends LightGrid implements Listener { final Accessible accessible = getAccessible(); accessible.addAccessibleListener(new GridAccessibleListener()); - addCursorChangeListener(new Listener() { - @Override - public void handleEvent(Event event) { - accessible.selectionChanged(); - } - }); + addCursorChangeListener(event -> accessible.selectionChanged()); } private static class GridAccessibleListener implements AccessibleListener { diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/spreadsheet/SpreadsheetCellEditor.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/spreadsheet/SpreadsheetCellEditor.java index a3abfd2246e834433f68c2739b44330fd226470f..43d184fb277d9a2fff516dac583ebb8410e10cbb 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/spreadsheet/SpreadsheetCellEditor.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/spreadsheet/SpreadsheetCellEditor.java @@ -24,7 +24,6 @@ import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.jkiss.dbeaver.ui.controls.lightgrid.LightGrid; @@ -69,14 +68,7 @@ public class SpreadsheetCellEditor extends ControlEditor } }; - resizeListener = new Listener() - { - @Override - public void handleEvent(Event event) - { - layout(); - } - }; + resizeListener = event -> layout(); scrollListener = new SelectionListener() { diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/spreadsheet/SpreadsheetPresentation.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/spreadsheet/SpreadsheetPresentation.java index 08f3b1dc1a64fb31a4d29fae52153689ce6c8d06..01d505bb1a2ed4d6e2315cf1d262c3518318f028 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/spreadsheet/SpreadsheetPresentation.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/spreadsheet/SpreadsheetPresentation.java @@ -131,7 +131,7 @@ public class SpreadsheetPresentation extends AbstractPresentation implements IRe private Color foregroundSelected, backgroundSelected; private Color backgroundMatched; private Color cellHeaderForeground, cellHeaderBackground, cellHeaderSelectionBackground; - private Font boldFont, italicFont, bolItalicFont; + private Font boldFont, italicFont; private boolean showOddRows = true; private boolean showCelIcons = true; @@ -1289,12 +1289,7 @@ public class SpreadsheetPresentation extends AbstractPresentation implements IRe for (Integer row : spreadsheet.getRowSelection()) { rows.add(controller.getModel().getRow(row)); } - Collections.sort(rows, new Comparator() { - @Override - public int compare(ResultSetRow o1, ResultSetRow o2) { - return o1.getVisualNumber() - o2.getVisualNumber(); - } - }); + rows.sort(Comparator.comparingInt(ResultSetRow::getVisualNumber)); return rows; } } @@ -1337,12 +1332,7 @@ public class SpreadsheetPresentation extends AbstractPresentation implements IRe } else { DBDAttributeBinding[] columns = model.getVisibleAttributes().toArray(new DBDAttributeBinding[model.getVisibleAttributeCount()]); if (columnOrder != SWT.NONE && columnOrder != SWT.DEFAULT) { - Arrays.sort(columns, new Comparator() { - @Override - public int compare(DBDAttributeBinding o1, DBDAttributeBinding o2) { - return o1.getName().compareTo(o2.getName()) * (columnOrder == SWT.UP ? 1 : -1); - } - }); + Arrays.sort(columns, (o1, o2) -> o1.getName().compareTo(o2.getName()) * (columnOrder == SWT.UP ? 1 : -1)); } return columns; } diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/txn/TransactionMonitorToolbar.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/txn/TransactionMonitorToolbar.java index 5966339360335244365a6a63e3e70b9eb14dc3a0..57d0edf4fbf021bfb6f856c7f3fd75cbc9c6a13c 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/txn/TransactionMonitorToolbar.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/txn/TransactionMonitorToolbar.java @@ -156,7 +156,7 @@ public class TransactionMonitorToolbar { ColorRegistry colorRegistry = workbenchWindow.getWorkbench().getThemeManager().getCurrentTheme().getColorRegistry(); Color colorReverted = colorRegistry.get(QueryLogViewer.COLOR_REVERTED); - Color colorCommitted = colorRegistry.get(QueryLogViewer.COLOR_COMMITTED); + Color colorCommitted = colorRegistry.get(QueryLogViewer.COLOR_UNCOMMITTED); final RGB COLOR_FULL = colorReverted.getRGB(); final RGB COLOR_EMPTY = colorCommitted.getRGB(); diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/data/editors/ContentPanelEditor.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/data/editors/ContentPanelEditor.java index 1031d62d98c329cd4744354e4ea6fa5c30ef7a17..af777ec3a537095ee5b3882001a6b494e0ef843b 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/data/editors/ContentPanelEditor.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/data/editors/ContentPanelEditor.java @@ -22,8 +22,6 @@ import org.eclipse.jface.action.IContributionItem; import org.eclipse.jface.action.IContributionManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.swt.SWT; -import org.eclipse.swt.events.DisposeEvent; -import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Point; @@ -56,7 +54,6 @@ import org.jkiss.dbeaver.ui.data.registry.StreamValueManagerDescriptor; import org.jkiss.dbeaver.ui.data.registry.ValueManagerRegistry; import org.jkiss.dbeaver.utils.RuntimeUtils; -import java.lang.reflect.InvocationTargetException; import java.util.*; import java.util.List; @@ -100,15 +97,12 @@ public class ContentPanelEditor extends BaseValueEditor implements IAda valueController.showMessage("NULL content editor.", DBPMessageType.ERROR); return; } - DBeaverUI.runInUI(valueController.getValueSite().getWorkbenchWindow(), new DBRRunnableWithProgress() { - @Override - public void run(DBRProgressMonitor monitor) throws InvocationTargetException, InterruptedException { - try { - streamEditor.primeEditorValue(monitor, control, content); - } catch (Throwable e) { - log.debug(e); - valueController.showMessage(e.getMessage(), DBPMessageType.ERROR); - } + DBeaverUI.runInUI(valueController.getValueSite().getWorkbenchWindow(), monitor -> { + try { + streamEditor.primeEditorValue(monitor, control, content); + } catch (Throwable e) { + log.debug(e); + valueController.showMessage(e.getMessage(), DBPMessageType.ERROR); } }); } @@ -235,12 +229,7 @@ public class ContentPanelEditor extends BaseValueEditor implements IAda ToolBar toolBar = toolItem.getParent(); menu = new Menu(toolBar); List managers = new ArrayList<>(streamManagers.keySet()); - Collections.sort(managers, new Comparator() { - @Override - public int compare(StreamValueManagerDescriptor o1, StreamValueManagerDescriptor o2) { - return o1.getLabel().compareTo(o2.getLabel()); - } - }); + managers.sort(Comparator.comparing(StreamValueManagerDescriptor::getLabel)); for (StreamValueManagerDescriptor manager : managers) { MenuItem item = new MenuItem(menu, SWT.RADIO); item.setText(manager.getLabel()); @@ -256,12 +245,7 @@ public class ContentPanelEditor extends BaseValueEditor implements IAda } catch (DBCException e) { log.error(e); } - toolBar.addDisposeListener(new DisposeListener() { - @Override - public void widgetDisposed(DisposeEvent e) { - menu.dispose(); - } - }); + toolBar.addDisposeListener(e -> menu.dispose()); } for (MenuItem item : menu.getItems()) { if (item.getData() instanceof StreamValueManagerDescriptor) { diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/data/managers/DateTimeValueManager.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/data/managers/DateTimeValueManager.java index 11fb5c054e736f3efac1585c5ef37cc2611d2050..db82a747bdcaffb7157552039a1344f1781c4086 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/data/managers/DateTimeValueManager.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/data/managers/DateTimeValueManager.java @@ -46,6 +46,11 @@ public class DateTimeValueManager extends BaseValueManager { { super.contributeActions(manager, controller, activeEditor); manager.add(new Action(CoreMessages.model_jdbc_set_to_current_time, DBeaverIcons.getImageDescriptor(DBIcon.TYPE_DATETIME)) { + @Override + public boolean isEnabled() { + return !controller.isReadOnly(); + } + @Override public void run() { controller.updateValue(new Date(), true); diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/data/registry/ValueManagerDescriptor.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/data/registry/ValueManagerDescriptor.java index 31d9b85c67dbdf1694fa4a8ca2a45edf70f3e5e0..268f8fa56e884e33b71108a1b934d853b6f5972d 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/data/registry/ValueManagerDescriptor.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/data/registry/ValueManagerDescriptor.java @@ -129,7 +129,7 @@ public class ValueManagerDescriptor extends AbstractDescriptor for (SupportInfo info : supportInfos) { if (dataSource != null && info.dataSource != null) { DriverDescriptor driver = (DriverDescriptor) dataSource.getContainer().getDriver(); - if (!info.dataSource.equals(driver.getProviderDescriptor().getId()) && !info.dataSource.equals(dataSource.getClass().getName())) { + if (!info.dataSource.equals(driver.getProviderId()) && !info.dataSource.equals(dataSource.getClass().getName())) { continue; } } else if (checkDataSource) { diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/dialogs/driver/DriverEditDialog.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/dialogs/driver/DriverEditDialog.java index 28a5f47bf65600a08102909f237d76e71cb83ee4..c0ca6610d3ef73a973cfabd259c4f5e89703b20f 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/dialogs/driver/DriverEditDialog.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/dialogs/driver/DriverEditDialog.java @@ -22,8 +22,6 @@ import org.eclipse.jface.dialogs.IDialogSettings; import org.eclipse.jface.dialogs.ProgressMonitorDialog; import org.eclipse.jface.viewers.*; import org.eclipse.swt.SWT; -import org.eclipse.swt.events.ModifyEvent; -import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; @@ -188,12 +186,7 @@ public class DriverEditDialog extends HelpEnabledDialog { gd = new GridData(GridData.FILL_HORIZONTAL); driverNameText = UIUtils.createLabelText(propsGroup, CoreMessages.dialog_edit_driver_label_driver_name + "*", driver.getName(), SWT.BORDER | advStyle, gd); - driverNameText.addModifyListener(new ModifyListener() { - @Override - public void modifyText(ModifyEvent e) { - onChangeProperty(); - } - }); + driverNameText.addModifyListener(e -> onChangeProperty()); UIUtils.createControlLabel(propsGroup, CoreMessages.dialog_edit_driver_type_label); final CSmartCombo providerCombo = new CSmartCombo<>(propsGroup, SWT.BORDER | SWT.READ_ONLY | SWT.DROP_DOWN, new LabelProvider() { @@ -230,30 +223,15 @@ public class DriverEditDialog extends HelpEnabledDialog { gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = 3; driverClassText = UIUtils.createLabelText(propsGroup, CoreMessages.dialog_edit_driver_label_class_name + "*", CommonUtils.notEmpty(driver.getDriverClassName()), SWT.BORDER | advStyle, gd); - driverClassText.addModifyListener(new ModifyListener() { - @Override - public void modifyText(ModifyEvent e) { - onChangeProperty(); - } - }); + driverClassText.addModifyListener(e -> onChangeProperty()); driverURLText = UIUtils.createLabelText(propsGroup, CoreMessages.dialog_edit_driver_label_sample_url, CommonUtils.notEmpty(driver.getSampleURL()), SWT.BORDER | advStyle, gd); - driverURLText.addModifyListener(new ModifyListener() { - @Override - public void modifyText(ModifyEvent e) { - onChangeProperty(); - } - }); + driverURLText.addModifyListener(e -> onChangeProperty()); gd = new GridData(GridData.FILL_HORIZONTAL); driverPortText = UIUtils.createLabelText(propsGroup, CoreMessages.dialog_edit_driver_label_default_port, driver.getDefaultPort() == null ? "" : driver.getDefaultPort(), SWT.BORDER | advStyle, gd); driverPortText.setLayoutData(new GridData(SWT.NONE)); - driverPortText.addModifyListener(new ModifyListener() { - @Override - public void modifyText(ModifyEvent e) { - onChangeProperty(); - } - }); + driverPortText.addModifyListener(e -> onChangeProperty()); gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = 2; @@ -339,12 +317,7 @@ public class DriverEditDialog extends HelpEnabledDialog { loadSettings(false); if (showAddFiles) { - getShell().getDisplay().asyncExec(new Runnable() { - @Override - public void run() { - addLibraryFiles(); - } - }); + getShell().getDisplay().asyncExec(this::addLibraryFiles); } driverNameText.setFocus(); @@ -394,14 +367,19 @@ public class DriverEditDialog extends HelpEnabledDialog { cell.setImage(DBeaverIcons.getImage(UIIcon.JAR)); } } - }); - libTable.getControl().setLayoutData(new GridData(GridData.FILL_BOTH)); - libTable.getControl().addListener(SWT.Selection, new Listener() { + @Override - public void handleEvent(Event event) { - changeLibSelection(); + public String getToolTipText(Object element) { + if (element instanceof DBPDriverLibrary) { + File localFile = ((DBPDriverLibrary) element).getLocalFile(); + return localFile == null ? "N/A" : localFile.getAbsolutePath(); + } + return super.getToolTipText(element); } }); + ColumnViewerToolTipSupport.enableFor(libTable); + libTable.getControl().setLayoutData(new GridData(GridData.FILL_BOTH)); + libTable.getControl().addListener(SWT.Selection, event -> changeLibSelection()); // Find driver class boolean isReadOnly = !provider.isDriversManagable(); @@ -428,24 +406,21 @@ public class DriverEditDialog extends HelpEnabledDialog { classListCombo.setEnabled(!isReadOnly); findClassButton = new Button(findClassGroup, SWT.PUSH); findClassButton.setText(CoreMessages.dialog_edit_driver_button_bind_class); - findClassButton.addListener(SWT.Selection, new Listener() { - @Override - public void handleEvent(Event event) { - try { - DriverClassFindJob classFinder = new DriverClassFindJob(driver, "java/sql/Driver", true); - new ProgressMonitorDialog(getShell()).run(true, true, classFinder); - - if (classListCombo != null && !classListCombo.isDisposed()) { - java.util.List classNames = classFinder.getDriverClassNames(); - classListCombo.setItems(classNames.toArray(new String[classNames.size()])); - classListCombo.setListVisible(true); - } - - } catch (InvocationTargetException e) { - log.error(e.getTargetException()); - } catch (InterruptedException e) { - log.error(e); + findClassButton.addListener(SWT.Selection, event -> { + try { + DriverClassFindJob classFinder = new DriverClassFindJob(driver, "java/sql/Driver", true); + new ProgressMonitorDialog(getShell()).run(true, true, classFinder); + + if (classListCombo != null && !classListCombo.isDisposed()) { + List classNames = classFinder.getDriverClassNames(); + classListCombo.setItems(classNames.toArray(new String[classNames.size()])); + classListCombo.setListVisible(true); } + + } catch (InvocationTargetException e) { + log.error(e.getTargetException()); + } catch (InterruptedException e) { + log.error(e); } }); findClassButton.setEnabled(!isReadOnly); @@ -831,13 +806,10 @@ public class DriverEditDialog extends HelpEnabledDialog { public static void showBadConfigDialog(final Shell shell, final String message, final DBException error) { //log.debug(message); - Runnable runnable = new Runnable() { - @Override - public void run() { - DBPDataSource dataSource = error.getDataSource(); - String title = "Bad driver [" + dataSource.getContainer().getDriver().getName() + "] configuration"; - new BadDriverConfigDialog(shell, title, message == null ? title : message, error).open(); - } + Runnable runnable = () -> { + DBPDataSource dataSource = error.getDataSource(); + String title = "Bad driver [" + dataSource.getContainer().getDriver().getName() + "] configuration"; + new BadDriverConfigDialog(shell, title, message == null ? title : message, error).open(); }; DBeaverUI.syncExec(runnable); } @@ -866,14 +838,11 @@ public class DriverEditDialog extends HelpEnabledDialog { @Override protected void buttonPressed(int id) { if (id == IDialogConstants.RETRY_ID) { - DBeaverUI.asyncExec(new Runnable() { - @Override - public void run() { - DriverEditDialog dialog = new DriverEditDialog( - DBeaverUI.getActiveWorkbenchShell(), - (DriverDescriptor) dataSource.getContainer().getDriver()); - dialog.open(); - } + DBeaverUI.asyncExec(() -> { + DriverEditDialog dialog = new DriverEditDialog( + DBeaverUI.getActiveWorkbenchShell(), + (DriverDescriptor) dataSource.getContainer().getDriver()); + dialog.open(); }); super.buttonPressed(IDialogConstants.OK_ID); } diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/data/AbstractDataEditor.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/data/AbstractDataEditor.java index 0c96c7deba20eff39752ad67516536302979bca3..64e64def1d9aa4d9c4d825ca4ae939fc9d3980e2 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/data/AbstractDataEditor.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/data/AbstractDataEditor.java @@ -152,9 +152,10 @@ public abstract class AbstractDataEditor extends IEditorPart entityEditor = NavigatorHandlerObjectOpen.openEntityEditor( targetNode, DatabaseDataEditor.class.getName(), + null, Collections.singletonMap(DatabaseDataEditor.ATTR_DATA_FILTER, newFilter), - DBeaverUI.getActiveWorkbenchWindow() - ); + DBeaverUI.getActiveWorkbenchWindow(), + true); if (entityEditor instanceof MultiPageEditorPart) { Object selectedPage = ((MultiPageEditorPart) entityEditor).getSelectedPage(); diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/entity/EntityEditor.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/entity/EntityEditor.java index 961bf41b88e2aba2bab59417badb5f222a5238f0..80416ef2454dbf8f394de8c7336fbec3fb18d80a 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/entity/EntityEditor.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/entity/EntityEditor.java @@ -232,7 +232,9 @@ public class EntityEditor extends MultiPageDatabaseEditor // Flush all nested object editors and result containers for (IEditorPart editor : editorMap.values()) { if (editor instanceof ObjectPropertiesEditor || editor instanceof IResultSetContainer) { - editor.doSave(monitor); + if (editor.isDirty()) { + editor.doSave(monitor); + } } if (monitor.isCanceled()) { return; @@ -418,9 +420,11 @@ public class EntityEditor extends MultiPageDatabaseEditor DBeaverUI.syncExec(() -> DBUserInterface.getInstance().showError("Validation", e.getMessage())); return IDialogConstants.CANCEL_ID; } + Map options = new HashMap<>(); + options.put(DBPScriptObject.OPTION_OBJECT_SAVE, true); script.append(SQLUtils.generateScript( commandContext.getExecutionContext().getDataSource(), - command.getPersistActions(DBPScriptObject.EMPTY_OPTIONS), + command.getPersistActions(options), false)); } if (script.length() == 0) { @@ -632,19 +636,23 @@ public class EntityEditor extends MultiPageDatabaseEditor } @Override - public void switchFolder(String folderId) + public boolean switchFolder(String folderId) { + boolean changed = false; for (IEditorPart editor : editorMap.values()) { if (editor instanceof ITabbedFolderContainer) { if (getActiveEditor() != editor) { setActiveEditor(editor); } - ((ITabbedFolderContainer)editor).switchFolder(folderId); + if (((ITabbedFolderContainer)editor).switchFolder(folderId)) { + changed = true; + } } } // if (getActiveEditor() instanceof IFolderedPart) { // ((IFolderedPart)getActiveEditor()).switchFolder(folderId); // } + return changed; } public void setActiveEditor(Class editorInterface) { @@ -941,7 +949,9 @@ public class EntityEditor extends MultiPageDatabaseEditor try { final DBECommandContext commandContext = getCommandContext(); if (commandContext != null && commandContext.isDirty()) { - success = saveCommandContext(monitor, DBPScriptObject.EMPTY_OPTIONS); + Map options = new HashMap<>(); + options.put(DBPScriptObject.OPTION_OBJECT_SAVE, true); + success = saveCommandContext(monitor, options); } else { success = true; } diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/entity/ProgressEditorPart.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/entity/ProgressEditorPart.java index c50194af2db977de8242aad8c1bac8a3af3695af..6593b38644eae6784ecc3da52e7218858a9e3a6b 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/entity/ProgressEditorPart.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/entity/ProgressEditorPart.java @@ -18,8 +18,6 @@ package org.jkiss.dbeaver.ui.editors.entity; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.swt.SWT; -import org.eclipse.swt.events.PaintEvent; -import org.eclipse.swt.events.PaintListener; import org.eclipse.swt.widgets.Canvas; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.IEditorInput; @@ -95,12 +93,8 @@ public class ProgressEditorPart extends EditorPart { private void createProgressPane(final Composite parent) { progressCanvas = new Canvas(parent, SWT.NONE); - progressCanvas.addPaintListener(new PaintListener() { - @Override - public void paintControl(PaintEvent e) { - e.gc.drawText("Connecting to datasource '" + getEditorInput().getDatabaseObject().getName() + "'...", 5, 5, true); - } - }); + progressCanvas.addPaintListener(e -> + e.gc.drawText("Connecting to datasource '" + getEditorInput().getDatabaseObject().getName() + "'...", 5, 5, true)); InitNodeService loadingService = new InitNodeService(); LoadingJob loadJob = LoadingJob.createService( @@ -163,12 +157,8 @@ public class ProgressEditorPart extends EditorPart { initEntityEditor(result); if (result == null) { // Close editor - DBeaverUI.asyncExec(new Runnable() { - @Override - public void run() { - entityEditor.getSite().getWorkbenchWindow().getActivePage().closeEditor(entityEditor, false); - } - }); + DBeaverUI.asyncExec(() -> + entityEditor.getSite().getWorkbenchWindow().getActivePage().closeEditor(entityEditor, false)); } } } diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/entity/properties/ObjectPropertiesEditor.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/entity/properties/ObjectPropertiesEditor.java index 2b9259ab7f173ec5cbd26ae821f7453d3f919f9e..484960fcde4ec0f96ff284a258b91d2140d86645 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/entity/properties/ObjectPropertiesEditor.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/entity/properties/ObjectPropertiesEditor.java @@ -293,7 +293,9 @@ public class ObjectPropertiesEditor extends AbstractDatabaseObjectEditor DBeaverUI.syncExec(this::setFocus)); + checkConnected(false, status -> { + DBeaverUI.asyncExec(() -> { + if (!status.isOK()) { + DBUserInterface.getInstance().showError("Can't connect to database", "Error connecting to datasource", status); + } + setFocus(); + }); + }); setPartName(getEditorName()); fireDataSourceChange(); diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/sql/SQLEditorBase.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/sql/SQLEditorBase.java index 4a7d99ae88937e55f80b6fde0c4b302794e9bb2c..ac9cdbec2c2abcb6a91816078fd7b5bbc2c5d110 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/sql/SQLEditorBase.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/sql/SQLEditorBase.java @@ -134,9 +134,13 @@ public abstract class SQLEditorBase extends BaseTextEditor implements IErrorVisu //setDocumentProvider(new SQLDocumentProvider()); setSourceViewerConfiguration(new SQLEditorSourceViewerConfiguration(this, getPreferenceStore())); - setKeyBindingScopes(new String[]{TEXT_EDITOR_CONTEXT, SQLEditorContributions.SQL_EDITOR_CONTEXT}); //$NON-NLS-1$ + setKeyBindingScopes(getKeyBindingContexts()); //$NON-NLS-1$ } - + + protected String[] getKeyBindingContexts() { + return new String[]{TEXT_EDITOR_CONTEXT, SQLEditorContributions.SQL_EDITOR_CONTEXT}; + } + @Override protected void initializeEditor() { super.initializeEditor(); diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/sql/SQLEditorContributions.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/sql/SQLEditorContributions.java index f2cfdfbc91e41db8b4fbae3c54396174178e92e3..d68b3974b98c01e6928c2696d87c96f3fdbd8725 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/sql/SQLEditorContributions.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/sql/SQLEditorContributions.java @@ -19,6 +19,7 @@ package org.jkiss.dbeaver.ui.editors.sql; public class SQLEditorContributions { public static final String SQL_EDITOR_CONTEXT = "org.jkiss.dbeaver.ui.editors.sql"; //$NON-NLS-1$ + public static final String SQL_EDITOR_SCRIPT_CONTEXT = "org.jkiss.dbeaver.ui.editors.sql.script"; //$NON-NLS-1$ public static final String SQL_EDITOR_CONTEXT_MENU_ID = "#SQLEditorContext"; //$NON-NLS-1$ public static final String SQL_RULER_CONTEXT_MENU_ID = "#SQLRulerContext"; //$NON-NLS-1$ diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/sql/SQLEditorNested.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/sql/SQLEditorNested.java index 146bf6c0c8622e9357e2b3b2e5be78ac7013186c..96d17c76393ce3951058e5ed78d7d0313e046292 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/sql/SQLEditorNested.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/sql/SQLEditorNested.java @@ -26,6 +26,7 @@ import org.eclipse.core.runtime.jobs.IJobChangeEvent; import org.eclipse.core.runtime.jobs.JobChangeAdapter; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IContributionManager; +import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.Document; @@ -339,6 +340,13 @@ public abstract class SQLEditorNested } } + @Override + public void editorContextMenuAboutToShow(IMenuManager menu) { + super.editorContextMenuAboutToShow(menu); + menu.add(new Separator()); + contributeEditorCommands(menu); + } + @Override public void doSaveAs() { saveToExternalFile(); diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/sql/SQLPreferenceConstants.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/sql/SQLPreferenceConstants.java index c7f68b282fca0938512e1fc2f6dec74d122da29a..3aef91a1bfa2ff99f8d13b023a82c27ed9c50afe 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/sql/SQLPreferenceConstants.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/sql/SQLPreferenceConstants.java @@ -97,6 +97,7 @@ public class SQLPreferenceConstants public final static String SQL_FORMAT_KEYWORD_CASE_AUTO = "SQLEditor.format.keywordCaseAuto"; public final static String SQL_FORMAT_EXTRACT_FROM_SOURCE = "SQLEditor.format.extractFromSource"; + public final static String SQL_FORMAT_BOLD_KEYWORDS = "SQLEditor.format.boldKeywords"; public final static String BEEP_ON_QUERY_END = "SQLEditor.beepOnQueryEnd"; public final static String REFRESH_DEFAULTS_AFTER_EXECUTE = "SQLEditor.refreshDefaultsAfterExecute"; diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/sql/syntax/SQLCompletionProposal.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/sql/syntax/SQLCompletionProposal.java index c6a4e19ca05b50578a99337c3fb940286bc01024..9197c23105529d3d1efe8caa6284d0bd6c62ed65 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/sql/syntax/SQLCompletionProposal.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/sql/syntax/SQLCompletionProposal.java @@ -268,9 +268,10 @@ public class SQLCompletionProposal implements ICompletionProposal, ICompletionPr } String wordLower = wordPart.toLowerCase(Locale.ENGLISH); if (!CommonUtils.isEmpty(wordPart)) { + boolean matchContains = dataSource != null && dataSource.getContainer().getPreferenceStore().getBoolean(SQLPreferenceConstants.PROPOSALS_MATCH_CONTAINS); boolean matched; if (simpleMode) { - matched = replacementFull.startsWith(wordLower) && + matched = (matchContains ? replacementFull.contains(wordLower) : replacementFull.startsWith(wordLower)) && (CommonUtils.isEmpty(event.getText()) || replacementFull.contains(event.getText().toLowerCase(Locale.ENGLISH))) || (this.replacementLast != null && this.replacementLast.startsWith(wordLower)); } else { diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/sql/syntax/SQLRuleManager.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/sql/syntax/SQLRuleManager.java index 958bc7ab4318f7faeedb97d02a4fd24530c10f45..e7aea69a3331f5dfeec5f86b827725cd01b2a7f8 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/sql/syntax/SQLRuleManager.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/sql/syntax/SQLRuleManager.java @@ -28,6 +28,7 @@ import org.eclipse.ui.themes.ITheme; import org.eclipse.ui.themes.IThemeManager; import org.jkiss.code.NotNull; import org.jkiss.code.Nullable; +import org.jkiss.dbeaver.core.DBeaverCore; import org.jkiss.dbeaver.model.DBPDataSource; import org.jkiss.dbeaver.model.sql.SQLConstants; import org.jkiss.dbeaver.model.sql.SQLDialect; @@ -36,6 +37,7 @@ import org.jkiss.dbeaver.model.sql.SQLSyntaxManager; import org.jkiss.dbeaver.registry.sql.SQLCommandHandlerDescriptor; import org.jkiss.dbeaver.registry.sql.SQLCommandsRegistry; import org.jkiss.dbeaver.ui.editors.EditorUtils; +import org.jkiss.dbeaver.ui.editors.sql.SQLPreferenceConstants; import org.jkiss.dbeaver.ui.editors.sql.syntax.rules.*; import org.jkiss.dbeaver.ui.editors.sql.syntax.tokens.*; import org.jkiss.dbeaver.ui.editors.text.TextWhiteSpaceDetector; @@ -136,13 +138,18 @@ public class SQLRuleManager extends RuleBasedScanner { minimalRules = true; } + boolean boldKeywords = dataSource == null ? + DBeaverCore.getGlobalPreferenceStore().getBoolean(SQLPreferenceConstants.SQL_FORMAT_BOLD_KEYWORDS) : + dataSource.getContainer().getPreferenceStore().getBoolean(SQLPreferenceConstants.SQL_FORMAT_BOLD_KEYWORDS); + int keywordStyle = boldKeywords ? SWT.BOLD : SWT.NORMAL; + /*final Color backgroundColor = null;unassigned || dataSource != null ? getColor(SQLConstants.CONFIG_COLOR_BACKGROUND, SWT.COLOR_WHITE) : getColor(SQLConstants.CONFIG_COLOR_DISABLED, SWT.COLOR_WIDGET_LIGHT_SHADOW);*/ final IToken keywordToken = new Token( - new TextAttribute(getColor(SQLConstants.CONFIG_COLOR_KEYWORD), null, SWT.BOLD)); + new TextAttribute(getColor(SQLConstants.CONFIG_COLOR_KEYWORD), null, keywordStyle)); final IToken typeToken = new Token( - new TextAttribute(getColor(SQLConstants.CONFIG_COLOR_DATATYPE), null, SWT.BOLD)); + new TextAttribute(getColor(SQLConstants.CONFIG_COLOR_DATATYPE), null, keywordStyle)); final IToken stringToken = new Token( new TextAttribute(getColor(SQLConstants.CONFIG_COLOR_STRING), null, SWT.NORMAL)); final IToken quotedToken = new Token( @@ -154,19 +161,19 @@ public class SQLRuleManager extends RuleBasedScanner { final SQLDelimiterToken delimiterToken = new SQLDelimiterToken( new TextAttribute(getColor(SQLConstants.CONFIG_COLOR_DELIMITER, SWT.COLOR_RED), null, SWT.NORMAL)); final SQLParameterToken parameterToken = new SQLParameterToken( - new TextAttribute(getColor(SQLConstants.CONFIG_COLOR_PARAMETER, SWT.COLOR_DARK_BLUE), null, SWT.BOLD)); + new TextAttribute(getColor(SQLConstants.CONFIG_COLOR_PARAMETER, SWT.COLOR_DARK_BLUE), null, keywordStyle)); final SQLVariableToken variableToken = new SQLVariableToken( - new TextAttribute(getColor(SQLConstants.CONFIG_COLOR_PARAMETER, SWT.COLOR_DARK_BLUE), null, SWT.BOLD)); + new TextAttribute(getColor(SQLConstants.CONFIG_COLOR_PARAMETER, SWT.COLOR_DARK_BLUE), null, keywordStyle)); final IToken otherToken = new Token( new TextAttribute(getColor(SQLConstants.CONFIG_COLOR_TEXT), null, SWT.NORMAL)); final SQLBlockHeaderToken blockHeaderToken = new SQLBlockHeaderToken( - new TextAttribute(getColor(SQLConstants.CONFIG_COLOR_KEYWORD), null, SWT.BOLD)); + new TextAttribute(getColor(SQLConstants.CONFIG_COLOR_KEYWORD), null, keywordStyle)); final SQLBlockBeginToken blockBeginToken = new SQLBlockBeginToken( - new TextAttribute(getColor(SQLConstants.CONFIG_COLOR_KEYWORD), null, SWT.BOLD)); + new TextAttribute(getColor(SQLConstants.CONFIG_COLOR_KEYWORD), null, keywordStyle)); final SQLBlockEndToken blockEndToken = new SQLBlockEndToken( - new TextAttribute(getColor(SQLConstants.CONFIG_COLOR_KEYWORD), null, SWT.BOLD)); + new TextAttribute(getColor(SQLConstants.CONFIG_COLOR_KEYWORD), null, keywordStyle)); final SQLBlockToggleToken blockToggleToken = new SQLBlockToggleToken( - new TextAttribute(getColor(SQLConstants.CONFIG_COLOR_DELIMITER), null, SWT.BOLD)); + new TextAttribute(getColor(SQLConstants.CONFIG_COLOR_DELIMITER), null, keywordStyle)); setDefaultReturnToken(otherToken); List rules = new ArrayList<>(); @@ -186,7 +193,7 @@ public class SQLRuleManager extends RuleBasedScanner { { final SQLControlToken controlToken = new SQLControlToken( - new TextAttribute(getColor(SQLConstants.CONFIG_COLOR_COMMAND), null, SWT.BOLD)); + new TextAttribute(getColor(SQLConstants.CONFIG_COLOR_COMMAND), null, keywordStyle)); if (ruleProvider != null) { ruleProvider.extendRules(rules, SQLRuleProvider.RulePosition.CONTROL); @@ -251,7 +258,7 @@ public class SQLRuleManager extends RuleBasedScanner { String delimRedefine = dialect.getScriptDelimiterRedefiner(); if (!CommonUtils.isEmpty(delimRedefine)) { final SQLSetDelimiterToken setDelimiterToken = new SQLSetDelimiterToken( - new TextAttribute(getColor(SQLConstants.CONFIG_COLOR_COMMAND), null, SWT.BOLD)); + new TextAttribute(getColor(SQLConstants.CONFIG_COLOR_COMMAND), null, keywordStyle)); rules.add(new SQLDelimiterSetRule(delimRedefine, setDelimiterToken, delimRule)); } diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/perspective/DataSourceManagementToolbar.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/perspective/DataSourceManagementToolbar.java index aea9f423943b8ca935da9552a6f64e067d9e2ae4..7794de88ae48087df32a546941b15cfef152297b 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/perspective/DataSourceManagementToolbar.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/perspective/DataSourceManagementToolbar.java @@ -24,17 +24,13 @@ import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.IJobChangeEvent; import org.eclipse.core.runtime.jobs.JobChangeAdapter; import org.eclipse.jface.dialogs.IDialogConstants; -import org.eclipse.jface.viewers.IColorProvider; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.swt.SWT; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.events.FocusListener; -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.RowData; import org.eclipse.swt.layout.RowLayout; import org.eclipse.swt.widgets.Composite; @@ -66,13 +62,13 @@ import org.jkiss.dbeaver.model.struct.DBSObjectSelector; import org.jkiss.dbeaver.registry.DataSourceProviderRegistry; import org.jkiss.dbeaver.registry.DataSourceRegistry; import org.jkiss.dbeaver.runtime.jobs.DataSourceJob; -import org.jkiss.dbeaver.ui.DBeaverIcons; import org.jkiss.dbeaver.ui.IActionConstants; import org.jkiss.dbeaver.ui.UIUtils; import org.jkiss.dbeaver.ui.actions.DataSourcePropertyTester; import org.jkiss.dbeaver.ui.controls.CSmartSelector; +import org.jkiss.dbeaver.ui.controls.DatabaseLabelProviders; +import org.jkiss.dbeaver.ui.controls.SelectDataSourceCombo; import org.jkiss.dbeaver.ui.dialogs.SelectObjectDialog; -import org.jkiss.dbeaver.ui.dialogs.connection.SelectDataSourceDialog; import org.jkiss.dbeaver.ui.editors.EditorUtils; import org.jkiss.dbeaver.utils.GeneralUtils; import org.jkiss.dbeaver.utils.PrefUtils; @@ -89,8 +85,6 @@ import java.util.*; public class DataSourceManagementToolbar implements DBPRegistryListener, DBPEventListener, DBPPreferenceListener, INavigatorListener { private static final Log log = Log.getLog(DataSourceManagementToolbar.class); - public static final String EMPTY_SELECTION_TEXT = CoreMessages.toolbar_datasource_selector_empty; - private static DataSourceManagementToolbar toolBarInstance; private IWorkbenchWindow workbenchWindow; @@ -99,7 +93,7 @@ public class DataSourceManagementToolbar implements DBPRegistryListener, DBPEven private IPartListener partListener; private Text resultSetSize; - private CSmartSelector connectionCombo; + private SelectDataSourceCombo connectionCombo; private CSmartSelector databaseCombo; private SoftReference curDataSourceContainer = null; @@ -218,6 +212,10 @@ public class DataSourceManagementToolbar implements DBPRegistryListener, DBPEven }; } + public void showConnectionSelector() { + connectionCombo.showConnectionSelector(); + } + private void dispose() { DBeaverCore.getInstance().getNavigatorModel().removeListener(this); @@ -729,13 +727,16 @@ public class DataSourceManagementToolbar implements DBPRegistryListener, DBPEven final int fontHeight = UIUtils.getFontHeight(parent); int comboWidth = fontHeight * 20; - connectionCombo = new CSmartSelector(comboGroup, SWT.DROP_DOWN | SWT.READ_ONLY | SWT.BORDER, new ConnectionLabelProvider()) { + connectionCombo = new SelectDataSourceCombo(comboGroup) { + @Override - protected void dropDown(boolean drop) { - if (!drop) { - return; - } - showConnectionSelector(); + protected IProject getActiveProject() { + return DataSourceManagementToolbar.this.getActiveProject(); + } + + @Override + protected void onDataSourceChange(DBPDataSourceContainer dataSource) { + changeDataSourceSelection(dataSource); } }; RowData rd = new RowData(); @@ -748,7 +749,7 @@ public class DataSourceManagementToolbar implements DBPRegistryListener, DBPEven connectionCombo.select(0); comboWidth = fontHeight * 16; - databaseCombo = new CSmartSelector(comboGroup, SWT.DROP_DOWN | SWT.READ_ONLY | SWT.BORDER, new DatabaseLabelProvider()) { + databaseCombo = new CSmartSelector(comboGroup, SWT.DROP_DOWN | SWT.READ_ONLY | SWT.BORDER, new DatabaseLabelProviders.DatabaseLabelProvider()) { @Override protected void dropDown(boolean drop) { if (!drop) { @@ -808,17 +809,6 @@ public class DataSourceManagementToolbar implements DBPRegistryListener, DBPEven return comboGroup; } - void showConnectionSelector() { - SelectDataSourceDialog dialog = new SelectDataSourceDialog(connectionCombo.getShell(), getActiveProject(), connectionCombo.getSelectedItem()); - dialog.setModeless(true); - if (dialog.open() == IDialogConstants.CANCEL_ID) { - return; - } - DBPDataSourceContainer dataSource = dialog.getDataSource(); - connectionCombo.select(dataSource); - changeDataSourceSelection(dataSource); - } - void showDatabaseSelector() { DBNDatabaseNode selectedDB = databaseCombo.getSelectedItem(); List items = new ArrayList<>(databaseCombo.getItems()); @@ -873,69 +863,4 @@ public class DataSourceManagementToolbar implements DBPRegistryListener, DBPEven } } - private static class ConnectionLabelProvider extends LabelProvider implements IColorProvider { - @Override - public Image getImage(Object element) { - if (element == null) { - return DBeaverIcons.getImage(DBIcon.TREE_DATABASE); - } - DBNModel nm = DBeaverCore.getInstance().getNavigatorModel(); - nm.ensureProjectLoaded(((DBPDataSourceContainer) element).getRegistry().getProject()); - final DBNDatabaseNode node = nm.findNode((DBPDataSourceContainer) element); - return node == null ? null : DBeaverIcons.getImage(node.getNodeIcon()); - } - - @Override - public String getText(Object element) { - if (element == null) { - return EMPTY_SELECTION_TEXT; - } - return ((DBPDataSourceContainer) element).getName(); - } - - @Override - public Color getForeground(Object element) { - return null; - } - - @Override - public Color getBackground(Object element) { - return element == null ? null : UIUtils.getConnectionColor(((DBPDataSourceContainer) element).getConnectionConfiguration()); - } - } - - private static class DatabaseLabelProvider extends LabelProvider implements IColorProvider { - @Override - public Image getImage(Object element) { - if (element == null) { - return DBeaverIcons.getImage(DBIcon.TREE_DATABASE); - } - return DBeaverIcons.getImage(((DBNDatabaseNode)element).getNodeIconDefault()); - } - - @Override - public String getText(Object element) { - if (element == null) { - return EMPTY_SELECTION_TEXT; - } - return ((DBNDatabaseNode)element).getNodeName(); - } - - @Override - public Color getForeground(Object element) { - return null; - } - - @Override - public Color getBackground(Object element) { - if (element instanceof DBNDatabaseNode) { - final DBPDataSourceContainer container = ((DBNDatabaseNode) element).getDataSourceContainer(); - if (container != null) { - return UIUtils.getConnectionColor((container.getConnectionConfiguration())); - } - } - return null; - } - } - } diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/preferences/PrefPageResultSetMain.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/preferences/PrefPageResultSetMain.java index 4657c2b95eb899b2c5be9fba1e67a37d5adc2587..859a3ee1252f95b09c8e096a28eb8706cb609cc8 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/preferences/PrefPageResultSetMain.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/preferences/PrefPageResultSetMain.java @@ -50,6 +50,7 @@ public class PrefPageResultSetMain extends TargetPrefPage private Button alwaysUseAllColumns; private Button newRowsAfter; private Button refreshAfterUpdate; + private Button useNavigatorFilters; private Button advUseFetchSize; @@ -74,7 +75,8 @@ public class PrefPageResultSetMain extends TargetPrefPage store.contains(DBeaverPreferences.RS_EDIT_REFRESH_AFTER_UPDATE) || store.contains(DBeaverPreferences.KEEP_STATEMENT_OPEN) || store.contains(DBeaverPreferences.RESULT_SET_ORDER_SERVER_SIDE) || - store.contains(ModelPreferences.RESULT_SET_USE_FETCH_SIZE) + store.contains(ModelPreferences.RESULT_SET_USE_FETCH_SIZE) || + store.contains(DBeaverPreferences.RESULT_SET_USE_NAVIGATOR_FILTERS) ; } @@ -123,6 +125,7 @@ public class PrefPageResultSetMain extends TargetPrefPage alwaysUseAllColumns = UIUtils.createCheckbox(miscGroup, CoreMessages.pref_page_content_editor_checkbox_keys_always_use_all_columns, false); newRowsAfter = UIUtils.createCheckbox(miscGroup, CoreMessages.pref_page_content_editor_checkbox_new_rows_after, false); refreshAfterUpdate = UIUtils.createCheckbox(miscGroup, CoreMessages.pref_page_content_editor_checkbox_refresh_after_update, false); + useNavigatorFilters = UIUtils.createCheckbox(miscGroup, CoreMessages.pref_page_content_editor_checkbox_use_navigator_filters, CoreMessages.pref_page_content_editor_checkbox_use_navigator_filters_tip, false, 1); } { @@ -155,6 +158,7 @@ public class PrefPageResultSetMain extends TargetPrefPage alwaysUseAllColumns.setSelection(store.getBoolean(DBeaverPreferences.RS_EDIT_USE_ALL_COLUMNS)); newRowsAfter.setSelection(store.getBoolean(DBeaverPreferences.RS_EDIT_NEW_ROWS_AFTER)); refreshAfterUpdate.setSelection(store.getBoolean(DBeaverPreferences.RS_EDIT_REFRESH_AFTER_UPDATE)); + useNavigatorFilters.setSelection(store.getBoolean(DBeaverPreferences.RESULT_SET_USE_NAVIGATOR_FILTERS)); advUseFetchSize.setSelection(store.getBoolean(ModelPreferences.RESULT_SET_USE_FETCH_SIZE)); @@ -181,6 +185,7 @@ public class PrefPageResultSetMain extends TargetPrefPage store.setValue(DBeaverPreferences.RS_EDIT_USE_ALL_COLUMNS, alwaysUseAllColumns.getSelection()); store.setValue(DBeaverPreferences.RS_EDIT_NEW_ROWS_AFTER, newRowsAfter.getSelection()); store.setValue(DBeaverPreferences.RS_EDIT_REFRESH_AFTER_UPDATE, refreshAfterUpdate.getSelection()); + store.setValue(DBeaverPreferences.RESULT_SET_USE_NAVIGATOR_FILTERS, useNavigatorFilters.getSelection()); store.setValue(ModelPreferences.RESULT_SET_USE_FETCH_SIZE, advUseFetchSize.getSelection()); } catch (Exception e) { @@ -205,6 +210,7 @@ public class PrefPageResultSetMain extends TargetPrefPage store.setToDefault(DBeaverPreferences.RS_EDIT_USE_ALL_COLUMNS); store.setToDefault(DBeaverPreferences.RS_EDIT_NEW_ROWS_AFTER); store.setToDefault(DBeaverPreferences.RS_EDIT_REFRESH_AFTER_UPDATE); + store.setToDefault(DBeaverPreferences.RESULT_SET_USE_NAVIGATOR_FILTERS); store.setToDefault(ModelPreferences.RESULT_SET_USE_FETCH_SIZE); diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/preferences/PrefPageSQLFormat.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/preferences/PrefPageSQLFormat.java index 36643193971289465331379022cddacd5dac7211..a56ccbec75c7322b6a5654577df9e2ec9af2fb0a 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/preferences/PrefPageSQLFormat.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/preferences/PrefPageSQLFormat.java @@ -72,6 +72,8 @@ public class PrefPageSQLFormat extends TargetPrefPage private Button afKeywordCase; private Button afExtractFromSource; + private Button styleBoldKeywords; + // Formatter private Combo formatterSelector; private Combo keywordCaseCombo; @@ -99,6 +101,7 @@ public class PrefPageSQLFormat extends TargetPrefPage store.contains(SQLPreferenceConstants.SQLEDITOR_CLOSE_BRACKETS) || store.contains(SQLPreferenceConstants.SQL_FORMAT_KEYWORD_CASE_AUTO) || store.contains(SQLPreferenceConstants.SQL_FORMAT_EXTRACT_FROM_SOURCE) || + store.contains(SQLPreferenceConstants.SQL_FORMAT_BOLD_KEYWORDS) || store.contains(ModelPreferences.SQL_FORMAT_FORMATTER) || store.contains(ModelPreferences.SQL_FORMAT_KEYWORD_CASE) || @@ -142,6 +145,24 @@ public class PrefPageSQLFormat extends TargetPrefPage CoreMessages.pref_page_sql_format_label_extract_sql_from_source_code_tip, false, 1); } + { + // Styles + Composite afGroup = UIUtils.createControlGroup(composite, CoreMessages.pref_page_sql_format_group_style, 1, GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING, 0); + ((GridData)afGroup.getLayoutData()).horizontalSpan = 2; + styleBoldKeywords = UIUtils.createCheckbox( + afGroup, + CoreMessages.pref_page_sql_format_label_bold_keywords, + CoreMessages.pref_page_sql_format_label_bold_keywords_tip, + false, 1); + styleBoldKeywords.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + performApply(); + } + }); + + } + Composite formatterGroup = UIUtils.createControlGroup(composite, CoreMessages.pref_page_sql_format_group_formatter, 1, GridData.FILL_BOTH, 0); ((GridData)formatterGroup.getLayoutData()).horizontalSpan = 2; @@ -258,6 +279,7 @@ public class PrefPageSQLFormat extends TargetPrefPage acBracketsCheck.setSelection(store.getBoolean(SQLPreferenceConstants.SQLEDITOR_CLOSE_BRACKETS)); afKeywordCase.setSelection(store.getBoolean(SQLPreferenceConstants.SQL_FORMAT_KEYWORD_CASE_AUTO)); afExtractFromSource.setSelection(store.getBoolean(SQLPreferenceConstants.SQL_FORMAT_EXTRACT_FROM_SOURCE)); + styleBoldKeywords.setSelection(store.getBoolean(SQLPreferenceConstants.SQL_FORMAT_BOLD_KEYWORDS)); String formatterId = store.getString(ModelPreferences.SQL_FORMAT_FORMATTER); for (int i = 0; i < formatters.size(); i++) { @@ -292,6 +314,7 @@ public class PrefPageSQLFormat extends TargetPrefPage store.setValue(SQLPreferenceConstants.SQL_FORMAT_KEYWORD_CASE_AUTO, afKeywordCase.getSelection()); store.setValue(SQLPreferenceConstants.SQL_FORMAT_EXTRACT_FROM_SOURCE, afExtractFromSource.getSelection()); + store.setValue(SQLPreferenceConstants.SQL_FORMAT_BOLD_KEYWORDS, styleBoldKeywords.getSelection()); store.setValue(ModelPreferences.SQL_FORMAT_FORMATTER, formatters.get(formatterSelector.getSelectionIndex()).getId().toUpperCase(Locale.ENGLISH)); @@ -319,6 +342,7 @@ public class PrefPageSQLFormat extends TargetPrefPage store.setToDefault(SQLPreferenceConstants.SQLEDITOR_CLOSE_BRACKETS); store.setToDefault(SQLPreferenceConstants.SQL_FORMAT_KEYWORD_CASE_AUTO); store.setToDefault(SQLPreferenceConstants.SQL_FORMAT_EXTRACT_FROM_SOURCE); + store.setToDefault(SQLPreferenceConstants.SQL_FORMAT_BOLD_KEYWORDS); store.setToDefault(ModelPreferences.SQL_FORMAT_FORMATTER); store.setToDefault(ModelPreferences.SQL_FORMAT_KEYWORD_CASE); diff --git a/plugins/org.jkiss.dbeaver.data.gis/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.data.gis/META-INF/MANIFEST.MF index ad1038770bf0ace2b3e4d1ea656d0c8e6cec38ff..8fdb2d8442e9478e451bf3fddf3003af7fd677d1 100644 --- a/plugins/org.jkiss.dbeaver.data.gis/META-INF/MANIFEST.MF +++ b/plugins/org.jkiss.dbeaver.data.gis/META-INF/MANIFEST.MF @@ -3,8 +3,8 @@ Bundle-ManifestVersion: 2 Bundle-Vendor: %Bundle-Vendor Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.data.gis;singleton:=true -Bundle-Version: 1.0.6 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.7 +Bundle-Release-Date: 20180514 Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Require-Bundle: org.jkiss.dbeaver.model, org.jkiss.dbeaver.core, diff --git a/plugins/org.jkiss.dbeaver.data.gis/pom.xml b/plugins/org.jkiss.dbeaver.data.gis/pom.xml index 8b1d6c05b9a6d18c235e38c3c71112678ac1f26d..37e6a0e12bcfcd03311769c3cb44c9e042ec5828 100644 --- a/plugins/org.jkiss.dbeaver.data.gis/pom.xml +++ b/plugins/org.jkiss.dbeaver.data.gis/pom.xml @@ -10,7 +10,7 @@ ../../ org.jkiss.dbeaver.data.gis - 1.0.6 + 1.0.7 eclipse-plugin diff --git a/plugins/org.jkiss.dbeaver.data.office/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.data.office/META-INF/MANIFEST.MF index 46e81697bd39e57a087c31f07cb5d8c1fedd1188..8b78e409d3bf16c95aa95888f7980839473b492e 100644 --- a/plugins/org.jkiss.dbeaver.data.office/META-INF/MANIFEST.MF +++ b/plugins/org.jkiss.dbeaver.data.office/META-INF/MANIFEST.MF @@ -3,8 +3,8 @@ Bundle-ManifestVersion: 2 Bundle-Vendor: %Bundle-Vendor Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.data.office;singleton:=true -Bundle-Version: 1.1.19 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.1.20 +Bundle-Release-Date: 20180514 Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Require-Bundle: org.eclipse.core.runtime, org.eclipse.swt, diff --git a/plugins/org.jkiss.dbeaver.data.office/pom.xml b/plugins/org.jkiss.dbeaver.data.office/pom.xml index c6747201f9bd7fa98045a7ce3df34c0b2edbee1c..37c48b071afaabe2d42be13e59d6b6bcdaebe9c6 100644 --- a/plugins/org.jkiss.dbeaver.data.office/pom.xml +++ b/plugins/org.jkiss.dbeaver.data.office/pom.xml @@ -10,7 +10,7 @@ ../../ org.jkiss.dbeaver.data.office - 1.1.19 + 1.1.20 eclipse-plugin - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/org.jkiss.dbeaver.debug.core/pom.xml b/plugins/org.jkiss.dbeaver.debug.core/pom.xml index e16f7819b3623a650392904c3976a52027cb5778..c0dcd3b309195499cfe9460add5a6c79e49ef329 100644 --- a/plugins/org.jkiss.dbeaver.debug.core/pom.xml +++ b/plugins/org.jkiss.dbeaver.debug.core/pom.xml @@ -9,6 +9,6 @@ ../../ org.jkiss.dbeaver.debug.core - 1.0.11 + 1.0.12 eclipse-plugin diff --git a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/DBGBaseController.java b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/DBGBaseController.java index f38ebe5913cd2ab78c60b8606dc1253bac9c08d7..e3bc120f17ae4e19aef0fdc0c0bf2d7de5314bfe 100644 --- a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/DBGBaseController.java +++ b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/DBGBaseController.java @@ -18,37 +18,31 @@ */ package org.jkiss.dbeaver.debug; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - import org.eclipse.core.runtime.ListenerList; import org.eclipse.osgi.util.NLS; import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.debug.internal.DebugMessages; -import org.jkiss.dbeaver.model.DBPDataSource; +import org.jkiss.dbeaver.debug.jdbc.DBGJDBCSession; import org.jkiss.dbeaver.model.DBPDataSourceContainer; -import org.jkiss.dbeaver.model.exec.DBCExecutionContext; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; +import java.util.HashMap; +import java.util.Map; + public abstract class DBGBaseController implements DBGController { private static final Log log = Log.getLog(DBGBaseController.class); private final DBPDataSourceContainer dataSourceContainer; - private final Map configuration = new HashMap(); - private final Map sessions = new HashMap(1); + private final Map configuration; private ListenerList eventHandlers = new ListenerList<>(); - private DBCExecutionContext executionContext; - - public DBGBaseController(DBPDataSourceContainer dataSourceContainer) { + protected DBGBaseController(DBPDataSourceContainer dataSourceContainer, Map configuration) { this.dataSourceContainer = dataSourceContainer; + this.configuration = new HashMap<>(configuration); } @Override @@ -58,20 +52,11 @@ public abstract class DBGBaseController implements DBGController { @Override public Map getDebugConfiguration() { - return new HashMap(configuration); - } - - public DBCExecutionContext getExecutionContext() { - return executionContext; - } - - @Override - public void init(Map context) { - this.configuration.putAll(context); + return new HashMap<>(configuration); } @Override - public Object attach(DBRProgressMonitor monitor) throws DBGException { + public DBGSession openSession(DBRProgressMonitor monitor) throws DBGException { if (!dataSourceContainer.isConnected()) { try { dataSourceContainer.connect(monitor, true, true); @@ -82,186 +67,20 @@ public abstract class DBGBaseController implements DBGController { if (!dataSourceContainer.isConnected()) { throw new DBGException("Not connected to database"); } - DBPDataSource dataSource = dataSourceContainer.getDataSource(); - try { - this.executionContext = dataSource.openIsolatedContext(monitor, "Debug controller"); - DBGSessionInfo targetInfo = getSessionDescriptor(getExecutionContext()); - DBCExecutionContext sessionContext = dataSource.openIsolatedContext(monitor, "Debug session"); - DBGBaseSession debugSession = createSession(targetInfo, sessionContext); - Object id = targetInfo.getID(); - sessions.put(id, debugSession); - attachSession(debugSession, sessionContext, configuration, monitor); - return id; - } catch (DBException e) { - String message = NLS.bind(DebugMessages.DatabaseDebugController_e_opening_debug_context, - dataSourceContainer); - log.error(message, e); - throw new DBGException(message, e); - } - } - - public abstract void attachSession(DBGSession session, DBCExecutionContext sessionContext, - Map configuataion, DBRProgressMonitor monitor) throws DBGException, DBException; - - @Override - public boolean canSuspend(Object sessionKey) { - return false; - } - - @Override - public boolean canResume(Object sessionKey) { - return isSessionAccessible(sessionKey); - } - - @Override - public void suspend(Object sessionkey) throws DBGException { - // not supported by default - } - - @Override - public void resume(Object sessionKey) throws DBGException { - DBGSession session = ensureSessionAccessible(sessionKey); - session.execContinue(); - } - - @Override - public void detach(Object sessionkey, DBRProgressMonitor monitor) throws DBGException { - DBGSession session = sessions.remove(sessionkey); - if (session != null) { - session.close(); - } + return createSession(monitor, configuration); } @Override public void dispose() { - if (executionContext != null) { - executionContext.close(); - } - Collection values = sessions.values(); - for (DBGBaseSession session : values) { - try { - session.close(); - } catch (DBGException e) { - String message = NLS.bind("Error while closing session {0}", session); - log.error(message, e); - } - } Object[] listeners = eventHandlers.getListeners(); for (Object listener : listeners) { unregisterEventHandler((DBGEventHandler) listener); } } - @Override - public List getBreakpoints(Object sessionKey) throws DBGException { - DBGBaseSession session = ensureSessionAccessible(sessionKey); - return session.getBreakpoints(); - } - - @Override - public void addBreakpoint(Object sessionKey, DBGBreakpointDescriptor descriptor) throws DBGException { - DBGBaseSession session = ensureSessionAccessible(sessionKey); - session.addBreakpoint(descriptor); - } - - @Override - public void removeBreakpoint(Object sessionKey, DBGBreakpointDescriptor descriptor) throws DBGException { - DBGBaseSession session = ensureSessionAccessible(sessionKey); - session.removeBreakpoint(descriptor); - } - - @Override - public List getStack(Object id) throws DBGException { - DBGSession session = ensureSessionAccessible(id); - return session.getStack(); - } - - @Override - public List> getVariables(Object id, DBGStackFrame stack) throws DBGException { - DBGSession session = ensureSessionAccessible(id); - if (stack != null) { - session.selectFrame(stack.getLevel()); - } - return session.getVariables(); - } - - @Override - public String getSource(Object sessionKey, DBGStackFrame stack) throws DBGException { - DBGSession session = ensureSessionAccessible(sessionKey); - return session.getSource(stack); - } - - public abstract DBGBaseSession createSession(DBGSessionInfo targetInfo, DBCExecutionContext connection) + public abstract DBGJDBCSession createSession(DBRProgressMonitor monitor, Map configuration) throws DBGException; - protected DBGBaseSession findSession(Object id) { - return sessions.get(id); - } - - public boolean isSessionExists(Object id) { - return sessions.containsKey(id); - } - - public List getSessions() throws DBGException { - return new ArrayList(sessions.values()); - } - - @Override - public boolean canStepInto(Object sessionKey) { - return isSessionAccessible(sessionKey); - } - - @Override - public boolean canStepOver(Object sessionKey) { - return isSessionAccessible(sessionKey); - } - - @Override - public boolean canStepReturn(Object sessionKey) { - // hmm, not sure - return false; - } - - @Override - public void stepInto(Object sessionKey) throws DBGException { - DBGSession session = ensureSessionAccessible(sessionKey); - session.execStepInto(); - } - - @Override - public void stepOver(Object sessionKey) throws DBGException { - DBGSession session = ensureSessionAccessible(sessionKey); - session.execStepOver(); - } - - @Override - public void stepReturn(Object sessionKey) throws DBGException { - // throw DBGException? - } - - protected DBGBaseSession ensureSessionAccessible(Object sessionKey) throws DBGException { - DBGBaseSession session = findSession(sessionKey); - if (session == null) { - String message = NLS.bind("Session for {0} is not available", sessionKey); - throw new DBGException(message); - } - boolean isAccessible = session.isAttached() && !session.isWaiting() && session.isDone(); - if (!isAccessible) { - String message = NLS.bind("Session for {0} is not accessible", sessionKey); - throw new DBGException(message); - } - return session; - } - - protected boolean isSessionAccessible(Object sessionKey) { - DBGBaseSession session = findSession(sessionKey); - if (session == null) { - return false; - } - boolean isAccessible = session.isAttached() && !session.isWaiting() && session.isDone(); - return isAccessible; - } - @Override public void registerEventHandler(DBGEventHandler eventHandler) { eventHandlers.add(eventHandler); @@ -278,22 +97,4 @@ public abstract class DBGBaseController implements DBGController { } } - /* - * protected void executeProcedure(DBPDataSource dataSource, Map 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(); } - */ - } diff --git a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/DBGBaseSession.java b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/DBGBaseSession.java deleted file mode 100644 index 84265213b4101dad67e60f5a8102d74a9d1da924..0000000000000000000000000000000000000000 --- a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/DBGBaseSession.java +++ /dev/null @@ -1,233 +0,0 @@ -/* - * DBeaver - Universal Database Manager - * Copyright (C) 2010-2018 Serge Rider (serge@jkiss.org) - * Copyright (C) 2017-2018 Andrew Khitrin (ahitrin@gmail.com) - * Copyright (C) 2017-2018 Alexander Fedorov (alexander.fedorov@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.debug; - -import java.sql.Connection; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.FutureTask; -import java.util.concurrent.locks.ReentrantReadWriteLock; - -import org.jkiss.dbeaver.model.impl.jdbc.JDBCExecutionContext; -import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor; - -public abstract class DBGBaseSession implements DBGSession { - - protected final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(true); - - private final DBGBaseController controller; - - protected FutureTask task; - - private Thread workerThread = null; - - private JDBCExecutionContext connection = null; - - private final List breakpoints = new ArrayList<>(1); - - protected DBGBaseSession(DBGBaseController controller) { - this.controller = controller; - } - - /** - * Return connection used in debug session - * - * @return java.sql.Connection - * @throws DBGException - */ - // FIXME: rework to DBC API - protected Connection getConnection() throws DBGException { - try { - return ((JDBCExecutionContext) connection).getConnection(new VoidProgressMonitor()); - } catch (SQLException e) { - throw new DBGException("SQL error", e); - } - } - - // FIXME: should be known during construction - protected void setConnection(JDBCExecutionContext connection) { - this.connection = connection; - } - - protected DBGBaseController getController() { - return controller; - } - - /** - * Return true if debug session up and running on server - * - * @return boolean - */ - public boolean isAttached() { - return connection != null; - } - - /** - * Return true if session up and running debug thread - * - * @return boolean - */ - public boolean isWaiting() { - return (task == null ? false : !task.isDone()) && (workerThread == null ? false : workerThread.isAlive()); - } - - public abstract boolean isDone(); - - /** - * Start thread for SQL command - * - * @param commandSQL - * @param name - * @throws DBGException - */ - protected void runAsync(String commandSQL, String name, DBGEvent begin, DBGEvent end) throws DBGException { - Connection connection = getConnection(); - try (Statement stmt = connection.createStatement()) { - connection.setAutoCommit(false); - } catch (SQLException e) { - throw new DBGException("SQL error", e); - } - DBGWorker worker = new DBGWorker(this, commandSQL, begin, end); - task = new FutureTask(worker); - workerThread = new Thread(task); - workerThread.setName(name); - workerThread.start(); - } - - public void close() throws DBGException { - lock.writeLock().lock(); - try { - if (!isAttached()) { - lock.writeLock().unlock(); - throw new DBGException("Debug session not attached"); - } - doDetach(); - if (!isDone() && task != null) { - task.cancel(true); - } - - connection.close(); - } finally { - lock.writeLock().unlock(); - } - } - - protected abstract void doDetach() throws DBGException; - - protected abstract String composeAbortCommand(); - - @Override - public List getBreakpoints() { - return new ArrayList(breakpoints); - } - - @Override - public void addBreakpoint(DBGBreakpointDescriptor descriptor) throws DBGException { - acquireReadLock(); - try { - try (Statement stmt = getConnection().createStatement()) { - String sqlQuery = composeAddBreakpointCommand(descriptor); - stmt.executeQuery(sqlQuery); - } catch (SQLException e) { - throw new DBGException("SQL error", e); - } - breakpoints.add(descriptor); - } finally { - lock.readLock().unlock(); - } - } - - protected abstract String composeAddBreakpointCommand(DBGBreakpointDescriptor descriptor); - - @Override - public void removeBreakpoint(DBGBreakpointDescriptor bp) throws DBGException { - acquireReadLock(); - try { - try (Statement stmt = getConnection().createStatement()) { - String sqlCommand = composeRemoveBreakpointCommand(bp); - stmt.executeQuery(sqlCommand); - } catch (SQLException e) { - throw new DBGException("SQL error", e); - } - breakpoints.remove(bp); - } finally { - lock.readLock().unlock(); - } - } - - protected abstract String composeRemoveBreakpointCommand(DBGBreakpointDescriptor descriptor); - - /** - * Try to acquire shared lock - * - * @throws DBGException - */ - protected void acquireReadLock() throws DBGException { - try { - lock.readLock().lockInterruptibly(); - } catch (InterruptedException e1) { - throw new DBGException(e1.getMessage()); - } - if (!isAttached()) { - lock.readLock().unlock(); - throw new DBGException("Debug session not attached"); - } - if (isWaiting()) { - lock.readLock().unlock(); - throw new DBGException("Debug session in waiting state"); - } - if (!isDone()) { - lock.readLock().unlock(); - throw new DBGException("Debug session in incorrect state"); - } - - } - - /** - * Try to acquire exclusive lock - * - * @throws DBGException - */ - protected void acquireWriteLock() throws DBGException { - try { - lock.writeLock().lockInterruptibly(); - } catch (InterruptedException e1) { - throw new DBGException(e1.getMessage()); - } - if (!isAttached()) { - lock.writeLock().unlock(); - throw new DBGException("Debug session not attached"); - } - if (isWaiting()) { - lock.writeLock().unlock(); - throw new DBGException("Debug session in waiting state"); - } - if (!isDone()) { - lock.writeLock().unlock(); - throw new DBGException("Debug session in incorrect state"); - } - } - - protected void fireEvent(DBGEvent event) { - controller.fireEvent(event); - } - -} diff --git a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/DBGBreakpointDescriptor.java b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/DBGBreakpointDescriptor.java index 8dfacac86f79b2c2bb8c45b19ca5ef273db843b8..d4ff4fdb9ecdd69e249b710ae344c1b46cda33c1 100644 --- a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/DBGBreakpointDescriptor.java +++ b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/DBGBreakpointDescriptor.java @@ -19,10 +19,12 @@ package org.jkiss.dbeaver.debug; +import java.util.Map; + public interface DBGBreakpointDescriptor { Object getObjectId(); - DBGBreakpointProperties getProperties(); + Map toMap(); } diff --git a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/DBGConstants.java b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/DBGConstants.java new file mode 100644 index 0000000000000000000000000000000000000000..985aea7efa0730d242d13b8a59562ee1410b69a6 --- /dev/null +++ b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/DBGConstants.java @@ -0,0 +1,34 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2018 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.debug; + +import org.jkiss.dbeaver.runtime.ide.core.DBeaverIDECore; + +public class DBGConstants { + + public static final String BUNDLE_SYMBOLIC_NAME = "org.jkiss.dbeaver.debug.core"; //$NON-NLS-1$ + + public static final String ATTR_DATASOURCE_ID = BUNDLE_SYMBOLIC_NAME + ".ATTR_DATASOURCE_ID"; //$NON-NLS-1$ + public static final String ATTR_DEBUG_TYPE = BUNDLE_SYMBOLIC_NAME + ".ATTR_DEBUG_TYPE"; //$NON-NLS-1$ + + public static final String SOURCE_CONTAINER_TYPE_DATASOURCE = BUNDLE_SYMBOLIC_NAME + ".datasourceSourceContainerType"; //$NON-NLS-1$ + public static final String BREAKPOINT_ID_DATABASE_LINE = BUNDLE_SYMBOLIC_NAME + ".databaseLineBreakpointMarker"; //$NON-NLS-1$ + public static final String MODEL_IDENTIFIER_DATABASE = BUNDLE_SYMBOLIC_NAME + ".database"; //$NON-NLS-1$ + public static final String BREAKPOINT_ATTRIBUTE_DATASOURCE_ID = DBeaverIDECore.MARKER_ATTRIBUTE_DATASOURCE_ID; + public static final String BREAKPOINT_ATTRIBUTE_NODE_PATH = DBeaverIDECore.MARKER_ATTRIBUTE_NODE_PATH; + +} diff --git a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/DBGController.java b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/DBGController.java index 14099e2eb5b6121ebcc0e54e45e19912644b369b..72bb725d4b9a1f5bf2973eb8350aa6740668a67c 100644 --- a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/DBGController.java +++ b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/DBGController.java @@ -30,109 +30,25 @@ 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 PROCEDURE_NAME = "procedureName"; //$NON-NLS-1$ - - public static final String ATTACH_PROCESS = "attachProcess"; //$NON-NLS-1$ - public static final String ATTACH_PROCESS_ANY = "-1"; //$NON-NLS-1$ - public static final String ATTACH_KIND = "attachKind"; //$NON-NLS-1$ - public static final String ATTACH_KIND_LOCAL = "LOCAL"; //$NON-NLS-1$ - public static final String ATTACH_KIND_GLOBAL = "GLOBAL"; //$NON-NLS-1$ - - public static final String SCRIPT_EXECUTE = "scriptExecute"; //$NON-NLS-1$ - public static final String SCRIPT_TEXT = "scriptText"; //$NON-NLS-1$ - - public static final String BREAKPOINT_LINE_NUMBER = "lineNumber"; //$NON-NLS-1$ - DBPDataSourceContainer getDataSourceContainer(); Map getDebugConfiguration(); - /* - * General lifecycle - */ - - /** - * Sets debug context like OID etc. - * - * @param context - */ - void init(Map context); - /** * - * @param monitor * @return key to use for detach - * @throws DBGException */ - Object attach(DBRProgressMonitor monitor) throws DBGException; - - /** - * - * @param sessionKey - * the key obtained as a result of attach - * @param monitor - * @throws DBGException - */ - void detach(Object sessionKey, DBRProgressMonitor monitor) throws DBGException; - - void dispose(); - - DBGSessionInfo getSessionDescriptor(DBCExecutionContext connection) throws DBGException; - - List getSessionDescriptors() throws DBGException; + DBGSession openSession(DBRProgressMonitor monitor) throws DBGException; DBGBreakpointDescriptor describeBreakpoint(Map attributes); - List getBreakpoints(Object sessionKey) throws DBGException; - - void addBreakpoint(Object sessionKey, DBGBreakpointDescriptor descriptor) throws DBGException; - - void removeBreakpoint(Object sessionKey, DBGBreakpointDescriptor descriptor) throws DBGException; - - List getStack(Object sessionKey) throws DBGException; - - List> getVariables(Object sessionKey, DBGStackFrame stack) throws DBGException; - - String getSource(Object sessionKey, DBGStackFrame stack) throws DBGException; - - List getObjects(String ownerCtx, String nameCtx) throws DBGException; - - /* - * suspend/resume - */ - boolean canSuspend(Object sessionKey); - - boolean canResume(Object sessionKey); - - void suspend(Object sessionKey) throws DBGException; - - void resume(Object sessionKey) throws DBGException; - - /* - * Stepping - */ - - boolean canStepInto(Object sessionKey); - - boolean canStepOver(Object sessionKey); - - boolean canStepReturn(Object sessionKey); - - void stepInto(Object sessionKey) throws DBGException; - - void stepOver(Object sessionKey) throws DBGException; - - void stepReturn(Object sessionKey) throws DBGException; - /* * Events */ - void registerEventHandler(DBGEventHandler eventHandler); void unregisterEventHandler(DBGEventHandler eventHandler); + void dispose(); + } diff --git a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/DBGBreakpointProperties.java b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/DBGControllerFactory.java similarity index 77% rename from plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/DBGBreakpointProperties.java rename to plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/DBGControllerFactory.java index b594f007a0500df593adb7e85cd4d526f70dd5d6..451fc9cb2d2f7573d5f99facad2c441bcd4cdf49 100644 --- a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/DBGBreakpointProperties.java +++ b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/DBGControllerFactory.java @@ -16,14 +16,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package org.jkiss.dbeaver.debug; +import org.jkiss.dbeaver.model.DBPDataSourceContainer; + import java.util.Map; -//FIXME:AF:Merge into DBGBreakpointDescriptor -public interface DBGBreakpointProperties { +/** + * Controller factory + */ +public interface DBGControllerFactory { - Map toMap(); + DBGController createController(DBPDataSourceContainer dataSource, Map context) throws DBGException; } diff --git a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/DBGDebugObject.java b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/DBGDebugObject.java new file mode 100644 index 0000000000000000000000000000000000000000..ac06488613b4923625a622efee7e9f5ca2a4ba72 --- /dev/null +++ b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/DBGDebugObject.java @@ -0,0 +1,27 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2018 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.debug; + +import org.jkiss.dbeaver.model.DBPObject; + +/** + * Object which can be debugged + */ +public interface DBGDebugObject extends DBPObject { + +} diff --git a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/DBGSession.java b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/DBGSession.java index 9444398cf723b89c4fcf2a9be3698f4a8f6c9e1d..d6d2f3ba7d2c0f78945ff73015fd5ddda921b7ce 100644 --- a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/DBGSession.java +++ b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/DBGSession.java @@ -19,17 +19,27 @@ package org.jkiss.dbeaver.debug; +import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; + import java.util.List; public interface DBGSession { DBGSessionInfo getSessionInfo(); + Object getSessionId(); + List getBreakpoints(); - void addBreakpoint(DBGBreakpointDescriptor descriptor) throws DBGException; + void addBreakpoint(DBRProgressMonitor monitor, DBGBreakpointDescriptor descriptor) throws DBGException; + + void removeBreakpoint(DBRProgressMonitor monitor, DBGBreakpointDescriptor descriptor) throws DBGException; + + boolean canStepInto(); + + boolean canStepOver(); - void removeBreakpoint(DBGBreakpointDescriptor descriptor) throws DBGException; + boolean canStepReturn(); void execContinue() throws DBGException; @@ -37,17 +47,20 @@ public interface DBGSession { void execStepOver() throws DBGException; - void close() throws DBGException; + void execStepReturn() throws DBGException; - List> getVariables() throws DBGException; + void resume() throws DBGException; + + void suspend() throws DBGException; + + List> getVariables(DBGStackFrame stack) throws DBGException; void setVariableVal(DBGVariable variable, Object value) throws DBGException; List getStack() throws DBGException; - Object getSessionId(); + String getSource(DBGStackFrame stack) throws DBGException; - void selectFrame(int frameNumber) throws DBGException; + void closeSession(DBRProgressMonitor monitor) throws DBGException; - String getSource(DBGStackFrame stack) throws DBGException; } diff --git a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/DBGWorker.java b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/DBGWorker.java deleted file mode 100644 index b1f1859cf62ea1d733b4870e2eaaa44c4b36aa09..0000000000000000000000000000000000000000 --- a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/DBGWorker.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * DBeaver - Universal Database Manager - * Copyright (C) 2010-2018 Serge Rider (serge@jkiss.org) - * Copyright (C) 2017-2018 Andrew Khitrin (ahitrin@gmail.com) - * Copyright (C) 2017-2018 Alexander Fedorov (alexander.fedorov@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.debug; - -import java.sql.SQLException; -import java.sql.Statement; -import java.util.concurrent.Callable; - -public class DBGWorker implements Callable { - - private final DBGBaseSession session; - private final String sql; - private final DBGEvent before; - private final DBGEvent after; - - public DBGWorker(DBGBaseSession session, String sqlCommand, DBGEvent begin, DBGEvent end) { - this.session = session; - this.sql = sqlCommand; - this.before = begin; - this.after = end; - } - - @Override - public Void call() throws Exception { - - try (Statement stmt = session.getConnection().createStatement()) { - session.fireEvent(before); - stmt.executeQuery(sql); - session.fireEvent(after); - return null; - } catch (SQLException e) { - String message = String.format("Failed to execute %s", sql); - throw new Exception(message, e); - } - } - -} diff --git a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/DatabaseLaunchDelegate.java b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/DatabaseLaunchDelegate.java index cc0e8e31844a1c76fc117b8e5e83c29285b15a14..e78e24f0405de9bfca42ba9ac7f1cf098cf4b1a0 100644 --- a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/DatabaseLaunchDelegate.java +++ b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/DatabaseLaunchDelegate.java @@ -17,16 +17,16 @@ */ package org.jkiss.dbeaver.debug.core; -import java.util.HashMap; -import java.util.Map; - +import org.eclipse.core.runtime.Adapters; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.debug.core.ILaunch; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.model.LaunchConfigurationDelegate; import org.eclipse.osgi.util.NLS; +import org.jkiss.dbeaver.debug.DBGConstants; import org.jkiss.dbeaver.debug.DBGController; +import org.jkiss.dbeaver.debug.DBGControllerFactory; import org.jkiss.dbeaver.debug.DBGException; import org.jkiss.dbeaver.debug.core.model.DatabaseDebugTarget; import org.jkiss.dbeaver.debug.core.model.DatabaseProcess; @@ -35,49 +35,39 @@ import org.jkiss.dbeaver.registry.DataSourceDescriptor; import org.jkiss.dbeaver.registry.DataSourceRegistry; import org.jkiss.dbeaver.utils.GeneralUtils; +import java.util.Map; + public class DatabaseLaunchDelegate extends LaunchConfigurationDelegate { @Override public void launch(ILaunchConfiguration configuration, String mode, ILaunch launch, IProgressMonitor monitor) throws CoreException { - String datasourceId = DebugCore.extractDatasourceId(configuration); + String datasourceId = configuration.getAttribute(DBGConstants.ATTR_DATASOURCE_ID, (String)null); DataSourceDescriptor datasourceDescriptor = DataSourceRegistry.findDataSource(datasourceId); if (datasourceDescriptor == null) { String message = NLS.bind("Unable to find data source with id {0}", datasourceId); - throw new CoreException(DebugCore.newErrorStatus(message)); + throw new CoreException(DebugUtils.newErrorStatus(message)); } - Map attributes = extractAttributes(configuration); - DBGController controller = createController(datasourceDescriptor); + DBGController controller = createController(datasourceDescriptor, configuration.getAttributes()); if (controller == null) { String message = NLS.bind("Unable to find debug controller for datasource {0}", datasourceDescriptor); - throw new CoreException(DebugCore.newErrorStatus(message)); + throw new CoreException(DebugUtils.newErrorStatus(message)); } - controller.init(attributes); DatabaseProcess process = createProcess(launch, configuration.getName()); DatabaseDebugTarget target = createDebugTarget(launch, controller, process); target.connect(monitor); launch.addDebugTarget(target); } - protected Map extractAttributes(ILaunchConfiguration configuration) throws CoreException { - Map attributes = new HashMap<>(); - 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.ATTACH_PROCESS, DebugCore.extractAttachProcess(configuration)); - attributes.put(DBGController.ATTACH_KIND, DebugCore.extractAttachKind(configuration)); - attributes.put(DBGController.SCRIPT_EXECUTE, DebugCore.extractScriptExecute(configuration)); - attributes.put(DBGController.SCRIPT_TEXT, DebugCore.extractScriptText(configuration)); - // Well, put it all for now - attributes.putAll(configuration.getAttributes()); - return attributes; - } - - protected DBGController createController(DBPDataSourceContainer dataSourceContainer) throws CoreException { + protected DBGController createController(DBPDataSourceContainer dataSourceContainer, Map attributes) throws CoreException { try { - return DebugCore.findProcedureController(dataSourceContainer); + DBGControllerFactory controllerFactory = Adapters.adapt(dataSourceContainer, DBGControllerFactory.class); + if (controllerFactory != null) { + return controllerFactory.createController(dataSourceContainer, attributes); + } + throw new DBGException( + NLS.bind("Unable to find controller factory for datasource \"{0}\"", dataSourceContainer.getDriver().getProviderId()) + ); } catch (DBGException e) { throw new CoreException(GeneralUtils.makeExceptionStatus(e)); } @@ -88,7 +78,7 @@ public class DatabaseLaunchDelegate extends LaunchConfigurationDelegate { } protected DatabaseDebugTarget createDebugTarget(ILaunch launch, DBGController controller, DatabaseProcess process) { - return new DatabaseDebugTarget(DebugCore.MODEL_IDENTIFIER_DATABASE, launch, process, controller); + return new DatabaseDebugTarget(DBGConstants.MODEL_IDENTIFIER_DATABASE, launch, process, controller); } } diff --git a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/DebugCore.java b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/DebugCore.java deleted file mode 100644 index cbd9e4cb1f5ac3dbd48bbc8d80373a0e51751758..0000000000000000000000000000000000000000 --- a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/DebugCore.java +++ /dev/null @@ -1,344 +0,0 @@ -/* - * DBeaver - Universal Database Manager - * Copyright (C) 2010-2018 Serge Rider (serge@jkiss.org) - * Copyright (C) 2017-2018 Alexander Fedorov (alexander.fedorov@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.debug.core; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.eclipse.core.resources.IContainer; -import org.eclipse.core.resources.IMarker; -import org.eclipse.core.runtime.Adapters; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Status; -import org.eclipse.debug.core.DebugPlugin; -import org.eclipse.debug.core.ILaunchConfiguration; -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.core.DBeaverCore; -import org.jkiss.dbeaver.debug.DBGController; -import org.jkiss.dbeaver.debug.DBGException; -import org.jkiss.dbeaver.debug.DBGResolver; -import org.jkiss.dbeaver.debug.core.model.DatabaseDebugTarget; -import org.jkiss.dbeaver.debug.core.model.DatabaseStackFrame; -import org.jkiss.dbeaver.debug.internal.core.DebugCoreActivator; -import org.jkiss.dbeaver.debug.internal.core.DebugCoreMessages; -import org.jkiss.dbeaver.model.DBPDataSource; -import org.jkiss.dbeaver.model.DBPDataSourceContainer; -import org.jkiss.dbeaver.model.DBPScriptObject; -import org.jkiss.dbeaver.model.navigator.DBNDatabaseNode; -import org.jkiss.dbeaver.model.navigator.DBNModel; -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; -import org.jkiss.dbeaver.runtime.ide.core.DBeaverIDECore; -import org.jkiss.dbeaver.utils.GeneralUtils; - -public class DebugCore { - - public static final String BUNDLE_SYMBOLIC_NAME = "org.jkiss.dbeaver.debug.core"; //$NON-NLS-1$ - - public static final String MODEL_IDENTIFIER_DATABASE = BUNDLE_SYMBOLIC_NAME + '.' + "database"; //$NON-NLS-1$ - - public static final String BREAKPOINT_ID_DATABASE = BUNDLE_SYMBOLIC_NAME + '.' + "databaseBreakpointMarker"; //$NON-NLS-1$ - public static final String BREAKPOINT_ID_DATABASE_LINE = BUNDLE_SYMBOLIC_NAME + '.' - + "databaseLineBreakpointMarker"; //$NON-NLS-1$ - - public static final String BREAKPOINT_ATTRIBUTE_DATASOURCE_ID = DBeaverIDECore.MARKER_ATTRIBUTE_DATASOURCE_ID; - public static final String BREAKPOINT_ATTRIBUTE_DATABASE_NAME = BUNDLE_SYMBOLIC_NAME + '.' + "databaseName"; //$NON-NLS-1$ - public static final String BREAKPOINT_ATTRIBUTE_SCHEMA_NAME = BUNDLE_SYMBOLIC_NAME + '.' + "schemaName"; //$NON-NLS-1$ - public static final String BREAKPOINT_ATTRIBUTE_PROCEDURE_NAME = BUNDLE_SYMBOLIC_NAME + '.' + "procedureName"; //$NON-NLS-1$ - public static final String BREAKPOINT_ATTRIBUTE_PROCEDURE_OID = BUNDLE_SYMBOLIC_NAME + '.' + "procedureOid"; //$NON-NLS-1$ - public static final String BREAKPOINT_ATTRIBUTE_NODE_PATH = DBeaverIDECore.MARKER_ATTRIBUTE_NODE_PATH; - - public static final String SOURCE_CONTAINER_TYPE_DATASOURCE = BUNDLE_SYMBOLIC_NAME + '.' - + "datasourceSourceContainerType"; //$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_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_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_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_ATTACH_PROCESS = BUNDLE_SYMBOLIC_NAME + '.' + "ATTACH_PROCESS"; //$NON-NLS-1$ - public static final String ATTR_ATTACH_PROCESS_DEFAULT = DBGController.ATTACH_PROCESS_ANY; - - public static final String ATTR_ATTACH_KIND = BUNDLE_SYMBOLIC_NAME + '.' + "ATTR_ATTACH_KIND"; //$NON-NLS-1$ - public static final String ATTR_ATTACH_KIND_DEFAULT = DBGController.ATTACH_KIND_LOCAL; - - public static final String ATTR_SCRIPT_EXECUTE = BUNDLE_SYMBOLIC_NAME + '.' + "ATTR_SCRIPT_EXECUTE"; //$NON-NLS-1$ - public static final String ATTR_SCRIPT_EXECUTE_DEFAULT = Boolean.FALSE.toString(); - - public static final String ATTR_SCRIPT_TEXT = BUNDLE_SYMBOLIC_NAME + '.' + "ATTR_SCRIPT_TEXT"; //$NON-NLS-1$ - public static final String ATTR_SCRIPT_TEXT_DEFAULT = ""; //$NON-NLS-1$ - - public static final String ATTR_NODE_PATH = BUNDLE_SYMBOLIC_NAME + '.' + "ATTR_NODE_PATH"; //$NON-NLS-1$ - public static final String ATTR_NODE_PATH_DEFAULT = ""; //$NON-NLS-1$ - - private static Log log = Log.getLog(DebugCore.class); - - public static void log(IStatus status) { - Log.log(log, status); - } - - public static CoreException abort(String message, Throwable th) { - return new CoreException(newErrorStatus(message, th)); - } - - public static CoreException abort(String message) { - 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 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 composeScriptText(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_SCRIPT_TEXT_DEFAULT; - } - } - - public static ILaunchConfigurationWorkingCopy createConfiguration(IContainer container, String typeName, - String name) throws CoreException { - ILaunchManager manager = DebugPlugin.getDefault().getLaunchManager(); - ILaunchConfigurationType type = manager.getLaunchConfigurationType(typeName); - ILaunchConfigurationWorkingCopy workingCopy = type.newInstance(container, name); - return workingCopy; - } - - public static boolean canLaunch(ILaunchConfiguration configuration, String mode) { - if (configuration == null || !configuration.exists()) { - return false; - } - try { - return configuration.supportsMode(mode); - } catch (CoreException e) { - String message = NLS.bind(DebugCoreMessages.DebugCore_e_unable_to_retrieve_modes, configuration); - log.error(message, e); - return false; - } - } - - public static List extractLaunchable(Object[] scope) { - List extracted = new ArrayList<>(); - if (scope == null) { - return extracted; - } - for (int i = 0; i < scope.length; i++) { - Object object = scope[i]; - DBSObject adapted = Adapters.adapt(object, DBSObject.class, true); - if (adapted != null) { - extracted.add(adapted); - } - } - return extracted; - } - - public static String extractDriverId(ILaunchConfiguration configuration) { - return extractStringAttribute(configuration, ATTR_DRIVER_ID, ATTR_DRIVER_ID_DEFAULT); - } - - public static String extractDatasourceId(ILaunchConfiguration configuration) { - return extractStringAttribute(configuration, ATTR_DATASOURCE_ID, ATTR_DATASOURCE_ID_DEFAULT); - } - - public static String extractDatabaseName(ILaunchConfiguration configuration) { - 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 extractAttachProcess(ILaunchConfiguration configuration) { - return extractStringAttribute(configuration, ATTR_ATTACH_PROCESS, ATTR_ATTACH_PROCESS_DEFAULT); - } - - public static String extractAttachKind(ILaunchConfiguration configuration) { - return extractStringAttribute(configuration, ATTR_ATTACH_KIND, ATTR_ATTACH_KIND_DEFAULT); - } - - public static String extractScriptExecute(ILaunchConfiguration configuration) { - return extractStringAttribute(configuration, ATTR_SCRIPT_EXECUTE, ATTR_SCRIPT_EXECUTE_DEFAULT); - } - - public static String extractScriptText(ILaunchConfiguration configuration) { - return extractStringAttribute(configuration, ATTR_SCRIPT_TEXT, ATTR_SCRIPT_TEXT_DEFAULT); - } - - public static String extractNodePath(ILaunchConfiguration configuration) { - return extractStringAttribute(configuration, ATTR_NODE_PATH, ATTR_NODE_PATH_DEFAULT); - } - - public static String extractStringAttribute(ILaunchConfiguration configuration, String attributeName, - String defaultValue) { - if (configuration == null) { - String message = NLS.bind(DebugCoreMessages.DebugCore_e_read_attribute_null, attributeName); - log.error(message); - return defaultValue; - } - try { - return configuration.getAttribute(attributeName, defaultValue); - } catch (CoreException e) { - String message = NLS.bind(DebugCoreMessages.DebugCore_e_read_attribute_generic, attributeName, - configuration); - log.error(message, e); - return defaultValue; - } - } - - public static Status newErrorStatus(String message, Throwable th) { - return new Status(IStatus.ERROR, BUNDLE_SYMBOLIC_NAME, message, th); - } - - public static Status newErrorStatus(String message) { - return newErrorStatus(message, null); - } - - public static DBSObject resolveDatabaseObject(DBPDataSourceContainer container, Map context, - Object identifier, DBRProgressMonitor monitor) throws DBException { - DBGResolver finder = Adapters.adapt(container, DBGResolver.class); - if (finder == null) { - return null; - } - return finder.resolveObject(context, identifier, monitor); - } - - public static Map resolveDatabaseContext(DBSObject databaseObject) { - Map result = new HashMap(); - if (databaseObject == null) { - return result; - } - DBPDataSource dataSource = databaseObject.getDataSource(); - if (dataSource == null) { - return result; - } - DBGResolver finder = Adapters.adapt(dataSource.getContainer(), DBGResolver.class); - if (finder == null) { - return result; - } - Map context = finder.resolveContext(databaseObject); - result.putAll(context); - return result; - } - - public static DBGController findProcedureController(DBPDataSourceContainer dataSourceContainer) - throws DBGException { - DBGController controller = Adapters.adapt(dataSourceContainer, DBGController.class); - if (controller != null) { - return controller; - } - String providerId = dataSourceContainer.getDriver().getProviderId(); - String message = NLS.bind("Unable to find controller for datasource \"{0}\"", providerId); - throw new DBGException(message); - } - - public static String getSourceName(Object object) throws CoreException { - if (object instanceof DatabaseStackFrame) { - DatabaseStackFrame frame = (DatabaseStackFrame) object; - Object sourceIdentifier = frame.getSourceIdentifier(); - DatabaseDebugTarget debugTarget = frame.getDatabaseDebugTarget(); - DBSObject dbsObject = null; - try { - dbsObject = debugTarget.findDatabaseObject(sourceIdentifier, new VoidProgressMonitor()); - } catch (DBException e) { - Status error = DebugCore.newErrorStatus(e.getMessage(), e); - throw new CoreException(error); - } - if (dbsObject == null) { - return null; - } - final DBNModel navigatorModel = DBeaverCore.getInstance().getNavigatorModel(); - DBNDatabaseNode node = navigatorModel.getNodeByObject(new VoidProgressMonitor(), dbsObject, false); - if (node != null) { - String nodePath = node.getNodeItemPath(); - DebugCore.postDebuggerSourceEvent(nodePath); - return nodePath; - } - } - if (object instanceof String) { - // well, let's be positive and assume it's a node path already - String nodePath = (String) object; - DebugCore.postDebuggerSourceEvent(nodePath); - return nodePath; - } - return null; - } - - public static Map toBreakpointDescriptor(Map attributes) { - HashMap result = new HashMap(); - result.put(DBGController.BREAKPOINT_LINE_NUMBER, attributes.get(IMarker.LINE_NUMBER)); - result.put(DBGController.PROCEDURE_OID, attributes.get(BREAKPOINT_ATTRIBUTE_PROCEDURE_OID)); - return result; - } - - public static void postDebuggerSourceEvent(String nodePath) { - String encoded = GeneralUtils.encodeTopic(DBPScriptObject.OPTION_DEBUGGER_SOURCE); - DebugCoreActivator.getDefault().postEvent(encoded, nodePath); - } - -} diff --git a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/DebugEvents.java b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/DebugEvents.java deleted file mode 100644 index d31dcdfc2352817d803b2ea092ac81dcc1104b45..0000000000000000000000000000000000000000 --- a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/DebugEvents.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * DBeaver - Universal Database Manager - * Copyright (C) 2010-2018 Serge Rider (serge@jkiss.org) - * Copyright (C) 2017-2018 Alexander Fedorov (alexander.fedorov@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.debug.core; - -import org.eclipse.debug.core.DebugEvent; -import org.eclipse.debug.core.DebugPlugin; - -public class DebugEvents { - - /** - * Fires the given debug event. - * - * @param event - * debug event to fire - */ - public static void fireEvent(DebugEvent event) { - DebugPlugin manager = DebugPlugin.getDefault(); - if (manager != null) { - manager.fireDebugEventSet(new DebugEvent[] { event }); - } - } - - /** - * Fires a terminate event. - */ - public static void fireTerminate(Object source) { - fireEvent(new DebugEvent(source, DebugEvent.TERMINATE)); - } - -} diff --git a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/DebugUtils.java b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/DebugUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..08499774c70c823c8a0d3a2e9ffbd3c3c3d6c9cf --- /dev/null +++ b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/DebugUtils.java @@ -0,0 +1,200 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2018 Serge Rider (serge@jkiss.org) + * Copyright (C) 2017-2018 Alexander Fedorov (alexander.fedorov@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.debug.core; + +import org.eclipse.core.resources.IMarker; +import org.eclipse.core.runtime.Adapters; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.debug.core.DebugEvent; +import org.eclipse.debug.core.DebugPlugin; +import org.eclipse.debug.core.ILaunchConfiguration; +import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; +import org.eclipse.osgi.util.NLS; +import org.jkiss.dbeaver.DBException; +import org.jkiss.dbeaver.Log; +import org.jkiss.dbeaver.core.DBeaverCore; +import org.jkiss.dbeaver.debug.DBGConstants; +import org.jkiss.dbeaver.debug.DBGController; +import org.jkiss.dbeaver.debug.DBGResolver; +import org.jkiss.dbeaver.debug.core.model.DatabaseStackFrame; +import org.jkiss.dbeaver.debug.internal.core.DebugCoreMessages; +import org.jkiss.dbeaver.model.DBPDataSource; +import org.jkiss.dbeaver.model.DBPDataSourceContainer; +import org.jkiss.dbeaver.model.navigator.DBNDatabaseNode; +import org.jkiss.dbeaver.model.navigator.DBNModel; +import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; +import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor; +import org.jkiss.dbeaver.model.struct.DBSObject; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class DebugUtils { + + private static Log log = Log.getLog(DebugUtils.class); + + public static CoreException abort(String message, Throwable th) { + return new CoreException(newErrorStatus(message, th)); + } + + public static CoreException abort(String message) { + return abort(message, null); + } + + public static boolean canLaunch(ILaunchConfiguration configuration, String mode) { + if (configuration == null || !configuration.exists()) { + return false; + } + try { + return configuration.supportsMode(mode); + } catch (CoreException e) { + String message = NLS.bind(DebugCoreMessages.DebugCore_e_unable_to_retrieve_modes, configuration); + log.error(message, e); + return false; + } + } + + public static List extractLaunchable(Object[] scope) { + List extracted = new ArrayList<>(); + if (scope == null) { + return extracted; + } + for (Object object : scope) { + DBSObject adapted = Adapters.adapt(object, DBSObject.class, true); + if (adapted != null) { + extracted.add(adapted); + } + } + return extracted; + } + + public static Status newErrorStatus(String message, Throwable th) { + return new Status(IStatus.ERROR, DBGConstants.BUNDLE_SYMBOLIC_NAME, message, th); + } + + public static Status newErrorStatus(String message) { + return newErrorStatus(message, null); + } + + public static DBSObject resolveDatabaseObject(DBPDataSourceContainer container, Map context, + Object identifier, DBRProgressMonitor monitor) throws DBException { + DBGResolver finder = Adapters.adapt(container, DBGResolver.class); + if (finder == null) { + return null; + } + return finder.resolveObject(context, identifier, monitor); + } + + public static Map resolveDatabaseContext(DBSObject databaseObject) { + Map result = new HashMap<>(); + if (databaseObject == null) { + return result; + } + DBPDataSource dataSource = databaseObject.getDataSource(); + if (dataSource == null) { + return result; + } + DBGResolver finder = Adapters.adapt(dataSource.getContainer(), DBGResolver.class); + if (finder == null) { + return result; + } + Map context = finder.resolveContext(databaseObject); + result.putAll(context); + return result; + } + + public static String getSourceName(Object object) throws CoreException { + if (object instanceof DatabaseStackFrame) { + DatabaseStackFrame frame = (DatabaseStackFrame) object; + Object sourceIdentifier = frame.getSourceIdentifier(); + DBSObject dbsObject; + try { + dbsObject = findDatabaseObject(frame.getController(), sourceIdentifier, new VoidProgressMonitor()); + } catch (DBException e) { + Status error = DebugUtils.newErrorStatus(e.getMessage(), e); + throw new CoreException(error); + } + if (dbsObject == null) { + return null; + } + final DBNModel navigatorModel = DBeaverCore.getInstance().getNavigatorModel(); + DBNDatabaseNode node = navigatorModel.getNodeByObject(new VoidProgressMonitor(), dbsObject, false); + if (node != null) { + return node.getNodeItemPath(); + } + } + if (object instanceof String) { + // well, let's be positive and assume it's a node path already + return (String) object; + } + return null; + } + + public static Map toBreakpointDescriptor(Map attributes) { + HashMap result = new HashMap<>(); + result.put(IMarker.LINE_NUMBER, attributes.get(IMarker.LINE_NUMBER)); + return result; + } + + public static DBSObject findDatabaseObject(DBGController controller, Object identifier, DBRProgressMonitor monitor) throws DBException { + DBPDataSourceContainer container = controller.getDataSourceContainer(); + Map context = controller.getDebugConfiguration(); + return resolveDatabaseObject(container, context, identifier, monitor); + } + + public static void putContextInConfiguration(ILaunchConfigurationWorkingCopy configuration, Map attrs) { + for (Map.Entry entry : attrs.entrySet()) { + Object value = entry.getValue(); + if (value == null) { + configuration.removeAttribute(entry.getKey()); + } else if (value instanceof Integer) { + configuration.setAttribute(entry.getKey(), (Integer) value); + } else if (value instanceof Boolean) { + configuration.setAttribute(entry.getKey(), (Boolean) value); + } else if (value instanceof List) { + configuration.setAttribute(entry.getKey(), (List)value); + } else { + configuration.setAttribute(entry.getKey(), value.toString()); + } + } + } + + /** + * Fires the given debug event. + * + * @param event + * debug event to fire + */ + public static void fireEvent(DebugEvent event) { + DebugPlugin manager = DebugPlugin.getDefault(); + if (manager != null) { + manager.fireDebugEventSet(new DebugEvent[] { event }); + } + } + + /** + * Fires a terminate event. + */ + public static void fireTerminate(Object source) { + fireEvent(new DebugEvent(source, DebugEvent.TERMINATE)); + } +} diff --git a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/breakpoints/DatabaseBreakpoint.java b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/breakpoints/DatabaseBreakpoint.java index 1101ee73b1a59d06f9cf02373b70c4db35e373e6..9b39f48426b6748216b4d863308b1879fa1aeed0 100644 --- a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/breakpoints/DatabaseBreakpoint.java +++ b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/breakpoints/DatabaseBreakpoint.java @@ -18,21 +18,15 @@ package org.jkiss.dbeaver.debug.core.breakpoints; -import static org.jkiss.dbeaver.debug.core.DebugCore.BREAKPOINT_ATTRIBUTE_DATABASE_NAME; -import static org.jkiss.dbeaver.debug.core.DebugCore.BREAKPOINT_ATTRIBUTE_DATASOURCE_ID; -import static org.jkiss.dbeaver.debug.core.DebugCore.BREAKPOINT_ATTRIBUTE_NODE_PATH; -import static org.jkiss.dbeaver.debug.core.DebugCore.BREAKPOINT_ATTRIBUTE_PROCEDURE_NAME; -import static org.jkiss.dbeaver.debug.core.DebugCore.BREAKPOINT_ATTRIBUTE_PROCEDURE_OID; -import static org.jkiss.dbeaver.debug.core.DebugCore.BREAKPOINT_ATTRIBUTE_SCHEMA_NAME; -import static org.jkiss.dbeaver.debug.core.DebugCore.MODEL_IDENTIFIER_DATABASE; +import static org.jkiss.dbeaver.debug.DBGConstants.BREAKPOINT_ATTRIBUTE_DATASOURCE_ID; +import static org.jkiss.dbeaver.debug.DBGConstants.BREAKPOINT_ATTRIBUTE_NODE_PATH; +import static org.jkiss.dbeaver.debug.DBGConstants.MODEL_IDENTIFIER_DATABASE; import java.util.Map; import org.eclipse.core.runtime.CoreException; import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.model.Breakpoint; -import org.jkiss.dbeaver.debug.DBGController; -import org.jkiss.dbeaver.debug.core.DebugCore; import org.jkiss.dbeaver.model.navigator.DBNNode; import org.jkiss.dbeaver.model.struct.DBSObject; @@ -48,55 +42,11 @@ public class DatabaseBreakpoint extends Breakpoint implements IDatabaseBreakpoin return ensureMarker().getAttribute(BREAKPOINT_ATTRIBUTE_DATASOURCE_ID, null); } - @Override - public String getDatabaseName() throws CoreException { - return ensureMarker().getAttribute(BREAKPOINT_ATTRIBUTE_DATABASE_NAME, null); - } - - @Override - public String getSchemaName() throws CoreException { - return ensureMarker().getAttribute(BREAKPOINT_ATTRIBUTE_SCHEMA_NAME, null); - } - - @Override - public String getProcedureName() throws CoreException { - return ensureMarker().getAttribute(BREAKPOINT_ATTRIBUTE_PROCEDURE_NAME, null); - } - - @Override - public String getProcedureOid() throws CoreException { - return ensureMarker().getAttribute(BREAKPOINT_ATTRIBUTE_PROCEDURE_OID, null); - } - @Override public String getNodePath() throws CoreException { return ensureMarker().getAttribute(BREAKPOINT_ATTRIBUTE_NODE_PATH, null); } - protected void setDatasourceId(String datasourceId) throws CoreException { - setAttribute(BREAKPOINT_ATTRIBUTE_DATASOURCE_ID, datasourceId); - } - - protected void setDatabaseName(String databaseName) throws CoreException { - setAttribute(BREAKPOINT_ATTRIBUTE_DATABASE_NAME, databaseName); - } - - protected void setSchemaName(String schemaName) throws CoreException { - setAttribute(BREAKPOINT_ATTRIBUTE_SCHEMA_NAME, schemaName); - } - - protected void setProcedureName(String procedureName) throws CoreException { - setAttribute(BREAKPOINT_ATTRIBUTE_PROCEDURE_NAME, procedureName); - } - - protected void setProcedureOid(String procedureOid) throws CoreException { - setAttribute(BREAKPOINT_ATTRIBUTE_PROCEDURE_OID, procedureOid); - } - - protected void setNodePath(String nodePath) throws CoreException { - setAttribute(BREAKPOINT_ATTRIBUTE_NODE_PATH, nodePath); - } - protected void register(boolean register) throws CoreException { if (register) { DebugPlugin plugin = DebugPlugin.getDefault(); @@ -109,20 +59,8 @@ public class DatabaseBreakpoint extends Breakpoint implements IDatabaseBreakpoin } protected void addDatabaseBreakpointAttributes(Map attributes, DBSObject databaseObject, DBNNode node) { - String datasourceId = databaseObject.getDataSource().getContainer().getId(); - attributes.put(BREAKPOINT_ATTRIBUTE_DATASOURCE_ID, datasourceId); - - String nodePath = node.getNodeItemPath(); - attributes.put(BREAKPOINT_ATTRIBUTE_NODE_PATH, nodePath); + attributes.put(BREAKPOINT_ATTRIBUTE_DATASOURCE_ID, databaseObject.getDataSource().getContainer().getId()); - Map context = DebugCore.resolveDatabaseContext(databaseObject); - if (context.isEmpty()) { - return; - } - attributes.put(BREAKPOINT_ATTRIBUTE_DATABASE_NAME, context.get(DBGController.DATABASE_NAME)); - attributes.put(BREAKPOINT_ATTRIBUTE_SCHEMA_NAME, context.get(DBGController.SCHEMA_NAME)); - attributes.put(BREAKPOINT_ATTRIBUTE_PROCEDURE_NAME, context.get(DBGController.PROCEDURE_NAME)); - Object oid = context.get(DBGController.PROCEDURE_OID); - attributes.put(BREAKPOINT_ATTRIBUTE_PROCEDURE_OID, String.valueOf(oid)); + attributes.put(BREAKPOINT_ATTRIBUTE_NODE_PATH, node.getNodeItemPath()); } } diff --git a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/breakpoints/DatabaseLineBreakpoint.java b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/breakpoints/DatabaseLineBreakpoint.java index 11843d357ce0b008c6d6d833ba83da1de959a520..4ee5eefd417b1fba64aaa8479ddffa39f189e194 100644 --- a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/breakpoints/DatabaseLineBreakpoint.java +++ b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/breakpoints/DatabaseLineBreakpoint.java @@ -18,50 +18,46 @@ package org.jkiss.dbeaver.debug.core.breakpoints; -import java.util.HashMap; -import java.util.Map; - import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspaceRunnable; import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.debug.core.DebugException; import org.eclipse.debug.core.model.IBreakpoint; -import org.jkiss.dbeaver.debug.core.DebugCore; +import org.jkiss.dbeaver.debug.DBGConstants; import org.jkiss.dbeaver.model.navigator.DBNNode; import org.jkiss.dbeaver.model.struct.DBSObject; +import java.util.HashMap; +import java.util.Map; + public class DatabaseLineBreakpoint extends DatabaseBreakpoint implements IDatabaseLineBreakpoint { public DatabaseLineBreakpoint() { } public DatabaseLineBreakpoint(DBSObject databaseObject, DBNNode node, IResource resource, - final int lineNumber, final int charStart, final int charEnd, final boolean add) throws DebugException { + final int lineNumber, final int charStart, final int charEnd, final boolean add) throws DebugException + { this(databaseObject, node, resource, lineNumber, charStart, charEnd, add, - new HashMap(), DebugCore.BREAKPOINT_ID_DATABASE_LINE); + new HashMap<>(), DBGConstants.BREAKPOINT_ID_DATABASE_LINE); } protected DatabaseLineBreakpoint(DBSObject databaseObject, DBNNode node, final IResource resource, final int lineNumber, final int charStart, final int charEnd, final boolean add, - final Map attributes, final String markerType) throws DebugException { - IWorkspaceRunnable wr = new IWorkspaceRunnable() { - @Override - public void run(IProgressMonitor monitor) throws CoreException { - - // create the marker - setMarker(resource.createMarker(markerType)); - - // add attributes - addDatabaseBreakpointAttributes(attributes, databaseObject, node); - addLineBreakpointAttributes(attributes, getModelIdentifier(), true, lineNumber, charStart, charEnd); - ensureMarker().setAttributes(attributes); + final Map attributes, final String markerType) throws DebugException + { + IWorkspaceRunnable wr = monitor -> { + // create the marker + setMarker(resource.createMarker(markerType)); - // add to breakpoint manager if requested - register(add); - } + // add attributes + addDatabaseBreakpointAttributes(attributes, databaseObject, node); + addLineBreakpointAttributes(attributes, getModelIdentifier(), true, lineNumber, charStart, charEnd); + ensureMarker().setAttributes(attributes); + // add to breakpoint manager if requested + register(add); }; run(getMarkerRule(resource), wr); } @@ -94,11 +90,12 @@ public class DatabaseLineBreakpoint extends DatabaseBreakpoint implements IDatab } public void addLineBreakpointAttributes(Map attributes, String modelIdentifier, boolean enabled, - int lineNumber, int charStart, int charEnd) { + int lineNumber, int charStart, int charEnd) + { attributes.put(IBreakpoint.ID, modelIdentifier); - attributes.put(IBreakpoint.ENABLED, Boolean.valueOf(enabled)); - attributes.put(IMarker.LINE_NUMBER, new Integer(lineNumber)); - attributes.put(IMarker.CHAR_START, new Integer(charStart)); - attributes.put(IMarker.CHAR_END, new Integer(charEnd)); + attributes.put(IBreakpoint.ENABLED, enabled); + attributes.put(IMarker.LINE_NUMBER, lineNumber); + attributes.put(IMarker.CHAR_START, charStart); + attributes.put(IMarker.CHAR_END, charEnd); } } diff --git a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/breakpoints/IDatabaseBreakpoint.java b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/breakpoints/IDatabaseBreakpoint.java index 7cf60af525adcdec59b6e2ed653ae8c8f40596be..1107d04765c871add90cabfb922e693620399736 100644 --- a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/breakpoints/IDatabaseBreakpoint.java +++ b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/breakpoints/IDatabaseBreakpoint.java @@ -25,14 +25,6 @@ public interface IDatabaseBreakpoint extends IBreakpoint { String getDatasourceId() throws CoreException; - String getDatabaseName() throws CoreException; - - String getSchemaName() throws CoreException; - - String getProcedureName() throws CoreException; - - String getProcedureOid() throws CoreException; - String getNodePath() throws CoreException; } diff --git a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/model/DatabaseDebugElement.java b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/model/DatabaseDebugElement.java index a1221fd0f474e6ff20cc9e9c4f613badff7099a6..0cbcbc50827bfb6a2ba5af41691437e20f1619dd 100644 --- a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/model/DatabaseDebugElement.java +++ b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/model/DatabaseDebugElement.java @@ -27,8 +27,8 @@ public class DatabaseDebugElement extends DebugElement { super(target); } - public DatabaseDebugTarget getDatabaseDebugTarget() { - return (DatabaseDebugTarget) getDebugTarget(); + public IDatabaseDebugTarget getDatabaseDebugTarget() { + return (IDatabaseDebugTarget) getDebugTarget(); } public DBGController getController() { diff --git a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/model/DatabaseDebugTarget.java b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/model/DatabaseDebugTarget.java index e63294e7af9f7aa3a557225136367b31f526e571..a62bda54298f61552afab8974f2e4cefed88064c 100644 --- a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/model/DatabaseDebugTarget.java +++ b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/model/DatabaseDebugTarget.java @@ -18,46 +18,34 @@ package org.jkiss.dbeaver.debug.core.model; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - import org.eclipse.core.resources.IMarkerDelta; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Status; -import org.eclipse.debug.core.DebugEvent; -import org.eclipse.debug.core.DebugException; -import org.eclipse.debug.core.DebugPlugin; -import org.eclipse.debug.core.IBreakpointManager; -import org.eclipse.debug.core.ILaunch; -import org.eclipse.debug.core.ILaunchConfiguration; -import org.eclipse.debug.core.model.IBreakpoint; -import org.eclipse.debug.core.model.IDebugTarget; -import org.eclipse.debug.core.model.IMemoryBlock; -import org.eclipse.debug.core.model.IProcess; -import org.eclipse.debug.core.model.IThread; +import org.eclipse.debug.core.*; +import org.eclipse.debug.core.model.*; import org.eclipse.osgi.util.NLS; -import org.jkiss.dbeaver.DBException; -import org.jkiss.dbeaver.debug.DBGBreakpointDescriptor; -import org.jkiss.dbeaver.debug.DBGController; -import org.jkiss.dbeaver.debug.DBGEvent; -import org.jkiss.dbeaver.debug.DBGEventHandler; -import org.jkiss.dbeaver.debug.DBGException; -import org.jkiss.dbeaver.debug.DBGStackFrame; -import org.jkiss.dbeaver.debug.DBGVariable; -import org.jkiss.dbeaver.debug.core.DebugCore; +import org.jkiss.dbeaver.Log; +import org.jkiss.dbeaver.debug.*; +import org.jkiss.dbeaver.debug.core.DebugUtils; 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.DefaultProgressMonitor; -import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor; -import org.jkiss.dbeaver.model.struct.DBSObject; +import org.jkiss.dbeaver.utils.GeneralUtils; +import org.jkiss.dbeaver.utils.RuntimeUtils; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; public class DatabaseDebugTarget extends DatabaseDebugElement implements IDatabaseDebugTarget, DBGEventHandler { + private static final Log log = Log.getLog(DatabaseDebugTarget.class); + public static final int BREAKPOINT_ACTION_TIMEOUT = 5000; + public static final int SESSION_ACTION_TIMEOUT = 5000; + private final String modelIdentifier; private final ILaunch launch; @@ -72,7 +60,7 @@ public class DatabaseDebugTarget extends DatabaseDebugElement implements IDataba private boolean suspended = false; private boolean terminated = false; - private Object sessionKey; + private DBGSession session; public DatabaseDebugTarget(String modelIdentifier, ILaunch launch, IProcess process, DBGController controller) { super(null); @@ -81,8 +69,8 @@ public class DatabaseDebugTarget extends DatabaseDebugElement implements IDataba this.process = process; this.controller = controller; this.controller.registerEventHandler(this); - this.threads = new ArrayList(); - this.thread = newThread(controller); + this.threads = new ArrayList<>(); + this.thread = newThread(); this.threads.add(thread); DebugPlugin debugPlugin = DebugPlugin.getDefault(); @@ -92,12 +80,21 @@ public class DatabaseDebugTarget extends DatabaseDebugElement implements IDataba debugPlugin.addDebugEventListener(this); } + public IDatabaseDebugTarget getDatabaseDebugTarget() { + return this; + } + @Override public DBGController getController() { return controller; } - protected DatabaseThread newThread(DBGController controller) { + @Override + public DBGSession getSession() { + return session; + } + + protected DatabaseThread newThread() { return new DatabaseThread(this); } @@ -123,7 +120,7 @@ public class DatabaseDebugTarget extends DatabaseDebugElement implements IDataba @Override public IThread[] getThreads() throws DebugException { - return (IThread[]) threads.toArray(new IThread[threads.size()]); + return threads.toArray(new IThread[threads.size()]); } @Override @@ -162,27 +159,44 @@ public class DatabaseDebugTarget extends DatabaseDebugElement implements IDataba @Override public void handleDebugEvents(DebugEvent[] events) { - for (int i = 0; i < events.length; i++) { - DebugEvent event = events[i]; - if (event.getKind() == DebugEvent.TERMINATE && event.getSource().equals(process)) { - try { - terminated(); - } catch (DebugException e) { - DebugCore.log(e.getStatus()); - } + for (DebugEvent event : events) { + switch (event.getKind()) { + case DebugEvent.TERMINATE: + if (event.getSource().equals(process)) { + try { + terminated(); + } catch (DebugException e) { + log.log(e.getStatus()); + } + } + break; } } } @Override public void connect(IProgressMonitor monitor) throws CoreException { + DBRProgressMonitor dbm = new DefaultProgressMonitor(monitor); try { - sessionKey = this.controller.attach(new DefaultProgressMonitor(monitor)); + session = this.controller.openSession(dbm); } catch (DBGException e) { - String message = NLS.bind("Failed to connect {0} to the target", getName()); - IStatus error = DebugCore.newErrorStatus(message, e); process.terminate(); - throw new CoreException(error); + throw new CoreException( + GeneralUtils.makeExceptionStatus(e)); + } + // Initiate breakpoints + IBreakpoint[] breakpoints = DebugPlugin.getDefault().getBreakpointManager().getBreakpoints(modelIdentifier); + if (breakpoints != null) { + for (IBreakpoint bp : breakpoints) { + DBGBreakpointDescriptor descriptor = describeBreakpoint(bp); + if (descriptor != null) { + try { + session.addBreakpoint(dbm, descriptor); + } catch (DBGException e) { + log.error("Can't add initial breakpoint", e); + } + } + } } } @@ -207,12 +221,8 @@ public class DatabaseDebugTarget extends DatabaseDebugElement implements IDataba terminated = true; suspended = false; try { - controller.detach(sessionKey, getProgressMonitor()); + disconnect(); controller.unregisterEventHandler(this); - } catch (DBGException e) { - String message = NLS.bind("Error terminating {0}", getName()); - IStatus status = DebugCore.newErrorStatus(message, e); - throw new DebugException(status); } finally { controller.dispose(); } @@ -228,6 +238,7 @@ public class DatabaseDebugTarget extends DatabaseDebugElement implements IDataba process.terminate(); } catch (DebugException e) { // do nothing + log.debug(e); } } if (debugPlugin != null) { @@ -255,11 +266,11 @@ public class DatabaseDebugTarget extends DatabaseDebugElement implements IDataba public void resume() throws DebugException { suspended = false; try { - controller.resume(sessionKey); + session.resume(); } catch (DBGException e) { - String message = NLS.bind("Error resuming {0}", getName()); - IStatus status = DebugCore.newErrorStatus(message, e); - throw new DebugException(status); + log.error(e); + throw new DebugException( + GeneralUtils.makeErrorStatus(NLS.bind("Error resuming {0} - {1}", getName(), e.getMessage()))); } if (thread.isSuspended()) { thread.resumedByTarget(); @@ -270,18 +281,14 @@ public class DatabaseDebugTarget extends DatabaseDebugElement implements IDataba @Override public void suspend() throws DebugException { try { - controller.suspend(sessionKey); + session.suspend(); } catch (DBGException e) { - String message = NLS.bind("Error suspending {0}", getName()); - IStatus status = DebugCore.newErrorStatus(message, e); - throw new DebugException(status); + log.error(e); + throw new DebugException( + GeneralUtils.makeErrorStatus(NLS.bind("Error suspending {0} - {1}", getName(), e.getMessage()))); } } - private VoidProgressMonitor getProgressMonitor() { - return new VoidProgressMonitor(); - } - public void suspended(int detail) { suspended = true; thread.setStepping(false); @@ -290,10 +297,7 @@ public class DatabaseDebugTarget extends DatabaseDebugElement implements IDataba @Override public boolean supportsBreakpoint(IBreakpoint breakpoint) { - if (breakpoint.getModelIdentifier().equals(DebugCore.BREAKPOINT_ID_DATABASE_LINE)) { - return true; - } - return false; + return breakpoint.getModelIdentifier().equals(DBGConstants.BREAKPOINT_ID_DATABASE_LINE); } @Override @@ -301,18 +305,19 @@ public class DatabaseDebugTarget extends DatabaseDebugElement implements IDataba if (!terminated) { DBGBreakpointDescriptor descriptor = describeBreakpoint(breakpoint); if (descriptor == null) { - String message = NLS.bind("Unable to describe breakpoint {0}", breakpoint); - Status error = DebugCore.newErrorStatus(message); - DebugCore.log(error); + log.error(NLS.bind("Unable to describe breakpoint {0}", breakpoint)); return; } - try { - controller.addBreakpoint(sessionKey, descriptor); - } catch (DBGException e) { - String message = NLS.bind("Unable to add breakpoint {0}", breakpoint); - Status error = DebugCore.newErrorStatus(message, e); - DebugCore.log(error); - } + + RuntimeUtils.runTask( + monitor -> { + try { + session.addBreakpoint(monitor, descriptor); + } catch (DBGException e) { + throw new InvocationTargetException(e); + } + }, + "Add session breakpoint", BREAKPOINT_ACTION_TIMEOUT); } } @@ -321,18 +326,18 @@ public class DatabaseDebugTarget extends DatabaseDebugElement implements IDataba if (!terminated) { DBGBreakpointDescriptor descriptor = describeBreakpoint(breakpoint); if (descriptor == null) { - String message = NLS.bind("Unable to describe breakpoint {0}", breakpoint); - Status error = DebugCore.newErrorStatus(message); - DebugCore.log(error); + log.error(NLS.bind("Unable to describe breakpoint {0}", breakpoint)); return; } - try { - controller.removeBreakpoint(sessionKey, descriptor); - } catch (DBGException e) { - String message = NLS.bind("Unable to remove breakpoint {0}", breakpoint); - Status error = DebugCore.newErrorStatus(message, e); - DebugCore.log(error); - } + RuntimeUtils.runTask( + monitor -> { + try { + session.removeBreakpoint(monitor, descriptor); + } catch (DBGException e) { + throw new InvocationTargetException(e); + } + }, + "Remove session breakpoint", BREAKPOINT_ACTION_TIMEOUT); } } @@ -353,10 +358,8 @@ public class DatabaseDebugTarget extends DatabaseDebugElement implements IDataba @Override public void breakpointManagerEnablementChanged(boolean enabled) { - IBreakpoint[] breakpoints = DebugPlugin.getDefault().getBreakpointManager() - .getBreakpoints(DebugCore.BREAKPOINT_ID_DATABASE_LINE); - for (int i = 0; i < breakpoints.length; i++) { - IBreakpoint breakpoint = breakpoints[i]; + IBreakpoint[] breakpoints = DebugPlugin.getDefault().getBreakpointManager().getBreakpoints(DBGConstants.BREAKPOINT_ID_DATABASE_LINE); + for (IBreakpoint breakpoint : breakpoints) { if (enabled) { breakpointAdded(breakpoint); } else { @@ -366,38 +369,42 @@ public class DatabaseDebugTarget extends DatabaseDebugElement implements IDataba } protected DBGBreakpointDescriptor describeBreakpoint(IBreakpoint breakpoint) { - Map description = new HashMap(); + Map description = new HashMap<>(); try { Map attributes = breakpoint.getMarker().getAttributes(); - Map remote = DebugCore.toBreakpointDescriptor(attributes); + Map remote = DebugUtils.toBreakpointDescriptor(attributes); description.putAll(remote); } catch (CoreException e) { - DebugCore.log(e.getStatus()); + log.log(e.getStatus()); return null; } - DBGBreakpointDescriptor descriptor = controller.describeBreakpoint(description); - return descriptor; + return controller.describeBreakpoint(description); } @Override public boolean canDisconnect() { - return true; + return session != null; } @Override public void disconnect() throws DebugException { - try { - controller.detach(sessionKey, getProgressMonitor()); - } catch (DBGException e) { - String message = NLS.bind("Error disconnecting {0}", getName()); - IStatus status = DebugCore.newErrorStatus(message, e); - throw new DebugException(status); + if (session != null) { + RuntimeUtils.runTask( + monitor -> { + try { + session.closeSession(monitor); + } catch (DBGException e) { + throw new InvocationTargetException(e); + } + }, + "Close session", SESSION_ACTION_TIMEOUT); + session = null; } } @Override public boolean isDisconnected() { - return false; + return session == null; } @Override @@ -420,78 +427,51 @@ public class DatabaseDebugTarget extends DatabaseDebugElement implements IDataba try { process.terminate(); } catch (DebugException e) { - DebugCore.log(e.getStatus()); + log.log(e.getStatus()); } } } public boolean canStepInto() { - return controller.canStepInto(sessionKey); + return session != null && session.canStepInto(); } public boolean canStepOver() { - return controller.canStepOver(sessionKey); + return session != null && session.canStepOver(); } public boolean canStepReturn() { - return controller.canStepReturn(sessionKey); + return session != null && session.canStepReturn(); } public void stepInto() throws DebugException { - DBGController controller = getController(); try { - controller.stepInto(sessionKey); + session.execStepInto(); } catch (DBGException e) { - String message = NLS.bind("Step into failed for session {0}", sessionKey); - IStatus status = DebugCore.newErrorStatus(message, e); + String message = NLS.bind("Step into failed for session {0}", session.getSessionId()); + IStatus status = DebugUtils.newErrorStatus(message, e); throw new DebugException(status); } } public void stepOver() throws DebugException { - DBGController controller = getController(); try { - controller.stepOver(sessionKey); + session.execStepOver(); } catch (DBGException e) { - String message = NLS.bind("Step over failed for session {0}", sessionKey); - IStatus status = DebugCore.newErrorStatus(message, e); + String message = NLS.bind("Step over failed for session {0}", session.getSessionId()); + IStatus status = DebugUtils.newErrorStatus(message, e); throw new DebugException(status); } } public void stepReturn() throws DebugException { - DBGController controller = getController(); try { - controller.stepReturn(sessionKey); + session.execStepReturn(); } catch (DBGException e) { - String message = NLS.bind("Step return failed for session {0}", sessionKey); - IStatus status = DebugCore.newErrorStatus(message, e); + String message = NLS.bind("Step return failed for session {0}", session.getSessionId()); + IStatus status = DebugUtils.newErrorStatus(message, e); throw new DebugException(status); } } - protected List requestStackFrames() throws DBGException { - DBGController controller = getController(); - List stack = controller.getStack(sessionKey); - return stack; - } - - protected List> requestVariables(DBGStackFrame stack) throws DBGException { - DBGController controller = getController(); - List> variables = controller.getVariables(sessionKey, stack); - return variables; - } - - protected String requestSource(DBGStackFrame stack) throws DBGException { - DBGController controller = getController(); - String source = controller.getSource(sessionKey, stack); - return source; - } - - public DBSObject findDatabaseObject(Object identifier, DBRProgressMonitor monitor) throws DBException { - DBPDataSourceContainer container = controller.getDataSourceContainer(); - Map context = controller.getDebugConfiguration(); - return DebugCore.resolveDatabaseObject(container, context, identifier, monitor); - } - } diff --git a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/model/DatabaseProcess.java b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/model/DatabaseProcess.java index 34a7d7f024d97c5521e5016ef5df25dea7d40bc3..969dc740660aa53760fc766a9969193e9c0b499a 100644 --- a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/model/DatabaseProcess.java +++ b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/model/DatabaseProcess.java @@ -21,13 +21,11 @@ package org.jkiss.dbeaver.debug.core.model; import java.util.HashMap; import java.util.Map; -import org.eclipse.core.runtime.IAdapterManager; -import org.eclipse.core.runtime.Platform; import org.eclipse.debug.core.DebugException; import org.eclipse.debug.core.ILaunch; import org.eclipse.debug.core.model.IProcess; import org.eclipse.debug.core.model.IStreamsProxy; -import org.jkiss.dbeaver.debug.core.DebugEvents; +import org.jkiss.dbeaver.debug.core.DebugUtils; public class DatabaseProcess implements IProcess { @@ -45,8 +43,7 @@ public class DatabaseProcess implements IProcess { @Override public T getAdapter(Class adapter) { - IAdapterManager adapterManager = Platform.getAdapterManager(); - return adapterManager.getAdapter(this, adapter); + return null; } @Override @@ -64,7 +61,7 @@ public class DatabaseProcess implements IProcess { if (!terminated) { terminated = true; launch.removeProcess(this); - DebugEvents.fireTerminate(this); + DebugUtils.fireTerminate(this); } } diff --git a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/model/DatabaseStackFrame.java b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/model/DatabaseStackFrame.java index a05e77ab9c37de8a9ba4fffc5a3a9098748cb4a9..4228080dfc68f65b566e973e1595c6bebe514c51 100644 --- a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/model/DatabaseStackFrame.java +++ b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/model/DatabaseStackFrame.java @@ -34,7 +34,7 @@ import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.debug.DBGException; import org.jkiss.dbeaver.debug.DBGStackFrame; import org.jkiss.dbeaver.debug.DBGVariable; -import org.jkiss.dbeaver.debug.core.DebugCore; +import org.jkiss.dbeaver.debug.core.DebugUtils; public class DatabaseStackFrame extends DatabaseDebugElement implements IStackFrame { @@ -43,7 +43,7 @@ public class DatabaseStackFrame extends DatabaseDebugElement implements IStackFr private static Log log = Log.getLog(DatabaseStackFrame.class); - private final List variables = new ArrayList(); + private final List variables = new ArrayList<>(); private final DatabaseThread thread; private final DBGStackFrame dbgStackFrame; @@ -138,19 +138,19 @@ public class DatabaseStackFrame extends DatabaseDebugElement implements IStackFr @Override public IVariable[] getVariables() throws DebugException { - if (refreshVariables) { + /*if (refreshVariables)*/ { try { - List> variables = getDatabaseDebugTarget().requestVariables(dbgStackFrame); + IDatabaseDebugTarget debugTarget = getDatabaseDebugTarget(); + List> variables = debugTarget.getSession().getVariables(dbgStackFrame); rebuildVariables(variables); } catch (DBGException e) { - // TODO Auto-generated catch block - e.printStackTrace(); + log.error(e); } } if (variables.isEmpty()) { return NO_VARIABLES; } - return (IVariable[]) variables.toArray(new IVariable[variables.size()]); + return variables.toArray(new IVariable[variables.size()]); } protected void invalidateVariables() { @@ -161,7 +161,7 @@ public class DatabaseStackFrame extends DatabaseDebugElement implements IStackFr try { int frameLN = dbgStackFrame.getLineNumber(); variables.clear(); - Map> filtered = new LinkedHashMap>(); + Map> filtered = new LinkedHashMap<>(); for (DBGVariable dbgVariable : dbgVariables) { String name = dbgVariable.getName(); DBGVariable existing = filtered.get(name); @@ -176,7 +176,7 @@ public class DatabaseStackFrame extends DatabaseDebugElement implements IStackFr } else { String pattern = "Already have {0} and ignored {1} for frame at {2}"; String message = NLS.bind(pattern, new Object[]{existing, dbgVariable, frameLN}); - log.error(message);; + log.error(message); } } } @@ -215,8 +215,7 @@ public class DatabaseStackFrame extends DatabaseDebugElement implements IStackFr @Override public String getName() throws DebugException { String pattern = "{0} line: {1}"; - String name = NLS.bind(pattern, dbgStackFrame.getName(), dbgStackFrame.getLineNumber()); - return name; + return NLS.bind(pattern, dbgStackFrame.getName(), dbgStackFrame.getLineNumber()); } @Override @@ -232,10 +231,11 @@ public class DatabaseStackFrame extends DatabaseDebugElement implements IStackFr public String getSource() throws DebugException { String source; try { - source = getDatabaseDebugTarget().requestSource(dbgStackFrame); + IDatabaseDebugTarget debugTarget = getDatabaseDebugTarget(); + source = debugTarget.getSession().getSource(dbgStackFrame); } catch (DBGException e) { String message = NLS.bind("Unable to retrieve sources for stack {0}", dbgStackFrame); - IStatus status = DebugCore.newErrorStatus(message, e); + IStatus status = DebugUtils.newErrorStatus(message, e); throw new DebugException(status); } return source; diff --git a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/model/DatabaseThread.java b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/model/DatabaseThread.java index a05983ce496abb0cc4cbc1791b6f62046dae8ecd..6ac5974038e30846f9bf87d03018c819aeb4a9f4 100644 --- a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/model/DatabaseThread.java +++ b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/model/DatabaseThread.java @@ -30,7 +30,7 @@ import org.eclipse.debug.core.model.IThread; import org.eclipse.osgi.util.NLS; import org.jkiss.dbeaver.debug.DBGException; import org.jkiss.dbeaver.debug.DBGStackFrame; -import org.jkiss.dbeaver.debug.core.DebugCore; +import org.jkiss.dbeaver.debug.core.DebugUtils; import org.jkiss.dbeaver.debug.internal.core.DebugCoreMessages; /** @@ -45,7 +45,7 @@ public class DatabaseThread extends DatabaseDebugElement implements IThread { private List frames = new ArrayList<>(1); - public DatabaseThread(DatabaseDebugTarget target) { + public DatabaseThread(IDatabaseDebugTarget target) { super(target); } @@ -156,13 +156,13 @@ public class DatabaseThread extends DatabaseDebugElement implements IThread { } protected void extractStackFrames() throws DebugException { - List stackFrames; try { - stackFrames = getDatabaseDebugTarget().requestStackFrames(); + IDatabaseDebugTarget debugTarget = getDatabaseDebugTarget(); + List stackFrames = debugTarget.getSession().getStack(); rebuildStack(stackFrames); } catch (DBGException e) { String message = NLS.bind("Error reading stack for {0}", getName()); - IStatus status = DebugCore.newErrorStatus(message, e); + IStatus status = DebugUtils.newErrorStatus(message, e); throw new DebugException(status); } } diff --git a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/model/DatabaseVariable.java b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/model/DatabaseVariable.java index bb35f3b78cec1b57cb8e1708fe79ff6378b06dc0..bcbe05e4bbe01f9d700e9c041db5c766102baaf0 100644 --- a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/model/DatabaseVariable.java +++ b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/model/DatabaseVariable.java @@ -64,7 +64,6 @@ public class DatabaseVariable extends DatabaseDebugElement implements IVariable @Override public IValue getValue() throws DebugException { - // TODO Auto-generated method stub return new DatabaseValue(getDatabaseDebugTarget(), dbgVariable); } diff --git a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/model/IDatabaseDebugTarget.java b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/model/IDatabaseDebugTarget.java index a07e14988fb2da659b7cd9efa8e951ec582b79f7..0268b4a60f35f16ce8e439166098acf86f98e086 100644 --- a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/model/IDatabaseDebugTarget.java +++ b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/model/IDatabaseDebugTarget.java @@ -20,15 +20,31 @@ package org.jkiss.dbeaver.debug.core.model; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.debug.core.DebugException; import org.eclipse.debug.core.IBreakpointManagerListener; import org.eclipse.debug.core.IDebugEventSetListener; import org.eclipse.debug.core.model.IDebugTarget; import org.jkiss.dbeaver.debug.DBGController; +import org.jkiss.dbeaver.debug.DBGSession; public interface IDatabaseDebugTarget extends IDebugTarget, IDebugEventSetListener, IBreakpointManagerListener { DBGController getController(); + DBGSession getSession(); + void connect(IProgressMonitor monitor) throws CoreException; + boolean canStepInto(); + + boolean canStepOver(); + + boolean canStepReturn(); + + void stepInto() throws DebugException; + + void stepOver() throws DebugException; + + void stepReturn() throws DebugException; + } diff --git a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/jdbc/DBGJDBCSession.java b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/jdbc/DBGJDBCSession.java new file mode 100644 index 0000000000000000000000000000000000000000..e419952200554295eeb6ab04387c3ff513611d46 --- /dev/null +++ b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/jdbc/DBGJDBCSession.java @@ -0,0 +1,145 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2018 Serge Rider (serge@jkiss.org) + * Copyright (C) 2017-2018 Andrew Khitrin (ahitrin@gmail.com) + * Copyright (C) 2017-2018 Alexander Fedorov (alexander.fedorov@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.debug.jdbc; + +import org.eclipse.core.runtime.jobs.IJobChangeEvent; +import org.eclipse.core.runtime.jobs.JobChangeAdapter; +import org.jkiss.dbeaver.Log; +import org.jkiss.dbeaver.debug.*; +import org.jkiss.dbeaver.model.exec.DBCExecutionPurpose; +import org.jkiss.dbeaver.model.exec.jdbc.JDBCSession; +import org.jkiss.dbeaver.model.impl.jdbc.JDBCExecutionContext; +import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; + +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.List; + +public abstract class DBGJDBCSession implements DBGSession { + + private static final Log log = Log.getLog(DBGJDBCSession.class); + + private final DBGBaseController controller; + + protected volatile DBGJDBCWorker workerJob; + + private final List breakpoints = new ArrayList<>(1); + + protected DBGJDBCSession(DBGBaseController controller) { + this.controller = controller; + } + + protected DBGBaseController getController() { + return controller; + } + + public abstract JDBCExecutionContext getConnection(); + + public abstract JDBCExecutionContext getControllerConnection(); + + + /** + * Return true if debug session up and running on server + * + * @return boolean + */ + public abstract boolean isAttached(); + + /** + * Return true if session up and running debug thread + * + * @return boolean + */ + public boolean isWaiting() { + DBGJDBCWorker job = this.workerJob; + return (job != null && !job.isFinished()); + } + + public abstract boolean isDone(); + + /** + * Start thread for SQL command + */ + protected void runAsync(String commandSQL, String name, DBGEvent begin, DBGEvent end) throws DBGException { + workerJob = new DBGJDBCWorker(this, name, commandSQL, begin, end); + workerJob.addJobChangeListener(new JobChangeAdapter() { + @Override + public void done(IJobChangeEvent event) { + workerJob = null; + } + }); + workerJob.schedule(); + } + + public void closeSession(DBRProgressMonitor monitor) throws DBGException { + if (!isAttached()) { + throw new DBGException("Debug session not attached"); + } + doDetach(monitor); + if (!isDone() && workerJob != null) { + workerJob.cancel(); + workerJob = null; + } + } + + protected abstract void doDetach(DBRProgressMonitor monitor) throws DBGException; + + protected abstract String composeAbortCommand(); + + @Override + public List getBreakpoints() { + return new ArrayList<>(breakpoints); + } + + @Override + public void addBreakpoint(DBRProgressMonitor monitor, DBGBreakpointDescriptor descriptor) throws DBGException { + try (JDBCSession session = getControllerConnection().openSession(monitor, DBCExecutionPurpose.UTIL, "Add breakpoint")) { + try (Statement stmt = session.createStatement()) { + String sqlQuery = composeAddBreakpointCommand(descriptor); + stmt.execute(sqlQuery); + } catch (SQLException e) { + throw new DBGException("SQL error", e); + } + breakpoints.add(descriptor); + } + } + + protected abstract String composeAddBreakpointCommand(DBGBreakpointDescriptor descriptor); + + @Override + public void removeBreakpoint(DBRProgressMonitor monitor, DBGBreakpointDescriptor bp) throws DBGException { + try (JDBCSession session = getControllerConnection().openSession(monitor, DBCExecutionPurpose.UTIL, "Remove breakpoint")) { + try (Statement stmt = session.createStatement()) { + String sqlCommand = composeRemoveBreakpointCommand(bp); + stmt.execute(sqlCommand); + } catch (SQLException e) { + throw new DBGException("SQL error", e); + } + breakpoints.remove(bp); + } + } + + protected abstract String composeRemoveBreakpointCommand(DBGBreakpointDescriptor descriptor); + + protected void fireEvent(DBGEvent event) { + controller.fireEvent(event); + } + +} diff --git a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/jdbc/DBGJDBCWorker.java b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/jdbc/DBGJDBCWorker.java new file mode 100644 index 0000000000000000000000000000000000000000..bef07c8c27bff1e5dbfda026ef1913649eddf2d9 --- /dev/null +++ b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/jdbc/DBGJDBCWorker.java @@ -0,0 +1,68 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2018 Serge Rider (serge@jkiss.org) + * Copyright (C) 2017-2018 Andrew Khitrin (ahitrin@gmail.com) + * Copyright (C) 2017-2018 Alexander Fedorov (alexander.fedorov@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.debug.jdbc; + +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.jkiss.dbeaver.debug.DBGEvent; +import org.jkiss.dbeaver.model.exec.DBCExecutionPurpose; +import org.jkiss.dbeaver.model.exec.jdbc.JDBCSession; +import org.jkiss.dbeaver.model.runtime.AbstractJob; +import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; +import org.jkiss.dbeaver.utils.GeneralUtils; + +import java.sql.SQLException; +import java.sql.Statement; + +public class DBGJDBCWorker extends AbstractJob { + + private final DBGJDBCSession debugSession; + private final String sql; + private final DBGEvent before; + private final DBGEvent after; + + public DBGJDBCWorker(DBGJDBCSession debugSession, String name, String sqlCommand, DBGEvent begin, DBGEvent end) { + super(name); + this.debugSession = debugSession; + this.sql = sqlCommand; + this.before = begin; + this.after = end; + } + + @Override + protected IStatus run(DBRProgressMonitor monitor) { + monitor.beginTask("Execute debug job", 1); + try (JDBCSession session = debugSession.getControllerConnection().openSession(monitor, DBCExecutionPurpose.UTIL, "Run debug job")) { + monitor.subTask(sql); + try (Statement stmt = session.createStatement()) { + debugSession.fireEvent(before); + stmt.execute(sql); + debugSession.fireEvent(after); + return Status.OK_STATUS; + } + } catch (SQLException e) { + return GeneralUtils.makeExceptionStatus(String.format("Failed to execute %s", sql), e); + } finally { + monitor.done(); + } + } + + +} diff --git a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/sourcelookup/ProcedureSourceLookupParticipant.java b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/sourcelookup/DBGObjectLookupParticipant.java similarity index 84% rename from plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/sourcelookup/ProcedureSourceLookupParticipant.java rename to plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/sourcelookup/DBGObjectLookupParticipant.java index 9a9b1f9dfdc22e55d650c0f0ec440d9621db07e6..2c1814c2eaa46568cab1eb89fd1087a037d497f4 100644 --- a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/sourcelookup/ProcedureSourceLookupParticipant.java +++ b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/sourcelookup/DBGObjectLookupParticipant.java @@ -20,13 +20,13 @@ package org.jkiss.dbeaver.debug.sourcelookup; import org.eclipse.core.runtime.CoreException; import org.eclipse.debug.core.sourcelookup.AbstractSourceLookupParticipant; -import org.jkiss.dbeaver.debug.core.DebugCore; +import org.jkiss.dbeaver.debug.core.DebugUtils; -public class ProcedureSourceLookupParticipant extends AbstractSourceLookupParticipant { +public class DBGObjectLookupParticipant extends AbstractSourceLookupParticipant { @Override public String getSourceName(Object object) throws CoreException { - return DebugCore.getSourceName(object); + return DebugUtils.getSourceName(object); } } diff --git a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/sourcelookup/ProcedureSourceLookupDirector.java b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/sourcelookup/DBGSourceLookupDirector.java similarity index 84% rename from plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/sourcelookup/ProcedureSourceLookupDirector.java rename to plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/sourcelookup/DBGSourceLookupDirector.java index e509f5df8d25db681b9e744d5cc53497afd3a6d9..3bdc0a243487736f8483fdfa952e9fa90ded29a2 100644 --- a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/sourcelookup/ProcedureSourceLookupDirector.java +++ b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/sourcelookup/DBGSourceLookupDirector.java @@ -21,11 +21,11 @@ package org.jkiss.dbeaver.debug.sourcelookup; import org.eclipse.debug.core.sourcelookup.AbstractSourceLookupDirector; import org.eclipse.debug.core.sourcelookup.ISourceLookupParticipant; -public class ProcedureSourceLookupDirector extends AbstractSourceLookupDirector { +public class DBGSourceLookupDirector extends AbstractSourceLookupDirector { @Override public void initializeParticipants() { - addParticipants(new ISourceLookupParticipant[] { new ProcedureSourceLookupParticipant() }); + addParticipants(new ISourceLookupParticipant[] { new DBGObjectLookupParticipant() }); } } diff --git a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/sourcelookup/ProcedureSourcePathComputer.java b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/sourcelookup/DBGSourcePathComputer.java similarity index 71% rename from plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/sourcelookup/ProcedureSourcePathComputer.java rename to plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/sourcelookup/DBGSourcePathComputer.java index 11a4e4854ba19c23b91b8cfaf742561293ef6401..16ebcad94193c5c9295d318d20fa035547093729 100644 --- a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/sourcelookup/ProcedureSourcePathComputer.java +++ b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/sourcelookup/DBGSourcePathComputer.java @@ -23,18 +23,22 @@ import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.sourcelookup.ISourceContainer; import org.eclipse.debug.core.sourcelookup.ISourcePathComputerDelegate; -import org.jkiss.dbeaver.debug.core.DebugCore; +import org.jkiss.dbeaver.debug.DBGConstants; +import org.jkiss.dbeaver.debug.core.DebugUtils; import org.jkiss.dbeaver.registry.DataSourceDescriptor; import org.jkiss.dbeaver.registry.DataSourceRegistry; -public class ProcedureSourcePathComputer implements ISourcePathComputerDelegate { +public class DBGSourcePathComputer implements ISourcePathComputerDelegate { @Override public ISourceContainer[] computeSourceContainers(ILaunchConfiguration configuration, IProgressMonitor monitor) throws CoreException { - String datasourceId = DebugCore.extractDatasourceId(configuration); - DataSourceDescriptor descriptor = DataSourceRegistry.findDataSource(datasourceId); - DatasourceSourceContainer container = new DatasourceSourceContainer(descriptor); + String datasourceId = configuration.getAttribute(DBGConstants.ATTR_DATASOURCE_ID, ""); + DataSourceDescriptor dataSource = DataSourceRegistry.findDataSource(datasourceId); + if (dataSource == null) { + throw new CoreException(DebugUtils.newErrorStatus("Can't find datasource " + datasourceId)); + } + DatabaseNavigatorSourceContainer container = new DatabaseNavigatorSourceContainer(dataSource); return new ISourceContainer[] { container }; } diff --git a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/sourcelookup/DatasourceSourceContainer.java b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/sourcelookup/DatabaseNavigatorSourceContainer.java similarity index 81% rename from plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/sourcelookup/DatasourceSourceContainer.java rename to plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/sourcelookup/DatabaseNavigatorSourceContainer.java index 0b66f6e00878a438488d4bad1379e3eb27935482..e0499b397c26a8e44ed3886612da40cdb25f56fe 100644 --- a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/sourcelookup/DatasourceSourceContainer.java +++ b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/sourcelookup/DatabaseNavigatorSourceContainer.java @@ -26,21 +26,20 @@ import org.eclipse.debug.core.sourcelookup.containers.CompositeSourceContainer; import org.eclipse.osgi.util.NLS; import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.core.DBeaverCore; -import org.jkiss.dbeaver.debug.core.DebugCore; +import org.jkiss.dbeaver.debug.DBGConstants; +import org.jkiss.dbeaver.debug.core.DebugUtils; import org.jkiss.dbeaver.debug.internal.core.DebugCoreMessages; import org.jkiss.dbeaver.model.DBPDataSourceContainer; -import org.jkiss.dbeaver.model.navigator.DBNModel; import org.jkiss.dbeaver.model.navigator.DBNNode; import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor; import org.jkiss.dbeaver.registry.DataSourceDescriptor; -public class DatasourceSourceContainer extends CompositeSourceContainer { +public class DatabaseNavigatorSourceContainer extends CompositeSourceContainer { - private final DBNModel navigatorModel = DBeaverCore.getInstance().getNavigatorModel(); private final DBPDataSourceContainer datasource; private final IProject project; - public DatasourceSourceContainer(DataSourceDescriptor descriptor) { + public DatabaseNavigatorSourceContainer(DataSourceDescriptor descriptor) { this.datasource = descriptor; this.project = datasource.getRegistry().getProject(); } @@ -55,10 +54,10 @@ public class DatasourceSourceContainer extends CompositeSourceContainer { DBNNode node; try { VoidProgressMonitor monitor = new VoidProgressMonitor(); - node = navigatorModel.getNodeByPath(monitor, project, name); + node = DBeaverCore.getInstance().getNavigatorModel().getNodeByPath(monitor, project, name); } catch (DBException e) { String message = NLS.bind(DebugCoreMessages.DatasourceSourceContainer_e_extract_node, name); - throw new CoreException(DebugCore.newErrorStatus(message, e)); + throw new CoreException(DebugUtils.newErrorStatus(message, e)); } if (node != null) { return new Object[] { node }; @@ -68,7 +67,7 @@ public class DatasourceSourceContainer extends CompositeSourceContainer { @Override public ISourceContainerType getType() { - return getSourceContainerType(DebugCore.SOURCE_CONTAINER_TYPE_DATASOURCE); + return getSourceContainerType(DBGConstants.SOURCE_CONTAINER_TYPE_DATASOURCE); } @Override diff --git a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/sourcelookup/DatasourceSourceContainerTypeDelegate.java b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/sourcelookup/DatabaseSourceContainerTypeDelegate.java similarity index 93% rename from plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/sourcelookup/DatasourceSourceContainerTypeDelegate.java rename to plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/sourcelookup/DatabaseSourceContainerTypeDelegate.java index 807881d5e1dfe4a90d0bb642b245209bcc146fe6..6c5f7bf50706a1a7ee3da0316c4bbd580699460d 100644 --- a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/sourcelookup/DatasourceSourceContainerTypeDelegate.java +++ b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/sourcelookup/DatabaseSourceContainerTypeDelegate.java @@ -22,7 +22,7 @@ import org.eclipse.core.runtime.CoreException; import org.eclipse.debug.core.sourcelookup.ISourceContainer; import org.eclipse.debug.core.sourcelookup.containers.AbstractSourceContainerTypeDelegate; -public class DatasourceSourceContainerTypeDelegate extends AbstractSourceContainerTypeDelegate { +public class DatabaseSourceContainerTypeDelegate extends AbstractSourceContainerTypeDelegate { @Override public ISourceContainer createSourceContainer(String memento) throws CoreException { diff --git a/plugins/org.jkiss.dbeaver.debug.ui/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.debug.ui/META-INF/MANIFEST.MF index 6f4214905d3370d902298be7791cec460abab8a9..32e205017fbea031a889229dcdbe92f8629d8cc3 100644 --- a/plugins/org.jkiss.dbeaver.debug.ui/META-INF/MANIFEST.MF +++ b/plugins/org.jkiss.dbeaver.debug.ui/META-INF/MANIFEST.MF @@ -2,10 +2,12 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.debug.ui;singleton:=true -Bundle-Version: 1.0.11 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.12 +Bundle-Release-Date: 20180514 Bundle-Vendor: %Bundle-Vendor Bundle-RequiredExecutionEnvironment: JavaSE-1.8 +Bundle-Activator: org.jkiss.dbeaver.debug.ui.internal.DebugUIActivator +Bundle-ActivationPolicy: lazy Require-Bundle: org.eclipse.core.runtime, org.eclipse.core.expressions, org.eclipse.jface.text, diff --git a/plugins/org.jkiss.dbeaver.debug.ui/OSGI-INF/l10n/bundle.properties b/plugins/org.jkiss.dbeaver.debug.ui/OSGI-INF/l10n/bundle.properties index 705287d616143220f96f77f296195c5e81728eb3..deaa10ce7d8f68175c3bbd1028138edfedbfd994 100644 --- a/plugins/org.jkiss.dbeaver.debug.ui/OSGI-INF/l10n/bundle.properties +++ b/plugins/org.jkiss.dbeaver.debug.ui/OSGI-INF/l10n/bundle.properties @@ -19,4 +19,27 @@ Bundle-Vendor = JKISS Bundle-Name = DBeaver Debug UI -command.ToggleBreakpoint.label = Toggle Breakpoint \ No newline at end of file +command.ToggleBreakpoint.label = Toggle Breakpoint + +launchConfigurationTabGroup.description = Settings of database debug launch +launchConfigurationTabGroup.launchMode.description=Create a configuration to debug database code + +launchGroups.launchGroup.label = Database Debug +launchGroups.launchGroup.title = Select or configure database object debugger + +launchShortcuts.shortcut.label=Database Debug +launchShortcuts.shortcut.description=Database object debugger + +commands.command.menuDelegateToolbar.name=Debug last launched database object +commands.command.menuDelegateToolbar.description=Debug last launched database object +commands.command.debugConfigurations.name=Database debug ... +commands.command.debugConfigurations.description=Open database debug launch configuration dialog + +toolbar.debug.label=Database Debug + +actionSets.actionSet.label=Database Debug actions +actionSets.actionSet.menu.debug.label=Database Debug +actionSets.action.menu.label=Database Debug +actionSets.action.toolbar.label=Database Debug +actionSets.action.toolbar.tooltip=Database Debug +actionSets.action.debugConfigurations.label=Database debug configurations ... \ No newline at end of file diff --git a/plugins/org.jkiss.dbeaver.debug.ui/build.properties b/plugins/org.jkiss.dbeaver.debug.ui/build.properties index 69167ad5f9df03fed42d4ecd5391a4a46fd8b63b..88bcc2dd0ee129b7cd535f9b24c8212b2d01d135 100644 --- a/plugins/org.jkiss.dbeaver.debug.ui/build.properties +++ b/plugins/org.jkiss.dbeaver.debug.ui/build.properties @@ -3,4 +3,5 @@ output.. = target/classes/ bin.includes = META-INF/,\ .,\ OSGI-INF/,\ + icons/,\ plugin.xml diff --git a/plugins/org.jkiss.dbeaver.debug.ui/icons/database_debug.png b/plugins/org.jkiss.dbeaver.debug.ui/icons/database_debug.png new file mode 100644 index 0000000000000000000000000000000000000000..c5c7a61f39f2d47cc970f4583305477b37562572 Binary files /dev/null and b/plugins/org.jkiss.dbeaver.debug.ui/icons/database_debug.png differ diff --git a/plugins/org.jkiss.dbeaver.debug.ui/icons/database_debug@2x.png b/plugins/org.jkiss.dbeaver.debug.ui/icons/database_debug@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e176c32b57c7ca08701d58445ae0f8ca38c96122 Binary files /dev/null and b/plugins/org.jkiss.dbeaver.debug.ui/icons/database_debug@2x.png differ diff --git a/plugins/org.jkiss.dbeaver.debug.ui/icons/debug_config.png b/plugins/org.jkiss.dbeaver.debug.ui/icons/debug_config.png new file mode 100644 index 0000000000000000000000000000000000000000..a6c2e88054459d8ba8a64a19db1bb5b9267a06fb Binary files /dev/null and b/plugins/org.jkiss.dbeaver.debug.ui/icons/debug_config.png differ diff --git a/plugins/org.jkiss.dbeaver.debug.ui/icons/debug_config@2x.png b/plugins/org.jkiss.dbeaver.debug.ui/icons/debug_config@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..864b5ad8e8d1a645089b02759721d1ce15a451d1 Binary files /dev/null and b/plugins/org.jkiss.dbeaver.debug.ui/icons/debug_config@2x.png differ diff --git a/plugins/org.jkiss.dbeaver.debug.ui/plugin.xml b/plugins/org.jkiss.dbeaver.debug.ui/plugin.xml index 636fe1277941b52e17fb71cd6ce5dbe46d72ab1f..163b7af6e0133fb78000594a16f8b474572344fd 100644 --- a/plugins/org.jkiss.dbeaver.debug.ui/plugin.xml +++ b/plugins/org.jkiss.dbeaver.debug.ui/plugin.xml @@ -19,91 +19,184 @@ --> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/org.jkiss.dbeaver.debug.ui/pom.xml b/plugins/org.jkiss.dbeaver.debug.ui/pom.xml index a5efdedfa0b5d34f41aa9b5030c136e5c6a9ced6..6b9c6d7e545403cc0525c28b86a88d34aa9f2650 100644 --- a/plugins/org.jkiss.dbeaver.debug.ui/pom.xml +++ b/plugins/org.jkiss.dbeaver.debug.ui/pom.xml @@ -9,6 +9,6 @@ ../../ org.jkiss.dbeaver.debug.ui - 1.0.11 + 1.0.12 eclipse-plugin diff --git a/plugins/org.jkiss.dbeaver.debug.ui/schema/org.jkiss.dbeaver.debug.configurationPanels.exsd b/plugins/org.jkiss.dbeaver.debug.ui/schema/org.jkiss.dbeaver.debug.configurationPanels.exsd new file mode 100644 index 0000000000000000000000000000000000000000..e70939544e9fab7d276055efb51658b1ec098b23 --- /dev/null +++ b/plugins/org.jkiss.dbeaver.debug.ui/schema/org.jkiss.dbeaver.debug.configurationPanels.exsd @@ -0,0 +1,92 @@ + + + + + + + + + Plugin Service + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Enter the first release in which this extension point appears.] + + + + + + + + + [Enter extension point usage example here.] + + + + + + + + + [Enter API information here.] + + + + + + + + + [Enter information about supplied implementation of this extension point.] + + + + + diff --git a/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/DBGConfigurationPanel.java b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/DBGConfigurationPanel.java new file mode 100644 index 0000000000000000000000000000000000000000..b1de403000f99500fd566fcd19ba346e505b6913 --- /dev/null +++ b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/DBGConfigurationPanel.java @@ -0,0 +1,34 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2018 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.debug.ui; + +import org.eclipse.swt.widgets.Composite; +import org.jkiss.code.NotNull; +import org.jkiss.dbeaver.model.DBPDataSourceContainer; + +import java.util.Map; + +public interface DBGConfigurationPanel { + + void createPanel(@NotNull Composite parent, DBGConfigurationPanelContainer container); + + void loadConfiguration(@NotNull DBPDataSourceContainer dataSource, @NotNull Map configuration); + + void saveConfiguration(@NotNull DBPDataSourceContainer dataSource, @NotNull Map configuration); + + boolean isValid(); +} diff --git a/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/DBGConfigurationPanelContainer.java b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/DBGConfigurationPanelContainer.java new file mode 100644 index 0000000000000000000000000000000000000000..3b8baf78262e368949aa6895ea53b163bb133d89 --- /dev/null +++ b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/DBGConfigurationPanelContainer.java @@ -0,0 +1,35 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2018 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.debug.ui; + +import org.jkiss.dbeaver.model.DBPDataSourceContainer; +import org.jkiss.dbeaver.model.runtime.DBRRunnableContext; + +/** + * Panel container + */ +public interface DBGConfigurationPanelContainer { + + DBPDataSourceContainer getDataSource(); + + void updateDialogState(); + + void setWarningMessage(String message); + + DBRRunnableContext getRunnableContext(); + +} diff --git a/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/DebugEditorAdvisor.java b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/DBGEditorAdvisor.java similarity index 95% rename from plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/DebugEditorAdvisor.java rename to plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/DBGEditorAdvisor.java index b5d525591f7a5df0ca8f62841aece89b2784b34a..f59b362ddd8587145aa994e5d09166b6f15d7598 100644 --- a/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/DebugEditorAdvisor.java +++ b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/DBGEditorAdvisor.java @@ -17,7 +17,7 @@ */ package org.jkiss.dbeaver.debug.ui; -public interface DebugEditorAdvisor { +public interface DBGEditorAdvisor { String getSourceFolderId(); diff --git a/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/DatabaseDebugConfigurationTab.java b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/DatabaseDebugConfigurationTab.java new file mode 100644 index 0000000000000000000000000000000000000000..8794cca14dee6a5bb4a8b1c355d51663896198be --- /dev/null +++ b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/DatabaseDebugConfigurationTab.java @@ -0,0 +1,292 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2018 Serge Rider (serge@jkiss.org) + * Copyright (C) 2017-2018 Alexander Fedorov (alexander.fedorov@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.debug.ui; + +import org.eclipse.core.resources.IProject; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.debug.core.ILaunchConfiguration; +import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; +import org.eclipse.debug.ui.AbstractLaunchConfigurationTab; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.*; +import org.eclipse.ui.PlatformUI; +import org.jkiss.dbeaver.DBException; +import org.jkiss.dbeaver.debug.DBGConstants; +import org.jkiss.dbeaver.debug.core.DebugUtils; +import org.jkiss.dbeaver.debug.ui.internal.DebugConfigurationPanelDescriptor; +import org.jkiss.dbeaver.debug.ui.internal.DebugConfigurationPanelRegistry; +import org.jkiss.dbeaver.debug.ui.internal.DebugUIMessages; +import org.jkiss.dbeaver.model.DBIcon; +import org.jkiss.dbeaver.model.DBPDataSourceContainer; +import org.jkiss.dbeaver.model.runtime.DBRRunnableContext; +import org.jkiss.dbeaver.registry.DataSourceDescriptor; +import org.jkiss.dbeaver.registry.DataSourceRegistry; +import org.jkiss.dbeaver.runtime.RunnableContextDelegate; +import org.jkiss.dbeaver.runtime.ui.DBUserInterface; +import org.jkiss.dbeaver.ui.DBeaverIcons; +import org.jkiss.dbeaver.ui.UIUtils; +import org.jkiss.dbeaver.ui.controls.SelectDataSourceCombo; +import org.jkiss.utils.CommonUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class DatabaseDebugConfigurationTab extends AbstractLaunchConfigurationTab implements DBGConfigurationPanelContainer { + + private DebugConfigurationPanelDescriptor selectedDebugType; + private DBGConfigurationPanel selectedDebugPanel; + private ILaunchConfiguration currentConfiguration; + + private Text driverText; + + private SelectDataSourceCombo connectionCombo; + private Group typesGroup; + private Composite panelPlaceholder; + + @Override + public void createControl(Composite parent) { + Composite comp = new Composite(parent, SWT.NONE); + setControl(comp); + PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), getHelpContextId()); + comp.setLayout(new GridLayout(1, true)); + comp.setFont(parent.getFont()); + + createComponents(comp); + } + + protected void createComponents(Composite comp) { + createConnectionSettingsGroup(comp); + createPanelListGroup(comp); + } + + protected void createConnectionSettingsGroup(Composite composite) { + Group group = UIUtils.createControlGroup(composite, DebugUIMessages.DatabaseTab_connection_group_text, 4, GridData.FILL_HORIZONTAL, SWT.DEFAULT); + + UIUtils.createControlLabel(group, DebugUIMessages.DatabaseTab_datasource_label_text); + connectionCombo = new SelectDataSourceCombo(group) { + @Override + protected IProject getActiveProject() { + return null; + } + + @Override + protected void onDataSourceChange(DBPDataSourceContainer dataSource) { + String driverName = dataSource == null ? "" : dataSource.getDriver().getFullName(); + driverText.setText(driverName); + setDirty(true); + loadConnectionDebugTypes(); + updateLaunchConfigurationDialog(); + } + }; + connectionCombo.addItem(null); + for (DBPDataSourceContainer ds : DataSourceRegistry.getAllDataSources()) { + connectionCombo.addItem(ds); + } + + driverText = UIUtils.createLabelText(group, DebugUIMessages.DatabaseTab_driver_label_text, "", SWT.READ_ONLY); + } + + protected void createPanelListGroup(Composite composite) { + typesGroup = UIUtils.createControlGroup(composite, DebugUIMessages.DatabaseTab_debug_type_group_text, 3, GridData.FILL_HORIZONTAL, SWT.DEFAULT); + panelPlaceholder = UIUtils.createPlaceholder(composite, 1, 5); + loadConnectionDebugTypes(); + } + + private void loadConnectionDebugTypes() { + for (Control c : typesGroup.getChildren()) { + c.dispose(); + } + + DBPDataSourceContainer dataSource = connectionCombo.getSelectedItem(); + if (dataSource == null) { + UIUtils.createInfoLabel(typesGroup, "Select a connection to see available debug types"); + } else { + List panels = DebugConfigurationPanelRegistry.getInstance().getPanels(dataSource); + if (CommonUtils.isEmpty(panels)) { + UIUtils.createInfoLabel(typesGroup, "Driver '" + dataSource.getDriver().getFullName() + "' doesn't support debugging"); + } else { + for (DebugConfigurationPanelDescriptor panel : panels) { + Button typeSelector = new Button(typesGroup, SWT.RADIO); + typeSelector.setText(panel.getName()); + if (!CommonUtils.isEmpty(panel.getDescription())) { + typeSelector.setToolTipText(panel.getDescription()); + } + typeSelector.setData(panel); + if (panel.isValid()) { + typeSelector.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + if (typeSelector.getSelection()) { + setDirty(true); + setDebugType(connectionCombo.getSelectedItem(), (DebugConfigurationPanelDescriptor) typeSelector.getData()); + typesGroup.getParent().layout(true, true); + } + } + }); + } else { + typeSelector.setEnabled(false); + } + } + } + } + setDebugType(dataSource, null); + typesGroup.getParent().layout(true, true); + } + + private void setDebugType(DBPDataSourceContainer dataSource, DebugConfigurationPanelDescriptor debugPanel) { + if (selectedDebugType == debugPanel) { + return; + } + for (Control c : panelPlaceholder.getChildren()) { + c.dispose(); + } + + if (debugPanel != null) { + try { + selectedDebugType = debugPanel; + selectedDebugPanel = debugPanel.createPanel(); + selectedDebugPanel.createPanel(panelPlaceholder, this); + if (dataSource != null && currentConfiguration != null) { + try { + selectedDebugPanel.loadConfiguration(dataSource, currentConfiguration.getAttributes()); + } catch (CoreException e) { + setWarningMessage("Error loading panel configuration: " + e.getMessage()); + } + } + } catch (DBException e) { + selectedDebugType = null; + selectedDebugPanel = null; + DBUserInterface.getInstance().showError("Panel create error", "Can't create debugger config panel " + debugPanel.getId(), e); + } + } else { + selectedDebugType = null; + selectedDebugPanel = null; + } + if (selectedDebugType == null) { + UIUtils.createInfoLabel(panelPlaceholder, "Select a debug type to see debug configuration"); + } else { + for (Control c : typesGroup.getChildren()) { + if (c instanceof Button && c.getData() == debugPanel) { + ((Button) c).setSelection(true); + break; + } + } + } + } + + @Override + public void setDefaults(ILaunchConfigurationWorkingCopy configuration) { + } + + @Override + public void initializeFrom(ILaunchConfiguration configuration) { + this.currentConfiguration = configuration; + try { + String dsId = configuration.getAttribute(DBGConstants.ATTR_DATASOURCE_ID, (String) null); + DataSourceDescriptor dataSource = DataSourceRegistry.findDataSource(dsId); + connectionCombo.select(dataSource); + if (dataSource != null) { + driverText.setText(dataSource.getDriver().getFullName()); + } else { + driverText.setText(""); + } + loadConnectionDebugTypes(); + + String typeId = configuration.getAttribute(DBGConstants.ATTR_DEBUG_TYPE, (String) null); + DebugConfigurationPanelDescriptor savedPanel = null; + if (typeId != null) { + savedPanel = DebugConfigurationPanelRegistry.getInstance().getPanel(typeId); + if (savedPanel == null) { + setWarningMessage("Debug type '" + typeId + "' cannot be resolved"); + } + } + setDebugType(dataSource, savedPanel); + + } catch (CoreException e) { + setWarningMessage("Error loading debug configuration: " + e.getMessage()); + } + scheduleUpdateJob(); + } + + @Override + public Image getImage() { + if (connectionCombo != null) { + DBPDataSourceContainer dataSource = connectionCombo.getSelectedItem(); + if (dataSource != null) { + return DBeaverIcons.getImage(dataSource.getDriver().getIcon()); + } + } + return DBeaverIcons.getImage(DBIcon.TREE_DATABASE); + } + + @Override + public void performApply(ILaunchConfigurationWorkingCopy configuration) { + DBPDataSourceContainer dataSource = connectionCombo.getSelectedItem(); + configuration.setAttribute(DBGConstants.ATTR_DATASOURCE_ID, dataSource == null ? null : dataSource.getId()); + configuration.setAttribute(DBGConstants.ATTR_DEBUG_TYPE, selectedDebugType == null ? null : selectedDebugType.getId()); + if (selectedDebugPanel != null) { + Map attrs = new HashMap<>(); + selectedDebugPanel.saveConfiguration(dataSource, attrs); + DebugUtils.putContextInConfiguration(configuration, attrs); + } + } + + @Override + public String getName() { + return DebugUIMessages.DatabaseTab_name; + } + + @Override + public boolean isValid(ILaunchConfiguration launchConfig) { + return connectionCombo.getSelectedItem() != null && selectedDebugType != null && selectedDebugPanel.isValid(); + } + + @Override + public boolean canSave() { + return connectionCombo.getSelectedItem() != null && selectedDebugType != null; + } + + @Override + public DBPDataSourceContainer getDataSource() { + return connectionCombo.getSelectedItem(); + } + + @Override + public void updateDialogState() { + setDirty(true); + updateLaunchConfigurationDialog(); + } + + @Override + public void setWarningMessage(String message) { + super.setWarningMessage(message); + } + + @Override + public DBRRunnableContext getRunnableContext() { + return new RunnableContextDelegate(getLaunchConfigurationDialog()); + } + +} diff --git a/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/DatabaseTabGroup.java b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/DatabaseDebugConfigurationTabGroup.java similarity index 84% rename from plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/DatabaseTabGroup.java rename to plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/DatabaseDebugConfigurationTabGroup.java index dd660dd8c9a753ec78c420da18df695347a30534..e5ad173d351c5b7ffae842b383531bd3eb7cf808 100644 --- a/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/DatabaseTabGroup.java +++ b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/DatabaseDebugConfigurationTabGroup.java @@ -23,14 +23,14 @@ import org.eclipse.debug.ui.CommonTab; import org.eclipse.debug.ui.ILaunchConfigurationDialog; import org.eclipse.debug.ui.ILaunchConfigurationTab; -public class DatabaseTabGroup extends AbstractLaunchConfigurationTabGroup { +public class DatabaseDebugConfigurationTabGroup extends AbstractLaunchConfigurationTabGroup { - public DatabaseTabGroup() { + public DatabaseDebugConfigurationTabGroup() { } @Override public void createTabs(ILaunchConfigurationDialog dialog, String mode) { - DatabaseTab databaseTab = new DatabaseTab(); + DatabaseDebugConfigurationTab databaseTab = new DatabaseDebugConfigurationTab(); CommonTab commonTab = new CommonTab(); ILaunchConfigurationTab[] tabs = new ILaunchConfigurationTab[] { databaseTab, commonTab }; setTabs(tabs); diff --git a/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/DatabaseDebugModelPresentation.java b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/DatabaseDebugModelPresentation.java index b06cd54edc19b89fd6eb18c9e4128f21c3fdf052..c23007105361b6df33c15d1fa1440946d1ad7b29 100644 --- a/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/DatabaseDebugModelPresentation.java +++ b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/DatabaseDebugModelPresentation.java @@ -18,9 +18,6 @@ package org.jkiss.dbeaver.debug.ui; -import java.util.HashMap; -import java.util.Map; - import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IStatus; import org.eclipse.debug.core.DebugException; @@ -32,24 +29,33 @@ import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.graphics.Image; import org.eclipse.ui.IEditorInput; +import org.eclipse.ui.IEditorPart; import org.eclipse.ui.model.WorkbenchLabelProvider; +import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.core.DBeaverCore; -import org.jkiss.dbeaver.debug.core.DebugCore; +import org.jkiss.dbeaver.core.DBeaverUI; +import org.jkiss.dbeaver.debug.core.DebugUtils; import org.jkiss.dbeaver.debug.core.breakpoints.DatabaseLineBreakpoint; import org.jkiss.dbeaver.debug.core.breakpoints.IDatabaseBreakpoint; -import org.jkiss.dbeaver.debug.core.model.DatabaseProcess; -import org.jkiss.dbeaver.debug.core.model.DatabaseStackFrame; -import org.jkiss.dbeaver.debug.core.model.DatabaseThread; -import org.jkiss.dbeaver.debug.core.model.DatabaseVariable; -import org.jkiss.dbeaver.debug.core.model.IDatabaseDebugTarget; +import org.jkiss.dbeaver.debug.core.model.*; import org.jkiss.dbeaver.model.DBPScriptObject; import org.jkiss.dbeaver.model.navigator.DBNDatabaseNode; import org.jkiss.dbeaver.model.navigator.DBNModel; import org.jkiss.dbeaver.model.navigator.DBNNode; +import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; +import org.jkiss.dbeaver.model.runtime.DBRRunnableWithProgress; import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor; +import org.jkiss.dbeaver.ui.UITask; +import org.jkiss.dbeaver.ui.actions.navigator.NavigatorHandlerObjectOpen; import org.jkiss.dbeaver.ui.editors.entity.EntityEditor; -import org.jkiss.dbeaver.ui.editors.entity.EntityEditorInput; +import org.jkiss.dbeaver.utils.RuntimeUtils; + +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.Map; + +import static org.jkiss.dbeaver.debug.core.model.DatabaseDebugTarget.SESSION_ACTION_TIMEOUT; public class DatabaseDebugModelPresentation extends LabelProvider implements IDebugModelPresentationExtension { @@ -107,13 +113,13 @@ public class DatabaseDebugModelPresentation extends LabelProvider implements IDe } if (element instanceof DatabaseLineBreakpoint) { DatabaseLineBreakpoint breakpoint = (DatabaseLineBreakpoint) element; - String database = breakpoint.getDatabaseName(); - String schema = breakpoint.getSchemaName(); - String procedure = breakpoint.getProcedureName(); + String nodePath = breakpoint.getNodePath(); + NodeFinder getNodeTask = new NodeFinder(nodePath); + RuntimeUtils.runTask(getNodeTask,"Get node by path", SESSION_ACTION_TIMEOUT); + int lineNumber = breakpoint.getLineNumber(); - String pattern = "{0}.{1}.{2} - [line:{3}]"; - Object[] bindings = new Object[] {database, schema, procedure, lineNumber}; - return NLS.bind(pattern, bindings); + Object[] bindings = new Object[] {getNodeTask.node == null ? nodePath : getNodeTask.node.getNodeFullName(), lineNumber}; + return NLS.bind("{0} - [line:{1}]", bindings); } } catch (CoreException e) { return ""; @@ -134,8 +140,8 @@ public class DatabaseDebugModelPresentation extends LabelProvider implements IDe listener.detailComputed(value, valueString); } catch (DebugException e) { String message = NLS.bind("Unable to compute valie for {0}", value); - IStatus status = DebugCore.newErrorStatus(message, e); - DebugCore.log(status); + IStatus status = DebugUtils.newErrorStatus(message, e); + log.log(status); listener.detailComputed(value, e.getMessage()); } } @@ -167,15 +173,19 @@ public class DatabaseDebugModelPresentation extends LabelProvider implements IDe } protected IEditorInput createEditorInput(DBNDatabaseNode dbnNode) { - EntityEditorInput editorInput = new EntityEditorInput(dbnNode); - editorInput.setAttribute(DBPScriptObject.OPTION_DEBUGGER_SOURCE, Boolean.TRUE); - DebugEditorAdvisor editorAdvisor = DebugUI.findEditorAdvisor(dbnNode.getDataSourceContainer()); - if (editorAdvisor != null) { - String sourceFolderId = editorAdvisor.getSourceFolderId(); - editorInput.setDefaultFolderId(sourceFolderId); - } - DebugCore.postDebuggerSourceEvent(dbnNode.getNodeItemPath()); - return editorInput; + DBGEditorAdvisor editorAdvisor = DebugUI.findEditorAdvisor(dbnNode.getDataSourceContainer()); + String sourceFolderId = editorAdvisor == null ? null : editorAdvisor.getSourceFolderId(); + Map editorAttrs = new HashMap<>(); + editorAttrs.put(DBPScriptObject.OPTION_DEBUGGER_SOURCE, true); + + IEditorPart editorPart = new UITask() { + @Override + protected IEditorPart runTask() { + return NavigatorHandlerObjectOpen.openEntityEditor(dbnNode, null, sourceFolderId, editorAttrs, DBeaverUI.getActiveWorkbenchWindow(), false); + } + }.execute(); + + return editorPart == null ? null : editorPart.getEditorInput(); } @Override @@ -188,4 +198,22 @@ public class DatabaseDebugModelPresentation extends LabelProvider implements IDe return false; } + private static class NodeFinder implements DBRRunnableWithProgress { + private final String nodePath; + DBNNode node; + + public NodeFinder(String nodePath) { + this.nodePath = nodePath; + node = null; + } + + @Override + public void run(DBRProgressMonitor monitor) throws InvocationTargetException, InterruptedException { + try { + node = DBeaverCore.getInstance().getNavigatorModel().getNodeByPath(new VoidProgressMonitor(), nodePath); + } catch (DBException e) { + throw new InvocationTargetException(e); + } + } + } } diff --git a/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/DatabaseLaunchContributionItem.java b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/DatabaseLaunchContributionItem.java index b0a3c61e7a3253e429c8de8d6378159b7fdfbfa3..4033ad73cc8761d1d58ee6d8b84d6894dd4c00e5 100644 --- a/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/DatabaseLaunchContributionItem.java +++ b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/DatabaseLaunchContributionItem.java @@ -44,7 +44,7 @@ import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PlatformUI; -import org.jkiss.dbeaver.debug.internal.ui.DebugUIInternals; +import org.jkiss.dbeaver.debug.ui.internal.DebugUIInternals; import org.jkiss.dbeaver.model.struct.DBSObject; public class DatabaseLaunchContributionItem extends ContributionItem { diff --git a/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/DatabaseLaunchShortcut.java b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/DatabaseLaunchShortcut.java index 52f02d63b5fb289865327efac2500c587b21a382..8b022cd4bba3875a57e396bbd040b089ff13eb8f 100644 --- a/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/DatabaseLaunchShortcut.java +++ b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/DatabaseLaunchShortcut.java @@ -19,23 +19,15 @@ package org.jkiss.dbeaver.debug.ui; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; - import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.Adapters; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IAdaptable; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.debug.core.DebugPlugin; -import org.eclipse.debug.core.ILaunchConfiguration; -import org.eclipse.debug.core.ILaunchConfigurationType; -import org.eclipse.debug.core.ILaunchManager; +import org.eclipse.debug.core.*; import org.eclipse.debug.ui.DebugUITools; import org.eclipse.debug.ui.IDebugModelPresentation; import org.eclipse.debug.ui.ILaunchShortcut2; +import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ISelection; @@ -43,22 +35,25 @@ import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.window.Window; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.widgets.Shell; -import org.eclipse.ui.IEditorPart; -import org.eclipse.ui.IEditorSite; -import org.eclipse.ui.IWorkbenchPage; -import org.eclipse.ui.IWorkbenchPart; -import org.eclipse.ui.IWorkbenchPartSite; -import org.eclipse.ui.IWorkbenchWindow; -import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.*; import org.eclipse.ui.dialogs.ElementListSelectionDialog; import org.eclipse.ui.model.WorkbenchLabelProvider; -import org.jkiss.dbeaver.debug.DBGController; -import org.jkiss.dbeaver.debug.core.DebugCore; -import org.jkiss.dbeaver.debug.internal.ui.DebugUIMessages; +import org.jkiss.dbeaver.Log; +import org.jkiss.dbeaver.core.DBeaverUI; +import org.jkiss.dbeaver.debug.core.DebugUtils; +import org.jkiss.dbeaver.debug.ui.internal.DebugUIMessages; import org.jkiss.dbeaver.model.struct.DBSObject; +import org.jkiss.dbeaver.runtime.ui.DBUserInterface; +import org.jkiss.utils.CommonUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; public abstract class DatabaseLaunchShortcut implements ILaunchShortcut2 { - + + private static final Log log = Log.getLog(DatabaseLaunchShortcut.class); + private final String configurationTypeId; private final String launchObjectName; @@ -92,7 +87,7 @@ public abstract class DatabaseLaunchShortcut implements ILaunchShortcut2 { IEditorSite editorSite = editor.getEditorSite(); workbenchPartSite = editorSite; ISelection selection = editorSite.getSelectionProvider().getSelection(); - if (selection instanceof IStructuredSelection) { + if (selection instanceof IStructuredSelection && !selection.isEmpty()) { Object[] array = ((IStructuredSelection) selection).toArray(); searchAndLaunch(array, mode, getEditorEmptyMessage()); } else { @@ -142,7 +137,7 @@ public abstract class DatabaseLaunchShortcut implements ILaunchShortcut2 { } protected void searchAndLaunch(Object[] scope, String mode, String emptyMessage) { - List extracted = DebugCore.extractLaunchable(scope); + List extracted = DebugUtils.extractLaunchable(scope); DBSObject launchable = null; if (extracted.size() == 0) { MessageDialog.openError(getShell(), DebugUIMessages.DatabaseLaunchShortcut_e_launch, emptyMessage); @@ -152,12 +147,16 @@ public abstract class DatabaseLaunchShortcut implements ILaunchShortcut2 { launchable = extracted.get(0); } if (launchable != null) { - launch(launchable, mode); + try { + launch(launchable, mode); + } catch (CoreException e) { + DBUserInterface.getInstance().showError(DebugUIMessages.DatabaseLaunchShortcut_e_launch, "Cannot launch debug", e.getStatus()); + } } } - protected void launch(DBSObject launchable, String mode) { - Map databaseContext = DebugCore.resolveDatabaseContext(launchable); + protected void launch(DBSObject launchable, String mode) throws CoreException { + Map databaseContext = DebugUtils.resolveDatabaseContext(launchable); List configs = getCandidates(launchable, getConfigurationType(), databaseContext); if (configs != null) { ILaunchConfiguration config = null; @@ -171,17 +170,15 @@ public abstract class DatabaseLaunchShortcut implements ILaunchShortcut2 { } } if (config == null) { - try { - config = createConfiguration(launchable); - } catch (CoreException e) { - IStatus status = e.getStatus(); - DebugUI.log(status); - MessageDialog.openError(getShell(), DebugUIMessages.DatabaseLaunchShortcut_e_launch, status.getMessage()); + config = createConfiguration(launchable, databaseContext); + if (DebugUITools.openLaunchConfigurationPropertiesDialog(DBeaverUI.getActiveWorkbenchShell(), config, DebugUI.DEBUG_LAUNCH_GROUP_ID) != IDialogConstants.OK_ID) { return; } + if (config instanceof ILaunchConfigurationWorkingCopy) { + ((ILaunchConfigurationWorkingCopy) config).doSave(); + } } if (config != null) { - DebugCore.postDebuggerSourceEvent(DebugCore.extractNodePath(config)); DebugUITools.launch(config, mode); } } @@ -218,51 +215,28 @@ public abstract class DatabaseLaunchShortcut implements ILaunchShortcut2 { return (DBSObject) dialog.getFirstResult(); } - protected List getCandidates(DBSObject launchable, ILaunchConfigurationType configType, Map databaseContext) { - List candidateConfigs = Collections.emptyList(); - try { - ILaunchManager launchManager = DebugPlugin.getDefault().getLaunchManager(); - ILaunchConfiguration[] configs = launchManager.getLaunchConfigurations(configType); - candidateConfigs = new ArrayList(configs.length); - for (int i = 0; i < configs.length; i++) { - ILaunchConfiguration config = configs[i]; - if (isCandidate(config, launchable, databaseContext)) { - candidateConfigs.add(config); - } + protected List getCandidates(DBSObject launchable, ILaunchConfigurationType configType, Map databaseContext) throws CoreException { + List candidateConfigs = new ArrayList<>(); + + ILaunchManager launchManager = DebugPlugin.getDefault().getLaunchManager(); + ILaunchConfiguration[] configs = launchManager.getLaunchConfigurations(configType); + for (ILaunchConfiguration config : configs) { + if (isCandidate(config, launchable, databaseContext)) { + candidateConfigs.add(config); } - } catch (CoreException e) { - DebugUI.log(e.getStatus()); } return candidateConfigs; } - protected boolean isCandidate(ILaunchConfiguration config, DBSObject launchable, Map databaseContext) { + protected boolean isCandidate(ILaunchConfiguration config, DBSObject launchable, Map databaseContext) throws CoreException { if (!config.exists()) { return false; } - - String datasource = DebugCore.extractDatasourceId(config); - String id = launchable.getDataSource().getContainer().getId(); - if (!datasource.equals(id)) { - return false; - } - String database = DebugCore.extractDatabaseName(config); - String databaseName = String.valueOf(databaseContext.get(DBGController.DATABASE_NAME)); - if (!database.equals(databaseName)) { - return false; - } - - String schema = DebugCore.extractSchemaName(config); - String schemaName = String.valueOf(databaseContext.get(DBGController.SCHEMA_NAME)); - if (!schema.equals(schemaName)) { - return false; - } - - String oid = DebugCore.extractProcedureOid(config); - String procedureOid = String.valueOf(databaseContext.get(DBGController.PROCEDURE_OID)); - if (!oid.equals(procedureOid)) { - return false; + for (Map.Entry entry : databaseContext.entrySet()) { + if (!CommonUtils.equalObjects(config.getAttribute(entry.getKey(), (String) null), entry.getValue())) { + return false; + } } return true; } @@ -282,7 +256,7 @@ public abstract class DatabaseLaunchShortcut implements ILaunchShortcut2 { return null; } - protected abstract ILaunchConfiguration createConfiguration(DBSObject launchable) throws CoreException; + protected abstract ILaunchConfiguration createConfiguration(DBSObject launchable, Map databaseContext) throws CoreException; @Override public ILaunchConfiguration[] getLaunchConfigurations(ISelection selection) { diff --git a/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/DatabaseTab.java b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/DatabaseTab.java deleted file mode 100644 index a35c36fd27e0a73dfdd525fc28eb20267ce6b3af..0000000000000000000000000000000000000000 --- a/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/DatabaseTab.java +++ /dev/null @@ -1,334 +0,0 @@ -/* - * DBeaver - Universal Database Manager - * Copyright (C) 2010-2018 Serge Rider (serge@jkiss.org) - * Copyright (C) 2017-2018 Alexander Fedorov (alexander.fedorov@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.debug.ui; - -import org.eclipse.debug.core.ILaunchConfiguration; -import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; -import org.eclipse.debug.ui.AbstractLaunchConfigurationTab; -import org.eclipse.jface.layout.GridDataFactory; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.ModifyEvent; -import org.eclipse.swt.events.ModifyListener; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.events.SelectionListener; -import org.eclipse.swt.graphics.Image; -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; -import org.eclipse.swt.widgets.Widget; -import org.eclipse.ui.PlatformUI; -import org.jkiss.dbeaver.debug.DBGController; -import org.jkiss.dbeaver.debug.core.DebugCore; -import org.jkiss.dbeaver.debug.internal.ui.DebugUIMessages; -import org.jkiss.dbeaver.model.DBIcon; -import org.jkiss.dbeaver.model.DBPImage; -import org.jkiss.dbeaver.registry.DataSourceDescriptor; -import org.jkiss.dbeaver.registry.DataSourceProviderRegistry; -import org.jkiss.dbeaver.registry.DataSourceRegistry; -import org.jkiss.dbeaver.registry.driver.DriverDescriptor; -import org.jkiss.dbeaver.ui.DBeaverIcons; -import org.jkiss.dbeaver.ui.UIUtils; - -public class DatabaseTab extends AbstractLaunchConfigurationTab { - - private Text driverText; - private Text datasourceText; - private Text databaseText; - private Text schemaText; - private Text oidText; - private Text nameText; - - private Button attachLocal; - private Button attachGlobal; - private Text processText; - private Button scriptExecute; - private Text scriptText; - - /** - * Modify listener that simply updates the owning launch configuration - * dialog. - */ - protected ModifyListener modifyListener = new ModifyListener() { - @Override - public void modifyText(ModifyEvent evt) { - scheduleUpdateJob(); - } - }; - - @Override - public void createControl(Composite parent) { - Composite comp = new Composite(parent, SWT.NONE); - setControl(comp); - PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), getHelpContextId()); - comp.setLayout(new GridLayout(1, true)); - comp.setFont(parent.getFont()); - - createComponents(comp); - } - - protected void createComponents(Composite comp) { - createConnectionSettingsGroup(comp); - createDatabaseSettingsGroup(comp); - createAttachSettingsGroup(comp); - } - - protected void createConnectionSettingsGroup(Composite composite) { - String groupText = DebugUIMessages.DatabaseTab_connection_group_text; - Group group = UIUtils.createControlGroup(composite, groupText, 2, GridData.FILL_HORIZONTAL, SWT.DEFAULT); - { - String label = DebugUIMessages.DatabaseTab_driver_label_text; - String value = DebugCore.ATTR_DRIVER_ID_DEFAULT; - driverText = UIUtils.createLabelText(group, label, value, SWT.READ_ONLY); - } - { - String label = DebugUIMessages.DatabaseTab_datasource_label_text; - String value = DebugCore.ATTR_DATASOURCE_ID_DEFAULT; - datasourceText = UIUtils.createLabelText(group, label, value, SWT.READ_ONLY); - } - } - - protected void createDatabaseSettingsGroup(Composite composite) { - String groupLabel = DebugUIMessages.DatabaseTab_procedure_group_text; - Group group = UIUtils.createControlGroup(composite, groupLabel, 2, GridData.FILL_HORIZONTAL, SWT.DEFAULT); - { - String label = DebugUIMessages.DatabaseTab_database_label_text; - String value = DebugCore.ATTR_DATABASE_NAME_DEFAULT; - databaseText = UIUtils.createLabelText(group, label, value, SWT.READ_ONLY); - } - { - String label = DebugUIMessages.DatabaseTab_schema_label_text; - String value = DebugCore.ATTR_SCHEMA_NAME_DEFAULT; - schemaText = UIUtils.createLabelText(group, label, value, SWT.READ_ONLY); - } - { - String label = DebugUIMessages.DatabaseTab_oid_label_text; - String value = DebugCore.ATTR_PROCEDURE_OID_DEFAULT; - oidText = UIUtils.createLabelText(group, label, value, SWT.READ_ONLY); - } - { - String label = DebugUIMessages.DatabaseTab_name_label_text; - String value = DebugCore.ATTR_PROCEDURE_NAME_DEFAULT; - nameText = UIUtils.createLabelText(group, label, value, SWT.READ_ONLY); - } - } - - protected void createAttachSettingsGroup(Composite composite) { - String groupLabel = DebugUIMessages.DatabaseTab_attach_group_text; - Group group = UIUtils.createControlGroup(composite, groupLabel, 2, - GridData.FILL_HORIZONTAL | GridData.FILL_VERTICAL | GridData.GRAB_VERTICAL, SWT.DEFAULT); - group.setLayout(new GridLayout(3, false)); - - SelectionListener attachKindListener = new SelectionAdapter() { - public void widgetSelected(SelectionEvent event) { - Object data = event.widget.getData(); - String attachKind = String.valueOf(data); - handleAttachKind(attachKind); - }; - }; - - attachLocal = new Button(group, SWT.RADIO); - attachLocal.setData(DBGController.ATTACH_KIND_LOCAL); - attachLocal.setText("Local"); - attachLocal.addSelectionListener(attachKindListener); - attachLocal.setLayoutData(GridDataFactory.swtDefaults().span(3, 1).create()); - - attachGlobal = new Button(group, SWT.RADIO); - attachGlobal.setData(DBGController.ATTACH_KIND_GLOBAL); - attachGlobal.setText("Global"); - attachGlobal.addSelectionListener(attachKindListener); - attachGlobal.setLayoutData(GridDataFactory.swtDefaults().span(1, 1).create()); - - processText = UIUtils.createLabelText(group, "PID", DebugCore.ATTR_ATTACH_PROCESS_DEFAULT, SWT.READ_ONLY, - GridDataFactory.swtDefaults().span(1, 1).create()); - processText.addModifyListener(modifyListener); - - scriptExecute = new Button(group, SWT.CHECK); - scriptExecute.setText(DebugUIMessages.DatabaseTab_script_execute_text); - scriptExecute.setLayoutData(GridDataFactory.swtDefaults().span(2, 1).create()); - scriptExecute.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - updateLaunchConfigurationDialog(); - } - }); - - scriptText = new Text(group, SWT.MULTI); - scriptText.setLayoutData(GridDataFactory.fillDefaults().span(3, 1).grab(true, true).create()); - scriptText.addModifyListener(modifyListener); - } - - @Override - public void setDefaults(ILaunchConfigurationWorkingCopy configuration) { - configuration.setAttribute(DebugCore.ATTR_DRIVER_ID, DebugCore.ATTR_DRIVER_ID_DEFAULT); - 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_ATTACH_PROCESS, DebugCore.ATTR_ATTACH_PROCESS_DEFAULT); - configuration.setAttribute(DebugCore.ATTR_ATTACH_KIND, DebugCore.ATTR_ATTACH_KIND_DEFAULT); - configuration.setAttribute(DebugCore.ATTR_SCRIPT_EXECUTE, DebugCore.ATTR_SCRIPT_EXECUTE_DEFAULT); - configuration.setAttribute(DebugCore.ATTR_SCRIPT_TEXT, DebugCore.ATTR_SCRIPT_TEXT_DEFAULT); - } - - @Override - public void initializeFrom(ILaunchConfiguration configuration) { - initializeDriver(configuration); - initializeDatasource(configuration); - initializeDatabase(configuration); - initializeSchema(configuration); - initializeOid(configuration); - initializeName(configuration); - initializeProcess(configuration); - initializeKind(configuration); - initializeExecute(configuration); - initializeText(configuration); - } - - protected void initializeDriver(ILaunchConfiguration configuration) { - String extracted = DebugCore.extractDriverId(configuration); - DriverDescriptor driver = DataSourceProviderRegistry.getInstance().findDriver(extracted); - String driverName = extracted; - if (driver != null) { - driverName = driver.getName(); - } - driverText.setText(driverName); - driverText.setData(extracted); - } - - protected void initializeDatasource(ILaunchConfiguration configuration) { - String extracted = DebugCore.extractDatasourceId(configuration); - String datasourceName = extracted; - DataSourceDescriptor dataSource = DataSourceRegistry.findDataSource(extracted); - if (dataSource != null) { - datasourceName = dataSource.getName(); - } - datasourceText.setText(datasourceName); - datasourceText.setData(extracted); - } - - protected void initializeDatabase(ILaunchConfiguration configuration) { - String extracted = DebugCore.extractDatabaseName(configuration); - databaseText.setText(extracted); - } - - protected void initializeSchema(ILaunchConfiguration configuration) { - String extracted = DebugCore.extractSchemaName(configuration); - schemaText.setText(extracted); - } - - protected void initializeOid(ILaunchConfiguration configuration) { - String extracted = DebugCore.extractProcedureOid(configuration); - oidText.setText(extracted); - } - - protected void initializeName(ILaunchConfiguration configuration) { - String extracted = DebugCore.extractProcedureName(configuration); - nameText.setText(extracted); - } - - protected void initializeProcess(ILaunchConfiguration configuration) { - String extracted = DebugCore.extractAttachProcess(configuration); - processText.setText(extracted); - } - - protected void initializeKind(ILaunchConfiguration configuration) { - String extracted = DebugCore.extractAttachKind(configuration); - if (DBGController.ATTACH_KIND_GLOBAL.equals(extracted)) { - attachGlobal.setSelection(true); - attachLocal.setSelection(false); - } else { - attachGlobal.setSelection(false); - attachLocal.setSelection(true); - } - handleAttachKind(extracted); - } - - protected void initializeExecute(ILaunchConfiguration configuration) { - String extracted = DebugCore.extractScriptExecute(configuration); - scriptExecute.setSelection(Boolean.parseBoolean(extracted)); - } - - protected void initializeText(ILaunchConfiguration configuration) { - String extracted = DebugCore.extractScriptText(configuration); - scriptText.setText(extracted); - } - - void handleAttachKind(String attachKind) { - if (DBGController.ATTACH_KIND_GLOBAL.equals(attachKind)) { - processText.setEditable(true); - scriptExecute.setSelection(false); - scriptExecute.setEnabled(false); - scriptText.setEnabled(false); - } else { - processText.setText(DebugCore.ATTR_ATTACH_PROCESS_DEFAULT); - processText.setEditable(false); - scriptExecute.setSelection(true); - scriptExecute.setEnabled(false); - scriptText.setEnabled(true); - } - updateLaunchConfigurationDialog(); - } - - @Override - public Image getImage() { - DBPImage image = extractDriverImage(); - if (image == null) { - image = DBIcon.TREE_DATABASE; - } - return DBeaverIcons.getImage(image); - } - - protected DBPImage extractDriverImage() { - if (driverText == null || driverText.isDisposed()) { - return null; - } - String driverName = driverText.getText(); - DriverDescriptor driver = DataSourceProviderRegistry.getInstance().findDriver(driverName); - if (driver == null) { - return null; - } - return driver.getIcon(); - } - - @Override - public void performApply(ILaunchConfigurationWorkingCopy configuration) { - configuration.setAttribute(DebugCore.ATTR_DRIVER_ID, String.valueOf(driverText.getData())); - configuration.setAttribute(DebugCore.ATTR_DATASOURCE_ID, String.valueOf(datasourceText.getData())); - 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_ATTACH_PROCESS, processText.getText()); - Widget kind = attachGlobal.getSelection() ? attachGlobal : attachLocal; - configuration.setAttribute(DebugCore.ATTR_ATTACH_KIND, String.valueOf(kind.getData())); - configuration.setAttribute(DebugCore.ATTR_SCRIPT_EXECUTE, String.valueOf(scriptExecute.getSelection())); - configuration.setAttribute(DebugCore.ATTR_SCRIPT_TEXT, scriptText.getText()); - } - - @Override - public String getName() { - return DebugUIMessages.DatabaseTab_name; - } - -} diff --git a/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/DebugUI.java b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/DebugUI.java index 2fc5ddbb4d8ab7e005b289897cad3ea0382952bc..d8c9f5b6f4de8032e28bd1840efd8c8e175fdb7d 100644 --- a/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/DebugUI.java +++ b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/DebugUI.java @@ -23,18 +23,17 @@ import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; -import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.DBPDataSourceContainer; import org.jkiss.dbeaver.model.struct.DBSObject; public class DebugUI { public static final String BUNDLE_SYMBOLIC_NAME = "org.jkiss.dbeaver.debug.ui"; //$NON-NLS-1$ + public static final String DEBUG_LAUNCH_GROUP_ID = "org.jkiss.dbeaver.debug.launchGroup"; + public static final String DEBUG_OPEN_CONFIGURATION_COMMAND_ID = "org.jkiss.dbeaver.debug.ui.commands.command.debugConfigurations"; //$NON-NLS-1$ - private static final Log log = Log.getLog(DebugUI.class); - - public static DebugEditorAdvisor findEditorAdvisor(DBPDataSourceContainer dataSourceContainer) { - DebugEditorAdvisor advisor = Adapters.adapt(dataSourceContainer, DebugEditorAdvisor.class); + public static DBGEditorAdvisor findEditorAdvisor(DBPDataSourceContainer dataSourceContainer) { + DBGEditorAdvisor advisor = Adapters.adapt(dataSourceContainer, DBGEditorAdvisor.class); if (advisor != null) { return advisor; } @@ -53,8 +52,4 @@ public class DebugUI { return new Status(IStatus.ERROR, BUNDLE_SYMBOLIC_NAME, message); } - public static void log(IStatus status) { - Log.log(log, status); - } - } diff --git a/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/actions/OpenDebugConfigurationHandler.java b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/actions/OpenDebugConfigurationHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..1436f0090d394913f9f5e0459c0932851def2659 --- /dev/null +++ b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/actions/OpenDebugConfigurationHandler.java @@ -0,0 +1,61 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2018 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.debug.ui.actions; + +import org.eclipse.core.commands.AbstractHandler; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.core.commands.ExecutionException; +import org.eclipse.core.commands.IHandler; +import org.eclipse.debug.core.ILaunchConfiguration; +import org.eclipse.debug.internal.ui.DebugUIPlugin; +import org.eclipse.debug.internal.ui.contextlaunching.ContextRunner; +import org.eclipse.debug.internal.ui.contextlaunching.LaunchingResourceManager; +import org.eclipse.debug.ui.DebugUITools; +import org.eclipse.debug.ui.actions.RulerToggleBreakpointActionDelegate; +import org.eclipse.jface.viewers.StructuredSelection; +import org.eclipse.swt.widgets.Event; +import org.jkiss.dbeaver.debug.ui.DebugUI; +import org.jkiss.dbeaver.debug.ui.internal.DebugLaunchDialogAction; + +public class OpenDebugConfigurationHandler extends AbstractHandler implements IHandler { + + @Override + public Object execute(ExecutionEvent event) throws ExecutionException { + if (LaunchingResourceManager.isContextLaunchEnabled(DebugUI.DEBUG_LAUNCH_GROUP_ID)) { + ContextRunner.getDefault().launch( + DebugUIPlugin.getDefault().getLaunchConfigurationManager().getLaunchGroup( + DebugUI.DEBUG_LAUNCH_GROUP_ID), + false); + } + else { + ILaunchConfiguration configuration = getLastLaunch(); + if (configuration == null) { + DebugUITools.openLaunchConfigurationDialogOnGroup(DebugUIPlugin.getShell(), new StructuredSelection(), DebugUI.DEBUG_LAUNCH_GROUP_ID); + } else { + DebugUITools.launch(configuration, "debug", false); + } + } + + return null; + } + + protected ILaunchConfiguration getLastLaunch() { + return DebugUIPlugin.getDefault().getLaunchConfigurationManager().getFilteredLastLaunch(DebugUI.DEBUG_LAUNCH_GROUP_ID); + } + +} diff --git a/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/actions/ToggleProcedureBreakpointTarget.java b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/actions/ToggleProcedureBreakpointTarget.java index fedb4489b4bc6d968e0759fcd5b69c99da1fc261..78a1844af2937325832637ec3b661b7f272e2a9e 100644 --- a/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/actions/ToggleProcedureBreakpointTarget.java +++ b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/actions/ToggleProcedureBreakpointTarget.java @@ -31,7 +31,7 @@ import org.eclipse.swt.widgets.Event; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IWorkbenchPart; import org.jkiss.dbeaver.core.DBeaverCore; -import org.jkiss.dbeaver.debug.core.DebugCore; +import org.jkiss.dbeaver.debug.DBGConstants; import org.jkiss.dbeaver.debug.core.breakpoints.DatabaseLineBreakpoint; import org.jkiss.dbeaver.debug.core.breakpoints.IDatabaseBreakpoint; import org.jkiss.dbeaver.debug.ui.DebugUI; @@ -72,14 +72,13 @@ public class ToggleProcedureBreakpointTarget implements IToggleBreakpointsTarget ITextSelection textSelection = (ITextSelection) selection; int lineNumber = textSelection.getStartLine(); IBreakpoint[] breakpoints = DebugPlugin.getDefault().getBreakpointManager() - .getBreakpoints(DebugCore.MODEL_IDENTIFIER_DATABASE); - for (int i = 0; i < breakpoints.length; i++) { - IBreakpoint breakpoint = breakpoints[i]; + .getBreakpoints(DBGConstants.MODEL_IDENTIFIER_DATABASE); + for (IBreakpoint breakpoint : breakpoints) { if (breakpoint instanceof IDatabaseBreakpoint) { IDatabaseBreakpoint databaseBreakpoint = (IDatabaseBreakpoint) breakpoint; if (nodeItemPath.equals(databaseBreakpoint.getNodePath())) { if (((ILineBreakpoint) breakpoint).getLineNumber() == (lineNumber + 1)) { - DebugUITools.deleteBreakpoints(new IBreakpoint[] { breakpoint }, part.getSite().getShell(), null); + DebugUITools.deleteBreakpoints(new IBreakpoint[]{breakpoint}, part.getSite().getShell(), null); return; } } @@ -92,8 +91,7 @@ public class ToggleProcedureBreakpointTarget implements IToggleBreakpointsTarget protected IResource extractResource(IEditorPart part, ISelection selection) { DBSObject databaseObject = DebugUI.extractDatabaseObject(part); - IResource resolved = DBeaverIDECore.resolveWorkspaceResource(databaseObject); - return resolved; + return DBeaverIDECore.resolveWorkspaceResource(databaseObject); } @Override diff --git a/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/details/DatabaseDebugDetailPane.java b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/details/DatabaseDebugDetailPane.java index b6f6b0fd4d282d2099a0e58291bb5b81b8c7d3ca..064d6f45dd15d219da82e58fe48347a9a5dad66e 100644 --- a/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/details/DatabaseDebugDetailPane.java +++ b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/details/DatabaseDebugDetailPane.java @@ -18,9 +18,6 @@ package org.jkiss.dbeaver.debug.ui.details; -import java.util.HashSet; -import java.util.Set; - import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.ListenerList; @@ -36,13 +33,18 @@ import org.eclipse.swt.widgets.Control; import org.eclipse.ui.IPropertyListener; import org.eclipse.ui.IWorkbenchPartConstants; import org.eclipse.ui.IWorkbenchPartSite; -import org.jkiss.dbeaver.debug.ui.DebugUI; +import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.ui.ActionBars; import org.jkiss.dbeaver.ui.Widgets; +import java.util.HashSet; +import java.util.Set; + public abstract class DatabaseDebugDetailPane implements IDetailPane2, IDetailPane3 { + private static final Log log = Log.getLog(DatabaseDebugDetailPane.class); + private String name; private String description; private String id; @@ -88,18 +90,16 @@ public abstract class DatabaseDebugDetailPane { + if (autoSaveProperties.contains(propId)) { + try { + editor.doSave(); + return; + } catch (CoreException e) { + log.log(e.getStatus()); } - firePropertyChange(IWorkbenchPartConstants.PROP_DIRTY); } + firePropertyChange(IWorkbenchPartConstants.PROP_DIRTY); }); return editor.createControl(editorParent); } @@ -107,14 +107,14 @@ public abstract class DatabaseDebugDetailPane { diff --git a/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/internal/DatabaseDebugLaunchShortcut.java b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/internal/DatabaseDebugLaunchShortcut.java new file mode 100644 index 0000000000000000000000000000000000000000..f252c81255c1e45b250346288932ce5c7d1236e4 --- /dev/null +++ b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/internal/DatabaseDebugLaunchShortcut.java @@ -0,0 +1,53 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2018 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.debug.ui.internal; + +import org.eclipse.core.runtime.CoreException; +import org.eclipse.debug.core.*; +import org.jkiss.dbeaver.debug.core.DebugUtils; +import org.jkiss.dbeaver.debug.ui.DatabaseLaunchShortcut; +import org.jkiss.dbeaver.model.struct.DBSObject; + +import java.util.Map; + +public class DatabaseDebugLaunchShortcut extends DatabaseLaunchShortcut { + + private static final String CONFIG_TYPE = "org.jkiss.dbeaver.debug.launchConfiguration"; + + public DatabaseDebugLaunchShortcut() { + super(CONFIG_TYPE, "Database Debug"); + } + + @Override + protected ILaunchConfiguration createConfiguration(DBSObject launchable, Map databaseContext) throws CoreException { + ILaunchManager manager = DebugPlugin.getDefault().getLaunchManager(); + ILaunchConfigurationType type = manager.getLaunchConfigurationType(CONFIG_TYPE); + ILaunchConfigurationWorkingCopy launchConfig = type.newInstance(null, launchable.getName()); + + if (databaseContext != null) { + DebugUtils.putContextInConfiguration(launchConfig, databaseContext); + } + + return launchConfig; + } + + @Override + protected boolean isCandidate(ILaunchConfiguration config, DBSObject launchable, Map databaseContext) throws CoreException { + return super.isCandidate(config, launchable, databaseContext); + } + +} diff --git a/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/internal/DebugConfigurationMenuContributor.java b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/internal/DebugConfigurationMenuContributor.java new file mode 100644 index 0000000000000000000000000000000000000000..29cd54eda5e4a7b791f3ebf2e0ff47999b57d9e2 --- /dev/null +++ b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/internal/DebugConfigurationMenuContributor.java @@ -0,0 +1,60 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2018 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.debug.ui.internal; + +import org.eclipse.debug.core.ILaunchConfiguration; +import org.eclipse.debug.internal.ui.DebugUIPlugin; +import org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationManager; +import org.eclipse.debug.internal.ui.launchConfigurations.LaunchHistory; +import org.eclipse.debug.ui.actions.LaunchAction; +import org.eclipse.debug.ui.actions.LaunchShortcutsAction; +import org.eclipse.jface.action.ActionContributionItem; +import org.eclipse.jface.action.IContributionItem; +import org.eclipse.jface.action.Separator; +import org.jkiss.dbeaver.Log; +import org.jkiss.dbeaver.debug.ui.DebugUI; +import org.jkiss.dbeaver.ui.ActionUtils; +import org.jkiss.dbeaver.ui.actions.datasource.DataSourceMenuContributor; + +import java.util.List; + +public class DebugConfigurationMenuContributor extends DataSourceMenuContributor +{ + private static final Log log = Log.getLog(DebugConfigurationMenuContributor.class); + + @Override + protected void fillContributionItems(final List menuItems) + { + // Fill recent debugs + LaunchConfigurationManager launchConfigurationManager = DebugUIPlugin.getDefault().getLaunchConfigurationManager(); + LaunchHistory launchHistory = launchConfigurationManager.getLaunchHistory(DebugUI.DEBUG_LAUNCH_GROUP_ID); + ILaunchConfiguration[] filteredConfigs = LaunchConfigurationManager.filterConfigs(launchHistory.getHistory()); + + for (ILaunchConfiguration launch : filteredConfigs) { + LaunchAction action = new LaunchAction(launch, "debug"); + menuItems.add(new ActionContributionItem(action)); + } + + // Fill configuration actions + if (filteredConfigs.length > 0) { + menuItems.add(new Separator()); + } + menuItems.add(new ActionContributionItem(new LaunchShortcutsAction(DebugUI.DEBUG_LAUNCH_GROUP_ID))); + menuItems.add(new ActionContributionItem(new DebugLaunchDialogAction())); + } + +} \ No newline at end of file diff --git a/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/internal/DebugConfigurationPanelDescriptor.java b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/internal/DebugConfigurationPanelDescriptor.java new file mode 100644 index 0000000000000000000000000000000000000000..9137a53d49134b44ee6f12d39be107e4d3b0a63b --- /dev/null +++ b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/internal/DebugConfigurationPanelDescriptor.java @@ -0,0 +1,100 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2018 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.debug.ui.internal; + +import org.eclipse.core.runtime.IConfigurationElement; +import org.jkiss.code.NotNull; +import org.jkiss.dbeaver.DBException; +import org.jkiss.dbeaver.debug.ui.DBGConfigurationPanel; +import org.jkiss.dbeaver.model.DBPDataSource; +import org.jkiss.dbeaver.model.DBPDataSourceContainer; +import org.jkiss.dbeaver.registry.AbstractContextDescriptor; +import org.jkiss.dbeaver.registry.RegistryConstants; +import org.jkiss.utils.CommonUtils; + +import java.util.ArrayList; +import java.util.List; + +/** + * DebugConfigurationPanelDescriptor + */ +public class DebugConfigurationPanelDescriptor extends AbstractContextDescriptor +{ + public static final String EXTENSION_ID = "org.jkiss.dbeaver.debug.ui.configurationPanels"; //$NON-NLS-1$ + + private final String id; + private final String name; + private final String description; + private final ObjectType implType; + private List supportedDataSources = new ArrayList<>(); + + public DebugConfigurationPanelDescriptor( + IConfigurationElement config) + { + super(config); + + this.id = config.getAttribute(RegistryConstants.ATTR_ID); + this.name = config.getAttribute(RegistryConstants.ATTR_NAME); + this.description = config.getAttribute(RegistryConstants.ATTR_DESCRIPTION); + this.implType = new ObjectType(config, RegistryConstants.ATTR_CLASS); + + IConfigurationElement[] dsElements = config.getChildren(RegistryConstants.TAG_DATASOURCE); + for (IConfigurationElement dsElement : dsElements) { + String dsId = dsElement.getAttribute(RegistryConstants.ATTR_ID); + String dsClassName = dsElement.getAttribute(RegistryConstants.ATTR_CLASS); + if (dsId == null && dsClassName == null) { + continue; + } + supportedDataSources.add(dsId != null ? dsId : dsClassName); + } + } + + @NotNull + public String getId() { + return id; + } + + @NotNull + public String getName() + { + return name; + } + + public String getDescription() + { + return description; + } + + public boolean isValid() { + return !CommonUtils.isEmpty(implType.getImplName()); + } + + public DBGConfigurationPanel createPanel() throws DBException { + return implType.createInstance(DBGConfigurationPanel.class); + } + + @Override + public String toString() { + return id; + } + + public boolean supportsDataSource(DBPDataSourceContainer dataSource) { + return supportedDataSources.contains(dataSource.getDriver().getProviderId()) || + supportedDataSources.contains(dataSource.getDriver().getDriverClassName()); + } + +} diff --git a/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/internal/DebugConfigurationPanelRegistry.java b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/internal/DebugConfigurationPanelRegistry.java new file mode 100644 index 0000000000000000000000000000000000000000..43b71152b422f1fff818b4b736dc11304efc6396 --- /dev/null +++ b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/internal/DebugConfigurationPanelRegistry.java @@ -0,0 +1,78 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2018 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.debug.ui.internal; + +import org.eclipse.core.runtime.IConfigurationElement; +import org.eclipse.core.runtime.IExtensionRegistry; +import org.eclipse.core.runtime.Platform; +import org.jkiss.dbeaver.model.DBPDataSourceContainer; + +import java.util.ArrayList; +import java.util.List; + +public class DebugConfigurationPanelRegistry +{ + private static DebugConfigurationPanelRegistry instance = null; + + public synchronized static DebugConfigurationPanelRegistry getInstance() + { + if (instance == null) { + instance = new DebugConfigurationPanelRegistry(Platform.getExtensionRegistry()); + } + return instance; + } + + private final List descriptors = new ArrayList<>(); + + private DebugConfigurationPanelRegistry(IExtensionRegistry registry) + { + // Load data descriptors from external plugins + { + IConfigurationElement[] extElements = registry.getConfigurationElementsFor(DebugConfigurationPanelDescriptor.EXTENSION_ID); + for (IConfigurationElement ext : extElements) { + DebugConfigurationPanelDescriptor formatterDescriptor = new DebugConfigurationPanelDescriptor(ext); + descriptors.add(formatterDescriptor); + } + } + } + + public List getPanels() + { + return descriptors; + } + + public List getPanels(DBPDataSourceContainer dataSource) { + List result = new ArrayList<>(); + for (DebugConfigurationPanelDescriptor desc : descriptors) { + if (desc.supportsDataSource(dataSource)) { + result.add(desc); + } + } + return result; + } + + public DebugConfigurationPanelDescriptor getPanel(String id) + { + for (DebugConfigurationPanelDescriptor descriptor : descriptors) { + if (descriptor.getId().equals(id)) { + return descriptor; + } + } + return null; + } + +} diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/src/org/jkiss/dbeaver/ext/postgresql/debug/ui/internal/PgSqlDebugContributionItem.java b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/internal/DebugLaunchDialogAction.java similarity index 61% rename from plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/src/org/jkiss/dbeaver/ext/postgresql/debug/ui/internal/PgSqlDebugContributionItem.java rename to plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/internal/DebugLaunchDialogAction.java index 958061225729f1465192c05946e1433dcd49cde4..81c467e4777880fe22de60890494f9b9a43d4997 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/src/org/jkiss/dbeaver/ext/postgresql/debug/ui/internal/PgSqlDebugContributionItem.java +++ b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/internal/DebugLaunchDialogAction.java @@ -1,7 +1,6 @@ /* * DBeaver - Universal Database Manager * Copyright (C) 2010-2018 Serge Rider (serge@jkiss.org) - * Copyright (C) 2017-2018 Alexander Fedorov (alexander.fedorov@jkiss.org) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,16 +14,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +package org.jkiss.dbeaver.debug.ui.internal; -package org.jkiss.dbeaver.ext.postgresql.debug.ui.internal; +import org.eclipse.debug.ui.actions.OpenLaunchDialogAction; +import org.jkiss.dbeaver.debug.ui.DebugUI; -import org.eclipse.debug.core.ILaunchManager; -import org.jkiss.dbeaver.debug.ui.DatabaseLaunchContributionItem; +public class DebugLaunchDialogAction extends OpenLaunchDialogAction { -public class PgSqlDebugContributionItem extends DatabaseLaunchContributionItem { - - protected PgSqlDebugContributionItem() { - super(ILaunchManager.DEBUG_MODE); + public DebugLaunchDialogAction() { + super(DebugUI.DEBUG_LAUNCH_GROUP_ID); + setActionDefinitionId(DebugUI.DEBUG_OPEN_CONFIGURATION_COMMAND_ID); } } diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/src/org/jkiss/dbeaver/ext/postgresql/debug/ui/internal/PgSqlMenuDelegate.java b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/internal/DebugMenuDelegate.java similarity index 67% rename from plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/src/org/jkiss/dbeaver/ext/postgresql/debug/ui/internal/PgSqlMenuDelegate.java rename to plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/internal/DebugMenuDelegate.java index 4696cfbb7a9046736560cd3221c7cbb75eb3733b..1c959b409987ba6f27f320fb76dc897d1fe4937d 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/src/org/jkiss/dbeaver/ext/postgresql/debug/ui/internal/PgSqlMenuDelegate.java +++ b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/internal/DebugMenuDelegate.java @@ -1,7 +1,6 @@ /* * DBeaver - Universal Database Manager * Copyright (C) 2010-2018 Serge Rider (serge@jkiss.org) - * Copyright (C) 2017-2018 Alexander Fedorov (alexander.fedorov@jkiss.org) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,22 +14,21 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -package org.jkiss.dbeaver.ext.postgresql.debug.ui.internal; +package org.jkiss.dbeaver.debug.ui.internal; import org.eclipse.debug.ui.actions.AbstractLaunchToolbarAction; import org.eclipse.jface.action.IAction; -import org.jkiss.dbeaver.ext.postgresql.debug.ui.PostgreSqlDebugUi; +import org.jkiss.dbeaver.debug.ui.DebugUI; -public class PgSqlMenuDelegate extends AbstractLaunchToolbarAction { +public class DebugMenuDelegate extends AbstractLaunchToolbarAction { - public PgSqlMenuDelegate() { - super(PostgreSqlDebugUi.DEBUG_PGSQL_LAUNCH_GROUP_ID); + public DebugMenuDelegate() { + super(DebugUI.DEBUG_LAUNCH_GROUP_ID); } @Override protected IAction getOpenDialogAction() { - return new PgSqlOpenLaunchDialogAction(); + return new DebugLaunchDialogAction(); } } diff --git a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/internal/core/DebugCoreActivator.java b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/internal/DebugUIActivator.java similarity index 55% rename from plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/internal/core/DebugCoreActivator.java rename to plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/internal/DebugUIActivator.java index f53f92bb327a9e709b6b9be2060597353afea1e4..95f89210d19c5e81bec47d95689f2efb2dfa10a4 100644 --- a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/internal/core/DebugCoreActivator.java +++ b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/internal/DebugUIActivator.java @@ -16,45 +16,44 @@ * limitations under the License. */ -package org.jkiss.dbeaver.debug.internal.core; +package org.jkiss.dbeaver.debug.ui.internal; -import org.eclipse.e4.core.contexts.EclipseContextFactory; -import org.eclipse.e4.core.contexts.IEclipseContext; -import org.eclipse.e4.core.services.events.IEventBroker; +import org.eclipse.debug.core.DebugEvent; +import org.eclipse.debug.core.DebugPlugin; +import org.eclipse.debug.core.IDebugEventFilter; +import org.eclipse.debug.core.IDebugEventSetListener; +import org.eclipse.ui.plugin.AbstractUIPlugin; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; -public class DebugCoreActivator implements BundleActivator { +public class DebugUIActivator extends AbstractUIPlugin { - private static DebugCoreActivator activator; - private static BundleContext bundleContext; + private static DebugUIActivator activator; + private IDebugEventSetListener eventListener; - private IEventBroker eventBroker; - - public static DebugCoreActivator getDefault() { + public static DebugUIActivator getDefault() { return activator; } - static BundleContext getContext() { - return bundleContext; - } - @Override public void start(BundleContext context) throws Exception { - bundleContext = context; activator = this; - IEclipseContext serviceContext = EclipseContextFactory.getServiceContext(bundleContext); - eventBroker = serviceContext.get(IEventBroker.class); + + eventListener = new DebugUIEventListener(); + + DebugPlugin debugPlugin = DebugPlugin.getDefault(); + if (debugPlugin != null) { + debugPlugin.addDebugEventListener(eventListener); + } } @Override public void stop(BundleContext context) throws Exception { + DebugPlugin debugPlugin = DebugPlugin.getDefault(); + if (debugPlugin != null) { + debugPlugin.removeDebugEventListener(eventListener); + } activator = null; - bundleContext = null; - } - - public void postEvent(String topic, Object data) { - eventBroker.post(topic, data); } } diff --git a/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/internal/DebugUIEventListener.java b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/internal/DebugUIEventListener.java new file mode 100644 index 0000000000000000000000000000000000000000..8fc0cc20b1bbca93664154885727ef99d72a6261 --- /dev/null +++ b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/internal/DebugUIEventListener.java @@ -0,0 +1,76 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2018 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.debug.ui.internal; + +import org.eclipse.core.runtime.CoreException; +import org.eclipse.debug.core.DebugEvent; +import org.eclipse.debug.core.IDebugEventSetListener; +import org.eclipse.debug.ui.IDebugUIConstants; +import org.eclipse.ui.IViewPart; +import org.eclipse.ui.IWorkbenchPage; +import org.eclipse.ui.IWorkbenchWindow; +import org.jkiss.dbeaver.Log; +import org.jkiss.dbeaver.core.DBeaverUI; +import org.jkiss.dbeaver.ui.DBeaverUIConstants; + +public class DebugUIEventListener implements IDebugEventSetListener { + + private static final Log log = Log.getLog(DebugUIEventListener.class); + + @Override + public void handleDebugEvents(DebugEvent[] events) { + for (DebugEvent event : events) { + switch (event.getKind()) { + case DebugEvent.SUSPEND: + showDebugViews(true); + break; + case DebugEvent.TERMINATE: + showDebugViews(false); + break; + } + } + } + + private void showDebugViews(boolean show) { + IWorkbenchWindow window = DBeaverUI.getActiveWorkbenchWindow(); + IWorkbenchPage activePage = window.getActivePage(); + if (!DBeaverUIConstants.PERSPECTIVE_DBEAVER.equals(activePage.getPerspective().getId())) { + return; + } + + DBeaverUI.asyncExec(() -> { + try { + if (show) { + activePage.showView(IDebugUIConstants.ID_VARIABLE_VIEW); + activePage.showView(IDebugUIConstants.ID_BREAKPOINT_VIEW); + } else { + hideView(activePage, IDebugUIConstants.ID_VARIABLE_VIEW); + hideView(activePage, IDebugUIConstants.ID_BREAKPOINT_VIEW); + } + } catch (CoreException e) { + log.log(e.getStatus()); + } + }); + } + + private void hideView(IWorkbenchPage activePage, String viewId) { + IViewPart view = activePage.findView(viewId); + if (view != null) { + activePage.hideView(view); + } + } +} diff --git a/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/internal/ui/DebugUIInternals.java b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/internal/DebugUIInternals.java similarity index 97% rename from plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/internal/ui/DebugUIInternals.java rename to plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/internal/DebugUIInternals.java index 95489c9c267499ec74397979149aa7cf962647c0..5808425b20cdb8a761dccf771899f306f273a86a 100644 --- a/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/internal/ui/DebugUIInternals.java +++ b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/internal/DebugUIInternals.java @@ -16,7 +16,7 @@ * limitations under the License. */ -package org.jkiss.dbeaver.debug.internal.ui; +package org.jkiss.dbeaver.debug.ui.internal; import java.util.ArrayList; import java.util.Arrays; @@ -41,7 +41,7 @@ import org.eclipse.jface.action.IAction; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.activities.WorkbenchActivityHelper; -import org.jkiss.dbeaver.debug.core.DebugCore; +import org.jkiss.dbeaver.debug.core.DebugUtils; @SuppressWarnings("restriction") public class DebugUIInternals { @@ -53,7 +53,7 @@ public class DebugUIInternals { } public static IAction createConfigurationAction(ILaunchConfiguration config, String mode, int accelerator) { - if (DebugCore.canLaunch(config, mode)) { + if (DebugUtils.canLaunch(config, mode)) { String configName = config.getName(); ImageDescriptor imageDescriptor = DebugUITools.getDefaultImageDescriptor(config); IAction action = new LaunchConfigurationAction(config, mode, configName, imageDescriptor, accelerator); diff --git a/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/internal/ui/DebugUIMessages.java b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/internal/DebugUIMessages.java similarity index 79% rename from plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/internal/ui/DebugUIMessages.java rename to plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/internal/DebugUIMessages.java index c3b6a184fe545f9c505f386e78d40dab4cb9bc40..3a21847d3ac8e84fb4fd4eec261b7ea492dcd22e 100644 --- a/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/internal/ui/DebugUIMessages.java +++ b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/internal/DebugUIMessages.java @@ -16,13 +16,13 @@ * limitations under the License. */ -package org.jkiss.dbeaver.debug.internal.ui; +package org.jkiss.dbeaver.debug.ui.internal; import org.eclipse.osgi.util.NLS; public class DebugUIMessages extends NLS { - private static final String BUNDLE_NAME = "org.jkiss.dbeaver.debug.internal.ui.DebugUIMessages"; //$NON-NLS-1$ + private static final String BUNDLE_NAME = "org.jkiss.dbeaver.debug.ui.internal.DebugUIMessages"; //$NON-NLS-1$ public static String DatabaseStandardBreakpointPane_description; public static String DatabaseStandardBreakpointPane_name; @@ -31,14 +31,8 @@ public class DebugUIMessages extends NLS { public static String DatabaseTab_driver_label_text; public static String DatabaseTab_datasource_label_text; - public static String DatabaseTab_procedure_group_text; - public static String DatabaseTab_database_label_text; - public static String DatabaseTab_schema_label_text; - public static String DatabaseTab_oid_label_text; - public static String DatabaseTab_name_label_text; - - public static String DatabaseTab_attach_group_text; - public static String DatabaseTab_script_execute_text; + public static String DatabaseTab_debug_type_group_text; + public static String DatabaseTab_configuration_group_text; public static String DatabaseTab_name; diff --git a/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/internal/ui/DebugUIMessages.properties b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/internal/DebugUIMessages.properties similarity index 82% rename from plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/internal/ui/DebugUIMessages.properties rename to plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/internal/DebugUIMessages.properties index e0d5861cf1e577320c4b071c157fc9b80c14e79e..181f2561ab7510d0e765bb4904eedb3f1d4625f2 100644 --- a/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/internal/ui/DebugUIMessages.properties +++ b/plugins/org.jkiss.dbeaver.debug.ui/src/org/jkiss/dbeaver/debug/ui/internal/DebugUIMessages.properties @@ -21,16 +21,10 @@ DatabaseTab_connection_group_text=Connection settings DatabaseTab_driver_label_text=Driver DatabaseTab_datasource_label_text=DataSource -DatabaseTab_procedure_group_text=Procedure settings -DatabaseTab_database_label_text=Database -DatabaseTab_schema_label_text=Schema -DatabaseTab_oid_label_text=OID -DatabaseTab_name_label_text=Name +DatabaseTab_debug_type_group_text=Type +DatabaseTab_configuration_group_text=Configuration -DatabaseTab_attach_group_text=Attach settings -DatabaseTab_script_execute_text=Execute script - -DatabaseTab_name=&Main +DatabaseTab_name=&Settings DatabaseLaunchShortcut_e_launch=Launch error diff --git a/plugins/org.jkiss.dbeaver.ext.db2/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.ext.db2/META-INF/MANIFEST.MF index e84a7e8d476cbea8791a49add245ac330157d38d..42668a510d11cd6283d322a8d9376b710f3e3642 100644 --- a/plugins/org.jkiss.dbeaver.ext.db2/META-INF/MANIFEST.MF +++ b/plugins/org.jkiss.dbeaver.ext.db2/META-INF/MANIFEST.MF @@ -3,8 +3,8 @@ Bundle-ManifestVersion: 2 Bundle-Vendor: %Bundle-Vendor Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.ext.db2;singleton:=true -Bundle-Version: 2.1.67 -Bundle-Release-Date: 20180430 +Bundle-Version: 2.1.68 +Bundle-Release-Date: 20180514 Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy Bundle-Activator: org.jkiss.dbeaver.ext.db2.Activator diff --git a/plugins/org.jkiss.dbeaver.ext.db2/pom.xml b/plugins/org.jkiss.dbeaver.ext.db2/pom.xml index d86e70942f0d35d0c52c68b518ecb3e719e37608..8a8f220cefbb8b2b2806653796d869bc323929ae 100644 --- a/plugins/org.jkiss.dbeaver.ext.db2/pom.xml +++ b/plugins/org.jkiss.dbeaver.ext.db2/pom.xml @@ -9,6 +9,6 @@ ../../ org.jkiss.dbeaver.ext.db2 - 2.1.67 + 2.1.68 eclipse-plugin diff --git a/plugins/org.jkiss.dbeaver.ext.db2/src/org/jkiss/dbeaver/ext/db2/manager/DB2TableColumnManager.java b/plugins/org.jkiss.dbeaver.ext.db2/src/org/jkiss/dbeaver/ext/db2/manager/DB2TableColumnManager.java index db770d54e7661a096881faec968787c2dfff5257..5890661634cecef58307d1b32fc3a70504a21db4 100644 --- a/plugins/org.jkiss.dbeaver.ext.db2/src/org/jkiss/dbeaver/ext/db2/manager/DB2TableColumnManager.java +++ b/plugins/org.jkiss.dbeaver.ext.db2/src/org/jkiss/dbeaver/ext/db2/manager/DB2TableColumnManager.java @@ -113,9 +113,8 @@ public class DB2TableColumnManager extends SQLTableColumnManager actions, ObjectCreateCommand command, Map options) { + super.addObjectCreateActions(actions, command, options); + if (!CommonUtils.isEmpty(command.getObject().getDescription())) { + actions.add(buildCommentAction(command.getObject())); + } + } + // ------- // Helpers // ------- @@ -159,11 +166,10 @@ public class DB2TableColumnManager extends SQLTableColumnManager return dataType; } - public void setType(DB2DataType dataType) - { + public void setDataType(DB2DataType dataType) { this.dataType = dataType; + this.setTypeName(dataType.getTypeName()); } @Override - @Property(viewable = true, order = 38) + @Property(viewable = true, editable = true, updatable = true, order = 38) public long getMaxLength() { return super.getMaxLength(); diff --git a/plugins/org.jkiss.dbeaver.ext.derby/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.ext.derby/META-INF/MANIFEST.MF index 078e7fefdd981c23a0c07845439e2b84e8c24b66..570db1abed51bad09f1c270e4648f331cff87963 100644 --- a/plugins/org.jkiss.dbeaver.ext.derby/META-INF/MANIFEST.MF +++ b/plugins/org.jkiss.dbeaver.ext.derby/META-INF/MANIFEST.MF @@ -3,8 +3,8 @@ Bundle-ManifestVersion: 2 Bundle-Vendor: %Bundle-Vendor Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.ext.derby;singleton:=true -Bundle-Version: 1.1.67 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.1.68 +Bundle-Release-Date: 20180514 Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy Require-Bundle: org.eclipse.core.runtime, diff --git a/plugins/org.jkiss.dbeaver.ext.derby/pom.xml b/plugins/org.jkiss.dbeaver.ext.derby/pom.xml index 5a8ef118023ba5f6c4e92255c2760405bc258705..185d17b0c6e920d2131e731b4e359d367d776c93 100644 --- a/plugins/org.jkiss.dbeaver.ext.derby/pom.xml +++ b/plugins/org.jkiss.dbeaver.ext.derby/pom.xml @@ -9,6 +9,6 @@ ../../ org.jkiss.dbeaver.ext.derby - 1.1.67 + 1.1.68 eclipse-plugin diff --git a/plugins/org.jkiss.dbeaver.ext.erd/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.ext.erd/META-INF/MANIFEST.MF index 1cea3eeccd3690e0342c5eec5ed7826f44c810f7..7582bc02e32849738aaec717e66b351d3f84e655 100644 --- a/plugins/org.jkiss.dbeaver.ext.erd/META-INF/MANIFEST.MF +++ b/plugins/org.jkiss.dbeaver.ext.erd/META-INF/MANIFEST.MF @@ -3,8 +3,8 @@ Bundle-ManifestVersion: 2 Bundle-Vendor: %Bundle-Vendor Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.ext.erd;singleton:=true -Bundle-Version: 2.0.84 -Bundle-Release-Date: 20180430 +Bundle-Version: 2.0.85 +Bundle-Release-Date: 20180514 Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-Activator: org.jkiss.dbeaver.ext.erd.ERDActivator Bundle-ActivationPolicy: lazy diff --git a/plugins/org.jkiss.dbeaver.ext.erd/plugin.xml b/plugins/org.jkiss.dbeaver.ext.erd/plugin.xml index b5ee19bbd736b03e4a9a4fe68440f430fb31782e..b067f7195f7aaed7a90c0452e8030484bfaf8b09 100644 --- a/plugins/org.jkiss.dbeaver.ext.erd/plugin.xml +++ b/plugins/org.jkiss.dbeaver.ext.erd/plugin.xml @@ -64,6 +64,19 @@ + + + + + + + + + + + + + diff --git a/plugins/org.jkiss.dbeaver.ext.erd/pom.xml b/plugins/org.jkiss.dbeaver.ext.erd/pom.xml index c5e5276cf0edb907071efd9741ada36b9cd41f08..25b7cbae323e5ec1bed9149dd418fcfd86bf2bb5 100644 --- a/plugins/org.jkiss.dbeaver.ext.erd/pom.xml +++ b/plugins/org.jkiss.dbeaver.ext.erd/pom.xml @@ -9,6 +9,6 @@ ../../ org.jkiss.dbeaver.ext.erd - 2.0.84 + 2.0.85 eclipse-plugin diff --git a/plugins/org.jkiss.dbeaver.ext.erd/src/org/jkiss/dbeaver/ext/erd/action/ERDHandlerCopy.java b/plugins/org.jkiss.dbeaver.ext.erd/src/org/jkiss/dbeaver/ext/erd/action/ERDHandlerCopy.java new file mode 100644 index 0000000000000000000000000000000000000000..71cfc6e4b0c3cf4384b1df137667712df3c37213 --- /dev/null +++ b/plugins/org.jkiss.dbeaver.ext.erd/src/org/jkiss/dbeaver/ext/erd/action/ERDHandlerCopy.java @@ -0,0 +1,57 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2017 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.erd.action; + +import org.eclipse.core.commands.AbstractHandler; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.core.commands.ExecutionException; +import org.eclipse.draw2d.geometry.Point; +import org.eclipse.swt.widgets.Control; +import org.eclipse.ui.ISources; +import org.eclipse.ui.handlers.HandlerUtil; +import org.jkiss.dbeaver.ext.erd.command.EntityAddCommand; +import org.jkiss.dbeaver.ext.erd.editor.ERDEditorAdapter; +import org.jkiss.dbeaver.ext.erd.editor.ERDEditorPart; +import org.jkiss.dbeaver.ext.erd.model.DiagramObjectCollector; +import org.jkiss.dbeaver.ext.erd.model.ERDEntity; +import org.jkiss.dbeaver.model.DBPNamedObject; +import org.jkiss.dbeaver.model.struct.DBSObjectContainer; +import org.jkiss.dbeaver.model.struct.rdb.DBSTable; +import org.jkiss.dbeaver.ui.actions.navigator.NavigatorHandlerCopyObject; +import org.jkiss.dbeaver.ui.dnd.DatabaseObjectTransfer; +import org.jkiss.utils.CommonUtils; + +import java.util.Collection; +import java.util.List; + +public class ERDHandlerCopy extends NavigatorHandlerCopyObject { + public ERDHandlerCopy() { + + } + + @Override + public boolean isEnabled() + { + return true; + } + + @Override + public Object execute(ExecutionEvent event) throws ExecutionException { + return super.execute(event); + } + +} diff --git a/plugins/org.jkiss.dbeaver.ext.erd/src/org/jkiss/dbeaver/ext/erd/editor/ERDEditorContextMenuProvider.java b/plugins/org.jkiss.dbeaver.ext.erd/src/org/jkiss/dbeaver/ext/erd/editor/ERDEditorContextMenuProvider.java index 062ea6dc6cffd6800faa77d573ac3f86c63835bb..7fe9a632ab4c498dbd2108d7ff70690e8470c61d 100644 --- a/plugins/org.jkiss.dbeaver.ext.erd/src/org/jkiss/dbeaver/ext/erd/editor/ERDEditorContextMenuProvider.java +++ b/plugins/org.jkiss.dbeaver.ext.erd/src/org/jkiss/dbeaver/ext/erd/editor/ERDEditorContextMenuProvider.java @@ -20,16 +20,15 @@ package org.jkiss.dbeaver.ext.erd.editor; import org.eclipse.gef.ContextMenuProvider; -import org.eclipse.gef.ui.actions.GEFActionConstants; import org.eclipse.jface.action.GroupMarker; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.ui.IWorkbenchActionConstants; +import org.eclipse.ui.IWorkbenchCommandConstants; import org.jkiss.dbeaver.core.CoreCommands; import org.jkiss.dbeaver.ext.erd.action.DiagramLayoutAction; -import org.jkiss.dbeaver.ui.IActionConstants; +import org.jkiss.dbeaver.ui.ActionUtils; /** * Provides a context menu for the schema diagram editor. A virtual cut and paste from the flow example @@ -56,21 +55,35 @@ public class ERDEditorContextMenuProvider extends ContextMenuProvider { @Override public void buildContextMenu(IMenuManager menu) { if (editor.isLoaded()) { - GEFActionConstants.addStandardActionGroups(menu); - ISelection selection = editor.getGraphicalViewer().getSelection(); if (!selection.isEmpty() && selection instanceof IStructuredSelection) { editor.fillPartContextMenu(menu, (IStructuredSelection) selection); } - menu.add(new GroupMarker(CoreCommands.GROUP_NAVIGATOR_ADDITIONS)); - menu.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS)); - menu.add(new GroupMarker(IActionConstants.MB_ADDITIONS_END)); - menu.add(new GroupMarker(CoreCommands.GROUP_TOOLS)); - menu.add(new Separator()); editor.fillAttributeVisibilityMenu(menu); menu.add(new DiagramLayoutAction(editor)); + + menu.add(new Separator()); + + menu.add(new Separator("org.eclipse.gef.group.undo")); + menu.add(new Separator("org.eclipse.gef.group.copy")); + menu.add(ActionUtils.makeCommandContribution(editor.getSite(), IWorkbenchCommandConstants.EDIT_COPY)); + + menu.add(new Separator("org.eclipse.gef.group.print")); + menu.add(new Separator("org.eclipse.gef.group.edit")); + menu.add(new Separator("org.eclipse.gef.group.view")); + menu.add(new Separator("org.eclipse.gef.group.find")); + menu.add(new Separator("org.eclipse.gef.group.rest")); + menu.add(new Separator("org.eclipse.gef.group.save")); + + menu.add(new Separator()); + + menu.add(new GroupMarker(CoreCommands.GROUP_TOOLS)); + menu.add(new GroupMarker(CoreCommands.GROUP_NAVIGATOR_ADDITIONS)); + //menu.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS)); + //menu.add(new GroupMarker(IActionConstants.MB_ADDITIONS_END)); + } } } \ No newline at end of file diff --git a/plugins/org.jkiss.dbeaver.ext.erd/src/org/jkiss/dbeaver/ext/erd/model/DiagramObjectCollector.java b/plugins/org.jkiss.dbeaver.ext.erd/src/org/jkiss/dbeaver/ext/erd/model/DiagramObjectCollector.java index a416c506cc1cffff1d6d43dfff8151d0bdaef4a3..7d60dda3602f5ab26864d0c9d5aa3113e9c42c8c 100644 --- a/plugins/org.jkiss.dbeaver.ext.erd/src/org/jkiss/dbeaver/ext/erd/model/DiagramObjectCollector.java +++ b/plugins/org.jkiss.dbeaver.ext.erd/src/org/jkiss/dbeaver/ext/erd/model/DiagramObjectCollector.java @@ -69,6 +69,9 @@ public class DiagramObjectCollector { if (monitor.isCanceled()) { break; } + if (root instanceof DBSAlias) { + root = ((DBSAlias) root).getTargetObject(monitor); + } if (root instanceof DBSFolder) { collectTables(monitor, ((DBSFolder) root).getChildrenObjects(monitor), tables); } else if (root instanceof DBSEntity) { diff --git a/plugins/org.jkiss.dbeaver.ext.exasol/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.ext.exasol/META-INF/MANIFEST.MF index da86ab97db2e51744285b395100505f6c5ef74bd..2f450a58073ac758f05be8e3eb547c155a6da070 100644 --- a/plugins/org.jkiss.dbeaver.ext.exasol/META-INF/MANIFEST.MF +++ b/plugins/org.jkiss.dbeaver.ext.exasol/META-INF/MANIFEST.MF @@ -3,8 +3,8 @@ Bundle-ManifestVersion: 2 Bundle-Vendor: %Bundle-Vendor Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.ext.exasol;singleton:=true -Bundle-Version: 1.0.40 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.41 +Bundle-Release-Date: 20180514 Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-Activator: org.jkiss.dbeaver.ext.exasol.Activator Bundle-ActivationPolicy: lazy diff --git a/plugins/org.jkiss.dbeaver.ext.exasol/pom.xml b/plugins/org.jkiss.dbeaver.ext.exasol/pom.xml index d35837409947a673faec29d7ee6b20c88a0ea3ec..84af51d15bc96250c509fa1c51e0afe678f9fb07 100644 --- a/plugins/org.jkiss.dbeaver.ext.exasol/pom.xml +++ b/plugins/org.jkiss.dbeaver.ext.exasol/pom.xml @@ -9,6 +9,6 @@ ../../ org.jkiss.dbeaver.ext.exasol - 1.0.40 + 1.0.41 eclipse-plugin diff --git a/plugins/org.jkiss.dbeaver.ext.firebird/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.ext.firebird/META-INF/MANIFEST.MF index cb26d8c9650b7e052186745ab43010d10c357baa..8f565509163a2062eb51d7eace64ddbbd9285891 100644 --- a/plugins/org.jkiss.dbeaver.ext.firebird/META-INF/MANIFEST.MF +++ b/plugins/org.jkiss.dbeaver.ext.firebird/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.ext.firebird;singleton:=true -Bundle-Version: 1.0.83 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.84 +Bundle-Release-Date: 20180514 Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime, org.eclipse.ui.views, diff --git a/plugins/org.jkiss.dbeaver.ext.firebird/OSGI-INF/l10n/bundle.properties b/plugins/org.jkiss.dbeaver.ext.firebird/OSGI-INF/l10n/bundle.properties index e83a9ac221032981daea14f3abee4ac7965761ff..fa0e24faedfd3da213bb013ee3750cce57e1a341 100644 --- a/plugins/org.jkiss.dbeaver.ext.firebird/OSGI-INF/l10n/bundle.properties +++ b/plugins/org.jkiss.dbeaver.ext.firebird/OSGI-INF/l10n/bundle.properties @@ -1,6 +1,8 @@ Bundle-Vendor = JKISS Bundle-Name = DBeaver FireBird Support +datasource.firebird.description=FireBird Jaybird JDBC driver + meta.org.jkiss.dbeaver.ext.firebird.model.FireBirdTrigger.triggerType.name=Type meta.org.jkiss.dbeaver.ext.firebird.model.FireBirdTrigger.sequence.name=Sequence meta.org.jkiss.dbeaver.ext.firebird.model.FireBirdDataType.fieldType.name=Type diff --git a/plugins/org.jkiss.dbeaver.ext.firebird/build.properties b/plugins/org.jkiss.dbeaver.ext.firebird/build.properties index 6bdfcce3733d6dc8a1c3436540e2b1e2bec397ac..3f14ab2d51e34b796724a0768bb2fb7e403003e8 100644 --- a/plugins/org.jkiss.dbeaver.ext.firebird/build.properties +++ b/plugins/org.jkiss.dbeaver.ext.firebird/build.properties @@ -1,6 +1,7 @@ source.. = src/ output.. = bin/ bin.includes = .,\ + icons/,\ META-INF/,\ OSGI-INF/,\ plugin.xml diff --git a/plugins/org.jkiss.dbeaver.ext.firebird/icons/firebird_icon.png b/plugins/org.jkiss.dbeaver.ext.firebird/icons/firebird_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2947955db22a32f127979a311718355c2c7071d4 Binary files /dev/null and b/plugins/org.jkiss.dbeaver.ext.firebird/icons/firebird_icon.png differ diff --git a/plugins/org.jkiss.dbeaver.ext.firebird/plugin.xml b/plugins/org.jkiss.dbeaver.ext.firebird/plugin.xml index 16ce7a47459f0d89b93aa1bf77f81621f2515b46..058420e35b63662801d298cbc42c5d36553dd779 100644 --- a/plugins/org.jkiss.dbeaver.ext.firebird/plugin.xml +++ b/plugins/org.jkiss.dbeaver.ext.firebird/plugin.xml @@ -7,4 +7,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/org.jkiss.dbeaver.ext.firebird/pom.xml b/plugins/org.jkiss.dbeaver.ext.firebird/pom.xml index e7f179e669ada3cf3e342a8a6f69b7a3a333becf..4e4b73b47504576e576a32892555f6b4d3e2e6e6 100644 --- a/plugins/org.jkiss.dbeaver.ext.firebird/pom.xml +++ b/plugins/org.jkiss.dbeaver.ext.firebird/pom.xml @@ -9,6 +9,6 @@ ../../ org.jkiss.dbeaver.ext.firebird - 1.0.83 + 1.0.84 eclipse-plugin diff --git a/plugins/org.jkiss.dbeaver.ext.firebird/src/org/jkiss/dbeaver/ext/firebird/FireBirdDataSourceProvider.java b/plugins/org.jkiss.dbeaver.ext.firebird/src/org/jkiss/dbeaver/ext/firebird/FireBirdDataSourceProvider.java new file mode 100644 index 0000000000000000000000000000000000000000..1cfc6a4bda09db730fe1a739d3df2e261fa9f00c --- /dev/null +++ b/plugins/org.jkiss.dbeaver.ext.firebird/src/org/jkiss/dbeaver/ext/firebird/FireBirdDataSourceProvider.java @@ -0,0 +1,33 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org) + * Copyright (C) 2010-2017 Eugene Fradkin (eugene.fradkin@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.firebird; + +import org.jkiss.dbeaver.ext.generic.GenericDataSourceProvider; + +public class FireBirdDataSourceProvider extends GenericDataSourceProvider { + + public FireBirdDataSourceProvider() + { + } + + @Override + public long getFeatures() { + return FEATURE_NONE; + } + +} diff --git a/plugins/org.jkiss.dbeaver.ext.firebird/src/org/jkiss/dbeaver/ext/firebird/model/FireBirdMetaModel.java b/plugins/org.jkiss.dbeaver.ext.firebird/src/org/jkiss/dbeaver/ext/firebird/model/FireBirdMetaModel.java index 4fb9c56507b54b450714e12e149d5f82ae0fb5f3..beecd22bb3b35edf80e79b761aa1579318ae259c 100644 --- a/plugins/org.jkiss.dbeaver.ext.firebird/src/org/jkiss/dbeaver/ext/firebird/model/FireBirdMetaModel.java +++ b/plugins/org.jkiss.dbeaver.ext.firebird/src/org/jkiss/dbeaver/ext/firebird/model/FireBirdMetaModel.java @@ -196,8 +196,8 @@ public class FireBirdMetaModel extends GenericMetaModel } @Override - public GenericTableColumn createTableColumnImpl(JDBCSession session, JDBCResultSet dbResult, GenericTable table, String columnName, String typeName, int valueType, int sourceType, int ordinalPos, long columnSize, long charLength, Integer scale, Integer precision, int radix, boolean notNull, String remarks, String defaultValue, boolean autoIncrement, boolean autoGenerated) throws DBException { - return new FireBirdTableColumn(session, table, + public GenericTableColumn createTableColumnImpl(DBRProgressMonitor monitor, GenericTable table, String columnName, String typeName, int valueType, int sourceType, int ordinalPos, long columnSize, long charLength, Integer scale, Integer precision, int radix, boolean notNull, String remarks, String defaultValue, boolean autoIncrement, boolean autoGenerated) throws DBException { + return new FireBirdTableColumn(monitor, table, columnName, typeName, valueType, sourceType, ordinalPos, columnSize, diff --git a/plugins/org.jkiss.dbeaver.ext.firebird/src/org/jkiss/dbeaver/ext/firebird/model/FireBirdTableColumn.java b/plugins/org.jkiss.dbeaver.ext.firebird/src/org/jkiss/dbeaver/ext/firebird/model/FireBirdTableColumn.java index 3e1d03c299dc3269ddeae90f5238eeefd1f66e38..f93017b8d9f9da06759cb051d8aa2b3519adf433 100644 --- a/plugins/org.jkiss.dbeaver.ext.firebird/src/org/jkiss/dbeaver/ext/firebird/model/FireBirdTableColumn.java +++ b/plugins/org.jkiss.dbeaver.ext.firebird/src/org/jkiss/dbeaver/ext/firebird/model/FireBirdTableColumn.java @@ -41,10 +41,10 @@ public class FireBirdTableColumn extends GenericTableColumn { super(table); } - public FireBirdTableColumn(JDBCSession session, GenericTable table, String columnName, String typeName, int valueType, int sourceType, int ordinalPosition, long columnSize, long charLength, Integer scale, Integer precision, int radix, boolean notNull, String remarks, String defaultValue, boolean autoIncrement, boolean autoGenerated) throws DBException { + public FireBirdTableColumn(DBRProgressMonitor monitor, GenericTable table, String columnName, String typeName, int valueType, int sourceType, int ordinalPosition, long columnSize, long charLength, Integer scale, Integer precision, int radix, boolean notNull, String remarks, String defaultValue, boolean autoIncrement, boolean autoGenerated) throws DBException { super(table, columnName, typeName, valueType, sourceType, ordinalPosition, columnSize, charLength, scale, precision, radix, notNull, remarks, defaultValue, autoIncrement, autoGenerated); if (typeName.equals("CHAR") || typeName.equals("VARCHAR")) { - getDomainTypeName(session.getProgressMonitor()); + getDomainTypeName(monitor); } if (domainTypeName != null) { dataType = (FireBirdDataType) table.getDataSource().getLocalDataType(domainTypeName); diff --git a/plugins/org.jkiss.dbeaver.ext.generic/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.ext.generic/META-INF/MANIFEST.MF index b83889ce77031f02836c78c057c078eae5b1694a..2e8fd1eb49b6a1e9ec2db38b65ea6052e8f7a2f9 100644 --- a/plugins/org.jkiss.dbeaver.ext.generic/META-INF/MANIFEST.MF +++ b/plugins/org.jkiss.dbeaver.ext.generic/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: DBeaver Generic Plug-in Bundle-SymbolicName: org.jkiss.dbeaver.ext.generic; singleton:=true -Bundle-Version: 2.3.68 -Bundle-Release-Date: 20180430 +Bundle-Version: 2.3.69 +Bundle-Release-Date: 20180514 Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime, org.jkiss.dbeaver.core, diff --git a/plugins/org.jkiss.dbeaver.ext.generic/plugin.xml b/plugins/org.jkiss.dbeaver.ext.generic/plugin.xml index d8584b001a32ff88b668ee45691ecd1d7d7098b7..c0b071f47acebcfed23d79fa175cd6096bf61663 100644 --- a/plugins/org.jkiss.dbeaver.ext.generic/plugin.xml +++ b/plugins/org.jkiss.dbeaver.ext.generic/plugin.xml @@ -577,7 +577,7 @@ + description="Firebird JayBird driver"> + + diff --git a/plugins/org.jkiss.dbeaver.ext.generic/pom.xml b/plugins/org.jkiss.dbeaver.ext.generic/pom.xml index cdcb2ec694a1de85311b6c2b351b7c3036c8d033..9d4a8e225015df994d638d4a5c17c90746621f55 100644 --- a/plugins/org.jkiss.dbeaver.ext.generic/pom.xml +++ b/plugins/org.jkiss.dbeaver.ext.generic/pom.xml @@ -9,6 +9,6 @@ ../../ org.jkiss.dbeaver.ext.generic - 2.3.68 + 2.3.69 eclipse-plugin diff --git a/plugins/org.jkiss.dbeaver.ext.generic/src/org/jkiss/dbeaver/ext/generic/edit/GenericTableColumnManager.java b/plugins/org.jkiss.dbeaver.ext.generic/src/org/jkiss/dbeaver/ext/generic/edit/GenericTableColumnManager.java index 5e3da911401de4093557e47c3cfad360dc208e53..7dfb252d53b4a290ddb0b5b4b2f9e0719a653ccd 100644 --- a/plugins/org.jkiss.dbeaver.ext.generic/src/org/jkiss/dbeaver/ext/generic/edit/GenericTableColumnManager.java +++ b/plugins/org.jkiss.dbeaver.ext.generic/src/org/jkiss/dbeaver/ext/generic/edit/GenericTableColumnManager.java @@ -18,6 +18,7 @@ package org.jkiss.dbeaver.ext.generic.edit; import org.jkiss.code.Nullable; +import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.ext.generic.GenericConstants; import org.jkiss.dbeaver.ext.generic.model.GenericTable; import org.jkiss.dbeaver.ext.generic.model.GenericTableColumn; @@ -30,6 +31,8 @@ import org.jkiss.dbeaver.model.impl.sql.edit.struct.SQLTableColumnManager; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.dbeaver.model.struct.DBSDataType; import org.jkiss.dbeaver.model.struct.DBSObject; +import org.jkiss.dbeaver.ui.UITask; +import org.jkiss.dbeaver.ui.editors.object.struct.AttributeEditPage; import org.jkiss.utils.CommonUtils; import java.sql.Types; @@ -48,17 +51,40 @@ public class GenericTableColumnManager extends SQLTableColumnManager() { + @Override + protected GenericTableColumn runTask() { + AttributeEditPage page = new AttributeEditPage(null, column); + if (!page.edit()) { + return null; + } + return column; + } + }.execute(); } @Override diff --git a/plugins/org.jkiss.dbeaver.ext.generic/src/org/jkiss/dbeaver/ext/generic/edit/GenericTableManager.java b/plugins/org.jkiss.dbeaver.ext.generic/src/org/jkiss/dbeaver/ext/generic/edit/GenericTableManager.java index 623307a2fc3a3713843798c473c82fc3aa6c74dd..0f81f55dc1c71b035341f3c136abaf53a8ad7fc9 100644 --- a/plugins/org.jkiss.dbeaver.ext.generic/src/org/jkiss/dbeaver/ext/generic/edit/GenericTableManager.java +++ b/plugins/org.jkiss.dbeaver.ext.generic/src/org/jkiss/dbeaver/ext/generic/edit/GenericTableManager.java @@ -67,7 +67,7 @@ public class GenericTableManager extends SQLTableManager implements return remarks; } + public void setDescription(String remarks) { + this.remarks = remarks; + } + @Override public String toString() { diff --git a/plugins/org.jkiss.dbeaver.ext.generic/src/org/jkiss/dbeaver/ext/generic/model/TableCache.java b/plugins/org.jkiss.dbeaver.ext.generic/src/org/jkiss/dbeaver/ext/generic/model/TableCache.java index f77a854636c329424ec7a9cd551b853f9678d2d2..9617365562ddbc0c10d2eac8124566374d2cf5f7 100644 --- a/plugins/org.jkiss.dbeaver.ext.generic/src/org/jkiss/dbeaver/ext/generic/model/TableCache.java +++ b/plugins/org.jkiss.dbeaver.ext.generic/src/org/jkiss/dbeaver/ext/generic/model/TableCache.java @@ -186,8 +186,7 @@ public class TableCache extends JDBCStructLookupCache../../ org.jkiss.dbeaver.ext.h2 - 1.0.37 + 1.0.38 eclipse-plugin diff --git a/plugins/org.jkiss.dbeaver.ext.hana/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.ext.hana/META-INF/MANIFEST.MF index 913477d94855fb8ded890132fccdf845fa6ec21f..939c24e16f5430dac9220b4bb81cd3f33d0bdf15 100644 --- a/plugins/org.jkiss.dbeaver.ext.hana/META-INF/MANIFEST.MF +++ b/plugins/org.jkiss.dbeaver.ext.hana/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.ext.hana;singleton:=true -Bundle-Version: 1.0.11 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.12 +Bundle-Release-Date: 20180514 Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime, org.eclipse.ui.views, diff --git a/plugins/org.jkiss.dbeaver.ext.hana/pom.xml b/plugins/org.jkiss.dbeaver.ext.hana/pom.xml index f2d2b405a9abdfb28b4da95f37741597213ce6c7..51c846831c359e376b5c5250913be5671c64087c 100644 --- a/plugins/org.jkiss.dbeaver.ext.hana/pom.xml +++ b/plugins/org.jkiss.dbeaver.ext.hana/pom.xml @@ -9,6 +9,6 @@ ../../ org.jkiss.dbeaver.ext.hana - 1.0.11 + 1.0.12 eclipse-plugin diff --git a/plugins/org.jkiss.dbeaver.ext.hsqldb/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.ext.hsqldb/META-INF/MANIFEST.MF index f10c3e8e101764d5a4ce31d91d808e59484b5808..aef24d602ad17b6a94e26ba5f1dbe94a0b3d31d5 100644 --- a/plugins/org.jkiss.dbeaver.ext.hsqldb/META-INF/MANIFEST.MF +++ b/plugins/org.jkiss.dbeaver.ext.hsqldb/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.ext.hsqldb;singleton:=true -Bundle-Version: 1.0.29 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.30 +Bundle-Release-Date: 20180514 Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime, org.eclipse.ui.views, diff --git a/plugins/org.jkiss.dbeaver.ext.hsqldb/pom.xml b/plugins/org.jkiss.dbeaver.ext.hsqldb/pom.xml index e13225404f9c5a81f97bb61734cc30d5ef9a0ac7..cb1f72aa2326d48357e1840233cebaa39ec7b7d0 100644 --- a/plugins/org.jkiss.dbeaver.ext.hsqldb/pom.xml +++ b/plugins/org.jkiss.dbeaver.ext.hsqldb/pom.xml @@ -9,6 +9,6 @@ ../../ org.jkiss.dbeaver.ext.hsqldb - 1.0.29 + 1.0.30 eclipse-plugin diff --git a/plugins/org.jkiss.dbeaver.ext.import_config/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.ext.import_config/META-INF/MANIFEST.MF index 34a55e11057ae76a6e7af224de3dce33d095ae43..cced55e080c330e77ed3706a208522c020bafd63 100644 --- a/plugins/org.jkiss.dbeaver.ext.import_config/META-INF/MANIFEST.MF +++ b/plugins/org.jkiss.dbeaver.ext.import_config/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.ext.import_config;singleton:=true -Bundle-Version: 2.1.45 -Bundle-Release-Date: 20180430 +Bundle-Version: 2.1.46 +Bundle-Release-Date: 20180514 Bundle-Activator: org.jkiss.dbeaver.ext.import_config.Activator Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime, diff --git a/plugins/org.jkiss.dbeaver.ext.import_config/pom.xml b/plugins/org.jkiss.dbeaver.ext.import_config/pom.xml index 470425a4d970dfe3842add3d67638f5f63895a2c..8bd79a96221a1c7a70e647f639cd22d05fffac97 100644 --- a/plugins/org.jkiss.dbeaver.ext.import_config/pom.xml +++ b/plugins/org.jkiss.dbeaver.ext.import_config/pom.xml @@ -9,6 +9,6 @@ ../../ org.jkiss.dbeaver.ext.import_config - 2.1.45 + 2.1.46 eclipse-plugin diff --git a/plugins/org.jkiss.dbeaver.ext.informix/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.ext.informix/META-INF/MANIFEST.MF index 96a9e27b00fd466641bf5d61ad7f9c482788329d..f4e98cb94a6195f73254a546f2bff7167248c4ae 100644 --- a/plugins/org.jkiss.dbeaver.ext.informix/META-INF/MANIFEST.MF +++ b/plugins/org.jkiss.dbeaver.ext.informix/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Informix Plug-in Bundle-SymbolicName: org.jkiss.dbeaver.ext.informix;singleton:=true -Bundle-Version: 1.0.73 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.74 +Bundle-Release-Date: 20180514 Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime, org.eclipse.ui.views, diff --git a/plugins/org.jkiss.dbeaver.ext.informix/pom.xml b/plugins/org.jkiss.dbeaver.ext.informix/pom.xml index ba7fe9e268908fefb738d26dcbc1abaafdc18edb..81b23a55d160c799c722fd61e1e069dc417dfe9b 100644 --- a/plugins/org.jkiss.dbeaver.ext.informix/pom.xml +++ b/plugins/org.jkiss.dbeaver.ext.informix/pom.xml @@ -9,6 +9,6 @@ ../../ org.jkiss.dbeaver.ext.informix - 1.0.73 + 1.0.74 eclipse-plugin diff --git a/plugins/org.jkiss.dbeaver.ext.mockdata/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.ext.mockdata/META-INF/MANIFEST.MF index 10a4864e4aad607682d55410689a84635bcea474..7a07edb79d3467d44ee1d28f46cdebf3a3fea5d2 100644 --- a/plugins/org.jkiss.dbeaver.ext.mockdata/META-INF/MANIFEST.MF +++ b/plugins/org.jkiss.dbeaver.ext.mockdata/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.ext.mockdata;singleton:=true -Bundle-Version: 1.0.8 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.9 +Bundle-Release-Date: 20180514 Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime, org.eclipse.ui.views, diff --git a/plugins/org.jkiss.dbeaver.ext.mockdata/plugin.xml b/plugins/org.jkiss.dbeaver.ext.mockdata/plugin.xml index f9cc27b7438d7fcf390d1b8096955ee831e54d74..59c77a3772f55b322b57bf915f7390cd2c8790ab 100644 --- a/plugins/org.jkiss.dbeaver.ext.mockdata/plugin.xml +++ b/plugins/org.jkiss.dbeaver.ext.mockdata/plugin.xml @@ -216,7 +216,7 @@ label="UUID" description="UUID random values" class="org.jkiss.dbeaver.ext.mockdata.generator.StringUuidGenerator" - tags="uuid"> + tags="id,uuid"> diff --git a/plugins/org.jkiss.dbeaver.ext.mockdata/pom.xml b/plugins/org.jkiss.dbeaver.ext.mockdata/pom.xml index 8914f00fe36360bc99c6374fb94adabafd106c4e..0be81b1115f6c8c56faba3e960afddb16dc02d6c 100644 --- a/plugins/org.jkiss.dbeaver.ext.mockdata/pom.xml +++ b/plugins/org.jkiss.dbeaver.ext.mockdata/pom.xml @@ -9,6 +9,6 @@ ../../ org.jkiss.dbeaver.ext.mockdata - 1.0.8 + 1.0.9 eclipse-plugin diff --git a/plugins/org.jkiss.dbeaver.ext.mockdata/src/org/jkiss/dbeaver/ext/mockdata/MockDataExecuteWizard.java b/plugins/org.jkiss.dbeaver.ext.mockdata/src/org/jkiss/dbeaver/ext/mockdata/MockDataExecuteWizard.java index 2f33cba1d7d57889a7b7406200f0314ae7a1668c..45788b99398b84e4f4db4801c92a336c02f659c1 100644 --- a/plugins/org.jkiss.dbeaver.ext.mockdata/src/org/jkiss/dbeaver/ext/mockdata/MockDataExecuteWizard.java +++ b/plugins/org.jkiss.dbeaver.ext.mockdata/src/org/jkiss/dbeaver/ext/mockdata/MockDataExecuteWizard.java @@ -34,10 +34,7 @@ import org.jkiss.dbeaver.model.exec.*; import org.jkiss.dbeaver.model.impl.AbstractExecutionSource; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.dbeaver.model.sql.SQLUtils; -import org.jkiss.dbeaver.model.struct.DBSAttributeBase; -import org.jkiss.dbeaver.model.struct.DBSDataManipulator; -import org.jkiss.dbeaver.model.struct.DBSEntity; -import org.jkiss.dbeaver.model.struct.DBSEntityAttribute; +import org.jkiss.dbeaver.model.struct.*; import org.jkiss.dbeaver.ui.UIUtils; import org.jkiss.dbeaver.ui.dialogs.tools.AbstractToolWizard; import org.jkiss.utils.CommonUtils; @@ -239,6 +236,21 @@ public class MockDataExecuteWizard extends AbstractToolWizard miltiUniqColumns = new HashSet<>(); + for (DBSAttributeBase attribute : attributes) { + if (DBUtils.checkUnique(monitor, dbsEntity, attribute) == DBUtils.UNIQ_TYPE.MULTI) { + hasMiltiUniqs = true; + + // collect the columns from multi-uniqs + DBSEntityReferrer constraint = (DBSEntityReferrer) DBUtils.getConstraint(monitor, dbsEntity, attribute); + for (DBSEntityAttributeRef attributeRef : constraint.getAttributeReferences(monitor)) { + miltiUniqColumns.add(attributeRef.getAttribute().getName()); + } + } + } + List> valuesCacheForUniqs = new ArrayList<>(); + // generate and insert the data session.enableLogging(false); DBSDataManipulator.ExecuteBatch batch = null; @@ -275,6 +287,31 @@ public class MockDataExecuteWizard extends AbstractToolWizard valueList : valuesCacheForUniqs) { + boolean theSame = true; + for (int j = 0; j < valueList.size(); j++) { + if (miltiUniqColumns.contains(valueList.get(j).getAttribute().getName())) { + if (!CommonUtils.equalObjects(valueList.get(j), attributeValues.get(j))) { + theSame = false; + break; + } + } + } + if (theSame) { + collision = true; + break; + } + } + if (collision) { + continue; + } else { + valuesCacheForUniqs.add(attributeValues); + } + } + if (batch == null) { batch = dataManipulator.insertData( session, diff --git a/plugins/org.jkiss.dbeaver.ext.mockdata/src/org/jkiss/dbeaver/ext/mockdata/MockDataWizardPageSettings.java b/plugins/org.jkiss.dbeaver.ext.mockdata/src/org/jkiss/dbeaver/ext/mockdata/MockDataWizardPageSettings.java index 3cc233a188c324903c3a832d5ef36ee359ad7cd8..d26270705710f4c263ca6d5e9acaa8536e3f4eb3 100644 --- a/plugins/org.jkiss.dbeaver.ext.mockdata/src/org/jkiss/dbeaver/ext/mockdata/MockDataWizardPageSettings.java +++ b/plugins/org.jkiss.dbeaver.ext.mockdata/src/org/jkiss/dbeaver/ext/mockdata/MockDataWizardPageSettings.java @@ -186,7 +186,7 @@ public class MockDataWizardPageSettings extends ActiveWizardPage(); Collection valuePairs = readColumnValues(monitor, dbsEntity.getDataSource(), (DBSAttributeEnumerable) attribute, UNIQUE_VALUES_SET_SIZE); diff --git a/plugins/org.jkiss.dbeaver.ext.mockdata/src/org/jkiss/dbeaver/ext/mockdata/generator/FKGenerator.java b/plugins/org.jkiss.dbeaver.ext.mockdata/src/org/jkiss/dbeaver/ext/mockdata/generator/FKGenerator.java index 4da65f447b717dcb4b40556b6aa93010482f67fa..e63cd5dd0b2dcdfef55bbdfc982d63802b154094 100644 --- a/plugins/org.jkiss.dbeaver.ext.mockdata/src/org/jkiss/dbeaver/ext/mockdata/generator/FKGenerator.java +++ b/plugins/org.jkiss.dbeaver.ext.mockdata/src/org/jkiss/dbeaver/ext/mockdata/generator/FKGenerator.java @@ -72,7 +72,7 @@ public class FKGenerator extends AbstractMockValueGenerator throw new DBException("Can't find reference column for '" + attribute.getName() + "'"); } - int numberRefRecords = DBUtils.checkUnique(monitor, dbsEntity, attribute) ? UNIQ_REF_RECORDS_LIMIT : REF_RECORDS_LIMIT; + int numberRefRecords = (DBUtils.checkUnique(monitor, dbsEntity, attribute) == DBUtils.UNIQ_TYPE.SINGLE) ? UNIQ_REF_RECORDS_LIMIT : REF_RECORDS_LIMIT; Collection values = readColumnValues(monitor, fk.getDataSource(), (DBSAttributeEnumerable) column.getReferencedColumn(), numberRefRecords); for (DBDLabelValuePair value : values) { refValues.add(value.getValue()); diff --git a/plugins/org.jkiss.dbeaver.ext.mssql/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.ext.mssql/META-INF/MANIFEST.MF index 4852c1fdca17d78155ba161f7cbca191e1436773..8a35ca616248da5c57a3c9d68127f368341c95a1 100644 --- a/plugins/org.jkiss.dbeaver.ext.mssql/META-INF/MANIFEST.MF +++ b/plugins/org.jkiss.dbeaver.ext.mssql/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.ext.mssql;singleton:=true -Bundle-Version: 1.0.76 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.77 +Bundle-Release-Date: 20180514 Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime, org.eclipse.ui.views, diff --git a/plugins/org.jkiss.dbeaver.ext.mssql/pom.xml b/plugins/org.jkiss.dbeaver.ext.mssql/pom.xml index 1bec63661b90a33cc2872d9a0b39add953464696..1b391809910a2b29823e839db092c2e9b5b16f5d 100644 --- a/plugins/org.jkiss.dbeaver.ext.mssql/pom.xml +++ b/plugins/org.jkiss.dbeaver.ext.mssql/pom.xml @@ -9,6 +9,6 @@ ../../ org.jkiss.dbeaver.ext.mssql - 1.0.76 + 1.0.77 eclipse-plugin diff --git a/plugins/org.jkiss.dbeaver.ext.mysql/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.ext.mysql/META-INF/MANIFEST.MF index 73e24210d9350ccf288e9fbb231098487b5c4f6c..ec3e4e7f83ed70fe0df6a30f9d056ea17225b30d 100644 --- a/plugins/org.jkiss.dbeaver.ext.mysql/META-INF/MANIFEST.MF +++ b/plugins/org.jkiss.dbeaver.ext.mysql/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: DBeaver MySQL Support Bundle-SymbolicName: org.jkiss.dbeaver.ext.mysql;singleton:=true -Bundle-Version: 2.1.67 -Bundle-Release-Date: 20180430 +Bundle-Version: 2.1.68 +Bundle-Release-Date: 20180514 Bundle-Activator: org.jkiss.dbeaver.ext.mysql.Activator Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime, diff --git a/plugins/org.jkiss.dbeaver.ext.mysql/OSGI-INF/l10n/bundle.properties b/plugins/org.jkiss.dbeaver.ext.mysql/OSGI-INF/l10n/bundle.properties index fc621259907aa7ef3f2a80a43c38d0aff3916ca0..b6a35361e9e7f0ad376c39bb894fa819ce1ae40f 100644 --- a/plugins/org.jkiss.dbeaver.ext.mysql/OSGI-INF/l10n/bundle.properties +++ b/plugins/org.jkiss.dbeaver.ext.mysql/OSGI-INF/l10n/bundle.properties @@ -48,6 +48,9 @@ tree.charset.node.name=Charset tree.collation.node.name=Collation tree.events.node.name=Events tree.event.node.name=Event +tree.packages.node.name=Packages +tree.packages.node.description=MariaDB Packages (Oracle mode) +tree.package.node.name=Package manager.catalog.name=Catalog manager @@ -55,6 +58,9 @@ editor.general.name=General editor.schema_privileges.name=Schema Privileges editor.session_manager.name=Session Manager editor.source.name=Source +editor.package.body.name=Body source +editor.package.body.description=Package body source + meta.org.jkiss.dbeaver.ext.mysql.model.MySQLCatalog.name.name=Schema Name meta.org.jkiss.dbeaver.ext.mysql.model.MySQLCatalog.defaultCharset.name=Default Charset meta.org.jkiss.dbeaver.ext.mysql.model.MySQLCatalog.defaultCollation.name=Default Collation @@ -104,7 +110,8 @@ meta.org.jkiss.dbeaver.ext.mysql.model.MySQLProcedure.body.name=Body meta.org.jkiss.dbeaver.ext.mysql.model.MySQLProcedure.clientBody.name=ClientBody meta.org.jkiss.dbeaver.ext.mysql.model.MySQLProcedure.deterministic.name=Deterministic meta.org.jkiss.dbeaver.ext.mysql.model.MySQLProcedure.deterministic.description=A routine is considered 'deterministic' if it always produces the same result for the same input parameters, and 'not deterministic' otherwise. -meta.org.jkiss.dbeaver.ext.mysql.model.MySQLProcedure.definition.name=Definition +meta.org.jkiss.dbeaver.ext.mysql.model.MySQLProcedure.declaration.name=Declaration +meta.org.jkiss.dbeaver.ext.mysql.model.MySQLProcedure.objectDefinitionText.name=Definition meta.org.jkiss.dbeaver.ext.mysql.model.MySQLProcedureParameter.parameterKind.name=Column Type meta.org.jkiss.dbeaver.ext.mysql.model.MySQLTable$AdditionalInfo.engine.name=Engine meta.org.jkiss.dbeaver.ext.mysql.model.MySQLTable$AdditionalInfo.autoIncrement.name=Auto Increment @@ -193,6 +200,10 @@ meta.org.jkiss.dbeaver.ext.mysql.model.session.MySQLSession.state.name=State meta.org.jkiss.dbeaver.ext.mysql.model.session.MySQLSession.state.description=State meta.org.jkiss.dbeaver.ext.mysql.model.session.MySQLSession.activeQuery.name=Active Query meta.org.jkiss.dbeaver.ext.mysql.model.session.MySQLSession.activeQuery.description=Currently executing SQL query +meta.org.jkiss.dbeaver.ext.mysql.model.MySQLPackage.name.name=Name +meta.org.jkiss.dbeaver.ext.mysql.model.MySQLPackage.description.name=Name +meta.org.jkiss.dbeaver.ext.mysql.model.MySQLPackage.objectDefinitionText.name=Package Declaration +meta.org.jkiss.dbeaver.ext.mysql.model.MySQLPackage.extendedDefinitionText.name=Package Body meta.org.jkiss.dbeaver.ext.mysql.model.MySQLEvent.name.name=Event Name meta.org.jkiss.dbeaver.ext.mysql.model.MySQLEvent.definer.name=Definer diff --git a/plugins/org.jkiss.dbeaver.ext.mysql/plugin.xml b/plugins/org.jkiss.dbeaver.ext.mysql/plugin.xml index 311d6eb1ac1a7ac064564377cfe0f3bb3bc27fb5..1a1693c78b65858f6c2aac4f80e4bedabccade64 100644 --- a/plugins/org.jkiss.dbeaver.ext.mysql/plugin.xml +++ b/plugins/org.jkiss.dbeaver.ext.mysql/plugin.xml @@ -92,6 +92,10 @@ + + + + @@ -223,6 +227,12 @@ + + + + ../../ org.jkiss.dbeaver.ext.mysql - 2.1.67 + 2.1.68 eclipse-plugin diff --git a/plugins/org.jkiss.dbeaver.ext.mysql/src/org/jkiss/dbeaver/ext/mysql/editors/MySQLPackageBodyEditor.java b/plugins/org.jkiss.dbeaver.ext.mysql/src/org/jkiss/dbeaver/ext/mysql/editors/MySQLPackageBodyEditor.java new file mode 100644 index 0000000000000000000000000000000000000000..7191b37efde1644a28b44262437012896a2af188 --- /dev/null +++ b/plugins/org.jkiss.dbeaver.ext.mysql/src/org/jkiss/dbeaver/ext/mysql/editors/MySQLPackageBodyEditor.java @@ -0,0 +1,54 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2018 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.mysql.editors; + +import org.jkiss.dbeaver.DBException; +import org.jkiss.dbeaver.ext.mysql.model.MySQLSourceObject; +import org.jkiss.dbeaver.model.DBPScriptObjectExt; +import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; +import org.jkiss.dbeaver.ui.editors.sql.SQLSourceViewer; + +/** + * MySQLPackageBodyEditor + */ +public class MySQLPackageBodyEditor extends SQLSourceViewer { + + public MySQLPackageBodyEditor() + { + } + + @Override + protected boolean isReadOnly() + { + return false; + } + + @Override + protected String getSourceText(DBRProgressMonitor monitor) throws DBException { + return ((DBPScriptObjectExt)getSourceObject()).getExtendedDefinitionText(monitor); + } + + @Override + protected void setSourceText(DBRProgressMonitor monitor, String sourceText) { + getEditorInput().getPropertySource().setPropertyValue( + monitor, + "extendedDefinitionText", + sourceText); + } + +} \ No newline at end of file diff --git a/plugins/org.jkiss.dbeaver.ext.mysql/src/org/jkiss/dbeaver/ext/mysql/model/MySQLCatalog.java b/plugins/org.jkiss.dbeaver.ext.mysql/src/org/jkiss/dbeaver/ext/mysql/model/MySQLCatalog.java index 5574b393dea01aa5d08b96569c4a23c250a414f8..ae08d281772cb5b6b53b8229f4e9af6005e523ca 100644 --- a/plugins/org.jkiss.dbeaver.ext.mysql/src/org/jkiss/dbeaver/ext/mysql/model/MySQLCatalog.java +++ b/plugins/org.jkiss.dbeaver.ext.mysql/src/org/jkiss/dbeaver/ext/mysql/model/MySQLCatalog.java @@ -61,6 +61,7 @@ public class MySQLCatalog implements DBSCatalog, DBPSaveableObject, DBPRefreshab final TableCache tableCache = new TableCache(); final ProceduresCache proceduresCache = new ProceduresCache(); + final PackageCache packageCache = new PackageCache(); final TriggerCache triggerCache = new TriggerCache(); final ConstraintCache constraintCache = new ConstraintCache(tableCache); final IndexCache indexCache = new IndexCache(tableCache); @@ -184,7 +185,7 @@ public class MySQLCatalog implements DBSCatalog, DBPSaveableObject, DBPRefreshab if (dbResult.next()) { databaseSize = dbResult.getLong(1); } else { - databaseSize = 0l; + databaseSize = 0L; } } } @@ -264,6 +265,13 @@ public class MySQLCatalog implements DBSCatalog, DBPSaveableObject, DBPRefreshab return proceduresCache.getObject(monitor, this, procName); } + @Association + public Collection getPackages(DBRProgressMonitor monitor) + throws DBException + { + return packageCache.getAllObjects(monitor, this); + } + @Association public Collection getTriggers(DBRProgressMonitor monitor) throws DBException @@ -674,6 +682,7 @@ public class MySQLCatalog implements DBSCatalog, DBPSaveableObject, DBPRefreshab "SELECT * FROM " + MySQLConstants.META_TABLE_ROUTINES + "\nWHERE " + MySQLConstants.COL_ROUTINE_SCHEMA + "=?" + (object == null && objectName == null ? "" : " AND " + MySQLConstants.COL_ROUTINE_NAME + "=?") + + "\nAND ROUTINE_TYPE IN ('PROCEDURE','FUNCTION')" + "\nORDER BY " + MySQLConstants.COL_ROUTINE_NAME ); dbStat.setString(1, owner.getName()); @@ -684,6 +693,30 @@ public class MySQLCatalog implements DBSCatalog, DBPSaveableObject, DBPRefreshab } } + static class PackageCache extends JDBCObjectLookupCache { + + @Override + protected MySQLPackage fetchObject(@NotNull JDBCSession session, @NotNull MySQLCatalog owner, @NotNull JDBCResultSet dbResult) + throws SQLException, DBException + { + return new MySQLPackage(owner, dbResult); + } + + @Override + public JDBCStatement prepareLookupStatement(JDBCSession session, MySQLCatalog owner, MySQLPackage object, String objectName) throws SQLException { + JDBCPreparedStatement dbStat = session.prepareStatement( + "SELECT name,comment FROM mysql.proc\n" + + "WHERE db = ? AND type = 'PACKAGE'" + + (object == null && objectName == null ? "" : " \nAND name = ?") + ); + dbStat.setString(1, owner.getName()); + if (object != null || objectName != null) { + dbStat.setString(2, object != null ? object.getName() : objectName); + } + return dbStat; + } + } + static class TriggerCache extends JDBCObjectLookupCache { @Override diff --git a/plugins/org.jkiss.dbeaver.ext.mysql/src/org/jkiss/dbeaver/ext/mysql/model/MySQLPackage.java b/plugins/org.jkiss.dbeaver.ext.mysql/src/org/jkiss/dbeaver/ext/mysql/model/MySQLPackage.java new file mode 100644 index 0000000000000000000000000000000000000000..477cee0210920b6a91d4fcdf5e3a5c622c2bd21a --- /dev/null +++ b/plugins/org.jkiss.dbeaver.ext.mysql/src/org/jkiss/dbeaver/ext/mysql/model/MySQLPackage.java @@ -0,0 +1,225 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2018 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.mysql.model; + +import org.jkiss.code.NotNull; +import org.jkiss.dbeaver.DBException; +import org.jkiss.dbeaver.model.*; +import org.jkiss.dbeaver.model.exec.DBCException; +import org.jkiss.dbeaver.model.exec.jdbc.JDBCPreparedStatement; +import org.jkiss.dbeaver.model.exec.jdbc.JDBCResultSet; +import org.jkiss.dbeaver.model.exec.jdbc.JDBCSession; +import org.jkiss.dbeaver.model.exec.jdbc.JDBCStatement; +import org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils; +import org.jkiss.dbeaver.model.impl.jdbc.cache.JDBCObjectCache; +import org.jkiss.dbeaver.model.meta.Association; +import org.jkiss.dbeaver.model.meta.Property; +import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; +import org.jkiss.dbeaver.model.struct.DBSObject; +import org.jkiss.dbeaver.model.struct.DBSObjectContainer; +import org.jkiss.dbeaver.model.struct.rdb.DBSProcedureContainer; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Collection; +import java.util.Map; + +/** + * GenericProcedure + */ +public class MySQLPackage + implements DBPScriptObject, DBPScriptObjectExt, DBSObjectContainer, DBPRefreshableObject, DBSProcedureContainer, DBPQualifiedObject +{ + private MySQLCatalog catalog; + private String name; + private String description; + private boolean persisted; + private final ProceduresCache proceduresCache = new ProceduresCache(); + private String sourceDeclaration; + private String sourceDefinition; + + public MySQLPackage( + MySQLCatalog catalog, + ResultSet dbResult) + { + this.catalog = catalog; + this.name = JDBCUtils.safeGetString(dbResult, "name"); + this.description = JDBCUtils.safeGetString(dbResult, "comment"); + this.persisted = true; + } + + public MySQLPackage(MySQLCatalog catalog, String name) + { + this.catalog = catalog; + this.name = name; + this.persisted = false; + } + + @Override + public DBPDataSource getDataSource() { + return catalog.getDataSource(); + } + + @Override + public DBSObject getParentObject() { + return catalog; + } + + @Override + public boolean isPersisted() { + return persisted; + } + + @Property(viewable = true, order = 1) + @Override + public String getName() { + return name; + } + + @Override + public String getFullyQualifiedName(DBPEvaluationContext context) { + return DBUtils.getFullQualifiedName(getDataSource(), + getCatalog(), + this); + } + + @Property(viewable = true, order = 100) + @Override + public String getDescription() { + return description; + } + + public MySQLCatalog getCatalog() { + return catalog; + } + + @Override + @Property(hidden = true, editable = true, updatable = true, order = -1) + public String getObjectDefinitionText(DBRProgressMonitor monitor, Map options) throws DBCException + { + if (sourceDeclaration == null && monitor != null) { + sourceDeclaration = readSource(monitor, false); + } + return sourceDeclaration; + } + + public void setObjectDefinitionText(String sourceDeclaration) + { + this.sourceDeclaration = sourceDeclaration; + } + + @Override + @Property(hidden = true, editable = true, updatable = true, order = -1) + public String getExtendedDefinitionText(DBRProgressMonitor monitor) throws DBException + { + if (sourceDefinition == null && monitor != null) { + sourceDefinition = readSource(monitor, true); + } + return sourceDefinition; + } + + public void setExtendedDefinitionText(String source) + { + this.sourceDefinition = source; + } + + @Association + public Collection getProcedures(DBRProgressMonitor monitor) throws DBException + { + return proceduresCache.getAllObjects(monitor, this); + } + + @Override + public MySQLProcedure getProcedure(DBRProgressMonitor monitor, String uniqueName) throws DBException { + return proceduresCache.getObject(monitor, this, uniqueName); + } + + @Override + public Collection getChildren(@NotNull DBRProgressMonitor monitor) throws DBException + { + return proceduresCache.getAllObjects(monitor, this); + } + + @Override + public DBSObject getChild(@NotNull DBRProgressMonitor monitor, @NotNull String childName) throws DBException + { + return proceduresCache.getObject(monitor, this, childName); + } + + @Override + public Class getChildType(@NotNull DBRProgressMonitor monitor) throws DBException + { + return MySQLProcedure.class; + } + + @Override + public void cacheStructure(@NotNull DBRProgressMonitor monitor, int scope) throws DBException + { + proceduresCache.getAllObjects(monitor, this); + } + + @Override + public DBSObject refreshObject(@NotNull DBRProgressMonitor monitor) throws DBException + { + this.proceduresCache.clearCache(); + this.sourceDeclaration = null; + this.sourceDefinition = null; + return this; + } + + private String readSource(DBRProgressMonitor monitor, boolean isBody) throws DBCException { + try (JDBCSession session = DBUtils.openMetaSession(monitor, getDataSource(), "Read package declaration")) { + try (JDBCPreparedStatement dbStat = session.prepareStatement("SHOW CREATE PACKAGE" + (isBody ? " BODY" : "") + " " + getFullyQualifiedName(DBPEvaluationContext.DML))) { + try (JDBCResultSet dbResult = dbStat.executeQuery()) { + if (dbResult.next()) { + return JDBCUtils.safeGetString(dbResult, (isBody ? "Create Package Body" : "Create Package")); + } else { + throw new DBCException("Package '" + getName() + "' not found"); + } + } + } + } catch (SQLException e) { + throw new DBCException(e, getDataSource()); + } + } + + static class ProceduresCache extends JDBCObjectCache { + + @Override + protected JDBCStatement prepareObjectsStatement(@NotNull JDBCSession session, @NotNull MySQLPackage owner) + throws SQLException + { + JDBCPreparedStatement dbStat = session.prepareStatement( + "SELECT P.*,CASE WHEN A.DATA_TYPE IS NULL THEN 'PROCEDURE' ELSE 'FUNCTION' END as PROCEDURE_TYPE FROM ALL_PROCEDURES P\n" + + "LEFT OUTER JOIN ALL_ARGUMENTS A ON A.OWNER=P.OWNER AND A.PACKAGE_NAME=P.OBJECT_NAME AND A.OBJECT_NAME=P.PROCEDURE_NAME AND A.ARGUMENT_NAME IS NULL AND A.DATA_LEVEL=0\n" + + "WHERE P.OWNER=? AND P.OBJECT_NAME=?\n" + + "ORDER BY P.PROCEDURE_NAME"); + dbStat.setString(1, owner.getCatalog().getName()); + dbStat.setString(2, owner.getName()); + return dbStat; + } + + @Override + protected MySQLProcedure fetchObject(@NotNull JDBCSession session, @NotNull MySQLPackage owner, @NotNull JDBCResultSet dbResult) + throws SQLException, DBException + { + return new MySQLProcedure(owner.getCatalog(), dbResult); + } + + } + +} diff --git a/plugins/org.jkiss.dbeaver.ext.mysql/src/org/jkiss/dbeaver/ext/mysql/model/MySQLProcedure.java b/plugins/org.jkiss.dbeaver.ext.mysql/src/org/jkiss/dbeaver/ext/mysql/model/MySQLProcedure.java index 4779e6c9346c5c48b4741abe8aa2edd2f0075c42..c4e636152259602d50af9dcdf63e8abf27bc2854 100644 --- a/plugins/org.jkiss.dbeaver.ext.mysql/src/org/jkiss/dbeaver/ext/mysql/model/MySQLProcedure.java +++ b/plugins/org.jkiss.dbeaver.ext.mysql/src/org/jkiss/dbeaver/ext/mysql/model/MySQLProcedure.java @@ -18,6 +18,7 @@ package org.jkiss.dbeaver.ext.mysql.model; import org.jkiss.code.NotNull; import org.jkiss.dbeaver.DBException; +import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.ext.mysql.MySQLConstants; import org.jkiss.dbeaver.model.DBPDataKind; import org.jkiss.dbeaver.model.DBPEvaluationContext; @@ -45,6 +46,8 @@ import java.util.Map; */ public class MySQLProcedure extends AbstractProcedure implements MySQLSourceObject, DBPRefreshableObject { + private static final Log log = Log.getLog(MySQLProcedure.class); + private DBSProcedureType procedureType; private String resultType; private String bodyType; @@ -74,7 +77,12 @@ public class MySQLProcedure extends AbstractProcedure implements { private static final Log log = Log.getLog(MySQLTableColumn.class); - private static Pattern enumPattern = Pattern.compile("'([^']*)'"); - public enum KeyType implements JDBCColumnKeyType { PRI, UNI, @@ -173,13 +169,42 @@ public class MySQLTableColumn extends JDBCTableColumn implements this.fullTypeName = JDBCUtils.safeGetString(dbResult, MySQLConstants.COL_COLUMN_TYPE); if (!CommonUtils.isEmpty(fullTypeName) && (isTypeEnum() || isTypeSet())) { - enumValues = new ArrayList<>(); - Matcher enumMatcher = enumPattern.matcher(fullTypeName); - while (enumMatcher.find()) { - String enumStr = enumMatcher.group(1); - enumValues.add(enumStr); + enumValues = parseEnumValues(fullTypeName); + } + } + + private static List parseEnumValues(String typeName) { + List values = new ArrayList<>(); + StringBuilder value = new StringBuilder(); + int pos = 0; + while (true) { + int startPos = typeName.indexOf('\'', pos); + if (startPos < 0) { + break; + } + int endPos = -1; + for (int i = startPos + 1; i < typeName.length(); i++) { + char c = typeName.charAt(i); + if (c == '\'') { + if (i < typeName.length() - 2 && typeName.charAt(i + 1) == '\'') { + // Quote escape + value.append(c); + i++; + continue; + } + endPos = i; + break; + } + value.append(c); + } + if (endPos < 0) { + break; } + values.add(value.toString()); + pos = endPos + 1; + value.setLength(0); } + return values; } @NotNull diff --git a/plugins/org.jkiss.dbeaver.ext.netezza/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.ext.netezza/META-INF/MANIFEST.MF index 54352d344690c37ec1d06c3325fc88b95f1d25ee..d565231de02be429943d44bf29e753b14215c8ce 100644 --- a/plugins/org.jkiss.dbeaver.ext.netezza/META-INF/MANIFEST.MF +++ b/plugins/org.jkiss.dbeaver.ext.netezza/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.ext.netezza;singleton:=true -Bundle-Version: 1.0.47 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.48 +Bundle-Release-Date: 20180514 Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime, org.eclipse.ui.views, diff --git a/plugins/org.jkiss.dbeaver.ext.netezza/pom.xml b/plugins/org.jkiss.dbeaver.ext.netezza/pom.xml index 10242f36e9be5efa7fb72bf34ce55584201f56c0..c6188954be14f4b21d54ce2806d6b380f684fd87 100644 --- a/plugins/org.jkiss.dbeaver.ext.netezza/pom.xml +++ b/plugins/org.jkiss.dbeaver.ext.netezza/pom.xml @@ -9,6 +9,6 @@ ../../ org.jkiss.dbeaver.ext.netezza - 1.0.47 + 1.0.48 eclipse-plugin diff --git a/plugins/org.jkiss.dbeaver.ext.oracle/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.ext.oracle/META-INF/MANIFEST.MF index 3662942e1fe1584de2530fae21e9c47a82213221..550840a2596da9d0e0284854dc39e2d83801264f 100644 --- a/plugins/org.jkiss.dbeaver.ext.oracle/META-INF/MANIFEST.MF +++ b/plugins/org.jkiss.dbeaver.ext.oracle/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.ext.oracle;singleton:=true -Bundle-Version: 2.1.67 -Bundle-Release-Date: 20180430 +Bundle-Version: 2.1.68 +Bundle-Release-Date: 20180514 Bundle-Activator: org.jkiss.dbeaver.ext.oracle.Activator Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime, diff --git a/plugins/org.jkiss.dbeaver.ext.oracle/pom.xml b/plugins/org.jkiss.dbeaver.ext.oracle/pom.xml index 730f827f0f8d91922796b9a604620d1cd37e3a51..b0d2eb35a61016063c6a9240ba0e3f3ed4dc80a2 100644 --- a/plugins/org.jkiss.dbeaver.ext.oracle/pom.xml +++ b/plugins/org.jkiss.dbeaver.ext.oracle/pom.xml @@ -9,6 +9,6 @@ ../../ org.jkiss.dbeaver.ext.oracle - 2.1.67 + 2.1.68 eclipse-plugin diff --git a/plugins/org.jkiss.dbeaver.ext.phoenix/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.ext.phoenix/META-INF/MANIFEST.MF index 60ea3b876681f2edf38a6450ec4769bc3f3764a9..c3d5375dd7bb1b13237e07e130adc240d390847d 100644 --- a/plugins/org.jkiss.dbeaver.ext.phoenix/META-INF/MANIFEST.MF +++ b/plugins/org.jkiss.dbeaver.ext.phoenix/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.ext.phoenix;singleton:=true -Bundle-Version: 1.0.51 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.52 +Bundle-Release-Date: 20180514 Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime, org.eclipse.ui.views, diff --git a/plugins/org.jkiss.dbeaver.ext.phoenix/pom.xml b/plugins/org.jkiss.dbeaver.ext.phoenix/pom.xml index 25556098c5dcba6c072e67869159b381c096884d..204c818b239206db2903fac064735f345f746f41 100644 --- a/plugins/org.jkiss.dbeaver.ext.phoenix/pom.xml +++ b/plugins/org.jkiss.dbeaver.ext.phoenix/pom.xml @@ -9,6 +9,6 @@ ../../ org.jkiss.dbeaver.ext.phoenix - 1.0.51 + 1.0.52 eclipse-plugin diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/META-INF/MANIFEST.MF index e6dae378a015b3105c86c33e5f128a8bae419a1a..b06bcf64c7bc5d6f4fa27881d9551c6359efbd11 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/META-INF/MANIFEST.MF +++ b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/META-INF/MANIFEST.MF @@ -2,12 +2,13 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.ext.postgresql.debug.core;singleton:=true -Bundle-Version: 1.0.11 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.12 +Bundle-Release-Date: 20180514 Bundle-Vendor: %Bundle-Vendor Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Require-Bundle: org.eclipse.core.runtime, org.jkiss.dbeaver.ext.postgresql, org.jkiss.dbeaver.core, org.jkiss.dbeaver.debug.core -Export-Package: org.jkiss.dbeaver.ext.postgresql.debug.core +Export-Package: org.jkiss.dbeaver.ext.postgresql.debug, + org.jkiss.dbeaver.ext.postgresql.debug.core diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/plugin.xml b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/plugin.xml index 509dcc7f3423a81adf4fe0e0476e9c5365578057..82e37389dcf57552a084a3742db57db67edf28d8 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/plugin.xml +++ b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/plugin.xml @@ -19,32 +19,10 @@ --> - - - - - - - - - - - + + + + diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/pom.xml b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/pom.xml index 73f5d4bec30c6a3ff29456d3eaa5e271ee0d4a21..a54415d8982174f19b1e6c8f0cbb0723bf6d143a 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/pom.xml +++ b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/pom.xml @@ -9,6 +9,6 @@ ../../ org.jkiss.dbeaver.ext.postgresql.debug.core - 1.0.11 + 1.0.12 eclipse-plugin diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/src/org/jkiss/dbeaver/ext/postgresql/debug/PostgreDebugConstants.java b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/src/org/jkiss/dbeaver/ext/postgresql/debug/PostgreDebugConstants.java new file mode 100644 index 0000000000000000000000000000000000000000..0f429fd9d50a4c0a802fe3ca00a29f5e13c2decd --- /dev/null +++ b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/src/org/jkiss/dbeaver/ext/postgresql/debug/PostgreDebugConstants.java @@ -0,0 +1,34 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2018 Serge Rider (serge@jkiss.org) + * Copyright (C) 2017-2018 Alexander Fedorov (alexander.fedorov@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.debug; + +public class PostgreDebugConstants { + + public static final String ATTR_ATTACH_KIND = "PG.ATTR_ATTACH_KIND"; //$NON-NLS-1$ + public static final String ATTR_ATTACH_PROCESS = "PG.ATTACH_PROCESS"; //$NON-NLS-1$ + public static final String ATTR_DATABASE_NAME = "PG.ATTR_DATABASE_NAME"; //$NON-NLS-1$ + public static final String ATTR_SCHEMA_NAME = "PG.ATTR_SCHEMA_NAME"; //$NON-NLS-1$ + public static final String ATTR_FUNCTION_OID = "PG.ATTR_FUNCTION_OID"; //$NON-NLS-1$ + public static final String ATTR_FUNCTION_PARAMETERS = "PG.ATTR_FUNCTION_PARAMETERS"; //$NON-NLS-1$ + + public static final String ATTACH_KIND_LOCAL = "LOCAL"; //$NON-NLS-1$ + public static final String ATTACH_KIND_GLOBAL = "GLOBAL"; //$NON-NLS-1$ + + public static final String DEBUG_TYPE_FUNCTION = "org.jkiss.dbeaver.ext.postgresql.debug.function"; + +} diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/src/org/jkiss/dbeaver/ext/postgresql/debug/core/PostgreSqlDebugCore.java b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/src/org/jkiss/dbeaver/ext/postgresql/debug/core/PostgreSqlDebugCore.java index 546b2ee4ba6f21bd72a4dfe37d3ff90336e5863e..b758f432ef7db9ffdcfb822f378f66770bb00d42 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/src/org/jkiss/dbeaver/ext/postgresql/debug/core/PostgreSqlDebugCore.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/src/org/jkiss/dbeaver/ext/postgresql/debug/core/PostgreSqlDebugCore.java @@ -17,63 +17,59 @@ */ package org.jkiss.dbeaver.ext.postgresql.debug.core; -import org.eclipse.core.resources.IContainer; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; -import org.eclipse.osgi.util.NLS; -import org.jkiss.dbeaver.core.DBeaverCore; -import org.jkiss.dbeaver.debug.core.DebugCore; -import org.jkiss.dbeaver.ext.postgresql.debug.internal.PostgreDebugCoreMessages; +import org.jkiss.dbeaver.DBException; +import org.jkiss.dbeaver.debug.DBGConstants; +import org.jkiss.dbeaver.ext.postgresql.debug.PostgreDebugConstants; 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.DBPDataSourceContainer; -import org.jkiss.dbeaver.model.navigator.DBNDatabaseNode; -import org.jkiss.dbeaver.model.navigator.DBNModel; -import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor; -import org.jkiss.dbeaver.model.struct.DBSObject; +import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; +import org.jkiss.utils.CommonUtils; + +import java.util.Map; public class PostgreSqlDebugCore { public static final String BUNDLE_SYMBOLIC_NAME = "org.jkiss.dbeaver.ext.postgresql.debug.core"; //$NON-NLS-1$ - public static final String CONFIGURATION_TYPE = BUNDLE_SYMBOLIC_NAME + '.' + "pgSQL";//$NON-NLS-1$ - - public static ILaunchConfigurationWorkingCopy createConfiguration(DBSObject launchable) throws CoreException { - boolean isInstance = launchable instanceof PostgreProcedure; - if (!isInstance) { - throw DebugCore.abort(PostgreDebugCoreMessages.PostgreSqlDebugCore_e_procedure_required); - } - PostgreProcedure procedure = (PostgreProcedure) launchable; + public static void saveFunction(PostgreProcedure procedure, Map configuration) { PostgreDataSource dataSource = procedure.getDataSource(); DBPDataSourceContainer dataSourceContainer = dataSource.getContainer(); - PostgreDatabase database = procedure.getDatabase(); - PostgreSchema schema = procedure.getContainer(); - String databaseName = database.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_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); + String databaseName = procedure.getDatabase().getName(); + String schemaName = procedure.getSchema().getName(); - workingCopy.setAttribute(DebugCore.ATTR_ATTACH_PROCESS, DebugCore.ATTR_ATTACH_PROCESS_DEFAULT); - workingCopy.setAttribute(DebugCore.ATTR_ATTACH_KIND, DebugCore.ATTR_ATTACH_KIND_DEFAULT); - workingCopy.setAttribute(DebugCore.ATTR_SCRIPT_EXECUTE, DebugCore.ATTR_SCRIPT_EXECUTE_DEFAULT); - workingCopy.setAttribute(DebugCore.ATTR_SCRIPT_TEXT, DebugCore.composeScriptText(procedure)); - final DBNModel navigatorModel = DBeaverCore.getInstance().getNavigatorModel(); - DBNDatabaseNode node = navigatorModel.getNodeByObject(new VoidProgressMonitor(), procedure, false); - workingCopy.setAttribute(DebugCore.ATTR_NODE_PATH, node.getNodeItemPath()); - return workingCopy; + configuration.put(DBGConstants.ATTR_DATASOURCE_ID, dataSourceContainer.getId()); + configuration.put(DBGConstants.ATTR_DEBUG_TYPE, PostgreDebugConstants.DEBUG_TYPE_FUNCTION); + configuration.put(PostgreDebugConstants.ATTR_DATABASE_NAME, databaseName); + configuration.put(PostgreDebugConstants.ATTR_SCHEMA_NAME, schemaName); + configuration.put(PostgreDebugConstants.ATTR_FUNCTION_OID, String.valueOf(procedure.getObjectId())); + } + + public static PostgreProcedure resolveFunction(DBRProgressMonitor monitor, DBPDataSourceContainer dsContainer, Map configuration) throws DBException { + if (!dsContainer.isConnected()) { + dsContainer.connect(monitor, true, true); + } + long functionId = CommonUtils.toLong(configuration.get(PostgreDebugConstants.ATTR_FUNCTION_OID)); + String databaseName = (String)configuration.get(PostgreDebugConstants.ATTR_DATABASE_NAME); + String schemaName = (String)configuration.get(PostgreDebugConstants.ATTR_SCHEMA_NAME); + PostgreDataSource ds = (PostgreDataSource) dsContainer.getDataSource(); + PostgreDatabase database = ds.getDatabase(databaseName); + if (database != null) { + PostgreSchema schema = database.getSchema(monitor, schemaName); + if (schema != null) { + PostgreProcedure function = schema.getProcedure(monitor, functionId); + if (function != null) { + return function; + } + throw new DBException("Function " + functionId + " not found in schema " + schemaName); + } else { + throw new DBException("Schema '" + schemaName + "' not found in database " + databaseName); + } + } else { + throw new DBException("Database '" + databaseName + "' not found"); + } } } diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/src/org/jkiss/dbeaver/ext/postgresql/debug/internal/PostgreDebugAdapterFactory.java b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/src/org/jkiss/dbeaver/ext/postgresql/debug/internal/PostgreDebugAdapterFactory.java index 10877965852faa58da803abecb0caf6fff541338..098005ae8f05d412f63ec5463ccb3683f427c809 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/src/org/jkiss/dbeaver/ext/postgresql/debug/internal/PostgreDebugAdapterFactory.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/src/org/jkiss/dbeaver/ext/postgresql/debug/internal/PostgreDebugAdapterFactory.java @@ -19,9 +19,11 @@ package org.jkiss.dbeaver.ext.postgresql.debug.internal; import org.eclipse.core.runtime.IAdapterFactory; import org.jkiss.dbeaver.debug.DBGController; +import org.jkiss.dbeaver.debug.DBGControllerFactory; import org.jkiss.dbeaver.debug.DBGResolver; import org.jkiss.dbeaver.ext.postgresql.PostgreDataSourceProvider; import org.jkiss.dbeaver.ext.postgresql.debug.internal.impl.PostgreDebugController; +import org.jkiss.dbeaver.ext.postgresql.debug.internal.impl.PostgreDebugControllerFactory; import org.jkiss.dbeaver.ext.postgresql.model.PostgreDataSource; import org.jkiss.dbeaver.model.DBPDataSource; import org.jkiss.dbeaver.model.DBPDataSourceContainer; @@ -34,27 +36,18 @@ public class PostgreDebugAdapterFactory implements IAdapterFactory { @Override public T getAdapter(Object adaptableObject, Class adapterType) { - if (adapterType == DBGController.class) { + if (adapterType == DBGControllerFactory.class) { if (adaptableObject instanceof DBPDataSourceContainer) { - DBPDataSourceContainer sourceContainer = (DBPDataSourceContainer) adaptableObject; - DBPDriver driver = sourceContainer.getDriver(); - if (driver == null) { - return null; + DBPDataSourceContainer ds = (DBPDataSourceContainer) adaptableObject; + if (ds.getDriver().getDataSourceProvider() instanceof PostgreDataSourceProvider) { + return adapterType.cast(new PostgreDebugControllerFactory()); } - DBPDataSourceProvider dataSourceProvider = driver.getDataSourceProvider(); - if (dataSourceProvider instanceof PostgreDataSourceProvider) { - PostgreDebugController postgreDebugController = new PostgreDebugController(sourceContainer); - return adapterType.cast(postgreDebugController); - } - } } else if (adapterType == DBGResolver.class) { if (adaptableObject instanceof DBPDataSourceContainer) { - DBPDataSourceContainer sourceContainer = (DBPDataSourceContainer) adaptableObject; - DBPDataSource dataSource = sourceContainer.getDataSource(); - if (dataSource instanceof PostgreDataSource) { - PostgreDataSource postgeDataSource = (PostgreDataSource) dataSource; - return adapterType.cast(new PostgreResolver(postgeDataSource)); + DBPDataSourceContainer ds = (DBPDataSourceContainer) adaptableObject; + if (ds.getDriver().getProviderId().equals("postgresql")) { + return adapterType.cast(new PostgreResolver(ds)); } } } diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/src/org/jkiss/dbeaver/ext/postgresql/debug/internal/PostgreResolver.java b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/src/org/jkiss/dbeaver/ext/postgresql/debug/internal/PostgreResolver.java index 2ccfc5de0973e58b8b1b3c59fe9f2b2301add0f9..96381115ba160fa93cfa7d55c3ff9f097c6830a3 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/src/org/jkiss/dbeaver/ext/postgresql/debug/internal/PostgreResolver.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/src/org/jkiss/dbeaver/ext/postgresql/debug/internal/PostgreResolver.java @@ -17,76 +17,36 @@ */ package org.jkiss.dbeaver.ext.postgresql.debug.internal; -import java.util.HashMap; -import java.util.Map; - import org.jkiss.dbeaver.DBException; -import org.jkiss.dbeaver.debug.DBGController; import org.jkiss.dbeaver.debug.DBGResolver; -import org.jkiss.dbeaver.ext.postgresql.model.PostgreDataSource; -import org.jkiss.dbeaver.ext.postgresql.model.PostgreDatabase; +import org.jkiss.dbeaver.ext.postgresql.debug.core.PostgreSqlDebugCore; import org.jkiss.dbeaver.ext.postgresql.model.PostgreProcedure; -import org.jkiss.dbeaver.ext.postgresql.model.PostgreSchema; +import org.jkiss.dbeaver.model.DBPDataSourceContainer; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.dbeaver.model.struct.DBSObject; +import java.util.HashMap; +import java.util.Map; + public class PostgreResolver implements DBGResolver { - private final PostgreDataSource dataSource; + private final DBPDataSourceContainer dataSource; - public PostgreResolver(PostgreDataSource dataSource) { + public PostgreResolver(DBPDataSourceContainer dataSource) { this.dataSource = dataSource; } @Override public DBSObject resolveObject(Map context, Object identifier, DBRProgressMonitor monitor) throws DBException { - Long oid = null; - final String errorIdentifier = String.format("Unknown procedure identifier %s", identifier); - if (identifier instanceof Number) { - Number number = (Number) identifier; - oid = number.longValue(); - } else if (identifier instanceof String) { - String string = (String) identifier; - try { - oid = Long.parseLong(string); - } catch (NumberFormatException e) { - throw new DBException(errorIdentifier, e, dataSource); - } - } - if (oid == null) { - throw new DBException(errorIdentifier); - } - String databaseName = String.valueOf(context.get(DBGController.DATABASE_NAME)); - PostgreDatabase database = dataSource.getDatabase(databaseName); - if (database == null) { - return null; - } - String schemaName = String.valueOf(context.get(DBGController.SCHEMA_NAME)); - PostgreSchema schema = null; - schema = database.getSchema(monitor, schemaName); - if (schema == null) { - return null; - } - PostgreProcedure procedure = schema.getProcedure(monitor, oid); - return procedure; + return PostgreSqlDebugCore.resolveFunction(monitor, dataSource, context); } @Override public Map resolveContext(DBSObject databaseObject) { - HashMap context = new HashMap(); + HashMap context = new HashMap<>(); if (databaseObject instanceof PostgreProcedure) { - PostgreProcedure procedure = (PostgreProcedure) databaseObject; - context.put(DBGController.PROCEDURE_OID, procedure.getObjectId()); - context.put(DBGController.PROCEDURE_NAME, procedure.getName()); - PostgreSchema schema = procedure.getContainer(); - if (schema != null) { - context.put(DBGController.SCHEMA_NAME, schema.getName()); - } - PostgreDatabase database = procedure.getDatabase(); - if (database != null) { - context.put(DBGController.DATABASE_NAME, database.getName()); - } + PostgreSqlDebugCore.saveFunction((PostgreProcedure)databaseObject, context); } return context; } diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/src/org/jkiss/dbeaver/ext/postgresql/debug/internal/console/Debugger.java b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/src/org/jkiss/dbeaver/ext/postgresql/debug/internal/console/Debugger.java index 70d17deb9e73face47b1f423e5a7e282a9e1f882..09403332c28a0e88e00b3955679a7c57de27b08d 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/src/org/jkiss/dbeaver/ext/postgresql/debug/internal/console/Debugger.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/src/org/jkiss/dbeaver/ext/postgresql/debug/internal/console/Debugger.java @@ -17,32 +17,24 @@ package org.jkiss.dbeaver.ext.postgresql.debug.internal.console; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.SQLException; -import java.util.List; -import java.util.Scanner; - -import org.jkiss.dbeaver.debug.DBGBaseController; -import org.jkiss.dbeaver.debug.DBGBreakpointDescriptor; -import org.jkiss.dbeaver.debug.DBGController; -import org.jkiss.dbeaver.debug.DBGException; -import org.jkiss.dbeaver.debug.DBGObjectDescriptor; -import org.jkiss.dbeaver.debug.DBGSession; -import org.jkiss.dbeaver.debug.DBGSessionInfo; -import org.jkiss.dbeaver.debug.DBGStackFrame; -import org.jkiss.dbeaver.debug.DBGVariable; +import org.jkiss.dbeaver.debug.*; import org.jkiss.dbeaver.ext.postgresql.debug.internal.impl.PostgreDebugBreakpointDescriptor; -import org.jkiss.dbeaver.ext.postgresql.debug.internal.impl.PostgreDebugBreakpointProperties; import org.jkiss.dbeaver.ext.postgresql.debug.internal.impl.PostgreDebugController; -import org.jkiss.dbeaver.ext.postgresql.debug.internal.impl.PostgreDebugObjectDescriptor; import org.jkiss.dbeaver.model.DBPDataSourceContainer; import org.jkiss.dbeaver.model.exec.DBCExecutionContext; import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.List; +import java.util.Scanner; + @SuppressWarnings("nls") public class Debugger { +/* public static final String PROMPT = ">"; public static final String COMMAND_ATTACH = "A"; public static final String COMMAND_CLOSE = "X"; @@ -70,7 +62,7 @@ public class Debugger { DBGVariable v = null; - List> vars = session.getVariables(); + List> vars = session.getVariables(null); Scanner scArg; @@ -297,7 +289,7 @@ public class Debugger { } // TODO: fix connection - controller = new PostgreDebugController(dataSource); + controller = new PostgreDebugController(dataSource, new HashMap<>()); Scanner sc = new Scanner(System.in); Scanner scArg; @@ -341,7 +333,7 @@ public class Debugger { break; } - controller.detach(debugSessionC.getSessionId(), new VoidProgressMonitor()); + debugSessionC.closeSession(new VoidProgressMonitor()); System.out.println("Session closed"); @@ -389,7 +381,7 @@ public class Debugger { break; } - List> vars = debugSessionVL.getVariables(); + List> vars = debugSessionVL.getVariables(null); if (vars.size() == 0) { System.out.println("No vars defined"); @@ -498,19 +490,6 @@ public class Debugger { } - DBGObjectDescriptor debugObject = null; - - for (DBGObjectDescriptor o : controller.getObjects("_", "_")) { - if (objId.equals(o.getID())) { - debugObject = o; - } - } - - if (debugObject == null) { - System.out.println(String.format("Object ID '%s' no found", strObjId)); - break; - } - if (controller.getSessions().size() == 0) { System.out.println("Debug sessions not found"); break; @@ -522,18 +501,15 @@ public class Debugger { break; } - PostgreDebugBreakpointProperties breakpointProperties = lineNo > 0 - ? new PostgreDebugBreakpointProperties(lineNo, true) - : new PostgreDebugBreakpointProperties(true); + PostgreDebugBreakpointDescriptor descriptor = lineNo > 0 + ? new PostgreDebugBreakpointDescriptor(1, lineNo, true) + : new PostgreDebugBreakpointDescriptor(1, true); - Object oid = debugObject.getID(); - PostgreDebugBreakpointDescriptor descriptor = new PostgreDebugBreakpointDescriptor(oid, - breakpointProperties); - debugSession.addBreakpoint(descriptor); + debugSession.addBreakpoint(new VoidProgressMonitor(), descriptor); System.out.println("Breakpoint added"); - System.out.println(breakpointProperties.toString()); + System.out.println(descriptor.toString()); break; @@ -577,7 +553,7 @@ public class Debugger { DBGBreakpointDescriptor bpr = chooseBreakpoint(sc, controller, debugSessionBR); - debugSessionBR.removeBreakpoint(bpr); + debugSessionBR.removeBreakpoint(new VoidProgressMonitor(), bpr); System.out.println("Breakpoint removed ..."); @@ -639,9 +615,6 @@ public class Debugger { break; case COMMAND_SESSIONS: - for (DBGSessionInfo s : controller.getSessionDescriptors()) { - System.out.println(s); - } break; case COMMAND_DEBUG_LIST: @@ -660,7 +633,7 @@ public class Debugger { Connection debugConn = DriverManager.getConnection(url); // TODO: fix connection DBCExecutionContext executionContext = null; - DBGSession s = controller.createSession(null, executionContext); + DBGSession s = controller.createSession(new VoidProgressMonitor(), new HashMap<>()); System.out.println("created"); System.out.println(s); @@ -699,11 +672,6 @@ public class Debugger { } - for (DBGObjectDescriptor o : controller.getObjects(owner.equals(ANY_ARG) ? "_" : owner, - proc.equals(ANY_ARG) ? "_" : proc)) { - System.out.println(o); - } - break; case COMMAND_ATTACH: @@ -739,5 +707,6 @@ public class Debugger { } } +*/ } diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/src/org/jkiss/dbeaver/ext/postgresql/debug/internal/impl/PostgreDebugBreakpointDescriptor.java b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/src/org/jkiss/dbeaver/ext/postgresql/debug/internal/impl/PostgreDebugBreakpointDescriptor.java index 5f9709f450a62b7bae4d13892040b437d313ea90..d9f7b23b480833ad89402aa0e4c1ac52eee199a1 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/src/org/jkiss/dbeaver/ext/postgresql/debug/internal/impl/PostgreDebugBreakpointDescriptor.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/src/org/jkiss/dbeaver/ext/postgresql/debug/internal/impl/PostgreDebugBreakpointDescriptor.java @@ -20,32 +20,87 @@ package org.jkiss.dbeaver.ext.postgresql.debug.internal.impl; import org.jkiss.dbeaver.debug.DBGBreakpointDescriptor; -@SuppressWarnings("nls") +import java.util.HashMap; +import java.util.Map; + +/** + * PG breakpoint + */ public class PostgreDebugBreakpointDescriptor implements DBGBreakpointDescriptor { private final Object oid; + private final long lineNo; + private final boolean onStart; + private final long targetId; + private final boolean all; + private final boolean global; - private final PostgreDebugBreakpointProperties properties; + public PostgreDebugBreakpointDescriptor(Object oid, long lineNo, long targetId, boolean global) { + this.oid = oid; + this.lineNo = lineNo; + this.onStart = lineNo < 0; + this.targetId = targetId; + this.all = targetId < 0; + this.global = global; + } - public PostgreDebugBreakpointDescriptor(Object oid, PostgreDebugBreakpointProperties properties) { + public PostgreDebugBreakpointDescriptor(Object oid, long lineNo, boolean global) { this.oid = oid; - this.properties = properties; + this.lineNo = lineNo; + this.onStart = lineNo < 0; + this.targetId = -1; + this.all = true; + this.global = global; + } + public PostgreDebugBreakpointDescriptor(Object oid, boolean global) { + this.oid = oid; + this.lineNo = -1; + this.onStart = true; + this.targetId = -1; + this.all = true; + this.global = global; } - + @Override public Object getObjectId() { return oid; } + public long getLineNo() { + return lineNo; + } + + public boolean isOnStart() { + return onStart; + } + + public long getTargetId() { + return targetId; + } + + public boolean isAll() { + return all; + } + + public boolean isGlobal() { + return global; + } + @Override - public PostgreDebugBreakpointProperties getProperties() { - return properties; + public Map toMap() { + Map map = new HashMap<>(); + map.put("lineNo", lineNo); + map.put("onStart", onStart); + map.put("targetId", targetId); + map.put("all", all); + map.put("global", global); + return map; } @Override public String toString() { - return "PostgreDebugBreakpointDescriptor [obj=" + oid + ", properties=" + properties + "]"; + return "PostgreDebugBreakpointDescriptor [obj=" + oid + ", properties=" + toMap() + "]"; } } diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/src/org/jkiss/dbeaver/ext/postgresql/debug/internal/impl/PostgreDebugBreakpointProperties.java b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/src/org/jkiss/dbeaver/ext/postgresql/debug/internal/impl/PostgreDebugBreakpointProperties.java deleted file mode 100644 index 734c5e5b7a5b923e316181a1bfc3656931ba4905..0000000000000000000000000000000000000000 --- a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/src/org/jkiss/dbeaver/ext/postgresql/debug/internal/impl/PostgreDebugBreakpointProperties.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * DBeaver - Universal Database Manager - * Copyright (C) 2010-2018 Serge Rider (serge@jkiss.org) - * Copyright (C) 2017-2018 Andrew Khitrin (ahitrin@gmail.com) - * Copyright (C) 2017-2018 Alexander Fedorov (alexander.fedorov@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.debug.internal.impl; - -import java.util.HashMap; -import java.util.Map; - -import org.jkiss.dbeaver.debug.DBGBreakpointProperties; - -public class PostgreDebugBreakpointProperties implements DBGBreakpointProperties { - - private final long lineNo; - private final boolean onStart; - private final long targetId; - private final boolean all; - private final boolean global; - - public long getLineNo() { - return lineNo; - } - - public boolean isOnStart() { - return onStart; - } - - public long getTargetId() { - return targetId; - } - - public boolean isAll() { - return all; - } - - public boolean isGlobal() { - return global; - } - - public PostgreDebugBreakpointProperties(long lineNo, long targetId, boolean global) { - this.lineNo = lineNo; - this.onStart = lineNo < 0; - this.targetId = targetId; - this.all = targetId < 0; - this.global = global; - } - - public PostgreDebugBreakpointProperties(long lineNo, boolean global) { - this.lineNo = lineNo; - this.onStart = lineNo < 0; - this.targetId = -1; - this.all = true; - this.global = global; - } - - public PostgreDebugBreakpointProperties(boolean global) { - this.lineNo = -1; - this.onStart = true; - this.targetId = -1; - this.all = true; - this.global = global; - } - - @Override - public Map toMap() { - Map map = new HashMap(); - map.put("lineNo", lineNo); - map.put("onStart", onStart); - map.put("targetId", targetId); - map.put("all", all); - map.put("global", global); - return map; - } - - @Override - public String toString() { - return "PostgreDebugBreakpointProperties [lineNo=" + lineNo + ", onStart=" + onStart + ", targetId=" + targetId - + ", all=" + all + ", global=" + global + "]"; - } - -} diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/src/org/jkiss/dbeaver/ext/postgresql/debug/internal/impl/PostgreDebugController.java b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/src/org/jkiss/dbeaver/ext/postgresql/debug/internal/impl/PostgreDebugController.java index bfadfb34e016822a6f71d5d20d8999eb6a351e1d..9d5aa46f7a10d690adff61813c72cdaa5301a2ec 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/src/org/jkiss/dbeaver/ext/postgresql/debug/internal/impl/PostgreDebugController.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/src/org/jkiss/dbeaver/ext/postgresql/debug/internal/impl/PostgreDebugController.java @@ -18,152 +18,58 @@ */ package org.jkiss.dbeaver.ext.postgresql.debug.internal.impl; -import java.sql.Connection; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - +import org.eclipse.core.resources.IMarker; import org.jkiss.dbeaver.DBException; +import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.debug.DBGBaseController; import org.jkiss.dbeaver.debug.DBGBreakpointDescriptor; -import org.jkiss.dbeaver.debug.DBGController; import org.jkiss.dbeaver.debug.DBGException; -import org.jkiss.dbeaver.debug.DBGSession; -import org.jkiss.dbeaver.debug.DBGSessionInfo; +import org.jkiss.dbeaver.ext.postgresql.debug.PostgreDebugConstants; import org.jkiss.dbeaver.model.DBPDataSourceContainer; -import org.jkiss.dbeaver.model.exec.DBCExecutionContext; -import org.jkiss.dbeaver.model.impl.jdbc.JDBCExecutionContext; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; -import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor; -public class PostgreDebugController extends DBGBaseController { - - private static final String SQL_SESSION = "select pid,usename,application_name,state,query from pg_stat_activity"; //$NON-NLS-1$ +import java.util.Map; - private static final String SQL_OBJECT = "select p.oid,p.proname,u.usename as owner,n.nspname, l.lanname as lang " //$NON-NLS-1$ - + " from " + " pg_catalog.pg_namespace n " + " join pg_catalog.pg_proc p on p.pronamespace = n.oid " //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ - + " join pg_user u on u.usesysid = p.proowner " + " join pg_language l on l.oid = p. prolang " //$NON-NLS-1$ //$NON-NLS-2$ - + " where " + " l.lanname = 'plpgsql' " + " and p.proname like '%?nameCtx%' " //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$ - + " and u.usename like '%?userCtx%' " + " order by " + " n.nspname,p.proname"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ +public class PostgreDebugController extends DBGBaseController { - private static final String SQL_CURRENT_SESSION = "select pid,usename,application_name,state,query from pg_stat_activity where pid = pg_backend_pid()"; //$NON-NLS-1$ + private static final Log log = Log.getLog(PostgreDebugController.class); - public PostgreDebugController(DBPDataSourceContainer dataSourceDescriptor) { - super(dataSourceDescriptor); + public PostgreDebugController(DBPDataSourceContainer dataSourceContainer, Map configuration) { + super(dataSourceContainer, configuration); } @Override - public PostgreDebugSessionInfo getSessionDescriptor(DBCExecutionContext connectionTarget) throws DBGException { - try (Statement stmt = getConnection(connectionTarget).createStatement(); - ResultSet rs = stmt.executeQuery(SQL_CURRENT_SESSION)) { - - if (rs.next()) { - int pid = rs.getInt("pid"); - String usename = rs.getString("usename"); - String applicationName = rs.getString("application_name"); - String state = rs.getString("state"); - String query = rs.getString("query"); - PostgreDebugSessionInfo res = new PostgreDebugSessionInfo(pid, usename, applicationName, state, query); - return res; + public PostgreDebugSession createSession(DBRProgressMonitor monitor, Map configuration) + throws DBGException + { + PostgreDebugSession pgSession = null; + try { + pgSession = new PostgreDebugSession(monitor,this); + + pgSession.attach(monitor, configuration); + + return pgSession; + } catch (DBException e) { + if (pgSession != null) { + try { + pgSession.closeSession(monitor); + } catch (Exception e1) { + log.error(e1); + } } - - throw new DBGException("Error getting session"); - - } catch (SQLException e) { - throw new DBGException("SQL error", e); - } - - } - - private static Connection getConnection(DBCExecutionContext connectionTarget) throws SQLException { - return ((JDBCExecutionContext) connectionTarget).getConnection(new VoidProgressMonitor()); - } - - @Override - public List getSessionDescriptors() throws DBGException { - DBCExecutionContext executionContext = getExecutionContext(); - try (Statement stmt = getConnection(executionContext).createStatement(); - ResultSet rs = stmt.executeQuery(SQL_SESSION)) { - List res = new ArrayList(); - - while (rs.next()) { - int pid = rs.getInt("pid"); - String usename = rs.getString("usename"); - String state = rs.getString("state"); - String applicationName = rs.getString("application_name"); - String query = rs.getString("query"); - PostgreDebugSessionInfo info = new PostgreDebugSessionInfo(pid, usename, applicationName, state, query); - res.add(info); + if (e instanceof DBGException) { + throw (DBGException)e; } - - return res; - - } catch (SQLException e) { - throw new DBGException("SQL error", e); + throw new DBGException("Error attaching debug session", e); } - - } - - @Override - public List getObjects(String ownerCtx, String nameCtx) throws DBGException { - DBCExecutionContext executionContext = getExecutionContext(); - String sql = SQL_OBJECT.replaceAll("\\?nameCtx", nameCtx).replaceAll("\\?userCtx", ownerCtx).toLowerCase(); - try (Statement stmt = getConnection(executionContext).createStatement(); - ResultSet rs = stmt.executeQuery(sql)) { - - List res = new ArrayList(); - - while (rs.next()) { - int oid = rs.getInt("oid"); - String proname = rs.getString("proname"); - String owner = rs.getString("owner"); - String nspname = rs.getString("nspname"); - String lang = rs.getString("lang"); - PostgreDebugObjectDescriptor object = new PostgreDebugObjectDescriptor(oid, proname, owner, nspname, - lang); - res.add(object); - } - - return res; - - } catch (SQLException e) { - throw new DBGException("SQL error", e); - } - } - - @Override - public PostgreDebugSession createSession(DBGSessionInfo targetInfo, DBCExecutionContext sessionContext) - throws DBGException { - PostgreDebugSessionInfo sessionInfo = getSessionDescriptor(sessionContext); - PostgreDebugSession debugSession = new PostgreDebugSession(this, sessionInfo, targetInfo.getID()); - - return debugSession; - - } - - @Override - public void attachSession(DBGSession session, DBCExecutionContext sessionContext, Map configuration, - DBRProgressMonitor monitor) throws DBException { - PostgreDebugSession pgSession = (PostgreDebugSession) session; - JDBCExecutionContext sessionJdbc = (JDBCExecutionContext) sessionContext; - int oid = Integer.parseInt(String.valueOf(configuration.get(PROCEDURE_OID))); - int pid = Integer.parseInt(String.valueOf(configuration.get(ATTACH_PROCESS))); - String kind = String.valueOf(configuration.get(ATTACH_KIND)); - boolean global = DBGController.ATTACH_KIND_GLOBAL.equals(kind); - String call = (String) configuration.get(SCRIPT_TEXT); - pgSession.attach(sessionJdbc, oid, pid, global, call); } @Override public DBGBreakpointDescriptor describeBreakpoint(Map attributes) { - Object oid = attributes.get(DBGController.PROCEDURE_OID); - Object lineNumber = attributes.get(DBGController.BREAKPOINT_LINE_NUMBER); + Object oid = attributes.get(PostgreDebugConstants.ATTR_FUNCTION_OID); + Object lineNumber = attributes.get(IMarker.LINE_NUMBER); long parsed = Long.parseLong(String.valueOf(lineNumber)); - PostgreDebugBreakpointProperties properties = new PostgreDebugBreakpointProperties(parsed, false); - return new PostgreDebugBreakpointDescriptor(oid, properties ); + return new PostgreDebugBreakpointDescriptor(oid, parsed, false); } } diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/src/org/jkiss/dbeaver/ext/postgresql/debug/internal/impl/PostgreDebugControllerFactory.java b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/src/org/jkiss/dbeaver/ext/postgresql/debug/internal/impl/PostgreDebugControllerFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..3f0a6d2790d123809e82edf678c1a90c88410256 --- /dev/null +++ b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/src/org/jkiss/dbeaver/ext/postgresql/debug/internal/impl/PostgreDebugControllerFactory.java @@ -0,0 +1,35 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2018 Serge Rider (serge@jkiss.org) + * Copyright (C) 2017-2018 Andrew Khitrin (ahitrin@gmail.com) + * Copyright (C) 2017-2018 Alexander Fedorov (alexander.fedorov@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.debug.internal.impl; + +import org.jkiss.dbeaver.debug.DBGController; +import org.jkiss.dbeaver.debug.DBGControllerFactory; +import org.jkiss.dbeaver.debug.DBGException; +import org.jkiss.dbeaver.model.DBPDataSourceContainer; + +import java.util.Map; + +public class PostgreDebugControllerFactory implements DBGControllerFactory { + + + @Override + public DBGController createController(DBPDataSourceContainer dataSource, Map context) throws DBGException { + return new PostgreDebugController(dataSource, context); + } +} diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/src/org/jkiss/dbeaver/ext/postgresql/debug/internal/impl/PostgreDebugSession.java b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/src/org/jkiss/dbeaver/ext/postgresql/debug/internal/impl/PostgreDebugSession.java index 0b9c92edc02b617e623293416a260d50c8bd3017..770f2a2f343a1ac721fbaf4884d8ada7a3cde8b0 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/src/org/jkiss/dbeaver/ext/postgresql/debug/internal/impl/PostgreDebugSession.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/src/org/jkiss/dbeaver/ext/postgresql/debug/internal/impl/PostgreDebugSession.java @@ -19,36 +19,38 @@ package org.jkiss.dbeaver.ext.postgresql.debug.internal.impl; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLClientInfoException; -import java.sql.SQLException; -import java.sql.SQLWarning; -import java.sql.Statement; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.ExecutionException; - -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.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.Log; -import org.jkiss.dbeaver.debug.DBGBaseController; -import org.jkiss.dbeaver.debug.DBGBaseSession; -import org.jkiss.dbeaver.debug.DBGBreakpointDescriptor; -import org.jkiss.dbeaver.debug.DBGEvent; -import org.jkiss.dbeaver.debug.DBGException; -import org.jkiss.dbeaver.debug.DBGSessionInfo; -import org.jkiss.dbeaver.debug.DBGStackFrame; -import org.jkiss.dbeaver.debug.DBGVariable; -import org.jkiss.dbeaver.debug.core.DebugCore; +import org.jkiss.dbeaver.debug.*; +import org.jkiss.dbeaver.debug.core.DebugUtils; +import org.jkiss.dbeaver.debug.jdbc.DBGJDBCSession; import org.jkiss.dbeaver.ext.postgresql.PostgreConstants; +import org.jkiss.dbeaver.ext.postgresql.debug.PostgreDebugConstants; +import org.jkiss.dbeaver.ext.postgresql.debug.core.PostgreSqlDebugCore; +import org.jkiss.dbeaver.ext.postgresql.model.PostgreProcedure; +import org.jkiss.dbeaver.ext.postgresql.model.PostgreProcedureParameter; import org.jkiss.dbeaver.model.DBPDataSource; +import org.jkiss.dbeaver.model.DBPEvaluationContext; +import org.jkiss.dbeaver.model.DBUtils; +import org.jkiss.dbeaver.model.data.DBDValueHandler; +import org.jkiss.dbeaver.model.exec.DBCExecutionPurpose; +import org.jkiss.dbeaver.model.exec.jdbc.JDBCSession; import org.jkiss.dbeaver.model.impl.jdbc.JDBCExecutionContext; +import org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils; +import org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCCallableStatementImpl; +import org.jkiss.dbeaver.model.runtime.AbstractJob; +import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor; +import org.jkiss.utils.CommonUtils; +import org.jkiss.utils.IOUtils; + +import java.sql.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; /** * Typical scenario for debug session
@@ -71,80 +73,99 @@ import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor; * state until next breakpoint or end of procedure will be reached
* */ -public class PostgreDebugSession extends DBGBaseSession { +public class PostgreDebugSession extends DBGJDBCSession { + + private final JDBCExecutionContext connection; + private final JDBCExecutionContext controllerConnection; private final DBGSessionInfo sessionInfo; - private final Object targetId; private int sessionId = -1; - private int localPortNumber = -1; private PostgreDebugAttachKind attachKind = PostgreDebugAttachKind.UNKNOWN; - private Statement localStatement; - - private Job job; - - private Connection executionTarget; - private PostgreDebugBreakpointDescriptor bpGlobal; + private volatile CallableStatement localStatement; - private static final int LOCAL_WAIT = 500; // 0.5 sec + private static final int LOCAL_WAIT = 50; // 0.5 sec - private static final int LOCAL_TIMEOT = 50 * 1000; // 50 sec + private static final int LOCAL_TIMEOT = 1000 * LOCAL_WAIT; // 50 sec private static final String MAGIC_PORT = "PLDBGBREAK"; - private static final String SQL_ATTACH = "select pldbg_wait_for_target(?sessionid)"; + private static final String SQL_CHECK_PLUGIN = "select 'Server version: ' || serverversionstr || '.\nProxy API version: ' || proxyapiver from pldbg_get_proxy_info()"; + private static final String SQL_ATTACH = "select pldbg_wait_for_target(?sessionid)"; private static final String SQL_ATTACH_TO_PORT = "select pldbg_attach_to_port(?portnumber)"; - private static final String SQL_PREPARE_SLOT = " select pldbg_oid_debug(?objectid)"; - private static final String SQL_LISTEN = "select pldbg_create_listener() as sessionid"; - private static final String SQL_GET_SRC = "select pldbg_get_source(?sessionid,?oid)"; - private static final String SQL_GET_VARS = "select * from pldbg_get_variables(?sessionid)"; - private static final String SQL_SET_VAR = "select pldbg_deposit_value(?,?,?,?)"; - private static final String SQL_GET_STACK = "select * from pldbg_get_stack(?sessionid)"; - private static final String SQL_SELECT_FRAME = "select * from pldbg_select_frame(?sessionid,?frameno)"; - private static final String SQL_STEP_OVER = "select pldbg_step_over(?sessionid)"; - private static final String SQL_STEP_INTO = "select pldbg_step_into(?sessionid)"; - private static final String SQL_CONTINUE = "select pldbg_continue(?sessionid)"; - private static final String SQL_ABORT = "select pldbg_abort_target(?sessionid)"; - private static final String SQL_SET_GLOBAL_BREAKPOINT = "select pldbg_set_global_breakpoint(?sessionid, ?obj, ?line, ?target)"; private static final String SQL_SET_BREAKPOINT = "select pldbg_set_breakpoint(?sessionid, ?obj, ?line)"; private static final String SQL_DROP_BREAKPOINT = "select pldbg_drop_breakpoint(?sessionid, ?obj, ?line)"; - // private static final String SQL_ATTACH_BREAKPOINT = "select - // pldbg_wait_for_breakpoint(?sessionid)"; + + private static final String SQL_CURRENT_SESSION = + "SELECT pid,usename,application_name,state,query\n" + + "FROM pg_stat_activity WHERE pid = pg_backend_pid()"; //$NON-NLS-1$ + private static final Log log = Log.getLog(PostgreDebugSession.class); /** * Create session with two description after creation session need to be * attached to postgres procedure by attach method - * - * @param sessionManagerInfo - * - manager (caller connection) description - * @param sessionDebugInfo - * - session (debugger client connection) description - * @throws DBGException */ - PostgreDebugSession(DBGBaseController controller, PostgreDebugSessionInfo sessionInfo, Object targetId) + PostgreDebugSession(DBRProgressMonitor monitor, DBGBaseController controller) throws DBGException { super(controller); - this.sessionInfo = sessionInfo; - this.targetId = targetId; + + DBPDataSource dataSource = controller.getDataSourceContainer().getDataSource(); + try { + this.connection = (JDBCExecutionContext) dataSource.openIsolatedContext(monitor, "Debug process session"); + this.controllerConnection = (JDBCExecutionContext) dataSource.openIsolatedContext(monitor, "Debug controller session"); + } catch (DBException e) { + throw new DBGException(e, dataSource); + } + + this.sessionInfo = getSessionDescriptor(monitor); + } + + public JDBCExecutionContext getConnection() { + return connection; + } + + @Override + public JDBCExecutionContext getControllerConnection() { + return controllerConnection; + } + + private PostgreDebugSessionInfo getSessionDescriptor(DBRProgressMonitor monitor) throws DBGException { + try (JDBCSession session = connection.openSession(monitor, DBCExecutionPurpose.UTIL, "Read session info")) { + try (Statement stmt = session.createStatement()) { + try (ResultSet rs = stmt.executeQuery(SQL_CURRENT_SESSION)) { + if (rs.next()) { + int pid = rs.getInt("pid"); + String usename = rs.getString("usename"); + String applicationName = rs.getString("application_name"); + String state = rs.getString("state"); + String query = rs.getString("query"); + return new PostgreDebugSessionInfo(pid, usename, applicationName, state, query); + } + throw new DBGException("Error getting session"); + } + } + } catch (SQLException e) { + throw new DBGException("SQL error", e); + } } private boolean localPortRcv(SQLWarning warn) { @@ -176,70 +197,64 @@ public class PostgreDebugSession extends DBGBaseSession { return false; } - private int attachToPort() throws DBGException { - + private int attachToPort(DBRProgressMonitor monitor) throws DBGException { + // Use controller connection String sql = SQL_ATTACH_TO_PORT.replaceAll("\\?portnumber", String.valueOf(localPortNumber)); - try (Statement stmt = getConnection().createStatement(); ResultSet rs = stmt.executeQuery(sql)) { - if (rs.next()) { - return rs.getInt(1); - } - - throw new DBGException("Error while attaching to port"); + try (JDBCSession session = getControllerConnection().openSession(monitor, DBCExecutionPurpose.UTIL, "Attach to port")) { + try (Statement stmt = session.createStatement()) { + try (ResultSet rs = stmt.executeQuery(sql)) { + if (rs.next()) { + return rs.getInt(1); + } + throw new DBGException("Error while attaching to port"); + } + } } catch (SQLException e) { throw new DBGException("Error attaching to port", e); } } - private void createSlot(Connection executionTarget, int OID) throws DBGException { + private String createSlot(DBRProgressMonitor monitor, PostgreProcedure function) throws DBGException { - String sql = SQL_PREPARE_SLOT.replaceAll("\\?objectid", String.valueOf(OID)); - try (Statement stmt = executionTarget.createStatement(); ResultSet rs = stmt.executeQuery(sql)) { - if (!rs.next()) { - throw new DBGException("Error creating target slot"); + String sql = SQL_PREPARE_SLOT.replaceAll("\\?objectid", String.valueOf(function.getObjectId())); + try (JDBCSession session = getConnection().openSession(monitor, DBCExecutionPurpose.UTIL, "Attach to port")) { + try (Statement stmt = session.createStatement()) { + try (ResultSet rs = stmt.executeQuery(sql)) { + if (!rs.next()) { + throw new DBGException("Error creating target slot"); + } + return rs.getString(1); + } } - } catch (SQLException e) { throw new DBGException("Error creating target", e); } } - private Connection createExecutionTarget() throws DBGException { - - DBPDataSource dataSource = getController().getDataSourceContainer().getDataSource(); - if (!getController().getDataSourceContainer().isConnected()) { - throw new DBGException("Not connected to database"); - } - - try { - return ((JDBCExecutionContext) dataSource.openIsolatedContext(new VoidProgressMonitor(), - "Target debug session")).getConnection(new VoidProgressMonitor()); - } catch (DBException | SQLException e) { - throw new DBGException("Error creating target session", e); - } - } - + /** + * Wait for port number passed from main executed statement + */ private void waitPortNumber() throws DBGException { int totalWait = 0; - + boolean hasStatement = false; while (totalWait < LOCAL_TIMEOT) { - try { - if (localStatement != null) { - + hasStatement = true; if (localPortRcv(localStatement.getWarnings())) { break; } - + } else if (hasStatement) { + // Statement has been closed + break; } - // Please forgive me ! Thread.sleep(LOCAL_WAIT); } catch (SQLException | InterruptedException e) { - throw new DBGException("Error rcv port number"); + throw new DBGException("Error rcv port number", e); } totalWait += LOCAL_WAIT; @@ -251,23 +266,47 @@ public class PostgreDebugSession extends DBGBaseSession { } } - protected void runProc(Connection connection, String commandSQL, String name) throws DBGException { - job = new Job(name) { + protected void runLocalProc(PostgreProcedure function, List paramValues, String name) throws DBGException { + List parameters = function.getInputParameters(); + if (parameters.size() != paramValues.size()) { + throw new DBGException("Parameter value count (" + paramValues.size() + ") doesn't match actual function parameters (" + parameters.size() + ")"); + } + Job job = new AbstractJob(name) { @Override - protected IStatus run(IProgressMonitor monitor) { - try { - try (final Statement stmt = connection.createStatement()) { - localStatement = stmt; - stmt.execute(commandSQL); - // And Now His Watch Is Ended - fireEvent(new DBGEvent(this, DBGEvent.RESUME, DBGEvent.STEP_RETURN)); + protected IStatus run(DBRProgressMonitor monitor) { + try (JDBCSession session = getConnection().openSession(monitor, DBCExecutionPurpose.USER, "Run SQL command")) { + StringBuilder query = new StringBuilder(); + query.append("{ CALL ").append(function.getFullyQualifiedName(DBPEvaluationContext.DML)).append("("); + for (int i = 0; i < parameters.size(); i++) { + if (i > 0) query.append(","); + query.append("?"); + } + query.append(") }"); + localStatement = session.prepareCall(query.toString()); + JDBCCallableStatementImpl callImpl = new JDBCCallableStatementImpl(session, localStatement, query.toString(), false); + for (int i = 0; i < parameters.size(); i++) { + PostgreProcedureParameter parameter = parameters.get(i); + String paramValue = paramValues.get(i); + DBDValueHandler valueHandler = DBUtils.findValueHandler(session, parameter); + valueHandler.bindValueObject(session, callImpl, parameter, i, paramValue); + } + localStatement.execute(); + // And Now His Watch Is Ended + fireEvent(new DBGEvent(this, DBGEvent.RESUME, DBGEvent.STEP_RETURN)); + } catch (Exception e) { + try { + if (localStatement != null) { + localStatement.close(); + localStatement = null; + } + } catch (SQLException e1) { + log.error(e1); } - } catch (SQLException e) { fireEvent(new DBGEvent(this, DBGEvent.TERMINATE, DBGEvent.CLIENT_REQUEST)); - String sqlState = e.getSQLState(); + String sqlState = e instanceof SQLException ? ((SQLException) e).getSQLState() : null; if (!PostgreConstants.EC_QUERY_CANCELED.equals(sqlState)) { log.error(name, e); - return DebugCore.newErrorStatus(name, e); + return DebugUtils.newErrorStatus(name, e); } } return Status.OK_STATUS; @@ -276,141 +315,117 @@ public class PostgreDebugSession extends DBGBaseSession { job.schedule(); } - private void attachLocal(int OID, String call) throws DBGException { + private void attachLocal(DBRProgressMonitor monitor, PostgreProcedure function, List parameters) throws DBGException { - executionTarget = createExecutionTarget(); + createSlot(monitor, function); - createSlot(executionTarget, OID); + String taskName = "PostgreSQL Debug - Local session " + sessionInfo.getID(); - String taskName = "Local attached to " + String.valueOf(targetId); - - runProc(executionTarget, call, taskName); + runLocalProc(function, parameters, taskName); waitPortNumber(); - sessionId = attachToPort(); + sessionId = attachToPort(monitor); getController().fireEvent(new DBGEvent(this, DBGEvent.SUSPEND, DBGEvent.MODEL_SPECIFIC)); - - try { - getConnection().setClientInfo("ApplicationName", "Debug Mode (local) : " + String.valueOf(sessionId)); - } catch (SQLClientInfoException e) { - log.warn("Unable to set Application name", e); - e.printStackTrace(); - } - } - private void attachGlobal(int oid, int targetPID) throws DBGException { + private void attachGlobal(DBRProgressMonitor monitor, int oid, int targetPID) throws DBGException { - try (Statement stmt = getConnection().createStatement(); ResultSet rs = stmt.executeQuery(SQL_LISTEN)) { + try (JDBCSession session = getControllerConnection().openSession(monitor, DBCExecutionPurpose.UTIL, "Attach global")) { + try (Statement stmt = session.createStatement()) { + try (ResultSet rs = stmt.executeQuery(SQL_LISTEN)) { - if (rs.next()) { - sessionId = rs.getInt("sessionid"); - getConnection().setClientInfo("ApplicationName", "Debug Mode : " + String.valueOf(sessionId)); - } else { - throw new DBGException("Unable to create debug instance"); - } + if (rs.next()) { + sessionId = rs.getInt("sessionid"); + } else { + throw new DBGException("Unable to create debug instance"); + } + } + } } catch (SQLException e) { throw new DBGException("SQL error", e); } - PostgreDebugBreakpointProperties properties = new PostgreDebugBreakpointProperties(true); - bpGlobal = new PostgreDebugBreakpointDescriptor(oid, properties); - addBreakpoint(bpGlobal); + bpGlobal = new PostgreDebugBreakpointDescriptor(oid, true); + addBreakpoint(monitor, bpGlobal); String sessionParam = String.valueOf(getSessionId()); - String taskName = sessionParam + " global attached to " + String.valueOf(targetId); + String taskName = "PostgreSQL Debug - Global session " + sessionInfo.getID(); String sql = SQL_ATTACH.replaceAll("\\?sessionid", sessionParam); DBGEvent begin = new DBGEvent(this, DBGEvent.RESUME, DBGEvent.MODEL_SPECIFIC); DBGEvent end = new DBGEvent(this, DBGEvent.SUSPEND, DBGEvent.BREAKPOINT); runAsync(sql, taskName, begin, end); - } /** * This method attach debug session to debug object (procedure) and wait * forever while target or any (depend on targetPID) session will run target * procedure - * - * @param connection - * - connection for debug session after attach this connection - * will forever belong to debug - * @param OID - * - OID for target procedure - * @param targetPID - * - target session PID (-1 for any target) - * @param global - * - is target session global - * @param call - * - SQL call for target session - * @throws DBGException */ - public void attach(JDBCExecutionContext connection, int OID, int targetPID, boolean global, String call) - throws DBGException { + public void attach(DBRProgressMonitor monitor, Map configuration) throws DBException { + if (!checkDebugPlagin(monitor)) { + throw new DBGException("PostgreSQL debug plugin is not installed on the server.\n" + + "Refer to this WIKI article for installation instructions:\n" + + "https://github.com/dbeaver/dbeaver/wiki/PGDebugger#installation"); + } - lock.writeLock().lock(); + int functionOid = CommonUtils.toInt(configuration.get(PostgreDebugConstants.ATTR_FUNCTION_OID)); + String kind = String.valueOf(configuration.get(PostgreDebugConstants.ATTR_ATTACH_KIND)); + boolean global = PostgreDebugConstants.ATTACH_KIND_GLOBAL.equals(kind); - try { + if (global) { + int processId = CommonUtils.toInt(configuration.get(PostgreDebugConstants.ATTR_ATTACH_PROCESS)); + attachKind = PostgreDebugAttachKind.GLOBAL; + attachGlobal(monitor, functionOid, processId); + } else { + attachKind = PostgreDebugAttachKind.LOCAL; + PostgreProcedure function = PostgreSqlDebugCore.resolveFunction(monitor, connection.getDataSource().getContainer(), configuration); + List parameterValues = (List) configuration.get(PostgreDebugConstants.ATTR_FUNCTION_PARAMETERS); - setConnection(connection); - - if (global) { - attachKind = PostgreDebugAttachKind.GLOBAL; - attachGlobal(OID, targetPID); - } else { - attachKind = PostgreDebugAttachKind.LOCAL; - attachLocal(OID, call); - } - - } finally { - lock.writeLock().unlock(); + attachLocal(monitor, function, parameterValues); } - } - private void detachLocal() throws DBGException { - if (!isWaiting()) { - try (Statement stmt = getConnection().createStatement()) { - String sqlCommand = composeAbortCommand(); - stmt.execute(sqlCommand); - } catch (SQLException e) { - log.error("Unable to abort target", e); - } - } - if (job != null) { - job.cancel(); - job = null; + private boolean checkDebugPlagin(DBRProgressMonitor monitor) { + try (JDBCSession session = getControllerConnection().openSession(monitor, DBCExecutionPurpose.UTIL, "Check debug plugin installation")) { + String version = JDBCUtils.executeQuery(session, SQL_CHECK_PLUGIN); + log.debug("Debug plugin is installed:\n" + version); + return true; + } catch (Exception e) { + log.debug("Debug plugin not installed: " + e.getMessage()); + return false; } - if (executionTarget != null) { - try { - executionTarget.close(); - } catch (SQLException e) { - log.error("Unable to close target session", e); - } + } + + private void detachLocal(DBRProgressMonitor monitor) throws DBGException { + try (JDBCSession session = getControllerConnection().openSession(monitor, DBCExecutionPurpose.UTIL, "Abort local session")) { + JDBCUtils.executeQuery(session, composeAbortCommand()); + } catch (SQLException e) { + log.error("Unable to abort target", e); } } - private void detachGlobal() throws DBGException { - if (!isWaiting() && !isDone()) { - try (Statement stmt = getConnection().createStatement()) { - String sql = SQL_CONTINUE.replaceAll("\\?sessionid", String.valueOf(sessionId)); - stmt.execute(sql); - } catch (SQLException e) { - log.error("Unable to abort target", e); - } + private void detachGlobal(DBRProgressMonitor monitor) throws DBGException { + removeBreakpoint(monitor, bpGlobal); + try (JDBCSession session = getControllerConnection().openSession(monitor, DBCExecutionPurpose.UTIL, "Abort global session")) { + JDBCUtils.executeQuery(session, composeAbortCommand()); + } catch (SQLException e) { + log.error("Unable to abort target", e); } - removeBreakpoint(bpGlobal); } - protected void doDetach() throws DBGException { + protected void doDetach(DBRProgressMonitor monitor) throws DBGException { switch (attachKind) { case GLOBAL: - detachGlobal(); + detachGlobal(monitor); + break; case LOCAL: - detachLocal(); + detachLocal(monitor); + break; default: + break; } } @@ -421,21 +436,20 @@ public class PostgreDebugSession extends DBGBaseSession { protected String composeAddBreakpointCommand(DBGBreakpointDescriptor descriptor) { PostgreDebugBreakpointDescriptor bp = (PostgreDebugBreakpointDescriptor) descriptor; - PostgreDebugBreakpointProperties bpd = (PostgreDebugBreakpointProperties) bp.getProperties(); - String sqlPattern = bpd.isGlobal() ? SQL_SET_GLOBAL_BREAKPOINT : SQL_SET_BREAKPOINT; + String sqlPattern = bp.isGlobal() ? SQL_SET_GLOBAL_BREAKPOINT : SQL_SET_BREAKPOINT; String sqlCommand = sqlPattern.replaceAll("\\?sessionid", String.valueOf(getSessionId())) .replaceAll("\\?obj", String.valueOf(descriptor.getObjectId())) - .replaceAll("\\?line", bpd.isOnStart() ? "-1" : String.valueOf(bpd.getLineNo())) - .replaceAll("\\?target", bpd.isAll() ? "null" : String.valueOf(bpd.getTargetId())); + .replaceAll("\\?line", bp.isOnStart() ? "-1" : String.valueOf(bp.getLineNo())) + .replaceAll("\\?target", bp.isAll() ? "null" : String.valueOf(bp.getTargetId())); return sqlCommand; } - protected String composeRemoveBreakpointCommand(DBGBreakpointDescriptor bp) { - PostgreDebugBreakpointProperties properties = (PostgreDebugBreakpointProperties) bp.getProperties(); + protected String composeRemoveBreakpointCommand(DBGBreakpointDescriptor breakpointDescriptor) { + PostgreDebugBreakpointDescriptor bp = (PostgreDebugBreakpointDescriptor) breakpointDescriptor; String sqlCommand = SQL_DROP_BREAKPOINT.replaceAll("\\?sessionid", String.valueOf(getSessionId())) .replaceAll("\\?obj", String.valueOf(bp.getObjectId())) - .replaceAll("\\?line", properties.isOnStart() ? "-1" : String.valueOf(properties.getLineNo())); + .replaceAll("\\?line", bp.isOnStart() ? "-1" : String.valueOf(bp.getLineNo())); return sqlCommand; } @@ -455,6 +469,21 @@ public class PostgreDebugSession extends DBGBaseSession { } + @Override + public void execStepReturn() throws DBGException { + throw new DBGException("Exec return not implemented"); + } + + @Override + public void resume() throws DBGException { + execContinue(); + } + + @Override + public void suspend() throws DBGException { + throw new DBGException("Suspend not implemented"); + } + /** * Execute step SQL command asynchronously, set debug session name to * [sessionID] name [managerPID] @@ -463,22 +492,13 @@ public class PostgreDebugSession extends DBGBaseSession { * - SQL command for execute step * @param nameParameter * - session 'name' part - * @throws DBGException */ public void execStep(String commandPattern, String nameParameter, int eventDetail) throws DBGException { - - acquireWriteLock(); - - try { - String sql = commandPattern.replaceAll("\\?sessionid", String.valueOf(sessionId)); - String taskName = String.valueOf(sessionId) + nameParameter + String.valueOf(targetId); - DBGEvent begin = new DBGEvent(this, DBGEvent.RESUME, eventDetail); - DBGEvent end = new DBGEvent(this, DBGEvent.SUSPEND, eventDetail); - runAsync(sql, taskName, begin, end); - } finally { - lock.writeLock().unlock(); - } - + String sql = commandPattern.replaceAll("\\?sessionid", String.valueOf(sessionId)); + String taskName = String.valueOf(sessionId) + nameParameter + sessionInfo.getID(); + DBGEvent begin = new DBGEvent(this, DBGEvent.RESUME, eventDetail); + DBGEvent end = new DBGEvent(this, DBGEvent.SUSPEND, eventDetail); + runAsync(sql, taskName, begin, end); } protected String composeAbortCommand() { @@ -486,33 +506,36 @@ public class PostgreDebugSession extends DBGBaseSession { } @Override - public List> getVariables() throws DBGException { - - acquireReadLock(); + public List> getVariables(DBGStackFrame stack) throws DBGException { + if (stack != null) { + selectFrame(stack.getLevel()); + } List> vars = new ArrayList<>(); String sql = SQL_GET_VARS.replaceAll("\\?sessionid", String.valueOf(sessionId)); - try (Statement stmt = getConnection().createStatement(); ResultSet rs = stmt.executeQuery(sql)) { - - while (rs.next()) { - String name = rs.getString("name"); - String varclass = rs.getString("varclass"); - int linenumber = rs.getInt("linenumber"); - boolean isunique = rs.getBoolean("isunique"); - boolean isconst = rs.getBoolean("isconst"); - boolean isnotnull = rs.getBoolean("isnotnull"); - int dtype = rs.getInt("dtype"); - String value = rs.getString("value"); - PostgreDebugVariable var = new PostgreDebugVariable(name, varclass, linenumber, isunique, isconst, - isnotnull, dtype, value); - vars.add(var); - } + try (JDBCSession session = getControllerConnection().openSession(new VoidProgressMonitor(), DBCExecutionPurpose.UTIL, "Read debug variables")) { + try (Statement stmt = session.createStatement()) { + try (ResultSet rs = stmt.executeQuery(sql)) { + + while (rs.next()) { + String name = rs.getString("name"); + String varclass = rs.getString("varclass"); + int linenumber = rs.getInt("linenumber"); + boolean isunique = rs.getBoolean("isunique"); + boolean isconst = rs.getBoolean("isconst"); + boolean isnotnull = rs.getBoolean("isnotnull"); + int dtype = rs.getInt("dtype"); + String value = rs.getString("value"); + PostgreDebugVariable var = new PostgreDebugVariable(name, varclass, linenumber, isunique, isconst, + isnotnull, dtype, value); + vars.add(var); + } + } + } } catch (SQLException e) { throw new DBGException("SQL error", e); - } finally { - lock.readLock().unlock(); } return vars; @@ -522,63 +545,58 @@ public class PostgreDebugSession extends DBGBaseSession { @Override public void setVariableVal(DBGVariable variable, Object value) throws DBGException { - acquireReadLock(); + try (JDBCSession session = getControllerConnection().openSession(new VoidProgressMonitor(), DBCExecutionPurpose.UTIL, "Set debug variable")) { + try (PreparedStatement stmt = session.prepareStatement(SQL_SET_VAR)) { - try (PreparedStatement stmt = getConnection().prepareStatement(SQL_SET_VAR)) { + if (variable instanceof PostgreDebugVariable) { - if (variable instanceof PostgreDebugVariable) { + if (value instanceof String) { - if (value instanceof String) { + PostgreDebugVariable var = (PostgreDebugVariable) variable; - PostgreDebugVariable var = (PostgreDebugVariable) variable; + stmt.setInt(1, sessionId); + stmt.setString(2, var.getName()); + stmt.setInt(3, var.getLineNumber()); + stmt.setString(4, (String) value); - stmt.setInt(1, sessionId); - stmt.setString(2, var.getName()); - stmt.setInt(3, var.getLineNumber()); - stmt.setString(4, (String) value); + stmt.execute(); - stmt.execute(); + } else { + throw new DBGException("Incorrect variable value class"); + } } else { - lock.readLock().unlock(); - throw new DBGException("Incorrect variable value class"); + throw new DBGException("Incorrect variable class"); } - - } else { - lock.readLock().unlock(); - throw new DBGException("Incorrect variable class"); } } catch (SQLException e) { throw new DBGException("SQL error", e); - } finally { - lock.readLock().unlock(); } - } @Override public List getStack() throws DBGException { - acquireReadLock(); - - List stack = new ArrayList(1); + List stack = new ArrayList<>(1); String sql = SQL_GET_STACK.replaceAll("\\?sessionid", String.valueOf(getSessionId())); - try (Statement stmt = getConnection().createStatement(); ResultSet rs = stmt.executeQuery(sql)) { - while (rs.next()) { - int level = rs.getInt("level"); - String targetname = rs.getString("targetname"); - int func = rs.getInt("func"); - int linenumber = rs.getInt("linenumber"); - String args = rs.getString("args"); - PostgreDebugStackFrame frame = new PostgreDebugStackFrame(level, targetname, func, linenumber, args); - stack.add(frame); - } + try (JDBCSession session = getControllerConnection().openSession(new VoidProgressMonitor(), DBCExecutionPurpose.UTIL, "Get debug stack frame")) { + try (Statement stmt = session.createStatement()) { + try (ResultSet rs = stmt.executeQuery(sql)) { + while (rs.next()) { + int level = rs.getInt("level"); + String targetname = rs.getString("targetname"); + int func = rs.getInt("func"); + int linenumber = rs.getInt("linenumber"); + String args = rs.getString("args"); + PostgreDebugStackFrame frame = new PostgreDebugStackFrame(level, targetname, func, linenumber, args); + stack.add(frame); + } + } + } } catch (SQLException e) { throw new DBGException("SQL error", e); - } finally { - lock.readLock().unlock(); } return stack; } @@ -600,27 +618,20 @@ public class PostgreDebugSession extends DBGBaseSession { */ public String getSource(int OID) throws DBGException { - - acquireReadLock(); - - String src = ""; - String sql = SQL_GET_SRC.replaceAll("\\?sessionid", String.valueOf(sessionId)).replaceAll("\\?oid", String.valueOf(OID)); - try (Statement stmt = getConnection().createStatement(); ResultSet rs = stmt.executeQuery(sql)) { - - while (rs.next()) { - src = rs.getString(1); + try (JDBCSession session = getControllerConnection().openSession(new VoidProgressMonitor(), DBCExecutionPurpose.UTIL, "Get session source")) { + try (Statement stmt = session.createStatement()) { + try (ResultSet rs = stmt.executeQuery(sql)) { + if (rs.next()) { + return rs.getString(1); + } + return null; + } } - } catch (SQLException e) { throw new DBGException("SQL error", e); - } finally { - lock.readLock().unlock(); } - - return src; - } /** @@ -636,37 +647,30 @@ public class PostgreDebugSession extends DBGBaseSession { * * The debugger focus remains on the selected frame until you change it or * the target stops at another breakpoint. - * - * @return DBGStackFrame */ public void selectFrame(int frameNumber) throws DBGException { - - acquireReadLock(); - - String pattern = SQL_SELECT_FRAME; - pattern = "select * from pldbg_select_frame(?sessionid,?frameno)"; - String sql = pattern.replaceAll("\\?sessionid", String.valueOf(sessionId)).replaceAll("\\?frameno", + String sql = SQL_SELECT_FRAME.replaceAll("\\?sessionid", String.valueOf(sessionId)).replaceAll("\\?frameno", String.valueOf(frameNumber)); - try (Statement stmt = getConnection().createStatement(); ResultSet rs = stmt.executeQuery(sql)) { + try (JDBCSession session = getControllerConnection().openSession(new VoidProgressMonitor(), DBCExecutionPurpose.UTIL, "Select debug frame")) { + try (Statement stmt = session.createStatement()) { + try (ResultSet rs = stmt.executeQuery(sql)) { + if (!rs.next()) { + throw new DBGException("Unable to select frame"); + } - if (!rs.next()) { - throw new DBGException("Unable to select frame"); + } } - } catch (SQLException e) { throw new DBGException("SQL error", e); - } finally { - lock.readLock().unlock(); } - } @Override public String toString() { return "PostgreDebugSession " + (isWaiting() ? "WAITING" : "READY") + " [sessionId=" + sessionId - + ", breakpoints=" + getBreakpoints() + "targetId=(" + targetId + ") Session=(" + sessionInfo.toString() + + ", breakpoints=" + getBreakpoints() + "targetId=(" + sessionInfo.getID() + ") Session=(" + sessionInfo.toString() + ") " + "]"; } @@ -675,6 +679,21 @@ public class PostgreDebugSession extends DBGBaseSession { return sessionId; } + @Override + public boolean canStepInto() { + return true; + } + + @Override + public boolean canStepOver() { + return true; + } + + @Override + public boolean canStepReturn() { + return true; + } + /** * Return true if debug session up and running on server * @@ -683,7 +702,7 @@ public class PostgreDebugSession extends DBGBaseSession { public boolean isAttached() { switch (attachKind) { case GLOBAL: - return super.isAttached() && (sessionId > 0); + return connection != null && (sessionId > 0); case LOCAL: return sessionId > 0; default: @@ -700,29 +719,26 @@ public class PostgreDebugSession extends DBGBaseSession { */ public boolean isDone() { switch (attachKind) { - case GLOBAL: - if (task == null) { - return true; + case GLOBAL: + return workerJob == null || workerJob.isFinished(); + case LOCAL: + return sessionId > 0; + default: + return false; + } + } + + @Override + public void closeSession(DBRProgressMonitor monitor) throws DBGException { + try { + super.closeSession(monitor); + } finally { + if (connection != null) { + IOUtils.close(connection); } - if (task.isDone()) { - try { - task.get(); - } catch (InterruptedException e) { - log.error("DEBUG INTERRUPT ERROR ", e); - return false; - } catch (ExecutionException e) { - log.error("DEBUG WARNING ", e); - return false; - } - return true; + if (controllerConnection != null) { + IOUtils.close(controllerConnection); } - return false; - - case LOCAL: - return sessionId > 0; - - default: - return false; } } diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/META-INF/MANIFEST.MF index c7135dec0982224b5de4bf7d702ece432d9cf0c1..19e5379fcc58152f70d2ca79b09d4bfaa004a053 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/META-INF/MANIFEST.MF +++ b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.ext.postgresql.debug.ui;singleton:=true -Bundle-Version: 1.0.11 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.12 +Bundle-Release-Date: 20180514 Bundle-Vendor: %Bundle-Vendor Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Require-Bundle: org.eclipse.core.runtime, diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/OSGI-INF/l10n/bundle.properties b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/OSGI-INF/l10n/bundle.properties index 823a1a833701271bbf9a999e5450edc06e5a34b5..5ddbde6476bd124bae265e8bdbdf712d28e32a6e 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/OSGI-INF/l10n/bundle.properties +++ b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/OSGI-INF/l10n/bundle.properties @@ -18,29 +18,3 @@ Bundle-Vendor = JKISS Bundle-Name = DBeaver PostgreSQL Debug UI - -launchConfigurationTabGroups.launchConfigurationTabGroup.pgSQL.description=Settings of PL/pgSQL debug launch -launchConfigurationTabGroups.launchConfigurationTabGroup.launchMode.pgSQL.debug.description=Create a configuration to debug PL/pgSQL procedures - -launchShortcuts.shortcut.pgSQL.global.label=PL/pgSQL (Global) -launchShortcuts.shortcut.pgSQL.global.description=PL/pgSQL global debug for PostgreSQL procedures - -launchShortcuts.shortcut.pgSQL.local.label=PL/pgSQL (Local) -launchShortcuts.shortcut.pgSQL.local.description=PL/pgSQL local debug for PostgreSQL procedures - -launchGroups.launchGroup.pgSQL.label = PL/pgSQL Debug -launchGroups.launchGroup.pgSQL.title = Select or configure PL/pgSQL procedure to debug - -actions.ManageBreakpointRulerAction.label = Toggle &Breakpoint - -actionSets.actionSet.pgSQL.label=PL/pgSQL Debug -actionSets.actionSet.menu.debug.label=Debug -actionSets.action.pgSQLMenu.label=PL/pgSQL -actionSets.action.pgSQLToolbar.label=PL/pgSQL -actionSets.action.pgSQLToolbar.tooltip=Debug Last PL/pgSQL -actionSets.action.pgSQLConfigurations.label=PL/pgSQL ... - -commands.command.pgSQLMenuDelegateToolbar.name=Debug Last Launched PL/pgSQL Procedure -commands.command.pgSQLMenuDelegateToolbar.description=Debugs the last launched PL/pgSQL procedure -commands.command.pgSQLConfigurations.name=PL/pgSQL ... -commands.command.pgSQLConfigurations.description=Open PL/pgSQL procedure launch configuration dialog diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/plugin.xml b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/plugin.xml index a025fe83828659887bb27c612a8634ca5c685583..839ad84716a6645f9394fee6c0f5b895c5f57474 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/plugin.xml +++ b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/plugin.xml @@ -18,212 +18,48 @@ * limitations under the License. --> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/pom.xml b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/pom.xml index b97ce1787099580f13263a8cbb0956c63fa942d7..37ff16ca84f135cd61651ecbac559860eb0dfffd 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/pom.xml +++ b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/pom.xml @@ -9,6 +9,6 @@ ../../ org.jkiss.dbeaver.ext.postgresql.debug.ui - 1.0.11 + 1.0.12 eclipse-plugin diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/src/org/jkiss/dbeaver/ext/postgresql/debug/ui/PostgreSqlDebugUi.java b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/src/org/jkiss/dbeaver/ext/postgresql/debug/ui/PostgreSqlDebugUi.java deleted file mode 100644 index c84826bec296082fb89a6fb6efbc0d45dbfbc29a..0000000000000000000000000000000000000000 --- a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/src/org/jkiss/dbeaver/ext/postgresql/debug/ui/PostgreSqlDebugUi.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * DBeaver - Universal Database Manager - * Copyright (C) 2010-2018 Serge Rider (serge@jkiss.org) - * Copyright (C) 2017-2018 Alexander Fedorov (alexander.fedorov@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.debug.ui; - -public class PostgreSqlDebugUi { - - public static final String BUNDLE_SYMBOLIC_NAME = "org.jkiss.dbeaver.ext.postgresql.debug.ui"; //$NON-NLS-1$ - - public static final String DEBUG_PGSQL_DEBUG_AS_MENU_ID = "org.jkiss.dbeaver.debug.ui.menus.menuContribution.procedure"; //$NON-NLS-1$ - - public static final String DEBUG_PGSQL_LAUNCH_GROUP_ID = "org.jkiss.dbeaver.ext.postgresql.debug.ui.launchGroups.launchGroup.pgSQL"; //$NON-NLS-1$ - - public static final String DEBUG_PGSQL_OPEN_CONFIGURATIONS_COMMAND_ID = "org.jkiss.dbeaver.ext.postgresql.debug.ui.commands.command.pgSQLConfigurations"; //$NON-NLS-1$ - -} diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/src/org/jkiss/dbeaver/ext/postgresql/debug/ui/internal/PgSqlDebugContributionFactory.java b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/src/org/jkiss/dbeaver/ext/postgresql/debug/ui/internal/PgSqlDebugContributionFactory.java deleted file mode 100644 index 3d758d149f66a13d525a28ced8d8e96835f5819a..0000000000000000000000000000000000000000 --- a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/src/org/jkiss/dbeaver/ext/postgresql/debug/ui/internal/PgSqlDebugContributionFactory.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * DBeaver - Universal Database Manager - * Copyright (C) 2010-2018 Serge Rider (serge@jkiss.org) - * Copyright (C) 2017-2018 Alexander Fedorov (alexander.fedorov@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.debug.ui.internal; - -import org.eclipse.debug.ui.DebugUITools; -import org.eclipse.debug.ui.IDebugUIConstants; -import org.jkiss.dbeaver.debug.ui.DatabaseLaunchContributionFactory; -import org.jkiss.dbeaver.debug.ui.DatabaseLaunchContributionItem; -import org.jkiss.dbeaver.ext.postgresql.debug.ui.PostgreSqlDebugUi; - -public class PgSqlDebugContributionFactory extends DatabaseLaunchContributionFactory { - - public PgSqlDebugContributionFactory() { - super(PostgreSqlDebugUi.DEBUG_PGSQL_DEBUG_AS_MENU_ID); - setText("PL/pgSQL Debug"); - setImageDescriptor(DebugUITools.getImageDescriptor(IDebugUIConstants.IMG_ACT_DEBUG)); - } - - @Override - protected DatabaseLaunchContributionItem createContributionItem() { - return new PgSqlDebugContributionItem(); - } - -} diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/src/org/jkiss/dbeaver/ext/postgresql/debug/ui/internal/PgSqlGlobalLaunchShortcut.java b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/src/org/jkiss/dbeaver/ext/postgresql/debug/ui/internal/PgSqlGlobalLaunchShortcut.java deleted file mode 100644 index 6057829e7cb846069a94e0a53e6dfc9fd07c6478..0000000000000000000000000000000000000000 --- a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/src/org/jkiss/dbeaver/ext/postgresql/debug/ui/internal/PgSqlGlobalLaunchShortcut.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * DBeaver - Universal Database Manager - * Copyright (C) 2010-2018 Serge Rider (serge@jkiss.org) - * Copyright (C) 2017-2018 Alexander Fedorov (alexander.fedorov@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.debug.ui.internal; - -import java.util.Map; - -import org.eclipse.core.runtime.CoreException; -import org.eclipse.debug.core.ILaunchConfiguration; -import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; -import org.eclipse.jface.dialogs.IDialogConstants; -import org.eclipse.jface.dialogs.IInputValidator; -import org.eclipse.jface.dialogs.InputDialog; -import org.jkiss.dbeaver.debug.DBGController; -import org.jkiss.dbeaver.debug.core.DebugCore; -import org.jkiss.dbeaver.debug.ui.DatabaseLaunchShortcut; -import org.jkiss.dbeaver.ext.postgresql.debug.core.PostgreSqlDebugCore; -import org.jkiss.dbeaver.model.struct.DBSObject; - -public class PgSqlGlobalLaunchShortcut extends DatabaseLaunchShortcut { - - public PgSqlGlobalLaunchShortcut() { - super(PostgreSqlDebugCore.CONFIGURATION_TYPE, PostgreDebugUIMessages.PgSqlLaunchShortcut_name); - } - - @Override - protected ILaunchConfiguration createConfiguration(DBSObject launchable) throws CoreException { - ILaunchConfigurationWorkingCopy workingCopy = PostgreSqlDebugCore.createConfiguration(launchable); - workingCopy.setAttribute(DebugCore.ATTR_ATTACH_KIND, DBGController.ATTACH_KIND_GLOBAL); - String pid = workingCopy.getAttribute(DebugCore.ATTR_ATTACH_PROCESS, DebugCore.ATTR_ATTACH_PROCESS_DEFAULT); - String dialogTitle = "Specify PID"; - String dialogMessage = "Specify PID to attach. Use '-1' to allow any PID"; - InputDialog dialog = new InputDialog(getShell(), dialogTitle, dialogMessage, pid, new IInputValidator() { - - @Override - public String isValid(String newText) { - String error = "PID should be positive number or '-1' for any PID"; - try { - Integer integer = Integer.parseInt(newText); - if (integer < -1) { - return error; - } - } catch (Exception e) { - return error; - } - return null; - } - }); - dialog.create(); - int open = dialog.open(); - if (IDialogConstants.CANCEL_ID == open) { - return null; - } - String modified = dialog.getValue(); - workingCopy.setAttribute(DebugCore.ATTR_ATTACH_PROCESS, modified); - return workingCopy.doSave(); - } - - @Override - protected boolean isCandidate(ILaunchConfiguration config, DBSObject launchable, - Map databaseContext) { - String kind = DebugCore.extractAttachKind(config); - if (!DBGController.ATTACH_KIND_GLOBAL.equals(kind)) { - return false; - } - return super.isCandidate(config, launchable, databaseContext); - } - -} diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/src/org/jkiss/dbeaver/ext/postgresql/debug/ui/internal/PgSqlLocalLaunchShortcut.java b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/src/org/jkiss/dbeaver/ext/postgresql/debug/ui/internal/PgSqlLocalLaunchShortcut.java deleted file mode 100644 index 08ad53485b53694e4918942e4393d7f39ae722f5..0000000000000000000000000000000000000000 --- a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/src/org/jkiss/dbeaver/ext/postgresql/debug/ui/internal/PgSqlLocalLaunchShortcut.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * DBeaver - Universal Database Manager - * Copyright (C) 2010-2018 Serge Rider (serge@jkiss.org) - * Copyright (C) 2017-2018 Alexander Fedorov (alexander.fedorov@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.debug.ui.internal; - -import java.util.Map; - -import org.eclipse.core.runtime.CoreException; -import org.eclipse.debug.core.ILaunchConfiguration; -import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; -import org.eclipse.jface.dialogs.IDialogConstants; -import org.eclipse.ui.IWorkbenchPartSite; -import org.jkiss.dbeaver.debug.DBGController; -import org.jkiss.dbeaver.debug.core.DebugCore; -import org.jkiss.dbeaver.debug.ui.DatabaseLaunchShortcut; -import org.jkiss.dbeaver.debug.ui.DatabaseScriptDialog; -import org.jkiss.dbeaver.ext.postgresql.debug.core.PostgreSqlDebugCore; -import org.jkiss.dbeaver.model.struct.DBSObject; - -public class PgSqlLocalLaunchShortcut extends DatabaseLaunchShortcut { - - public PgSqlLocalLaunchShortcut() { - super(PostgreSqlDebugCore.CONFIGURATION_TYPE, PostgreDebugUIMessages.PgSqlLaunchShortcut_name); - } - - @Override - protected ILaunchConfiguration createConfiguration(DBSObject launchable) throws CoreException { - ILaunchConfigurationWorkingCopy workingCopy = PostgreSqlDebugCore.createConfiguration(launchable); - workingCopy.setAttribute(DebugCore.ATTR_ATTACH_KIND, DBGController.ATTACH_KIND_LOCAL); - IWorkbenchPartSite site = getWorkbenchPartSite(); - String script = workingCopy.getAttribute(DebugCore.ATTR_SCRIPT_TEXT, DebugCore.ATTR_SCRIPT_TEXT_DEFAULT); - String inputName = "Script"; - DatabaseScriptDialog dialog = new DatabaseScriptDialog(getShell(), site, inputName, script, launchable); - dialog.create(); - - dialog.setTitle("Specify script to be executed"); - dialog.setMessage("Specify script to be executed to start debug."); - int open = dialog.open(); - if (IDialogConstants.CANCEL_ID == open) { - return null; - } - String modified = dialog.getScriptTextValue(); - workingCopy.setAttribute(DebugCore.ATTR_SCRIPT_TEXT, modified); - return workingCopy.doSave(); - } - - @Override - protected boolean isCandidate(ILaunchConfiguration config, DBSObject launchable, - Map databaseContext) { - String kind = DebugCore.extractAttachKind(config); - if (!DBGController.ATTACH_KIND_LOCAL.equals(kind)) { - return false; - } - return super.isCandidate(config, launchable, databaseContext); - } - -} diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/src/org/jkiss/dbeaver/ext/postgresql/debug/ui/internal/PgSqlOpenLaunchDialogAction.java b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/src/org/jkiss/dbeaver/ext/postgresql/debug/ui/internal/PgSqlOpenLaunchDialogAction.java deleted file mode 100644 index 4311bcfa5451a3ca0c786d11178743f667eab3c1..0000000000000000000000000000000000000000 --- a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/src/org/jkiss/dbeaver/ext/postgresql/debug/ui/internal/PgSqlOpenLaunchDialogAction.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * DBeaver - Universal Database Manager - * Copyright (C) 2010-2018 Serge Rider (serge@jkiss.org) - * Copyright (C) 2017-2018 Alexander Fedorov (alexander.fedorov@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.debug.ui.internal; - -import org.eclipse.debug.ui.actions.OpenLaunchDialogAction; -import org.jkiss.dbeaver.ext.postgresql.debug.ui.PostgreSqlDebugUi; - -public class PgSqlOpenLaunchDialogAction extends OpenLaunchDialogAction { - - public PgSqlOpenLaunchDialogAction() { - super(PostgreSqlDebugUi.DEBUG_PGSQL_LAUNCH_GROUP_ID); - setActionDefinitionId(PostgreSqlDebugUi.DEBUG_PGSQL_OPEN_CONFIGURATIONS_COMMAND_ID); - } - -} diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/src/org/jkiss/dbeaver/ext/postgresql/debug/ui/internal/PostgreDebugObjectAdapterFactory.java b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/src/org/jkiss/dbeaver/ext/postgresql/debug/ui/internal/PostgreDebugObjectAdapterFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..7577991243fc0e830c992021382f20c88977a408 --- /dev/null +++ b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/src/org/jkiss/dbeaver/ext/postgresql/debug/ui/internal/PostgreDebugObjectAdapterFactory.java @@ -0,0 +1,60 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2018 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.debug.ui.internal; + +import org.eclipse.core.runtime.IAdapterFactory; +import org.jkiss.dbeaver.debug.DBGDebugObject; +import org.jkiss.dbeaver.ext.postgresql.model.PostgreProcedure; +import org.jkiss.dbeaver.ext.postgresql.ui.editors.PostgreSourceViewEditor; +import org.jkiss.dbeaver.model.navigator.DBNDatabaseNode; +import org.jkiss.dbeaver.ui.editors.IDatabaseEditorInput; + +public class PostgreDebugObjectAdapterFactory implements IAdapterFactory { + + private static final Class[] CLASSES = new Class[] { DBGDebugObject.class }; + + private static final DBGDebugObject DEBUG_OBJECT = new DBGDebugObject() { + }; + + @Override + public T getAdapter(Object adaptableObject, Class adapterType) { + if (adapterType == DBGDebugObject.class) { + if (adaptableObject instanceof PostgreSourceViewEditor && + ((PostgreSourceViewEditor) adaptableObject).getSourceObject() instanceof PostgreProcedure) + { + return adapterType.cast(DEBUG_OBJECT); + } + if (adaptableObject instanceof IDatabaseEditorInput && + ((IDatabaseEditorInput) adaptableObject).getDatabaseObject() instanceof PostgreProcedure) + { + return adapterType.cast(DEBUG_OBJECT); + } + if (adaptableObject instanceof DBNDatabaseNode && + ((DBNDatabaseNode) adaptableObject).getObject() instanceof PostgreProcedure) + { + return adapterType.cast(DEBUG_OBJECT); + } + } + return null; + } + + @Override + public Class[] getAdapterList() { + return CLASSES; + } + +} diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/src/org/jkiss/dbeaver/ext/postgresql/debug/ui/internal/PostgreDebugPanelFunction.java b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/src/org/jkiss/dbeaver/ext/postgresql/debug/ui/internal/PostgreDebugPanelFunction.java new file mode 100644 index 0000000000000000000000000000000000000000..c53a09f079e7db6223382cbaba621e98a554166a --- /dev/null +++ b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/src/org/jkiss/dbeaver/ext/postgresql/debug/ui/internal/PostgreDebugPanelFunction.java @@ -0,0 +1,296 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2018 Serge Rider (serge@jkiss.org) + * Copyright (C) 2017-2018 Alexander Fedorov (alexander.fedorov@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.debug.ui.internal; + +import org.eclipse.jface.viewers.LabelProvider; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.widgets.*; +import org.jkiss.dbeaver.DBException; +import org.jkiss.dbeaver.core.DBeaverCore; +import org.jkiss.dbeaver.debug.ui.DBGConfigurationPanel; +import org.jkiss.dbeaver.debug.ui.DBGConfigurationPanelContainer; +import org.jkiss.dbeaver.ext.postgresql.debug.PostgreDebugConstants; +import org.jkiss.dbeaver.ext.postgresql.debug.core.PostgreSqlDebugCore; +import org.jkiss.dbeaver.ext.postgresql.model.*; +import org.jkiss.dbeaver.model.DBIcon; +import org.jkiss.dbeaver.model.DBPDataSourceContainer; +import org.jkiss.dbeaver.model.navigator.DBNDatabaseNode; +import org.jkiss.dbeaver.model.navigator.DBNModel; +import org.jkiss.dbeaver.model.navigator.DBNNode; +import org.jkiss.dbeaver.model.struct.DBSInstance; +import org.jkiss.dbeaver.model.struct.DBSObjectContainer; +import org.jkiss.dbeaver.model.struct.rdb.DBSProcedureParameter; +import org.jkiss.dbeaver.ui.DBeaverIcons; +import org.jkiss.dbeaver.ui.UIUtils; +import org.jkiss.dbeaver.ui.controls.CSmartCombo; +import org.jkiss.dbeaver.ui.controls.CSmartSelector; +import org.jkiss.dbeaver.ui.controls.CustomTableEditor; +import org.jkiss.dbeaver.ui.dialogs.BrowseObjectDialog; +import org.jkiss.utils.CommonUtils; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class PostgreDebugPanelFunction implements DBGConfigurationPanel { + + private DBGConfigurationPanelContainer container; + private Button kindLocal; + private Button kindGlobal; + private CSmartCombo functionCombo; + private Text processIdText; + + private PostgreProcedure selectedFunction; + private Map parameterValues = new HashMap<>(); + private Table parametersTable; + + @Override + public void createPanel(Composite parent, DBGConfigurationPanelContainer container) { + this.container = container; + + { + Group kindGroup = UIUtils.createControlGroup(parent, "Attach type", 2, GridData.HORIZONTAL_ALIGN_BEGINNING, SWT.DEFAULT); + + SelectionListener listener = new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + processIdText.setEnabled(kindGlobal.getSelection()); + parametersTable.setEnabled(kindLocal.getSelection()); + container.updateDialogState(); + } + }; + + kindLocal = new Button(kindGroup, SWT.RADIO); + kindLocal.setText("Local"); + kindLocal.addSelectionListener(listener); + kindGlobal = new Button(kindGroup, SWT.RADIO); + kindGlobal.setText("Global"); + kindGlobal.addSelectionListener(listener); + } + createFunctionGroup(parent); + createParametersGroup(parent); + } + + private void createFunctionGroup(Composite parent) { + Group functionGroup = UIUtils.createControlGroup(parent, "Function", 2, GridData.VERTICAL_ALIGN_BEGINNING, SWT.DEFAULT); + UIUtils.createControlLabel(functionGroup, "Function"); + functionCombo = new CSmartSelector(functionGroup, SWT.BORDER | SWT.DROP_DOWN | SWT.READ_ONLY, new LabelProvider() { + @Override + public Image getImage(Object element) { + return DBeaverIcons.getImage(DBIcon.TREE_PROCEDURE); + } + + @Override + public String getText(Object element) { + if (element == null) { + return "N/A"; + } + return ((PostgreProcedure)element).getFullQualifiedSignature(); + } + }) { + @Override + protected void dropDown(boolean drop) { + if (drop) { + DBNModel navigatorModel = DBeaverCore.getInstance().getNavigatorModel(); + DBNDatabaseNode dsNode = navigatorModel.getNodeByObject(container.getDataSource()); + if (dsNode != null) { + DBNNode curNode = selectedFunction == null ? null : navigatorModel.getNodeByObject(selectedFunction); + DBNNode node = BrowseObjectDialog.selectObject( + parent.getShell(), + "Select function to debug", + dsNode, + curNode, + new Class[]{DBSInstance.class, DBSObjectContainer.class, PostgreProcedure.class}, + new Class[]{PostgreProcedure.class}); + if (node instanceof DBNDatabaseNode && ((DBNDatabaseNode) node).getObject() instanceof PostgreProcedure) { + functionCombo.removeAll(); + selectedFunction = (PostgreProcedure) ((DBNDatabaseNode) node).getObject(); + functionCombo.addItem(selectedFunction); + functionCombo.select(selectedFunction); + updateParametersTable(); + container.updateDialogState(); + } + parametersTable.setEnabled(selectedFunction != null); + } + } + + } + }; + functionCombo.addItem(null); + GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING); + gd.widthHint = UIUtils.getFontHeight(functionCombo) * 40 + 10; + functionCombo.setLayoutData(gd); + + processIdText = UIUtils.createLabelText(functionGroup, "Process ID", "", SWT.BORDER, new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING)); + gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING); + gd.widthHint = UIUtils.getFontHeight(processIdText) * 10 + 10; + processIdText.setLayoutData(gd); + } + + private void createParametersGroup(Composite parent) { + Group composite = UIUtils.createControlGroup(parent, "Function parameters", 2, GridData.FILL_BOTH, SWT.DEFAULT); + + parametersTable = new Table(composite, SWT.SINGLE | SWT.FULL_SELECTION | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL); + final GridData gd = new GridData(GridData.FILL_BOTH); + parametersTable.setLayoutData(gd); + parametersTable.setHeaderVisible(true); + parametersTable.setLinesVisible(true); + + final TableColumn nameColumn = UIUtils.createTableColumn(parametersTable, SWT.LEFT, "Name"); + nameColumn.setWidth(100); + final TableColumn valueColumn = UIUtils.createTableColumn(parametersTable, SWT.LEFT, "Value"); + valueColumn.setWidth(200); + final TableColumn typeColumn = UIUtils.createTableColumn(parametersTable, SWT.LEFT, "Type"); + typeColumn.setWidth(60); + final TableColumn kindColumn = UIUtils.createTableColumn(parametersTable, SWT.LEFT, "Kind"); + kindColumn.setWidth(40); + + new CustomTableEditor(parametersTable) { + { + firstTraverseIndex = 1; + lastTraverseIndex = 1; + editOnEnter = false; + } + @Override + protected Control createEditor(Table table, int index, TableItem item) { + if (index != 1) { + return null; + } + DBSProcedureParameter param = (DBSProcedureParameter) item.getData(); + Text editor = new Text(table, SWT.BORDER); + editor.setText(CommonUtils.toString(parameterValues.get(param), "")); + editor.selectAll(); + return editor; + } + @Override + protected void saveEditorValue(Control control, int index, TableItem item) { + DBSProcedureParameter param = (DBSProcedureParameter) item.getData(); + String newValue = ((Text) control).getText(); + item.setText(1, newValue); + + parameterValues.put(param, newValue); + container.updateDialogState(); + } + }; + } + + @Override + public void loadConfiguration(DBPDataSourceContainer dataSource, Map configuration) { + Object kind = configuration.get(PostgreDebugConstants.ATTR_ATTACH_KIND); + boolean isGlobal = PostgreDebugConstants.ATTACH_KIND_GLOBAL.equals(kind); + kindGlobal.setSelection(isGlobal); + kindLocal.setSelection(!isGlobal); + + Object processId = configuration.get(PostgreDebugConstants.ATTR_ATTACH_PROCESS); + processIdText.setText(processId == null ? "" : processId.toString()); + + long functionId = CommonUtils.toLong(configuration.get(PostgreDebugConstants.ATTR_FUNCTION_OID)); + if (functionId != 0 && dataSource != null) { + try { + container.getRunnableContext().run(true, true, monitor -> { + try { + selectedFunction = PostgreSqlDebugCore.resolveFunction(monitor, dataSource, configuration); + } catch (DBException e) { + throw new InvocationTargetException(e); + } + }); + container.setWarningMessage(null); + } catch (InvocationTargetException e) { + container.setWarningMessage(e.getTargetException().getMessage()); + } catch (InterruptedException e) { + // ignore + } + } + + if (selectedFunction != null) { + @SuppressWarnings("unchecked") + List paramValues = (List) configuration.get(PostgreDebugConstants.ATTR_FUNCTION_PARAMETERS); + if (paramValues != null) { + List parameters = selectedFunction.getInputParameters(); + if (parameters.size() == paramValues.size()) { + for (int i = 0; i < parameters.size(); i++) { + PostgreProcedureParameter param = parameters.get(i); + parameterValues.put(param, paramValues.get(i)); + } + } + } + + updateParametersTable(); + } + parametersTable.setEnabled(selectedFunction != null && !isGlobal); + processIdText.setEnabled(isGlobal); + + if (selectedFunction != null) { + functionCombo.addItem(selectedFunction); + functionCombo.select(selectedFunction); + } + } + + private void updateParametersTable() { + parametersTable.removeAll(); + for (DBSProcedureParameter param : selectedFunction.getInputParameters()) { + TableItem item = new TableItem(parametersTable, SWT.NONE); + item.setData(param); + item.setImage(DBeaverIcons.getImage(DBIcon.TREE_ATTRIBUTE)); + item.setText(0, param.getName()); + Object value = parameterValues.get(param); + item.setText(1, CommonUtils.toString(value, "")); + item.setText(2, param.getParameterType().getFullTypeName()); + item.setText(3, param.getParameterKind().getTitle()); + } + + parametersTable.select(0); + } + + @Override + public void saveConfiguration(DBPDataSourceContainer dataSource, Map configuration) { + configuration.put(PostgreDebugConstants.ATTR_ATTACH_KIND, + kindGlobal.getSelection() ? PostgreDebugConstants.ATTACH_KIND_GLOBAL : PostgreDebugConstants.ATTACH_KIND_LOCAL); + configuration.put(PostgreDebugConstants.ATTR_ATTACH_PROCESS, processIdText.getText()); + + if (selectedFunction != null) { + configuration.put(PostgreDebugConstants.ATTR_FUNCTION_OID, selectedFunction.getObjectId()); + configuration.put(PostgreDebugConstants.ATTR_DATABASE_NAME, selectedFunction.getDatabase().getName()); + configuration.put(PostgreDebugConstants.ATTR_SCHEMA_NAME, selectedFunction.getSchema().getName()); + List paramValues = new ArrayList<>(); + for (PostgreProcedureParameter param : selectedFunction.getInputParameters()) { + Object value = parameterValues.get(param); + paramValues.add(value == null ? null : value.toString()); + } + configuration.put(PostgreDebugConstants.ATTR_FUNCTION_PARAMETERS, paramValues); + } else { + configuration.remove(PostgreDebugConstants.ATTR_FUNCTION_OID); + configuration.remove(PostgreDebugConstants.ATTR_DATABASE_NAME); + configuration.remove(PostgreDebugConstants.ATTR_SCHEMA_NAME); + configuration.remove(PostgreDebugConstants.ATTR_FUNCTION_PARAMETERS); + } + } + + @Override + public boolean isValid() { + return selectedFunction != null; + } +} diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/src/org/jkiss/dbeaver/ext/postgresql/debug/ui/internal/PostgreDebugUIAdapterFactory.java b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/src/org/jkiss/dbeaver/ext/postgresql/debug/ui/internal/PostgreDebugUIAdapterFactory.java index a2cc64508082483256c553c80715bf1bcec09006..776ccfccd6eca6879ab4540073fc4ab1c49eaa6d 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/src/org/jkiss/dbeaver/ext/postgresql/debug/ui/internal/PostgreDebugUIAdapterFactory.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/src/org/jkiss/dbeaver/ext/postgresql/debug/ui/internal/PostgreDebugUIAdapterFactory.java @@ -18,20 +18,20 @@ package org.jkiss.dbeaver.ext.postgresql.debug.ui.internal; import org.eclipse.core.runtime.IAdapterFactory; -import org.jkiss.dbeaver.debug.ui.DebugEditorAdvisor; +import org.jkiss.dbeaver.debug.ui.DBGEditorAdvisor; import org.jkiss.dbeaver.ext.postgresql.model.PostgreDataSource; import org.jkiss.dbeaver.model.DBPDataSource; import org.jkiss.dbeaver.model.DBPDataSourceContainer; public class PostgreDebugUIAdapterFactory implements IAdapterFactory { - private static final Class[] CLASSES = new Class[] { DebugEditorAdvisor.class }; + private static final Class[] CLASSES = new Class[] { DBGEditorAdvisor.class }; - private DebugEditorAdvisor debugEditorAdvisor = new PostgreSourceEditorAdvisor(); + private DBGEditorAdvisor debugEditorAdvisor = new PostgreSourceEditorAdvisor(); @Override public T getAdapter(Object adaptableObject, Class adapterType) { - if (adapterType == DebugEditorAdvisor.class) { + if (adapterType == DBGEditorAdvisor.class) { if (adaptableObject instanceof DBPDataSourceContainer) { DBPDataSourceContainer sourceContainer = (DBPDataSourceContainer) adaptableObject; DBPDataSource dataSource = sourceContainer.getDataSource(); diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/src/org/jkiss/dbeaver/ext/postgresql/debug/ui/internal/PostgreDebugUIMessages.java b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/src/org/jkiss/dbeaver/ext/postgresql/debug/ui/internal/PostgreDebugUIMessages.java deleted file mode 100644 index c5a9faf1db9ca1b351efe1cdf39e55dcb4cb45ed..0000000000000000000000000000000000000000 --- a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/src/org/jkiss/dbeaver/ext/postgresql/debug/ui/internal/PostgreDebugUIMessages.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * DBeaver - Universal Database Manager - * Copyright (C) 2010-2018 Serge Rider (serge@jkiss.org) - * Copyright (C) 2017-2018 Alexander Fedorov (alexander.fedorov@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.debug.ui.internal; - -import org.eclipse.osgi.util.NLS; - -public class PostgreDebugUIMessages extends NLS { - - private static final String BUNDLE_NAME = "org.jkiss.dbeaver.ext.postgresql.debug.ui.internal.PostgreDebugUIMessages"; //$NON-NLS-1$ - - public static String PgSqlLaunchShortcut_name; - - static { - // initialize resource bundle - NLS.initializeMessages(BUNDLE_NAME, PostgreDebugUIMessages.class); - } - - private PostgreDebugUIMessages() { - } -} diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/src/org/jkiss/dbeaver/ext/postgresql/debug/ui/internal/PostgreDebugUIMessages.properties b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/src/org/jkiss/dbeaver/ext/postgresql/debug/ui/internal/PostgreDebugUIMessages.properties deleted file mode 100644 index 23bfef09ff95b8c90222defadbfe33588a5eb71b..0000000000000000000000000000000000000000 --- a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/src/org/jkiss/dbeaver/ext/postgresql/debug/ui/internal/PostgreDebugUIMessages.properties +++ /dev/null @@ -1,17 +0,0 @@ -# DBeaver - Universal Database Manager -# Copyright (C) 2010-2018 Serge Rider (serge@jkiss.org) -# Copyright (C) 2017-2018 Alexander Fedorov (alexander.fedorov@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. - -PgSqlLaunchShortcut_name=PL/pgSQL diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/src/org/jkiss/dbeaver/ext/postgresql/debug/ui/internal/PostgreSourceEditorAdvisor.java b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/src/org/jkiss/dbeaver/ext/postgresql/debug/ui/internal/PostgreSourceEditorAdvisor.java index 7601e70e9bcdeace44a6a3579b75d6dba17eb140..74a4c5477da640903c4e6718a9ed2f60b184be59 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/src/org/jkiss/dbeaver/ext/postgresql/debug/ui/internal/PostgreSourceEditorAdvisor.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.ui/src/org/jkiss/dbeaver/ext/postgresql/debug/ui/internal/PostgreSourceEditorAdvisor.java @@ -17,9 +17,9 @@ */ package org.jkiss.dbeaver.ext.postgresql.debug.ui.internal; -import org.jkiss.dbeaver.debug.ui.DebugEditorAdvisor; +import org.jkiss.dbeaver.debug.ui.DBGEditorAdvisor; -public class PostgreSourceEditorAdvisor implements DebugEditorAdvisor { +public class PostgreSourceEditorAdvisor implements DBGEditorAdvisor { private static final String POSTGRESQL_SOURCE_VIEW = "postgresql.source.view"; //$NON-NLS-1$ diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.ext.postgresql/META-INF/MANIFEST.MF index 5cd52673eb72333238c628c5608944b38b569f24..6dc295db9789e133e31e7b466d4a1e1b340432a3 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/META-INF/MANIFEST.MF +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.ext.postgresql;singleton:=true -Bundle-Version: 2.1.55 -Bundle-Release-Date: 20180430 +Bundle-Version: 2.1.56 +Bundle-Release-Date: 20180514 Require-Bundle: org.eclipse.osgi.services, org.eclipse.e4.core.services, org.eclipse.e4.core.contexts, @@ -27,6 +27,8 @@ Bundle-Vendor: %Bundle-Vendor Bundle-ClassPath: . Bundle-Activator: org.jkiss.dbeaver.ext.postgresql.PostgreActivator Export-Package: org.jkiss.dbeaver.ext.postgresql, - org.jkiss.dbeaver.ext.postgresql.model + org.jkiss.dbeaver.ext.postgresql.model, + org.jkiss.dbeaver.ext.postgresql.ui, + org.jkiss.dbeaver.ext.postgresql.ui.editors Bundle-Localization: OSGI-INF/l10n/bundle diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/OSGI-INF/l10n/bundle.properties b/plugins/org.jkiss.dbeaver.ext.postgresql/OSGI-INF/l10n/bundle.properties index 9ec1a8bd3d2d561453daa5361d068a1f6b35dbcf..142fc3276017a89ab8e6c39eb014e62d0d2a1e88 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/OSGI-INF/l10n/bundle.properties +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/OSGI-INF/l10n/bundle.properties @@ -220,6 +220,8 @@ meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreIndex.unique.name=Unique meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreIndex.unique.description= meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreIndex.valid.name=Valid meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreIndex.valid.description= +meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreIndex.tablespace.name=Tablespace +meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreIndex.tablespace.description=Index tablespace meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreIndex.objectDefinitionText.name=DDL meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreIndex.objectDefinitionText.description=Index definition meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreIndexColumn.ascending.name=Ascending @@ -372,6 +374,9 @@ meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreTrigger.enabledState.descript meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreTrigger.actionTiming.name=Timing meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreTrigger.manipulationTypes.name=Manipulation meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreTrigger.type.name=Type +meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreTrigger.type.description=Trigger type (ROW or STATEMENT) +meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreTrigger.columnRefs.name=Column(s) +meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreTrigger.columnRefs.description=Table column names, if trigger is column-specific meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreTrigger.objectDefinitionText.name=Source meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreTrigger.objectDefinitionText.description= meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreTrigger.objectId.name=Object ID diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/pom.xml b/plugins/org.jkiss.dbeaver.ext.postgresql/pom.xml index 981b338bd345fd2a1a1c7d053d4a12fa803dd012..9fc760e807d1a8510085f27de85c5f0d93726c2d 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/pom.xml +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/pom.xml @@ -9,6 +9,6 @@ ../../ org.jkiss.dbeaver.ext.postgresql - 2.1.55 + 2.1.56 eclipse-plugin diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/PostgreUtils.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/PostgreUtils.java index f41e9e22af61c27ac5cb82df181d9a1d43ffe283..f79a97cf361bd52a1b9c47d85a1d22be80073ac1 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/PostgreUtils.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/PostgreUtils.java @@ -68,9 +68,9 @@ public class PostgreUtils { try (JDBCSession session = DBUtils.openMetaSession(monitor, dataSource, "Load PostgreSQL description")) { return JDBCUtils.queryString( session, - "select description from pg_description\n" + - "join pg_class on pg_description.objoid = pg_class.oid\n" + - "join pg_namespace on pg_class.relnamespace = pg_namespace.oid\n" + + "select description from pg_catalog.pg_description\n" + + "join pg_catalog.pg_class on pg_description.objoid = pg_class.oid\n" + + "join pg_catalog.pg_namespace on pg_class.relnamespace = pg_namespace.oid\n" + "where pg_class.relname = ? and pg_namespace.nspname=?", object, schema); } catch (Exception e) { log.debug(e); diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/edit/PostgreDatabaseManager.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/edit/PostgreDatabaseManager.java index 4c83b8f3afc32a8a43f794aff349b3fb97415496..a4b90757d6c29f9492769b12610e18f6e97f3239 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/edit/PostgreDatabaseManager.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/edit/PostgreDatabaseManager.java @@ -20,6 +20,7 @@ import org.eclipse.jface.dialogs.IDialogConstants; import org.jkiss.code.Nullable; import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.core.DBeaverUI; +import org.jkiss.dbeaver.ext.postgresql.PostgreMessages; import org.jkiss.dbeaver.ext.postgresql.model.PostgreDataSource; import org.jkiss.dbeaver.ext.postgresql.model.PostgreDatabase; import org.jkiss.dbeaver.ext.postgresql.ui.PostgreCreateDatabaseDialog; @@ -58,6 +59,15 @@ public class PostgreDatabaseManager extends SQLObjectEditor options) throws DBException { + if (object == object.getDataSource().getDefaultInstance()) { + throw new DBException("Cannot drop the currently open database." + + "\nSwitch to another database and try again\n(Note: enable '" + PostgreMessages.dialog_setting_connection_nondefaultDatabase + "' option to see them)."); + } + super.deleteObject(commandContext, object, options); + } + @Override protected PostgreDatabase createDatabaseObject(DBRProgressMonitor monitor, DBECommandContext context, PostgreDataSource parent, Object copyFrom) { diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/edit/PostgreTableColumnManager.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/edit/PostgreTableColumnManager.java index 8951e1d49e11acea69b7031eefa1d54579262fca..73c51a3dda205697d79cdfdbb45e71c4b3bb8659 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/edit/PostgreTableColumnManager.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/edit/PostgreTableColumnManager.java @@ -182,6 +182,14 @@ public class PostgreTableColumnManager extends SQLTableColumnManager actions, ObjectCreateCommand command, Map options) { + super.addObjectCreateActions(actions, command, options); + if (!CommonUtils.isEmpty(command.getObject().getDescription())) { + addColumnCommentAction(actions, command.getObject()); + } + } + @Override protected void addObjectModifyActions(List actionList, ObjectChangeCommand command, Map options) { diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/edit/PostgreTableManager.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/edit/PostgreTableManager.java index 98e52b3283eac50f84b57d089e2b9cb214dab7f6..b91035153ddf5a149889acc2d02ec503c89b0dbc 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/edit/PostgreTableManager.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/edit/PostgreTableManager.java @@ -87,10 +87,10 @@ public class PostgreTableManager extends PostgreTableManagerBase implements DBEO final PostgreTableRegular table = (PostgreTableRegular) command.getObject(); final String alterPrefix = "ALTER TABLE " + command.getObject().getFullyQualifiedName(DBPEvaluationContext.DDL) + " "; final VoidProgressMonitor monitor = new VoidProgressMonitor(); - if (command.getProperty("hasOids") != null) { + if (command.hasProperty("hasOids")) { actionList.add(new SQLDatabasePersistAction(alterPrefix + (table.isHasOids() ? "SET WITH OIDS" : "SET WITHOUT OIDS"))); } - if (command.getProperty("tablespace") != null) { + if (command.hasProperty("tablespace")) { actionList.add(new SQLDatabasePersistAction(alterPrefix + "SET TABLESPACE " + table.getTablespace(monitor).getName())); } } diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/edit/PostgreTableManagerBase.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/edit/PostgreTableManagerBase.java index 2abdd353b4574b2d9c27fd474c6baf2345756525..be0f5f125cf51f103e9eff4093ece0b02ff42df7 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/edit/PostgreTableManagerBase.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/edit/PostgreTableManagerBase.java @@ -17,6 +17,7 @@ package org.jkiss.dbeaver.ext.postgresql.edit; import org.jkiss.dbeaver.DBException; +import org.jkiss.dbeaver.ext.postgresql.PostgreConstants; import org.jkiss.dbeaver.ext.postgresql.PostgreUtils; import org.jkiss.dbeaver.ext.postgresql.model.*; import org.jkiss.dbeaver.model.DBConstants; @@ -52,7 +53,10 @@ public abstract class PostgreTableManagerBase extends SQLTableManager actions, PostgreViewBase view) { - String sql = view.getSource().trim(); - if (!sql.toLowerCase(Locale.ENGLISH).startsWith("create")) { - sql = "CREATE OR REPLACE VIEW " + DBUtils.getObjectFullName(view, DBPEvaluationContext.DDL) + " AS\n" + sql; + if (!CommonUtils.isEmpty(view.getSource())) { + // Source may be empty if it wasn't yet read. Then it definitely wasn't changed + String sql = view.getSource().trim(); + if (!sql.toLowerCase(Locale.ENGLISH).startsWith("create")) { + sql = "CREATE OR REPLACE VIEW " + DBUtils.getObjectFullName(view, DBPEvaluationContext.DDL) + " AS\n" + sql; + } + actions.add( + new SQLDatabasePersistAction("Create view", sql)); } - actions.add( - new SQLDatabasePersistAction("Create view", sql)); } } diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreDatabase.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreDatabase.java index c5cde6cf4ca6b2650fca0c5e127181f7e2bebdd9..3ff569fbc766504d02f5372a6323474b1644740c 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreDatabase.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreDatabase.java @@ -178,11 +178,6 @@ public class PostgreDatabase implements DBSInstance, DBSCatalog, DBPRefreshableO return PostgreUtils.getObjectById(monitor, roleCache, this, ownerId); } - @Property(viewable = false, order = 4) - public PostgreTablespace getDefaultTablespace(DBRProgressMonitor monitor) throws DBException { - return PostgreUtils.getObjectById(monitor, tablespaceCache, this, tablespaceId); - } - @Property(viewable = false, order = 5) public PostgreCharset getDefaultEncoding(DBRProgressMonitor monitor) throws DBException { return PostgreUtils.getObjectById(monitor, encodingCache, this, encodingId); @@ -212,7 +207,8 @@ public class PostgreDatabase implements DBSInstance, DBSCatalog, DBPRefreshableO public int getConnectionLimit() { return connectionLimit; } -/////////////////////////////////////////////////// + + /////////////////////////////////////////////////// // Instance methods @NotNull @@ -283,11 +279,28 @@ public class PostgreDatabase implements DBSInstance, DBSCatalog, DBPRefreshableO return encodingCache.getAllObjects(monitor, this); } + /////////////////////////////////////////////// + // Tablespaces + @Association public Collection getTablespaces(DBRProgressMonitor monitor) throws DBException { return tablespaceCache.getAllObjects(monitor, this); } + @Property(viewable = false, order = 4) + public PostgreTablespace getDefaultTablespace(DBRProgressMonitor monitor) throws DBException { + return PostgreUtils.getObjectById(monitor, tablespaceCache, this, tablespaceId); + } + + public PostgreTablespace getTablespace(DBRProgressMonitor monitor, long tablespaceId) throws DBException { + for (PostgreTablespace ts : tablespaceCache.getAllObjects(monitor, this)) { + if (ts.getObjectId() == tablespaceId) { + return ts; + } + } + return null; + } + /////////////////////////////////////////////// // Object container @@ -444,7 +457,7 @@ public class PostgreDatabase implements DBSInstance, DBSCatalog, DBPRefreshableO // Construct search path from current search path but put default schema first List newSearchPath = new ArrayList<>(dataSource.getDefaultSearchPath()); { - String defSchemaName = DBUtils.getQuotedIdentifier(schema); + String defSchemaName = schema.getName(); int schemaIndex = newSearchPath.indexOf(defSchemaName); if (schemaIndex == 0) { // Already default schema @@ -457,9 +470,16 @@ public class PostgreDatabase implements DBSInstance, DBSCatalog, DBPRefreshableO newSearchPath.add(0, defSchemaName); } } + StringBuilder spString = new StringBuilder(); + for (String sp : newSearchPath) { + if (spString.length() > 0) spString.append(","); + if (sp.startsWith("$")) + spString.append(sp); + else + spString.append(DBUtils.getQuotedIdentifier(getDataSource(), sp)); + } try (JDBCSession session = context.openSession(monitor, DBCExecutionPurpose.UTIL, "Change search path")) { - String sp = newSearchPath.stream().collect(Collectors.joining(",")); - JDBCUtils.executeSQL(session, "SET search_path = " + sp); + JDBCUtils.executeSQL(session, "SET search_path = " + spString); } catch (SQLException e) { throw new DBCException("Error setting search path", e, dataSource); } @@ -475,6 +495,18 @@ public class PostgreDatabase implements DBSInstance, DBSCatalog, DBPRefreshableO return null; } + public PostgreProcedure getProcedure(DBRProgressMonitor monitor, long procId) + throws DBException + { + for (final PostgreSchema schema : getSchemas(monitor)) { + PostgreProcedure procedure = PostgreUtils.getObjectById(monitor, schema.proceduresCache, schema, procId); + if (procedure != null) { + return procedure; + } + } + return null; + } + public PostgreDataType getDataType(long typeId) { if (typeId <= 0) { return null; diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreIndex.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreIndex.java index c65bce682e84401836416cbe264fb371eaa870e8..51930d2220abf41853f821d2615b405f6935d1b7 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreIndex.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreIndex.java @@ -22,14 +22,12 @@ import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.ext.postgresql.PostgreUtils; import org.jkiss.dbeaver.model.DBPEvaluationContext; import org.jkiss.dbeaver.model.DBPHiddenObject; -import org.jkiss.dbeaver.model.DBPScriptObject; import org.jkiss.dbeaver.model.DBUtils; import org.jkiss.dbeaver.model.exec.jdbc.JDBCSession; import org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils; import org.jkiss.dbeaver.model.impl.jdbc.struct.JDBCTableIndex; import org.jkiss.dbeaver.model.meta.Property; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; -import org.jkiss.dbeaver.model.sql.SQLUtils; import org.jkiss.dbeaver.model.struct.rdb.DBSIndexType; import java.sql.ResultSet; @@ -41,7 +39,7 @@ import java.util.Map; /** * PostgreIndex */ -public class PostgreIndex extends JDBCTableIndex implements PostgreScriptObject, DBPHiddenObject +public class PostgreIndex extends JDBCTableIndex implements PostgreObject, PostgreScriptObject, DBPHiddenObject { private long indexId; private boolean isUnique; @@ -55,6 +53,7 @@ public class PostgreIndex extends JDBCTableIndex columns = new ArrayList<>(); private long amId; + private long tablespaceId; private transient boolean isHidden; private transient String indexDDL; @@ -78,6 +77,7 @@ public class PostgreIndex extends JDBCTableIndex getAttributeReferences(DBRProgressMonitor monitor) { diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreProcedure.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreProcedure.java index 1fc8cbacf0ff358b0292b4b72e85fef7242f8b47..3a3c86b139a8734e49391af0723707780ff09cf1 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreProcedure.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreProcedure.java @@ -227,12 +227,20 @@ public class PostgreProcedure extends AbstractProcedure getParameters(DBRProgressMonitor monitor) - throws DBException - { + public List getParameters(@Nullable DBRProgressMonitor monitor) { return params; } + public List getInputParameters() { + List result = new ArrayList<>(); + for (PostgreProcedureParameter param : params) { + if (param.getParameterKind().isInput()) { + result.add(param); + } + } + return result; + } + @NotNull @Override public String getFullyQualifiedName(DBPEvaluationContext context) diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreSchema.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreSchema.java index eb7962faac6daa8d7fd0fdc0af596c0647094546..d62779be6ee4d14266b62eaebc7384e6d498cf6d 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreSchema.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreSchema.java @@ -184,6 +184,15 @@ public class PostgreSchema implements DBSSchema, DBPNamedObject2, DBPSaveableObj return indexCache.getObjects(monitor, this, null); } + public PostgreIndex getIndex(DBRProgressMonitor monitor, long indexId) throws DBException { + for (PostgreIndex index : indexCache.getAllObjects(monitor, this)) { + if (index.getObjectId() == indexId) { + return index; + } + } + return null; + } + public PostgreTableBase getTable(DBRProgressMonitor monitor, long tableId) throws DBException { @@ -227,6 +236,7 @@ public class PostgreSchema implements DBSSchema, DBPNamedObject2, DBPSaveableObj return tableCache.getTypedObjects(monitor, this, PostgreSequence.class); } + @Association public PostgreSequence getSequence(DBRProgressMonitor monitor, String name) throws DBException { @@ -324,6 +334,7 @@ public class PostgreSchema implements DBSSchema, DBPNamedObject2, DBPSaveableObj } //@Property + @Association public Collection getDataTypes(DBRProgressMonitor monitor) throws DBException { List types = new ArrayList<>(); for (PostgreDataType dt : dataTypeCache.getAllObjects(monitor, this)) { @@ -417,7 +428,7 @@ public class PostgreSchema implements DBSSchema, DBPNamedObject2, DBPSaveableObj protected TableCache() { super("relname"); - setListOrderComparator(DBUtils.nameComparator()); + setListOrderComparator(DBUtils.nameComparator()); } @NotNull @@ -670,7 +681,7 @@ public class PostgreSchema implements DBSSchema, DBPNamedObject2, DBPSaveableObj boolean supportsExprIndex = getDataSource().isServerVersionAtLeast(7, 4); StringBuilder sql = new StringBuilder(); sql.append( - "SELECT i.*,i.indkey as keys,c.relname,c.relnamespace,c.relam,tc.relname as tabrelname,dsc.description"); + "SELECT i.*,i.indkey as keys,c.relname,c.relnamespace,c.relam,c.reltablespace,tc.relname as tabrelname,dsc.description"); if (supportsExprIndex) { sql.append(",pg_catalog.pg_get_expr(i.indexprs, i.indrelid, true) as expr"); } @@ -733,7 +744,7 @@ public class PostgreSchema implements DBSSchema, DBPNamedObject2, DBPSaveableObj if (attr == null) { if (colNumber == 0 && expr != null) { // It's ok, function index or something - attrExpression = JDBCUtils.queryString(session, "select pg_catalog.pg_get_indexdef(?, ?, true)", object.getIndexId(), i + 1); + attrExpression = JDBCUtils.queryString(session, "select pg_catalog.pg_get_indexdef(?, ?, true)", object.getObjectId(), i + 1); } else { log.warn("Bad index attribute index: " + colNumber); } diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreTableBase.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreTableBase.java index ee3663e80a454dc3cfdbfdbb5c08651d29db8444..30cf62d56eaa2aa47cbce0e2121e1272d9b844b0 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreTableBase.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreTableBase.java @@ -134,7 +134,7 @@ public abstract class PostgreTableBase extends JDBCTable getAttributes(@NotNull DBRProgressMonitor monitor) + public List getAttributes(@NotNull DBRProgressMonitor monitor) throws DBException { return getContainer().tableCache.getChildren(monitor, getContainer(), this); diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreTableConstraint.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreTableConstraint.java index 91bf109adb0504a5c9e6001ac992b3301ab6efe4..4b06bb4a711e41c185d28ceba86ba3218540a2dd 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreTableConstraint.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreTableConstraint.java @@ -70,4 +70,5 @@ public class PostgreTableConstraint extends PostgreTableConstraintBase { public void setSource(String source) { this.source = source; } + } diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreTableConstraintBase.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreTableConstraintBase.java index 22b4a0591bde9a24a280346997b460822d9dea2a..cbcd0dcdbc8dbea63c78a81933eef71e66f45729 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreTableConstraintBase.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreTableConstraintBase.java @@ -39,16 +39,19 @@ import java.util.Map; /** * PostgreTableConstraintBase */ -public abstract class PostgreTableConstraintBase extends JDBCTableConstraint implements PostgreObject,DBPScriptObject { +public abstract class PostgreTableConstraintBase extends JDBCTableConstraint implements PostgreObject,PostgreScriptObject { private static final Log log = Log.getLog(PostgreTableConstraintBase.class); private long oid; private String constrDDL; + private long indexId; public PostgreTableConstraintBase(PostgreTableBase table, String name, DBSEntityConstraintType constraintType, JDBCResultSet resultSet) throws DBException { super(table, name, null, constraintType, true); this.oid = JDBCUtils.safeGetLong(resultSet, "oid"); + this.indexId = JDBCUtils.safeGetLong(resultSet, "conindid"); + this.description = JDBCUtils.safeGetString(resultSet, "description"); } @@ -92,6 +95,11 @@ public abstract class PostgreTableConstraintBase extends JDBCTableConstraint children, boolean secondPass); @Override @@ -114,4 +122,8 @@ public abstract class PostgreTableConstraintBase extends JDBCTableConstraint 0) sb.append(", "); + sb.append(col.getName()); + } + return sb.toString(); + } + return value; + } + } } diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreViewBase.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreViewBase.java index 91737a4beca1fea088261c8e8e70494b6930a6ae..70b93342f4d808b4f63bc99ad876193d006ad9b8 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreViewBase.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreViewBase.java @@ -18,18 +18,27 @@ package org.jkiss.dbeaver.ext.postgresql.model; import org.jkiss.code.NotNull; import org.jkiss.dbeaver.DBException; +import org.jkiss.dbeaver.ext.postgresql.PostgreConstants; import org.jkiss.dbeaver.ext.postgresql.PostgreUtils; +import org.jkiss.dbeaver.model.DBPEvaluationContext; import org.jkiss.dbeaver.model.DBUtils; +import org.jkiss.dbeaver.model.edit.DBEPersistAction; import org.jkiss.dbeaver.model.exec.jdbc.JDBCSession; import org.jkiss.dbeaver.model.impl.DBObjectNameCaseTransformer; +import org.jkiss.dbeaver.model.impl.edit.SQLDatabasePersistAction; import org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils; import org.jkiss.dbeaver.model.meta.Property; 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.rdb.DBSTableIndex; +import org.jkiss.utils.CommonUtils; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.ArrayList; import java.util.Collection; +import java.util.List; import java.util.Map; /** @@ -95,7 +104,24 @@ public abstract class PostgreViewBase extends PostgreTableReal source = ""; } } - return source; + + List actions = new ArrayList<>(); + if (CommonUtils.getOption(options, PostgreConstants.OPTION_DDL_SHOW_COLUMN_COMMENTS) && getDescription() != null) { + actions.add( + new SQLDatabasePersistAction("Comment", + "COMMENT ON VIEW " + getFullyQualifiedName(DBPEvaluationContext.DDL) + " IS " + SQLUtils.quoteString(this, getDescription()))); + } + if (CommonUtils.getOption(options, PostgreConstants.OPTION_DDL_SHOW_PERMISSIONS)) { + PostgreUtils.getObjectGrantPermissionActions(monitor, this, actions, options); + } + + StringBuilder ddl = new StringBuilder(source); + if (!actions.isEmpty()) { + ddl.append("\n\n").append(SQLUtils.generateScript( + getDataSource(), actions.toArray(new DBEPersistAction[actions.size()]), false)); + } + + return ddl.toString(); } protected String readExtraDefinition(JDBCSession session, Map options) throws DBException { @@ -110,4 +136,9 @@ public abstract class PostgreViewBase extends PostgreTableReal public abstract String getViewType(); + @Override + public DBSObject refreshObject(DBRProgressMonitor monitor) throws DBException { + this.source = null; + return super.refreshObject(monitor); + } } diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/session/PostgreSessionManager.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/session/PostgreSessionManager.java index 24b423a3664d043d4f21f963a124398303aa6990..0dde47db4fad261b5cbd7c6a4263b087d0e701b1 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/session/PostgreSessionManager.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/session/PostgreSessionManager.java @@ -26,6 +26,7 @@ import org.jkiss.dbeaver.model.exec.jdbc.JDBCResultSet; import org.jkiss.dbeaver.model.exec.jdbc.JDBCSession; import java.sql.SQLException; +import java.sql.Statement; import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -73,9 +74,8 @@ public class PostgreSessionManager implements DBAServerSessionManager options) throws DBException { try { - try (JDBCPreparedStatement dbStat = ((JDBCSession) session).prepareStatement("SELECT pg_catalog.pg_terminate_backend(?)")) { - dbStat.setInt(1, sessionType.getPid()); - dbStat.execute(); + try (Statement dbStat = ((JDBCSession) session).createStatement()) { + dbStat.execute("SELECT pg_catalog.pg_terminate_backend(" + sessionType.getPid() + ")"); } } catch (SQLException e) { diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/ui/PostgreConnectionPage.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/ui/PostgreConnectionPage.java index cf8f3b3af967325193addbbe2b66b1decc52db3b..15b7f02e7ea04506794dcfd1a59bb132781fe130 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/ui/PostgreConnectionPage.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/ui/PostgreConnectionPage.java @@ -220,9 +220,9 @@ public class PostgreConnectionPage extends ConnectionPageAbstract implements ICo } homesSelector.populateHomes(site.getDriver(), connectionInfo.getClientHomeId()); - showNonDefault.setSelection(CommonUtils.toBoolean(connectionInfo.getProviderProperty(PostgreConstants.PROP_SHOW_NON_DEFAULT_DB))); + showNonDefault.setSelection(CommonUtils.getBoolean(connectionInfo.getProviderProperty(PostgreConstants.PROP_SHOW_NON_DEFAULT_DB), true)); - switchDatabaseOnExpand.setSelection(CommonUtils.toBoolean(connectionInfo.getProviderProperty(PostgreConstants.PROP_SWITCH_DB_ON_EXPAND))); + switchDatabaseOnExpand.setSelection(CommonUtils.getBoolean(connectionInfo.getProviderProperty(PostgreConstants.PROP_SWITCH_DB_ON_EXPAND), true)); switchDatabaseOnExpand.setEnabled(showNonDefault.getSelection()); activated = true; diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/ui/editors/PostgreSourceViewEditor.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/ui/editors/PostgreSourceViewEditor.java index 7b5e70271beee21c22020a44131e573d75dc8ef0..b9a45c4bea86a8e1dcfc447a35dd6b4b93dd33c2 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/ui/editors/PostgreSourceViewEditor.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/ui/editors/PostgreSourceViewEditor.java @@ -17,7 +17,7 @@ package org.jkiss.dbeaver.ext.postgresql.ui.editors; -import org.eclipse.e4.core.services.events.IEventBroker; +import org.eclipse.jface.action.Action; import org.eclipse.jface.action.ControlContribution; import org.eclipse.jface.action.IContributionManager; import org.eclipse.jface.action.Separator; @@ -26,18 +26,16 @@ import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Display; -import org.jkiss.dbeaver.ext.postgresql.PostgreActivator; import org.jkiss.dbeaver.ext.postgresql.PostgreConstants; import org.jkiss.dbeaver.ext.postgresql.model.*; +import org.jkiss.dbeaver.model.DBIcon; import org.jkiss.dbeaver.model.DBPScriptObject; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; +import org.jkiss.dbeaver.ui.ActionUtils; +import org.jkiss.dbeaver.ui.DBeaverIcons; import org.jkiss.dbeaver.ui.UIUtils; -import org.jkiss.dbeaver.ui.editors.IDatabaseEditorInput; import org.jkiss.dbeaver.ui.editors.sql.SQLSourceViewer; -import org.jkiss.dbeaver.utils.GeneralUtils; -import org.osgi.service.event.Event; -import org.osgi.service.event.EventHandler; +import org.jkiss.utils.CommonUtils; import java.util.Map; @@ -46,55 +44,18 @@ import java.util.Map; */ public class PostgreSourceViewEditor extends SQLSourceViewer { - private static final String TOPIC_DEBUGGER_SOURCE = GeneralUtils.encodeTopic(DBPScriptObject.OPTION_DEBUGGER_SOURCE); - private Button omitHeaderCheck; private Boolean showPermissions; private boolean showColumnComments = true; - private IEventBroker eventBroker; - private TopicEventHandler topicEventHandler = new TopicEventHandler(); - public PostgreSourceViewEditor() { } - private class TopicEventHandler implements EventHandler { - - @Override - public void handleEvent(Event event) { - String topic = event.getTopic(); - if (TOPIC_DEBUGGER_SOURCE.equals(topic)) { - Object data = event.getProperty(IEventBroker.DATA); - if (data instanceof String) { - String nodePath = (String) data; - IDatabaseEditorInput editorInput = getEditorInput(); - if (nodePath.equals(editorInput.getNavigatorNode().getNodeItemPath())) { - Object omitValue = editorInput.getAttribute(DBPScriptObject.OPTION_DEBUGGER_SOURCE); - boolean omitHeader = Boolean.parseBoolean(String.valueOf(omitValue)); - if (!omitHeader) { - setOmitHeader(true); - } - } - } - } - } - - } - - @Override - public void dispose() { - if (eventBroker != null) { - eventBroker.unsubscribe(topicEventHandler); - eventBroker = null; - } - super.dispose(); - } - @Override protected boolean isReadOnly() { PostgreScriptObject sourceObject = getSourceObject(); - if (sourceObject instanceof PostgreProcedure || sourceObject instanceof PostgreTrigger) { + if (sourceObject instanceof PostgreProcedure || sourceObject instanceof PostgreTrigger || sourceObject instanceof PostgreViewBase) { return false; } return true; @@ -115,88 +76,68 @@ public class PostgreSourceViewEditor extends SQLSourceViewer getSourceOptions() { Map options = super.getSourceOptions(); - Object omitValue = getEditorInput().getAttribute(DBPScriptObject.OPTION_DEBUGGER_SOURCE); - boolean omitHeader = Boolean.parseBoolean(String.valueOf(omitValue)); - options.put(DBPScriptObject.OPTION_DEBUGGER_SOURCE, omitHeader); + boolean inDebug = isInDebugMode(); + options.put(DBPScriptObject.OPTION_DEBUGGER_SOURCE, inDebug); options.put(PostgreConstants.OPTION_DDL_SHOW_PERMISSIONS, getShowPermissions()); options.put(PostgreConstants.OPTION_DDL_SHOW_COLUMN_COMMENTS, showColumnComments); return options; } + + private boolean isInDebugMode() { + return CommonUtils.getBoolean( + getEditorInput().getAttribute(DBPScriptObject.OPTION_DEBUGGER_SOURCE), false); + } } diff --git a/plugins/org.jkiss.dbeaver.ext.sample.database/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.ext.sample.database/META-INF/MANIFEST.MF index d676b8e4fc2455385e151fb28e91b10b11f1634e..f8e9f9dbe54a90d9edfe074178e9ad3c20e140e4 100644 --- a/plugins/org.jkiss.dbeaver.ext.sample.database/META-INF/MANIFEST.MF +++ b/plugins/org.jkiss.dbeaver.ext.sample.database/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.ext.sample.database;singleton:=true -Bundle-Version: 1.0.19 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.20 +Bundle-Release-Date: 20180514 Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime, org.jkiss.dbeaver.core, diff --git a/plugins/org.jkiss.dbeaver.ext.sample.database/pom.xml b/plugins/org.jkiss.dbeaver.ext.sample.database/pom.xml index d413bca20547375d6f0f7e9ad2180deb4a60b4e4..a771a4b26e0e43b6342de5a07989e794afc7ce4e 100644 --- a/plugins/org.jkiss.dbeaver.ext.sample.database/pom.xml +++ b/plugins/org.jkiss.dbeaver.ext.sample.database/pom.xml @@ -9,6 +9,6 @@ ../../ org.jkiss.dbeaver.ext.sample.database - 1.0.19 + 1.0.20 eclipse-plugin diff --git a/plugins/org.jkiss.dbeaver.ext.sqlite/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.ext.sqlite/META-INF/MANIFEST.MF index f43768c1423e9c2735d0e49c9c6ccbc5f3a91ad1..b1a2106dbe76bba3d448f5b89cc84987e395e024 100644 --- a/plugins/org.jkiss.dbeaver.ext.sqlite/META-INF/MANIFEST.MF +++ b/plugins/org.jkiss.dbeaver.ext.sqlite/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.ext.sqlite;singleton:=true -Bundle-Version: 1.0.31 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.32 +Bundle-Release-Date: 20180514 Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime, org.jkiss.dbeaver.core, diff --git a/plugins/org.jkiss.dbeaver.ext.sqlite/pom.xml b/plugins/org.jkiss.dbeaver.ext.sqlite/pom.xml index f5dd28ddbaf3a70ac2dfd87ccf098fcfe0317760..dd969ed27eb8cfcdad85bc615e4efd91395d66bf 100644 --- a/plugins/org.jkiss.dbeaver.ext.sqlite/pom.xml +++ b/plugins/org.jkiss.dbeaver.ext.sqlite/pom.xml @@ -9,6 +9,6 @@ ../../ org.jkiss.dbeaver.ext.sqlite - 1.0.31 + 1.0.32 eclipse-plugin diff --git a/plugins/org.jkiss.dbeaver.ext.sqlite/src/org/jkiss/dbeaver/ext/sqlite/model/SQLiteDataSource.java b/plugins/org.jkiss.dbeaver.ext.sqlite/src/org/jkiss/dbeaver/ext/sqlite/model/SQLiteDataSource.java index cd33f9e1c2c44c0efe263dd4d40d533fb3717aad..c39faff8a17020f5485adf12e4de64636ae924ef 100644 --- a/plugins/org.jkiss.dbeaver.ext.sqlite/src/org/jkiss/dbeaver/ext/sqlite/model/SQLiteDataSource.java +++ b/plugins/org.jkiss.dbeaver.ext.sqlite/src/org/jkiss/dbeaver/ext/sqlite/model/SQLiteDataSource.java @@ -16,17 +16,18 @@ */ package org.jkiss.dbeaver.ext.sqlite.model; -import org.jkiss.code.NotNull; import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.ext.generic.model.GenericDataSource; import org.jkiss.dbeaver.ext.generic.model.meta.GenericMetaModel; import org.jkiss.dbeaver.model.DBPDataSourceContainer; -import org.jkiss.dbeaver.model.exec.jdbc.JDBCDatabaseMetaData; +import org.jkiss.dbeaver.model.connection.DBPConnectionConfiguration; +import org.jkiss.dbeaver.model.exec.DBCException; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; -import org.jkiss.dbeaver.model.sql.SQLDialect; import org.jkiss.dbeaver.model.struct.DBSDataType; +import java.util.HashMap; import java.util.Locale; +import java.util.Map; public class SQLiteDataSource extends GenericDataSource { @@ -55,4 +56,19 @@ public class SQLiteDataSource extends GenericDataSource { return super.getLocalDataType(affinity.name()); } + @Override + protected boolean isConnectionReadOnlyBroken() { + return true; + } + + @Override + protected Map getInternalConnectionProperties(DBRProgressMonitor monitor, String purpose, DBPConnectionConfiguration connectionInfo) throws DBCException { + Map connectionsProps = new HashMap<>(); + if (getContainer().isConnectionReadOnly()) { + // Read-only prop + connectionsProps.put("open_mode", "1"); //1 == readonly + } + return connectionsProps; + } + } diff --git a/plugins/org.jkiss.dbeaver.ext.sqlite/src/org/jkiss/dbeaver/ext/sqlite/model/SQLiteMetaModel.java b/plugins/org.jkiss.dbeaver.ext.sqlite/src/org/jkiss/dbeaver/ext/sqlite/model/SQLiteMetaModel.java index 05d4843c599faeb5977eaece7bbe83b112786c0e..0e84e4d0d7588a64d12239806b604d425ab76691 100644 --- a/plugins/org.jkiss.dbeaver.ext.sqlite/src/org/jkiss/dbeaver/ext/sqlite/model/SQLiteMetaModel.java +++ b/plugins/org.jkiss.dbeaver.ext.sqlite/src/org/jkiss/dbeaver/ext/sqlite/model/SQLiteMetaModel.java @@ -156,7 +156,7 @@ public class SQLiteMetaModel extends GenericMetaModel implements DBCQueryTransfo } @Override - public GenericTableColumn createTableColumnImpl(JDBCSession session, JDBCResultSet dbResult, GenericTable table, String columnName, String typeName, int valueType, int sourceType, int ordinalPos, long columnSize, long charLength, Integer scale, Integer precision, int radix, boolean notNull, String remarks, String defaultValue, boolean autoIncrement, boolean autoGenerated) { + public GenericTableColumn createTableColumnImpl(DBRProgressMonitor monitor, GenericTable table, String columnName, String typeName, int valueType, int sourceType, int ordinalPos, long columnSize, long charLength, Integer scale, Integer precision, int radix, boolean notNull, String remarks, String defaultValue, boolean autoIncrement, boolean autoGenerated) { return new SQLiteTableColumn(table, columnName, typeName, valueType, sourceType, ordinalPos, columnSize, charLength, scale, precision, radix, notNull, remarks, defaultValue, autoIncrement, autoGenerated); } } diff --git a/plugins/org.jkiss.dbeaver.ext.teradata/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.ext.teradata/META-INF/MANIFEST.MF index 58e6c21bdc385dd2ef5787fb233aa3460e5f4e2c..acf9cae09f79d8bb1c8f15eb1875e532113f2c00 100644 --- a/plugins/org.jkiss.dbeaver.ext.teradata/META-INF/MANIFEST.MF +++ b/plugins/org.jkiss.dbeaver.ext.teradata/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.ext.teradata;singleton:=true -Bundle-Version: 1.0.50 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.51 +Bundle-Release-Date: 20180514 Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime, org.eclipse.ui.views, diff --git a/plugins/org.jkiss.dbeaver.ext.teradata/pom.xml b/plugins/org.jkiss.dbeaver.ext.teradata/pom.xml index d9fd6902f1a957d531f4951a1abeb6c15b013ef6..25c452ead8071d53759f544447d098209f09de6c 100644 --- a/plugins/org.jkiss.dbeaver.ext.teradata/pom.xml +++ b/plugins/org.jkiss.dbeaver.ext.teradata/pom.xml @@ -9,6 +9,6 @@ ../../ org.jkiss.dbeaver.ext.teradata - 1.0.50 + 1.0.51 eclipse-plugin diff --git a/plugins/org.jkiss.dbeaver.ext.ui.locks/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.ext.ui.locks/META-INF/MANIFEST.MF index b736acaad7e2cead66b4ac2cf4acde5c6bd2cb67..73c481eb5e126364829bceb0a56cfba12cd8a8a9 100644 --- a/plugins/org.jkiss.dbeaver.ext.ui.locks/META-INF/MANIFEST.MF +++ b/plugins/org.jkiss.dbeaver.ext.ui.locks/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.ext.ui.locks;singleton:=true -Bundle-Version: 1.0.27 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.28 +Bundle-Release-Date: 20180514 Bundle-Vendor: %Bundle-Vendor Bundle-Authors: Andrew Khitrin Bundle-RequiredExecutionEnvironment: JavaSE-1.8 diff --git a/plugins/org.jkiss.dbeaver.ext.ui.locks/pom.xml b/plugins/org.jkiss.dbeaver.ext.ui.locks/pom.xml index fc28411e2036d212e1baaea9d7fd4804179a6672..393d82f41079d7cda85e1b9cdd23b68acae86b60 100644 --- a/plugins/org.jkiss.dbeaver.ext.ui.locks/pom.xml +++ b/plugins/org.jkiss.dbeaver.ext.ui.locks/pom.xml @@ -9,6 +9,6 @@ ../../ org.jkiss.dbeaver.ext.ui.locks - 1.0.27 + 1.0.28 eclipse-plugin diff --git a/plugins/org.jkiss.dbeaver.ext.ui.svg/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.ext.ui.svg/META-INF/MANIFEST.MF index fbae3880a77a5a993ae4092754b899a35702a25b..f418d51471834b9159c80509645cc38234d4782f 100644 --- a/plugins/org.jkiss.dbeaver.ext.ui.svg/META-INF/MANIFEST.MF +++ b/plugins/org.jkiss.dbeaver.ext.ui.svg/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.ext.ui.svg;singleton:=true -Bundle-Version: 1.0.18 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.19 +Bundle-Release-Date: 20180514 Bundle-Vendor: %Bundle-Vendor Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Require-Bundle: org.eclipse.core.runtime, diff --git a/plugins/org.jkiss.dbeaver.ext.ui.svg/pom.xml b/plugins/org.jkiss.dbeaver.ext.ui.svg/pom.xml index 0ebe5bf68134fa0b99db2427efe0ec725771f874..351e86648dbfeed610d3404f71782b4ad7ea85f2 100644 --- a/plugins/org.jkiss.dbeaver.ext.ui.svg/pom.xml +++ b/plugins/org.jkiss.dbeaver.ext.ui.svg/pom.xml @@ -9,6 +9,6 @@ ../../ org.jkiss.dbeaver.ext.ui.svg - 1.0.18 + 1.0.19 eclipse-plugin diff --git a/plugins/org.jkiss.dbeaver.ext.vertica/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.ext.vertica/META-INF/MANIFEST.MF index 72eac033e96d4688a095cca07a8b54ffd1bb588f..e73b621e9cc51d257b7e36866bc63e65a1fd2cfb 100644 --- a/plugins/org.jkiss.dbeaver.ext.vertica/META-INF/MANIFEST.MF +++ b/plugins/org.jkiss.dbeaver.ext.vertica/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.ext.vertica;singleton:=true -Bundle-Version: 2.0.12 -Bundle-Release-Date: 20180430 +Bundle-Version: 2.0.13 +Bundle-Release-Date: 20180514 Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime, org.eclipse.ui.views, diff --git a/plugins/org.jkiss.dbeaver.ext.vertica/OSGI-INF/l10n/bundle.properties b/plugins/org.jkiss.dbeaver.ext.vertica/OSGI-INF/l10n/bundle.properties index 82cafe657a549fe3f1657b4ba59d199c6029d55b..28d89fb2fe256aaef55e3b541b9b18a2d3169f42 100644 --- a/plugins/org.jkiss.dbeaver.ext.vertica/OSGI-INF/l10n/bundle.properties +++ b/plugins/org.jkiss.dbeaver.ext.vertica/OSGI-INF/l10n/bundle.properties @@ -57,6 +57,8 @@ meta.org.jkiss.dbeaver.ext.vertica.model.VerticaProjection.superProjection.name= meta.org.jkiss.dbeaver.ext.vertica.model.VerticaProjection.segmentExpression.name=Segment expression meta.org.jkiss.dbeaver.ext.vertica.model.VerticaProjection.keyConstraintProjection.name=Key constraint projection meta.org.jkiss.dbeaver.ext.vertica.model.VerticaProjection.isAggregateProjection.name=Is aggregate +meta.org.jkiss.dbeaver.ext.vertica.model.VerticaProjection.description.name=Comment +meta.org.jkiss.dbeaver.ext.vertica.model.VerticaProjectionColumn.description.name=Comment meta.org.jkiss.dbeaver.ext.vertica.model.VerticaNode.name.name=Name meta.org.jkiss.dbeaver.ext.vertica.model.VerticaNode.nodeType.name=Type diff --git a/plugins/org.jkiss.dbeaver.ext.vertica/pom.xml b/plugins/org.jkiss.dbeaver.ext.vertica/pom.xml index 86f1cdb61eab8a4889a74a8125163108a6f7eb15..70ff593346f17c3c94f5837c5cb47855d181009f 100644 --- a/plugins/org.jkiss.dbeaver.ext.vertica/pom.xml +++ b/plugins/org.jkiss.dbeaver.ext.vertica/pom.xml @@ -9,6 +9,6 @@ ../../ org.jkiss.dbeaver.ext.vertica - 2.0.12 + 2.0.13 eclipse-plugin diff --git a/plugins/org.jkiss.dbeaver.ext.vertica/src/org/jkiss/dbeaver/ext/vertica/VerticaUtils.java b/plugins/org.jkiss.dbeaver.ext.vertica/src/org/jkiss/dbeaver/ext/vertica/VerticaUtils.java index 55ccc350ad1638bb37e8259a86ecc97f50ea3d27..0b562160d13e111f06082ebc602694c89f0bb3fe 100644 --- a/plugins/org.jkiss.dbeaver.ext.vertica/src/org/jkiss/dbeaver/ext/vertica/VerticaUtils.java +++ b/plugins/org.jkiss.dbeaver.ext.vertica/src/org/jkiss/dbeaver/ext/vertica/VerticaUtils.java @@ -21,12 +21,15 @@ import org.jkiss.code.NotNull; import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.ext.generic.model.GenericDataSource; +import org.jkiss.dbeaver.ext.vertica.model.VerticaObjectType; +import org.jkiss.dbeaver.model.DBPDataSource; import org.jkiss.dbeaver.model.DBPEvaluationContext; import org.jkiss.dbeaver.model.DBPQualifiedObject; import org.jkiss.dbeaver.model.DBUtils; import org.jkiss.dbeaver.model.exec.jdbc.JDBCPreparedStatement; import org.jkiss.dbeaver.model.exec.jdbc.JDBCResultSet; import org.jkiss.dbeaver.model.exec.jdbc.JDBCSession; +import org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.dbeaver.model.struct.DBSObject; @@ -125,4 +128,19 @@ public class VerticaUtils { return Types.OTHER; } } + + public static String getObjectComment(DBRProgressMonitor monitor, DBPDataSource dataSource, VerticaObjectType objectType, String schema, String object) + throws DBException + { + try (JDBCSession session = DBUtils.openMetaSession(monitor, dataSource, "Load Vertica comment")) { + return JDBCUtils.queryString( + session, + "select comment from v_catalog.comments c\n" + + "where c.object_schema = ? and c.object_name = ? AND c.object_type = ?", schema, object, objectType.name()); + } catch (Exception e) { + log.debug(e); + return null; + } + } + } diff --git a/plugins/org.jkiss.dbeaver.ext.vertica/src/org/jkiss/dbeaver/ext/vertica/model/VerticaMetaModel.java b/plugins/org.jkiss.dbeaver.ext.vertica/src/org/jkiss/dbeaver/ext/vertica/model/VerticaMetaModel.java index 5d0defc630dd2bfdde0f732de77d244a081a6b77..072deb5f9521b750c770e513dbc62f1575c8edfa 100644 --- a/plugins/org.jkiss.dbeaver.ext.vertica/src/org/jkiss/dbeaver/ext/vertica/model/VerticaMetaModel.java +++ b/plugins/org.jkiss.dbeaver.ext.vertica/src/org/jkiss/dbeaver/ext/vertica/model/VerticaMetaModel.java @@ -24,7 +24,6 @@ import org.jkiss.dbeaver.ext.generic.model.*; import org.jkiss.dbeaver.ext.generic.model.meta.GenericMetaModel; import org.jkiss.dbeaver.ext.vertica.VerticaUtils; import org.jkiss.dbeaver.model.DBPDataSourceContainer; -import org.jkiss.dbeaver.model.DBPEvaluationContext; import org.jkiss.dbeaver.model.DBUtils; import org.jkiss.dbeaver.model.exec.DBCQueryTransformProvider; import org.jkiss.dbeaver.model.exec.DBCQueryTransformType; @@ -69,7 +68,7 @@ public class VerticaMetaModel extends GenericMetaModel implements DBCQueryTransf return super.prepareTableLoadStatement(session, owner, object, objectName); } JDBCPreparedStatement dbStat = session.prepareStatement( - "SELECT tv.*,c.comment FROM (\n" + + "SELECT tv.*,c.comment as REMARKS FROM (\n" + "SELECT NULL as TABLE_CAT, t.table_schema as TABLE_SCHEM, t.table_name as TABLE_NAME, (CASE t.is_flextable WHEN true THEN 'FLEXTABLE' ELSE 'TABLE' END) as TABLE_TYPE, NULL as TYPE_CAT,\n" + "\tt.owner_name, t.table_definition as DEFINITION \n" + "FROM v_catalog.tables t\n" + @@ -93,6 +92,17 @@ public class VerticaMetaModel extends GenericMetaModel implements DBCQueryTransf return new VerticaTable(container, tableName, tableType, dbResult); } + @Override + public GenericTableColumn createTableColumnImpl(DBRProgressMonitor monitor, GenericTable table, String columnName, String typeName, int valueType, int sourceType, int ordinalPos, long columnSize, long charLength, Integer scale, Integer precision, int radix, boolean notNull, String remarks, String defaultValue, boolean autoIncrement, boolean autoGenerated) throws DBException { + return new VerticaTableColumn(table, + columnName, + typeName, valueType, sourceType, ordinalPos, + columnSize, + charLength, scale, precision, radix, notNull, + remarks, defaultValue, autoIncrement, autoGenerated + ); + } + @Override public String getTableDDL(DBRProgressMonitor monitor, GenericTable sourceObject, Map options) throws DBException { GenericDataSource dataSource = sourceObject.getDataSource(); diff --git a/plugins/org.jkiss.dbeaver.ext.vertica/src/org/jkiss/dbeaver/ext/vertica/model/VerticaObjectType.java b/plugins/org.jkiss.dbeaver.ext.vertica/src/org/jkiss/dbeaver/ext/vertica/model/VerticaObjectType.java new file mode 100644 index 0000000000000000000000000000000000000000..391356615666895df953e587e60ee25a97969099 --- /dev/null +++ b/plugins/org.jkiss.dbeaver.ext.vertica/src/org/jkiss/dbeaver/ext/vertica/model/VerticaObjectType.java @@ -0,0 +1,25 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2017 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.vertica.model; + +/** + * VerticaObjectType + */ +public enum VerticaObjectType { + TABLE, + COLUMN +} \ No newline at end of file diff --git a/plugins/org.jkiss.dbeaver.ext.vertica/src/org/jkiss/dbeaver/ext/vertica/model/VerticaProjection.java b/plugins/org.jkiss.dbeaver.ext.vertica/src/org/jkiss/dbeaver/ext/vertica/model/VerticaProjection.java index 3a5bf3e11fbed6a2f4798780d05c71d69a6f89e3..a0e3e165ad98ddb5a093124aeba5795d9a2d168a 100644 --- a/plugins/org.jkiss.dbeaver.ext.vertica/src/org/jkiss/dbeaver/ext/vertica/model/VerticaProjection.java +++ b/plugins/org.jkiss.dbeaver.ext.vertica/src/org/jkiss/dbeaver/ext/vertica/model/VerticaProjection.java @@ -44,6 +44,7 @@ public class VerticaProjection extends JDBCTable { private static final Log log = Log.getLog(VerticaProjectionColumn.class); + private String description; protected VerticaProjectionColumn(VerticaProjection table, JDBCResultSet dbResult) { super(table, true); @@ -37,6 +41,7 @@ public class VerticaProjectionColumn extends JDBCTableColumn setName(JDBCUtils.safeGetString(dbResult, "projection_column_name")); setOrdinalPosition(JDBCUtils.safeGetInt(dbResult, "column_position")); this.typeName = JDBCUtils.safeGetString(dbResult, "data_type"); + this.description = JDBCUtils.safeGetString(dbResult, "comment"); this.valueType = VerticaUtils.resolveValueType(this.typeName); { @@ -93,4 +98,15 @@ public class VerticaProjectionColumn extends JDBCTableColumn public Integer getPrecision() { return super.getPrecision(); } + + @Override + public String getDescription() { + return super.getDescription(); + } + + @Property(viewable = true, order = 100) + public String getDescription(DBRProgressMonitor monitor) throws DBException { + return description; + } + } diff --git a/plugins/org.jkiss.dbeaver.ext.vertica/src/org/jkiss/dbeaver/ext/vertica/model/VerticaSchema.java b/plugins/org.jkiss.dbeaver.ext.vertica/src/org/jkiss/dbeaver/ext/vertica/model/VerticaSchema.java index 75228e46d493cbcabe01d6d9c2956f59e662f5ad..95149b8fb9d9bcce11251138350be4c330850730 100644 --- a/plugins/org.jkiss.dbeaver.ext.vertica/src/org/jkiss/dbeaver/ext/vertica/model/VerticaSchema.java +++ b/plugins/org.jkiss.dbeaver.ext.vertica/src/org/jkiss/dbeaver/ext/vertica/model/VerticaSchema.java @@ -34,6 +34,7 @@ import org.jkiss.dbeaver.model.impl.jdbc.cache.JDBCObjectLookupCache; import org.jkiss.dbeaver.model.impl.jdbc.cache.JDBCStructLookupCache; import org.jkiss.dbeaver.model.meta.Association; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; +import org.jkiss.dbeaver.model.struct.DBSObject; import org.jkiss.utils.ArrayUtils; import java.sql.SQLException; @@ -62,6 +63,24 @@ public class VerticaSchema extends GenericSchema implements DBPSystemObject super(dataSource, catalog, schemaName); } + @Override + public Collection getChildren(DBRProgressMonitor monitor) throws DBException { + List children = new ArrayList<>(getTables(monitor)); + children.addAll(getProjections(monitor)); + return children; + } + + @Override + public DBSObject getChild(@NotNull DBRProgressMonitor monitor, @NotNull String childName) + throws DBException + { + DBSObject child = getTable(monitor, childName); + if (child == null) { + child = getProjection(monitor, childName); + } + return child; + } + @Association public Collection getFlexTables(DBRProgressMonitor monitor) throws DBException { Collection tables = getTables(monitor); @@ -82,6 +101,11 @@ public class VerticaSchema extends GenericSchema implements DBPSystemObject return projectionCache.getAllObjects(monitor, this); } + @Association + public VerticaProjection getProjection(DBRProgressMonitor monitor, String name) throws DBException { + return projectionCache.getObject(monitor, this, name); + } + @Association public Collection getUserDefinedFunctions(DBRProgressMonitor monitor) throws DBException { return udfCache.getAllObjects(monitor, this); @@ -104,7 +128,9 @@ public class VerticaSchema extends GenericSchema implements DBPSystemObject @Override public JDBCStatement prepareLookupStatement(@NotNull JDBCSession session, @NotNull VerticaSchema schema, @Nullable VerticaProjection object, @Nullable String objectName) throws SQLException { final JDBCPreparedStatement dbStat = session.prepareStatement( - "SELECT * FROM v_catalog.projections WHERE projection_schema=?" + + "SELECT p.*,c.comment FROM v_catalog.projections p\n" + + "LEFT OUTER JOIN v_catalog.comments c ON c.object_type = 'PROJECTION' AND c.object_schema = p.projection_schema AND c.object_name = p.projection_name\n" + + "WHERE p.projection_schema=?" + (object == null && objectName == null ? "" : " AND projection_name=?") ); dbStat.setString(1, schema.getName()); @@ -123,13 +149,13 @@ public class VerticaSchema extends GenericSchema implements DBPSystemObject protected JDBCStatement prepareChildrenStatement(@NotNull JDBCSession session, @NotNull VerticaSchema owner, @Nullable VerticaProjection forTable) throws SQLException { - StringBuilder sql = new StringBuilder(); - sql.append("SELECT * FROM v_catalog.projection_columns pc\n" + - "\nWHERE projection_name=? " + - "\nORDER BY column_position"); + String sql = ("SELECT pc.*,c.comment FROM v_catalog.projection_columns pc\n" + + "LEFT OUTER JOIN v_catalog.comments c ON c.object_id = pc.column_id\n" + + "WHERE pc.projection_id=?\n" + + "ORDER BY pc.column_position"); - JDBCPreparedStatement dbStat = session.prepareStatement(sql.toString()); - dbStat.setString(1, forTable.getName()); + JDBCPreparedStatement dbStat = session.prepareStatement(sql); + dbStat.setLong(1, forTable.getObjectId()); return dbStat; } diff --git a/plugins/org.jkiss.dbeaver.ext.vertica/src/org/jkiss/dbeaver/ext/vertica/model/VerticaTable.java b/plugins/org.jkiss.dbeaver.ext.vertica/src/org/jkiss/dbeaver/ext/vertica/model/VerticaTable.java index 147b7a2b93296368c49f8e8c2c594757dc5578b0..5bbe628b35ec91a520b2e73fe10800b1d7d7c5a9 100644 --- a/plugins/org.jkiss.dbeaver.ext.vertica/src/org/jkiss/dbeaver/ext/vertica/model/VerticaTable.java +++ b/plugins/org.jkiss.dbeaver.ext.vertica/src/org/jkiss/dbeaver/ext/vertica/model/VerticaTable.java @@ -40,5 +40,4 @@ public class VerticaTable extends GenericTable return TABLE_TYPE_FLEX.equals(getTableType()); } - } diff --git a/plugins/org.jkiss.dbeaver.ext.vertica/src/org/jkiss/dbeaver/ext/vertica/model/VerticaTableColumn.java b/plugins/org.jkiss.dbeaver.ext.vertica/src/org/jkiss/dbeaver/ext/vertica/model/VerticaTableColumn.java new file mode 100644 index 0000000000000000000000000000000000000000..e2786de2ae4b8e9c66c311d4d3703c2e23471fa2 --- /dev/null +++ b/plugins/org.jkiss.dbeaver.ext.vertica/src/org/jkiss/dbeaver/ext/vertica/model/VerticaTableColumn.java @@ -0,0 +1,40 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2017 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.vertica.model; + +import org.jkiss.dbeaver.DBException; +import org.jkiss.dbeaver.ext.generic.model.GenericTable; +import org.jkiss.dbeaver.ext.generic.model.GenericTableColumn; +import org.jkiss.dbeaver.ext.vertica.VerticaUtils; +import org.jkiss.dbeaver.model.meta.Property; +import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; + +/** + * VerticaTableColumn + */ +public class VerticaTableColumn extends GenericTableColumn +{ + + public VerticaTableColumn(GenericTable table) { + super(table); + } + + public VerticaTableColumn(GenericTable table, String columnName, String typeName, int valueType, int sourceType, int ordinalPosition, long columnSize, long charLength, Integer scale, Integer precision, int radix, boolean notNull, String remarks, String defaultValue, boolean autoIncrement, boolean autoGenerated) { + super(table, columnName, typeName, valueType, sourceType, ordinalPosition, columnSize, charLength, scale, precision, radix, notNull, remarks, defaultValue, autoIncrement, autoGenerated); + } + +} diff --git a/plugins/org.jkiss.dbeaver.ext.wmi/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.ext.wmi/META-INF/MANIFEST.MF index c70b2a72861aae6bf44b87bd0f34dd166c35cce9..72af1e52270f59fe7b30406a668a6c0df9d9e1be 100644 --- a/plugins/org.jkiss.dbeaver.ext.wmi/META-INF/MANIFEST.MF +++ b/plugins/org.jkiss.dbeaver.ext.wmi/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.ext.wmi;singleton:=true -Bundle-Version: 2.0.84 -Bundle-Release-Date: 20180430 +Bundle-Version: 2.0.85 +Bundle-Release-Date: 20180514 Bundle-Activator: org.jkiss.dbeaver.ext.wmi.Activator Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime, diff --git a/plugins/org.jkiss.dbeaver.ext.wmi/pom.xml b/plugins/org.jkiss.dbeaver.ext.wmi/pom.xml index 87e6485962cd868cd36fc2aae9e156e1b0696f3e..77b47c3a3fc8f3425886e414ae0f2b9d3295f390 100644 --- a/plugins/org.jkiss.dbeaver.ext.wmi/pom.xml +++ b/plugins/org.jkiss.dbeaver.ext.wmi/pom.xml @@ -9,6 +9,6 @@ ../../ org.jkiss.dbeaver.ext.wmi - 2.0.84 + 2.0.85 eclipse-plugin diff --git a/plugins/org.jkiss.dbeaver.model/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.model/META-INF/MANIFEST.MF index f288fe8ce0380791b4346f9fe4858dfb36d8d2bc..6a4e7f8af4d94f28f5cf2c9f202700948e555ac3 100644 --- a/plugins/org.jkiss.dbeaver.model/META-INF/MANIFEST.MF +++ b/plugins/org.jkiss.dbeaver.model/META-INF/MANIFEST.MF @@ -3,8 +3,8 @@ Bundle-ManifestVersion: 2 Bundle-Vendor: %Bundle-Vendor Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.model;singleton:=true -Bundle-Version: 1.0.71 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.72 +Bundle-Release-Date: 20180514 Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy Bundle-Activator: org.jkiss.dbeaver.bundle.ModelActivator diff --git a/plugins/org.jkiss.dbeaver.model/pom.xml b/plugins/org.jkiss.dbeaver.model/pom.xml index b3d29fa9310f5cb7e1cb5ac17658fd9694dd3c74..58e3066c4a217811a3c4bfbf631881d40f44665b 100644 --- a/plugins/org.jkiss.dbeaver.model/pom.xml +++ b/plugins/org.jkiss.dbeaver.model/pom.xml @@ -10,7 +10,7 @@ ../../ org.jkiss.dbeaver.model - 1.0.71 + 1.0.72 eclipse-plugin diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/Log.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/Log.java index 6076c491a06f5e90072a3c113c9bfa7e6f19f17f..f84e2ba514bf9c9d7e18b76b3d9897a2ab758fc3 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/Log.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/Log.java @@ -47,34 +47,29 @@ public class Log return new Log(forClass.getName()); } - public static void log(Log delegate, IStatus status) { + public void log(IStatus status) { if (status == null) { // nothing to log return; } - if (delegate == null) { - getEclipseLog().log(status); - // no way to log - return; - } int severity = status.getSeverity(); String message = status.getMessage(); Throwable exception = status.getException(); switch (severity) { case IStatus.CANCEL: - delegate.debug(message, exception); + debug(message, exception); break; case IStatus.ERROR: - delegate.error(message, exception); + error(message, exception); break; case IStatus.WARNING: - delegate.warn(message, exception); + warn(message, exception); break; case IStatus.INFO: - delegate.info(message, exception); + info(message, exception); break; case IStatus.OK: - delegate.trace(message, exception); + trace(message, exception); break; default: break; diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/DBPDataSourceProvider.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/DBPDataSourceProvider.java index 099659ba4af6bce0155f9e582c3dca2ccee94444..05afe614fb17fa36eefabc7e2b2bcd2fa2c463eb 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/DBPDataSourceProvider.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/DBPDataSourceProvider.java @@ -29,6 +29,7 @@ import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; */ public interface DBPDataSourceProvider extends DBPObject { + long FEATURE_NONE = 0; long FEATURE_CATALOGS = 1; long FEATURE_SCHEMAS = 2; diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/DBPScriptObject.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/DBPScriptObject.java index 8161752de2fdd0a8be2424204fa758fa314914ab..672148373eeea0035e64d5d31a5c4c5f26a8c7ad 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/DBPScriptObject.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/DBPScriptObject.java @@ -46,6 +46,9 @@ public interface DBPScriptObject extends DBPObject { // nested objects (columns, constraints, etc) which can be embedded in parent object declaration (tables) String OPTION_EMBEDDED_SOURCE = "embedded.source"; + // Means that result script will be used for object save + String OPTION_OBJECT_SAVE = "object.save"; + Map EMPTY_OPTIONS = Collections.unmodifiableMap(new HashMap<>()); String getObjectDefinitionText(DBRProgressMonitor monitor, Map options) diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/DBUtils.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/DBUtils.java index 5befde7a8ba01f68d9ae249d17425cd7f3901442..7fc017d3e28e9d76b7c7385d3045b4ffd69e8dac 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/DBUtils.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/DBUtils.java @@ -286,6 +286,13 @@ public final class DBUtils { @Nullable String objectName) throws DBException { + if (!CommonUtils.isEmpty(catalogName)) { + Class childType = rootSC.getChildType(monitor); + if (DBSSchema.class.isAssignableFrom(childType)) { + // Datasource supports only schemas. Do not use catalog + catalogName = null; + } + } if (!CommonUtils.isEmpty(catalogName) && !CommonUtils.isEmpty(schemaName)) { // We have both both - just search both DBSObject catalog = rootSC.getChild(monitor, catalogName); @@ -1547,16 +1554,35 @@ public final class DBUtils { return true; } - public static boolean checkUnique(DBRProgressMonitor monitor, DBSEntity dbsEntity, DBSAttributeBase attribute) throws DBException { + public enum UNIQ_TYPE { + SINGLE, MULTI + } + + public static UNIQ_TYPE checkUnique(DBRProgressMonitor monitor, DBSEntity dbsEntity, DBSAttributeBase attribute) throws DBException { for (DBSEntityConstraint constraint : dbsEntity.getConstraints(monitor)) { DBSEntityConstraintType constraintType = constraint.getConstraintType(); if (constraintType.isUnique()) { DBSEntityAttributeRef constraintAttribute = getConstraintAttribute(monitor, ((DBSEntityReferrer) constraint), attribute.getName()); if (constraintAttribute != null && constraintAttribute.getAttribute() == attribute) { - return true; + List refColumns = ((DBSEntityReferrer) constraint).getAttributeReferences(monitor); + if (refColumns.size() > 1) { + return UNIQ_TYPE.MULTI; + } else { + return UNIQ_TYPE.SINGLE; + } } } } - return false; + return null; + } + + public static DBSEntityConstraint getConstraint(DBRProgressMonitor monitor, DBSEntity dbsEntity, DBSAttributeBase attribute) throws DBException { + for (DBSEntityConstraint constraint : dbsEntity.getConstraints(monitor)) { + DBSEntityAttributeRef constraintAttribute = getConstraintAttribute(monitor, ((DBSEntityReferrer) constraint), attribute.getName()); + if (constraintAttribute != null && constraintAttribute.getAttribute() == attribute) { + return constraint; + } + } + return null; } } diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/data/DBDAttributeValue.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/data/DBDAttributeValue.java index 28de51535b0a8c919a2a6537b5a708e2e11a6c31..677c09e6572f5fe2ed5ab79ce3bde57657ebfedf 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/data/DBDAttributeValue.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/data/DBDAttributeValue.java @@ -19,6 +19,7 @@ package org.jkiss.dbeaver.model.data; import org.jkiss.code.NotNull; import org.jkiss.code.Nullable; import org.jkiss.dbeaver.model.struct.DBSAttributeBase; +import org.jkiss.utils.CommonUtils; import java.util.List; @@ -71,4 +72,17 @@ public class DBDAttributeValue { return values; } + @Override + public boolean equals(Object obj) { + if (obj == null || !(obj instanceof DBDAttributeValue)) { + return false; + } + if (!CommonUtils.equalObjects(value, ((DBDAttributeValue) obj).value)) { + return false; + } + if (!CommonUtils.equalObjects(attribute.getName(), ((DBDAttributeValue) obj).attribute.getName())) { + return false; + } + return true; + } } diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/edit/DBEObjectMaker.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/edit/DBEObjectMaker.java index 99ae31b534d24779a12b0778c61aba53c94b2ca6..9003a0dd485ef3396f6a400dd126f00ef3ccc5a8 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/edit/DBEObjectMaker.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/edit/DBEObjectMaker.java @@ -80,6 +80,6 @@ public interface DBEObjectMaker e * @param object object * @param options delete options. Options are set by delete wizard. */ - void deleteObject(DBECommandContext commandContext, OBJECT_TYPE object, Map options); + void deleteObject(DBECommandContext commandContext, OBJECT_TYPE object, Map options) throws DBException; } \ No newline at end of file diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/edit/prop/DBECommandComposite.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/edit/prop/DBECommandComposite.java index 2845b2ee98a3693c32fe1b5304634174ed87e32c..0dec22df83c7ab0fc79672a3f7077e752c6461fd 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/edit/prop/DBECommandComposite.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/edit/prop/DBECommandComposite.java @@ -46,6 +46,11 @@ public abstract class DBECommandComposite extends JDBCAttribute implements DBSTableColumn, DBSAttributeEnumerable, DBPSaveableObject { +public abstract class JDBCTableColumn extends JDBCAttribute implements DBSTableColumn, DBSEntityAttribute, DBSAttributeEnumerable, DBPSaveableObject { private final TABLE_TYPE table; private boolean persisted; diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/sql/edit/SQLObjectEditor.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/sql/edit/SQLObjectEditor.java index c3189eadf359eb055b5c32aa9082532d0286f6da..b607b080309a8c6fd32f7a4f9ff4e637b1d1d5f2 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/sql/edit/SQLObjectEditor.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/sql/edit/SQLObjectEditor.java @@ -101,8 +101,7 @@ public abstract class SQLObjectEditor options) - { + public void deleteObject(DBECommandContext commandContext, OBJECT_TYPE object, Map options) throws DBException { commandContext.addCommand( new ObjectDeleteCommand(object, ModelMessages.model_jdbc_delete_object), new DeleteObjectReflector<>(this), diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/messages/ModelMessages.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/messages/ModelMessages.java index 2c60f8ad313a8b1a22ba729aa6b01596fce209ed..c3d5681fa442b447b21de7ac05b7411a03e44371 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/messages/ModelMessages.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/messages/ModelMessages.java @@ -114,7 +114,6 @@ public class ModelMessages extends NLS { public static String model_jdbc_scale; public static String model_jdbc_Schema; public static String model_jdbc_Serializable; - public static String model_jdbc_set_to_current_time; public static String model_jdbc_type_name; public static String model_jdbc_unknown; public static String model_jdbc_unsupported_column_type_; diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/messages/ModelResources.properties b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/messages/ModelResources.properties index c9bb84caaeb29a047d379c3dbce9f9439dce1a0e..fb8ceddb9bedb4c3b5ac1caee906565c2ea0b037 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/messages/ModelResources.properties +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/messages/ModelResources.properties @@ -92,7 +92,6 @@ model_jdbc_save_to_file_=Save to file ... model_jdbc_scale=Scale model_jdbc_Schema=Schema model_jdbc_Serializable=Serializable -model_jdbc_set_to_current_time=Set to current time model_jdbc_type_name=Type Name model_jdbc_unknown=Unknown model_jdbc_unsupported_column_type_=Unsupported column type: diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/navigator/DBNDatabaseNode.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/navigator/DBNDatabaseNode.java index 12d15d94e37be3a23ca299bac135ee7eb7e91eb4..c5ac4c90ce1fe78a26de86960487c44e1e34d9a0 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/navigator/DBNDatabaseNode.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/navigator/DBNDatabaseNode.java @@ -604,7 +604,7 @@ public abstract class DBNDatabaseNode extends DBNNode implements DBSWrapper, DBP { DBPDataSourceContainer dataSource = getDataSourceContainer(); if (dataSource != null && this instanceof DBNContainer) { - Class childrenClass = this.getChildrenClass(meta); + Class childrenClass = this.getChildrenOrFolderClass(meta); if (childrenClass != null) { Object valueObject = getValueObject(); DBSObject parentObject = null; @@ -621,17 +621,19 @@ public abstract class DBNDatabaseNode extends DBNNode implements DBSWrapper, DBP { DBPDataSourceContainer dataSource = getDataSourceContainer(); if (dataSource != null && this instanceof DBNContainer) { - Class childrenClass = this.getChildrenClass(meta); + Class childrenClass = this.getChildrenOrFolderClass(meta); if (childrenClass != null) { Object parentObject = getValueObject(); if (parentObject instanceof DBPDataSource) { parentObject = null; } dataSource.setObjectFilter( - this.getChildrenClass(meta), + childrenClass, (DBSObject) parentObject, filter); dataSource.persistConfiguration(); + } else { + log.error("Cannot detect child node type - can't save filter configuration"); } } else { log.error("No active datasource - can't save filter configuration"); @@ -750,8 +752,7 @@ public abstract class DBNDatabaseNode extends DBNNode implements DBSWrapper, DBP } } - protected Class getChildrenClass(DBXTreeItem childMeta) - { + protected Class getChildrenClass(DBXTreeItem childMeta) { Object valueObject = getValueObject(); if (valueObject == null) { return null; @@ -765,6 +766,14 @@ public abstract class DBNDatabaseNode extends DBNNode implements DBSWrapper, DBP return BeanUtils.getCollectionType(propType); } + protected Class getChildrenOrFolderClass(DBXTreeItem childMeta) { + Class childrenClass = this.getChildrenClass(childMeta); + if (childrenClass == null && this instanceof DBNContainer) { + childrenClass = ((DBNContainer)this).getChildrenClass(); + } + return childrenClass; + } + public IProject getOwnerProject() { for (DBNNode node = getParentNode(); node != null; node = node.getParentNode()) { if (node instanceof DBNProject) { diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/navigator/DBNModel.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/navigator/DBNModel.java index b8f94ef85fd132e30537af2865397e5e8872ff3b..cda68eb9e5e67153b7a84f75788c4b88a89db142 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/navigator/DBNModel.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/navigator/DBNModel.java @@ -364,6 +364,9 @@ public class DBNModel implements IResourceChangeListener { break; } } + } else if (child.getObject() == objectToCache) { + cached = true; + break; } } } diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/QMController.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/QMController.java index 0f332f519a4d501aa2215e3613af38fcb1836731..aa691088b6ca76b2bd64b2d96f887c63e3b0fefb 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/QMController.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/QMController.java @@ -17,8 +17,6 @@ package org.jkiss.dbeaver.model.qm; -import java.util.List; - /** * Query manager controller */ @@ -28,6 +26,8 @@ public interface QMController { QMExecutionHandler getDefaultHandler(); + QMEventBrowser getEventBrowser(); + void registerHandler(QMExecutionHandler handler); void unregisterHandler(QMExecutionHandler handler); @@ -36,5 +36,4 @@ public interface QMController { void unregisterMetaListener(QMMetaListener metaListener); - List getPastMetaEvents(); } diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/QMEventBrowser.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/QMEventBrowser.java new file mode 100644 index 0000000000000000000000000000000000000000..037c50e5e6e7f0abda314ca0ecf5656142223d88 --- /dev/null +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/QMEventBrowser.java @@ -0,0 +1,34 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2018 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.model.qm; + +import org.jkiss.code.NotNull; +import org.jkiss.dbeaver.DBException; +import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; + +/** + * Query manager history + */ +public interface QMEventBrowser { + + QMEventCursor getQueryHistoryCursor( + @NotNull DBRProgressMonitor monitor, + @NotNull QMEventCriteria criteria) + throws DBException; + +} diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/QMEventCriteria.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/QMEventCriteria.java new file mode 100644 index 0000000000000000000000000000000000000000..275e6a0aa354570ea86c21a604b271599ca82a11 --- /dev/null +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/QMEventCriteria.java @@ -0,0 +1,98 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2018 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.model.qm; + +import org.jkiss.code.NotNull; +import org.jkiss.code.Nullable; +import org.jkiss.dbeaver.model.exec.DBCExecutionPurpose; +import org.jkiss.utils.ArrayUtils; + +/** + * QM event criteria + */ +public class QMEventCriteria { + + @Nullable + String containerId; + @Nullable + String sessionId; + @NotNull + QMObjectType[] objectTypes = new QMObjectType[0]; + @NotNull + DBCExecutionPurpose[] queryTypes = new DBCExecutionPurpose[0]; + @Nullable + String searchString; + + public String getContainerId() { + return containerId; + } + + public void setContainerId(String containerId) { + this.containerId = containerId; + } + + public String getSessionId() { + return sessionId; + } + + public void setSessionId(String sessionId) { + this.sessionId = sessionId; + } + + public QMObjectType[] getObjectTypes() { + return objectTypes; + } + + public void setObjectTypes(QMObjectType[] objectTypes) { + this.objectTypes = objectTypes; + } + + public boolean hasObjectTypes() { + return objectTypes.length > 0 && objectTypes.length != QMObjectType.values().length; + } + + public boolean hasObjectType(QMObjectType type) { + // If all object types are here it is the same as no object type + return objectTypes.length > 0 && ArrayUtils.contains(objectTypes, type); + } + + public DBCExecutionPurpose[] getQueryTypes() { + return queryTypes; + } + + public void setQueryTypes(DBCExecutionPurpose[] queryTypes) { + this.queryTypes = queryTypes; + } + + public boolean hasQueryTypes() { + // If all query types are here it is the same as no query type + return queryTypes.length > 0 && queryTypes.length != DBCExecutionPurpose.values().length; + } + + public boolean hasQueryType(DBCExecutionPurpose type) { + return queryTypes.length > 0 && ArrayUtils.contains(queryTypes, type); + } + + public String getSearchString() { + return searchString; + } + + public void setSearchString(String searchString) { + this.searchString = searchString; + } +} diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/QMEventCursor.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/QMEventCursor.java new file mode 100644 index 0000000000000000000000000000000000000000..0855688f03ae947de3501e6a4ca1da967d5dd580 --- /dev/null +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/QMEventCursor.java @@ -0,0 +1,37 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2017 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.model.qm; + +import org.jkiss.dbeaver.DBException; +import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; + +/** + * Event cursor + */ +public interface QMEventCursor extends AutoCloseable { + + long getTotalSize(); + + void scroll(int position, DBRProgressMonitor monitor) throws DBException; + + boolean hasNextEvent(DBRProgressMonitor monitor) throws DBException; + + QMMetaEvent nextEvent(DBRProgressMonitor monitor) throws DBException; + + void close(); +} diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/QMEventHistory.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/QMEventHistory.java deleted file mode 100644 index d4916eec7a405916cee4a8b2ddd83d96b74184ff..0000000000000000000000000000000000000000 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/QMEventHistory.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * DBeaver - Universal Database Manager - * Copyright (C) 2010-2017 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.model.qm; - -import org.jkiss.code.Nullable; -import org.jkiss.dbeaver.model.exec.DBCExecutionPurpose; -import org.jkiss.dbeaver.model.qm.meta.QMMSessionInfo; -import org.jkiss.dbeaver.model.qm.meta.QMMStatementExecuteInfo; - -import java.util.Date; -import java.util.List; - -/** - * Query manager history - */ -public interface QMEventHistory { - - long getHistorySize(); - - List readEventHistory( - @Nullable QMObjectType objectType, - @Nullable Date startDate, - @Nullable Date endDate, - int maxEvents); - - List getSessionHistory( - @Nullable String containerId, - @Nullable Date startDate, - @Nullable Date endDate, - int maxSessions); - - List getQueryHistory( - @Nullable String containerId, - @Nullable DBCExecutionPurpose queryPurpose, - @Nullable Date startDate, - @Nullable Date endDate, - int maxQueries); - -} diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/QMMetaEvent.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/QMMetaEvent.java index f1df89f06eef0ad61d88cc8aae8d69f44e2c4359..bfbb89dc7c2b486e3d979c7fb2fb6194082fd9a5 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/QMMetaEvent.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/QMMetaEvent.java @@ -25,9 +25,29 @@ import org.jkiss.dbeaver.model.qm.meta.QMMObject; public class QMMetaEvent { public enum Action { - BEGIN, - END, - UPDATE, + BEGIN(0), + END(1), + UPDATE(2), + ; + + private final int id; + + Action(int id) { + this.id = id; + } + + public int getId() { + return id; + } + + public static Action getById(int id) { + for (Action action : values()) { + if (action.id == id) { + return action; + } + } + return BEGIN; + } } private final QMMObject object; diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/QMMetaListener.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/QMMetaListener.java index aeecdd1b56d0fae8c5590908fd92f883000025d6..5b09671154e24af2c4e8e643bff6a600176ec7ec 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/QMMetaListener.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/QMMetaListener.java @@ -18,6 +18,7 @@ package org.jkiss.dbeaver.model.qm; import org.jkiss.code.NotNull; +import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import java.util.List; @@ -31,6 +32,6 @@ public interface QMMetaListener { * Implementation must process all events in sync mode. * QM collector will clean all closed objects after listeners notification. */ - void metaInfoChanged(@NotNull List events); + void metaInfoChanged(@NotNull DBRProgressMonitor monitor, @NotNull List events); } diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/QMObjectType.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/QMObjectType.java index 60c7592abc501c4aa37fc1c76840038d55eddb66..d74c1e350b7e2e262cc3c6f4e0765bc04bc2b76f 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/QMObjectType.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/QMObjectType.java @@ -31,14 +31,16 @@ import java.util.List; */ public enum QMObjectType { - session(QMMSessionInfo.class), - txn(QMMTransactionInfo.class), - query(QMMStatementInfo.class); + session("Session", QMMSessionInfo.class), + txn("Transactions", QMMTransactionInfo.class), + query("Queries", QMMStatementInfo.class); + private final String title; private final Class type; - private QMObjectType(Class type) + QMObjectType(String title, Class type) { + this.title = title; this.type = type; } @@ -47,6 +49,10 @@ public enum QMObjectType { return type; } + public String getTitle() { + return title; + } + public static String toString(Collection objectTypes) { List names = new ArrayList<>(objectTypes.size()); diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/QMUtils.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/QMUtils.java index b06ac2fbca5bb6eed9517126a6dbdf7b7cead7d1..06bf8442b042261f9b2fb9f97304156ee7c13127 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/QMUtils.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/QMUtils.java @@ -1,6 +1,6 @@ /* * DBeaver - Universal Database Manager - * Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org) + * Copyright (C) 2010-2018 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. @@ -18,15 +18,21 @@ package org.jkiss.dbeaver.model.qm; import org.jkiss.code.NotNull; +import org.jkiss.code.Nullable; +import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.model.app.DBPPlatform; import org.jkiss.dbeaver.model.exec.DBCExecutionContext; import org.jkiss.dbeaver.model.exec.DBCExecutionPurpose; +import org.jkiss.dbeaver.model.preferences.DBPPreferenceStore; import org.jkiss.dbeaver.model.qm.meta.QMMSessionInfo; import org.jkiss.dbeaver.model.qm.meta.QMMStatementExecuteInfo; import org.jkiss.dbeaver.model.qm.meta.QMMTransactionInfo; import org.jkiss.dbeaver.model.qm.meta.QMMTransactionSavepointInfo; +import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; +import org.jkiss.utils.CommonUtils; -import java.util.Collections; +import java.util.ArrayList; +import java.util.Collection; import java.util.List; /** @@ -35,47 +41,41 @@ import java.util.List; public class QMUtils { private static DBPPlatform application; - private static QMExecutionHandler defaultHandler; - + private static QMExecutionHandler defaultHandler; + public static void initApplication(DBPPlatform application) { QMUtils.application = application; } - - public static QMExecutionHandler getDefaultHandler() - { + + public static QMExecutionHandler getDefaultHandler() { if (defaultHandler == null) { defaultHandler = application.getQueryManager().getDefaultHandler(); } return defaultHandler; } - public static void registerHandler(QMExecutionHandler handler) - { + public static void registerHandler(QMExecutionHandler handler) { application.getQueryManager().registerHandler(handler); } - public static void unregisterHandler(QMExecutionHandler handler) - { + public static void unregisterHandler(QMExecutionHandler handler) { application.getQueryManager().unregisterHandler(handler); } - public static void registerMetaListener(QMMetaListener metaListener) - { + public static void registerMetaListener(QMMetaListener metaListener) { application.getQueryManager().registerMetaListener(metaListener); } - public static void unregisterMetaListener(QMMetaListener metaListener) - { + public static void unregisterMetaListener(QMMetaListener metaListener) { application.getQueryManager().unregisterMetaListener(metaListener); } - public static List getPastMetaEvents() - { + @Nullable + public static QMEventBrowser getEventBrowser() { if (application == null) { - return Collections.emptyList(); + return null; } - QMController queryManager = application.getQueryManager(); - return queryManager == null ? Collections.emptyList() : queryManager.getPastMetaEvents(); + return application.getQueryManager().getEventBrowser(); } public static boolean isTransactionActive(DBCExecutionContext executionContext) { @@ -150,4 +150,91 @@ public class QMUtils { return new QMTransactionState(execCount, updateCount, txnMode, txnStartTime); } + public static QMEventCriteria createDefaultCriteria(DBPPreferenceStore store) { + QMEventCriteria criteria = new QMEventCriteria(); + + Collection objectTypes = QMObjectType.fromString(store.getString(QMConstants.PROP_OBJECT_TYPES)); + criteria.setObjectTypes(objectTypes.toArray(new QMObjectType[0])); + List queryTypes = new ArrayList<>(); + for (String queryType : CommonUtils.splitString(store.getString(QMConstants.PROP_QUERY_TYPES), ',')) { + try { + queryTypes.add(DBCExecutionPurpose.valueOf(queryType)); + } catch (IllegalArgumentException e) { + // ignore + } + } + criteria.setQueryTypes(queryTypes.toArray(new DBCExecutionPurpose[0])); + return criteria; + } + + public static class ListCursorImpl implements QMEventCursor { + + private final List events; + private int position; + + public ListCursorImpl(List events) { + this.events = events; + this.position = 0; + } + + @Override + public long getTotalSize() { + return events.size(); + } + + @Override + public void scroll(int position, DBRProgressMonitor monitor) throws DBException { + if (position < 0 || position >= events.size()) { + throw new DBException("Position is out of range (" + getTotalSize() + ")"); + } + } + + @Override + public boolean hasNextEvent(DBRProgressMonitor monitor) throws DBException { + return position < events.size(); + } + + @Override + public QMMetaEvent nextEvent(DBRProgressMonitor monitor) throws DBException { + QMMetaEvent event = events.get(position); + position++; + return event; + } + + @Override + public void close() { + + } + + } + + public static class EmptyCursorImpl implements QMEventCursor { + + @Override + public long getTotalSize() { + return 0; + } + + @Override + public void scroll(int position, DBRProgressMonitor monitor) throws DBException { + throw new DBException("Empty cursor"); + } + + @Override + public boolean hasNextEvent(DBRProgressMonitor monitor) throws DBException { + return false; + } + + @Override + public QMMetaEvent nextEvent(DBRProgressMonitor monitor) throws DBException { + throw new DBException("Empty cursor"); + } + + @Override + public void close() { + + } + + } + } diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/meta/QMMObject.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/meta/QMMObject.java index 27f21c9676236fb536e6d1a143252a6768646a13..e554c2c62c97928905276ea4b7feccd83fa4a9b8 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/meta/QMMObject.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/meta/QMMObject.java @@ -42,6 +42,12 @@ public abstract class QMMObject { this.openTime = getTimeStamp(); } + protected QMMObject(long openTime, long closeTime) { + this.objectId = generateObjectId(); + this.openTime = openTime; + this.closeTime = closeTime; + } + protected void close() { this.closeTime = getTimeStamp(); @@ -84,6 +90,8 @@ public abstract class QMMObject { return closeTime > 0; } + public abstract String getText(); + protected synchronized void update() { this.updated = true; diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/meta/QMMSessionInfo.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/meta/QMMSessionInfo.java index d6f9cb76ec162b43d522d6aee30eaa3d4133425d..2836a6da6b7e1a4826197c163045612970f8750d 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/meta/QMMSessionInfo.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/meta/QMMSessionInfo.java @@ -16,6 +16,7 @@ */ package org.jkiss.dbeaver.model.qm.meta; +import org.jkiss.code.Nullable; import org.jkiss.dbeaver.model.connection.DBPConnectionConfiguration; import org.jkiss.dbeaver.model.exec.*; import org.jkiss.dbeaver.model.sql.SQLDataSource; @@ -29,8 +30,10 @@ public class QMMSessionInfo extends QMMObject { private final String containerId; private final String containerName; private final String driverId; + @Nullable private final DBPConnectionConfiguration connectionConfiguration; private final String contextName; + @Nullable private SQLDialect sqlDialect; private boolean transactional; @@ -53,7 +56,16 @@ public class QMMSessionInfo extends QMMObject { if (transactional) { this.transaction = new QMMTransactionInfo(this, null); } - //stack = new RuntimeException(); + } + + public QMMSessionInfo(long openTime, long closeTime, String containerId, String containerName, String driverId, DBPConnectionConfiguration connectionConfiguration, String contextName, boolean transactional) { + super(openTime, closeTime); + this.containerId = containerId; + this.containerName = containerName; + this.driverId = driverId; + this.connectionConfiguration = connectionConfiguration; + this.contextName = contextName; + this.transactional = transactional; } @Override @@ -78,6 +90,11 @@ public class QMMSessionInfo extends QMMObject { super.reopen(); } + @Override + public String getText() { + return this.containerName + " - " + contextName; + } + public QMMTransactionInfo changeTransactional(boolean transactional) { if (this.transactional == transactional) { diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/meta/QMMStatementExecuteInfo.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/meta/QMMStatementExecuteInfo.java index 35b95bb3e2036c992db6e4ca93e7644a5954ef41..61b3176ff834a7fb5d1b9215b9cd6a560dfbb7c2 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/meta/QMMStatementExecuteInfo.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/meta/QMMStatementExecuteInfo.java @@ -60,6 +60,18 @@ public class QMMStatementExecuteInfo extends QMMObject { } + public QMMStatementExecuteInfo(long openTime, long closeTime, QMMStatementInfo stmt, String queryString, long rowCount, int errorCode, String errorMessage, long fetchBeginTime, long fetchEndTime, boolean transactional) { + super(openTime, closeTime); + this.statement = stmt; + this.queryString = queryString; + this.rowCount = rowCount; + this.errorCode = errorCode; + this.errorMessage = errorMessage; + this.fetchBeginTime = fetchBeginTime; + this.fetchEndTime = fetchEndTime; + this.transactional = transactional; + } + void close(long rowCount, Throwable error) { if (error != null) { @@ -150,4 +162,8 @@ public class QMMStatementExecuteInfo extends QMMObject { return '"' + queryString + '"'; } + @Override + public String getText() { + return queryString; + } } diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/meta/QMMStatementInfo.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/meta/QMMStatementInfo.java index e151fd5e5bb1b00398c5e1f759d8bb0f98326838..ff280a712c56f7ab0c0d8ae667dbaaacf90c049a 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/meta/QMMStatementInfo.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/meta/QMMStatementInfo.java @@ -30,7 +30,7 @@ public class QMMStatementInfo extends QMMObject { private transient DBCStatement reference; - QMMStatementInfo(QMMSessionInfo session, DBCStatement reference, QMMStatementInfo previous) + public QMMStatementInfo(QMMSessionInfo session, DBCStatement reference, QMMStatementInfo previous) { this.session = session; this.reference = reference; @@ -38,6 +38,13 @@ public class QMMStatementInfo extends QMMObject { this.previous = previous; } + public QMMStatementInfo(long openTime, long closeTime, QMMSessionInfo session, DBCExecutionPurpose purpose) { + super(openTime, closeTime); + this.session = session; + this.purpose = purpose; + this.previous = null; + } + @Override public void close() { @@ -45,6 +52,11 @@ public class QMMStatementInfo extends QMMObject { reference = null; } + @Override + public String getText() { + return session.getText(); + } + DBCStatement getReference() { return reference; diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/meta/QMMTransactionInfo.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/meta/QMMTransactionInfo.java index 75a5a8e0d5406029e77708f8bb67283acef089d1..3d5583d5e931776da76c28209d041557b12fae74 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/meta/QMMTransactionInfo.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/meta/QMMTransactionInfo.java @@ -96,4 +96,8 @@ public class QMMTransactionInfo extends QMMObject { return "TRANSACTION"; } + @Override + public String getText() { + return session.getText(); + } } diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/meta/QMMTransactionSavepointInfo.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/meta/QMMTransactionSavepointInfo.java index fec3064981c14a51355fc2f6831a9b76c10676fc..187d29fad47f0ed767ea24bb19e5178b98beea58 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/meta/QMMTransactionSavepointInfo.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/qm/meta/QMMTransactionSavepointInfo.java @@ -133,4 +133,9 @@ public class QMMTransactionSavepointInfo extends QMMObject { } return false; } + + @Override + public String getText() { + return transaction.getText(); + } } \ No newline at end of file diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/sql/SQLQueryParameter.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/sql/SQLQueryParameter.java index 1cfed021b3f8e408f40d5dbf16e116fa1502f4fd..37efe78bc7120952eb2b04878ffa347f43d5ae0e 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/sql/SQLQueryParameter.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/sql/SQLQueryParameter.java @@ -29,12 +29,17 @@ public class SQLQueryParameter { private final int tokenLength; private SQLQueryParameter previous; + public SQLQueryParameter(int ordinalPosition, String name) + { + this(ordinalPosition, name, 0, 0); + } + public SQLQueryParameter(int ordinalPosition, String name, int tokenOffset, int tokenLength) { if (tokenOffset < 0) { throw new IndexOutOfBoundsException("Bad parameter offset: " + tokenOffset); } - if (tokenLength <= 0) { + if (tokenLength < 0) { throw new IndexOutOfBoundsException("Bad parameter length: " + tokenLength); } this.ordinalPosition = ordinalPosition; diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/sql/format/tokenized/SQLFormatterTokenized.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/sql/format/tokenized/SQLFormatterTokenized.java index 26618e60a02c006313fe7800a39377faf2475d72..d138daa5b275b84d0f9ce1ededffdd2e0b774193 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/sql/format/tokenized/SQLFormatterTokenized.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/sql/format/tokenized/SQLFormatterTokenized.java @@ -122,9 +122,9 @@ public class SQLFormatterTokenized implements SQLFormatter { for (int index = argList.size() - 1; index >= 1; index--) { token = argList.get(index); FormatterToken prevToken = argList.get(index - 1); - if (token.getType() == TokenType.SPACE && (prevToken.getType() == TokenType.SYMBOL || prevToken.getType() == TokenType.COMMENT)) { + if (token.getType() == TokenType.SPACE && prevToken.getType() == TokenType.COMMENT) { argList.remove(index); - } else if ((token.getType() == TokenType.SYMBOL || token.getType() == TokenType.COMMENT) && prevToken.getType() == TokenType.SPACE) { + } else if (token.getType() == TokenType.COMMENT && prevToken.getType() == TokenType.SPACE) { argList.remove(index - 1); } else if (token.getType() == TokenType.SPACE) { token.setString(" "); //$NON-NLS-1$ @@ -382,6 +382,10 @@ public class SQLFormatterTokenized implements SQLFormatter { switch (token.getString()) { case ":": case ".": + case ">": + case "<": + case "[": + case "]": return true; default: return false; diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/struct/rdb/DBSProcedureParameterKind.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/struct/rdb/DBSProcedureParameterKind.java index c9b660bca3a0d3eb7f91235e25a071b9695cdf4f..1317974e008151739d959ff02efc403c21fd1a0e 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/struct/rdb/DBSProcedureParameterKind.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/struct/rdb/DBSProcedureParameterKind.java @@ -22,11 +22,28 @@ package org.jkiss.dbeaver.model.struct.rdb; */ public enum DBSProcedureParameterKind { - UNKNOWN, - IN, - OUT, - INOUT, - RETURN, - RESULTSET, - TABLE, + UNKNOWN("Unknown", false), + IN("IN", true), + OUT("OUT", false), + INOUT("IN/OUT", true), + RETURN("Return", false), + RESULTSET("ResultSet", false), + TABLE("Table", false), + ; + + private final String title; + private final boolean isInput; + + DBSProcedureParameterKind(String title, boolean isInput) { + this.title = title; + this.isInput = isInput; + } + + public String getTitle() { + return title; + } + + public boolean isInput() { + return isInput; + } } diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/runtime/IPluginService.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/runtime/IPluginService.java similarity index 96% rename from plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/runtime/IPluginService.java rename to plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/runtime/IPluginService.java index a47cb82f1744d4f787efc5ae7d293dea68a74367..67f1ea72eece4796fc9313310a6b8735b2bf2677 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/runtime/IPluginService.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/runtime/IPluginService.java @@ -1,30 +1,30 @@ -/* - * DBeaver - Universal Database Manager - * Copyright (C) 2010-2017 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.runtime; - -/** - * Plugin service. - * Activated/deactivated by DBeaver core on startup/shutdown. - */ -public interface IPluginService { - - void activateService(); - - void deactivateService(); - +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2017 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.runtime; + +/** + * Plugin service. + * Activated/deactivated by DBeaver core on startup/shutdown. + */ +public interface IPluginService { + + void activateService(); + + void deactivateService(); + } \ No newline at end of file diff --git a/plugins/org.jkiss.dbeaver.net.ssh.jsch/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.net.ssh.jsch/META-INF/MANIFEST.MF index 67ff0585222585f890c8ed82123142cebad3e937..1518693e3060e8f54cab88351f850eb9cd1f22c1 100644 --- a/plugins/org.jkiss.dbeaver.net.ssh.jsch/META-INF/MANIFEST.MF +++ b/plugins/org.jkiss.dbeaver.net.ssh.jsch/META-INF/MANIFEST.MF @@ -3,8 +3,8 @@ Bundle-ManifestVersion: 2 Bundle-Vendor: %Bundle-Vendor Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.net.ssh.jsch;singleton:=true -Bundle-Version: 1.0.3 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.4 +Bundle-Release-Date: 20180514 Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy Bundle-ClassPath: . diff --git a/plugins/org.jkiss.dbeaver.net.ssh.jsch/pom.xml b/plugins/org.jkiss.dbeaver.net.ssh.jsch/pom.xml index 2020e376bf1e705da7a151eac66fb9624812fbd5..5f9e6962de04ab16bf756e1f8b983423390ddf2d 100644 --- a/plugins/org.jkiss.dbeaver.net.ssh.jsch/pom.xml +++ b/plugins/org.jkiss.dbeaver.net.ssh.jsch/pom.xml @@ -10,7 +10,7 @@ ../../ org.jkiss.dbeaver.net.ssh.jsch - 1.0.3 + 1.0.4 eclipse-plugin diff --git a/plugins/org.jkiss.dbeaver.net.ssh.sshj/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.net.ssh.sshj/META-INF/MANIFEST.MF index aa167c859557d6411c21e270a17f626418ef8ff7..e8f3b8396b367d0803997307e72dfc87cf75a835 100644 --- a/plugins/org.jkiss.dbeaver.net.ssh.sshj/META-INF/MANIFEST.MF +++ b/plugins/org.jkiss.dbeaver.net.ssh.sshj/META-INF/MANIFEST.MF @@ -3,8 +3,8 @@ Bundle-ManifestVersion: 2 Bundle-Vendor: %Bundle-Vendor Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.net.ssh.sshj;singleton:=true -Bundle-Version: 1.0.3 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.4 +Bundle-Release-Date: 20180514 Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy Bundle-ClassPath: . diff --git a/plugins/org.jkiss.dbeaver.net.ssh.sshj/pom.xml b/plugins/org.jkiss.dbeaver.net.ssh.sshj/pom.xml index 0b1d30ea1d7a9a27c018623cee19cd42de73b079..777d907856ba416be22c07e9229c50c1747021eb 100644 --- a/plugins/org.jkiss.dbeaver.net.ssh.sshj/pom.xml +++ b/plugins/org.jkiss.dbeaver.net.ssh.sshj/pom.xml @@ -10,7 +10,7 @@ ../../ org.jkiss.dbeaver.net.ssh.sshj - 1.0.3 + 1.0.4 eclipse-plugin diff --git a/plugins/org.jkiss.dbeaver.net.ssh.ui/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.net.ssh.ui/META-INF/MANIFEST.MF index ba1bf5407043ec8341d885e819519759fb7b2b4a..845179cfd40b15504f33a7e15dbbec9c6b2ef852 100644 --- a/plugins/org.jkiss.dbeaver.net.ssh.ui/META-INF/MANIFEST.MF +++ b/plugins/org.jkiss.dbeaver.net.ssh.ui/META-INF/MANIFEST.MF @@ -3,8 +3,8 @@ Bundle-ManifestVersion: 2 Bundle-Vendor: %Bundle-Vendor Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.net.ssh.ui;singleton:=true -Bundle-Version: 1.0.3 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.4 +Bundle-Release-Date: 20180514 Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy Bundle-Activator: org.jkiss.dbeaver.ui.net.ssh.Activator diff --git a/plugins/org.jkiss.dbeaver.net.ssh.ui/pom.xml b/plugins/org.jkiss.dbeaver.net.ssh.ui/pom.xml index 1fad745d5ed60b1edb497182e55fd8987f675f3a..fc10e77e8203707d213e7927ca7d66c121e19205 100644 --- a/plugins/org.jkiss.dbeaver.net.ssh.ui/pom.xml +++ b/plugins/org.jkiss.dbeaver.net.ssh.ui/pom.xml @@ -10,7 +10,7 @@ ../../ org.jkiss.dbeaver.net.ssh.ui - 1.0.3 + 1.0.4 eclipse-plugin diff --git a/plugins/org.jkiss.dbeaver.net.ssh/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.net.ssh/META-INF/MANIFEST.MF index f60615f0a45bf214cea3ecfd088406f01d019ef4..e50e0858c957bf6f8d4f2148150798a643e544f7 100644 --- a/plugins/org.jkiss.dbeaver.net.ssh/META-INF/MANIFEST.MF +++ b/plugins/org.jkiss.dbeaver.net.ssh/META-INF/MANIFEST.MF @@ -3,8 +3,8 @@ Bundle-ManifestVersion: 2 Bundle-Vendor: %Bundle-Vendor Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.net.ssh;singleton:=true -Bundle-Version: 1.0.3 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.4 +Bundle-Release-Date: 20180514 Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy Export-Package: org.jkiss.dbeaver.model.net.ssh, diff --git a/plugins/org.jkiss.dbeaver.net.ssh/pom.xml b/plugins/org.jkiss.dbeaver.net.ssh/pom.xml index 4b1df7eebae2855fafe7acbbe7c28bae662b23d6..80c326aafc7bba0a34b65f233e2793ceb0a841e3 100644 --- a/plugins/org.jkiss.dbeaver.net.ssh/pom.xml +++ b/plugins/org.jkiss.dbeaver.net.ssh/pom.xml @@ -10,7 +10,7 @@ ../../ org.jkiss.dbeaver.net.ssh - 1.0.3 + 1.0.4 eclipse-plugin diff --git a/plugins/org.jkiss.dbeaver.net.ssh/src/org/jkiss/dbeaver/model/net/ssh/SSHImplementationAbstract.java b/plugins/org.jkiss.dbeaver.net.ssh/src/org/jkiss/dbeaver/model/net/ssh/SSHImplementationAbstract.java index bca2ea50d8c7505f52b5e1c3d45bba0461832a40..916977665b34cc403af416014af810cc487f2cf3 100644 --- a/plugins/org.jkiss.dbeaver.net.ssh/src/org/jkiss/dbeaver/model/net/ssh/SSHImplementationAbstract.java +++ b/plugins/org.jkiss.dbeaver.net.ssh/src/org/jkiss/dbeaver/model/net/ssh/SSHImplementationAbstract.java @@ -36,7 +36,7 @@ public abstract class SSHImplementationAbstract implements SSHImplementation { private static final Log log = Log.getLog(SSHImplementationAbstract.class); // Saved config - used for tunnel invalidate - private transient int savedLocalPort; + private transient int savedLocalPort = 0; protected transient DBWHandlerConfiguration savedConfiguration; protected transient DBPConnectionConfiguration savedConnectionInfo; @@ -108,7 +108,7 @@ public abstract class SSHImplementationAbstract implements SSHImplementation { throw new DBException("Bad database port number: " + dbPortString); } int localPort = savedLocalPort; - if (platform != null) { + if (localPort == 0 && platform != null) { localPort = SSHUtils.findFreePort(platform); } if (!CommonUtils.isEmpty(sshLocalPort)) { diff --git a/plugins/org.jkiss.dbeaver.runtime.ide.core/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.runtime.ide.core/META-INF/MANIFEST.MF index a54f70a9452234335000f7b1d7eca991d9ea7211..6a19e7b6f42749f025d5916ed6c062f53b739d78 100644 --- a/plugins/org.jkiss.dbeaver.runtime.ide.core/META-INF/MANIFEST.MF +++ b/plugins/org.jkiss.dbeaver.runtime.ide.core/META-INF/MANIFEST.MF @@ -3,8 +3,8 @@ Bundle-ManifestVersion: 2 Bundle-Vendor: %Bundle-Vendor Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.runtime.ide.core;singleton:=true -Bundle-Version: 2.1.4 -Bundle-Release-Date: 20180430 +Bundle-Version: 2.1.5 +Bundle-Release-Date: 20180514 Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Require-Bundle: org.eclipse.core.runtime;visibility:=reexport, org.eclipse.core.commands, diff --git a/plugins/org.jkiss.dbeaver.runtime.ide.core/pom.xml b/plugins/org.jkiss.dbeaver.runtime.ide.core/pom.xml index 3da60cc1eefa28e9fa38f659c34b062d1fe0ac0a..010f9642adf9fbd056db6092c5829b521b806897 100644 --- a/plugins/org.jkiss.dbeaver.runtime.ide.core/pom.xml +++ b/plugins/org.jkiss.dbeaver.runtime.ide.core/pom.xml @@ -9,6 +9,6 @@ ../../ org.jkiss.dbeaver.runtime.ide.core - 2.1.4 + 2.1.5 eclipse-plugin diff --git a/plugins/org.jkiss.dbeaver.runtime.ide.core/src/org/jkiss/dbeaver/runtime/ide/core/DBeaverIDECore.java b/plugins/org.jkiss.dbeaver.runtime.ide.core/src/org/jkiss/dbeaver/runtime/ide/core/DBeaverIDECore.java index 4c4d42bca594cca0445482b73bc8dcf6e06d9a9c..b1255d107be01b9b5117247b78b82a7366ad805f 100644 --- a/plugins/org.jkiss.dbeaver.runtime.ide.core/src/org/jkiss/dbeaver/runtime/ide/core/DBeaverIDECore.java +++ b/plugins/org.jkiss.dbeaver.runtime.ide.core/src/org/jkiss/dbeaver/runtime/ide/core/DBeaverIDECore.java @@ -34,12 +34,6 @@ public class DBeaverIDECore { public static final String MARKER_ATTRIBUTE_DATASOURCE_ID = BUNDLE_SYMBOLIC_NAME + '.' + "datasourceId"; //$NON-NLS-1$ public static final String MARKER_ATTRIBUTE_NODE_PATH = BUNDLE_SYMBOLIC_NAME + '.' + "nodePath"; //$NON-NLS-1$ - private static Log log = Log.getLog(DBeaverIDECore.class); - - public static void log(IStatus status) { - Log.log(log, status); - } - public static IResource resolveWorkspaceResource(DBSObject dbsObject) { WorkspaceResourceResolver resolver = Adapters.adapt(dbsObject, WorkspaceResourceResolver.class, true); if (resolver != null) { diff --git a/plugins/org.jkiss.dbeaver.runtime.ide.ui/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.runtime.ide.ui/META-INF/MANIFEST.MF index 1c9ae95765533d827886348d5a4a8becb77dbfee..2ce7b05b8d91557cdd54c571153c7c1cf7fc484e 100644 --- a/plugins/org.jkiss.dbeaver.runtime.ide.ui/META-INF/MANIFEST.MF +++ b/plugins/org.jkiss.dbeaver.runtime.ide.ui/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.runtime.ide.ui -Bundle-Version: 1.1.4 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.1.5 +Bundle-Release-Date: 20180514 Bundle-Vendor: %Bundle-Vendor Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Require-Bundle: org.eclipse.core.runtime, diff --git a/plugins/org.jkiss.dbeaver.runtime.ide.ui/pom.xml b/plugins/org.jkiss.dbeaver.runtime.ide.ui/pom.xml index 93af31810e50c4a6d1c412697e8ee014e47bfae3..26c4e749475ee4d0053e8d3ca6a48930256da0c8 100644 --- a/plugins/org.jkiss.dbeaver.runtime.ide.ui/pom.xml +++ b/plugins/org.jkiss.dbeaver.runtime.ide.ui/pom.xml @@ -9,6 +9,6 @@ ../../ org.jkiss.dbeaver.runtime.ide.ui - 1.1.4 + 1.1.5 eclipse-plugin diff --git a/plugins/org.jkiss.dbeaver.runtime.ide.ui/src/org/jkiss/dbeaver/runtime/ide/ui/texteditor/DatabaseMarkerAnnotationModel.java b/plugins/org.jkiss.dbeaver.runtime.ide.ui/src/org/jkiss/dbeaver/runtime/ide/ui/texteditor/DatabaseMarkerAnnotationModel.java index ee3be62be6f0ea7ceee46093d184920012917343..3968e9843334e6431a910ed737fff759c72281d4 100644 --- a/plugins/org.jkiss.dbeaver.runtime.ide.ui/src/org/jkiss/dbeaver/runtime/ide/ui/texteditor/DatabaseMarkerAnnotationModel.java +++ b/plugins/org.jkiss.dbeaver.runtime.ide.ui/src/org/jkiss/dbeaver/runtime/ide/ui/texteditor/DatabaseMarkerAnnotationModel.java @@ -18,20 +18,22 @@ package org.jkiss.dbeaver.runtime.ide.ui.texteditor; -import static org.jkiss.dbeaver.runtime.ide.core.DBeaverIDECore.MARKER_ATTRIBUTE_DATASOURCE_ID; -import static org.jkiss.dbeaver.runtime.ide.core.DBeaverIDECore.MARKER_ATTRIBUTE_NODE_PATH; - import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.ui.texteditor.ResourceMarkerAnnotationModel; +import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.navigator.DBNDatabaseNode; import org.jkiss.dbeaver.model.navigator.DBNNode; import org.jkiss.dbeaver.model.struct.DBSObject; -import org.jkiss.dbeaver.runtime.ide.core.DBeaverIDECore; + +import static org.jkiss.dbeaver.runtime.ide.core.DBeaverIDECore.MARKER_ATTRIBUTE_DATASOURCE_ID; +import static org.jkiss.dbeaver.runtime.ide.core.DBeaverIDECore.MARKER_ATTRIBUTE_NODE_PATH; public class DatabaseMarkerAnnotationModel extends ResourceMarkerAnnotationModel { + private static final Log log = Log.getLog(DatabaseMarkerAnnotationModel.class); + private final static String[] ATTRIBUTE_NAMES = new String[] { // MARKER_ATTRIBUTE_DATASOURCE_ID, // MARKER_ATTRIBUTE_NODE_PATH }; @@ -66,15 +68,10 @@ public class DatabaseMarkerAnnotationModel extends ResourceMarkerAnnotationModel } try { Object[] attributes = marker.getAttributes(ATTRIBUTE_NAMES); - if (!datasourceId.equals(attributes[0])) { - return false; - } - if (!nodeItemPath.equals(attributes[1])) { - return false; - } - return true; + return datasourceId.equals(attributes[0]) && + nodeItemPath.equals(attributes[1]); } catch (CoreException e) { - DBeaverIDECore.log(e.getStatus()); + log.log(e.getStatus()); return false; } } diff --git a/plugins/org.jkiss.dbeaver.test/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.test/META-INF/MANIFEST.MF index 0ec42f00e22c1295855561c92e9c01a7329f02e3..257222644bf95fb97196aa66c05473dc29f48a0e 100644 --- a/plugins/org.jkiss.dbeaver.test/META-INF/MANIFEST.MF +++ b/plugins/org.jkiss.dbeaver.test/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Tester Plug-in Bundle-SymbolicName: org.jkiss.dbeaver.ext.test;singleton:=true -Bundle-Version: 1.0.86 -Bundle-Release-Date: 20180430 +Bundle-Version: 1.0.87 +Bundle-Release-Date: 20180514 Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime, org.jkiss.dbeaver.core, diff --git a/plugins/org.jkiss.dbeaver.test/pom.xml b/plugins/org.jkiss.dbeaver.test/pom.xml index b184892773353ff13d71b0ac3ab3b71acb443611..a15f32f758d91ec790bb543580de8fced8199d04 100644 --- a/plugins/org.jkiss.dbeaver.test/pom.xml +++ b/plugins/org.jkiss.dbeaver.test/pom.xml @@ -10,6 +10,6 @@ org.jkiss.dbeaver org.jkiss.dbeaver.ext.test - 1.0.86 + 1.0.87 eclipse-plugin diff --git a/plugins/org.jkiss.dbeaver.ui/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.ui/META-INF/MANIFEST.MF index 566a07cd930fb6f0d9b0371294ec7e56cde4710d..0d8ceea2e292927d3b14120363325343df1d47ff 100644 --- a/plugins/org.jkiss.dbeaver.ui/META-INF/MANIFEST.MF +++ b/plugins/org.jkiss.dbeaver.ui/META-INF/MANIFEST.MF @@ -3,8 +3,8 @@ Bundle-ManifestVersion: 2 Bundle-Vendor: %Bundle-Vendor Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.jkiss.dbeaver.ui;singleton:=true -Bundle-Version: 4.2.16 -Bundle-Release-Date: 20180430 +Bundle-Version: 4.2.17 +Bundle-Release-Date: 20180514 Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-Activator: org.jkiss.dbeaver.bundle.UIActivator Bundle-ActivationPolicy: lazy diff --git a/plugins/org.jkiss.dbeaver.ui/pom.xml b/plugins/org.jkiss.dbeaver.ui/pom.xml index 13d523b4a525f135a578363c6aa17d113fb598e4..17d221a5f0eeee3ac77619049ab369a7b9a88d5f 100644 --- a/plugins/org.jkiss.dbeaver.ui/pom.xml +++ b/plugins/org.jkiss.dbeaver.ui/pom.xml @@ -9,6 +9,6 @@ ../../ org.jkiss.dbeaver.ui - 4.2.16 + 4.2.17 eclipse-plugin diff --git a/pom.xml b/pom.xml index d11fdeb96aa9da7bcbf4605e7d9e0f32d3a97317..d25738107d13272d0a98699fb24dad4dd35d31db 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ pom - 5.0.4 + 5.0.5 DBeaver 1.0.0 0.26.0 diff --git a/product/repositories/org.jkiss.dbeaver.ce.repository/category.xml b/product/repositories/org.jkiss.dbeaver.ce.repository/category.xml index 6fda2d8443cca8f2768d7e1e0b39509f601f9c4e..038c6e1ad2ede09f533aff300247441eec012cf6 100644 --- a/product/repositories/org.jkiss.dbeaver.ce.repository/category.xml +++ b/product/repositories/org.jkiss.dbeaver.ce.repository/category.xml @@ -36,5 +36,8 @@ + + + diff --git a/product/standalone/DBeaver.product b/product/standalone/DBeaver.product index 158f6ee3b481cbdfec2103334fafc168b5de5c29..fcb968471f17cc5ab89c61e92ff65d4b2fba3f24 100644 --- a/product/standalone/DBeaver.product +++ b/product/standalone/DBeaver.product @@ -1,7 +1,7 @@ - +