Commit 3289691a authored by caohao's avatar caohao
Browse files

Add real affected rows and last insert id into OKPacket.

parent 624dbad8
Loading
Loading
Loading
Loading
+26 −4
Original line number Diff line number Diff line
@@ -66,13 +66,21 @@ public final class ComQueryPacket extends CommandPacket {
                Statement statement = conn.createStatement()) {
            SQLStatement sqlStatement = new SQLJudgeEngine(sql).judge();
            ResultSet resultSet;
            int affectedRows = 0;
            long lastInsertId = 0;
            switch (sqlStatement.getType()) {
                case DQL:
                    resultSet = statement.executeQuery(sql);
                    break;
                case DML:
                case DDL:
                    statement.executeUpdate(sql);
                    if (needGeneratedKey()) {
                        affectedRows = statement.executeUpdate(sql, Statement.RETURN_GENERATED_KEYS);
                        lastInsertId = getGeneratedKey(statement);
                    } else {
                        affectedRows = statement.executeUpdate(sql);
                        lastInsertId = -1;
                    }
                    resultSet = statement.getResultSet();
                    break;
                default:
@@ -81,7 +89,7 @@ public final class ComQueryPacket extends CommandPacket {
                    break;
            }
            if (null == resultSet) {
                result.add(new OKPacket(++currentSequenceId, 0, 0, StatusFlag.SERVER_STATUS_AUTOCOMMIT.getValue(), 0, ""));
                result.add(new OKPacket(++currentSequenceId, affectedRows, lastInsertId, StatusFlag.SERVER_STATUS_AUTOCOMMIT.getValue(), 0, ""));
                return result;
            }
            ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
@@ -120,4 +128,18 @@ public final class ComQueryPacket extends CommandPacket {
        }
        return result;
    }
    
    private boolean needGeneratedKey() {
        // TODO justify based on the request protocol
        return sql.toUpperCase().startsWith("INSERT");
    }

    private long getGeneratedKey(final Statement statement) throws SQLException {
        long result = -1;
        ResultSet resultSet = statement.getGeneratedKeys();
        if (resultSet.next()) {
            result = resultSet.getLong(1);
        }
        return result;
    }
}