提交 2ce5de31 编写于 作者: S serge-rider

#5332 PG: structs with array items parse fix


Former-commit-id: 0750d4cc
上级 4f42093f
......@@ -34,9 +34,11 @@ import org.jkiss.dbeaver.model.DBPDataKind;
import org.jkiss.dbeaver.model.DBPEvaluationContext;
import org.jkiss.dbeaver.model.DBUtils;
import org.jkiss.dbeaver.model.connection.DBPDriver;
import org.jkiss.dbeaver.model.data.DBDValueHandler;
import org.jkiss.dbeaver.model.edit.DBEPersistAction;
import org.jkiss.dbeaver.model.edit.DBERegistry;
import org.jkiss.dbeaver.model.exec.DBCException;
import org.jkiss.dbeaver.model.exec.DBCSession;
import org.jkiss.dbeaver.model.exec.jdbc.JDBCPreparedStatement;
import org.jkiss.dbeaver.model.exec.jdbc.JDBCSession;
import org.jkiss.dbeaver.model.impl.AbstractObjectCache;
......@@ -45,8 +47,10 @@ import org.jkiss.dbeaver.model.impl.edit.SQLDatabasePersistActionComment;
import org.jkiss.dbeaver.model.impl.jdbc.JDBCDataSource;
import org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils;
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.model.struct.DBSTypedObject;
import org.jkiss.dbeaver.model.struct.DBSTypedObjectEx;
import org.jkiss.utils.ArrayUtils;
import org.jkiss.utils.CommonUtils;
......@@ -415,7 +419,33 @@ public class PostgreUtils {
}
}
public static Object convertStringToValue(DBSTypedObject itemType, String string, boolean unescape) {
public static Object convertStringToValue(DBCSession session, DBSTypedObject itemType, String string, boolean unescape) throws DBCException {
if (itemType.getDataKind() == DBPDataKind.ARRAY) {
if (CommonUtils.isEmpty(string)) {
return new Object[0];
} else if (string.startsWith("{") && string.endsWith("}")) {
DBSDataType arrayDataType = itemType instanceof DBSDataType ? (DBSDataType) itemType : ((DBSTypedObjectEx)itemType).getDataType();
try {
DBSDataType componentType = arrayDataType.getComponentType(session.getProgressMonitor());
if (componentType == null) {
log.error("Can't get component type from array '" + itemType.getFullTypeName() + "'");
return null;
} else {
String[] itemStrings = parseObjectString(string.substring(1, string.length() - 1));
Object[] itemValues = new Object[itemStrings.length];
for (int i = 0; i < itemStrings.length; i++) {
itemValues[i] = convertStringToValue(session, componentType, itemStrings[i], unescape);
}
return itemValues;
}
} catch (Exception e) {
throw new DBCException("Error extracting array '" + itemType.getFullTypeName() + "' items", e);
}
} else {
log.error("Unsupported array string: '" + string + "'");
return null;
}
}
switch (itemType.getTypeID()) {
case Types.BOOLEAN: return Boolean.valueOf(string);
case Types.TINYINT: return Byte.parseByte(string);
......@@ -425,8 +455,14 @@ public class PostgreUtils {
case Types.FLOAT: return Float.parseFloat(string);
case Types.REAL:
case Types.DOUBLE: return Double.parseDouble(string);
default:
return string;
default: {
DBDValueHandler valueHandler = DBUtils.findValueHandler(session, itemType);
if (valueHandler != null) {
return valueHandler.getValueFromObject(session, itemType, string, false);
} else {
return string;
}
}
}
}
......
......@@ -17,6 +17,7 @@
package org.jkiss.dbeaver.ext.postgresql.model.data;
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.ext.postgresql.model.PostgreDataSource;
......@@ -73,7 +74,7 @@ public class PostgreArrayValueHandler extends JDBCArrayValueHandler {
return super.getValueFromObject(session, type, object, copy);
}
private JDBCCollection convertStringToArray(@NotNull DBCSession session, @NotNull PostgreDataType itemType, @NotNull String value) {
private JDBCCollection convertStringToArray(@NotNull DBCSession session, @NotNull PostgreDataType itemType, @NotNull String value) throws DBCException {
List<String> strings = new ArrayList<>(10);
StringTokenizer st = new StringTokenizer(value, " ");
while (st.hasMoreTokens()) {
......@@ -81,7 +82,7 @@ public class PostgreArrayValueHandler extends JDBCArrayValueHandler {
}
Object[] contents = new Object[strings.size()];
for (int i = 0; i < strings.size(); i++) {
contents[i] = PostgreUtils.convertStringToValue(itemType, strings.get(i), false);
contents[i] = PostgreUtils.convertStringToValue(session, itemType, strings.get(i), false);
}
return new JDBCCollection(itemType, DBUtils.findValueHandler(session, itemType), contents);
}
......
......@@ -115,7 +115,7 @@ public class PostgreStructValueHandler extends JDBCStructValueHandler {
Iterator<PostgreDataTypeAttribute> attrIter = attributes.iterator();
for (int i = 0; i < parsedValues.length && attrIter.hasNext(); i++) {
final PostgreDataTypeAttribute itemAttr = attrIter.next();
attrValues[i] = PostgreUtils.convertStringToValue(itemAttr, parsedValues[i], true);
attrValues[i] = PostgreUtils.convertStringToValue(session, itemAttr, parsedValues[i], true);
}
Struct contents = new JDBCStructImpl(compType.getTypeName(), attrValues);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册