time_t rrd_first( int argc, char **argv) { struct optparse_long longopts[] = { {"rraindex", 129, OPTPARSE_REQUIRED}, {"daemon", 'd', OPTPARSE_REQUIRED}, {0}, }; struct optparse options; int opt; int target_rraindex = 0; char *endptr; char *opt_daemon = NULL; optparse_init(&options, argc, argv); while ((opt = optparse_long(&options, longopts, NULL)) != -1) { switch (opt) { case 129: target_rraindex = strtol(options.optarg, &endptr, 0); if (target_rraindex < 0) { rrd_set_error("invalid rraindex number"); return (-1); } break; case 'd': if (opt_daemon != NULL) free (opt_daemon); opt_daemon = strdup(options.optarg); if (opt_daemon == NULL) { rrd_set_error ("strdup failed."); return -1; } break; case '?': rrd_set_error("%s", options.errmsg); return -1; } } if (options.optind >= options.argc) { rrd_set_error("usage rrdtool %s [--rraindex number] [--daemon|-d <addr>] file.rrd", options.argv[0]); return -1; } rrdc_connect (opt_daemon); if (rrdc_is_connected (opt_daemon)) { return rrdc_first(options.argv[options.optind], target_rraindex); } else { return rrd_first_r(options.argv[options.optind], target_rraindex); } }
time_t rrd_first( int argc, char **argv) { int target_rraindex = 0; char *endptr; struct option long_options[] = { {"rraindex", required_argument, 0, 129}, {0, 0, 0, 0} }; optind = 0; opterr = 0; /* initialize getopt */ while (1) { int option_index = 0; int opt; opt = getopt_long(argc, argv, "", long_options, &option_index); if (opt == EOF) break; switch (opt) { case 129: target_rraindex = strtol(optarg, &endptr, 0); if (target_rraindex < 0) { rrd_set_error("invalid rraindex number"); return (-1); } break; default: rrd_set_error("usage rrdtool %s [--rraindex number] file.rrd", argv[0]); return (-1); } } if (optind >= argc) { rrd_set_error("not enough arguments"); return -1; } return (rrd_first_r(argv[optind], target_rraindex)); }
SEXP smartImportRRD(SEXP filenameIn){ time_t first; time_t last; time_t start; time_t end; time_t *startAr; unsigned long curStep; unsigned long ds_cnt; unsigned long step; int rraCnt; int status; int size; int i; int ds; int j; int timeStamp; char **ds_namv; const char *filename; rrd_value_t *data; rraInfo* rraInfoList; rraInfo* rraInfoTmp; rrd_info_t *rrdInfo; SEXP out; SEXP vec; SEXP rraSexpList; SEXP rraNames; SEXP nam; SEXP rowNam; SEXP cls; filename = CHAR(asChar(filenameIn)); if (access(filename, F_OK) == -1) { printf("file does not exist\n"); exit(0); } printf("calling rrd_last\n"); last = rrd_last_r(filename); printf("calling rrd_info\n"); rrdInfo = rrd_info_r(filename); if (rrdInfo == NULL) { printf("getting rrd info failed"); exit(0); } printf("calling getrrainfo\n"); rraInfoList = getRraInfo(rrdInfo, &rraCnt, &step); if (rraInfoList == NULL) { printf("getting rra info failed\n"); free(rrdInfo); exit(0); } printf("rraCnt %d step %d last %d rraInfoList %p\n", rraCnt, step, last, rraInfoList); printRraInfo(rraInfoList); startAr = malloc(rraCnt * sizeof(time_t)); if (startAr == NULL) { printf("memory allocation error"); free(rrdInfo); freeRraInfo(rraInfoList); exit(0); } for (i = 0; i < rraCnt; i++) { startAr[i] = rrd_first_r(filename, i); } rraInfoTmp = rraInfoList; PROTECT(rraNames = allocVector(STRSXP, rraCnt)); PROTECT(cls = allocVector(STRSXP, 1)); // class attribute SET_STRING_ELT(cls, 0, mkChar("data.frame")); out = PROTECT(allocVector(VECSXP, rraCnt)); i = 0; printf("entering loop\n"); while (rraInfoTmp) { start = startAr[i]; end = last; curStep = step * rraInfoTmp->perRow; status = rrd_fetch_r(filename, rraInfoTmp->cf, &start, &end, &curStep, &ds_cnt, &ds_namv, &data); if (status != 0 || data == NULL) { printf("error running rrd_fetch_r\n"); free(rrdInfo); freeRraInfo(rraInfoList); free(startAr); if (data) free(data); if (ds_namv) { for (int k = 0; k < sizeof(ds_namv)/sizeof(char*); k++) { free(ds_namv[k]); } free(ds_namv); } //TODO unprotect how many times? exit(0); } printf("size of data %d start %d end %d step %d ds_cnt %d\n", sizeof(data)/sizeof(rrd_value_t), start, end, curStep, ds_cnt); fflush(stdout); //rrd_fetch does not include start size = (end - start)/curStep - 1; printf("size %d\n", size); rraSexpList = PROTECT(allocVector(VECSXP, ds_cnt + 1)); vec = PROTECT(allocVector(INTSXP, size)); PROTECT(rowNam = allocVector(STRSXP, size)); //rrd_fetch does not include start timeStamp = start + curStep; for (int j = 0; j < size; j++) { INTEGER(vec)[j] = timeStamp; timeStamp += curStep; } printf("setting row names\n"); SET_VECTOR_ELT(rraSexpList, 0, vec); setAttrib(rraSexpList, R_RowNamesSymbol, vec); PROTECT(nam = allocVector(STRSXP, ds_cnt + 1)); SET_STRING_ELT(nam, 0, mkChar("timestamp")); //TODO stick to row/columns convention for (ds = 0; ds < ds_cnt; ds++){ SET_STRING_ELT(nam, ds + 1, mkChar(ds_namv[ds])); vec = PROTECT(allocVector(REALSXP, size)); for (j = 0; j < size; j++){ REAL(vec)[j] = data[ds + j*ds_cnt]; } printf("adding ds vector to data frame\n"); SET_VECTOR_ELT(rraSexpList, ds + 1, vec); } classgets(rraSexpList, cls); namesgets(rraSexpList, nam); printf("adding data frame to out\n"); SET_VECTOR_ELT(out, i, rraSexpList); char rraNameString[80]; char stepString[40]; sprintf(stepString, "%d", curStep); strcpy(rraNameString, rraInfoTmp->cf); strcat(rraNameString, stepString); SET_STRING_ELT(rraNames, i, mkChar(rraNameString)); rraInfoTmp = rraInfoTmp->next; i++; free(data); } setAttrib(out, R_NamesSymbol, rraNames); freeRraInfo(rraInfoList); free(startAr); free(rrdInfo); for (int k = 0; k < sizeof(ds_namv)/sizeof(char*); k++) { free(ds_namv[k]); } free(ds_namv); UNPROTECT((ds_cnt + 2)*rraCnt + 3); return out; }