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