2860{
2862
2865
2866
2867
2868
2869
2870
2871
2872
2873
2875 printf(
"FileHistory::read_data: file %s map", s->
fFileName.c_str());
2876 for (
size_t i=0;
i<var_schema_index.size();
i++) {
2877 printf(
" %2d", var_schema_index[
i]);
2878 }
2879 printf("\n");
2880 }
2881
2882 int fd = ::open(s->
fFileName.c_str(), O_RDONLY);
2883 if (fd < 0) {
2884 cm_msg(
MERROR,
"FileHistory::read_data",
"Cannot read \'%s\', open() errno %d (%s)", s->
fFileName.c_str(), errno, strerror(errno));
2886 }
2887
2888 off64_t file_size = ::lseek64(fd, 0, SEEK_END);
2889
2890 if (file_size < 0) {
2891 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));
2894 }
2895
2897
2900 }
2901
2903
2904
2905
2906 if (nrec < 0)
2907 nrec = 0;
2908
2909 if (nrec < 1) {
2912 }
2913
2914 off64_t iunused = 0;
2915 time_t tunused = 0;
2916 off64_t irec = 0;
2917 time_t trec = 0;
2918 time_t tstart = 0;
2919 time_t tend = 0;
2920
2921 int istatus =
FindTime(s->
fFileName.c_str(), fd, s->
fDataOffset, s->
fRecordSize, nrec, start_time, &iunused, &tunused, &irec, &trec, &tstart, &tend, 0*
debug);
2922
2926 }
2927
2929 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());
2930 }
2931
2932 if (irec < 0 || irec >= nrec) {
2933
2934
2936
2938 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());
2939
2941 }
2942
2944
2945
2947
2949
2951 }
2952
2954
2955
2957
2959
2961 }
2962
2963 for (
int i=0;
i<num_var;
i++) {
2964 int si = var_schema_index[
i];
2965 if (si < 0)
2966 continue;
2967
2970
2972
2974 }
2975 }
2976
2978
2980
2981 off64_t xpos = ::lseek64(fd, fpos, SEEK_SET);
2982
2983
2984
2985 if (xpos < 0) {
2986 cm_msg(
MERROR,
"FileHistory::read_data",
"Cannot read \'%s\', lseek64(%jd) errno %d (%s)", s->
fFileName.c_str(), (intmax_t)fpos, errno, strerror(errno));
2989 }
2990
2992
2993 off64_t prec = irec;
2994
2995 while (1) {
2997
2998 if (rd < 0) {
2999 cm_msg(
MERROR,
"FileHistory::read_data",
"Cannot read \'%s\', read() errno %d (%s)", s->
fFileName.c_str(), errno, strerror(errno));
3000 break;
3001 }
3002
3003 if (rd == 0) {
3004
3005 break;
3006 }
3007
3010 break;
3011 }
3012
3013 prec++;
3014
3015 bool past_end_of_last_file = (s->
fTimeTo == 0) && (prec > nrec);
3016
3017 time_t t = *(
DWORD*)buf;
3018
3021
3022 if (t < trec) {
3023 delete[] buf;
3027 }
3028
3029 if (tend && (t > tend) && !past_end_of_last_file) {
3030 delete[] buf;
3034 }
3035
3036 if (t > end_time)
3037 break;
3038
3039 char*
data = buf + 4;
3040
3041 for (
int i=0;
i<num_var;
i++) {
3042 int si = var_schema_index[
i];
3043 if (si < 0)
3044 continue;
3045
3047 delete[] buf;
3049
3051
3053 }
3054
3055 double v = 0;
3057
3058 int ii = var_index[
i];
3059 assert(ii >= 0);
3061
3063 default:
3064
3065 v = 0;
3066 break;
3068 v = ((unsigned char*)ptr)[ii];
3069 break;
3071 v = ((signed char *)ptr)[ii];
3072 break;
3074 v = ((char*)ptr)[ii];
3075 break;
3077 v = ((unsigned short *)ptr)[ii];
3078 break;
3080 v = ((signed short *)ptr)[ii];
3081 break;
3083 v = ((unsigned int *)ptr)[ii];
3084 break;
3086 v = ((int *)ptr)[ii];
3087 break;
3089 v = ((unsigned int *)ptr)[ii];
3090 break;
3092 v = ((float*)ptr)[ii];
3093 break;
3095 v = ((double*)ptr)[ii];
3096 break;
3097 }
3098
3099 buffer[
i]->
Add(t, v);
3101 }
3103 }
3104
3105 delete[] buf;
3106
3108
3110 printf(
"FileHistory::read_data: file %s map", s->
fFileName.c_str());
3111 for (
size_t i=0;
i<var_schema_index.size();
i++) {
3112 printf(
" %2d", var_schema_index[
i]);
3113 }
3114 printf(
" read %d rows\n",
count);
3115 }
3116
3118 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);
3119
3121}
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