Author: massie
Date: Tue Feb  9 02:06:38 2010
New Revision: 907882

URL: http://svn.apache.org/viewvc?rev=907882&view=rev
Log:
AVRO-410. Add namespace support to C implementation

Modified:
    hadoop/avro/trunk/CHANGES.txt
    hadoop/avro/trunk/lang/c/examples/quickstop.c
    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/schema.c
    hadoop/avro/trunk/lang/c/src/schema.h
    hadoop/avro/trunk/lang/c/src/schema_equal.c
    hadoop/avro/trunk/lang/c/tests/generate_interop_data.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=907882&r1=907881&r2=907882&view=diff
==============================================================================
--- hadoop/avro/trunk/CHANGES.txt (original)
+++ hadoop/avro/trunk/CHANGES.txt Tue Feb  9 02:06:38 2010
@@ -316,6 +316,8 @@
     AVRO-409. Update contact database example to use a file object 
               container for C implementation (massie)
 
+    AVRO-420. Add namespace support to C implementation (massie)
+
   OPTIMIZATIONS
 
     AVRO-172. More efficient schema processing (massie)

Modified: hadoop/avro/trunk/lang/c/examples/quickstop.c
URL: 
http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/examples/quickstop.c?rev=907882&r1=907881&r2=907882&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/examples/quickstop.c (original)
+++ hadoop/avro/trunk/lang/c/examples/quickstop.c Tue Feb  9 02:06:38 2010
@@ -49,7 +49,7 @@
 add_person(avro_file_writer_t db, const char *first, const char *last,
           const char *phone, int32_t age)
 {
-       avro_datum_t person = avro_record("Person");
+       avro_datum_t person = avro_record("Person", NULL);
 
        avro_datum_t id_datum = avro_int64(++id);
        avro_datum_t first_datum = avro_string(first);
@@ -169,7 +169,7 @@
           interested in.  This is particularly useful when you have 
           huge data sets and you'll only interest in particular fields
           e.g. your contacts First name and phone number */
-       projection_schema = avro_schema_record("Person");
+       projection_schema = avro_schema_record("Person", NULL);
        first_name_schema = avro_schema_string();
        phone_schema = avro_schema_string();
        avro_schema_record_field_append(projection_schema, "First",

Modified: hadoop/avro/trunk/lang/c/src/avro.h
URL: 
http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/src/avro.h?rev=907882&r1=907881&r2=907882&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/src/avro.h (original)
+++ hadoop/avro/trunk/lang/c/src/avro.h Tue Feb  9 02:06:38 2010
@@ -107,7 +107,7 @@
 avro_schema_t avro_schema_boolean(void);
 avro_schema_t avro_schema_null(void);
 
-avro_schema_t avro_schema_record(const char *name);
+avro_schema_t avro_schema_record(const char *name, const char *space);
 avro_schema_t avro_schema_record_field_get(const avro_schema_t
                                           record, const char *field_name);
 int avro_schema_record_field_append(const avro_schema_t record,
@@ -180,7 +180,7 @@
 avro_datum_t avro_double(double d);
 avro_datum_t avro_boolean(int8_t i);
 avro_datum_t avro_null(void);
-avro_datum_t avro_record(const char *name);
+avro_datum_t avro_record(const char *name, const char *space);
 avro_datum_t avro_enum(const char *name, const char *symbol);
 avro_datum_t avro_fixed(const char *name, const char *bytes,
                        const int64_t size);

Modified: hadoop/avro/trunk/lang/c/src/datum.c
URL: 
http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/src/datum.c?rev=907882&r1=907881&r2=907882&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/src/datum.c (original)
+++ hadoop/avro/trunk/lang/c/src/datum.c Tue Feb  9 02:06:38 2010
@@ -380,7 +380,7 @@
        return &obj;
 }
 
-avro_datum_t avro_record(const char *name)
+avro_datum_t avro_record(const char *name, const char *space)
 {
        struct avro_record_datum_t *datum =
            malloc(sizeof(struct avro_record_datum_t));
@@ -392,10 +392,17 @@
                free(datum);
                return NULL;
        }
+       datum->space = space ? strdup(space) : NULL;
+       if (space && !datum->space) {
+               free((void *)datum->name);
+               free((void *)datum);
+               return NULL;
+       }
        datum->fields = st_init_strtable_with_size(DEFAULT_TABLE_SIZE);
        if (!datum->fields) {
-               free(datum->name);
-               free(datum);
+               free((void *)datum->space);
+               free((void *)datum->name);
+               free((void *)datum);
                return NULL;
        }
 
@@ -730,6 +737,9 @@
                                struct avro_record_datum_t *record;
                                record = avro_datum_to_record(datum);
                                free((void *)record->name);
+                               if (record->space) {
+                                       free((void *)record->space);
+                               }
                                st_foreach(record->fields,
                                           char_datum_free_foreach, 0);
                                st_free_table(record->fields);

Modified: hadoop/avro/trunk/lang/c/src/datum.h
URL: 
http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/src/datum.h?rev=907882&r1=907881&r2=907882&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/src/datum.h (original)
+++ hadoop/avro/trunk/lang/c/src/datum.h Tue Feb  9 02:06:38 2010
@@ -75,6 +75,7 @@
 struct avro_record_datum_t {
        struct avro_obj_t obj;
        const char *name;
+       const char *space;
        st_table *fields;
 };
 

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=907882&r1=907881&r2=907882&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/src/datum_equal.c (original)
+++ hadoop/avro/trunk/lang/c/src/datum_equal.c Tue Feb  9 02:06:38 2010
@@ -77,6 +77,20 @@
                        struct avro_record_datum_t *b)
 {
        struct st_equal_args args = { 1, b->fields };
+       if (strcmp(a->name, b->name)) {
+               /* This have different names */
+               return 0;
+       }
+       if (a->space && b->space) {
+               /* They have different namespaces */
+               if (strcmp(a->space, b->space)) {
+                       return 0;
+               }
+       } else if (a->space || b->space) {
+               /* One has a namespace, one doesn't */
+               return 0;
+       }
+
        if (a->fields->num_entries != b->fields->num_entries) {
                return 0;
        }

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=907882&r1=907881&r2=907882&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/src/datum_read.c (original)
+++ hadoop/avro/trunk/lang/c/src/datum_read.c Tue Feb  9 02:06:38 2010
@@ -258,7 +258,8 @@
        avro_datum_t record;
        avro_datum_t field_datum;
 
-       record = *datum = avro_record(writers_schema->name);
+       record = *datum =
+           avro_record(writers_schema->name, writers_schema->space);
        for (i = 0; i < writers_schema->fields->num_entries; i++) {
                union {
                        st_data_t data;

Modified: hadoop/avro/trunk/lang/c/src/schema.c
URL: 
http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/src/schema.c?rev=907882&r1=907881&r2=907882&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/src/schema.c (original)
+++ hadoop/avro/trunk/lang/c/src/schema.c Tue Feb  9 02:06:38 2010
@@ -100,6 +100,9 @@
                                struct avro_record_schema_t *record;
                                record = avro_schema_to_record(schema);
                                free(record->name);
+                               if (record->space) {
+                                       free(record->space);
+                               }
                                st_foreach(record->fields, record_free_foreach,
                                           0);
                                st_free_table(record->fields_byname);
@@ -412,7 +415,7 @@
        return 0;
 }
 
-avro_schema_t avro_schema_record(const char *name)
+avro_schema_t avro_schema_record(const char *name, const char *space)
 {
        struct avro_record_schema_t *record;
        if (!is_avro_id(name)) {
@@ -427,8 +430,17 @@
                free(record);
                return NULL;
        }
+       record->space = space ? strdup(space) : NULL;
+       if (space && !record->space) {
+               free(record->name);
+               free(record);
+               return NULL;
+       }
        record->fields = st_init_numtable_with_size(DEFAULT_TABLE_SIZE);
        if (!record->fields) {
+               if (record->space) {
+                       free(record->space);
+               }
                free(record->name);
                free(record);
                return NULL;
@@ -593,9 +605,12 @@
        case AVRO_RECORD:
                {
                        json_t *json_name = json_object_get(json, "name");
+                       json_t *json_namespace =
+                           json_object_get(json, "namespace");
                        json_t *json_fields = json_object_get(json, "fields");
                        unsigned int num_fields;
                        const char *record_name;
+                       const char *record_namespace;
 
                        if (!json_is_string(json_name)) {
                                return EINVAL;
@@ -611,7 +626,14 @@
                        if (!record_name) {
                                return EINVAL;
                        }
-                       *schema = avro_schema_record(record_name);
+                       if (json_is_string(json_namespace)) {
+                               record_namespace =
+                                   json_string_value(json_namespace);
+                       } else {
+                               record_namespace = NULL;
+                       }
+                       *schema =
+                           avro_schema_record(record_name, record_namespace);
                        if (save_named_schemas(record_name, *schema, error)) {
                                return ENOMEM;
                        }
@@ -872,7 +894,9 @@
                {
                        struct avro_record_schema_t *record_schema =
                            avro_schema_to_record(schema);
-                       new_schema = avro_schema_record(record_schema->name);
+                       new_schema =
+                           avro_schema_record(record_schema->name,
+                                              record_schema->space);
                        for (i = 0; i < record_schema->fields->num_entries; 
i++) {
                                union {
                                        st_data_t data;
@@ -1019,7 +1043,13 @@
 
        check(rval, avro_write_str(out, "{\"type\":\"record\",\"name\":\""));
        check(rval, avro_write_str(out, record->name));
-       check(rval, avro_write_str(out, "\",\"fields\":["));
+       check(rval, avro_write_str(out, "\","));
+       if (record->space) {
+               check(rval, avro_write_str(out, "\"namespace\":\""));
+               check(rval, avro_write_str(out, record->space));
+               check(rval, avro_write_str(out, "\","));
+       }
+       check(rval, avro_write_str(out, "\"fields\":["));
        for (i = 0; i < record->fields->num_entries; i++) {
                union {
                        st_data_t data;

Modified: hadoop/avro/trunk/lang/c/src/schema.h
URL: 
http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/src/schema.h?rev=907882&r1=907881&r2=907882&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/src/schema.h (original)
+++ hadoop/avro/trunk/lang/c/src/schema.h Tue Feb  9 02:06:38 2010
@@ -32,6 +32,7 @@
 struct avro_record_schema_t {
        struct avro_obj_t obj;
        char *name;
+       char *space;
        st_table *fields;
        st_table *fields_byname;
 };

Modified: hadoop/avro/trunk/lang/c/src/schema_equal.c
URL: 
http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/src/schema_equal.c?rev=907882&r1=907881&r2=907882&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/src/schema_equal.c (original)
+++ hadoop/avro/trunk/lang/c/src/schema_equal.c Tue Feb  9 02:06:38 2010
@@ -29,6 +29,15 @@
                 */
                return 0;
        }
+       if (a->space && b->space) {
+               /* They have different namespaces */
+               if (strcmp(a->space, b->space)) {
+                       return 0;
+               }
+       } else if (a->space || b->space) {
+               /* One has a namespace, one doesn't */
+               return 0;
+       }
        for (i = 0; i < a->fields->num_entries; i++) {
                union {
                        st_data_t data;

Modified: hadoop/avro/trunk/lang/c/tests/generate_interop_data.c
URL: 
http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/tests/generate_interop_data.c?rev=907882&r1=907881&r2=907882&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/tests/generate_interop_data.c (original)
+++ hadoop/avro/trunk/lang/c/tests/generate_interop_data.c Tue Feb  9 02:06:38 
2010
@@ -34,7 +34,7 @@
        check(rval, avro_file_writer_create(outpath, schema, &file_writer));
 
        /* TODO: create a method for generating random data from schema */
-       interop = avro_record("interop");
+       interop = avro_record("interop", "org.apache.avro");
        avro_record_set(interop, "intField", avro_int32(42));
        avro_record_set(interop, "longField", avro_int64(4242));
        avro_record_set(interop, "stringField",
@@ -57,7 +57,7 @@
        avro_record_set(interop, "fixedField",
                        avro_fixed("MD5", "1234567890123456", 16));
 
-       node_datum = avro_record("Node");
+       node_datum = avro_record("Node", NULL);
        avro_record_set(node_datum, "label",
                        avro_wrapstring("If you label me, you negate me."));
        avro_record_set(node_datum, "children", avro_array());

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=907882&r1=907881&r2=907882&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/tests/test_avro_data.c (original)
+++ hadoop/avro/trunk/lang/c/tests/test_avro_data.c Tue Feb  9 02:06:38 2010
@@ -180,8 +180,8 @@
 
 static int test_record(void)
 {
-       avro_schema_t schema = avro_schema_record("person");
-       avro_datum_t datum = avro_record("person");
+       avro_schema_t schema = avro_schema_record("person", NULL);
+       avro_datum_t datum = avro_record("person", NULL);
        avro_datum_t name_datum, age_datum;
 
        avro_schema_record_field_append(schema, "name", avro_schema_string());

Modified: hadoop/avro/trunk/lang/c/version.sh
URL: 
http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/version.sh?rev=907882&r1=907881&r2=907882&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/version.sh (original)
+++ hadoop/avro/trunk/lang/c/version.sh Tue Feb  9 02:06:38 2010
@@ -18,9 +18,9 @@
 #         libavro_binary_age = 0
 #         libavro_interface_age = 0
 #
-libavro_micro_version=16
+libavro_micro_version=17
 libavro_interface_age=0
-libavro_binary_age=1
+libavro_binary_age=0
 
 # IGNORE EVERYTHING ELSE FROM HERE DOWN.........
 if test $# != 1; then


Reply via email to