#include #include #include #include #include #include "xmim_api.h" #define usage \ fprintf (stderr, "Usage: %s %s\n", argv[0], \ "[-h] [-s] [-l] [-n num_units units] [-q host] [-p server_number] "\ "[-r num_rels relation ...] "\ "[-c n column1 column2 ...] [-d mm/dd/yy] [-e mm/dd/yy] "\ "[-t hh:mm:ss] [-u hh:mm:ss] ") XmimDate pass_date(char* s) { int i = 0; int y, m, d; XmimDate rslt = XMIM_INVALID_DATE; char *t = s, *p = s; while (*t != '/' && *t != '\0') t++; if (*t != '/') return rslt; *t = '\0'; m = atoi(p); t++; p = t; while (*t != '/' && *t != '\0') t++; if (*t != '/') return rslt; *t = '\0'; d = atoi(p); t++; p = t; while (*t != '/' && *t != '\0') t++; if (*t != '\0') return rslt; y = atoi(p); if (y < 1890) { if (y == 0) y = 2000; else if (y < 20) y += 2000; else if (y > 65) y += 1900; } rslt = XmimSetDate(y, m, d); return rslt; } XmimTime pass_time(char* s) { int i = 0; int h = 0, m = 0, ss = 0; XmimTime rslt = XMIM_INVALID_TIME; char *t = s, *p = s; while (*t != ':' && *t != '\0') { if (!isdigit(*t)) return rslt; else t++; } if (*t == '\0') h = atoi(p); else { *t = '\0'; h = atoi(p); t++; p = t; while (*t != ':' && *t != '\0') { if (!isdigit(*t)) return rslt; else t++; } if (*t == '\0') m = atoi(p); else { *t = '\0'; m = atoi(p); t++; p = t; while (*t != '\0') { if (!isdigit(*t)) return rslt; else t++; } ss = atoi(p); } } rslt = XmimSetTime(h, m, ss); return rslt; } int main(int argc, char **argv) { XmimClientHandle handle; XmimDate from_date = XMIM_INVALID_DATE; XmimDate to_date = XMIM_INVALID_DATE; XmimDateTime* dates = NULL; XmimString* cols = NULL; XmimString* rels = NULL; XmimUnits units = XMIM_DAYS; //XMIM_MINUTES; XmimTime from_time = XMIM_INVALID_TIME; XmimTime to_time = XMIM_INVALID_TIME; XmimBoolean all_cols = TRUE; XmimReturnCode rc; int num_recs = 1, i = 0, j = 0 , rec_len = 0 , idx =0; int multiple = 1, port = 0, num_cols =0, num_rels =0; char* host = NULL; float* values = NULL; char c; XmimBoolean print = TRUE; int loop_counter = 1; if (argc < 4) { usage; exit (0); } i = 1; while (i < argc) { c = argv[i][1]; switch (c) { case 'c': all_cols = FALSE; num_cols = atoi(argv[i+1]); i += 2; cols = (char**)malloc((num_cols)*sizeof(char*)); for (j = 0; j < num_cols; j++) cols[j] = argv[i+j]; i += num_cols; break; case 'd': from_date = pass_date(argv[i+1]); i += 2; break; case 'e': to_date = pass_date(argv[i+1]); i += 2; break; case 'h': usage; exit(0); break; case 'n': multiple = atoi(argv[i+1]); i += 2; units = (XmimUnits)atoi(argv[i]); i++; break; case 'p': port = atoi(argv[i+1]); i += 2; break; case 'q': host = argv[i+1]; i += 2; break; case 'r': num_rels = atoi(argv[i+1]); i += 2; rels = (char**)malloc((num_rels)*sizeof(char*)); for (j = 0; j < num_rels; j++) rels[j] = argv[i+j]; i += num_rels; break; case 't': from_time = pass_time(argv[i+1]); i +=2; break; case 'u': to_time = pass_time(argv[i+1]); i +=2; break; case 's': print = 0; /* be silent */ i++; break; case 'l': loop_counter = atoi(argv[i+1]); i += 2; break; default: usage; exit(0); } } if (XmimConnect (host, port, &handle) != XMIM_SUCCESS) { XmimPrintError((char*)"XmimConnect"); exit(-1); } while (loop_counter-- > 0) { if (all_cols) rc = XmimVaGetRecordsAllColumns ( XMIM_CLIENT_HANDLE, handle, XMIM_RELATION_ARRAY, num_rels, rels, XMIM_COLUMN_ARRAY, &num_cols, &cols, XMIM_FROM_DATE, from_date, XMIM_TO_DATE, to_date, XMIM_FROM_TIME, from_time, XMIM_TO_TIME, to_time, XMIM_NUM_RECORDS, &num_recs, XMIM_DATE_TIMES, &dates, XMIM_UNITS, multiple, units, XMIM_VALUES, &values, XMIM_CURRENT_TICK_USAGE, XMIM_APPEND_TO_ALL, XMIM_END_ARGS); else rc = XmimVaGetRecords ( XMIM_CLIENT_HANDLE, handle, XMIM_RELATION_ARRAY, num_rels, rels, XMIM_COLUMN_ARRAY, num_cols, cols, XMIM_FROM_DATE, from_date, XMIM_TO_DATE, to_date, XMIM_FROM_TIME, from_time, XMIM_FILL_OPTION, XMIM_FILL_NAN, XMIM_FILL_NAN, XMIM_SKIP_ALL_NAN, XMIM_TO_TIME, to_time, XMIM_NUM_RECORDS, &num_recs, XMIM_DATE_TIMES, &dates, XMIM_UNITS, multiple, units, XMIM_VALUES, &values, XMIM_CURRENT_TICK_USAGE, XMIM_APPEND_TO_ALL, XMIM_END_ARGS); if (rc != XMIM_SUCCESS) { XmimPrintError((char*)"XmimVaGetRecords"); XmimDisconnect (handle); exit (0); } rec_len = num_cols * num_rels; for (i = 0; print && (i < num_recs); i++) { XmimDate date; XmimTime time; const char *time_string = ""; XmimBoolean do_seconds = FALSE; XmimBoolean do_minutes = FALSE; date.year = dates[i].year; date.month = dates[i].month; date.day = dates[i].day; XmimPrintDate(date); if (units < XMIM_DAYS) { printf(", "); do_minutes = TRUE; if (units <= XMIM_SECONDS) do_seconds = TRUE; time.hour = dates[i].hour; time.minute = dates[i].minute; time.second = dates[i].second; time.millisecond = dates[i].millisecond; time_string = XmimStringTime(time, do_seconds); if (units == XMIM_MILLISECONDS) printf("%s %04d", time_string, dates[i].millisecond); else printf("%s", time_string); } for (j = 0; j < rec_len; j++) { if (XmimTestNaN (handle, values[idx + j])) { printf (", NaN"); } else { printf (", %8.5f", values[idx + j]); } } printf ("\n"); idx += rec_len; } printf("\n"); printf("# Total number of records is: %10d\n", num_recs); } XmimDisconnect (handle); }