MCPcopy Create free account
hub / github.com/FirebirdSQL/firebird / gen_slice

Function gen_slice

src/gpre/obj_cxx.cpp:3192–3252  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

3190//
3191
3192static 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);

Callers 3

OBJ_CXX_actionFunction · 0.70
asgn_fromFunction · 0.70
asgn_toFunction · 0.70

Calls 6

ObjectNotImplementedFunction · 0.85
PATTERN_expandFunction · 0.85
printaFunction · 0.70
status_vectorFunction · 0.70
set_sqlcodeFunction · 0.70
gen_wheneverFunction · 0.70

Tested by

no test coverage detected