diff --git a/plugins/org.jkiss.dbeaver.ext.oracle/src/org/jkiss/dbeaver/ext/oracle/data/OracleContentOpaque.java b/plugins/org.jkiss.dbeaver.ext.oracle/src/org/jkiss/dbeaver/ext/oracle/data/OracleContentOpaque.java index 20266ccde0fb7cf496da783172d8f48606616710..3d74c84f77b23ce820e357fa7e29b2118ababe64 100644 --- a/plugins/org.jkiss.dbeaver.ext.oracle/src/org/jkiss/dbeaver/ext/oracle/data/OracleContentOpaque.java +++ b/plugins/org.jkiss.dbeaver.ext.oracle/src/org/jkiss/dbeaver/ext/oracle/data/OracleContentOpaque.java @@ -100,7 +100,7 @@ public abstract class OracleContentOpaque extends JD } else if (opaque != null) { preparedStatement.setObject(paramIndex, opaque); } else { - preparedStatement.setNull(paramIndex + 1, java.sql.Types.SQLXML); + preparedStatement.setNull(paramIndex, java.sql.Types.SQLXML); } } catch (IOException e) { diff --git a/plugins/org.jkiss.dbeaver.ext.oracle/src/org/jkiss/dbeaver/ext/oracle/data/OracleContentXML.java b/plugins/org.jkiss.dbeaver.ext.oracle/src/org/jkiss/dbeaver/ext/oracle/data/OracleContentXML.java index 8052ce3575494a0b527745d3964a0a96fbf8aa87..037e2267a672c96cabd9cb1b07fd14d1090f81a8 100644 --- a/plugins/org.jkiss.dbeaver.ext.oracle/src/org/jkiss/dbeaver/ext/oracle/data/OracleContentXML.java +++ b/plugins/org.jkiss.dbeaver.ext.oracle/src/org/jkiss/dbeaver/ext/oracle/data/OracleContentXML.java @@ -65,7 +65,7 @@ public class OracleContentXML extends JDBCContentXML { xmlObject); } } else { - preparedStatement.setNull(paramIndex + 1, java.sql.Types.SQLXML); + preparedStatement.setNull(paramIndex, java.sql.Types.SQLXML); } } catch (SQLException e) { diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/plugin.xml b/plugins/org.jkiss.dbeaver.ext.postgresql/plugin.xml index 70fed63c1974274ac77a720cde3ca9b781e1828f..6a47066178083c658c072a0232e42ffb528fde10 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/plugin.xml +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/plugin.xml @@ -195,6 +195,7 @@ + diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/PostgreConstants.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/PostgreConstants.java index 288919b01739dce91d3352671637ee63457c9a04..53262c330871361897f089f38d408f3e6538c533 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/PostgreConstants.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/PostgreConstants.java @@ -66,6 +66,8 @@ public class PostgreConstants { "oid", "oid", "Row identifier", false); public static final String TYPE_HSTORE = "hstore"; + public static final String TYPE_JSON = "json"; + public static final String TYPE_JSONB = "jsonb"; public static final String HANDLER_SSL = "postgre_ssl"; public static final String EC_PERMISSION_DENIED = "42501"; diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreDataType.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreDataType.java index 1221f6883f1436a04470d14ba5cdb258fc238655..2c6a856384c804d60bc1138dda2ad49d358cfeee 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreDataType.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreDataType.java @@ -21,6 +21,7 @@ import org.jkiss.code.NotNull; import org.jkiss.code.Nullable; import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.Log; +import org.jkiss.dbeaver.ext.postgresql.PostgreConstants; import org.jkiss.dbeaver.ext.postgresql.PostgreUtils; import org.jkiss.dbeaver.model.DBPDataKind; import org.jkiss.dbeaver.model.DBPEvaluationContext; @@ -128,6 +129,11 @@ public class PostgreDataType extends JDBCDataType implements Post } this.dataKind = JDBCDataSource.getDataKind(getName(), valueType); + if (this.dataKind == DBPDataKind.OBJECT) { + if (PostgreConstants.TYPE_JSONB.equals(name) || PostgreConstants.TYPE_JSON.equals(name)) { + this.dataKind = DBPDataKind.CONTENT; + } + } this.ownerId = JDBCUtils.safeGetLong(dbResult, "typowner"); this.isByValue = JDBCUtils.safeGetBoolean(dbResult, "typbyval"); diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/data/PostgreContentJSON.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/data/PostgreContentJSON.java new file mode 100644 index 0000000000000000000000000000000000000000..706d9c9bcda5629b57e3229630c404c5b6336c5f --- /dev/null +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/data/PostgreContentJSON.java @@ -0,0 +1,69 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2016 Serge Rieder (serge@jkiss.org) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License (version 2) + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +package org.jkiss.dbeaver.ext.postgresql.model.data; + +import org.jkiss.code.NotNull; +import org.jkiss.dbeaver.model.DBPDataSource; +import org.jkiss.dbeaver.model.exec.DBCException; +import org.jkiss.dbeaver.model.exec.jdbc.JDBCPreparedStatement; +import org.jkiss.dbeaver.model.exec.jdbc.JDBCSession; +import org.jkiss.dbeaver.model.impl.jdbc.data.JDBCContentChars; +import org.jkiss.dbeaver.model.struct.DBSTypedObject; +import org.jkiss.dbeaver.utils.MimeTypes; + +import java.sql.SQLException; +import java.sql.Types; + +/** + * JSON content + */ +public class PostgreContentJSON extends JDBCContentChars { + + public PostgreContentJSON(DBPDataSource dataSource, String json) + { + super(dataSource, json); + } + + @NotNull + @Override + public String getContentType() + { + return MimeTypes.TEXT_JSON; + } + + @Override + public void bindParameter( + JDBCSession session, + JDBCPreparedStatement preparedStatement, + DBSTypedObject columnType, + int paramIndex) + throws DBCException + { + try { + if (data != null) { + preparedStatement.setObject(paramIndex, data, Types.OTHER); + } else { + preparedStatement.setNull(paramIndex, columnType.getTypeID()); + } + } + catch (SQLException e) { + throw new DBCException(e, session.getDataSource()); + } + } + +} diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/data/PostgreJSONValueHandler.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/data/PostgreJSONValueHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..a833f696ba8c2abd80d92191e225ca18e6d59883 --- /dev/null +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/data/PostgreJSONValueHandler.java @@ -0,0 +1,53 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2016 Serge Rieder (serge@jkiss.org) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License (version 2) + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +package org.jkiss.dbeaver.ext.postgresql.model.data; + +import org.jkiss.code.NotNull; +import org.jkiss.dbeaver.model.data.DBDContent; +import org.jkiss.dbeaver.model.exec.DBCException; +import org.jkiss.dbeaver.model.exec.DBCSession; +import org.jkiss.dbeaver.model.exec.jdbc.JDBCResultSet; +import org.jkiss.dbeaver.model.impl.jdbc.data.handlers.JDBCContentValueHandler; +import org.jkiss.dbeaver.model.struct.DBSTypedObject; + +import java.sql.SQLException; + +/** + * PostgreJSONValueHandler + */ +public class PostgreJSONValueHandler extends JDBCContentValueHandler { + + public static final PostgreJSONValueHandler INSTANCE = new PostgreJSONValueHandler(); + + @Override + protected DBDContent fetchColumnValue(DBCSession session, JDBCResultSet resultSet, DBSTypedObject type, int index) throws SQLException { + String json = resultSet.getString(index); + return new PostgreContentJSON(session.getDataSource(), json); + } + + @Override + public DBDContent getValueFromObject(@NotNull DBCSession session, @NotNull DBSTypedObject type, Object object, boolean copy) throws DBCException + { + if (object == null) { + return new PostgreContentJSON(session.getDataSource(), null); + } else if (object instanceof PostgreContentJSON) { + return copy ? (PostgreContentJSON)((PostgreContentJSON) object).cloneValue(session.getProgressMonitor()) : (PostgreContentJSON) object; + } + return super.getValueFromObject(session, type, object, copy); + } +} diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/data/PostgreValueHandlerProvider.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/data/PostgreValueHandlerProvider.java index 119c5d60cbe741259a697c44991e43897618d5bf..8e91823745b748e723ee8db22941a375fc95d80a 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/data/PostgreValueHandlerProvider.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/data/PostgreValueHandlerProvider.java @@ -49,10 +49,16 @@ public class PostgreValueHandlerProvider implements DBDValueHandlerProvider { return PostgreArrayValueHandler.INSTANCE; } else if (typeID == Types.STRUCT) { return PostgreStructValueHandler.INSTANCE; - } else if (typedObject.getTypeName().equalsIgnoreCase(PostgreConstants.TYPE_HSTORE)) { - return PostgreHStoreValueHandler.INSTANCE; } else { - return null; + switch (typedObject.getTypeName()) { + case PostgreConstants.TYPE_JSONB: + case PostgreConstants.TYPE_JSON: + return PostgreJSONValueHandler.INSTANCE; + case PostgreConstants.TYPE_HSTORE: + return PostgreHStoreValueHandler.INSTANCE; + default: + return null; + } } } diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/data/AbstractContent.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/data/AbstractContent.java new file mode 100644 index 0000000000000000000000000000000000000000..720fdf7549cee44da5e11c07dd03a0c30e289baf --- /dev/null +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/data/AbstractContent.java @@ -0,0 +1,52 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2016 Serge Rieder (serge@jkiss.org) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License (version 2) + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +package org.jkiss.dbeaver.model.impl.data; + +import org.jkiss.dbeaver.model.DBConstants; +import org.jkiss.dbeaver.model.DBPDataSource; +import org.jkiss.dbeaver.model.data.DBDContent; +import org.jkiss.dbeaver.model.data.DBDDisplayFormat; + +/** + * AbstractContent + * + * @author Serge Rider + */ +public abstract class AbstractContent implements DBDContent { + + protected final DBPDataSource dataSource; + + protected AbstractContent(DBPDataSource dataSource) + { + this.dataSource = dataSource; + } + + @Override + public void resetContents() + { + // do nothing + } + + @Override + public String toString() + { + String displayString = getDisplayString(DBDDisplayFormat.UI); + return displayString == null ? DBConstants.NULL_VALUE_LABEL : displayString; + } + +} diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/jdbc/data/JDBCContentAbstract.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/jdbc/data/JDBCContentAbstract.java index e70b25ddc489e7f1dcad6a959243b950460d41b2..c4e2baf6a5c21cd2175a1aa9387f23ee547bef76 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/jdbc/data/JDBCContentAbstract.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/jdbc/data/JDBCContentAbstract.java @@ -17,43 +17,27 @@ */ package org.jkiss.dbeaver.model.impl.jdbc.data; -import org.jkiss.dbeaver.model.DBConstants; import org.jkiss.dbeaver.model.DBPDataSource; -import org.jkiss.dbeaver.model.data.DBDContent; -import org.jkiss.dbeaver.model.data.DBDDisplayFormat; import org.jkiss.dbeaver.model.data.DBDValueCloneable; import org.jkiss.dbeaver.model.exec.DBCException; import org.jkiss.dbeaver.model.exec.jdbc.JDBCPreparedStatement; import org.jkiss.dbeaver.model.exec.jdbc.JDBCSession; +import org.jkiss.dbeaver.model.impl.data.AbstractContent; import org.jkiss.dbeaver.model.struct.DBSTypedObject; /** - * JDBCBLOB + * JDBCContentAbstract * * @author Serge Rider */ -public abstract class JDBCContentAbstract implements DBDContent, DBDValueCloneable { - - protected final DBPDataSource dataSource; +public abstract class JDBCContentAbstract extends AbstractContent implements DBDValueCloneable { protected JDBCContentAbstract(DBPDataSource dataSource) { - this.dataSource = dataSource; + super(dataSource); } public abstract void bindParameter(JDBCSession session, JDBCPreparedStatement preparedStatement, DBSTypedObject columnType, int paramIndex) throws DBCException; - @Override - public void resetContents() - { - // do nothing - } - - @Override - public String toString() - { - String displayString = getDisplayString(DBDDisplayFormat.UI); - return displayString == null ? DBConstants.NULL_VALUE_LABEL : displayString; - } } \ No newline at end of file diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/jdbc/data/JDBCContentChars.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/jdbc/data/JDBCContentChars.java index 1dbad21f75a586ef07f108220d6d9b135ff5406d..a01ec865169cbbcf0ceea06e12ed35a179fe0cb3 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/jdbc/data/JDBCContentChars.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/jdbc/data/JDBCContentChars.java @@ -44,7 +44,7 @@ import java.sql.SQLException; public class JDBCContentChars extends JDBCContentAbstract implements DBDContentStorage, DBDContentCached { private String originalData; - private String data; + protected String data; public JDBCContentChars(DBPDataSource dataSource, String data) { super(dataSource); diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/jdbc/data/JDBCContentXML.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/jdbc/data/JDBCContentXML.java index 0aab36cf48cb3cf827a9935f52073d8dcd01a7bb..35c05996273d22abbda6142e5caefec9d97c4b59 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/jdbc/data/JDBCContentXML.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/jdbc/data/JDBCContentXML.java @@ -144,7 +144,7 @@ public class JDBCContentXML extends JDBCContentLOB { } else if (xml != null) { preparedStatement.setSQLXML(paramIndex, xml); } else { - preparedStatement.setNull(paramIndex + 1, java.sql.Types.SQLXML); + preparedStatement.setNull(paramIndex, java.sql.Types.SQLXML); } } catch (SQLException e) {