/** * Extract value from SQL result * * @param result ResultSet that must contain contain time, severity, ..., value * @param handle_array Try to read array elements, or only a scalar value? * @return IValue Decoded IValue * @throws Exception on error, including cancellation */ protected VType decodeSampleTableValue(final ResultSet result, final boolean handle_array) throws Exception { // Get time stamp final java.sql.Timestamp stamp = result.getTimestamp(1); // Oracle has nanoseconds in TIMESTAMP, other RDBs in separate column if (!reader.isOracle()) stamp.setNanos(result.getInt(7)); final Timestamp time = TimestampHelper.fromSQLTimestamp(stamp); // Get severity/status final String status = reader.getStatus(result.getInt(3)); final AlarmSeverity severity = filterSeverity(reader.getSeverity(result.getInt(2)), status); // Determine the value type // Try double final double dbl0 = result.getDouble(5); if (!result.wasNull()) { // Is it an error to have enumeration strings for double samples? // In here, we handle it by returning enumeration samples, // because the meta data would be wrong for double values. if (labels != null) return new ArchiveVEnum(time, severity, status, labels, (int) dbl0); // Double data. if (handle_array) { // Get array elements - if any. final double data[] = reader.useArrayBlob() ? readBlobArrayElements(dbl0, result) : readArrayElements(time, dbl0, severity); if (data.length == 1) return new ArchiveVNumber(time, severity, status, display, data[0]); else return new ArchiveVNumberArray(time, severity, status, display, data); } else return new ArchiveVNumber(time, severity, status, display, dbl0); } // Try integer final int num = result.getInt(4); if (!result.wasNull()) { // Enumerated integer? if (labels != null) return new ArchiveVEnum(time, severity, status, labels, num); return new ArchiveVNumber(time, severity, status, display, num); } // Default to string final String txt = result.getString(6); return new ArchiveVString(time, severity, status, txt); }