De-serializes KeyValue from a buffer (HBase 0.94 and before). @param buf The buffer to de-serialize from. @param prev Another KeyValue previously de-serialized from the same buffer. Can be null. The idea here is that KeyValues often come in a sorted batch, and often share a
(final ChannelBuffer buf,
final KeyValue prev)
| 233 | * malformed {@link KeyValue}. |
| 234 | */ |
| 235 | public static KeyValue fromBuffer(final ChannelBuffer buf, |
| 236 | final KeyValue prev) { |
| 237 | final int rowkey_length = buf.readInt(); // Total length of the row key. |
| 238 | //LOG.debug("rowkey_length="+rowkey_length); |
| 239 | HBaseRpc.checkNonEmptyArrayLength(buf, rowkey_length); |
| 240 | final int value_length = buf.readInt(); |
| 241 | //LOG.debug("value_length="+value_length); |
| 242 | HBaseRpc.checkArrayLength(buf, value_length); |
| 243 | final short key_length = buf.readShort(); |
| 244 | //LOG.debug("key_length="+key_length); |
| 245 | HBaseRpc.checkArrayLength(buf, value_length); |
| 246 | final byte[] key = new byte[key_length]; |
| 247 | buf.readBytes(key); |
| 248 | //LOG.debug("key="+Bytes.pretty(key)); |
| 249 | final byte family_length = buf.readByte(); |
| 250 | if (key_length + family_length + 2 + 1 + 8 + 1 > rowkey_length) { |
| 251 | invalid("rowkey_length=" |
| 252 | + key_length + " doesn't match key_length + family_length (" |
| 253 | + key_length + " + " + family_length + " +12) in " + buf + '=' |
| 254 | + Bytes.pretty(buf)); |
| 255 | } |
| 256 | final byte[] family = new byte[family_length]; |
| 257 | buf.readBytes(family); |
| 258 | final int qual_length = (rowkey_length - key_length - family_length |
| 259 | - 2 - 1 - 8 - 1); |
| 260 | HBaseRpc.checkArrayLength(buf, qual_length); |
| 261 | final byte[] qualifier; |
| 262 | if (qual_length > 0) { |
| 263 | qualifier = new byte[qual_length]; |
| 264 | buf.readBytes(qualifier); |
| 265 | } else { |
| 266 | qualifier = HBaseClient.EMPTY_ARRAY; |
| 267 | } |
| 268 | final long timestamp = buf.readLong(); |
| 269 | final byte key_type = buf.readByte(); |
| 270 | final byte[] value; |
| 271 | if (value_length > 0) { |
| 272 | value = new byte[value_length]; |
| 273 | buf.readBytes(value); |
| 274 | } else { |
| 275 | value = HBaseClient.EMPTY_ARRAY; |
| 276 | } |
| 277 | if (2 + key_length + 1 + family_length + qual_length + 8 + 1 |
| 278 | != rowkey_length) { // XXX TMP DEBUG |
| 279 | invalid("2 + rl:" + key_length + " + 1 + fl:" + family_length + " + ql:" |
| 280 | + qual_length + " + 8 + 1" + " != kl:" + rowkey_length); |
| 281 | } |
| 282 | if (prev == null) { |
| 283 | return new KeyValue(key, family, qualifier, timestamp, /*key_type,*/ |
| 284 | value); |
| 285 | } else { |
| 286 | return new KeyValue(Bytes.deDup(prev.key, key), |
| 287 | Bytes.deDup(prev.family, family), |
| 288 | Bytes.deDup(prev.qualifier, qualifier), |
| 289 | timestamp, /*key_type,*/ value); |
| 290 | } |
| 291 | } |
| 292 |
no test coverage detected