]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/c-apps/oils_idl-core.c
initial test of in-xml views for reporting
[Evergreen.git] / Open-ILS / src / c-apps / oils_idl-core.c
1 #include "oils_idl.h"
2
3 #include <stdlib.h>
4 #include <string.h>
5 #include <libxml/globals.h>
6 #include <libxml/xmlerror.h>
7 #include <libxml/parser.h>
8 #include <libxml/tree.h>
9 #include <libxml/debugXML.h>
10 #include <libxml/xmlmemory.h>
11
12 #define PERSIST_NS "http://open-ils.org/spec/opensrf/IDL/persistence/v1"
13 #define OBJECT_NS "http://open-ils.org/spec/opensrf/IDL/objects/v1"
14 #define BASE_NS "http://opensrf.org/spec/IDL/base/v1"
15
16 xmlDocPtr idlDoc = NULL; // parse and store the IDL here
17
18 /* parse and store the IDL here */
19 osrfHash* idlHash;
20
21 osrfHash* oilsIDL() { return idlHash; }
22 osrfHash* oilsIDLInit( char* idl_filename ) {
23
24         if (idlHash) return idlHash;
25
26         char* string_tmp = NULL;
27
28         idlHash = osrfNewHash();
29         osrfHash* usrData = NULL;
30
31         osrfLogInfo(OSRF_LOG_MARK, "Parsing the IDL XML...");
32         idlDoc = xmlReadFile( idl_filename, NULL, XML_PARSE_XINCLUDE );
33         
34         if (!idlDoc) {
35                 osrfLogError(OSRF_LOG_MARK, "Could not load or parse the IDL XML file!");
36                 return NULL;
37         }
38
39         osrfLogInfo(OSRF_LOG_MARK, "Initializing the Fieldmapper IDL...");
40
41         xmlNodePtr docRoot = xmlDocGetRootElement(idlDoc);
42         xmlNodePtr kid = docRoot->children;
43         while (kid) {
44                 if (!strcmp( (char*)kid->name, "class" )) {
45
46                         usrData = osrfNewHash();
47                         osrfHashSet( usrData, xmlGetProp(kid, BAD_CAST "id"), "classname");
48                         osrfHashSet( usrData, xmlGetNsProp(kid, BAD_CAST "fieldmapper", BAD_CAST OBJECT_NS), "fieldmapper");
49                         osrfHashSet( usrData, xmlGetNsProp(kid, BAD_CAST "readonly", BAD_CAST PERSIST_NS), "readonly");
50
51                         osrfHashSet( idlHash, usrData, (char*)osrfHashGet(usrData, "classname") );
52
53                         string_tmp = NULL;
54                         if ((string_tmp = (char*)xmlGetNsProp(kid, BAD_CAST "tablename", BAD_CAST PERSIST_NS))) {
55                                 osrfHashSet(
56                                         usrData,
57                                         strdup( string_tmp ),
58                                         "tablename"
59                                 );
60                         }
61
62                         string_tmp = NULL;
63                         if ((string_tmp = (char*)xmlGetNsProp(kid, BAD_CAST "virtual", BAD_CAST PERSIST_NS))) {
64                                 osrfHashSet(
65                                         usrData,
66                                         strdup( string_tmp ),
67                                         "virtual"
68                                 );
69                         }
70
71                         osrfStringArray* controller = osrfNewStringArray(0);
72                         string_tmp = NULL;
73                         if( (string_tmp = (char*)xmlGetProp(kid, BAD_CAST "controller") )) {
74                                 char* controller_list = strdup( string_tmp );
75                                 osrfLogInfo(OSRF_LOG_MARK, "Controller list is %s", string_tmp );
76
77                                 if (strlen( controller_list ) > 0) {
78                                         char* st_tmp;
79                                         char* _controller_class = strtok_r(controller_list, " ", &st_tmp);
80                                         osrfStringArrayAdd(controller, strdup(_controller_class));
81
82                                         while ((_controller_class = strtok_r(NULL, " ", &st_tmp))) {
83                                                 osrfStringArrayAdd(controller, strdup(_controller_class));
84                                         }
85                                 }
86                         }
87                         osrfHashSet( usrData, controller, "controller");
88
89
90                         osrfHash* _tmp;
91                         osrfHash* links = osrfNewHash();
92                         osrfHash* fields = osrfNewHash();
93
94                         osrfHashSet( usrData, fields, "fields" );
95                         osrfHashSet( usrData, links, "links" );
96
97                         xmlNodePtr _cur = kid->children;
98
99                         while (_cur) {
100
101                                 if (!strcmp( (char*)_cur->name, "fields" )) {
102
103                                         string_tmp = NULL;
104                                         if( (string_tmp = (char*)xmlGetNsProp(_cur, BAD_CAST "primary", BAD_CAST PERSIST_NS)) ) {
105                                                 osrfHashSet(
106                                                         usrData,
107                                                         strdup( string_tmp ),
108                                                         "primarykey"
109                                                 );
110                                         }
111
112                                         string_tmp = NULL;
113                                         if( (string_tmp = (char*)xmlGetNsProp(_cur, BAD_CAST "sequence", BAD_CAST PERSIST_NS)) ) {
114                                                 osrfHashSet(
115                                                         usrData,
116                                                         strdup( string_tmp ),
117                                                         "sequence"
118                                                 );
119                                         }
120
121                                         xmlNodePtr _f = _cur->children;
122
123                                         while(_f) {
124                                                 if (strcmp( (char*)_f->name, "field" )) {
125                                                         _f = _f->next;
126                                                         continue;
127                                                 }
128
129                                                 _tmp = osrfNewHash();
130
131                                                 string_tmp = NULL;
132                                                 if( (string_tmp = (char*)xmlGetNsProp(_f, BAD_CAST "array_position", BAD_CAST OBJECT_NS)) ) {
133                                                         osrfHashSet(
134                                                                 _tmp,
135                                                                 strdup( string_tmp ),
136                                                                 "array_position"
137                                                         );
138                                                 }
139
140                                                 string_tmp = NULL;
141                                                 if( (string_tmp = (char*)xmlGetNsProp(_f, BAD_CAST "virtual", BAD_CAST PERSIST_NS)) ) {
142                                                         osrfHashSet(
143                                                                 _tmp,
144                                                                 strdup( string_tmp ),
145                                                                 "virtual"
146                                                         );
147                                                 }
148
149                                                 string_tmp = NULL;
150                                                 if( (string_tmp = (char*)xmlGetNsProp(_f, BAD_CAST "primitive", BAD_CAST PERSIST_NS)) ) {
151                                                         osrfHashSet(
152                                                                 _tmp,
153                                                                 strdup( string_tmp ),
154                                                                 "primitive"
155                                                         );
156                                                 }
157
158                                                 string_tmp = NULL;
159                                                 if( (string_tmp = (char*)xmlGetProp(_f, BAD_CAST "name")) ) {
160                                                         osrfHashSet(
161                                                                 _tmp,
162                                                                 strdup( string_tmp ),
163                                                                 "name"
164                                                         );
165                                                 }
166
167                                                 osrfLogInfo(OSRF_LOG_MARK, "Found field %s for class %s", string_tmp, osrfHashGet(usrData, "classname") );
168
169                                                 osrfHashSet(
170                                                         fields,
171                                                         _tmp,
172                                                         strdup( string_tmp )
173                                                 );
174                                                 _f = _f->next;
175                                         }
176                                 }
177
178                                 if (!strcmp( (char*)_cur->name, "links" )) {
179                                         xmlNodePtr _l = _cur->children;
180
181                                         while(_l) {
182                                                 if (strcmp( (char*)_l->name, "link" )) {
183                                                         _l = _l->next;
184                                                         continue;
185                                                 }
186
187                                                 _tmp = osrfNewHash();
188
189                                                 string_tmp = NULL;
190                                                 if( (string_tmp = (char*)xmlGetProp(_l, BAD_CAST "reltype")) ) {
191                                                         osrfHashSet(
192                                                                 _tmp,
193                                                                 strdup( string_tmp ),
194                                                                 "reltype"
195                                                         );
196                                                 }
197                                                 osrfLogInfo(OSRF_LOG_MARK, "Adding link with reltype %s", string_tmp );
198
199                                                 string_tmp = NULL;
200                                                 if( (string_tmp = (char*)xmlGetProp(_l, BAD_CAST "key")) ) {
201                                                         osrfHashSet(
202                                                                 _tmp,
203                                                                 strdup( string_tmp ),
204                                                                 "key"
205                                                         );
206                                                 }
207                                                 osrfLogInfo(OSRF_LOG_MARK, "Link fkey is %s", string_tmp );
208
209                                                 string_tmp = NULL;
210                                                 if( (string_tmp = (char*)xmlGetProp(_l, BAD_CAST "class")) ) {
211                                                         osrfHashSet(
212                                                                 _tmp,
213                                                                 strdup( string_tmp ),
214                                                                 "class"
215                                                         );
216                                                 }
217                                                 osrfLogInfo(OSRF_LOG_MARK, "Link fclass is %s", string_tmp );
218
219                                                 osrfStringArray* map = osrfNewStringArray(0);
220
221                                                 string_tmp = NULL;
222                                                 if( (string_tmp = (char*)xmlGetProp(_l, BAD_CAST "map") )) {
223                                                         char* map_list = strdup( string_tmp );
224                                                         osrfLogInfo(OSRF_LOG_MARK, "Link mapping list is %s", string_tmp );
225
226                                                         if (strlen( map_list ) > 0) {
227                                                                 char* st_tmp;
228                                                                 char* _map_class = strtok_r(map_list, " ", &st_tmp);
229                                                                 osrfStringArrayAdd(map, strdup(_map_class));
230                                                 
231                                                                 while ((_map_class = strtok_r(NULL, " ", &st_tmp))) {
232                                                                         osrfStringArrayAdd(map, strdup(_map_class));
233                                                                 }
234                                                         }
235                                                 }
236                                                 osrfHashSet( _tmp, map, "map");
237
238                                                 string_tmp = NULL;
239                                                 if( (string_tmp = (char*)xmlGetProp(_l, BAD_CAST "field")) ) {
240                                                         osrfHashSet(
241                                                                 _tmp,
242                                                                 strdup( string_tmp ),
243                                                                 "field"
244                                                         );
245                                                 }
246
247                                                 osrfHashSet(
248                                                         links,
249                                                         _tmp,
250                                                         strdup( string_tmp )
251                                                 );
252
253                                                 osrfLogInfo(OSRF_LOG_MARK, "Found link %s for class %s", string_tmp, osrfHashGet(usrData, "classname") );
254
255                                                 _l = _l->next;
256                                         }
257                                 }
258
259                                 if (!strcmp( (char*)_cur->name, "source_definition" )) {
260                                         string_tmp = NULL;
261                                         if( (string_tmp = (char*)xmlNodeGetContent(_cur)) ) {
262                                                 osrfHashSet(
263                                                         usrData,
264                                                         strdup( string_tmp ),
265                                                         "source_definition"
266                                                 );
267                                         }
268
269                                 }
270
271                                 _cur = _cur->next;
272                         }
273                 }
274
275                 kid = kid->next;
276         }
277
278         osrfLogInfo(OSRF_LOG_MARK, "...IDL XML parsed");
279
280         return idlHash;
281 }
282
283 osrfHash* oilsIDLFindPath( char* path, ... ) {
284         if(!path || strlen(path) < 1) return NULL;
285
286         osrfHash* obj = idlHash;
287
288         VA_LIST_TO_STRING(path);
289         char* buf = VA_BUF;
290
291         char* token = NULL;
292         char* t = buf;
293         char* tt;
294
295         token = strtok_r(t, "/", &tt);
296         if(!token) return NULL;
297
298         do {
299                 obj = osrfHashGet(obj, token);
300         } while( (token = strtok_r(NULL, "/", &tt)) && obj);
301
302         return obj;
303 }
304
305 int oilsIDL_classIsFieldmapper ( char* classname ) {
306         if (!classname) return 0;
307         if(oilsIDLFindPath( "/%s", classname )) return 1;
308         return 0;
309 }
310
311 int oilsIDL_ntop (char* classname, char* fieldname) {
312         osrfHash* _pos = NULL;
313
314         if (!oilsIDL_classIsFieldmapper(classname)) return -1;
315         _pos = oilsIDLFindPath( "/%s/fields/%s", classname, fieldname );
316         if (_pos) return atoi( osrfHashGet(_pos, "array_position") );
317         return -1;
318 }
319
320 char * oilsIDL_pton (char* classname, int pos) {
321         char* ret = NULL;
322         osrfHash* f = NULL;
323         osrfHash* fields = NULL;
324         osrfHashIterator* itr = NULL;
325
326         if (!oilsIDL_classIsFieldmapper(classname)) return NULL;
327
328         fields = oilsIDLFindPath( "/%s/fields", classname );
329         itr = osrfNewHashIterator( fields );
330
331         while ( (f = osrfHashIteratorNext( itr )) ) {
332                 if ( atoi(osrfHashGet(f, "array_position")) == pos ) {
333                         ret = strdup(itr->current);
334                         break;
335                 }
336         }
337
338         osrfHashIteratorFree( itr );
339
340         return ret;
341 }
342