| 1616 | } // end of SetValue; |
| 1617 | |
| 1618 | PBVAL BJSON::SetValue(PBVAL vlp, PVAL valp) |
| 1619 | { |
| 1620 | if (!vlp) |
| 1621 | vlp = NewVal(); |
| 1622 | |
| 1623 | if (!valp || valp->IsNull()) { |
| 1624 | vlp->Type = TYPE_NULL; |
| 1625 | } else switch (valp->GetType()) { |
| 1626 | case TYPE_DATE: |
| 1627 | if (((DTVAL*)valp)->IsFormatted()) |
| 1628 | vlp->To_Val = DupStr(valp->GetCharValue()); |
| 1629 | else { |
| 1630 | char buf[32]; |
| 1631 | |
| 1632 | vlp->To_Val = DupStr(valp->GetCharString(buf)); |
| 1633 | } // endif Formatted |
| 1634 | |
| 1635 | vlp->Type = TYPE_DTM; |
| 1636 | break; |
| 1637 | case TYPE_STRING: |
| 1638 | vlp->To_Val = DupStr(valp->GetCharValue()); |
| 1639 | vlp->Type = TYPE_STRG; |
| 1640 | break; |
| 1641 | case TYPE_DOUBLE: |
| 1642 | case TYPE_DECIM: |
| 1643 | { double d = valp->GetFloatValue(); |
| 1644 | int nd = (IsTypeNum(valp->GetType())) ? valp->GetValPrec() : 0; |
| 1645 | |
| 1646 | if (nd > 0 && nd <= 6 && d >= FLT_MIN && d <= FLT_MAX) { |
| 1647 | vlp->F = (float)valp->GetFloatValue(); |
| 1648 | vlp->Type = TYPE_FLOAT; |
| 1649 | } else { |
| 1650 | double* dp = (double*)BsonSubAlloc(sizeof(double)); |
| 1651 | |
| 1652 | *dp = d; |
| 1653 | vlp->To_Val = MOF(dp); |
| 1654 | vlp->Type = TYPE_DBL; |
| 1655 | } // endif Nd |
| 1656 | |
| 1657 | vlp->Nd = MY_MIN(nd, 16); |
| 1658 | } break; |
| 1659 | case TYPE_TINY: |
| 1660 | vlp->B = valp->GetTinyValue() != 0; |
| 1661 | vlp->Type = TYPE_BOOL; |
| 1662 | break; |
| 1663 | case TYPE_INT: |
| 1664 | vlp->N = valp->GetIntValue(); |
| 1665 | vlp->Type = TYPE_INTG; |
| 1666 | break; |
| 1667 | case TYPE_BIGINT: |
| 1668 | if (valp->GetBigintValue() >= INT_MIN32 && |
| 1669 | valp->GetBigintValue() <= INT_MAX32) { |
| 1670 | vlp->N = valp->GetIntValue(); |
| 1671 | vlp->Type = TYPE_INTG; |
| 1672 | } else { |
| 1673 | longlong* llp = (longlong*)BsonSubAlloc(sizeof(longlong)); |
| 1674 | |
| 1675 | *llp = valp->GetBigintValue(); |
nothing calls this directly
no test coverage detected