2 use strict; use warnings;
3 use lib '../../../Open-ILS/src/perlmods/';
4 use OpenILS::Utils::Fieldmapper;
8 print "usage: $0 <header_file> <source_file>\n";
12 warn "Generating fieldmapper-c code...\n";
15 print $ARGV[0] . "\n";
16 print $ARGV[1] . "\n";
18 open(HEADER, ">$ARGV[0]");
19 open(SOURCE, ">$ARGV[1]");
22 warn "Generating fieldmapper-c code...\n";
24 my $map = $Fieldmapper::fieldmap;
30 char* json_string_to_xml(char*);
39 /* and the JSON parser, so we can read the response we're XMLizing */
41 #include "objson/object.h"
42 #include "objson/json_parser.h"
43 #include "opensrf/utils.h"
45 char* json_string_to_xml(char*);
46 void _rest_xml_output(growing_buffer*, object*, char*, int);
47 char * _lookup_fm_field(char*,int);
49 char* json_string_to_xml(char* content) {
51 growing_buffer * res_xml;
55 obj = json_parse_string( content );
56 res_xml = buffer_init(1024);
61 buffer_add(res_xml, "<response>");
63 for( i = 0; i!= obj->size; i++ ) {
64 _rest_xml_output(res_xml, obj->get_index(obj,i), NULL, 0);
67 buffer_add(res_xml, "</response>");
69 output = buffer_data(res_xml);
75 void _rest_xml_output(growing_buffer* buf, object* obj, char * fm_class, int fm_index) {
81 tag = _lookup_fm_field(fm_class,fm_index);
83 tag = strdup("datum");
86 /* add class hints if we have a class name */
88 buffer_fadd(buf,"<Fieldmapper hint=\\\"%s\\\">", obj->classname);
90 /* now add the data */
92 buffer_fadd(buf, "<%s/>",tag);
94 else if(obj->is_bool && obj->bool_value)
95 buffer_fadd(buf, "<%s>true</%s>",tag,tag);
97 else if(obj->is_bool && ! obj->bool_value)
98 buffer_fadd(buf, "<%s>false</%s>",tag,tag);
100 else if (obj->is_string)
101 buffer_fadd(buf,"<%s>%s</%s>",tag,obj->string_data,tag);
103 else if(obj->is_number)
104 buffer_fadd(buf,"<%s>%ld</%s>",tag,obj->num_value,tag);
106 else if(obj->is_double)
107 buffer_fadd(buf,"<%s>%lf</%s>",tag,obj->double_value,tag);
110 else if (obj->is_array) {
112 buffer_add(buf,"<array>");
113 for( i = 0; i!= obj->size; i++ ) {
114 _rest_xml_output(buf, obj->get_index(obj,i), obj->classname, i);
117 buffer_add(buf,"</array>");
118 } else if (obj->is_hash) {
119 buffer_add(buf,"<hash>");
120 object_iterator* itr = new_iterator(obj);
122 while( (tmp = itr->next(itr)) ) {
123 buffer_add(buf,"<pair>");
124 buffer_fadd(buf,"<key>%s</key>",tmp->key);
125 _rest_xml_output(buf, tmp->item, NULL,0);
126 buffer_add(buf,"</pair>");
129 buffer_add(buf,"</hash>");
134 buffer_add(buf,"</Fieldmapper>");
137 char * _lookup_fm_field(char * class, int pos) {
141 print SOURCE " if (class == NULL) return NULL;";
143 for my $object (keys %$map) {
145 my $short_name = $map->{$object}->{hint};
149 else if (!strcmp(class, "$short_name")) {
153 for my $field (keys %{$map->{$object}->{fields}}) {
154 my $position = $map->{$object}->{fields}->{$field}->{position};
158 return strdup("$field");
165 print SOURCE ' return strdup("datum");'."\n";