Return-Path: Delivered-To: apmail-hadoop-avro-commits-archive@minotaur.apache.org Received: (qmail 3057 invoked from network); 4 Feb 2010 21:41:26 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 4 Feb 2010 21:41:26 -0000 Received: (qmail 85044 invoked by uid 500); 4 Feb 2010 21:41:24 -0000 Delivered-To: apmail-hadoop-avro-commits-archive@hadoop.apache.org Received: (qmail 85006 invoked by uid 500); 4 Feb 2010 21:41:24 -0000 Mailing-List: contact avro-commits-help@hadoop.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: avro-dev@hadoop.apache.org Delivered-To: mailing list avro-commits@hadoop.apache.org Received: (qmail 84803 invoked by uid 99); 4 Feb 2010 21:41:24 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 04 Feb 2010 21:41:24 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 04 Feb 2010 21:41:23 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 02E6A23889B9; Thu, 4 Feb 2010 21:41:03 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r906668 - in /hadoop/avro/trunk: ./ lang/c/src/ lang/c/tests/ Date: Thu, 04 Feb 2010 21:41:02 -0000 To: avro-commits@hadoop.apache.org From: massie@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20100204214103.02E6A23889B9@eris.apache.org> Author: massie Date: Thu Feb 4 21:41:02 2010 New Revision: 906668 URL: http://svn.apache.org/viewvc?rev=906668&view=rev Log: AVRO-402. Add method for writing avro_schema_t structure to an avro_writer_t Added: hadoop/avro/trunk/lang/c/src/avro_private.h Removed: hadoop/avro/trunk/lang/c/src/container_of.h hadoop/avro/trunk/lang/c/src/schema_printf.c Modified: hadoop/avro/trunk/CHANGES.txt hadoop/avro/trunk/lang/c/src/Makefile.am hadoop/avro/trunk/lang/c/src/avro.h hadoop/avro/trunk/lang/c/src/datum.h hadoop/avro/trunk/lang/c/src/io.c hadoop/avro/trunk/lang/c/src/schema.c hadoop/avro/trunk/lang/c/src/schema.h hadoop/avro/trunk/lang/c/tests/test_avro_schema.c Modified: hadoop/avro/trunk/CHANGES.txt URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/CHANGES.txt?rev=906668&r1=906667&r2=906668&view=diff ============================================================================== --- hadoop/avro/trunk/CHANGES.txt (original) +++ hadoop/avro/trunk/CHANGES.txt Thu Feb 4 21:41:02 2010 @@ -304,6 +304,9 @@ AVRO-321. Restore Java RPC interop tests. (cutting) + AVRO-402. Add method for writing avro_schema_t structure to an + avro_writer_t (massie) + OPTIMIZATIONS AVRO-172. More efficient schema processing (massie) Modified: hadoop/avro/trunk/lang/c/src/Makefile.am URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/src/Makefile.am?rev=906668&r1=906667&r2=906668&view=diff ============================================================================== --- hadoop/avro/trunk/lang/c/src/Makefile.am (original) +++ hadoop/avro/trunk/lang/c/src/Makefile.am Thu Feb 4 21:41:02 2010 @@ -6,7 +6,7 @@ include_HEADERS = avro.h lib_LTLIBRARIES = libavro.la -libavro_la_SOURCES = st.c st.h schema.c schema.h schema_printf.c schema_equal.c \ +libavro_la_SOURCES = st.c st.h schema.c schema.h schema_equal.c \ datum.c datum_equal.c datum_validate.c datum_read.c datum_skip.c datum_write.c datum.h \ io.c dump.c dump.h encoding_binary.c \ container_of.h encoding.h Modified: hadoop/avro/trunk/lang/c/src/avro.h URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/src/avro.h?rev=906668&r1=906667&r2=906668&view=diff ============================================================================== --- hadoop/avro/trunk/lang/c/src/avro.h (original) +++ hadoop/avro/trunk/lang/c/src/avro.h Thu Feb 4 21:41:02 2010 @@ -90,6 +90,9 @@ #define is_avro_complex_type(obj) (!(is_avro_primitive(obj)) #define is_avro_link(obj) (obj && avro_typeof(obj) == AVRO_LINK) +typedef struct avro_reader_t *avro_reader_t; +typedef struct avro_writer_t *avro_writer_t; + /* * schema */ @@ -129,6 +132,7 @@ int avro_schema_from_json(const char *jsontext, const int32_t len, avro_schema_t * schema, avro_schema_error_t * error); +int avro_schema_to_json(avro_schema_t schema, avro_writer_t out); int avro_schema_to_specific(avro_schema_t schema, const char *prefix); @@ -139,14 +143,9 @@ avro_schema_t avro_schema_incref(avro_schema_t schema); void avro_schema_decref(avro_schema_t schema); -void avro_schema_printf(avro_schema_t schema, FILE * fp); - /* * io */ -typedef struct avro_reader_t *avro_reader_t; -typedef struct avro_writer_t *avro_writer_t; - avro_reader_t avro_reader_file(FILE * fp); avro_writer_t avro_writer_file(FILE * fp); avro_reader_t avro_reader_memory(const char *buf, int64_t len); Added: hadoop/avro/trunk/lang/c/src/avro_private.h URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/src/avro_private.h?rev=906668&view=auto ============================================================================== --- hadoop/avro/trunk/lang/c/src/avro_private.h (added) +++ hadoop/avro/trunk/lang/c/src/avro_private.h Thu Feb 4 21:41:02 2010 @@ -0,0 +1,27 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to you under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing + * permissions and limitations under the License. + */ +#ifndef AVRO_PRIVATE_H +#define AVRO_PRIVATE_H + +#define sys_call(rval, call) do { rval = call; } while(rval < 0 && errno == EINTR) + +#define check(rval, call) { rval = call; if(rval) return rval; } + +#define container_of(ptr_, type_, member_) \ + ((type_ *)((char *)ptr_ - (size_t)&((type_ *)0)->member_)) + +#endif Modified: hadoop/avro/trunk/lang/c/src/datum.h URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/src/datum.h?rev=906668&r1=906667&r2=906668&view=diff ============================================================================== --- hadoop/avro/trunk/lang/c/src/datum.h (original) +++ hadoop/avro/trunk/lang/c/src/datum.h Thu Feb 4 21:41:02 2010 @@ -18,7 +18,7 @@ #ifndef AVRO_DATUM_H #define AVRO_DATUM_H #include "avro.h" /* for avro_schema_t */ -#include "container_of.h" +#include "avro_private.h" #include "st.h" struct avro_string_datum_t { Modified: hadoop/avro/trunk/lang/c/src/io.c URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/src/io.c?rev=906668&r1=906667&r2=906668&view=diff ============================================================================== --- hadoop/avro/trunk/lang/c/src/io.c (original) +++ hadoop/avro/trunk/lang/c/src/io.c Thu Feb 4 21:41:02 2010 @@ -20,7 +20,7 @@ #include #include #include "avro.h" -#include "container_of.h" +#include "avro_private.h" #include "dump.h" enum avro_io_type_t { Modified: hadoop/avro/trunk/lang/c/src/schema.c URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/src/schema.c?rev=906668&r1=906667&r2=906668&view=diff ============================================================================== --- hadoop/avro/trunk/lang/c/src/schema.c (original) +++ hadoop/avro/trunk/lang/c/src/schema.c Thu Feb 4 21:41:02 2010 @@ -983,3 +983,187 @@ } return new_schema; } + +const char *avro_schema_name(const avro_schema_t schema) +{ + if (is_avro_record(schema)) { + return (avro_schema_to_record(schema))->name; + } else if (is_avro_enum(schema)) { + return (avro_schema_to_enum(schema))->name; + } else if (is_avro_fixed(schema)) { + return (avro_schema_to_fixed(schema))->name; + } + return NULL; +} + +/* simple helper for writing strings */ +static int avro_write_str(avro_writer_t out, const char *str) +{ + return avro_write(out, (char *)str, strlen(str)); +} + +static int write_field(avro_writer_t out, struct avro_record_field_t *field) +{ + int rval; + check(rval, avro_write_str(out, "{\"name\":\"")); + check(rval, avro_write_str(out, field->name)); + check(rval, avro_write_str(out, "\",\"type\":")); + check(rval, avro_schema_to_json(field->type, out)); + return avro_write_str(out, "}"); +} + +static int write_record(avro_writer_t out, struct avro_record_schema_t *record) +{ + int rval; + long i; + + check(rval, avro_write_str(out, "{\"type\":\"record\",\"name\":\"")); + check(rval, avro_write_str(out, record->name)); + check(rval, avro_write_str(out, "\",\"fields\":[")); + for (i = 0; i < record->fields->num_entries; i++) { + union { + st_data_t data; + struct avro_record_field_t *field; + } val; + st_lookup(record->fields, i, &val.data); + if (i) { + check(rval, avro_write_str(out, ",")); + } + check(rval, write_field(out, val.field)); + } + return avro_write_str(out, "]}"); +} + +static int write_enum(avro_writer_t out, struct avro_enum_schema_t *enump) +{ + int rval; + long i; + check(rval, avro_write_str(out, "{\"type\":\"enum\",\"name\":\"")); + check(rval, avro_write_str(out, enump->name)); + check(rval, avro_write_str(out, "\",\"symbols\":[")); + + for (i = 0; i < enump->symbols->num_entries; i++) { + union { + st_data_t data; + char *sym; + } val; + st_lookup(enump->symbols, i, &val.data); + if (i) { + check(rval, avro_write_str(out, ",")); + } + check(rval, avro_write_str(out, "\"")); + check(rval, avro_write_str(out, val.sym)); + check(rval, avro_write_str(out, "\"")); + } + return avro_write_str(out, "]}"); +} +static int write_fixed(avro_writer_t out, struct avro_fixed_schema_t *fixed) +{ + int rval; + char size[16]; + check(rval, avro_write_str(out, "{\"type\":\"fixed\",\"name\":\"")); + check(rval, avro_write_str(out, fixed->name)); + check(rval, avro_write_str(out, "\",\"size\":")); + snprintf(size, sizeof(size), "%lld", fixed->size); + check(rval, avro_write_str(out, size)); + return avro_write_str(out, "}"); +} +static int write_map(avro_writer_t out, struct avro_map_schema_t *map) +{ + int rval; + check(rval, avro_write_str(out, "{\"type\":\"map\",\"values\":")); + check(rval, avro_schema_to_json(map->values, out)); + return avro_write_str(out, "}"); +} +static int write_array(avro_writer_t out, struct avro_array_schema_t *array) +{ + int rval; + check(rval, avro_write_str(out, "{\"type\":\"array\",\"items\":")); + check(rval, avro_schema_to_json(array->items, out)); + return avro_write_str(out, "}"); +} +static int write_union(avro_writer_t out, struct avro_union_schema_t *unionp) +{ + int rval; + long i; + check(rval, avro_write_str(out, "[")); + + for (i = 0; i < unionp->branches->num_entries; i++) { + union { + st_data_t data; + avro_schema_t schema; + } val; + st_lookup(unionp->branches, i, &val.data); + if (i) { + check(rval, avro_write_str(out, ",")); + } + check(rval, avro_schema_to_json(val.schema, out)); + } + return avro_write_str(out, "]"); +} +static int write_link(avro_writer_t out, struct avro_link_schema_t *link) +{ + int rval; + check(rval, avro_write_str(out, "\"")); + check(rval, avro_write_str(out, avro_schema_name(link->to))); + return avro_write_str(out, "\""); +} + +int avro_schema_to_json(avro_schema_t schema, avro_writer_t out) +{ + int rval; + + if (!is_avro_schema(schema) || !out) { + return EINVAL; + } + + if (is_avro_primitive(schema)) { + check(rval, avro_write_str(out, "{\"type\":\"")); + } + + switch (avro_typeof(schema)) { + case AVRO_STRING: + check(rval, avro_write_str(out, "string")); + break; + case AVRO_BYTES: + check(rval, avro_write_str(out, "bytes")); + break; + case AVRO_INT32: + check(rval, avro_write_str(out, "int")); + break; + case AVRO_INT64: + check(rval, avro_write_str(out, "long")); + break; + case AVRO_FLOAT: + check(rval, avro_write_str(out, "float")); + break; + case AVRO_DOUBLE: + check(rval, avro_write_str(out, "double")); + break; + case AVRO_BOOLEAN: + check(rval, avro_write_str(out, "boolean")); + break; + case AVRO_NULL: + check(rval, avro_write_str(out, "null")); + break; + case AVRO_RECORD: + return write_record(out, avro_schema_to_record(schema)); + case AVRO_ENUM: + return write_enum(out, avro_schema_to_enum(schema)); + case AVRO_FIXED: + return write_fixed(out, avro_schema_to_fixed(schema)); + case AVRO_MAP: + return write_map(out, avro_schema_to_map(schema)); + case AVRO_ARRAY: + return write_array(out, avro_schema_to_array(schema)); + case AVRO_UNION: + return write_union(out, avro_schema_to_union(schema)); + case AVRO_LINK: + return write_link(out, avro_schema_to_link(schema)); + } + + if (is_avro_primitive(schema)) { + return avro_write_str(out, "\"}"); + } + return EINVAL; +} Modified: hadoop/avro/trunk/lang/c/src/schema.h URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/src/schema.h?rev=906668&r1=906667&r2=906668&view=diff ============================================================================== --- hadoop/avro/trunk/lang/c/src/schema.h (original) +++ hadoop/avro/trunk/lang/c/src/schema.h Thu Feb 4 21:41:02 2010 @@ -18,7 +18,7 @@ #define AVRO_SCHEMA_H #include "avro.h" -#include "container_of.h" +#include "avro_private.h" #include "st.h" struct avro_record_field_t { Modified: hadoop/avro/trunk/lang/c/tests/test_avro_schema.c URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/tests/test_avro_schema.c?rev=906668&r1=906667&r2=906668&view=diff ============================================================================== --- hadoop/avro/trunk/lang/c/tests/test_avro_schema.c (original) +++ hadoop/avro/trunk/lang/c/tests/test_avro_schema.c Thu Feb 4 21:41:02 2010 @@ -22,6 +22,7 @@ #include "avro.h" int test_cases = 0; +avro_writer_t avro_stderr; static void run_tests(char *dirpath, int should_pass) { @@ -63,7 +64,9 @@ avro_schema_t schema_copy = avro_schema_copy(schema); fprintf(stderr, "pass\n"); - avro_schema_printf(schema, stderr); + avro_schema_to_json(schema, + avro_stderr); + fprintf(stderr, "\n"); if (!avro_schema_equal (schema, schema_copy)) { fprintf(stderr, @@ -103,6 +106,8 @@ srcdir = "."; } + avro_stderr = avro_writer_file(stderr); + /* * Run the tests that should pass */ @@ -119,5 +124,6 @@ test_cases); fprintf(stderr, "==================================================\n"); + avro_writer_free(avro_stderr); return EXIT_SUCCESS; }