| 569 | } |
| 570 | |
| 571 | void SQLDAMetadata::scatterData(DataBuffer& from) |
| 572 | { |
| 573 | fb_assert(sqlda); |
| 574 | ///fb_assert(offsets); // Not reliable, but still check that input buffer can come from this metadata |
| 575 | |
| 576 | if (speedHackEnabled) |
| 577 | return; // Data is already in user's buffer |
| 578 | |
| 579 | fb_assert(length == from.getCount()); |
| 580 | |
| 581 | for (unsigned i = 0; i < count; i++) |
| 582 | { |
| 583 | const XSQLVAR& var = sqlda->sqlvar[i]; |
| 584 | |
| 585 | if ((var.sqltype & ~1) != SQL_NULL) |
| 586 | { |
| 587 | unsigned len = var.sqllen; |
| 588 | |
| 589 | // Make sure user has specified a data location. |
| 590 | if (!var.sqldata) |
| 591 | { |
| 592 | (Arg::Gds(isc_dsql_sqlda_value_err) << |
| 593 | Arg::Gds(isc_dsql_no_sqldata) << |
| 594 | Arg::Gds(isc_dsql_sqlvar_index) << Arg::Num(i) |
| 595 | ).raise(); |
| 596 | } |
| 597 | |
| 598 | if ((var.sqltype & ~1) == SQL_VARYING) |
| 599 | len += sizeof(SSHORT); |
| 600 | |
| 601 | memcpy(var.sqldata, from.begin() + offsets[i].offset, len); |
| 602 | } |
| 603 | |
| 604 | if (var.sqltype & 1) |
| 605 | { |
| 606 | // Make sure user has specified a location for null indicator. |
| 607 | if (!var.sqlind) |
| 608 | { |
| 609 | (Arg::Gds(isc_dsql_sqlda_value_err) << |
| 610 | Arg::Gds(isc_dsql_no_sqlind) << |
| 611 | Arg::Gds(isc_dsql_sqlvar_index) << Arg::Num(i) |
| 612 | ).raise(); |
| 613 | } |
| 614 | |
| 615 | *var.sqlind = *reinterpret_cast<ISC_SHORT*>(from.begin() + offsets[i].indOffset); |
| 616 | } |
| 617 | } |
| 618 | |
| 619 | } |
| 620 | |
| 621 | UCHAR* SQLDAMetadataLauncher::getBuffer() |
| 622 | { |
no test coverage detected