/************************************************************************/ /* netdc2meta - convert netdc request file to meta request file. */ /* input - stdin */ /* output - specified output file */ /************************************************************************/ #include #include #include #include #include #include #include #include #include #include char *syntax[] = { "%s [-h] [-I] meta_req_file", " where:", " -h Prints out a summary of the available options.", " -I Generate Dataless SEED.", " meta_req_file Meta-SQL request file to be created.", NULL}; #include #ifndef BUFSIZE #define BUFSIZE 4096*5 #endif struct s_param_elem { char keyword[31]; char keyval[256]; struct s_param_elem *next_elem; }; /* prototypes */ void regexp(char *out, char *in); void timeconv(char *out, char *in); void timeconv2(char *out, char *in); char *like_string(char *field_name, char *field_val); char *cmdname; void main (int argc, char *argv[]) { char req_type[16],req_line[256],hub_id[64],outfile[128],local_email[128]; char username[64],email[128],duser[256],dhub[256], label[128]; char buf[BUFSIZE],sql_str[1024],tmp_str[1024],db_client[128]; int i,in_quote,complete,string_offset,string_len,level; struct s_param_elem *param_head; FILE *f_query_out, *f_query_in; char query_out[255], query_in[255]; char query_line[255]; char oracle_sys[255]; char outfile2[512]; char *queryfile; int IR = 0; struct { char dc_name[64]; char netcode[64]; char station[256]; char location[256]; char channel[256]; char start[32]; char end[32]; } orig_req,new_req; /* input and output field containers */ /* Variables needed for getopt. */ extern char *optarg; extern int optind, opterr; int c; cmdname = tail(argv[0]); /* Parse command line options. */ while ( (c = getopt(argc,argv,"hI")) != -1) switch (c) { case '?': case 'h': print_syntax(cmdname,syntax,stdout); exit(0); break; case 'I': IR = 1; break; default: fprintf (stderr, "Error: Unknown option -%c\n", c); exit (129); break; } /* Skip over all options and their arguments. */ argv = &(argv[optind]); argc -= optind; if (argc > 0) queryfile = argv[0]; else { fprintf (stderr, "Error: no query_file specified.\n"); exit (129); } hub_id[0] = '\0'; outfile[0] = '\0'; username[0] = '\0'; email[0] = '\0'; duser[0] = '\0'; dhub[0] = '\0'; label[0] = '\0'; /* Opening output query file */ if ((f_query_in = fopen (queryfile, "w+t")) == NULL) { printf ("Error: Couldn't open file %s.\n", outfile); exit (129); } /* for each request line... */ while ((gets(req_line)) != (char) NULL) { /* get request line through STDIN */ /* initialize string spaces */ memset(&req_type,'\0',16); memset(&orig_req,'\0',sizeof(orig_req)); memset(&new_req,'\0',sizeof(new_req)); /* paint token separators into query line */ /* ASCII for double-quote is 34 */ in_quote = 0; for (i=0;;i++) { if(req_line[i] == '\0') break; if(req_line[i] == 34 && in_quote) {in_quote=0;continue;} if(req_line[i] == 34 && ! in_quote) {in_quote=1;continue;} if((req_line[i] == ' ' || req_line[i] == '\t' || req_line[i] == '\n') && ! in_quote) {req_line[i]=(char)34;} } complete = 0; /* flag whether request line has a complete set of fields */ /* separate out the fields */ do { /* block container...not a loop */ string_offset = strspn(req_line,"\""); string_len = strcspn(req_line+string_offset,"\""); if (string_len == 0) break; strncpy(req_type,req_line+string_offset,string_len); /* request type */ req_type[string_len] = '\0'; if (strcmp(req_type,".DATA")) break; string_offset += string_len; string_offset += strspn(req_line+string_offset,"\""); string_len = strcspn(req_line+string_offset,"\""); if (string_len == 0) break; strncpy(orig_req.dc_name,req_line+string_offset,string_len); /* data center name */ orig_req.dc_name[string_len] = '\0'; string_offset += string_len; string_offset += strspn(req_line+string_offset,"\""); string_len = strcspn(req_line+string_offset,"\""); if (string_len == 0) break; strncpy(orig_req.netcode,req_line+string_offset,string_len); /* network code */ orig_req.netcode[string_len] = '\0'; string_offset += string_len; string_offset += strspn(req_line+string_offset,"\""); string_len = strcspn(req_line+string_offset,"\""); if (string_len == 0) break; strncpy(orig_req.station,req_line+string_offset,string_len); /* station list */ orig_req.station[string_len] = '\0'; string_offset += string_len; string_offset += strspn(req_line+string_offset,"\""); string_len = strcspn(req_line+string_offset,"\""); if (string_len == 0) break; strncpy(orig_req.location,req_line+string_offset,string_len); /* location code list */ orig_req.location[string_len] = '\0'; string_offset += string_len; string_offset += strspn(req_line+string_offset,"\""); string_len = strcspn(req_line+string_offset,"\""); if (string_len == 0) break; strncpy(orig_req.channel,req_line+string_offset,string_len); /* channel list */ orig_req.channel[string_len] = '\0'; string_offset += string_len; string_offset += strspn(req_line+string_offset,"\""); string_len = strcspn(req_line+string_offset,"\""); if (string_len == 0) break; strncpy(orig_req.start,req_line+string_offset,string_len); /* start time */ orig_req.start[string_len] = '\0'; string_offset += string_len; string_offset += strspn(req_line+string_offset,"\""); string_len = strcspn(req_line+string_offset,"\""); if (string_len == 0) break; strncpy(orig_req.end,req_line+string_offset,string_len); /* end time */ orig_req.end[string_len] = '\0'; string_offset += string_len; complete = 1; } while (0); /* end of block */ if (! complete) { /* if this didn't process as a complete data request line, then check to see if its a predefined parameter record */ if (! strcmp(req_type,".HUB_ID")) { string_offset += string_len; string_offset += strspn(req_line+string_offset,"\""); string_len = strcspn(req_line+string_offset,"\""); if (string_len == 0) break; strncpy(hub_id,req_line+string_offset,string_len); /* hub ID */ hub_id[string_len] = '\0'; continue; } else if (! strcmp(req_type,".FILENAME")) { string_offset += string_len; string_offset += strspn(req_line+string_offset,"\""); string_len = strcspn(req_line+string_offset,"\""); if (string_len == 0) break; strncpy(outfile,req_line+string_offset,string_len);/* output filename */ outfile[string_len] = '\0'; continue; } else if (! strcmp(req_type,".NAME")) { string_offset += string_len; string_offset += strspn(req_line+string_offset,"\""); string_len = strcspn(req_line+string_offset,"\""); if (string_len == 0) break; strncpy(username,req_line+string_offset,string_len); username[string_len] = '\0'; continue; } else if (! strcmp(req_type,".EMAIL")) { string_offset += string_len; string_offset += strspn(req_line+string_offset,"\""); string_len = strcspn(req_line+string_offset,"\""); if (string_len == 0) break; strncpy(email,req_line+string_offset,string_len); email[string_len] = '\0'; continue; } else if (! strcmp (req_type, ".LABEL")) { string_offset += string_len; string_offset += strspn (req_line+string_offset,"\""); string_len = strcspn (req_line+string_offset,"\""); if (string_len == 0) break; strncpy (label, req_line+string_offset, string_len); label[string_len] = '\0'; continue; } else if (! strcmp(req_type,".DISPOSITION_USER")) { /* mult optional fields */ string_offset += string_len; string_offset += strspn(req_line+string_offset,"\""); string_len = strlen(req_line+string_offset); if (string_len != 0) { strncpy(duser,req_line+string_offset,string_len); /* space-out quote delimiters */ for (i=0;i 4) string_len = 4; memcpy(out,year,string_len); /* julian day */ string_offset += strspn(in+string_offset," \t"); string_len = strcspn(in+string_offset," \t"); if (string_len == 0) return; strncpy(month,in+string_offset,string_len); month[string_len] = '\0'; string_offset += string_len; string_offset += strspn(in+string_offset," \t"); string_len = strcspn(in+string_offset," \t"); if (string_len == 0) return; strncpy(day,in+string_offset,string_len); day[string_len] = '\0'; string_offset += string_len; sprintf(cmdline,"caldate -f \"%%j/%%Y\" %s/%s/%s",year,month,day); if ((cmdptr = popen(cmdline,"r")) == NULL) return; if((fgets(dateret,255,cmdptr)) == NULL) return; pclose(cmdptr); strncpy(jday,dateret,3); jday[3] = '\0'; if (atoi(jday) == 0) return; memcpy(out+5,jday,3); /* minute */ string_offset += strspn(in+string_offset," \t"); string_len = strcspn(in+string_offset," \t"); if (string_len == 0) return; strncpy(min,in+string_offset,string_len); min[string_len] = '\0'; string_offset += string_len; if (string_len > 2) string_len = 2; memcpy(out+12,min,string_len); /* second */ string_offset += strspn(in+string_offset," \t"); string_len = strcspn(in+string_offset," \t"); if (string_len == 0) return; strncpy(sec,in+string_offset,string_len); sec[string_len] = '\0'; string_offset += string_len; if (string_len > 7) string_len = 7; memcpy(out+15,sec,string_len); return; } /* convert BREQ_FAST-style time string into ORACLE time string */ void timeconv(char *out, char *in) { char year[8],yr[8],month[8],day[8],hour[8],min[8],sec[8],dateret[256],cmdline[256]; int string_len,string_offset; FILE *cmdptr; /* if time string is NULL, then return NULL output */ if (in[0] == '\0') { out[0] = '\0'; return; } strcpy(out,"0000/00/00 00:00:00"); /* set up time string template - zero padded */ /* offset: 0123456789012345678 */ /* year */ string_len = strcspn(in," \t"); if (string_len == 0) return; strncpy(year,in,string_len); year[string_len] = '\0'; if (string_len < 4) { /* is a two-digit year, convert to a four-digit year */ sprintf(yr,"%04d",(atoi(year)<50?2000+atoi(year):1900+atoi(year)) ); strcpy(year,yr); } string_offset = string_len; /* parsing offset marker */ string_len = strlen(year); if (string_len > 4) string_len = 4; memcpy(out,year,string_len); /* month */ string_offset += strspn(in+string_offset," \t"); string_len = strcspn(in+string_offset," \t"); if (string_len == 0) return; strncpy(month,in+string_offset,string_len); month[string_len] = '\0'; string_offset += string_len; if (string_len > 2) string_len = 2; memcpy(out+5,month,string_len); /* day */ string_offset += strspn(in+string_offset," \t"); string_len = strcspn(in+string_offset," \t"); if (string_len == 0) return; strncpy(day,in+string_offset,string_len); day[string_len] = '\0'; string_offset += string_len; if (string_len > 2) string_len = 2; memcpy(out+8,day,string_len); /* hour */ string_offset += strspn(in+string_offset," \t"); string_len = strcspn(in+string_offset," \t"); if (string_len == 0) return; strncpy(hour,in+string_offset,string_len); hour[string_len] = '\0'; string_offset += string_len; if (string_len > 2) string_len = 2; memcpy(out+11,hour,string_len); /* minute */ string_offset += strspn(in+string_offset," \t"); string_len = strcspn(in+string_offset," \t"); if (string_len == 0) return; strncpy(min,in+string_offset,string_len); min[string_len] = '\0'; string_offset += string_len; if (string_len > 2) string_len = 2; memcpy(out+14,min,string_len); /* second */ string_offset += strspn(in+string_offset," \t"); string_len = strcspn(in+string_offset," \t"); if (string_len == 0) return; strncpy(sec,in+string_offset,string_len); sec[string_len] = '\0'; string_offset += string_len; if (string_len > 2) string_len = 2; memcpy(out+17,sec,string_len); memcpy(out+19,"\0",1); return; } /* convert a field_val string that is intended as a comparison to a database field of field_name from a bar '|' separated set of SQL-wildcarded phrases to a compound set of 'LIKE' statements */ /* example: like_string("myfield","%a%|%b%|%c%") returns "myfield like '%a%' OR myfield like '%b%' OR myfield like '%c%'" */ /* assumes no leading spaces present in parameters */ char *like_string(char *field_name, char *field_val) { char like_expr[4096],like_tmp[64],tmp_str[64]; int i,append,string_len; i=0; /* i is the character index */ append=0; /* append indicates that first expression is past */ like_expr[0] = '\0'; while (field_val[i] != '\0') { string_len = strcspn(field_val+i,"|"); /* token separator */ strncpy(tmp_str,field_val+i,string_len); tmp_str[string_len] = '\0'; if (append) strcat(like_expr," OR "); /* Handle blank-blank code */ if ((!strcmp (tmp_str, "--")) || (!strcmp (tmp_str, "-"))) strcpy (tmp_str, " "); sprintf(like_tmp,"%s like '%s'",field_name,tmp_str); strcat(like_expr,like_tmp); append = 1; i+=string_len; if (field_val[i] == '|') i++; /* prevents skipping over NULL */ } return (like_expr); }