| 3190 | // |
| 3191 | |
| 3192 | static void gen_slice( const act* action, const ref* var_reference, int column) |
| 3193 | { |
| 3194 | ObjectNotImplemented(); |
| 3195 | const TEXT* pattern1 = "isc_get_slice (%V1, &%DH, &%RT, &%FR, (short) %N1, \ |
| 3196 | (char*) %I1, (short) %N2, %I1v, %I1s, %S5, &isc_array_length);"; |
| 3197 | const TEXT* pattern2 = "isc_put_slice (%V1, &%DH, &%RT, &%FR, (short) %N1, \ |
| 3198 | (char*) %I1, (short) %N2, %I1v, %I1s, %S5);"; |
| 3199 | |
| 3200 | const gpre_req* request = action->act_request; |
| 3201 | const slc* slice = (slc*) action->act_object; |
| 3202 | const gpre_req* parent_request = slice->slc_parent_request; |
| 3203 | |
| 3204 | // Compute array size |
| 3205 | |
| 3206 | printa(column, "fb_%ds = %d", request->req_ident, slice->slc_field->fld_array->fld_length); |
| 3207 | |
| 3208 | const slc::slc_repeat* tail = slice->slc_rpt; |
| 3209 | for (const slc::slc_repeat* const end = tail + slice->slc_dimensions; tail < end; ++tail) |
| 3210 | { |
| 3211 | if (tail->slc_upper != tail->slc_lower) |
| 3212 | { |
| 3213 | const ref* lower = (ref*) tail->slc_lower->nod_arg[0]; |
| 3214 | const ref* upper = (ref*) tail->slc_upper->nod_arg[0]; |
| 3215 | if (lower->ref_value) |
| 3216 | fprintf(gpreGlob.out_file, " * ( %s - %s + 1)", upper->ref_value, lower->ref_value); |
| 3217 | else |
| 3218 | fprintf(gpreGlob.out_file, " * ( %s + 1)", upper->ref_value); |
| 3219 | } |
| 3220 | } |
| 3221 | |
| 3222 | fprintf(gpreGlob.out_file, ";"); |
| 3223 | |
| 3224 | // Make assignments to variable vector |
| 3225 | |
| 3226 | const ref* reference; |
| 3227 | for (reference = request->req_values; reference; reference = reference->ref_next) |
| 3228 | { |
| 3229 | printa(column, "fb_%dv [%d] = %s;", |
| 3230 | request->req_ident, reference->ref_id, reference->ref_value); |
| 3231 | } |
| 3232 | |
| 3233 | PAT args; |
| 3234 | args.pat_reference = (var_reference ? var_reference : slice->slc_field_ref); |
| 3235 | args.pat_request = parent_request; // blob id request |
| 3236 | args.pat_vector1 = status_vector(action); // status vector |
| 3237 | args.pat_database = parent_request->req_database; // database handle |
| 3238 | args.pat_string1 = action->act_request->req_trans; // transaction handle |
| 3239 | args.pat_value1 = request->req_length; // slice descr. length |
| 3240 | args.pat_ident1 = request->req_ident; // request name |
| 3241 | args.pat_value2 = slice->slc_parameters * sizeof(SLONG); // parameter length |
| 3242 | |
| 3243 | if (!(reference = var_reference)) |
| 3244 | reference = (ref*) slice->slc_array->nod_arg[0]; |
| 3245 | args.pat_string5 = reference->ref_value; // array name |
| 3246 | |
| 3247 | PATTERN_expand((USHORT) column, (action->act_type == ACT_get_slice) ? pattern1 : pattern2, &args); |
| 3248 | |
| 3249 | set_sqlcode(action, column); |
no test coverage detected