package com.tesora.dve.db.mysql.libmy; /* * #%L * Tesora Inc. * Database Virtualization Engine * %% * Copyright (C) 2011 - 2014 Tesora Inc. * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License, version 3, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * #L% */ import java.nio.ByteOrder; import io.netty.buffer.ByteBuf; import io.netty.util.CharsetUtil; import com.tesora.dve.db.mysql.common.MysqlAPIUtils; public class MyOKResponse extends MyResponseMessage { public static final byte OKPKT_INDICATOR = 0; private long affectedRows = 0; private long insertId = 0; private int serverStatus = MyProtocolDefs.SERVER_STATUS_AUTOCOMMIT; private int warningCount = 0; private String message; public MyOKResponse() { } @Override public void marshallMessage(ByteBuf in) { ByteBuf cb = in.order(ByteOrder.LITTLE_ENDIAN); cb.writeByte(0); // field_count - spec says this is always 0 MysqlAPIUtils.putLengthCodedLong(cb, affectedRows); MysqlAPIUtils.putLengthCodedLong(cb, insertId); cb.writeShort(serverStatus); cb.writeShort(warningCount); if (message != null && message.length() > 0) { cb.writeBytes(message.getBytes()); } } public int calculateSize() { return 23 + ((message != null) ? message.length() : 0); } @Override public void unmarshallMessage(ByteBuf cb) { cb.readByte(); // field count - always 0 affectedRows = MysqlAPIUtils.getLengthCodedLong(cb); insertId = MysqlAPIUtils.getLengthCodedLong(cb); serverStatus = cb.readUnsignedShort(); warningCount = cb.readUnsignedShort(); if (cb.isReadable()) message = MysqlAPIUtils.readBytesAsString(cb, CharsetUtil.UTF_8); } public static long getAffectedRows(ByteBuf cb) { cb.readByte(); return MysqlAPIUtils.getLengthCodedLong(cb); } public long getAffectedRows() { return affectedRows; } public void setAffectedRows(long affectedRows) { this.affectedRows = affectedRows; } public void setAffectedRows(int affectedRows) { this.affectedRows = (long) affectedRows; } public long getInsertId() { return insertId; } public void setInsertId(long insertId) { this.insertId = insertId; } public short getWarningCount() { return (short) warningCount; } public void setWarningCount(short warningCount) { this.warningCount = warningCount; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public short getServerStatus() { return (short) serverStatus; } public void setServerStatus(short serverStatus) { this.serverStatus = serverStatus; } public void setStatusInTrans(boolean inTransaction) { if ( inTransaction ) serverStatus = (short) (serverStatus | MyProtocolDefs.SERVER_STATUS_IN_TRANS); else serverStatus = (short) (serverStatus & ~MyProtocolDefs.SERVER_STATUS_IN_TRANS); } @Override public MyMessageType getMessageType() { return MyMessageType.OK_RESPONSE; } @Override public String toString() { return super.toString() + " affectedRows=" + affectedRows + " insertId=" + insertId + " warningCount=" + warningCount; } }