2 use strict; use warnings;
3 use lib '../../../Open-ILS/src/perlmods/';
4 use lib '../perlmods/';
5 use OpenILS::Utils::Fieldmapper;
9 print "usage: $0 <header_file> <source_file>\n";
13 warn "Generating fieldmapper-c code...\n";
16 print $ARGV[0] . "\n";
17 print $ARGV[1] . "\n";
19 open(HEADER, ">$ARGV[0]");
20 open(SOURCE, ">$ARGV[1]");
23 warn "Generating fieldmapper-c code...\n";
25 my $map = $Fieldmapper::fieldmap;
31 char* json_string_to_xml(char*);
40 /* and the JSON parser, so we can read the response we're XMLizing */
42 #include "objson/object.h"
43 #include "objson/json_parser.h"
44 #include "opensrf/utils.h"
46 char* json_string_to_xml(char*);
47 void _rest_xml_output(growing_buffer*, object*, char*, int);
48 char * _lookup_fm_field(char*,int);
50 char* json_string_to_xml(char* content) {
52 growing_buffer * res_xml;
56 obj = json_parse_string( content );
57 res_xml = buffer_init(1024);
62 buffer_add(res_xml, "<response>");
64 for( i = 0; i!= obj->size; i++ ) {
65 _rest_xml_output(res_xml, obj->get_index(obj,i), NULL, 0);
68 buffer_add(res_xml, "</response>");
70 output = buffer_data(res_xml);
76 void _rest_xml_output(growing_buffer* buf, object* obj, char * fm_class, int fm_index) {
82 tag = _lookup_fm_field(fm_class,fm_index);
84 tag = strdup("datum");
87 /* add class hints if we have a class name */
90 buffer_fadd(buf,"<%s><Object class_hint=\\\"%s\\\"/></%s>", tag, obj->classname, tag);
93 buffer_fadd(buf,"<%s><Object class_hint=\\\"%s\\\">", tag, obj->classname);
97 /* now add the data */
99 buffer_fadd(buf, "<%s/>",tag);
101 else if(obj->is_bool && obj->bool_value) {
103 buffer_add(buf, "true");
105 buffer_fadd(buf, "<%s>true</%s>",tag,tag);
107 } else if(obj->is_bool && ! obj->bool_value) {
109 buffer_add(buf, "false");
111 buffer_fadd(buf, "<%s>false</%s>",tag,tag);
113 } else if (obj->is_string) {
115 buffer_add(buf,obj->string_data);
117 buffer_fadd(buf,"<%s>%s</%s>",tag,obj->string_data,tag);
119 } else if(obj->is_number) {
121 buffer_fadd(buf,"%ld",obj->num_value);
123 buffer_fadd(buf,"<%s>%ld</%s>",tag,obj->num_value,tag);
125 } else if(obj->is_double) {
127 buffer_fadd(buf,"%lf",tag,obj->double_value,tag);
129 buffer_fadd(buf,"<%s>%lf</%s>",tag,obj->double_value,tag);
132 } else if (obj->is_array) {
133 if(!obj->classname) {
135 buffer_add(buf,"<array>");
137 buffer_fadd(buf,"<%s>",tag);
140 for( i = 0; i!= obj->size; i++ ) {
141 _rest_xml_output(buf, obj->get_index(obj,i), obj->classname, i);
144 if(!obj->classname) {
146 buffer_add(buf,"</array>");
148 buffer_fadd(buf,"</%s>",tag);
151 } else if (obj->is_hash) {
153 if(!obj->classname) {
155 buffer_add(buf,"<hash>");
157 buffer_fadd(buf,"<%s>",tag);
160 object_iterator* itr = new_iterator(obj);
162 while( (tmp = itr->next(itr)) ) {
163 if (obj->classname) {
164 buffer_fadd(buf,"<%s>",tmp->key);
166 buffer_add(buf,"<pair>");
167 buffer_fadd(buf,"<key>%s</key><value>",tmp->key);
170 _rest_xml_output(buf, tmp->item, NULL,0);
172 if (obj->classname) {
173 buffer_fadd(buf,"</%s>",tmp->key);
175 buffer_add(buf,"</value></pair>");
179 if(!obj->classname) {
181 buffer_add(buf,"</hash>");
183 buffer_fadd(buf,"</%s>",tag);
189 buffer_fadd(buf,"</Object></%s>",tag);
192 char * _lookup_fm_field(char * class, int pos) {
196 print SOURCE " if (class == NULL) return NULL;";
198 for my $object (keys %$map) {
200 my $short_name = $map->{$object}->{hint};
204 else if (!strcmp(class, "$short_name")) {
208 for my $field (keys %{$map->{$object}->{fields}}) {
209 my $position = $map->{$object}->{fields}->{$field}->{position};
213 return strdup("$field");
220 print SOURCE ' return strdup("datum");'."\n";