]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/extras/oils_requestor.c
Patch from Scott McKellar to implement const-correctness, plug a recursion-based...
[Evergreen.git] / Open-ILS / src / extras / oils_requestor.c
1 #include <getopt.h>
2 #include <stdio.h>
3 #include <string.h>
4 #include <readline/readline.h>
5 #include "opensrf/utils.h"
6 #include "opensrf/osrf_system.h"
7 #include "opensrf/osrf_app_session.h"
8 #include "openils/oils_event.h"
9 #include "openils/oils_utils.h"
10
11 char* script            = NULL;
12 char* authtoken = NULL;
13
14 static int do_request( char* request );
15 static char* format_response( const jsonObject* o );
16
17 int main( int argc, char* argv[] ) {
18         
19         int c;
20         char* username          = NULL;
21         char* password          = NULL;
22         char* config            = NULL;
23         char* context           = NULL;
24         char* idl_filename      = NULL;
25         char* request;
26
27         while( (c = getopt( argc, argv, "f:u:p:s:c:i:" )) != -1 ) {
28                 switch(c) {
29                         case '?': return -1;
30                         case 'f': config                = strdup(optarg); break;
31                         case 'c': context               = strdup(optarg); break;
32                         case 'u': username      = strdup(optarg); break;
33                         case 'p': password      = strdup(optarg); break;
34                         case 's': script                = strdup(optarg); break;
35                         case 'i': idl_filename          = strdup(optarg); break;
36                 }
37         }
38
39         if (!idl_filename) {
40                 fprintf(stderr, "IDL file not provided. Exiting...\n");
41                 return -1;
42         }
43
44         if (!oilsInitIDL( idl_filename )) {
45                 fprintf(stderr, "IDL file could not be loaded. Exiting...\n");
46                 return -1;
47         }
48
49         if(!(config && context)) {
50                 fprintf(stderr, "Config or config context not provided. Exiting...\n");
51                 return -1;
52         }
53
54         if( ! osrf_system_bootstrap_client(config, context) ) {
55                 fprintf(stderr, "Unable to connect to OpenSRF network... [config:%s : context:%s]\n", config, context);
56                 return 1;
57         }
58
59         printf("Connected to OpenSRF network...\n");
60
61         if( username && password &&
62                         ( authtoken = oilsUtilsLogin(username, password, "staff", -1 )) ) {
63                 printf("Login Session: %s\n", authtoken);
64         }
65
66         while( (request=readline("oils# ")) ) {
67            int retcode = do_request(request);
68            free(request);
69            if( retcode ) break;
70         }
71
72         free(config);
73         free(context);
74         free(username);
75         free(password);
76         free(script);
77         free(authtoken);
78         free(idl_filename);
79         return 1;
80 }
81
82
83 static int do_request( char* request ) {
84
85         if(!strcasecmp(request, "exit") || !strcasecmp(request,"quit"))
86                 return 1;
87
88         if(!strcmp(request,"")) return 0;
89
90         const char* service;
91         const char* method;
92         char* tmp;
93         
94         service = strtok_r(request, " ", &tmp);
95         method = strtok_r(NULL, " ", &tmp);
96
97         if( service && method ) {
98
99                 jsonObject* params = NULL;
100
101                 if( *tmp ) {
102                         growing_buffer* buffer = buffer_init(256);
103                         buffer_fadd( buffer, "[%s]", tmp );
104                         params = jsonParseString( buffer->buf );
105                         buffer_free(buffer);
106                 }
107                 
108                 osrfAppSession* session = osrf_app_client_session_init(service);
109                 int req_id = osrfAppSessionMakeRequest( session, params, method, 1, NULL );
110                 osrfMessage* omsg;
111
112                 while( (omsg = osrfAppSessionRequestRecv( session, req_id, 120 )) ) {
113                         jsonObject* res = osrfMessageGetResult(omsg);
114                         char* data = format_response(res);
115                         printf("%s\n", data);
116                         free(data);
117                         osrfMessageFree(omsg);
118                 }
119
120                 osrfAppSessionFree(session);
121                 jsonObjectFree(params);
122
123         } else {
124                 fprintf(stderr, "STATEMENT DOES NOT PARSE: %s\n", request);
125         }
126
127         return 0;
128 }
129
130
131 static char* format_response( const jsonObject* o ) {
132         if(!o) return NULL;
133
134         int width = 20;
135
136         if( o->classname && isFieldmapper(o->classname) ) {
137
138                 int i = 0;
139                 char* key;
140                 growing_buffer* buffer = buffer_init(256);
141
142                 buffer_fadd(buffer, " FM Class: %s\n", o->classname);
143
144                 while( (key = fm_pton(o->classname, i++)) ) {
145                         char* val = oilsFMGetString(o, key);
146                         const jsonObject* item;
147
148                         int l = strlen(key + 2);
149                         buffer_fadd(buffer, " %s: ", key);
150
151                         if(val) {
152
153                                 while( l++ < width ) buffer_add(buffer, "-");
154                                 buffer_fadd(buffer, " %s\n", val);
155                                 free(val);
156
157                         } else if( (item = oilsFMGetObject(o, key))) {
158
159                                 if(item->type != JSON_NULL ) {
160                                         char* d = format_response(item);
161                                         buffer_add(buffer, "\n====================================\n");
162                                         buffer_fadd(buffer, "%s\n", d);
163                                         buffer_add(buffer, "====================================\n");
164                                         free(d);
165                                 } else {
166                                         while( l++ < width ) buffer_add(buffer, "-");
167                                         buffer_add(buffer," NULL \n");
168                                 }
169
170                         } else {
171
172                                 while( l++ < width ) buffer_add(buffer, "-");
173                                 buffer_add(buffer," NULL \n");
174                         }
175
176                         free(key);
177                 }
178
179                 return buffer_release(buffer);
180         }
181
182         char* jjson;
183         if( o->type == JSON_ARRAY ) {
184                 int i = 0;
185                 growing_buffer* arrb = buffer_init(256);
186                 for( i = 0; i != o->size; i++ ) {
187                         char* d = format_response(jsonObjectGetIndex(o, i));
188                         buffer_fadd(arrb, "%s\n", d);
189                         free(d);
190                 }
191
192                 jjson = buffer_release(arrb);
193
194         } else {
195                 char* json = jsonObjectToJSON(o);
196                 jjson = jsonFormatString(json);
197                 free(json);
198         }
199
200         return jjson;
201 }