Move parameters from a message to another, validating theirs values.
| 277 | |
| 278 | // Move parameters from a message to another, validating theirs values. |
| 279 | class MessageMoverNode : public CompoundStmtNode |
| 280 | { |
| 281 | public: |
| 282 | MessageMoverNode(MemoryPool& pool, MessageNode* fromMessage, MessageNode* toMessage, |
| 283 | MessageNode* aCheckMessageEof = nullptr) |
| 284 | : CompoundStmtNode(pool), |
| 285 | checkMessageEof(aCheckMessageEof) |
| 286 | { |
| 287 | // Iterate over the format items, except the EOF item. |
| 288 | for (USHORT i = 0; i < (fromMessage->format->fmt_count / 2) * 2; i += 2) |
| 289 | { |
| 290 | ParameterNode* flag = FB_NEW_POOL(pool) ParameterNode(pool); |
| 291 | flag->messageNumber = fromMessage->messageNumber; |
| 292 | flag->message = fromMessage; |
| 293 | flag->argNumber = i + 1; |
| 294 | |
| 295 | ParameterNode* param = FB_NEW_POOL(pool) ParameterNode(pool); |
| 296 | param->messageNumber = fromMessage->messageNumber; |
| 297 | param->message = fromMessage; |
| 298 | param->argNumber = i; |
| 299 | param->argFlag = flag; |
| 300 | |
| 301 | AssignmentNode* assign = FB_NEW_POOL(pool) AssignmentNode(pool); |
| 302 | assign->asgnFrom = param; |
| 303 | statements.add(assign); |
| 304 | |
| 305 | flag = FB_NEW_POOL(pool) ParameterNode(pool); |
| 306 | flag->messageNumber = toMessage->messageNumber; |
| 307 | flag->message = toMessage; |
| 308 | flag->argNumber = i + 1; |
| 309 | |
| 310 | param = FB_NEW_POOL(pool) ParameterNode(pool); |
| 311 | param->messageNumber = toMessage->messageNumber; |
| 312 | param->message = toMessage; |
| 313 | param->argNumber = i; |
| 314 | param->argFlag = flag; |
| 315 | |
| 316 | assign->asgnTo = param; |
| 317 | } |
| 318 | } |
| 319 | |
| 320 | const StmtNode* execute(thread_db* tdbb, Request* request, ExeState* exeState) const override |
| 321 | { |
| 322 | if (checkMessageEof && |
| 323 | request->req_operation == Request::req_evaluate && |
| 324 | (request->req_flags & req_proc_select)) |
| 325 | { |
| 326 | const auto msg = request->getImpure<UCHAR>(checkMessageEof->impureOffset); |
| 327 | const auto eof = (SSHORT*) (msg + (IPTR) checkMessageEof->format->fmt_desc.back().dsc_address); |
| 328 | |
| 329 | if (!*eof) |
| 330 | request->req_operation = Request::req_return; |
| 331 | } |
| 332 | |
| 333 | return CompoundStmtNode::execute(tdbb, request, exeState); |
| 334 | } |
| 335 | |
| 336 | private: |
no outgoing calls
no test coverage detected