12 #include "InternalErr.h"
16 #include "HDFCFUtil.h"
17 #include "HDFCFStrField.h"
18 #include "HDF4RequestHandler.h"
25 HDFCFStrField::read ()
28 BESDEBUG(
"h4",
"Coming to HDFCFStrField read "<<endl);
33 string check_pass_fileid_key_str=
"H4.EnablePassFileID";
34 bool check_pass_fileid_key =
false;
35 check_pass_fileid_key = HDFCFUtil::check_beskeys(check_pass_fileid_key_str);
37 bool check_pass_fileid_key = HDF4RequestHandler::get_pass_fileid();
43 vector<int32>offset32;
44 offset32.resize(rank+1);
46 count32.resize(rank+1);
48 step32.resize(rank+1);
65 nelms = format_constraint (&offset[0], &step[0], &count[0]);
69 for (
int i = 0; i < rank; i++) {
70 offset32[i] = (int32) offset[i];
71 count32[i] = (int32) count[i];
72 step32[i] = (int32) step[i];
81 if(
false == is_vdata) {
84 if(
false == check_pass_fileid_key) {
85 sdid = SDstart (
const_cast < char *
>(filename.c_str ()), DFACC_READ);
88 eherr <<
"File " << filename.c_str () <<
" cannot be open.";
89 throw InternalErr (__FILE__, __LINE__, eherr.str ());
97 int32 sdsindex = SDreftoindex (sdid, fieldref);
101 eherr <<
"SDS index " << sdsindex <<
" is not right.";
102 throw InternalErr (__FILE__, __LINE__, eherr.str ());
106 sdsid = SDselect (sdid, sdsindex);
110 eherr <<
"SDselect failed.";
111 throw InternalErr (__FILE__, __LINE__, eherr.str ());
114 int32 dim_sizes[H4_MAX_VAR_DIMS];
115 int32 sds_rank, data_type, n_attrs;
116 char name[H4_MAX_NC_NAME];
118 r = SDgetinfo (sdsid, name, &sds_rank, dim_sizes,
119 &data_type, &n_attrs);
124 eherr <<
"SDgetinfo failed.";
125 throw InternalErr (__FILE__, __LINE__, eherr.str ());
128 if(sds_rank != (rank+1)) {
132 eherr <<
"The rank of string doesn't match with the rank of character array";
133 throw InternalErr (__FILE__, __LINE__, eherr.str ());
137 count32[rank] = dim_sizes[rank];
139 int32 last_dim_size = dim_sizes[rank];
142 val.resize(nelms*count32[rank]);
144 r = SDreaddata (sdsid, &offset32[0], &step32[0], &count32[0], &val[0]);
149 eherr <<
"SDreaddata failed.";
150 throw InternalErr (__FILE__, __LINE__, eherr.str ());
153 vector<string>final_val;
154 final_val.resize(nelms);
155 vector<char> temp_buf;
156 temp_buf.resize(last_dim_size+1);
161 for (
int i = 0; i<nelms;i++) {
162 strncpy(&temp_buf[0],&val[0]+last_dim_size*i,last_dim_size);
163 temp_buf[last_dim_size]=
'\0';
164 final_val[i] = &temp_buf[0];
166 set_value(&final_val[0],nelms);
175 if(
true == check_pass_fileid_key)
179 file_id = Hopen (filename.c_str (), DFACC_READ, 0);
182 eherr <<
"File " << filename.c_str () <<
" cannot be open.";
183 throw InternalErr (__FILE__, __LINE__, eherr.str ());
188 if (Vstart (file_id) < 0) {
191 eherr <<
"This file cannot be open.";
192 throw InternalErr (__FILE__, __LINE__, eherr.str ());
196 int32 vdata_id = VSattach (file_id, fieldref,
"r");
197 if (vdata_id == -1) {
201 eherr <<
"Vdata cannot be attached.";
202 throw InternalErr (__FILE__, __LINE__, eherr.str ());
207 if (VSseek (vdata_id, (int32) offset32[0]) == -1) {
212 eherr <<
"VSseek failed at " << offset32[0];
213 throw InternalErr (__FILE__, __LINE__, eherr.str ());
217 if (VSsetfields (vdata_id, fieldname.c_str ()) == -1) {
222 eherr <<
"VSsetfields failed with the name " << fieldname;
223 throw InternalErr (__FILE__, __LINE__, eherr.str ());
226 int32 vdfelms = fieldorder * count32[0] * step32[0];
232 r = VSread (vdata_id, (uint8 *) &val[0], 1+(count32[0] -1)* step32[0],
240 eherr <<
"VSread failed.";
241 throw InternalErr (__FILE__, __LINE__, eherr.str ());
244 vector<string>final_val;
245 final_val.resize(nelms);
247 vector<char> temp_buf;
248 temp_buf.resize(fieldorder+1);
249 for (
int i = 0; i<nelms;i++) {
250 strncpy(&temp_buf[0],&val[0]+fieldorder*i*step32[0],fieldorder);
251 temp_buf[fieldorder]=
'\0';
252 final_val[i] = &temp_buf[0];
254 set_value(&final_val[0],nelms);
265 HDFCFStrField::format_constraint (
int *offset,
int *step,
int *count)
270 Dim_iter p = dim_begin ();
271 while (p != dim_end ()) {
273 int start = dimension_start (p,
true);
274 int stride = dimension_stride (p,
true);
275 int stop = dimension_stop (p,
true);
280 oss <<
"Array/Grid hyperslab start point "<< start <<
281 " is greater than stop point " << stop <<
".";
282 throw Error(malformed_expr, oss.str());
287 count[id] = ((stop - start) / stride) + 1;
291 "=format_constraint():"
292 <<
"id=" <<
id <<
" offset=" << offset[
id]
293 <<
" step=" << step[
id]
294 <<
" count=" << count[
id]
306 while (p != dim_end ()) {
308 int start = dimension_start (p,
true);
309 int stride = dimension_stride (p,
true);
310 int stop = dimension_stop (p,
true);
314 if (stride < 0 || start < 0 || stop < 0 || start > stop) {
317 oss <<
"Array/Grid hyperslab indices are bad: [" << start <<
318 ":" << stride <<
":" << stop <<
"]";
319 throw Error (malformed_expr, oss.str ());
323 if (start == 0 && stop == 0 && stride == 0) {
324 start = dimension_start (p,
false);
325 stride = dimension_stride (p,
false);
326 stop = dimension_stop (p,
false);
331 count[id] = ((stop - start) / stride) + 1;
335 "=format_constraint():"
336 <<
"id=" <<
id <<
" offset=" << offset[
id]
337 <<
" step=" << step[
id]
338 <<
" count=" << count[
id]