From 2a59ed4653b7fb4e1f19e48c0e4774a2ec19575f Mon Sep 17 00:00:00 2001 From: Sanoj Punchihewa Date: Tue, 9 Jan 2024 14:31:03 +0530 Subject: [PATCH] Add support to use SQLXML type within the dataservice --- .../dataservices/common/DBConstants.java | 1 + .../integrator/dataservices/core/DBUtils.java | 3 +- .../core/description/query/SQLQuery.java | 48 +++++++++++++++++-- 3 files changed, 48 insertions(+), 4 deletions(-) diff --git a/components/data/data-services/org.wso2.micro.integrator.dataservices.common/src/main/java/org/wso2/micro/integrator/dataservices/common/DBConstants.java b/components/data/data-services/org.wso2.micro.integrator.dataservices.common/src/main/java/org/wso2/micro/integrator/dataservices/common/DBConstants.java index 0e3b0089a1..05330a126f 100644 --- a/components/data/data-services/org.wso2.micro.integrator.dataservices.common/src/main/java/org/wso2/micro/integrator/dataservices/common/DBConstants.java +++ b/components/data/data-services/org.wso2.micro.integrator.dataservices.common/src/main/java/org/wso2/micro/integrator/dataservices/common/DBConstants.java @@ -174,6 +174,7 @@ private DataTypes() { public static final String VARINT = "VARINT"; public static final String UUID = "UUID"; public static final String INETADDRESS = "INETADDRESS"; + public static final String SQLXML = "SQLXML"; } /** diff --git a/components/data/data-services/org.wso2.micro.integrator.dataservices.core/src/main/java/org/wso2/micro/integrator/dataservices/core/DBUtils.java b/components/data/data-services/org.wso2.micro.integrator.dataservices.core/src/main/java/org/wso2/micro/integrator/dataservices/core/DBUtils.java index 8fb6209444..44b19f1ffc 100644 --- a/components/data/data-services/org.wso2.micro.integrator.dataservices.core/src/main/java/org/wso2/micro/integrator/dataservices/core/DBUtils.java +++ b/components/data/data-services/org.wso2.micro.integrator.dataservices.core/src/main/java/org/wso2/micro/integrator/dataservices/core/DBUtils.java @@ -161,7 +161,8 @@ public class DBUtils { conversionTypes.put(DBConstants.DataTypes.TIMESTAMP, "java.sql.Timestamp"); conversionTypes.put(DBConstants.DataTypes.ANYURI, "java.net.URI"); conversionTypes.put(DBConstants.DataTypes.STRUCT, "java.sql.Struct"); - + conversionTypes.put(DBConstants.DataTypes.SQLXML, "java.sql.SQLXML"); + conversionTypes.put(DBConstants.DataTypes.VARINT, "java.math.BigInteger"); conversionTypes.put(DBConstants.DataTypes.UUID, "java.lang.String"); conversionTypes.put(DBConstants.DataTypes.INETADDRESS, "java.lang.String"); diff --git a/components/data/data-services/org.wso2.micro.integrator.dataservices.core/src/main/java/org/wso2/micro/integrator/dataservices/core/description/query/SQLQuery.java b/components/data/data-services/org.wso2.micro.integrator.dataservices.core/src/main/java/org/wso2/micro/integrator/dataservices/core/description/query/SQLQuery.java index cb087d633f..c5c0f0c2d2 100644 --- a/components/data/data-services/org.wso2.micro.integrator.dataservices.core/src/main/java/org/wso2/micro/integrator/dataservices/core/description/query/SQLQuery.java +++ b/components/data/data-services/org.wso2.micro.integrator.dataservices.core/src/main/java/org/wso2/micro/integrator/dataservices/core/description/query/SQLQuery.java @@ -19,6 +19,7 @@ import org.apache.axis2.databinding.utils.ConverterUtil; import org.apache.commons.codec.binary.Base64; +import org.apache.commons.lang.StringEscapeUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -68,6 +69,7 @@ import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.SQLFeatureNotSupportedException; +import java.sql.SQLXML; import java.sql.Statement; import java.sql.Struct; import java.sql.Time; @@ -1508,13 +1510,13 @@ private PreparedStatement createProcessedPreparedStatement(int queryType, for (ParamValue arrayElement : value.getArrayValue()) { this.setParamInPreparedStatement( stmt, param, arrayElement == null ? null : arrayElement.toString(), - queryType, currentOrdinal); + queryType, currentOrdinal, conn); currentOrdinal++; } } else { /* scalar value */ this.setParamInPreparedStatement(stmt, param, value != null ? value.getScalarValue() : null, queryType, - currentOrdinal); + currentOrdinal, conn); currentOrdinal++; } } @@ -1618,7 +1620,7 @@ private String generateSQLupdateQuery(InternalParamCollection params, String que } private void setParamInPreparedStatement(PreparedStatement stmt, InternalParam param, - String value, int queryType, int index) throws SQLException, DataServiceFault { + String value, int queryType, int index, Connection connection) throws SQLException, DataServiceFault { String paramName = param.getName(); String sqlType = param.getSqlType(); String paramType = param.getType(); @@ -1666,6 +1668,8 @@ private void setParamInPreparedStatement(PreparedStatement stmt, InternalParam p setUserDefinedType(stmt, index, paramType, structType); } else if (DBConstants.DataTypes.ARRAY.equals(sqlType)) { setArrayValue(stmt, index, paramType, structType); + } else if (DBConstants.DataTypes.SQLXML.equals(sqlType)) { + setSQLXMLValue(queryType, value, paramType, stmt, index, connection); } else { throw new DataServiceFault("[" + this.getDataService().getName() + "] Found Unsupported data type : " + sqlType + " as input parameter."); @@ -1781,6 +1785,40 @@ private void setBinaryValue(int queryType, String paramName, String value, Strin } } + private void setSQLXMLValue(int queryType, String value, String paramType, + PreparedStatement sqlQuery, int i, Connection connection) throws SQLException { + if (QueryTypes.IN.equals(paramType)) { + if (queryType == SQLQuery.DS_QUERY_TYPE_NORMAL) { + if (value == null) { + sqlQuery.setNull(i + 1, Types.SQLXML); + } else { + SQLXML xmlVal = connection.createSQLXML(); + xmlVal.setString(StringEscapeUtils.unescapeXml(value)); + sqlQuery.setSQLXML(i + 1, xmlVal); + } + } else { + if (value == null) { + ((CallableStatement) sqlQuery).setNull(i + 1, Types.SQLXML); + } else { + SQLXML xmlVal = connection.createSQLXML(); + xmlVal.setString(StringEscapeUtils.unescapeXml(value)); + ((CallableStatement) sqlQuery).setSQLXML(i + 1, xmlVal); + } + } + } else if (QueryTypes.INOUT.equals(paramType)) { + if (value == null) { + ((CallableStatement) sqlQuery).setNull(i + 1, Types.SQLXML); + } else { + SQLXML xmlVal = connection.createSQLXML(); + xmlVal.setString(StringEscapeUtils.unescapeXml(value)); + ((CallableStatement) sqlQuery).setSQLXML(i + 1, xmlVal); + } + ((CallableStatement) sqlQuery).registerOutParameter(i + 1, Types.SQLXML); + } else { + ((CallableStatement) sqlQuery).registerOutParameter(i + 1, Types.SQLXML); + } + } + private void setBlobValue(int queryType, String paramName, String value, String paramType, PreparedStatement sqlQuery, int i) throws SQLException, DataServiceFault { if ("IN".equals(paramType)) { @@ -2260,6 +2298,10 @@ private ParamValue getOutparameterValue(CallableStatement cs, String type, int o elementValue = cs.getClob(ordinal); return new ParamValue(elementValue == null ? null : deriveValueFromClob((Clob) elementValue)); + } else if (type.equals(DBConstants.DataTypes.SQLXML)) { + elementValue = cs.getSQLXML(ordinal).getString(); + return new ParamValue(elementValue == null ? null + : elementValue.toString()); } else if (type.equals(DBConstants.DataTypes.STRUCT)) { elementValue = cs.getObject(ordinal); return new ParamValue(elementValue == null ? null : (Struct) elementValue);