tests/rx/test_rx.c
/* [<][>][^][v][top][bottom][index][help] */
FUNCTIONS
This source file includes following functions.
- CO_get_query_logging
- CO_get_query_logfile
- check
- main
1
2 #include "../test_.c" /* unit test template */
3
4
5 #include <defs.h> /* A_I6 */
6
7 // #define WITH_SQL
8
9 #include <rxroutines.h>
10 #include <iproutines.h>
11 #include <stdio.h>
12 #include <memwrap.h>
13 #include <numconv.h>
14
15 #include <properties.h>
16 #include <constants.h>
17
18 #ifndef ASCII_INPUT
19 #include "mysql_driver.h"
20 #endif
21
22
23 /*
24 * define ASCII_INPUT for old style database files,
25 * or leave it undefined for (my)sql tables
26 */
27 /*#define ASCII_INPUT */
28 #define MY_TREE_ATTR A_RT
29 #define LOAD_QUERY QUERY_RT
30 #define RIPE_REG (17)
31 #define MY_SPACE IP_V4
32
33 #define STR_L 1023
34
35
36 int Query_logging=0;
37 char *Query_logfile="stdout";
38
39 #if 0
40 int CO_get_query_logging() {
/* [<][>][^][v][top][bottom][index][help] */
41 return Query_logging;
42 } /* CO_get_query_logging() */
43
44 const char *CO_get_query_logfile() {
/* [<][>][^][v][top][bottom][index][help] */
45 return Query_logfile;
46 } /* CO_get_query_logfile() */
47 #endif
48
49 void check(rx_tree_t *mytree)
/* [<][>][^][v][top][bottom][index][help] */
50 {
51 int cnt;
52 er_ret_t err;
53 rx_treecheck_t errorfound;
54
55 if( mytree->num_nodes > 0 ) {
56 if( (err=RX_treecheck(mytree, 0, &errorfound)) != RX_OK ) {
57 fprintf(stderr, "Nope! %d returned \n", err);
58 die;
59 }
60 else {
61 // fprintf(stderr, "OK\n");
62 }
63 }
64 }
65
66 int main(int argc, char **argv)
/* [<][>][^][v][top][bottom][index][help] */
67 {
68 ip_prefix_t mypref;
69 rx_tree_t *mytree;
70 ip_prefix_t *querypref;
71 GList *datlist, *qitem, *preflist;
72 int maxline=0;
73 char buf[1024];
74 er_path_t erlogstr;
75
76 int i, par_a, par_b=0, search_mode;
77 char pref[IP_PREFSTR_MAX];
78 er_ret_t err;
79 int cnt;
80 char *key, *chp;
81
82 sk_conn_st condat={ 1, 0,0,0,0, {0},{0}, "" };
83
84
85 ER_init(argc, argv);
86
87 PR_load("RIP.properties");
88 fprintf(stderr,"%s\n", PR_to_string() );
89 CO_set();
90 fprintf(stderr,"%s\n", CO_to_string() );
91
92 erlogstr.fdes = stderr;
93 erlogstr.asp = 0; /*xffffffff; / *ASP_RX_NODCRE_BOT;*/
94 erlogstr.sev = ER_SEV_W;
95 erlogstr.mode = ER_M_SEVCHAR | ER_M_TEXTLONG ;
96
97 ER_setpath(& erlogstr);
98
99
100
101 #ifdef ASCII_INPUT
102
103 if( argc<3 ) {
104 fputs("arguments: number_of_lines filename", stderr);
105 die;
106 } else {
107 dieif( rp_init_attr_tree( RIPE_REG, MY_TREE_ATTR ) != RP_OK );
108
109 maxline = atoi(argv[1]);
110 RP_asc_load(argv[2], maxline, RX_OPER_CRE, RIPE_REG);
111 }
112 #else
113 if( argc!=2 ) {
114 fputs("noarguments: number_of_objects", stderr);
115 die;
116 } else {
117 dieif( RP_init_trees( RIPE_REG ) != RP_OK );
118
119 maxline = atoi(argv[1]);
120 /* RP_sql_load_attr_space(maxline, RX_OPER_CRE, LOAD_QUERY,
121 MY_TREE_ATTR, MY_SPACE, RIPE_REG);*/
122 dieif( RP_sql_load_reg(RIPE_REG) != RP_OK );
123 }
124 #endif
125
126 exit(0);
127
128 //rx_space_list(&condat);
129 // consistency check
130
131 // change the loglevel
132 erlogstr.asp = ASP_RX_SRCH_BOT | ASP_RX_STKBLD_BOT;
133 ER_setpath(& erlogstr);
134
135 // now delete.
136 /*
137 fseek(fp,0,SEEK_SET);
138 put_inetnums(mytree, fp, maxline, RX_OPER_DEL );
139 // print
140 rx_space_list(&condat);
141 // consistency check
142 check(mytree);
143 */
144 // exit(0);
145 //rx_tree_print( mytree );
146
147 /* check(mytree);*/
148
149 // search
150 while(!feof(stdin)) {
151 printf("\nsearch> ");
152 fgets(buf, 128, stdin);
153
154 par_a=1;
155 key = buf;
156
157
158 // chop \n
159 if( (chp = index(buf,'\n')) == NULL ) { //EOF
160 break;
161 }
162 else {
163 * chp = '\0';
164 }
165
166 if( *key == '\0' ) {
167 continue;
168 }
169
170 if( strcmp(key, "exit") == 0 ) {
171 exit(0);
172 }
173
174 if( strncmp(key, "show ", 5) == 0 ) {
175 int depth;
176 extern er_ret_t rx_walk_hook_printnode();
177
178 key+=5;
179
180 /* tree inspection // show tree <n>, default n = 255 */
181 if( strncmp(key, "tree", 4) == 0 ) {
182
183 ip_space_t space = (RP_attr2spc(MY_TREE_ATTR, IP_V4))
184 ? IP_V4 : IP_V6;
185
186 key+=4;
187 if( sscanf(key, "%d", &depth) < 1 ) {
188 depth = 255;
189 }
190
191 dieif(!NOERR(RP_tree_get(&mytree, RIPE_REG, space, MY_TREE_ATTR)));
192
193 rx_walk_tree(mytree->top_ptr, rx_walk_hook_printnode,
194 RX_WALK_CNTGLU, // print also glue nodes
195 depth, 0, 0, &condat, &err);
196
197 /* err will be handled below */
198 printf("got status %x\n", err);
199 ER_perror(FAC_RX, err);
200
201 continue;
202 }
203 }
204 else {
205
206 /* ordinary query */
207
208 /* take switches */
209 if( *key=='-' ) {
210 switch( *(++key) ) {
211 case 'd':
212 search_mode = RX_SRCH_EXLESS; // default
213 break;
214 case 'e':
215 search_mode = RX_SRCH_EXACT;
216 break;
217 case 'm':
218 search_mode = RX_SRCH_MORE;
219 key++;
220 if( ! isdigit( *key ) ) {
221 puts("invalid syntax");
222 continue;
223 } else {
224 sscanf( key, "%d", &par_a);
225 }
226 break;
227 case 'l':
228 search_mode = RX_SRCH_LESS;
229 key++;
230 if( ! isdigit( *key ) ) {
231 puts("invalid syntax");
232 continue;
233 } else {
234 sscanf( key, "%d", &par_a);
235 }
236 break;
237 case 'r':
238 search_mode = RX_SRCH_RANG;
239 key++;
240 if( ! isdigit( *key ) ) {
241 puts("invalid syntax");
242 continue;
243 }
244 else {
245 sscanf( key, "%d", &par_a);
246 }
247 break;
248 case 's':
249 search_mode = RX_SRCH_DBLS;
250 key++;
251 if( ! isdigit( *key ) ) {
252 puts("invalid syntax");
253 continue;
254 } else {
255 sscanf( key, "%d", &par_a);
256 }
257 break;
258 }
259
260 if( (key=index(buf, ' ')) == NULL ) {
261 // empty query
262 continue;
263 }
264 else {
265 key++;
266 }
267
268 }
269 else {
270 search_mode = RX_SRCH_EXLESS; // default search mode
271 }
272
273 // zero the datlist (the one for answers).
274 datlist = NULL;
275
276 err = RP_asc_search(search_mode, par_a, par_b, key,
277 RIPE_REG, MY_TREE_ATTR, &datlist, RX_ANS_ALL);
278 }
279
280 printf("got status %x\n", err);
281
282 ER_perror(FAC_RP, err);
283
284 if( NOERR(err) ) {
285
286
287 puts("### answers:");
288
289 for(i=0; i<g_list_length(datlist); i++) {
290 rx_datcpy_t *datcpy = g_list_nth_data(datlist, i);
291 char rangstr[IP_RANGSTR_MAX];
292
293 if( RP_attr2fam(MY_TREE_ATTR) == RX_FAM_IN ) {
294 if(IP_rang_b2a( &(datcpy->leafcpy.iprange), rangstr, IP_RANGSTR_MAX)
295 != IP_OK ) {
296 die;
297 }
298 if( datcpy->leafcpy.composed ) {
299 strcat(rangstr, " \tc");
300 }
301 } else {
302 rangstr[0] = '\0';
303 }
304
305 printf("\n%d: [%u]\t%s\n%s",i, datcpy->leafcpy.data_key,
306 rangstr, (char *) datcpy->leafcpy.data_ptr );
307 wr_free(datcpy->leafcpy.data_ptr );
308 }
309
310 g_list_foreach(datlist, rx_free_list_element, NULL);
311 g_list_free(datlist);
312
313 }
314 else {
315 switch( err ) {
316 case IP_INVARG:
317 fputs("conversion error", stderr);
318 break;
319
320 case RX_NOTREE:
321 fputs("this object type not loaded", stderr);
322 break;
323 default:
324 die;
325 }
326 }
327 }
328 return 0;
329 }
330