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


Reply via email to