You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by pa...@apache.org on 2011/07/20 20:25:50 UTC

svn commit: r1148878 [5/5] - in /hive/trunk/metastore: if/ src/gen/thrift/gen-cpp/ src/gen/thrift/gen-javabean/org/apache/hadoop/hive/metastore/api/ src/gen/thrift/gen-php/hive_metastore/ src/gen/thrift/gen-py/hive_metastore/ src/gen/thrift/gen-rb/ src...

Modified: hive/trunk/metastore/src/gen/thrift/gen-py/hive_metastore/ThriftHiveMetastore.py
URL: http://svn.apache.org/viewvc/hive/trunk/metastore/src/gen/thrift/gen-py/hive_metastore/ThriftHiveMetastore.py?rev=1148878&r1=1148877&r2=1148878&view=diff
==============================================================================
--- hive/trunk/metastore/src/gen/thrift/gen-py/hive_metastore/ThriftHiveMetastore.py (original)
+++ hive/trunk/metastore/src/gen/thrift/gen-py/hive_metastore/ThriftHiveMetastore.py Wed Jul 20 18:25:45 2011
@@ -168,6 +168,13 @@ class Iface(fb303.FacebookService.Iface)
     """
     pass
 
+  def add_partitions(self, new_parts):
+    """
+    Parameters:
+     - new_parts
+    """
+    pass
+
   def append_partition(self, db_name, tbl_name, part_vals):
     """
     Parameters:
@@ -1224,6 +1231,42 @@ class Client(fb303.FacebookService.Clien
       raise result.o3
     raise TApplicationException(TApplicationException.MISSING_RESULT, "add_partition failed: unknown result");
 
+  def add_partitions(self, new_parts):
+    """
+    Parameters:
+     - new_parts
+    """
+    self.send_add_partitions(new_parts)
+    return self.recv_add_partitions()
+
+  def send_add_partitions(self, new_parts):
+    self._oprot.writeMessageBegin('add_partitions', TMessageType.CALL, self._seqid)
+    args = add_partitions_args()
+    args.new_parts = new_parts
+    args.write(self._oprot)
+    self._oprot.writeMessageEnd()
+    self._oprot.trans.flush()
+
+  def recv_add_partitions(self, ):
+    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
+    if mtype == TMessageType.EXCEPTION:
+      x = TApplicationException()
+      x.read(self._iprot)
+      self._iprot.readMessageEnd()
+      raise x
+    result = add_partitions_result()
+    result.read(self._iprot)
+    self._iprot.readMessageEnd()
+    if result.success != None:
+      return result.success
+    if result.o1 != None:
+      raise result.o1
+    if result.o2 != None:
+      raise result.o2
+    if result.o3 != None:
+      raise result.o3
+    raise TApplicationException(TApplicationException.MISSING_RESULT, "add_partitions failed: unknown result");
+
   def append_partition(self, db_name, tbl_name, part_vals):
     """
     Parameters:
@@ -2731,6 +2774,7 @@ class Processor(fb303.FacebookService.Pr
     self._processMap["get_table_objects_by_name"] = Processor.process_get_table_objects_by_name
     self._processMap["alter_table"] = Processor.process_alter_table
     self._processMap["add_partition"] = Processor.process_add_partition
+    self._processMap["add_partitions"] = Processor.process_add_partitions
     self._processMap["append_partition"] = Processor.process_append_partition
     self._processMap["append_partition_by_name"] = Processor.process_append_partition_by_name
     self._processMap["drop_partition"] = Processor.process_drop_partition
@@ -3115,6 +3159,24 @@ class Processor(fb303.FacebookService.Pr
     oprot.writeMessageEnd()
     oprot.trans.flush()
 
+  def process_add_partitions(self, seqid, iprot, oprot):
+    args = add_partitions_args()
+    args.read(iprot)
+    iprot.readMessageEnd()
+    result = add_partitions_result()
+    try:
+      result.success = self._handler.add_partitions(args.new_parts)
+    except InvalidObjectException, o1:
+      result.o1 = o1
+    except AlreadyExistsException, o2:
+      result.o2 = o2
+    except MetaException, o3:
+      result.o3 = o3
+    oprot.writeMessageBegin("add_partitions", TMessageType.REPLY, seqid)
+    result.write(oprot)
+    oprot.writeMessageEnd()
+    oprot.trans.flush()
+
   def process_append_partition(self, seqid, iprot, oprot):
     args = append_partition_args()
     args.read(iprot)
@@ -6800,6 +6862,171 @@ class add_partition_result:
   def __ne__(self, other):
     return not (self == other)
 
+class add_partitions_args:
+  """
+  Attributes:
+   - new_parts
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.LIST, 'new_parts', (TType.STRUCT,(Partition, Partition.thrift_spec)), None, ), # 1
+  )
+
+  def __init__(self, new_parts=None,):
+    self.new_parts = new_parts
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.LIST:
+          self.new_parts = []
+          (_etype242, _size239) = iprot.readListBegin()
+          for _i243 in xrange(_size239):
+            _elem244 = Partition()
+            _elem244.read(iprot)
+            self.new_parts.append(_elem244)
+          iprot.readListEnd()
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('add_partitions_args')
+    if self.new_parts != None:
+      oprot.writeFieldBegin('new_parts', TType.LIST, 1)
+      oprot.writeListBegin(TType.STRUCT, len(self.new_parts))
+      for iter245 in self.new_parts:
+        iter245.write(oprot)
+      oprot.writeListEnd()
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+    def validate(self):
+      return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class add_partitions_result:
+  """
+  Attributes:
+   - success
+   - o1
+   - o2
+   - o3
+  """
+
+  thrift_spec = (
+    (0, TType.I32, 'success', None, None, ), # 0
+    (1, TType.STRUCT, 'o1', (InvalidObjectException, InvalidObjectException.thrift_spec), None, ), # 1
+    (2, TType.STRUCT, 'o2', (AlreadyExistsException, AlreadyExistsException.thrift_spec), None, ), # 2
+    (3, TType.STRUCT, 'o3', (MetaException, MetaException.thrift_spec), None, ), # 3
+  )
+
+  def __init__(self, success=None, o1=None, o2=None, o3=None,):
+    self.success = success
+    self.o1 = o1
+    self.o2 = o2
+    self.o3 = o3
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 0:
+        if ftype == TType.I32:
+          self.success = iprot.readI32();
+        else:
+          iprot.skip(ftype)
+      elif fid == 1:
+        if ftype == TType.STRUCT:
+          self.o1 = InvalidObjectException()
+          self.o1.read(iprot)
+        else:
+          iprot.skip(ftype)
+      elif fid == 2:
+        if ftype == TType.STRUCT:
+          self.o2 = AlreadyExistsException()
+          self.o2.read(iprot)
+        else:
+          iprot.skip(ftype)
+      elif fid == 3:
+        if ftype == TType.STRUCT:
+          self.o3 = MetaException()
+          self.o3.read(iprot)
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('add_partitions_result')
+    if self.success != None:
+      oprot.writeFieldBegin('success', TType.I32, 0)
+      oprot.writeI32(self.success)
+      oprot.writeFieldEnd()
+    if self.o1 != None:
+      oprot.writeFieldBegin('o1', TType.STRUCT, 1)
+      self.o1.write(oprot)
+      oprot.writeFieldEnd()
+    if self.o2 != None:
+      oprot.writeFieldBegin('o2', TType.STRUCT, 2)
+      self.o2.write(oprot)
+      oprot.writeFieldEnd()
+    if self.o3 != None:
+      oprot.writeFieldBegin('o3', TType.STRUCT, 3)
+      self.o3.write(oprot)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+    def validate(self):
+      return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
 class append_partition_args:
   """
   Attributes:
@@ -6842,10 +7069,10 @@ class append_partition_args:
       elif fid == 3:
         if ftype == TType.LIST:
           self.part_vals = []
-          (_etype242, _size239) = iprot.readListBegin()
-          for _i243 in xrange(_size239):
-            _elem244 = iprot.readString();
-            self.part_vals.append(_elem244)
+          (_etype249, _size246) = iprot.readListBegin()
+          for _i250 in xrange(_size246):
+            _elem251 = iprot.readString();
+            self.part_vals.append(_elem251)
           iprot.readListEnd()
         else:
           iprot.skip(ftype)
@@ -6870,8 +7097,8 @@ class append_partition_args:
     if self.part_vals != None:
       oprot.writeFieldBegin('part_vals', TType.LIST, 3)
       oprot.writeListBegin(TType.STRING, len(self.part_vals))
-      for iter245 in self.part_vals:
-        oprot.writeString(iter245)
+      for iter252 in self.part_vals:
+        oprot.writeString(iter252)
       oprot.writeListEnd()
       oprot.writeFieldEnd()
     oprot.writeFieldStop()
@@ -7215,10 +7442,10 @@ class drop_partition_args:
       elif fid == 3:
         if ftype == TType.LIST:
           self.part_vals = []
-          (_etype249, _size246) = iprot.readListBegin()
-          for _i250 in xrange(_size246):
-            _elem251 = iprot.readString();
-            self.part_vals.append(_elem251)
+          (_etype256, _size253) = iprot.readListBegin()
+          for _i257 in xrange(_size253):
+            _elem258 = iprot.readString();
+            self.part_vals.append(_elem258)
           iprot.readListEnd()
         else:
           iprot.skip(ftype)
@@ -7248,8 +7475,8 @@ class drop_partition_args:
     if self.part_vals != None:
       oprot.writeFieldBegin('part_vals', TType.LIST, 3)
       oprot.writeListBegin(TType.STRING, len(self.part_vals))
-      for iter252 in self.part_vals:
-        oprot.writeString(iter252)
+      for iter259 in self.part_vals:
+        oprot.writeString(iter259)
       oprot.writeListEnd()
       oprot.writeFieldEnd()
     if self.deleteData != None:
@@ -7578,10 +7805,10 @@ class get_partition_args:
       elif fid == 3:
         if ftype == TType.LIST:
           self.part_vals = []
-          (_etype256, _size253) = iprot.readListBegin()
-          for _i257 in xrange(_size253):
-            _elem258 = iprot.readString();
-            self.part_vals.append(_elem258)
+          (_etype263, _size260) = iprot.readListBegin()
+          for _i264 in xrange(_size260):
+            _elem265 = iprot.readString();
+            self.part_vals.append(_elem265)
           iprot.readListEnd()
         else:
           iprot.skip(ftype)
@@ -7606,8 +7833,8 @@ class get_partition_args:
     if self.part_vals != None:
       oprot.writeFieldBegin('part_vals', TType.LIST, 3)
       oprot.writeListBegin(TType.STRING, len(self.part_vals))
-      for iter259 in self.part_vals:
-        oprot.writeString(iter259)
+      for iter266 in self.part_vals:
+        oprot.writeString(iter266)
       oprot.writeListEnd()
       oprot.writeFieldEnd()
     oprot.writeFieldStop()
@@ -7760,10 +7987,10 @@ class get_partition_with_auth_args:
       elif fid == 3:
         if ftype == TType.LIST:
           self.part_vals = []
-          (_etype263, _size260) = iprot.readListBegin()
-          for _i264 in xrange(_size260):
-            _elem265 = iprot.readString();
-            self.part_vals.append(_elem265)
+          (_etype270, _size267) = iprot.readListBegin()
+          for _i271 in xrange(_size267):
+            _elem272 = iprot.readString();
+            self.part_vals.append(_elem272)
           iprot.readListEnd()
         else:
           iprot.skip(ftype)
@@ -7775,10 +8002,10 @@ class get_partition_with_auth_args:
       elif fid == 5:
         if ftype == TType.LIST:
           self.group_names = []
-          (_etype269, _size266) = iprot.readListBegin()
-          for _i270 in xrange(_size266):
-            _elem271 = iprot.readString();
-            self.group_names.append(_elem271)
+          (_etype276, _size273) = iprot.readListBegin()
+          for _i277 in xrange(_size273):
+            _elem278 = iprot.readString();
+            self.group_names.append(_elem278)
           iprot.readListEnd()
         else:
           iprot.skip(ftype)
@@ -7803,8 +8030,8 @@ class get_partition_with_auth_args:
     if self.part_vals != None:
       oprot.writeFieldBegin('part_vals', TType.LIST, 3)
       oprot.writeListBegin(TType.STRING, len(self.part_vals))
-      for iter272 in self.part_vals:
-        oprot.writeString(iter272)
+      for iter279 in self.part_vals:
+        oprot.writeString(iter279)
       oprot.writeListEnd()
       oprot.writeFieldEnd()
     if self.user_name != None:
@@ -7814,8 +8041,8 @@ class get_partition_with_auth_args:
     if self.group_names != None:
       oprot.writeFieldBegin('group_names', TType.LIST, 5)
       oprot.writeListBegin(TType.STRING, len(self.group_names))
-      for iter273 in self.group_names:
-        oprot.writeString(iter273)
+      for iter280 in self.group_names:
+        oprot.writeString(iter280)
       oprot.writeListEnd()
       oprot.writeFieldEnd()
     oprot.writeFieldStop()
@@ -8202,11 +8429,11 @@ class get_partitions_result:
       if fid == 0:
         if ftype == TType.LIST:
           self.success = []
-          (_etype277, _size274) = iprot.readListBegin()
-          for _i278 in xrange(_size274):
-            _elem279 = Partition()
-            _elem279.read(iprot)
-            self.success.append(_elem279)
+          (_etype284, _size281) = iprot.readListBegin()
+          for _i285 in xrange(_size281):
+            _elem286 = Partition()
+            _elem286.read(iprot)
+            self.success.append(_elem286)
           iprot.readListEnd()
         else:
           iprot.skip(ftype)
@@ -8235,8 +8462,8 @@ class get_partitions_result:
     if self.success != None:
       oprot.writeFieldBegin('success', TType.LIST, 0)
       oprot.writeListBegin(TType.STRUCT, len(self.success))
-      for iter280 in self.success:
-        iter280.write(oprot)
+      for iter287 in self.success:
+        iter287.write(oprot)
       oprot.writeListEnd()
       oprot.writeFieldEnd()
     if self.o1 != None:
@@ -8322,10 +8549,10 @@ class get_partitions_with_auth_args:
       elif fid == 5:
         if ftype == TType.LIST:
           self.group_names = []
-          (_etype284, _size281) = iprot.readListBegin()
-          for _i285 in xrange(_size281):
-            _elem286 = iprot.readString();
-            self.group_names.append(_elem286)
+          (_etype291, _size288) = iprot.readListBegin()
+          for _i292 in xrange(_size288):
+            _elem293 = iprot.readString();
+            self.group_names.append(_elem293)
           iprot.readListEnd()
         else:
           iprot.skip(ftype)
@@ -8358,8 +8585,8 @@ class get_partitions_with_auth_args:
     if self.group_names != None:
       oprot.writeFieldBegin('group_names', TType.LIST, 5)
       oprot.writeListBegin(TType.STRING, len(self.group_names))
-      for iter287 in self.group_names:
-        oprot.writeString(iter287)
+      for iter294 in self.group_names:
+        oprot.writeString(iter294)
       oprot.writeListEnd()
       oprot.writeFieldEnd()
     oprot.writeFieldStop()
@@ -8410,11 +8637,11 @@ class get_partitions_with_auth_result:
       if fid == 0:
         if ftype == TType.LIST:
           self.success = []
-          (_etype291, _size288) = iprot.readListBegin()
-          for _i292 in xrange(_size288):
-            _elem293 = Partition()
-            _elem293.read(iprot)
-            self.success.append(_elem293)
+          (_etype298, _size295) = iprot.readListBegin()
+          for _i299 in xrange(_size295):
+            _elem300 = Partition()
+            _elem300.read(iprot)
+            self.success.append(_elem300)
           iprot.readListEnd()
         else:
           iprot.skip(ftype)
@@ -8443,8 +8670,8 @@ class get_partitions_with_auth_result:
     if self.success != None:
       oprot.writeFieldBegin('success', TType.LIST, 0)
       oprot.writeListBegin(TType.STRUCT, len(self.success))
-      for iter294 in self.success:
-        iter294.write(oprot)
+      for iter301 in self.success:
+        iter301.write(oprot)
       oprot.writeListEnd()
       oprot.writeFieldEnd()
     if self.o1 != None:
@@ -8583,10 +8810,10 @@ class get_partition_names_result:
       if fid == 0:
         if ftype == TType.LIST:
           self.success = []
-          (_etype298, _size295) = iprot.readListBegin()
-          for _i299 in xrange(_size295):
-            _elem300 = iprot.readString();
-            self.success.append(_elem300)
+          (_etype305, _size302) = iprot.readListBegin()
+          for _i306 in xrange(_size302):
+            _elem307 = iprot.readString();
+            self.success.append(_elem307)
           iprot.readListEnd()
         else:
           iprot.skip(ftype)
@@ -8609,8 +8836,8 @@ class get_partition_names_result:
     if self.success != None:
       oprot.writeFieldBegin('success', TType.LIST, 0)
       oprot.writeListBegin(TType.STRING, len(self.success))
-      for iter301 in self.success:
-        oprot.writeString(iter301)
+      for iter308 in self.success:
+        oprot.writeString(iter308)
       oprot.writeListEnd()
       oprot.writeFieldEnd()
     if self.o2 != None:
@@ -8679,10 +8906,10 @@ class get_partitions_ps_args:
       elif fid == 3:
         if ftype == TType.LIST:
           self.part_vals = []
-          (_etype305, _size302) = iprot.readListBegin()
-          for _i306 in xrange(_size302):
-            _elem307 = iprot.readString();
-            self.part_vals.append(_elem307)
+          (_etype312, _size309) = iprot.readListBegin()
+          for _i313 in xrange(_size309):
+            _elem314 = iprot.readString();
+            self.part_vals.append(_elem314)
           iprot.readListEnd()
         else:
           iprot.skip(ftype)
@@ -8712,8 +8939,8 @@ class get_partitions_ps_args:
     if self.part_vals != None:
       oprot.writeFieldBegin('part_vals', TType.LIST, 3)
       oprot.writeListBegin(TType.STRING, len(self.part_vals))
-      for iter308 in self.part_vals:
-        oprot.writeString(iter308)
+      for iter315 in self.part_vals:
+        oprot.writeString(iter315)
       oprot.writeListEnd()
       oprot.writeFieldEnd()
     if self.max_parts != None:
@@ -8765,11 +8992,11 @@ class get_partitions_ps_result:
       if fid == 0:
         if ftype == TType.LIST:
           self.success = []
-          (_etype312, _size309) = iprot.readListBegin()
-          for _i313 in xrange(_size309):
-            _elem314 = Partition()
-            _elem314.read(iprot)
-            self.success.append(_elem314)
+          (_etype319, _size316) = iprot.readListBegin()
+          for _i320 in xrange(_size316):
+            _elem321 = Partition()
+            _elem321.read(iprot)
+            self.success.append(_elem321)
           iprot.readListEnd()
         else:
           iprot.skip(ftype)
@@ -8792,8 +9019,8 @@ class get_partitions_ps_result:
     if self.success != None:
       oprot.writeFieldBegin('success', TType.LIST, 0)
       oprot.writeListBegin(TType.STRUCT, len(self.success))
-      for iter315 in self.success:
-        iter315.write(oprot)
+      for iter322 in self.success:
+        iter322.write(oprot)
       oprot.writeListEnd()
       oprot.writeFieldEnd()
     if self.o1 != None:
@@ -8868,10 +9095,10 @@ class get_partitions_ps_with_auth_args:
       elif fid == 3:
         if ftype == TType.LIST:
           self.part_vals = []
-          (_etype319, _size316) = iprot.readListBegin()
-          for _i320 in xrange(_size316):
-            _elem321 = iprot.readString();
-            self.part_vals.append(_elem321)
+          (_etype326, _size323) = iprot.readListBegin()
+          for _i327 in xrange(_size323):
+            _elem328 = iprot.readString();
+            self.part_vals.append(_elem328)
           iprot.readListEnd()
         else:
           iprot.skip(ftype)
@@ -8888,10 +9115,10 @@ class get_partitions_ps_with_auth_args:
       elif fid == 6:
         if ftype == TType.LIST:
           self.group_names = []
-          (_etype325, _size322) = iprot.readListBegin()
-          for _i326 in xrange(_size322):
-            _elem327 = iprot.readString();
-            self.group_names.append(_elem327)
+          (_etype332, _size329) = iprot.readListBegin()
+          for _i333 in xrange(_size329):
+            _elem334 = iprot.readString();
+            self.group_names.append(_elem334)
           iprot.readListEnd()
         else:
           iprot.skip(ftype)
@@ -8916,8 +9143,8 @@ class get_partitions_ps_with_auth_args:
     if self.part_vals != None:
       oprot.writeFieldBegin('part_vals', TType.LIST, 3)
       oprot.writeListBegin(TType.STRING, len(self.part_vals))
-      for iter328 in self.part_vals:
-        oprot.writeString(iter328)
+      for iter335 in self.part_vals:
+        oprot.writeString(iter335)
       oprot.writeListEnd()
       oprot.writeFieldEnd()
     if self.max_parts != None:
@@ -8931,8 +9158,8 @@ class get_partitions_ps_with_auth_args:
     if self.group_names != None:
       oprot.writeFieldBegin('group_names', TType.LIST, 6)
       oprot.writeListBegin(TType.STRING, len(self.group_names))
-      for iter329 in self.group_names:
-        oprot.writeString(iter329)
+      for iter336 in self.group_names:
+        oprot.writeString(iter336)
       oprot.writeListEnd()
       oprot.writeFieldEnd()
     oprot.writeFieldStop()
@@ -8983,11 +9210,11 @@ class get_partitions_ps_with_auth_result
       if fid == 0:
         if ftype == TType.LIST:
           self.success = []
-          (_etype333, _size330) = iprot.readListBegin()
-          for _i334 in xrange(_size330):
-            _elem335 = Partition()
-            _elem335.read(iprot)
-            self.success.append(_elem335)
+          (_etype340, _size337) = iprot.readListBegin()
+          for _i341 in xrange(_size337):
+            _elem342 = Partition()
+            _elem342.read(iprot)
+            self.success.append(_elem342)
           iprot.readListEnd()
         else:
           iprot.skip(ftype)
@@ -9016,8 +9243,8 @@ class get_partitions_ps_with_auth_result
     if self.success != None:
       oprot.writeFieldBegin('success', TType.LIST, 0)
       oprot.writeListBegin(TType.STRUCT, len(self.success))
-      for iter336 in self.success:
-        iter336.write(oprot)
+      for iter343 in self.success:
+        iter343.write(oprot)
       oprot.writeListEnd()
       oprot.writeFieldEnd()
     if self.o1 != None:
@@ -9090,10 +9317,10 @@ class get_partition_names_ps_args:
       elif fid == 3:
         if ftype == TType.LIST:
           self.part_vals = []
-          (_etype340, _size337) = iprot.readListBegin()
-          for _i341 in xrange(_size337):
-            _elem342 = iprot.readString();
-            self.part_vals.append(_elem342)
+          (_etype347, _size344) = iprot.readListBegin()
+          for _i348 in xrange(_size344):
+            _elem349 = iprot.readString();
+            self.part_vals.append(_elem349)
           iprot.readListEnd()
         else:
           iprot.skip(ftype)
@@ -9123,8 +9350,8 @@ class get_partition_names_ps_args:
     if self.part_vals != None:
       oprot.writeFieldBegin('part_vals', TType.LIST, 3)
       oprot.writeListBegin(TType.STRING, len(self.part_vals))
-      for iter343 in self.part_vals:
-        oprot.writeString(iter343)
+      for iter350 in self.part_vals:
+        oprot.writeString(iter350)
       oprot.writeListEnd()
       oprot.writeFieldEnd()
     if self.max_parts != None:
@@ -9176,10 +9403,10 @@ class get_partition_names_ps_result:
       if fid == 0:
         if ftype == TType.LIST:
           self.success = []
-          (_etype347, _size344) = iprot.readListBegin()
-          for _i348 in xrange(_size344):
-            _elem349 = iprot.readString();
-            self.success.append(_elem349)
+          (_etype354, _size351) = iprot.readListBegin()
+          for _i355 in xrange(_size351):
+            _elem356 = iprot.readString();
+            self.success.append(_elem356)
           iprot.readListEnd()
         else:
           iprot.skip(ftype)
@@ -9202,8 +9429,8 @@ class get_partition_names_ps_result:
     if self.success != None:
       oprot.writeFieldBegin('success', TType.LIST, 0)
       oprot.writeListBegin(TType.STRING, len(self.success))
-      for iter350 in self.success:
-        oprot.writeString(iter350)
+      for iter357 in self.success:
+        oprot.writeString(iter357)
       oprot.writeListEnd()
       oprot.writeFieldEnd()
     if self.o1 != None:
@@ -9353,11 +9580,11 @@ class get_partitions_by_filter_result:
       if fid == 0:
         if ftype == TType.LIST:
           self.success = []
-          (_etype354, _size351) = iprot.readListBegin()
-          for _i355 in xrange(_size351):
-            _elem356 = Partition()
-            _elem356.read(iprot)
-            self.success.append(_elem356)
+          (_etype361, _size358) = iprot.readListBegin()
+          for _i362 in xrange(_size358):
+            _elem363 = Partition()
+            _elem363.read(iprot)
+            self.success.append(_elem363)
           iprot.readListEnd()
         else:
           iprot.skip(ftype)
@@ -9386,8 +9613,8 @@ class get_partitions_by_filter_result:
     if self.success != None:
       oprot.writeFieldBegin('success', TType.LIST, 0)
       oprot.writeListBegin(TType.STRUCT, len(self.success))
-      for iter357 in self.success:
-        iter357.write(oprot)
+      for iter364 in self.success:
+        iter364.write(oprot)
       oprot.writeListEnd()
       oprot.writeFieldEnd()
     if self.o1 != None:
@@ -9457,10 +9684,10 @@ class get_partitions_by_names_args:
       elif fid == 3:
         if ftype == TType.LIST:
           self.names = []
-          (_etype361, _size358) = iprot.readListBegin()
-          for _i362 in xrange(_size358):
-            _elem363 = iprot.readString();
-            self.names.append(_elem363)
+          (_etype368, _size365) = iprot.readListBegin()
+          for _i369 in xrange(_size365):
+            _elem370 = iprot.readString();
+            self.names.append(_elem370)
           iprot.readListEnd()
         else:
           iprot.skip(ftype)
@@ -9485,8 +9712,8 @@ class get_partitions_by_names_args:
     if self.names != None:
       oprot.writeFieldBegin('names', TType.LIST, 3)
       oprot.writeListBegin(TType.STRING, len(self.names))
-      for iter364 in self.names:
-        oprot.writeString(iter364)
+      for iter371 in self.names:
+        oprot.writeString(iter371)
       oprot.writeListEnd()
       oprot.writeFieldEnd()
     oprot.writeFieldStop()
@@ -9537,11 +9764,11 @@ class get_partitions_by_names_result:
       if fid == 0:
         if ftype == TType.LIST:
           self.success = []
-          (_etype368, _size365) = iprot.readListBegin()
-          for _i369 in xrange(_size365):
-            _elem370 = Partition()
-            _elem370.read(iprot)
-            self.success.append(_elem370)
+          (_etype375, _size372) = iprot.readListBegin()
+          for _i376 in xrange(_size372):
+            _elem377 = Partition()
+            _elem377.read(iprot)
+            self.success.append(_elem377)
           iprot.readListEnd()
         else:
           iprot.skip(ftype)
@@ -9570,8 +9797,8 @@ class get_partitions_by_names_result:
     if self.success != None:
       oprot.writeFieldBegin('success', TType.LIST, 0)
       oprot.writeListBegin(TType.STRUCT, len(self.success))
-      for iter371 in self.success:
-        iter371.write(oprot)
+      for iter378 in self.success:
+        iter378.write(oprot)
       oprot.writeListEnd()
       oprot.writeFieldEnd()
     if self.o1 != None:
@@ -9985,10 +10212,10 @@ class partition_name_to_vals_result:
       if fid == 0:
         if ftype == TType.LIST:
           self.success = []
-          (_etype375, _size372) = iprot.readListBegin()
-          for _i376 in xrange(_size372):
-            _elem377 = iprot.readString();
-            self.success.append(_elem377)
+          (_etype382, _size379) = iprot.readListBegin()
+          for _i383 in xrange(_size379):
+            _elem384 = iprot.readString();
+            self.success.append(_elem384)
           iprot.readListEnd()
         else:
           iprot.skip(ftype)
@@ -10011,8 +10238,8 @@ class partition_name_to_vals_result:
     if self.success != None:
       oprot.writeFieldBegin('success', TType.LIST, 0)
       oprot.writeListBegin(TType.STRING, len(self.success))
-      for iter378 in self.success:
-        oprot.writeString(iter378)
+      for iter385 in self.success:
+        oprot.writeString(iter385)
       oprot.writeListEnd()
       oprot.writeFieldEnd()
     if self.o1 != None:
@@ -10123,11 +10350,11 @@ class partition_name_to_spec_result:
       if fid == 0:
         if ftype == TType.MAP:
           self.success = {}
-          (_ktype380, _vtype381, _size379 ) = iprot.readMapBegin() 
-          for _i383 in xrange(_size379):
-            _key384 = iprot.readString();
-            _val385 = iprot.readString();
-            self.success[_key384] = _val385
+          (_ktype387, _vtype388, _size386 ) = iprot.readMapBegin() 
+          for _i390 in xrange(_size386):
+            _key391 = iprot.readString();
+            _val392 = iprot.readString();
+            self.success[_key391] = _val392
           iprot.readMapEnd()
         else:
           iprot.skip(ftype)
@@ -10150,9 +10377,9 @@ class partition_name_to_spec_result:
     if self.success != None:
       oprot.writeFieldBegin('success', TType.MAP, 0)
       oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.success))
-      for kiter386,viter387 in self.success.items():
-        oprot.writeString(kiter386)
-        oprot.writeString(viter387)
+      for kiter393,viter394 in self.success.items():
+        oprot.writeString(kiter393)
+        oprot.writeString(viter394)
       oprot.writeMapEnd()
       oprot.writeFieldEnd()
     if self.o1 != None:
@@ -10221,11 +10448,11 @@ class markPartitionForEvent_args:
       elif fid == 3:
         if ftype == TType.MAP:
           self.part_vals = {}
-          (_ktype389, _vtype390, _size388 ) = iprot.readMapBegin() 
-          for _i392 in xrange(_size388):
-            _key393 = iprot.readString();
-            _val394 = iprot.readString();
-            self.part_vals[_key393] = _val394
+          (_ktype396, _vtype397, _size395 ) = iprot.readMapBegin() 
+          for _i399 in xrange(_size395):
+            _key400 = iprot.readString();
+            _val401 = iprot.readString();
+            self.part_vals[_key400] = _val401
           iprot.readMapEnd()
         else:
           iprot.skip(ftype)
@@ -10255,9 +10482,9 @@ class markPartitionForEvent_args:
     if self.part_vals != None:
       oprot.writeFieldBegin('part_vals', TType.MAP, 3)
       oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.part_vals))
-      for kiter395,viter396 in self.part_vals.items():
-        oprot.writeString(kiter395)
-        oprot.writeString(viter396)
+      for kiter402,viter403 in self.part_vals.items():
+        oprot.writeString(kiter402)
+        oprot.writeString(viter403)
       oprot.writeMapEnd()
       oprot.writeFieldEnd()
     if self.eventType != None:
@@ -10451,11 +10678,11 @@ class isPartitionMarkedForEvent_args:
       elif fid == 3:
         if ftype == TType.MAP:
           self.part_vals = {}
-          (_ktype398, _vtype399, _size397 ) = iprot.readMapBegin() 
-          for _i401 in xrange(_size397):
-            _key402 = iprot.readString();
-            _val403 = iprot.readString();
-            self.part_vals[_key402] = _val403
+          (_ktype405, _vtype406, _size404 ) = iprot.readMapBegin() 
+          for _i408 in xrange(_size404):
+            _key409 = iprot.readString();
+            _val410 = iprot.readString();
+            self.part_vals[_key409] = _val410
           iprot.readMapEnd()
         else:
           iprot.skip(ftype)
@@ -10485,9 +10712,9 @@ class isPartitionMarkedForEvent_args:
     if self.part_vals != None:
       oprot.writeFieldBegin('part_vals', TType.MAP, 3)
       oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.part_vals))
-      for kiter404,viter405 in self.part_vals.items():
-        oprot.writeString(kiter404)
-        oprot.writeString(viter405)
+      for kiter411,viter412 in self.part_vals.items():
+        oprot.writeString(kiter411)
+        oprot.writeString(viter412)
       oprot.writeMapEnd()
       oprot.writeFieldEnd()
     if self.eventType != None:
@@ -11448,11 +11675,11 @@ class get_indexes_result:
       if fid == 0:
         if ftype == TType.LIST:
           self.success = []
-          (_etype409, _size406) = iprot.readListBegin()
-          for _i410 in xrange(_size406):
-            _elem411 = Index()
-            _elem411.read(iprot)
-            self.success.append(_elem411)
+          (_etype416, _size413) = iprot.readListBegin()
+          for _i417 in xrange(_size413):
+            _elem418 = Index()
+            _elem418.read(iprot)
+            self.success.append(_elem418)
           iprot.readListEnd()
         else:
           iprot.skip(ftype)
@@ -11481,8 +11708,8 @@ class get_indexes_result:
     if self.success != None:
       oprot.writeFieldBegin('success', TType.LIST, 0)
       oprot.writeListBegin(TType.STRUCT, len(self.success))
-      for iter412 in self.success:
-        iter412.write(oprot)
+      for iter419 in self.success:
+        iter419.write(oprot)
       oprot.writeListEnd()
       oprot.writeFieldEnd()
     if self.o1 != None:
@@ -11621,10 +11848,10 @@ class get_index_names_result:
       if fid == 0:
         if ftype == TType.LIST:
           self.success = []
-          (_etype416, _size413) = iprot.readListBegin()
-          for _i417 in xrange(_size413):
-            _elem418 = iprot.readString();
-            self.success.append(_elem418)
+          (_etype423, _size420) = iprot.readListBegin()
+          for _i424 in xrange(_size420):
+            _elem425 = iprot.readString();
+            self.success.append(_elem425)
           iprot.readListEnd()
         else:
           iprot.skip(ftype)
@@ -11647,8 +11874,8 @@ class get_index_names_result:
     if self.success != None:
       oprot.writeFieldBegin('success', TType.LIST, 0)
       oprot.writeListBegin(TType.STRING, len(self.success))
-      for iter419 in self.success:
-        oprot.writeString(iter419)
+      for iter426 in self.success:
+        oprot.writeString(iter426)
       oprot.writeListEnd()
       oprot.writeFieldEnd()
     if self.o2 != None:
@@ -12002,10 +12229,10 @@ class get_role_names_result:
       if fid == 0:
         if ftype == TType.LIST:
           self.success = []
-          (_etype423, _size420) = iprot.readListBegin()
-          for _i424 in xrange(_size420):
-            _elem425 = iprot.readString();
-            self.success.append(_elem425)
+          (_etype430, _size427) = iprot.readListBegin()
+          for _i431 in xrange(_size427):
+            _elem432 = iprot.readString();
+            self.success.append(_elem432)
           iprot.readListEnd()
         else:
           iprot.skip(ftype)
@@ -12028,8 +12255,8 @@ class get_role_names_result:
     if self.success != None:
       oprot.writeFieldBegin('success', TType.LIST, 0)
       oprot.writeListBegin(TType.STRING, len(self.success))
-      for iter426 in self.success:
-        oprot.writeString(iter426)
+      for iter433 in self.success:
+        oprot.writeString(iter433)
       oprot.writeListEnd()
       oprot.writeFieldEnd()
     if self.o1 != None:
@@ -12496,11 +12723,11 @@ class list_roles_result:
       if fid == 0:
         if ftype == TType.LIST:
           self.success = []
-          (_etype430, _size427) = iprot.readListBegin()
-          for _i431 in xrange(_size427):
-            _elem432 = Role()
-            _elem432.read(iprot)
-            self.success.append(_elem432)
+          (_etype437, _size434) = iprot.readListBegin()
+          for _i438 in xrange(_size434):
+            _elem439 = Role()
+            _elem439.read(iprot)
+            self.success.append(_elem439)
           iprot.readListEnd()
         else:
           iprot.skip(ftype)
@@ -12523,8 +12750,8 @@ class list_roles_result:
     if self.success != None:
       oprot.writeFieldBegin('success', TType.LIST, 0)
       oprot.writeListBegin(TType.STRUCT, len(self.success))
-      for iter433 in self.success:
-        iter433.write(oprot)
+      for iter440 in self.success:
+        iter440.write(oprot)
       oprot.writeListEnd()
       oprot.writeFieldEnd()
     if self.o1 != None:
@@ -12591,10 +12818,10 @@ class get_privilege_set_args:
       elif fid == 3:
         if ftype == TType.LIST:
           self.group_names = []
-          (_etype437, _size434) = iprot.readListBegin()
-          for _i438 in xrange(_size434):
-            _elem439 = iprot.readString();
-            self.group_names.append(_elem439)
+          (_etype444, _size441) = iprot.readListBegin()
+          for _i445 in xrange(_size441):
+            _elem446 = iprot.readString();
+            self.group_names.append(_elem446)
           iprot.readListEnd()
         else:
           iprot.skip(ftype)
@@ -12619,8 +12846,8 @@ class get_privilege_set_args:
     if self.group_names != None:
       oprot.writeFieldBegin('group_names', TType.LIST, 3)
       oprot.writeListBegin(TType.STRING, len(self.group_names))
-      for iter440 in self.group_names:
-        oprot.writeString(iter440)
+      for iter447 in self.group_names:
+        oprot.writeString(iter447)
       oprot.writeListEnd()
       oprot.writeFieldEnd()
     oprot.writeFieldStop()
@@ -12824,11 +13051,11 @@ class list_privileges_result:
       if fid == 0:
         if ftype == TType.LIST:
           self.success = []
-          (_etype444, _size441) = iprot.readListBegin()
-          for _i445 in xrange(_size441):
-            _elem446 = HiveObjectPrivilege()
-            _elem446.read(iprot)
-            self.success.append(_elem446)
+          (_etype451, _size448) = iprot.readListBegin()
+          for _i452 in xrange(_size448):
+            _elem453 = HiveObjectPrivilege()
+            _elem453.read(iprot)
+            self.success.append(_elem453)
           iprot.readListEnd()
         else:
           iprot.skip(ftype)
@@ -12851,8 +13078,8 @@ class list_privileges_result:
     if self.success != None:
       oprot.writeFieldBegin('success', TType.LIST, 0)
       oprot.writeListBegin(TType.STRUCT, len(self.success))
-      for iter447 in self.success:
-        iter447.write(oprot)
+      for iter454 in self.success:
+        iter454.write(oprot)
       oprot.writeListEnd()
       oprot.writeFieldEnd()
     if self.o1 != None:

Modified: hive/trunk/metastore/src/gen/thrift/gen-rb/thrift_hive_metastore.rb
URL: http://svn.apache.org/viewvc/hive/trunk/metastore/src/gen/thrift/gen-rb/thrift_hive_metastore.rb?rev=1148878&r1=1148877&r2=1148878&view=diff
==============================================================================
--- hive/trunk/metastore/src/gen/thrift/gen-rb/thrift_hive_metastore.rb (original)
+++ hive/trunk/metastore/src/gen/thrift/gen-rb/thrift_hive_metastore.rb Wed Jul 20 18:25:45 2011
@@ -350,6 +350,24 @@ module ThriftHiveMetastore
       raise ::Thrift::ApplicationException.new(::Thrift::ApplicationException::MISSING_RESULT, 'add_partition failed: unknown result')
     end
 
+    def add_partitions(new_parts)
+      send_add_partitions(new_parts)
+      return recv_add_partitions()
+    end
+
+    def send_add_partitions(new_parts)
+      send_message('add_partitions', Add_partitions_args, :new_parts => new_parts)
+    end
+
+    def recv_add_partitions()
+      result = receive_message(Add_partitions_result)
+      return result.success unless result.success.nil?
+      raise result.o1 unless result.o1.nil?
+      raise result.o2 unless result.o2.nil?
+      raise result.o3 unless result.o3.nil?
+      raise ::Thrift::ApplicationException.new(::Thrift::ApplicationException::MISSING_RESULT, 'add_partitions failed: unknown result')
+    end
+
     def append_partition(db_name, tbl_name, part_vals)
       send_append_partition(db_name, tbl_name, part_vals)
       return recv_append_partition()
@@ -1290,6 +1308,21 @@ module ThriftHiveMetastore
       write_result(result, oprot, 'add_partition', seqid)
     end
 
+    def process_add_partitions(seqid, iprot, oprot)
+      args = read_args(iprot, Add_partitions_args)
+      result = Add_partitions_result.new()
+      begin
+        result.success = @handler.add_partitions(args.new_parts)
+      rescue InvalidObjectException => o1
+        result.o1 = o1
+      rescue AlreadyExistsException => o2
+        result.o2 = o2
+      rescue MetaException => o3
+        result.o3 = o3
+      end
+      write_result(result, oprot, 'add_partitions', seqid)
+    end
+
     def process_append_partition(seqid, iprot, oprot)
       args = read_args(iprot, Append_partition_args)
       result = Append_partition_result.new()
@@ -2535,6 +2568,44 @@ module ThriftHiveMetastore
     ::Thrift::Struct.generate_accessors self
   end
 
+  class Add_partitions_args
+    include ::Thrift::Struct, ::Thrift::Struct_Union
+    NEW_PARTS = 1
+
+    FIELDS = {
+      NEW_PARTS => {:type => ::Thrift::Types::LIST, :name => 'new_parts', :element => {:type => ::Thrift::Types::STRUCT, :class => Partition}}
+    }
+
+    def struct_fields; FIELDS; end
+
+    def validate
+    end
+
+    ::Thrift::Struct.generate_accessors self
+  end
+
+  class Add_partitions_result
+    include ::Thrift::Struct, ::Thrift::Struct_Union
+    SUCCESS = 0
+    O1 = 1
+    O2 = 2
+    O3 = 3
+
+    FIELDS = {
+      SUCCESS => {:type => ::Thrift::Types::I32, :name => 'success'},
+      O1 => {:type => ::Thrift::Types::STRUCT, :name => 'o1', :class => InvalidObjectException},
+      O2 => {:type => ::Thrift::Types::STRUCT, :name => 'o2', :class => AlreadyExistsException},
+      O3 => {:type => ::Thrift::Types::STRUCT, :name => 'o3', :class => MetaException}
+    }
+
+    def struct_fields; FIELDS; end
+
+    def validate
+    end
+
+    ::Thrift::Struct.generate_accessors self
+  end
+
   class Append_partition_args
     include ::Thrift::Struct, ::Thrift::Struct_Union
     DB_NAME = 1

Modified: hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java
URL: http://svn.apache.org/viewvc/hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java?rev=1148878&r1=1148877&r2=1148878&view=diff
==============================================================================
--- hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java (original)
+++ hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java Wed Jul 20 18:25:45 2011
@@ -31,6 +31,7 @@ import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Timer;
 import java.util.regex.Pattern;
 
@@ -1344,16 +1345,24 @@ public class HiveMetaStore extends Thrif
       logInfo("add_partitions : db=" + db + " tbl=" + tbl);
 
       boolean success = false;
+      Map<Partition,Boolean> addedPartitions = new HashMap<Partition,Boolean>();
       try {
         ms.openTransaction();
         for (Partition part : parts) {
-          add_partition(part);
+          Entry<Partition, Boolean> e = add_partition_core_notxn(ms,part);
+          addedPartitions.put(e.getKey(),e.getValue());
         }
         success = true;
         ms.commitTransaction();
       } finally {
         if (!success) {
           ms.rollbackTransaction();
+          for (Entry<Partition,Boolean> e : addedPartitions.entrySet()){
+            if (e.getValue()){
+              wh.deleteDir(new Path(e.getKey().getSd().getLocation()), true);
+              // we just created this directory - it's not a case of pre-creation, so we nuke
+            }
+          }
         }
       }
       return parts.size();
@@ -1390,12 +1399,23 @@ public class HiveMetaStore extends Thrif
       return ret;
     }
 
-    private Partition add_partition_core(final RawStore ms, final Partition part)
-        throws InvalidObjectException, AlreadyExistsException, MetaException {
+    /**
+     * An implementation of add_partition_core that does not commit
+     * transaction or rollback transaction as part of its operation
+     * - it is assumed that will be tended to from outside this call
+     * @param ms
+     * @param part
+     * @return
+     * @throws InvalidObjectException
+     * @throws AlreadyExistsException
+     * @throws MetaException
+     */
+    private Entry<Partition,Boolean> add_partition_core_notxn(
+        final RawStore ms, final Partition part)
+    throws InvalidObjectException, AlreadyExistsException, MetaException {
       boolean success = false, madeDir = false;
       Path partLocation = null;
       try {
-        ms.openTransaction();
         Partition old_part = null;
         try {
           old_part = ms.getPartition(part.getDbName(), part
@@ -1456,20 +1476,39 @@ public class HiveMetaStore extends Thrif
             part.getParameters().get(Constants.DDL_TIME) == null) {
           part.putToParameters(Constants.DDL_TIME, Long.toString(time));
         }
-        success = ms.addPartition(part) && ms.commitTransaction();
+        success = ms.addPartition(part);
 
       } finally {
         if (!success) {
-          ms.rollbackTransaction();
           if (madeDir) {
             wh.deleteDir(partLocation, true);
           }
         }
         for(MetaStoreEventListener listener : listeners){
           listener.onAddPartition(new AddPartitionEvent(part, success, this));
+        }
       }
+      Map<Partition,Boolean> returnVal = new HashMap<Partition,Boolean>();
+      returnVal.put(part, madeDir);
+      return returnVal.entrySet().iterator().next();
+    }
+
+    private Partition add_partition_core(final RawStore ms, final Partition part)
+    throws InvalidObjectException, AlreadyExistsException, MetaException {
+      boolean success = false;
+      Partition retPtn = null;
+      try{
+        ms.openTransaction();
+        retPtn = add_partition_core_notxn(ms,part).getKey();
+        // we proceed only if we'd actually succeeded anyway, otherwise,
+        // we'd have thrown an exception
+        success = ms.commitTransaction();
+      }finally{
+        if (!success){
+          ms.rollbackTransaction();
+        }
       }
-      return part;
+      return retPtn;
     }
 
     public Partition add_partition(final Partition part)

Modified: hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStoreClient.java
URL: http://svn.apache.org/viewvc/hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStoreClient.java?rev=1148878&r1=1148877&r2=1148878&view=diff
==============================================================================
--- hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStoreClient.java (original)
+++ hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStoreClient.java Wed Jul 20 18:25:45 2011
@@ -292,6 +292,20 @@ public class HiveMetaStoreClient impleme
   }
 
   /**
+   * @param new_parts
+   * @throws InvalidObjectException
+   * @throws AlreadyExistsException
+   * @throws MetaException
+   * @throws TException
+   * @see org.apache.hadoop.hive.metastore.api.ThriftHiveMetastore.Iface#add_partitions(List<org.apache.hadoop.hive.metastore.api.Partition>)
+   */
+  public int add_partitions(List<Partition> new_parts)
+      throws InvalidObjectException, AlreadyExistsException, MetaException,
+      TException {
+    return client.add_partitions(new_parts);
+  }
+
+  /**
    * @param table_name
    * @param db_name
    * @param part_vals

Modified: hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/IMetaStoreClient.java
URL: http://svn.apache.org/viewvc/hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/IMetaStoreClient.java?rev=1148878&r1=1148877&r2=1148878&view=diff
==============================================================================
--- hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/IMetaStoreClient.java (original)
+++ hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/IMetaStoreClient.java Wed Jul 20 18:25:45 2011
@@ -249,6 +249,7 @@ public interface IMetaStoreClient {
 
   public Partition appendPartition(String tableName, String dbName, String name)
       throws InvalidObjectException, AlreadyExistsException, MetaException, TException;
+
   /**
    * Add a partition to the table.
    *
@@ -269,6 +270,24 @@ public interface IMetaStoreClient {
       TException;
 
   /**
+   * Add partitions to the table.
+   *
+   * @param partitions
+   *          The partitions to add
+   * @throws InvalidObjectException
+   *           Could not find table to add to
+   * @throws AlreadyExistsException
+   *           Partition already exists
+   * @throws MetaException
+   *           Could not add partition
+   * @throws TException
+   *           Thrift exception
+   */
+  public int add_partitions(List<Partition> partitions)
+      throws InvalidObjectException, AlreadyExistsException, MetaException,
+      TException;
+
+  /**
    * @param tblName
    * @param dbName
    * @param partVals

Modified: hive/trunk/metastore/src/test/org/apache/hadoop/hive/metastore/TestHiveMetaStore.java
URL: http://svn.apache.org/viewvc/hive/trunk/metastore/src/test/org/apache/hadoop/hive/metastore/TestHiveMetaStore.java?rev=1148878&r1=1148877&r2=1148878&view=diff
==============================================================================
--- hive/trunk/metastore/src/test/org/apache/hadoop/hive/metastore/TestHiveMetaStore.java (original)
+++ hive/trunk/metastore/src/test/org/apache/hadoop/hive/metastore/TestHiveMetaStore.java Wed Jul 20 18:25:45 2011
@@ -19,6 +19,7 @@
 package org.apache.hadoop.hive.metastore;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
@@ -116,20 +117,10 @@ public abstract class TestHiveMetaStore 
       String dbName = "compdb";
       String tblName = "comptbl";
       String typeName = "Person";
-      List<String> vals = new ArrayList<String>(2);
-      vals.add("2008-07-01 14:13:12");
-      vals.add("14");
-      List <String> vals2 = new ArrayList<String>(2);
-      vals2.add("2008-07-01 14:13:12");
-      vals2.add("15");
-      List <String> vals3 = new ArrayList<String>(2);
-      vals3 = new ArrayList<String>(2);
-      vals3.add("2008-07-02 14:13:12");
-      vals3.add("15");
-      List <String> vals4 = new ArrayList<String>(2);
-      vals4 = new ArrayList<String>(2);
-      vals4.add("2008-07-03 14:13:12");
-      vals4.add("151");
+      List<String> vals = makeVals("2008-07-01 14:13:12", "14");
+      List<String> vals2 = makeVals("2008-07-01 14:13:12", "15");
+      List<String> vals3 = makeVals("2008-07-02 14:13:12", "15");
+      List<String> vals4 = makeVals("2008-07-03 14:13:12", "151");
 
       client.dropTable(dbName, tblName);
       silentDropDatabase(dbName);
@@ -182,43 +173,12 @@ public abstract class TestHiveMetaStore 
         tbl = client.getTable(dbName, tblName);
       }
 
-      Partition part = new Partition();
-      part.setDbName(dbName);
-      part.setTableName(tblName);
-      part.setValues(vals);
-      part.setParameters(new HashMap<String, String>());
-      part.setSd(tbl.getSd());
-      part.getSd().setSerdeInfo(tbl.getSd().getSerdeInfo());
-      part.getSd().setLocation(tbl.getSd().getLocation() + "/part1");
-
-      Partition part2 = new Partition();
-      part2.setDbName(dbName);
-      part2.setTableName(tblName);
-      part2.setValues(vals2);
-      part2.setParameters(new HashMap<String, String>());
-      part2.setSd(tbl.getSd());
-      part2.getSd().setSerdeInfo(tbl.getSd().getSerdeInfo());
-      part2.getSd().setLocation(tbl.getSd().getLocation() + "/part2");
-
-      Partition part3 = new Partition();
-      part3.setDbName(dbName);
-      part3.setTableName(tblName);
-      part3.setValues(vals3);
-      part3.setParameters(new HashMap<String, String>());
-      part3.setSd(tbl.getSd());
-      part3.getSd().setSerdeInfo(tbl.getSd().getSerdeInfo());
-      part3.getSd().setLocation(tbl.getSd().getLocation() + "/part3");
-
-      Partition part4 = new Partition();
-      part4.setDbName(dbName);
-      part4.setTableName(tblName);
-      part4.setValues(vals4);
-      part4.setParameters(new HashMap<String, String>());
-      part4.setSd(tbl.getSd());
-      part4.getSd().setSerdeInfo(tbl.getSd().getSerdeInfo());
-      part4.getSd().setLocation(tbl.getSd().getLocation() + "/part4");
+      Partition part = makePartitionObject(dbName, tblName, vals, tbl, "/part1");
+      Partition part2 = makePartitionObject(dbName, tblName, vals2, tbl, "/part2");
+      Partition part3 = makePartitionObject(dbName, tblName, vals3, tbl, "/part3");
+      Partition part4 = makePartitionObject(dbName, tblName, vals4, tbl, "/part4");
 
-      // check if the partition exists (it shouldn;t)
+      // check if the partition exists (it shouldn't)
       boolean exceptionThrown = false;
       try {
         Partition p = client.getPartition(dbName, tblName, vals);
@@ -237,6 +197,8 @@ public abstract class TestHiveMetaStore 
       Partition retp4 = client.add_partition(part4);
       assertNotNull("Unable to create partition " + part4, retp4);
 
+
+
       Partition part_get = client.getPartition(dbName, tblName, part.getValues());
       if(isThriftClient) {
         // since we are using thrift, 'part' will not have the create time and
@@ -316,7 +278,7 @@ public abstract class TestHiveMetaStore 
       }
       assertTrue("Bad partition spec should have thrown an exception", exceptionThrown);
 
-      Path partPath = new Path(part2.getSd().getLocation());
+      Path partPath = new Path(part.getSd().getLocation());
       FileSystem fs = FileSystem.get(partPath.toUri(), hiveConf);
 
 
@@ -341,6 +303,71 @@ public abstract class TestHiveMetaStore 
       retp = client.add_partition(part);
       assertNotNull("Unable to create partition " + part, retp);
 
+      // test add_partitions
+
+      List<String> mvals1 = makeVals("2008-07-04 14:13:12", "14641");
+      List<String> mvals2 = makeVals("2008-07-04 14:13:12", "14642");
+      List<String> mvals3 = makeVals("2008-07-04 14:13:12", "14643");
+      List<String> mvals4 = makeVals("2008-07-04 14:13:12", "14643"); // equal to 3
+      List<String> mvals5 = makeVals("2008-07-04 14:13:12", "14645");
+
+      Exception savedException;
+
+      // add_partitions(empty list) : ok, normal operation
+      client.add_partitions(new ArrayList<Partition>());
+
+      // add_partitions(1,2,3) : ok, normal operation
+      Partition mpart1 = makePartitionObject(dbName, tblName, mvals1, tbl, "/mpart1");
+      Partition mpart2 = makePartitionObject(dbName, tblName, mvals2, tbl, "/mpart2");
+      Partition mpart3 = makePartitionObject(dbName, tblName, mvals3, tbl, "/mpart3");
+      client.add_partitions(Arrays.asList(mpart1,mpart2,mpart3));
+
+      if(isThriftClient) {
+        // do DDL time munging if thrift mode
+        adjust(client, mpart1, dbName, tblName);
+        adjust(client, mpart2, dbName, tblName);
+        adjust(client, mpart3, dbName, tblName);
+      }
+      verifyPartitionsPublished(client, dbName, tblName,
+          Arrays.asList(mvals1.get(0)),
+          Arrays.asList(mpart1,mpart2,mpart3));
+
+      Partition mpart4 = makePartitionObject(dbName, tblName, mvals4, tbl, "/mpart4");
+      Partition mpart5 = makePartitionObject(dbName, tblName, mvals5, tbl, "/mpart5");
+
+      // create dir for /mpart5
+      Path mp5Path = new Path(mpart5.getSd().getLocation());
+      warehouse.mkdirs(mp5Path);
+      assertTrue(fs.exists(mp5Path));
+
+      // add_partitions(5,4) : err = duplicate keyvals on mpart4
+      savedException = null;
+      try {
+        client.add_partitions(Arrays.asList(mpart5,mpart4));
+      } catch (Exception e) {
+        savedException = e;
+      } finally {
+        assertNotNull(savedException);
+      }
+
+      // check that /mpart4 does not exist, but /mpart5 still does.
+      assertTrue(fs.exists(mp5Path));
+      assertFalse(fs.exists(new Path(mpart4.getSd().getLocation())));
+
+      // add_partitions(5) : ok
+      client.add_partitions(Arrays.asList(mpart5));
+
+      if(isThriftClient) {
+        // do DDL time munging if thrift mode
+        adjust(client, mpart5, dbName, tblName);
+      }
+
+      verifyPartitionsPublished(client, dbName, tblName,
+          Arrays.asList(mvals1.get(0)),
+          Arrays.asList(mpart1,mpart2,mpart3,mpart5));
+
+      //// end add_partitions tests
+
       client.dropTable(dbName, tblName);
 
       client.dropType(typeName);
@@ -368,6 +395,41 @@ public abstract class TestHiveMetaStore 
     }
   }
 
+  private static void verifyPartitionsPublished(HiveMetaStoreClient client,
+      String dbName, String tblName, List<String> partialSpec,
+      List<Partition> expectedPartitions)
+          throws NoSuchObjectException, MetaException, TException {
+    // Test partition listing with a partial spec
+
+    List<Partition> mpartial = client.listPartitions(dbName, tblName, partialSpec,
+        (short) -1);
+    assertEquals("Should have returned "+expectedPartitions.size()+
+        " partitions, returned " + mpartial.size(),
+        expectedPartitions.size(), mpartial.size());
+    assertTrue("Not all parts returned", mpartial.containsAll(expectedPartitions));
+  }
+
+  private static List<String> makeVals(String ds, String id) {
+    List <String> vals4 = new ArrayList<String>(2);
+    vals4 = new ArrayList<String>(2);
+    vals4.add(ds);
+    vals4.add(id);
+    return vals4;
+  }
+
+  private static Partition makePartitionObject(String dbName, String tblName,
+      List<String> ptnVals, Table tbl, String ptnLocationSuffix) {
+    Partition part4 = new Partition();
+    part4.setDbName(dbName);
+    part4.setTableName(tblName);
+    part4.setValues(ptnVals);
+    part4.setParameters(new HashMap<String, String>());
+    part4.setSd(tbl.getSd().deepCopy());
+    part4.getSd().setSerdeInfo(tbl.getSd().getSerdeInfo().deepCopy());
+    part4.getSd().setLocation(tbl.getSd().getLocation() + ptnLocationSuffix);
+    return part4;
+  }
+
   public void testAlterPartition() throws Throwable {
 
     try {