2883{
2885
2888
2889
2890
2891
2892
2893
2894
2895
2896
2898 printf(
"FileHistory::read_data: file %s map", s->
fFileName.c_str());
2899 for (
size_t i=0;
i<var_schema_index.size();
i++) {
2900 printf(
" %2d", var_schema_index[
i]);
2901 }
2902 printf("\n");
2903 }
2904
2905 int fd = ::open(s->
fFileName.c_str(), O_RDONLY);
2906 if (fd < 0) {
2907 cm_msg(
MERROR,
"FileHistory::read_data",
"Cannot read \'%s\', open() errno %d (%s)", s->
fFileName.c_str(), errno, strerror(errno));
2909 }
2910
2911 off64_t file_size = ::lseek64(fd, 0, SEEK_END);
2912
2913 if (file_size < 0) {
2914 cm_msg(
MERROR,
"FileHistory::read_data",
"Cannot read file size of \'%s\', lseek64(SEEK_END) errno %d (%s)", s->
fFileName.c_str(), errno, strerror(errno));
2917 }
2918
2920
2923 }
2924
2926
2927
2928
2929 if (nrec < 0)
2930 nrec = 0;
2931
2932 if (nrec < 1) {
2935 }
2936
2937 off64_t iunused = 0;
2938 time_t tunused = 0;
2939 off64_t irec = 0;
2940 time_t trec = 0;
2941 time_t tstart = 0;
2942 time_t tend = 0;
2943
2944 int istatus =
FindTime(s->
fFileName.c_str(), fd, s->
fDataOffset, s->
fRecordSize, nrec, start_time, &iunused, &tunused, &irec, &trec, &tstart, &tend, 0*
debug);
2945
2949 }
2950
2952 printf(
"FindTime %d, nrec %jd, (%jd, %s) (%jd, %s), tstart %s, tend %s, want %s\n", istatus, (intmax_t)nrec, (intmax_t)iunused,
TimeToString(tunused).c_str(), (intmax_t)irec,
TimeToString(trec).c_str(),
TimeToString(tstart).c_str(),
TimeToString(tend).c_str(),
TimeToString(start_time).c_str());
2953 }
2954
2955 if (irec < 0 || irec >= nrec) {
2956
2957
2959
2961 printf(
"FileHistory::read: file %s, schema time %s..%s, read time %s..%s, file time %s..%s, data in this file is too old\n", s->
fFileName.c_str(),
TimeToString(s->
fTimeFrom).c_str(),
TimeToString(s->
fTimeTo).c_str(),
TimeToString(start_time).c_str(),
TimeToString(end_time).c_str(),
TimeToString(tstart).c_str(),
TimeToString(tend).c_str());
2962
2964 }
2965
2967
2968
2970
2972
2974 }
2975
2977
2978
2980
2982
2984 }
2985
2986 for (
int i=0;
i<num_var;
i++) {
2987 int si = var_schema_index[
i];
2988 if (si < 0)
2989 continue;
2990
2993
2995
2997 }
2998 }
2999
3001
3003
3004 off64_t xpos = ::lseek64(fd, fpos, SEEK_SET);
3005
3006
3007
3008 if (xpos < 0) {
3009 cm_msg(
MERROR,
"FileHistory::read_data",
"Cannot read \'%s\', lseek64(%jd) errno %d (%s)", s->
fFileName.c_str(), (intmax_t)fpos, errno, strerror(errno));
3012 }
3013
3015
3016 off64_t prec = irec;
3017
3018 while (1) {
3020
3021 if (rd < 0) {
3022 cm_msg(
MERROR,
"FileHistory::read_data",
"Cannot read \'%s\', read() errno %d (%s)", s->
fFileName.c_str(), errno, strerror(errno));
3023 break;
3024 }
3025
3026 if (rd == 0) {
3027
3028 break;
3029 }
3030
3033 break;
3034 }
3035
3036 prec++;
3037
3038 bool past_end_of_last_file = (s->
fTimeTo == 0) && (prec > nrec);
3039
3040 time_t t = *(
DWORD*)buf;
3041
3044
3045 if (t < trec) {
3046 delete[] buf;
3050 }
3051
3052 if (tend && (t > tend) && !past_end_of_last_file) {
3053 delete[] buf;
3057 }
3058
3059 if (t > end_time)
3060 break;
3061
3062 char*
data = buf + 4;
3063
3064 for (
int i=0;
i<num_var;
i++) {
3065 int si = var_schema_index[
i];
3066 if (si < 0)
3067 continue;
3068
3070 delete[] buf;
3072
3074
3076 }
3077
3078 double v = 0;
3080
3081 int ii = var_index[
i];
3082 assert(ii >= 0);
3084
3086 default:
3087
3088 v = 0;
3089 break;
3091 v = ((unsigned char*)ptr)[ii];
3092 break;
3094 v = ((signed char *)ptr)[ii];
3095 break;
3097 v = ((char*)ptr)[ii];
3098 break;
3100 v = ((unsigned short *)ptr)[ii];
3101 break;
3103 v = ((signed short *)ptr)[ii];
3104 break;
3106 v = ((unsigned int *)ptr)[ii];
3107 break;
3109 v = ((int *)ptr)[ii];
3110 break;
3112 v = ((unsigned int *)ptr)[ii];
3113 break;
3115 v = ((float*)ptr)[ii];
3116 break;
3118 v = ((double*)ptr)[ii];
3119 break;
3120 }
3121
3122 buffer[
i]->
Add(t, v);
3124 }
3126 }
3127
3128 delete[] buf;
3129
3131
3133 printf(
"FileHistory::read_data: file %s map", s->
fFileName.c_str());
3134 for (
size_t i=0;
i<var_schema_index.size();
i++) {
3135 printf(
" %2d", var_schema_index[
i]);
3136 }
3137 printf(
" read %d rows\n",
count);
3138 }
3139
3141 printf(
"FileHistory::read: file %s, schema time %s..%s, read time %s..%s, %d vars, read %d rows\n", s->
fFileName.c_str(),
TimeToString(s->
fTimeFrom).c_str(),
TimeToString(s->
fTimeTo).c_str(),
TimeToString(start_time).c_str(),
TimeToString(end_time).c_str(), num_var,
count);
3142
3144}
virtual void Add(time_t time, double value)=0
INT cm_msg(INT message_type, const char *filename, INT line, const char *routine, const char *format,...)
static int FindTime(const char *file_name, int fd, off64_t offset, size_t recsize, off64_t nrec, time_t timestamp, off64_t *i1p, time_t *t1p, off64_t *i2p, time_t *t2p, time_t *tstart, time_t *tend, int debug)
BOOL debug
debug printouts