Author: jmhsieh
Date: Fri Apr 25 21:22:55 2014
New Revision: 1590152

URL: http://svn.apache.org/r1590152
Log:
HBASE-10960 Enhance HBase Thrift 1 to include "append" and "checkAndPut" 
operations (Srikanth Srungarapu)

Modified:
    
hbase/trunk/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/ThriftServerRunner.java
    
hbase/trunk/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/ThriftUtilities.java
    
hbase/trunk/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/generated/Hbase.java
    
hbase/trunk/hbase-thrift/src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.thrift
    
hbase/trunk/hbase-thrift/src/test/java/org/apache/hadoop/hbase/thrift/TestThriftServer.java

Modified: 
hbase/trunk/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/ThriftServerRunner.java
URL: 
http://svn.apache.org/viewvc/hbase/trunk/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/ThriftServerRunner.java?rev=1590152&r1=1590151&r2=1590152&view=diff
==============================================================================
--- 
hbase/trunk/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/ThriftServerRunner.java
 (original)
+++ 
hbase/trunk/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/ThriftServerRunner.java
 Fri Apr 25 21:22:55 2014
@@ -54,6 +54,7 @@ import org.apache.hadoop.hbase.KeyValue;
 import org.apache.hadoop.hbase.ServerName;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.TableNotFoundException;
+import org.apache.hadoop.hbase.client.Append;
 import org.apache.hadoop.hbase.client.Delete;
 import org.apache.hadoop.hbase.client.Durability;
 import org.apache.hadoop.hbase.client.Get;
@@ -77,6 +78,7 @@ import org.apache.hadoop.hbase.thrift.ge
 import org.apache.hadoop.hbase.thrift.generated.IOError;
 import org.apache.hadoop.hbase.thrift.generated.IllegalArgument;
 import org.apache.hadoop.hbase.thrift.generated.Mutation;
+import org.apache.hadoop.hbase.thrift.generated.TAppend;
 import org.apache.hadoop.hbase.thrift.generated.TCell;
 import org.apache.hadoop.hbase.thrift.generated.TIncrement;
 import org.apache.hadoop.hbase.thrift.generated.TRegionInfo;
@@ -1486,6 +1488,58 @@ public class ThriftServerRunner implemen
         increment(tinc);
       }
     }
+
+    @Override
+    public List<TCell> append(TAppend tappend) throws IOError, TException {
+      if (tappend.getRow().length == 0 || tappend.getTable().length == 0) {
+        throw new TException("Must supply a table and a row key; can't 
append");
+      }
+
+      try {
+        HTable table = getTable(tappend.getTable());
+        Append append = ThriftUtilities.appendFromThrift(tappend);
+        Result result = table.append(append);
+        return ThriftUtilities.cellFromHBase(result.rawCells());
+      } catch (IOException e) {
+        LOG.warn(e.getMessage(), e);
+        throw new IOError(e.getMessage());
+      }
+    }
+
+    @Override
+    public boolean checkAndPut(ByteBuffer tableName, ByteBuffer row, 
ByteBuffer column,
+        ByteBuffer value, Mutation mput, Map<ByteBuffer, ByteBuffer> 
attributes) throws IOError,
+        IllegalArgument, TException {
+      Put put;
+      try {
+        put = new Put(getBytes(row), HConstants.LATEST_TIMESTAMP);
+        addAttributes(put, attributes);
+
+        byte[][] famAndQf = KeyValue.parseColumn(getBytes(mput.column));
+
+        put.addImmutable(famAndQf[0], famAndQf[1], mput.value != null ? 
getBytes(mput.value)
+            : HConstants.EMPTY_BYTE_ARRAY);
+
+        put.setDurability(mput.writeToWAL ? Durability.SYNC_WAL : 
Durability.SKIP_WAL);
+      } catch (IllegalArgumentException e) {
+        LOG.warn(e.getMessage(), e);
+        throw new IllegalArgument(e.getMessage());
+      }
+
+      HTable table = null;
+      try {
+        table = getTable(tableName);
+        byte[][] famAndQf = KeyValue.parseColumn(getBytes(column));
+        return table.checkAndPut(getBytes(row), famAndQf[0], famAndQf[1],
+          value != null ? getBytes(value) : HConstants.EMPTY_BYTE_ARRAY, put);
+      } catch (IOException e) {
+        LOG.warn(e.getMessage(), e);
+        throw new IOError(e.getMessage());
+      } catch (IllegalArgumentException e) {
+        LOG.warn(e.getMessage(), e);
+        throw new IllegalArgument(e.getMessage());
+      }
+    }
   }
 
 

Modified: 
hbase/trunk/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/ThriftUtilities.java
URL: 
http://svn.apache.org/viewvc/hbase/trunk/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/ThriftUtilities.java?rev=1590152&r1=1590151&r2=1590152&view=diff
==============================================================================
--- 
hbase/trunk/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/ThriftUtilities.java
 (original)
+++ 
hbase/trunk/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/ThriftUtilities.java
 Fri Apr 25 21:22:55 2014
@@ -18,6 +18,8 @@
 
 package org.apache.hadoop.hbase.thrift;
 
+import static org.apache.hadoop.hbase.util.Bytes.getBytes;
+
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.List;
@@ -28,12 +30,14 @@ import org.apache.hadoop.hbase.Cell;
 import org.apache.hadoop.hbase.CellUtil;
 import org.apache.hadoop.hbase.HColumnDescriptor;
 import org.apache.hadoop.hbase.KeyValue;
+import org.apache.hadoop.hbase.client.Append;
 import org.apache.hadoop.hbase.client.Increment;
 import org.apache.hadoop.hbase.client.Result;
 import org.apache.hadoop.hbase.io.compress.Compression;
 import org.apache.hadoop.hbase.regionserver.BloomType;
 import org.apache.hadoop.hbase.thrift.generated.ColumnDescriptor;
 import org.apache.hadoop.hbase.thrift.generated.IllegalArgument;
+import org.apache.hadoop.hbase.thrift.generated.TAppend;
 import org.apache.hadoop.hbase.thrift.generated.TCell;
 import org.apache.hadoop.hbase.thrift.generated.TColumn;
 import org.apache.hadoop.hbase.thrift.generated.TIncrement;
@@ -202,4 +206,28 @@ public class ThriftUtilities {
     inc.addColumn(famAndQf[0], famAndQf[1], tincrement.getAmmount());
     return inc;
   }
+
+  /**
+   * From a {@link TAppend} create an {@link Append}.
+   * @param tappend the Thrift version of an append.
+   * @return an increment that the {@link TAppend} represented.
+   */
+  public static Append appendFromThrift(TAppend tappend) {
+    Append append = new Append(tappend.getRow());
+    List<ByteBuffer> columns = tappend.getColumns();
+    List<ByteBuffer> values = tappend.getValues();
+
+    if (columns.size() != values.size()) {
+      throw new IllegalArgumentException(
+          "Sizes of columns and values in tappend object are not matching");
+    }
+
+    int length = columns.size();
+
+    for (int i = 0; i < length; i++) {
+      byte[][] famAndQf = KeyValue.parseColumn(getBytes(columns.get(i)));
+      append.add(famAndQf[0], famAndQf[1], getBytes(values.get(i)));
+    }
+    return append;
+  }
 }


Reply via email to