You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@avro.apache.org by ma...@apache.org on 2010/01/22 21:55:51 UTC

svn commit: r902264 - in /hadoop/avro/trunk: CHANGES.txt lang/c/src/datum_equal.c lang/c/src/datum_read.c lang/c/src/datum_write.c lang/c/tests/test_avro_data.c lang/c/version.sh

Author: massie
Date: Fri Jan 22 20:55:51 2010
New Revision: 902264

URL: http://svn.apache.org/viewvc?rev=902264&view=rev
Log:
AVRO-369.  Add support for encoding/decoding enum values

Modified:
    hadoop/avro/trunk/CHANGES.txt
    hadoop/avro/trunk/lang/c/src/datum_equal.c
    hadoop/avro/trunk/lang/c/src/datum_read.c
    hadoop/avro/trunk/lang/c/src/datum_write.c
    hadoop/avro/trunk/lang/c/tests/test_avro_data.c
    hadoop/avro/trunk/lang/c/version.sh

Modified: hadoop/avro/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/CHANGES.txt?rev=902264&r1=902263&r2=902264&view=diff
==============================================================================
--- hadoop/avro/trunk/CHANGES.txt (original)
+++ hadoop/avro/trunk/CHANGES.txt Fri Jan 22 20:55:51 2010
@@ -244,6 +244,8 @@
 
     AVRO-367. Complete memory management for the C implementation (massie)
 
+    AVRO-369. Add support for encoding/decoding enum values (massie)
+
   OPTIMIZATIONS
 
     AVRO-172. More efficient schema processing (massie)

Modified: hadoop/avro/trunk/lang/c/src/datum_equal.c
URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/src/datum_equal.c?rev=902264&r1=902263&r2=902264&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/src/datum_equal.c (original)
+++ hadoop/avro/trunk/lang/c/src/datum_equal.c Fri Jan 22 20:55:51 2010
@@ -83,6 +83,12 @@
 	return args.rval;
 }
 
+static int enum_equal(struct avro_enum_datum_t *a, struct avro_enum_datum_t *b)
+{
+	return strcmp(a->name, b->name) == 0
+	    && strcmp(a->symbol, b->symbol) == 0;
+}
+
 int avro_datum_equal(avro_datum_t a, avro_datum_t b)
 {
 	if (!(is_avro_datum(a) && is_avro_datum(b))) {
@@ -125,6 +131,8 @@
 				    avro_datum_to_record(b));
 
 	case AVRO_ENUM:
+		return enum_equal(avro_datum_to_enum(a), avro_datum_to_enum(b));
+
 	case AVRO_FIXED:
 	case AVRO_UNION:
 	case AVRO_LINK:

Modified: hadoop/avro/trunk/lang/c/src/datum_read.c
URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/src/datum_read.c?rev=902264&r1=902263&r2=902264&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/src/datum_read.c (original)
+++ hadoop/avro/trunk/lang/c/src/datum_read.c Fri Jan 22 20:55:51 2010
@@ -14,6 +14,7 @@
  * implied.  See the License for the specific language governing
  * permissions and limitations under the License. 
  */
+#include <stdlib.h>
 #include <errno.h>
 #include <string.h>
 #include "encoding.h"
@@ -101,10 +102,27 @@
 
 static int
 read_enum(avro_reader_t reader, const avro_encoding_t * enc,
-	  avro_schema_t writers_schema, avro_schema_t readers_schema,
-	  avro_datum_t * datum)
+	  struct avro_enum_schema_t *writers_schema,
+	  struct avro_enum_schema_t *readers_schema, avro_datum_t * datum)
 {
-	return 1;
+	int rval;
+	int64_t i, index;
+	struct avro_enum_symbol_t *sym;
+
+	rval = enc->read_long(reader, &index);
+	if (rval) {
+		return rval;
+	}
+
+	sym = STAILQ_FIRST(&writers_schema->symbols);
+	for (i = 0; i != index && sym != NULL;
+	     sym = STAILQ_NEXT(sym, symbols), i++) {
+	}
+	if (!sym) {
+		return EINVAL;
+	}
+	*datum = avro_enum(writers_schema->name, sym->symbol);
+	return 0;
 }
 
 static int
@@ -370,8 +388,8 @@
 
 	case AVRO_ENUM:
 		rval =
-		    read_enum(reader, enc, writers_schema, readers_schema,
-			      datum);
+		    read_enum(reader, enc, avro_schema_to_enum(writers_schema),
+			      avro_schema_to_enum(readers_schema), datum);
 		break;
 
 	case AVRO_ARRAY:

Modified: hadoop/avro/trunk/lang/c/src/datum_write.c
URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/src/datum_write.c?rev=902264&r1=902263&r2=902264&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/src/datum_write.c (original)
+++ hadoop/avro/trunk/lang/c/src/datum_write.c Fri Jan 22 20:55:51 2010
@@ -16,6 +16,7 @@
  */
 #include <errno.h>
 #include <assert.h>
+#include <string.h>
 #include "schema.h"
 #include "datum.h"
 #include "encoding.h"
@@ -39,12 +40,19 @@
 
 static int
 write_enum(avro_writer_t writer, const avro_encoding_t * enc,
-	   avro_schema_t writer_schema, avro_datum_t datum)
+	   struct avro_enum_schema_t *enump, struct avro_enum_datum_t *datum)
 {
-	/*
-	 * TODO 
-	 */
-	return EINVAL;
+	int64_t index;
+	struct avro_enum_symbol_t *sym = STAILQ_FIRST(&enump->symbols);
+	for (index = 0; sym != NULL; sym = STAILQ_NEXT(sym, symbols), index++) {
+		if (strcmp(sym->symbol, datum->symbol) == 0) {
+			break;
+		}
+	}
+	if (!sym) {
+		return EINVAL;
+	}
+	return enc->write_long(writer, index);
 }
 
 static int
@@ -221,7 +229,9 @@
 				 avro_schema_to_record(writer_schema), datum);
 		break;
 	case AVRO_ENUM:
-		rval = write_enum(writer, enc, writer_schema, datum);
+		rval =
+		    write_enum(writer, enc, avro_schema_to_enum(writer_schema),
+			       avro_datum_to_enum(datum));
 		break;
 	case AVRO_FIXED:
 		rval = write_fixed(writer, enc, writer_schema, datum);

Modified: hadoop/avro/trunk/lang/c/tests/test_avro_data.c
URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/tests/test_avro_data.c?rev=902264&r1=902263&r2=902264&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/tests/test_avro_data.c (original)
+++ hadoop/avro/trunk/lang/c/tests/test_avro_data.c Fri Jan 22 20:55:51 2010
@@ -177,9 +177,18 @@
 
 static int test_enum(void)
 {
-	/*
-	 * TODO 
-	 */
+	avro_schema_t schema = avro_schema_enum("language");
+	avro_datum_t datum = avro_enum("language", "C");
+
+	avro_schema_enum_symbol_append(schema, "C");
+	avro_schema_enum_symbol_append(schema, "C++");
+	avro_schema_enum_symbol_append(schema, "Python");
+	avro_schema_enum_symbol_append(schema, "Ruby");
+	avro_schema_enum_symbol_append(schema, "Java");
+
+	write_read_check(schema, NULL, datum, "enum");
+	avro_datum_decref(datum);
+	avro_schema_decref(schema);
 	return 0;
 }
 

Modified: hadoop/avro/trunk/lang/c/version.sh
URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/version.sh?rev=902264&r1=902263&r2=902264&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/version.sh (original)
+++ hadoop/avro/trunk/lang/c/version.sh Fri Jan 22 20:55:51 2010
@@ -18,9 +18,9 @@
 #         libavro_binary_age = 0
 #         libavro_interface_age = 0
 #
-libavro_micro_version=8
+libavro_micro_version=9
 libavro_interface_age=0
-libavro_binary_age=3
+libavro_binary_age=4
 
 # IGNORE EVERYTHING ELSE FROM HERE DOWN.........
 if test $# != 1; then