ATTENTION!!! Keep this method in sync with MsgMetadata::MakeOffsets()
| 438 | |
| 439 | // ATTENTION!!! Keep this method in sync with MsgMetadata::MakeOffsets() |
| 440 | void SQLDAMetadata::assign() |
| 441 | { |
| 442 | if (offsets) |
| 443 | return; // already assigned |
| 444 | |
| 445 | if (sqlda->sqld <= 0) // malformed sqlda? |
| 446 | return; |
| 447 | |
| 448 | count = (USHORT) sqlda->sqld; |
| 449 | speedHackEnabled = true; // May be we are lucky... |
| 450 | ISC_SCHAR* const base = sqlda->sqlvar[0].sqldata; |
| 451 | |
| 452 | offsets = FB_NEW OffsetItem[count]; |
| 453 | for (unsigned i = 0; i < count; i++) |
| 454 | { |
| 455 | const XSQLVAR& var = sqlda->sqlvar[i]; |
| 456 | OffsetItem& it = offsets[i]; |
| 457 | |
| 458 | it.type = var.sqltype; |
| 459 | it.subType = var.sqlsubtype; |
| 460 | it.length = var.sqllen; |
| 461 | it.scale = var.sqlscale; |
| 462 | switch (var.sqltype & ~1) |
| 463 | { |
| 464 | case SQL_TEXT: |
| 465 | case SQL_VARYING: |
| 466 | it.charSet = var.sqlsubtype; |
| 467 | it.subType = 0; |
| 468 | break; |
| 469 | case SQL_BLOB: |
| 470 | it.charSet = var.sqlscale; |
| 471 | it.scale = 0; |
| 472 | break; |
| 473 | default: |
| 474 | it.charSet = 0; |
| 475 | } |
| 476 | // No matter how good or bad is the way data is placed in message buffer, it cannot be changed |
| 477 | // because changing of it on current codebase will completely kill remote module and may be the engine as well |
| 478 | unsigned dtype; |
| 479 | length = fb_utils::sqlTypeToDsc(length, var.sqltype, var.sqllen, |
| 480 | &dtype, NULL /*length*/, &it.offset, &it.indOffset); |
| 481 | if (it.offset != var.sqldata - base || it.indOffset != ((ISC_SCHAR*) (var.sqlind)) - base) |
| 482 | speedHackEnabled = false; // No luck |
| 483 | |
| 484 | if (dtype < DTYPE_TYPE_MAX) |
| 485 | alignment = MAX(alignment, type_alignments[dtype]); |
| 486 | } |
| 487 | } |
| 488 | |
| 489 | unsigned SQLDAMetadata::getMessageLength(CheckStatusWrapper* status) |
| 490 | { |
no test coverage detected