use of org.voltdb.exceptions.ConstraintFailureException in project voltdb by VoltDB.
the class NonVoltDBBackend method runDML.
public VoltTable runDML(String dml) {
dml = dml.trim();
String indicator = dml.substring(0, 1).toLowerCase();
if (// "s" is for "select ..."
indicator.equals("s") || indicator.equals("(")) {
// "(" is for "(select ... UNION ...)" et. al.
try {
Statement stmt = dbconn.createStatement();
sqlLog.l7dlog(Level.DEBUG, LogKeys.sql_Backend_ExecutingDML.name(), new Object[] { dml }, null);
sqlLog.debug("Executing " + dml);
ResultSet rs = stmt.executeQuery(dml);
ResultSetMetaData rsmd = rs.getMetaData();
// note the index values here carefully
VoltTable.ColumnInfo[] columns = new VoltTable.ColumnInfo[rsmd.getColumnCount()];
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
String colname = rsmd.getColumnLabel(i);
String type = rsmd.getColumnTypeName(i);
//LOG.fine("Column type: " + type);
columns[i - 1] = getColumnInfo(type, colname);
}
VoltTable table = new VoltTable(columns);
while (rs.next()) {
Object[] row = new Object[table.getColumnCount()];
for (int i = 0; i < table.getColumnCount(); i++) {
if (table.getColumnType(i) == VoltType.STRING)
row[i] = rs.getString(i + 1);
else if (table.getColumnType(i) == VoltType.TINYINT)
row[i] = rs.getByte(i + 1);
else if (table.getColumnType(i) == VoltType.SMALLINT)
row[i] = rs.getShort(i + 1);
else if (table.getColumnType(i) == VoltType.INTEGER)
row[i] = rs.getInt(i + 1);
else if (table.getColumnType(i) == VoltType.BIGINT)
row[i] = rs.getLong(i + 1);
else if (table.getColumnType(i) == VoltType.DECIMAL)
row[i] = rs.getBigDecimal(i + 1);
else if (table.getColumnType(i) == VoltType.FLOAT)
row[i] = rs.getDouble(i + 1);
else if (table.getColumnType(i) == VoltType.VARBINARY)
row[i] = rs.getBytes(i + 1);
else if (table.getColumnType(i) == VoltType.TIMESTAMP) {
Timestamp t = rs.getTimestamp(i + 1);
if (t == null) {
row[i] = null;
} else {
// convert from millisecond to microsecond granularity
row[i] = new org.voltdb.types.TimestampType(t.getTime() * 1000);
}
} else {
throw new ExpectedProcedureException("Trying to read a (currently) unsupported type from a JDBC resultset.");
}
if (rs.wasNull()) {
// JDBC returns 0/0.0 instead of null. Put null into the row.
row[i] = null;
}
}
table.addRow(row);
}
stmt.close();
rs.close();
return table;
} catch (Exception e) {
if (e instanceof ExpectedProcedureException) {
throw (ExpectedProcedureException) e;
}
sqlLog.l7dlog(Level.TRACE, LogKeys.sql_Backend_DmlError.name(), e);
throw new ExpectedProcedureException(m_database_type + " Backend DML Error ", e);
}
} else {
try {
Statement stmt = dbconn.createStatement();
sqlLog.debug("Executing: " + dml);
long ucount = stmt.executeUpdate(dml);
sqlLog.debug(" result: " + String.valueOf(ucount));
VoltTable table = new VoltTable(new VoltTable.ColumnInfo("", VoltType.BIGINT));
table.addRow(ucount);
return table;
} catch (SQLException e) {
// glorious hack to determine if the error is a constraint failure
if (e.getMessage().contains("constraint")) {
sqlLog.l7dlog(Level.TRACE, LogKeys.sql_Backend_ConvertingHSQLExtoCFEx.name(), e);
final byte[] messageBytes = e.getMessage().getBytes();
ByteBuffer b = ByteBuffer.allocate(100 + messageBytes.length);
b.putInt(messageBytes.length);
b.put(messageBytes);
b.put(e.getSQLState().getBytes());
// ConstraintFailure.type
b.putInt(0);
try {
FastSerializer.writeString(m_database_type, b);
} catch (IOException e1) {
e1.printStackTrace();
}
//Table size is 0
b.putInt(0);
b.rewind();
throw new ConstraintFailureException(b);
} else {
sqlLog.l7dlog(Level.TRACE, LogKeys.sql_Backend_DmlError.name(), e);
throw new ExpectedProcedureException(m_database_type + " Backend DML Error ", e);
}
} catch (Exception e) {
// rethrow an expected exception
sqlLog.l7dlog(Level.TRACE, LogKeys.sql_Backend_DmlError.name(), e);
throw new ExpectedProcedureException(m_database_type + " Backend DML Error ", e);
}
}
}
Aggregations