int load_state(long sf, long procs, long step) { FILE *ufp; int i; char fname[256]; char line[1024]; if (sf == 0 || step == 0) return(0); seed_name(line, sf, procs, step); sprintf(fname, "%s%c%s", env_config(SEED_TAG, SEED_DFLT), PATH_SEP, line); ufp = fopen(fname, "r"); OPEN_CHECK(ufp, fname); for (i=0; i <= MAX_STREAM; i++ ) if (fscanf(ufp, "%ld\n", Seed + i) != 1) return(MAX_STREAM); fclose(ufp); return(0); }
FILE * tbl_open(int tbl, char *mode) { char prompt[256]; char fullpath[256]; FILE *f; struct stat fstats; int retcode; if (*tdefs[tbl].name == PATH_SEP) strcpy(fullpath, tdefs[tbl].name); else sprintf(fullpath, "%s%c%s", env_config(PATH_TAG, PATH_DFLT), PATH_SEP, tdefs[tbl].name); retcode = stat(fullpath, &fstats); if (retcode && (errno != ENOENT)) { fprintf(stderr, "stat(%s) failed.\n", fullpath); exit(-1); } if (S_ISREG(fstats.st_mode) && !force && *mode != 'r' ) { sprintf(prompt, "Do you want to overwrite %s ?", fullpath); if (!yes_no(prompt)) exit(0); } if (S_ISFIFO(fstats.st_mode)) { retcode = open(fullpath, ((*mode == 'r')?O_RDONLY:O_WRONLY)|O_CREAT); f = fdopen(retcode, mode); } else{ #ifdef LINUX /* allow large files on Linux */ /*use open to first to get the in fd and apply regular fdopen*/ /*cheng: Betty mentioned about write mode problem here, added 066*/ retcode = open(fullpath, ((*mode == 'r')?O_RDONLY:O_WRONLY)|O_CREAT|O_LARGEFILE,0644); f = fdopen(retcode, mode); #else f = fopen(fullpath, mode); #endif } OPEN_CHECK(f, fullpath); if (header && columnar && tdefs[tbl].header != NULL) tdefs[tbl].header(f); return (f); }
FILE * tbl_open(int tbl, char *mode) { char prompt[256]; char fullpath[256]; #ifdef MYRIAD_NO_OUTPUT strcpy(fullpath, "/dev/null"); #endif /* MYRIAD_NO_OUTPUT */ FILE *f; struct stat fstats; int retcode; // DO NOT CREATE FILES FOR THE TABLES #ifndef MYRIAD_NO_OUTPUT if (*tdefs[tbl].name == PATH_SEP) strcpy(fullpath, tdefs[tbl].name); else sprintf(fullpath, "%s%c%s", env_config(PATH_TAG, PATH_DFLT), PATH_SEP, tdefs[tbl].name); #endif /* MYRIAD_NO_OUTPUT */ retcode = stat(fullpath, &fstats); if (retcode) { if (errno != ENOENT) { fprintf(stderr, "stat(%s) failed.\n", fullpath); exit(-1); } else f = fopen(fullpath, mode); // create and open the file } else { /* note this code asumes we are writing but tests if mode == r -jrg */ if (S_ISREG(fstats.st_mode) && !force && *mode != 'r' ) { sprintf(prompt, "Do you want to overwrite %s ?", fullpath); if (!yes_no(prompt)) exit(0); f = fopen(fullpath, mode); } else if (S_ISFIFO(fstats.st_mode)) { retcode = open(fullpath, ((*mode == 'r')?O_RDONLY:O_WRONLY)|O_CREAT, 0664); f = fdopen(retcode, mode); } else f = fopen(fullpath, mode); } OPEN_CHECK(f, fullpath); return (f); }
FILE * print_prep(int table, int update) { char upath[128]; FILE *res; if (updates) { if (update > 0) /* updates */ if ( insert_segments ) { int this_segment; if(strcmp(tdefs[table].name,"orders.tbl")) this_segment=++insert_orders_segment; else this_segment=++insert_lineitem_segment; sprintf(upath, "%s%c%s.u%d.%d", env_config(PATH_TAG, PATH_DFLT), PATH_SEP, tdefs[table].name, update%10000,this_segment); } else { sprintf(upath, "%s%c%s.u%d", env_config(PATH_TAG, PATH_DFLT), PATH_SEP, tdefs[table].name, update); } else /* deletes */ if ( delete_segments ) { ++delete_segment; sprintf(upath, "%s%cdelete.u%d.%d", env_config(PATH_TAG, PATH_DFLT), PATH_SEP, -update%10000, delete_segment); } else { sprintf(upath, "%s%cdelete.%d", env_config(PATH_TAG, PATH_DFLT), PATH_SEP, -update); } return(fopen(upath, "w")); } res = tbl_open(table, "w"); OPEN_CHECK(res, tdefs[table].name); return(res); }
FILE * tbl_open(int tbl, char *mode) { /* char prompt[256]; */ char fullpath[256]; FILE *f; struct stat fstats; int retcode; if (*tdefs[tbl].name == PATH_SEP) strcpy(fullpath, tdefs[tbl].name); else sprintf(fullpath, "%s%c%s", env_config(PATH_TAG, PATH_DFLT), PATH_SEP, tdefs[tbl].name); retcode = stat(fullpath, &fstats); if (retcode && (errno != ENOENT)) { fprintf(stderr, "stat(%s) failed.\n", fullpath); exit(-1); } /*if (S_ISREG(fstats.st_mode) && !force && *mode != 'r' ) { sprintf(prompt, "Do you want to overwrite %s ?", fullpath); if (!yes_no(prompt)) exit(0); } */ if (S_ISFIFO(fstats.st_mode)) { f = fopen(fullpath, mode); } else { retcode = open(fullpath, ((*mode == 'r')?O_RDONLY:O_WRONLY)|O_CREAT, 0664); f = fdopen(retcode, mode); } OPEN_CHECK(f, fullpath); if (header && columnar && tdefs[tbl].header != NULL) tdefs[tbl].header(f); return (f); }
/* * store_state() -- store the data set configuration details so that * appropriate update sets can be generated */ int store_state(long sf, long procs, long step) { FILE *ufp; int i; char fname[256], seed[9]; seed_name(seed, sf, procs, step); sprintf(fname, "%s%c%s", env_config(SEED_TAG, SEED_DFLT), PATH_SEP, seed); ufp = fopen(fname, "w"); OPEN_CHECK(ufp, fname); for (i=0; i <= MAX_STREAM; i++) if (fprintf(ufp, "%ld\n ", Seed[i]) == EOF) return(1); fclose(ufp); return(0); }
/* * load a distribution from a flat file into the target structure; * should be rewritten to allow multiple dists in a file */ void read_dist(char *path, char *name, distribution *target) { FILE *fp; char line[256], token[256], *c; long weight, count = 0, name_set = 0; if (d_path == NULL) { sprintf(line, "%s%c%s", env_config(CONFIG_TAG, CONFIG_DFLT), PATH_SEP, path); fp = fopen(line, "r"); OPEN_CHECK(fp, line); } else { fp = fopen(d_path, "r"); OPEN_CHECK(fp, d_path); } while (fgets(line, sizeof(line), fp) != NULL) { if ((c = strchr(line, '\n')) != NULL) *c = '\0'; if ((c = strchr(line, '#')) != NULL) *c = '\0'; if (*line == '\0') continue; if (!name_set) { if (dsscasecmp(strtok(line, "\n\t "), "BEGIN")) continue; if (dsscasecmp(strtok(NULL, "\n\t "), name)) continue; name_set = 1; continue; } else { if (!dssncasecmp(line, "END", 3)) { fclose(fp); return; } } if (sscanf(line, "%[^|]|%ld", token, &weight) != 2) continue; if (!dsscasecmp(token, "count")) { target->count = weight; target->list = (set_member *) malloc((size_t)(weight * sizeof(set_member))); MALLOC_CHECK(target->list); target->max = 0; continue; } target->list[count].text = (char *) malloc((size_t)(strlen(token) + 1)); MALLOC_CHECK(target->list[count].text); strcpy(target->list[count].text, token); target->max += weight; target->list[count].weight = target->max; count += 1; } /* while fgets() */ if (count != target->count) { fprintf(stderr, "Read error on dist '%s'\n", name); fclose(fp); exit(1); } target->permute = (long *)NULL; fclose(fp); return; }
void varsub(int qnum, int vnum, int flags) { static char param[11][128]; static FILE *lfp = NULL; char *ptr; int i = 0, size[10], tmp_date; if (vnum == 0) { if ((flags & DFLT) == 0) { switch(qnum) { case 1: sprintf(param[1], "%d", UnifInt((long)60,(long)120,(long)qnum)); param[2][0] = '\0'; break; case 2: sprintf(param[1], "%d", UnifInt((long)P_SIZE_MIN, (long)P_SIZE_MAX, qnum)); pick_str(&p_types_set, qnum, param[3]); ptr = param[3] + strlen(param[3]); while (*(ptr - 1) != ' ') ptr--; strcpy(param[2], ptr); pick_str(®ions, qnum, param[3]); param[4][0] = '\0'; break; case 3: pick_str(&c_mseg_set, qnum, param[1]); /* * pick a random offset within the month of march and add the * appropriate magic numbers to position the output functions * at the start of March '95 */ tmp_date = UnifInt((long)0, (long)30, (long)qnum); strcpy(param[2], *(asc_date + tmp_date + 1155)); if (oldtime) { for (i=0; strcmp(*(asc_date + i), param[2]); i++); sprintf(param[2],"%ld", julian(i + STARTDATE)); } param[3][0] = '\0'; break; case 4: tmp_date = UnifInt(1,58,qnum); sprintf(param[1],"19%02d-%02d-01", 93 + tmp_date/12, tmp_date%12 + 1); if (oldtime) { for (i=0; strcmp(*(asc_date + i), param[1]); i++); sprintf(param[1],"%ld", julian(i + STARTDATE)); } param[2][0] = '\0'; break; case 5: pick_str(®ions, qnum, param[1]); tmp_date = UnifInt((long)93,(long)97,(long)qnum); if (oldtime) sprintf(param[2],"%ld", tmp_date); else sprintf(param[2], "19%d-01-01", tmp_date); param[3][0] = '\0'; break; case 6: tmp_date = UnifInt(93,97,qnum); if (oldtime) sprintf(param[1],"%ld001", tmp_date); else sprintf(param[1], "19%d-01-01", tmp_date); sprintf(param[2], "0.0%d", UnifInt(2, 9, qnum)); sprintf(param[3], "%d", UnifInt((long)24, (long)25, (long)qnum)); param[4][0] = '\0'; break; case 7: tmp_date = pick_str(&nations2, qnum, param[1]); while (pick_str(&nations2, qnum, param[2]) == tmp_date); param[3][0] = '\0'; break; case 8: tmp_date = pick_str(&nations2, qnum, param[1]); tmp_date = nations.list[tmp_date].weight; strcpy(param[2], regions.list[tmp_date].text); pick_str(&p_types_set, qnum, param[3]); param[4][0] = '\0'; break; case 9: pick_str(&colors, qnum, param[1]); param[2][0] = '\0'; break; case 10: tmp_date = UnifInt(1,24,qnum); sprintf(param[1],"19%02d-%02d-01", 93 + tmp_date/12, tmp_date%12 + 1); if (oldtime) { for (i=0; strcmp(*(asc_date + i), param[1]); i++); sprintf(param[1],"%ld", julian(i + STARTDATE)); } param[2][0] = '\0'; break; case 11: pick_str(&nations2, qnum, param[1]); sprintf(param[2], "%11.10f", Q11_FRACTION / flt_scale ); param[3][0] = '\0'; break; case 12: tmp_date = pick_str(&l_smode_set, qnum, param[1]); while (tmp_date == pick_str(&l_smode_set, qnum, param[2])); tmp_date = UnifInt(93,97,qnum); if (oldtime) sprintf(param[3],"%d", tmp_date*1000 + 1); else sprintf(param[3], "19%d-01-01", tmp_date); param[4][0] = '\0'; break; case 13: sprintf(param[1], O_CLRK_FMT, O_CLRK_TAG, UnifInt((long)1, (long) MAX((scale * O_CLRK_SCL), O_CLRK_SCL), (long)qnum)); param[2][0] = '\0'; break; case 14: tmp_date = UnifInt(1,60,qnum); sprintf(param[1],"19%02d-%02d-01", 93 + tmp_date/12, tmp_date%12 + 1); if (oldtime) { for (i=0; strcmp(*(asc_date + i), param[1]); i++); sprintf(param[1],"%ld", julian(i + STARTDATE)); } param[2][0] = '\0'; break; case 15: tmp_date = UnifInt(1,58,qnum); sprintf(param[1],"19%02d-%02d-01", 93 + tmp_date/12, tmp_date%12 + 1); if (oldtime) { for (i=0; strcmp(*(asc_date + i), param[1]); i++); sprintf(param[1],"%ld", julian(i + STARTDATE)); } param[2][0] = '\0'; break; case 16: sprintf(param[1], "Brand#%d%d", UnifInt(1, 5, qnum), UnifInt(1, 5, qnum)); pick_str(&p_types_set, qnum, param[2]); ptr = param[2] + strlen(param[2]); while (*(--ptr) != ' '); *ptr = '\0'; i=0; next: size[i] = UnifInt(1, 50, qnum); tmp_date = 0; while (tmp_date < i) if (size[i] == size[tmp_date]) goto next; else tmp_date++; sprintf(param[i + 3], "%d", size[i]); if (++i <= TYPE_CNT) goto next; param[i + 2][0] = '\0'; break; case 17: sprintf(param[1], "Brand#%ld%ld", UnifInt(1, 5, qnum), UnifInt(1, 5, qnum)); pick_str(&p_cntr_set, qnum, param[2]); param[3][0] = '\0'; break; case 18: case 19: break; default: fprintf(stderr, "No variable definitions available for query %d\n", qnum); } } if (flags & LOG) { if (lfp == NULL) { lfp = fopen(lfile, "a"); OPEN_CHECK(lfp, lfile); } fprintf(lfp, "%d", qnum); for (i=1; i <= 10; i++) if (flags & DFLT) { if (defaults[i - 1] == NULL) break; else fprintf(lfp, "\t%s", defaults[i - 1]); } else { if (param[i][0] == '\0') break; else fprintf(lfp, "\t%s", param[i]); } fprintf(lfp, "\n"); } } else { if (flags & DFLT) { /* to allow -d to work at all scale factors */ if (qnum == 11 && vnum == 2) fprintf(ofp, "%11.10f", Q11_FRACTION/flt_scale); else if (defaults[qnum - 1][vnum - 1]) fprintf(ofp, "%s", defaults[qnum - 1][vnum - 1]); else fprintf(stderr, "Bad default request (q: %d, p: %d)\n", qnum, vnum); } else { if (param[vnum]) fprintf(ofp, "%s", param[vnum]); else fprintf(stderr, "Bad parameter request (q: %d, p: %d)\n", qnum, vnum); } } return; }
void varsub(int qnum, int vnum, int flags) { static char param[11][128]; static char formats[23][128]; static FILE *lfp = NULL; static int bInit = 0; long *lptr; char *ptr; int i = 0; DSS_HUGE tmp_date, tmp1, tmp2; if (!bInit) { sprintf(formats[4], "19%s-%s-01", HUGE_DATE_FORMAT, HUGE_DATE_FORMAT); sprintf(formats[5], "19%s-01-01", HUGE_DATE_FORMAT); sprintf(formats[6], "19%s-01-01", HUGE_DATE_FORMAT); sprintf(formats[7], "0.%s", HUGE_DATE_FORMAT); /* used by q6 */ sprintf(formats[10], "19%s-%s-01", HUGE_DATE_FORMAT, HUGE_DATE_FORMAT); sprintf(formats[12], "19%s-01-01", HUGE_DATE_FORMAT); sprintf(formats[14], "19%s-01-01", HUGE_DATE_FORMAT); sprintf(formats[15], "19%s-01-01", HUGE_DATE_FORMAT); sprintf(formats[16], "Brand#%s%s", HUGE_FORMAT, HUGE_FORMAT); sprintf(formats[17], "Brand#%s%s", HUGE_FORMAT, HUGE_FORMAT); sprintf(formats[19], "Brand#%s%s", HUGE_FORMAT, HUGE_FORMAT); sprintf(formats[20], "19%s-01-01", HUGE_DATE_FORMAT); bInit = 1; } if (vnum == 0) { if ((flags & DFLT) == 0) { switch(qnum) { case 1: sprintf(param[1], HUGE_FORMAT, UnifInt((DSS_HUGE)60,(DSS_HUGE)120,qnum)); param[2][0] = '\0'; break; case 2: sprintf(param[1], HUGE_FORMAT, UnifInt((DSS_HUGE)P_SIZE_MIN, (DSS_HUGE)P_SIZE_MAX, qnum)); pick_str(&p_types_set, qnum, param[3]); ptr = param[3] + strlen(param[3]); while (*(ptr - 1) != ' ') ptr--; strcpy(param[2], ptr); pick_str(®ions, qnum, param[3]); param[4][0] = '\0'; break; case 3: pick_str(&c_mseg_set, qnum, param[1]); /* * pick a random offset within the month of march and add the * appropriate magic numbers to position the output functions * at the start of March '95 */ RANDOM(tmp_date, 0, 30, qnum); strcpy(param[2], *(asc_date + tmp_date + 1155)); param[3][0] = '\0'; break; case 4: tmp_date = UnifInt((DSS_HUGE)1,(DSS_HUGE)58,qnum); sprintf(param[1],formats[4], 93 + tmp_date/12, tmp_date%12 + 1); param[2][0] = '\0'; break; case 5: pick_str(®ions, qnum, param[1]); tmp_date = UnifInt((DSS_HUGE)93, (DSS_HUGE)97,qnum); sprintf(param[2], formats[5], tmp_date); param[3][0] = '\0'; break; case 6: tmp_date = UnifInt((DSS_HUGE)93,(DSS_HUGE)97,qnum); sprintf(param[1], formats[6], tmp_date); sprintf(param[2], formats[7], UnifInt((DSS_HUGE)2, (DSS_HUGE)9, qnum)); sprintf(param[3], HUGE_FORMAT, UnifInt((DSS_HUGE)24, (DSS_HUGE)25, qnum)); param[4][0] = '\0'; break; case 7: tmp_date = pick_str(&nations2, qnum, param[1]); while (pick_str(&nations2, qnum, param[2]) == tmp_date); param[3][0] = '\0'; break; case 8: tmp_date = pick_str(&nations2, qnum, param[1]); tmp_date = nations.list[tmp_date].weight; strcpy(param[2], regions.list[tmp_date].text); pick_str(&p_types_set, qnum, param[3]); param[4][0] = '\0'; break; case 9: pick_str(&colors, qnum, param[1]); param[2][0] = '\0'; break; case 10: tmp_date = UnifInt((DSS_HUGE)1,(DSS_HUGE)24,qnum); sprintf(param[1],formats[10], 93 + tmp_date/12, tmp_date%12 + 1); param[2][0] = '\0'; break; case 11: pick_str(&nations2, qnum, param[1]); sprintf(param[2], "%11.10f", Q11_FRACTION / flt_scale ); param[3][0] = '\0'; break; case 12: tmp_date = pick_str(&l_smode_set, qnum, param[1]); while (tmp_date == pick_str(&l_smode_set, qnum, param[2])); tmp_date = UnifInt((DSS_HUGE)93,(DSS_HUGE)97,qnum); sprintf(param[3], formats[12], tmp_date); param[4][0] = '\0'; break; case 13: pick_str(&q13a, qnum, param[1]); pick_str(&q13b, qnum, param[2]); param[3][0] = '\0'; break; case 14: tmp_date = UnifInt((DSS_HUGE)1,(DSS_HUGE)60,qnum); sprintf(param[1],formats[14], 93 + tmp_date/12, tmp_date%12 + 1); param[2][0] = '\0'; break; case 15: tmp_date = UnifInt((DSS_HUGE)1,(DSS_HUGE)58,qnum); sprintf(param[1],formats[15], 93 + tmp_date/12, tmp_date%12 + 1); param[2][0] = '\0'; break; case 16: tmp1 = UnifInt((DSS_HUGE)1, (DSS_HUGE)5, qnum); tmp2 = UnifInt((DSS_HUGE)1, (DSS_HUGE)5, qnum); sprintf(param[1], formats[16], tmp1, tmp2); pick_str(&p_types_set, qnum, param[2]); ptr = param[2] + strlen(param[2]); while (*(--ptr) != ' '); *ptr = '\0'; lptr = &sizes[0]; for (i=3; i <= MAX_PARAM; i++) { sprintf(param[i], "%ld", *permute(lptr,50,qnum) + 1); lptr = (long *)NULL; } break; case 17: tmp1 = UnifInt((DSS_HUGE)1, (DSS_HUGE)5, qnum); tmp2 = UnifInt((DSS_HUGE)1, (DSS_HUGE)5, qnum); sprintf(param[1], formats[17], tmp1, tmp2); pick_str(&p_cntr_set, qnum, param[2]); param[3][0] = '\0'; break; case 18: sprintf(param[1], HUGE_FORMAT, UnifInt((DSS_HUGE)312, (DSS_HUGE)315, qnum)); param[2][0] = '\0'; break; case 19: tmp1 = UnifInt((DSS_HUGE)1, (DSS_HUGE)5, qnum); tmp2 = UnifInt((DSS_HUGE)1, (DSS_HUGE)5, qnum); sprintf(param[1], formats[19], tmp1, tmp2); tmp1 = UnifInt((DSS_HUGE)1, (DSS_HUGE)5, qnum); tmp2 = UnifInt((DSS_HUGE)1, (DSS_HUGE)5, qnum); sprintf(param[2], formats[19], tmp1, tmp2); tmp1 = UnifInt((DSS_HUGE)1, (DSS_HUGE)5, qnum); tmp2 = UnifInt((DSS_HUGE)1, (DSS_HUGE)5, qnum); sprintf(param[3], formats[19], tmp1, tmp2); sprintf(param[4], HUGE_FORMAT, UnifInt((DSS_HUGE)1, (DSS_HUGE)10, qnum)); sprintf(param[5], HUGE_FORMAT, UnifInt((DSS_HUGE)10, (DSS_HUGE)20, qnum)); sprintf(param[6], HUGE_FORMAT, UnifInt((DSS_HUGE)20, (DSS_HUGE)30, qnum)); param[7][0] = '\0'; break; case 20: pick_str(&colors, qnum, param[1]); tmp_date = UnifInt((DSS_HUGE)93,(DSS_HUGE)97,qnum); sprintf(param[2], formats[20], tmp_date); pick_str(&nations2, qnum, param[3]); param[4][0] = '\0'; break; case 21: pick_str(&nations2, qnum, param[1]); param[2][0] = '\0'; break; case 22: lptr = &ccode[0]; for (i=0; i <= 7; i++) { sprintf(param[i+1], "%ld", 10 + *permute(lptr,25, qnum)); lptr = (long *)NULL; } param[8][0] = '\0'; break; case 23: case 24: break; default: fprintf(stderr, "No variable definitions available for query %d\n", qnum); return; } } if (flags & LOG) { if (lfp == NULL) { lfp = fopen(lfile, "a"); OPEN_CHECK(lfp, lfile); } fprintf(lfp, "%d", qnum); for (i=1; i <= 10; i++) if (flags & DFLT) { if (defaults[qnum - 1][i - 1] == NULL) break; else fprintf(lfp, "\t%s", defaults[qnum - 1][i - 1]); } else { if (param[i][0] == '\0') break; else fprintf(lfp, "\t%s", param[i]); } fprintf(lfp, "\n"); } } else { if (flags & DFLT) { /* to allow -d to work at all scale factors */ if (qnum == 11 && vnum == 2) fprintf(ofp, "%11.10f", Q11_FRACTION/flt_scale); else if (defaults[qnum - 1][vnum - 1]) fprintf(ofp, "%s", defaults[qnum - 1][vnum - 1]); else fprintf(stderr, "Bad default request (q: %d, p: %d)\n", qnum, vnum); } else { if (param[vnum] && vnum <= MAX_PARAM) fprintf(ofp, "%s", param[vnum]); else fprintf(stderr, "Bad parameter request (q: %d, p: %d)\n", qnum, vnum); } } return; }
main(int ac, char **av) { int i; FILE *ifp; char line[LINE_SIZE]; prog = av[0]; flt_scale = (double)1.0; flags = 0; d_path = NULL; process_options(ac, av); if (flags & VERBOSE) fprintf(ofp, "-- TPC %s Parameter Substitution (Version %d.%d.%d%s)\n", NAME, VERSION, RELEASE, MODIFICATION, PATCH); setup(); if (!(flags & DFLT)) /* perturb the RNG */ { if (!(flags & SEED)) rndm = (long)((unsigned)time(NULL) * DSS_PROC); if (rndm < 0) rndm += 2147483647; Seed[0].value = rndm; for (i=1; i <= QUERIES_PER_SET; i++) { Seed[0].value = NextRand(Seed[0].value); Seed[i].value = Seed[0].value; } printf("-- using %ld as a seed to the RNG\n", rndm); } else printf("-- using default substitutions\n"); if (flags & INIT) /* init stream with ifile */ { ifp = fopen(ifile, "r"); OPEN_CHECK(ifp, ifile); while (fgets(line, LINE_SIZE, ifp) != NULL) fprintf(stdout, "%s", line); } if (snum >= 0) if (optind < ac) for (i=optind; i < ac; i++) { char qname[10]; sprintf(qname, "%d", SEQUENCE(snum, atoi(av[i]))); qsub(qname, flags); } else for (i=1; i <= QUERIES_PER_SET; i++) { char qname[10]; sprintf(qname, "%d", SEQUENCE(snum, i)); qsub(qname, flags); } else if (optind < ac) for (i=optind; i < ac; i++) qsub(av[i], flags); else for (i=1; i <= QUERIES_PER_SET; i++) { char qname[10]; sprintf(qname, "%d", i); qsub(qname, flags); } if (flags & TERMINATE) /* terminate stream with tfile */ { ifp = fopen(tfile, "r"); if (ifp == NULL) OPEN_CHECK(ifp, tfile); while (fgets(line, LINE_SIZE, ifp) != NULL) fprintf(stdout, "%s", line); } return(0); }
/* * FUNCTION qsub(char *qtag, int flags) * * based on the settings of flags, and the template file $QDIR/qtag.sql * make the following substitutions to turn a query template into EQT * * String Converted to Based on * ====== ============ =========== * first line database <db_name>; -n from command line * second line set explain on; -x from command line * :<number> parameter <number> * :k set number * :o output to outpath/qnum.snum * -o from command line, SET_OUTPUT * :s stream number * :b BEGIN WORK; -a from command line, START_TRAN * :e COMMIT WORK; -a from command line, END_TRAN * :q query number * :n<number> sets rowcount to be returned */ void qsub(char *qtag, int flags) { static char *line = NULL, *qpath = NULL; FILE *qfp; char *cptr, *mark, *qroot = NULL; qnum = atoi(qtag); if (line == NULL) { line = malloc(BUFSIZ); qpath = malloc(BUFSIZ); MALLOC_CHECK(line); MALLOC_CHECK(qpath); } qroot = env_config(QDIR_TAG, QDIR_DFLT); sprintf(qpath, "%s%c%s.sql", qroot, PATH_SEP, qtag); qfp = fopen(qpath, "r"); OPEN_CHECK(qfp, qpath); rowcnt = rowcnt_dflt[qnum]; varsub(qnum, 0, flags); /* set the variables */ if (flags & DFLT_NUM) fprintf(ofp, SET_ROWCOUNT, rowcnt); while (fgets(line, BUFSIZ, qfp) != NULL) { if (!(flags & COMMENT)) strip_comments(line); mark = line; while ((cptr = strchr(mark, VTAG)) != NULL) { *cptr = '\0'; cptr++; fprintf(ofp,"%s", mark); switch(*cptr) { case 'b': case 'B': if (!(flags & ANSI)) fprintf(ofp,"%s\n", START_TRAN); cptr++; break; case 'c': case 'C': if (flags & DBASE) fprintf(ofp, SET_DBASE, db_name); cptr++; break; case 'e': case 'E': if (!(flags & ANSI)) fprintf(ofp,"%s\n", END_TRAN); cptr++; break; case 'n': case 'N': if (!(flags & DFLT_NUM)) { rowcnt=atoi(++cptr); while (isdigit(*cptr) || *cptr == ' ') cptr++; fprintf(ofp, SET_ROWCOUNT, rowcnt); } continue; case 'o': case 'O': if (flags & OUTPUT) fprintf(ofp,"%s '%s/%s.%d'", SET_OUTPUT, osuff, qtag, (snum < 0)?0:snum); cptr++; break; case 'q': case 'Q': fprintf(ofp,"%s", qtag); cptr++; break; case 's': case 'S': fprintf(ofp,"%d", (snum < 0)?0:snum); cptr++; break; case 'X': case 'x': if (flags & EXPLAIN) fprintf(ofp, "%s\n", GEN_QUERY_PLAN); cptr++; break; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': varsub(qnum, atoi(cptr), flags & DFLT); while (isdigit(*++cptr)); break; default: fprintf(stderr, "-- unknown flag '%c%c' ignored\n", VTAG, *cptr); cptr++; break; } mark=cptr; } fprintf(ofp,"%s", mark); } fclose(qfp); fflush(stdout); return; }