]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/c-apps/oils_idl-core.c
deprecate libfieldmapper by moving to the idl interface built for cstore
[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/persistance/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, "id"), "classname");
48                         osrfHashSet( usrData, xmlGetNsProp(kid, "fieldmapper", OBJECT_NS), "fieldmapper");
49
50                         osrfHashSet( idlHash, usrData, (char*)osrfHashGet(usrData, "classname") );
51
52                         string_tmp = NULL;
53                         if ((string_tmp = (char*)xmlGetNsProp(kid, "tablename", PERSIST_NS))) {
54                                 osrfHashSet(
55                                         usrData,
56                                         strdup( string_tmp ),
57                                         "tablename"
58                                 );
59                         }
60
61                         string_tmp = NULL;
62                         if ((string_tmp = (char*)xmlGetNsProp(kid, "virtual", PERSIST_NS))) {
63                                 osrfHashSet(
64                                         usrData,
65                                         strdup( string_tmp ),
66                                         "virtual"
67                                 );
68                         }
69
70                         osrfStringArray* controller = osrfNewStringArray(0);
71                         string_tmp = NULL;
72                         if( (string_tmp = (char*)xmlGetProp(kid, "controller") )) {
73                                 char* controller_list = strdup( string_tmp );
74                                 osrfLogInfo(OSRF_LOG_MARK, "Controller list is %s", string_tmp );
75
76                                 if (strlen( controller_list ) > 0) {
77                                         char* st_tmp;
78                                         char* _controller_class = strtok_r(controller_list, " ", &st_tmp);
79                                         osrfStringArrayAdd(controller, strdup(_controller_class));
80
81                                         while ((_controller_class = strtok_r(NULL, " ", &st_tmp))) {
82                                                 osrfStringArrayAdd(controller, strdup(_controller_class));
83                                         }
84                                 }
85                         }
86                         osrfHashSet( usrData, controller, "controller");
87
88
89                         osrfHash* _tmp;
90                         osrfHash* links = osrfNewHash();
91                         osrfHash* fields = osrfNewHash();
92
93                         osrfHashSet( usrData, fields, "fields" );
94                         osrfHashSet( usrData, links, "links" );
95
96                         xmlNodePtr _cur = kid->children;
97
98                         while (_cur) {
99
100                                 if (!strcmp( (char*)_cur->name, "fields" )) {
101
102                                         string_tmp = NULL;
103                                         if( (string_tmp = (char*)xmlGetNsProp(_cur, "primary", PERSIST_NS)) ) {
104                                                 osrfHashSet(
105                                                         usrData,
106                                                         strdup( string_tmp ),
107                                                         "primarykey"
108                                                 );
109                                         }
110
111                                         string_tmp = NULL;
112                                         if( (string_tmp = (char*)xmlGetNsProp(_cur, "sequence", PERSIST_NS)) ) {
113                                                 osrfHashSet(
114                                                         usrData,
115                                                         strdup( string_tmp ),
116                                                         "sequence"
117                                                 );
118                                         }
119
120                                         xmlNodePtr _f = _cur->children;
121
122                                         while(_f) {
123                                                 if (strcmp( (char*)_f->name, "field" )) {
124                                                         _f = _f->next;
125                                                         continue;
126                                                 }
127
128                                                 _tmp = osrfNewHash();
129
130                                                 string_tmp = NULL;
131                                                 if( (string_tmp = (char*)xmlGetNsProp(_f, "array_position", OBJECT_NS)) ) {
132                                                         osrfHashSet(
133                                                                 _tmp,
134                                                                 strdup( string_tmp ),
135                                                                 "array_position"
136                                                         );
137                                                 }
138
139                                                 string_tmp = NULL;
140                                                 if( (string_tmp = (char*)xmlGetNsProp(_f, "virtual", PERSIST_NS)) ) {
141                                                         osrfHashSet(
142                                                                 _tmp,
143                                                                 strdup( string_tmp ),
144                                                                 "virtual"
145                                                         );
146                                                 }
147
148                                                 string_tmp = NULL;
149                                                 if( (string_tmp = (char*)xmlGetNsProp(_f, "primitive", PERSIST_NS)) ) {
150                                                         osrfHashSet(
151                                                                 _tmp,
152                                                                 strdup( string_tmp ),
153                                                                 "primitive"
154                                                         );
155                                                 }
156
157                                                 string_tmp = NULL;
158                                                 if( (string_tmp = (char*)xmlGetProp(_f, "name")) ) {
159                                                         osrfHashSet(
160                                                                 _tmp,
161                                                                 strdup( string_tmp ),
162                                                                 "name"
163                                                         );
164                                                 }
165
166                                                 osrfLogInfo(OSRF_LOG_MARK, "Found field %s for class %s", string_tmp, osrfHashGet(usrData, "classname") );
167
168                                                 osrfHashSet(
169                                                         fields,
170                                                         _tmp,
171                                                         strdup( string_tmp )
172                                                 );
173                                                 _f = _f->next;
174                                         }
175                                 }
176
177                                 if (!strcmp( (char*)_cur->name, "links" )) {
178                                         xmlNodePtr _l = _cur->children;
179
180                                         while(_l) {
181                                                 if (strcmp( (char*)_l->name, "link" )) {
182                                                         _l = _l->next;
183                                                         continue;
184                                                 }
185
186                                                 _tmp = osrfNewHash();
187
188                                                 string_tmp = NULL;
189                                                 if( (string_tmp = (char*)xmlGetProp(_l, "reltype")) ) {
190                                                         osrfHashSet(
191                                                                 _tmp,
192                                                                 strdup( string_tmp ),
193                                                                 "reltype"
194                                                         );
195                                                 }
196                                                 osrfLogInfo(OSRF_LOG_MARK, "Adding link with reltype %s", string_tmp );
197
198                                                 string_tmp = NULL;
199                                                 if( (string_tmp = (char*)xmlGetProp(_l, "key")) ) {
200                                                         osrfHashSet(
201                                                                 _tmp,
202                                                                 strdup( string_tmp ),
203                                                                 "key"
204                                                         );
205                                                 }
206                                                 osrfLogInfo(OSRF_LOG_MARK, "Link fkey is %s", string_tmp );
207
208                                                 string_tmp = NULL;
209                                                 if( (string_tmp = (char*)xmlGetProp(_l, "class")) ) {
210                                                         osrfHashSet(
211                                                                 _tmp,
212                                                                 strdup( string_tmp ),
213                                                                 "class"
214                                                         );
215                                                 }
216                                                 osrfLogInfo(OSRF_LOG_MARK, "Link fclass is %s", string_tmp );
217
218                                                 osrfStringArray* map = osrfNewStringArray(0);
219
220                                                 string_tmp = NULL;
221                                                 if( (string_tmp = (char*)xmlGetProp(_l, "map") )) {
222                                                         char* map_list = strdup( string_tmp );
223                                                         osrfLogInfo(OSRF_LOG_MARK, "Link mapping list is %s", string_tmp );
224
225                                                         if (strlen( map_list ) > 0) {
226                                                                 char* st_tmp;
227                                                                 char* _map_class = strtok_r(map_list, " ", &st_tmp);
228                                                                 osrfStringArrayAdd(map, strdup(_map_class));
229                                                 
230                                                                 while ((_map_class = strtok_r(NULL, " ", &st_tmp))) {
231                                                                         osrfStringArrayAdd(map, strdup(_map_class));
232                                                                 }
233                                                         }
234                                                 }
235                                                 osrfHashSet( _tmp, map, "map");
236
237                                                 string_tmp = NULL;
238                                                 if( (string_tmp = (char*)xmlGetProp(_l, "field")) ) {
239                                                         osrfHashSet(
240                                                                 _tmp,
241                                                                 strdup( string_tmp ),
242                                                                 "field"
243                                                         );
244                                                 }
245
246                                                 osrfHashSet(
247                                                         links,
248                                                         _tmp,
249                                                         strdup( string_tmp )
250                                                 );
251
252                                                 osrfLogInfo(OSRF_LOG_MARK, "Found link %s for class %s", string_tmp, osrfHashGet(usrData, "classname") );
253
254                                                 _l = _l->next;
255                                         }
256                                 }
257
258                                 _cur = _cur->next;
259                         }
260                 }
261
262                 kid = kid->next;
263         }
264
265         osrfLogInfo(OSRF_LOG_MARK, "...IDL XML parsed");
266
267         return idlHash;
268 }
269
270 osrfHash* oilsIDLFindPath( char* path, ... ) {
271         if(!path || strlen(path) < 1) return NULL;
272
273         osrfHash* obj = idlHash;
274
275         VA_LIST_TO_STRING(path);
276         char* buf = VA_BUF;
277
278         char* token = NULL;
279         char* t = buf;
280         char* tt;
281
282         token = strtok_r(t, "/", &tt);
283         if(!token) return NULL;
284
285         do {
286                 obj = osrfHashGet(obj, token);
287         } while( (token = strtok_r(NULL, "/", &tt)) && obj);
288
289         return obj;
290 }
291
292 int oilsIDL_classIsFieldmapper ( char* classname ) {
293         if (!classname) return 0;
294         if(oilsIDLFindPath( "/%s", classname )) return 1;
295         return 0;
296 }
297
298 int oilsIDL_ntop (char* classname, char* fieldname) {
299         osrfHash* _pos = NULL;
300
301         if (!oilsIDL_classIsFieldmapper(classname)) return -1;
302         _pos = oilsIDLFindPath( "/%s/fields/%s", classname, fieldname );
303         if (_pos) return atoi( osrfHashGet(_pos, "array_position") );
304         return -1;
305 }
306
307 char * oilsIDL_pton (char* classname, int pos) {
308         char* ret = NULL;
309         osrfHash* f = NULL;
310         osrfHash* fields = NULL;
311         osrfHashIterator* itr = NULL;
312
313         if (!oilsIDL_classIsFieldmapper(classname)) return NULL;
314
315         fields = oilsIDLFindPath( "/%s/fields", classname );
316         itr = osrfNewHashIterator( fields );
317
318         while ( (f = osrfHashIteratorNext( itr )) ) {
319                 if ( atoi(osrfHashGet(f, "array_position")) == pos ) {
320                         ret = strdup(itr->current);
321                         break;
322                 }
323         }
324
325         osrfHashIteratorFree( itr );
326
327         return ret;
328 }
329