Author: massie
Date: Fri Jan 22 22:38:09 2010
New Revision: 902297

URL: http://svn.apache.org/viewvc?rev=902297&view=rev
Log:
AVRO-370.  Add support for encoding/decoding fixed data

Modified:
    hadoop/avro/trunk/CHANGES.txt
    hadoop/avro/trunk/lang/c/src/avro.h
    hadoop/avro/trunk/lang/c/src/datum.c
    hadoop/avro/trunk/lang/c/src/datum.h
    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=902297&r1=902296&r2=902297&view=diff
==============================================================================
--- hadoop/avro/trunk/CHANGES.txt (original)
+++ hadoop/avro/trunk/CHANGES.txt Fri Jan 22 22:38:09 2010
@@ -246,6 +246,8 @@
 
     AVRO-369. Add support for encoding/decoding enum values (massie)
 
+    AVRO-370. Add support for encoding/decoding fixed data (massie)
+
   OPTIMIZATIONS
 
     AVRO-172. More efficient schema processing (massie)

Modified: hadoop/avro/trunk/lang/c/src/avro.h
URL: 
http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/src/avro.h?rev=902297&r1=902296&r2=902297&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/src/avro.h (original)
+++ hadoop/avro/trunk/lang/c/src/avro.h Fri Jan 22 22:38:09 2010
@@ -188,7 +188,12 @@
 
 avro_datum_t avro_enum(const char *name, const char *symbol);
 
-avro_datum_t avro_fixed(const char *name, const int64_t len, const char 
*bytes);
+avro_datum_t avro_fixed(const char *name, const char *bytes,
+                       const int64_t size);
+avro_datum_t avro_wrapfixed(const char *name, const char *bytes,
+                           const int64_t size);
+avro_datum_t avro_givefixed(const char *name, const char *bytes,
+                           const int64_t size);
 
 avro_datum_t avro_map(void);
 int avro_map_set(const avro_datum_t map, const char *key,

Modified: hadoop/avro/trunk/lang/c/src/datum.c
URL: 
http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/src/datum.c?rev=902297&r1=902296&r2=902297&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/src/datum.c (original)
+++ hadoop/avro/trunk/lang/c/src/datum.c Fri Jan 22 22:38:09 2010
@@ -249,7 +249,9 @@
        return &datum->obj;
 }
 
-avro_datum_t avro_fixed(const char *name, const int64_t size, const char 
*bytes)
+static avro_datum_t avro_fixed_private(const char *name, const char *bytes,
+                                      const int64_t size,
+                                      void (*fixed_free) (void *ptr))
 {
        struct avro_fixed_datum_t *datum =
            malloc(sizeof(struct avro_fixed_datum_t));
@@ -258,16 +260,35 @@
        }
        datum->name = strdup(name);
        datum->size = size;
-       datum->bytes = malloc(size);
-       if (datum->bytes) {
-               free(datum);
-               return NULL;
-       }
-       memcpy(datum->bytes, bytes, size);
+       datum->bytes = (char *)bytes;
+       datum->free = fixed_free;
+
        avro_datum_init(&datum->obj, AVRO_FIXED);
        return &datum->obj;
 }
 
+avro_datum_t avro_fixed(const char *name, const char *bytes, const int64_t 
size)
+{
+       char *bytes_copy = malloc(size);
+       if (!bytes_copy) {
+               return NULL;
+       }
+       memcpy(bytes_copy, bytes, size);
+       return avro_fixed_private(name, bytes, size, free);
+}
+
+avro_datum_t avro_wrapfixed(const char *name, const char *bytes,
+                           const int64_t size)
+{
+       return avro_fixed_private(name, bytes, size, NULL);
+}
+
+avro_datum_t avro_givefixed(const char *name, const char *bytes,
+                           const int64_t size)
+{
+       return avro_fixed_private(name, bytes, size, free);
+}
+
 avro_datum_t avro_map(void)
 {
        struct avro_map_datum_t *datum =
@@ -430,7 +451,9 @@
                                struct avro_fixed_datum_t *fixed;
                                fixed = avro_datum_to_fixed(datum);
                                free((void *)fixed->name);
-                               free((void *)fixed->bytes);
+                               if (fixed->free) {
+                                       fixed->free((void *)fixed->bytes);
+                               }
                                free(fixed);
                        }
                        break;

Modified: hadoop/avro/trunk/lang/c/src/datum.h
URL: 
http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/src/datum.h?rev=902297&r1=902296&r2=902297&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/src/datum.h (original)
+++ hadoop/avro/trunk/lang/c/src/datum.h Fri Jan 22 22:38:09 2010
@@ -65,6 +65,7 @@
        char *name;
        char *bytes;
        int64_t size;
+       void (*free) (void *ptr);
 };
 
 struct avro_map_datum_t {

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=902297&r1=902296&r2=902297&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/src/datum_equal.c (original)
+++ hadoop/avro/trunk/lang/c/src/datum_equal.c Fri Jan 22 22:38:09 2010
@@ -89,6 +89,12 @@
            && strcmp(a->symbol, b->symbol) == 0;
 }
 
+static int fixed_equal(struct avro_fixed_datum_t *a,
+                      struct avro_fixed_datum_t *b)
+{
+       return a->size == b->size && memcmp(a->bytes, b->bytes, a->size) == 0;
+}
+
 int avro_datum_equal(avro_datum_t a, avro_datum_t b)
 {
        if (!(is_avro_datum(a) && is_avro_datum(b))) {
@@ -134,6 +140,9 @@
                return enum_equal(avro_datum_to_enum(a), avro_datum_to_enum(b));
 
        case AVRO_FIXED:
+               return fixed_equal(avro_datum_to_fixed(a),
+                                  avro_datum_to_fixed(b));
+
        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=902297&r1=902296&r2=902297&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/src/datum_read.c (original)
+++ hadoop/avro/trunk/lang/c/src/datum_read.c Fri Jan 22 22:38:09 2010
@@ -93,14 +93,6 @@
 }
 
 static int
-read_fixed(avro_reader_t reader, const avro_encoding_t * enc,
-          avro_schema_t writers_schema, avro_schema_t readers_schema,
-          avro_datum_t * datum)
-{
-       return 1;
-}
-
-static int
 read_enum(avro_reader_t reader, const avro_encoding_t * enc,
          struct avro_enum_schema_t *writers_schema,
          struct avro_enum_schema_t *readers_schema, avro_datum_t * datum)
@@ -320,14 +312,18 @@
        switch (avro_typeof(writers_schema)) {
        case AVRO_NULL:
                rval = enc->read_null(reader);
-               *datum = avro_null();
+               if (!rval) {
+                       *datum = avro_null();
+               }
                break;
 
        case AVRO_BOOLEAN:
                {
                        int8_t b;
                        rval = enc->read_boolean(reader, &b);
-                       *datum = avro_boolean(b);
+                       if (!rval) {
+                               *datum = avro_boolean(b);
+                       }
                }
                break;
 
@@ -335,7 +331,9 @@
                {
                        char *s;
                        rval = enc->read_string(reader, &s);
-                       *datum = avro_givestring(s);
+                       if (!rval) {
+                               *datum = avro_givestring(s);
+                       }
                }
                break;
 
@@ -343,7 +341,9 @@
                {
                        int32_t i;
                        rval = enc->read_int(reader, &i);
-                       *datum = avro_int(i);
+                       if (!rval) {
+                               *datum = avro_int(i);
+                       }
                }
                break;
 
@@ -351,7 +351,9 @@
                {
                        int64_t l;
                        rval = enc->read_long(reader, &l);
-                       *datum = avro_long(l);
+                       if (!rval) {
+                               *datum = avro_long(l);
+                       }
                }
                break;
 
@@ -359,7 +361,9 @@
                {
                        float f;
                        rval = enc->read_float(reader, &f);
-                       *datum = avro_float(f);
+                       if (!rval) {
+                               *datum = avro_float(f);
+                       }
                }
                break;
 
@@ -367,7 +371,9 @@
                {
                        double d;
                        rval = enc->read_double(reader, &d);
-                       *datum = avro_double(d);
+                       if (!rval) {
+                               *datum = avro_double(d);
+                       }
                }
                break;
 
@@ -376,14 +382,28 @@
                        char *bytes;
                        int64_t len;
                        rval = enc->read_bytes(reader, &bytes, &len);
-                       *datum = avro_givebytes(bytes, len);
+                       if (!rval) {
+                               *datum = avro_givebytes(bytes, len);
+                       }
                }
                break;
 
-       case AVRO_FIXED:
-               rval =
-                   read_fixed(reader, enc, writers_schema, readers_schema,
-                              datum);
+       case AVRO_FIXED:{
+                       char *bytes;
+                       const char *name =
+                           avro_schema_to_fixed(writers_schema)->name;
+                       int64_t size =
+                           avro_schema_to_fixed(writers_schema)->size;
+
+                       bytes = malloc(size);
+                       if (!bytes) {
+                               return ENOMEM;
+                       }
+                       rval = avro_read(reader, bytes, size);
+                       if (!rval) {
+                               *datum = avro_givefixed(name, bytes, size);
+                       }
+               }
                break;
 
        case AVRO_ENUM:

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=902297&r1=902296&r2=902297&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/src/datum_write.c (original)
+++ hadoop/avro/trunk/lang/c/src/datum_write.c Fri Jan 22 22:38:09 2010
@@ -55,16 +55,6 @@
        return enc->write_long(writer, index);
 }
 
-static int
-write_fixed(avro_writer_t writer, const avro_encoding_t * enc,
-           avro_schema_t writer_schema, avro_datum_t datum)
-{
-       /*
-        * TODO 
-        */
-       return EINVAL;
-}
-
 struct write_map_args {
        int rval;
        avro_writer_t writer;
@@ -228,14 +218,17 @@
                    write_record(writer, enc,
                                 avro_schema_to_record(writer_schema), datum);
                break;
+
        case AVRO_ENUM:
                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);
-               break;
+               return avro_write(writer, avro_datum_to_fixed(datum)->bytes,
+                                 avro_datum_to_fixed(datum)->size);
+
        case AVRO_MAP:
                rval =
                    write_map(writer, enc, avro_schema_to_map(writer_schema),

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=902297&r1=902296&r2=902297&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 22:38:09 2010
@@ -237,9 +237,12 @@
 
 static int test_fixed(void)
 {
-       /*
-        * TODO 
-        */
+       char bytes[] = { 0xD, 0xA, 0xD, 0xA, 0xB, 0xA, 0xB, 0xA };
+       avro_schema_t schema = avro_schema_fixed("msg", sizeof(bytes));
+       avro_datum_t datum = avro_wrapfixed("msg", bytes, sizeof(bytes));
+       write_read_check(schema, NULL, datum, "fixed");
+       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=902297&r1=902296&r2=902297&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/version.sh (original)
+++ hadoop/avro/trunk/lang/c/version.sh Fri Jan 22 22:38:09 2010
@@ -18,9 +18,9 @@
 #         libavro_binary_age = 0
 #         libavro_interface_age = 0
 #
-libavro_micro_version=9
+libavro_micro_version=10
 libavro_interface_age=0
-libavro_binary_age=4
+libavro_binary_age=0
 
 # IGNORE EVERYTHING ELSE FROM HERE DOWN.........
 if test $# != 1; then


Reply via email to