50 static int _dsproc_get_fetched_range(
68 !ds->fetched_cds->ngroups) {
75 dataset = ds->fetched_cds->
groups[0];
84 dataset = ds->fetched_cds->
groups[ds->fetched_cds->ngroups - 1];
117 CDSGroup *_dsproc_fetch_dsfile_dataset(
122 const char **var_names,
143 if (!_dsproc_open_dsfile(dsfile, 0)) {
155 "Could not read in netcdf header from: %s\n",
166 dsfile->ncid, start, count, 0, dataset, 0)) {
169 "Could not read in netcdf data from: %s\n",
186 "Could not read in global attributes from: %s\n",
197 dsfile->ncid, NULL, &varid, NULL, NULL, NULL, NULL);
202 "Could not get time variable id from: %s\n",
213 dsfile->ncid, varid, start, &tmp_count, dataset,
214 NULL, 0, NULL, 0, 0, NULL, NULL, NULL, NULL);
219 "Could not read in time variable data from: %s\n",
229 for (vi = 0; vi < nvars; vi++) {
233 dsfile->ncid, var_names[vi], start, &tmp_count, dataset,
234 NULL, 0, NULL, 0, 0, NULL, NULL, NULL, NULL);
236 if (var == (
CDSVar *)-1) {
239 "Could not read in %s variable data from: %s\n",
240 var_names[vi], dsfile->full_path);
247 if (var == (
CDSVar *)NULL) {
250 "Requested variable %s not found in: %s\n",
251 var_names[vi], dsfile->full_path);
271 CDSGroup *_dsproc_fetch_dsfile_dod(DSFile *file)
277 if (!_dsproc_open_dsfile(file, 0)) {
286 "Could not get DOD for file: %s\n"
287 " -> memory allocation error",
297 "Could not get DOD for file: %s\n",
307 "Could not get DOD for file: %s\n",
349 int _dsproc_fetch_dataset(
355 const char **var_names,
372 if ((!begin_timeval || !begin_timeval->tv_sec) &&
373 (!end_timeval || !end_timeval->tv_sec)) {
380 prev_dsfile = (DSFile *)NULL;
384 for (fi = 0; fi < ndsfiles; fi++) {
386 dsfile = dsfiles[fi];
388 if (!dsfile->ntimes) {
392 if (!begin_timeval || !begin_timeval->tv_sec) {
397 dsfile->ntimes, dsfile->timevals, *end_timeval, CDS_LT);
400 prev_dsfile = dsfile;
407 else if (!end_timeval || !end_timeval->tv_sec) {
412 dsfile->ntimes, dsfile->timevals, *begin_timeval, CDS_GT);
415 prev_dsfile = dsfile;
425 dsfile->ntimes, dsfile->timevals, *begin_timeval, CDS_GTEQ);
428 dsfile->ntimes, dsfile->timevals, *end_timeval, CDS_LTEQ);
433 count = end - start + 1;
435 if (!_dsproc_fetch_dsfile_dataset(
436 dsfile, start, count, nvars, var_names, parent)) {
449 if (!_dsproc_fetch_dsfile_dataset(
450 dsfile, prev_start, 1, nvars, var_names, parent)) {
461 nobs = _dsproc_merge_obs(parent);
531 if ((!begin_timeval || !begin_timeval->tv_sec) &&
532 (!end_timeval || !end_timeval->tv_sec)) {
542 max_ntimes = *ntimevals;
547 max_ntimes = dsfiles[0]->ntimes;
549 for (fi = 1; fi < ndsfiles; fi++) {
550 max_ntimes += dsfiles[fi]->ntimes;
557 "Could not fetch times from datastream: %s\n"
558 " -> memory allocation error",
562 *ntimevals = (size_t)-1;
571 for (fi = 0; fi < ndsfiles; fi++) {
573 dsfile = dsfiles[fi];
575 if (!dsfile->ntimes) {
579 if (!begin_timeval || !begin_timeval->tv_sec) {
584 dsfile->ntimes, dsfile->timevals, *end_timeval, CDS_LT);
587 timevals[0] = dsfile->timevals[start];
594 else if (!end_timeval || !end_timeval->tv_sec) {
599 dsfile->ntimes, dsfile->timevals, *begin_timeval, CDS_GT);
602 timevals[0] = dsfile->timevals[start];
612 dsfile->ntimes, dsfile->timevals, *begin_timeval, CDS_GTEQ);
615 dsfile->ntimes, dsfile->timevals, *end_timeval, CDS_LTEQ);
620 for (fti = start; fti <= end; ) {
621 timevals[oti++] = dsfile->timevals[fti++];
622 if (oti == max_ntimes)
break;
625 if (oti == max_ntimes)
break;
632 if (free_timevals) free(timevals);
693 const char **var_names,
697 DataStream *ds =
_DSProc->datastreams[ds_id];
706 char ts1[32], ts2[32];
715 if (begin_timeval) search_begin = *begin_timeval;
716 if (end_timeval) search_end = *end_timeval;
721 else strcpy(ts1,
"N/A");
724 else strcpy(ts2,
"N/A");
727 "%s: Fetching previously stored datasets\n"
728 " - search begin: %s\n"
729 " - search end: %s\n", ds->name, ts1, ts2);
737 if (!search_begin.tv_sec &&
738 !search_end.tv_sec) {
740 if (ds->fetched_cds) {
743 " - returning dataset from previous request\n");
745 *dataset = ds->fetched_cds;
746 return(ds->fetched_cds->ngroups);
751 " - no previous dataset to return\n");
764 if (!_dsproc_get_fetched_range(ds, &data_begin, &data_end)) {
768 (search_begin.tv_sec == 0 || ds->fetch_begin.tv_sec == 0) &&
769 (search_begin.tv_sec != ds->fetch_begin.tv_sec) ) {
774 (search_begin.tv_sec != 0) &&
775 (
TV_LT(search_begin, ds->fetch_begin) ||
776 TV_GT(search_begin, data_begin)) ) {
781 (search_end.tv_sec == 0 || ds->fetch_end.tv_sec == 0) &&
782 (search_end.tv_sec != ds->fetch_end.tv_sec) ) {
787 (search_end.tv_sec != 0) &&
788 (
TV_LT(search_end, data_end) ||
789 TV_GT(search_end, ds->fetch_end)) ) {
793 else if (ds->fetch_nvars != 0) {
799 for (vi = 0; vi < nvars; vi++) {
800 if (!
cds_get_var(ds->fetched_cds, var_names[vi]))
break;
810 _dsproc_free_datastream_fetched_cds(ds);
815 " - returning dataset from previous request\n");
817 *dataset = ds->fetched_cds;
818 return(ds->fetched_cds->ngroups);
825 ndsfiles = _dsproc_find_dsfiles(
826 ds->dir, &search_begin, &search_end, &dsfiles);
832 " - no stored data found for requested range\n");
843 if (!ds->fetched_cds) {
848 nobs = _dsproc_fetch_dataset(
849 ndsfiles, dsfiles, &search_begin, &search_end,
850 nvars, var_names, merge_obs, ds->fetched_cds);
858 " - no stored data found for requested range\n");
861 _dsproc_free_datastream_fetched_cds(ds);
867 _dsproc_get_fetched_range(ds, &data_begin, &data_end);
873 " - data begin: %s\n"
874 " - data end: %s\n", ts1, ts2);
877 ds->fetch_begin = search_begin;
878 ds->fetch_end = search_end;
879 ds->fetch_nvars = nvars;
881 *dataset = ds->fetched_cds;
883 return(ds->fetched_cds->ngroups);
932 DataStream *ds =
_DSProc->datastreams[ds_id];
935 char ts1[32], ts2[32];
939 if (begin_timeval && begin_timeval->tv_sec) {
946 if (end_timeval && end_timeval->tv_sec) {
954 "%s: Fetching times of previously stored data\n"
955 " - search begin: %s\n"
956 " - search end: %s\n", ds->name, ts1, ts2);
963 ndsfiles = _dsproc_find_dsfiles(
964 ds->dir, begin_timeval, end_timeval, &dsfiles);
970 " - no stored data found for requested range\n");
973 *ntimevals = (size_t)ndsfiles;
981 timevals = _dsproc_fetch_timevals(
982 ds, ndsfiles, dsfiles, begin_timeval, end_timeval, ntimevals, timevals);
988 if (*ntimevals == 0) {
990 " - no stored data found for requested range\n");
1002 " - data begin: %s\n"
1003 " - data end: %s\n", ts1, ts2);