~ubuntu-branches/ubuntu/raring/firebird2.5/raring-proposed

« back to all changes in this revision

Viewing changes to src/jrd/dyn_mod.epp

  • Committer: Bazaar Package Importer
  • Author(s): Damyan Ivanov
  • Date: 2011-09-24 14:12:19 UTC
  • mfrom: (15.1.8 sid)
  • Revision ID: james.westby@ubuntu.com-20110924141219-pkxk7486f3d8ut9f
Tags: 2.5.1.26349-0~rc1.ds4-5
* Medium urgency for fixing a serious bug in testing

* Import a patch from upstream SVN fixing problems in poll() usage when
  process receives signals like SIGALRM.
  Closes: #642555 -- segfault in the remote interface when using alarm() in
  the client program

Show diffs side-by-side

added added

removed removed

Lines of Context:
1484
1484
                                DYN_REQUEST(drq_m_prm) = request;
1485
1485
 
1486
1486
                        found = true;
1487
 
                        MODIFY PRM MODIFY FLD
 
1487
 
 
1488
                        if (**ptr == isc_dyn_description)
1488
1489
                        {
1489
 
                                bool onlyDescription = false;
1490
 
 
1491
 
                                if (**ptr == isc_dyn_description)
1492
 
                                {
 
1490
                                MODIFY PRM
1493
1491
                                        ++*ptr;
1494
1492
                                        if (DYN_put_text_blob(gbl, ptr, &PRM.RDB$DESCRIPTION))
1495
1493
                                                PRM.RDB$DESCRIPTION.NULL = FALSE;
1496
1494
                                        else
1497
1495
                                                PRM.RDB$DESCRIPTION.NULL = TRUE;
1498
1496
 
1499
 
                                        if (**ptr == isc_dyn_end)
1500
 
                                                onlyDescription = true;
1501
 
                                }
1502
 
 
1503
 
                                if (!onlyDescription)
 
1497
                                        fb_assert(**ptr == isc_dyn_end)
 
1498
                                END_MODIFY
 
1499
                        }
 
1500
                        else
 
1501
                        {
 
1502
                                MODIFY PRM MODIFY FLD
1504
1503
                                {
1505
1504
                                        PRM.RDB$PARAMETER_NUMBER.NULL = TRUE;
1506
1505
                                        PRM.RDB$PARAMETER_TYPE.NULL = TRUE;
1522
1521
                                        FLD.RDB$COLLATION_ID.NULL = TRUE;
1523
1522
                                        FLD.RDB$CHARACTER_SET_ID.NULL = TRUE;
1524
1523
                                        FLD.RDB$FIELD_PRECISION.NULL = TRUE;
1525
 
                                }
1526
1524
 
1527
 
                                UCHAR verb;
1528
 
                                while ((verb = *(*ptr)++) != isc_dyn_end)
1529
 
                                {
1530
 
                                        switch (verb)
 
1525
                                        UCHAR verb;
 
1526
                                        while ((verb = *(*ptr)++) != isc_dyn_end)
1531
1527
                                        {
1532
 
                                        case isc_dyn_description:
1533
 
                                                if (DYN_put_text_blob(gbl, ptr, &PRM.RDB$DESCRIPTION))
1534
 
                                                        PRM.RDB$DESCRIPTION.NULL = FALSE;
1535
 
                                                else
1536
 
                                                        PRM.RDB$DESCRIPTION.NULL = TRUE;
1537
 
                                                break;
1538
 
 
1539
 
                                        case isc_dyn_prm_number:
1540
 
                                                PRM.RDB$PARAMETER_NUMBER = (SSHORT) DYN_get_number(ptr);
1541
 
                                                PRM.RDB$PARAMETER_NUMBER.NULL = FALSE;
1542
 
                                                break;
1543
 
 
1544
 
                                        case isc_dyn_prm_type:
1545
 
                                                PRM.RDB$PARAMETER_TYPE = (SSHORT) DYN_get_number(ptr);
1546
 
                                                PRM.RDB$PARAMETER_TYPE.NULL = FALSE;
1547
 
                                                break;
1548
 
 
1549
 
                                        case isc_dyn_fld_not_null:
1550
 
                                                if (ENCODE_ODS(dbb->dbb_ods_version, dbb->dbb_minor_original) < ODS_11_1)
1551
 
                                                {
1552
 
                                                        // Feature not supported on ODS version older than %d.%d
1553
 
                                                        ERR_post(Arg::Gds(isc_dsql_feature_not_supported_ods) <<
1554
 
                                                                Arg::Num(11) << Arg::Num(1));
1555
 
                                                }
1556
 
 
1557
 
                                                PRM.RDB$NULL_FLAG = TRUE;
1558
 
                                                PRM.RDB$NULL_FLAG.NULL = FALSE;
1559
 
                                                break;
1560
 
 
1561
 
                                        case isc_dyn_fld_length:
1562
 
                                                FLD.RDB$FIELD_LENGTH = (USHORT) DYN_get_number(ptr);
1563
 
                                                FLD.RDB$FIELD_LENGTH.NULL = FALSE;
1564
 
                                                break;
1565
 
 
1566
 
                                        case isc_dyn_fld_type:
1567
 
                                                FLD.RDB$FIELD_TYPE = (USHORT) DYN_get_number(ptr);
1568
 
                                                FLD.RDB$FIELD_TYPE.NULL = FALSE;
1569
 
 
1570
 
                                                switch (FLD.RDB$FIELD_TYPE)
1571
 
                                                {
1572
 
                                                case blr_short:
1573
 
                                                        FLD.RDB$FIELD_LENGTH = 2;
1574
 
                                                        FLD.RDB$FIELD_LENGTH.NULL = FALSE;
1575
 
                                                        break;
1576
 
 
1577
 
                                                case blr_long:
1578
 
                                                case blr_float:
1579
 
                                                case blr_sql_time:
1580
 
                                                case blr_sql_date:
1581
 
                                                        FLD.RDB$FIELD_LENGTH = 4;
1582
 
                                                        FLD.RDB$FIELD_LENGTH.NULL = FALSE;
1583
 
                                                        break;
1584
 
 
1585
 
                                                case blr_int64:
1586
 
                                                case blr_quad:
1587
 
                                                case blr_timestamp:
1588
 
                                                case blr_double:
1589
 
                                                case blr_d_float:
1590
 
                                                        FLD.RDB$FIELD_LENGTH = 8;
1591
 
                                                        FLD.RDB$FIELD_LENGTH.NULL = FALSE;
 
1528
                                                switch (verb)
 
1529
                                                {
 
1530
                                                case isc_dyn_prm_number:
 
1531
                                                        PRM.RDB$PARAMETER_NUMBER = (SSHORT) DYN_get_number(ptr);
 
1532
                                                        PRM.RDB$PARAMETER_NUMBER.NULL = FALSE;
 
1533
                                                        break;
 
1534
 
 
1535
                                                case isc_dyn_prm_type:
 
1536
                                                        PRM.RDB$PARAMETER_TYPE = (SSHORT) DYN_get_number(ptr);
 
1537
                                                        PRM.RDB$PARAMETER_TYPE.NULL = FALSE;
 
1538
                                                        break;
 
1539
 
 
1540
                                                case isc_dyn_fld_not_null:
 
1541
                                                        if (ENCODE_ODS(dbb->dbb_ods_version, dbb->dbb_minor_original) < ODS_11_1)
 
1542
                                                        {
 
1543
                                                                // Feature not supported on ODS version older than %d.%d
 
1544
                                                                ERR_post(Arg::Gds(isc_dsql_feature_not_supported_ods) <<
 
1545
                                                                        Arg::Num(11) << Arg::Num(1));
 
1546
                                                        }
 
1547
 
 
1548
                                                        PRM.RDB$NULL_FLAG = TRUE;
 
1549
                                                        PRM.RDB$NULL_FLAG.NULL = FALSE;
 
1550
                                                        break;
 
1551
 
 
1552
                                                case isc_dyn_fld_length:
 
1553
                                                        FLD.RDB$FIELD_LENGTH = (USHORT) DYN_get_number(ptr);
 
1554
                                                        FLD.RDB$FIELD_LENGTH.NULL = FALSE;
 
1555
                                                        break;
 
1556
 
 
1557
                                                case isc_dyn_fld_type:
 
1558
                                                        FLD.RDB$FIELD_TYPE = (USHORT) DYN_get_number(ptr);
 
1559
                                                        FLD.RDB$FIELD_TYPE.NULL = FALSE;
 
1560
 
 
1561
                                                        switch (FLD.RDB$FIELD_TYPE)
 
1562
                                                        {
 
1563
                                                        case blr_short:
 
1564
                                                                FLD.RDB$FIELD_LENGTH = 2;
 
1565
                                                                FLD.RDB$FIELD_LENGTH.NULL = FALSE;
 
1566
                                                                break;
 
1567
 
 
1568
                                                        case blr_long:
 
1569
                                                        case blr_float:
 
1570
                                                        case blr_sql_time:
 
1571
                                                        case blr_sql_date:
 
1572
                                                                FLD.RDB$FIELD_LENGTH = 4;
 
1573
                                                                FLD.RDB$FIELD_LENGTH.NULL = FALSE;
 
1574
                                                                break;
 
1575
 
 
1576
                                                        case blr_int64:
 
1577
                                                        case blr_quad:
 
1578
                                                        case blr_timestamp:
 
1579
                                                        case blr_double:
 
1580
                                                        case blr_d_float:
 
1581
                                                                FLD.RDB$FIELD_LENGTH = 8;
 
1582
                                                                FLD.RDB$FIELD_LENGTH.NULL = FALSE;
 
1583
                                                                break;
 
1584
 
 
1585
                                                        default:
 
1586
                                                                if (FLD.RDB$FIELD_TYPE == blr_blob)
 
1587
                                                                {
 
1588
                                                                        FLD.RDB$FIELD_LENGTH = 8;
 
1589
                                                                        FLD.RDB$FIELD_LENGTH.NULL = FALSE;
 
1590
                                                                }
 
1591
                                                                break;
 
1592
                                                        }
 
1593
                                                        break;
 
1594
 
 
1595
                                                case isc_dyn_fld_scale:
 
1596
                                                        FLD.RDB$FIELD_SCALE = (SSHORT) DYN_get_number(ptr);
 
1597
                                                        FLD.RDB$FIELD_SCALE.NULL = FALSE;
 
1598
                                                        break;
 
1599
 
 
1600
                                                case isc_dyn_fld_precision:
 
1601
                                                        FLD.RDB$FIELD_PRECISION = (SSHORT) DYN_get_number(ptr);
 
1602
                                                        FLD.RDB$FIELD_PRECISION.NULL = FALSE;
 
1603
                                                        break;
 
1604
 
 
1605
                                                case isc_dyn_fld_sub_type:
 
1606
                                                        FLD.RDB$FIELD_SUB_TYPE = (SSHORT) DYN_get_number(ptr);
 
1607
                                                        FLD.RDB$FIELD_SUB_TYPE.NULL = FALSE;
 
1608
                                                        break;
 
1609
 
 
1610
                                                case isc_dyn_fld_char_length:
 
1611
                                                        FLD.RDB$CHARACTER_LENGTH = (USHORT) DYN_get_number(ptr);
 
1612
                                                        FLD.RDB$CHARACTER_LENGTH.NULL = FALSE;
 
1613
                                                        break;
 
1614
 
 
1615
                                                case isc_dyn_fld_character_set:
 
1616
                                                        FLD.RDB$CHARACTER_SET_ID = (SSHORT) DYN_get_number(ptr);
 
1617
                                                        FLD.RDB$CHARACTER_SET_ID.NULL = FALSE;
 
1618
                                                        break;
 
1619
 
 
1620
                                                case isc_dyn_fld_collation:
 
1621
                                                        FLD.RDB$COLLATION_ID = (SSHORT) DYN_get_number(ptr);
 
1622
                                                        FLD.RDB$COLLATION_ID.NULL = FALSE;
 
1623
                                                        break;
 
1624
 
 
1625
                                                case isc_dyn_fld_segment_length:
 
1626
                                                        FLD.RDB$SEGMENT_LENGTH = (USHORT) DYN_get_number(ptr);
 
1627
                                                        FLD.RDB$SEGMENT_LENGTH.NULL = FALSE;
 
1628
                                                        break;
 
1629
 
 
1630
                                                case isc_dyn_fld_default_value:
 
1631
                                                        DYN_put_blr_blob(gbl, ptr, &FLD.RDB$DEFAULT_VALUE);
 
1632
                                                        FLD.RDB$DEFAULT_VALUE.NULL = FALSE;
 
1633
                                                        break;
 
1634
 
 
1635
                                                case isc_dyn_fld_default_source:
 
1636
                                                        DYN_put_text_blob(gbl, ptr, &FLD.RDB$DEFAULT_SOURCE);
 
1637
                                                        FLD.RDB$DEFAULT_SOURCE.NULL = FALSE;
 
1638
                                                        break;
 
1639
 
 
1640
                                                case isc_dyn_prm_mechanism:
 
1641
                                                        PRM.RDB$PARAMETER_MECHANISM = (prm_mech_t) DYN_get_number(ptr);
 
1642
                                                        PRM.RDB$PARAMETER_MECHANISM.NULL = FALSE;
1592
1643
                                                        break;
1593
1644
 
1594
1645
                                                default:
1595
 
                                                        if (FLD.RDB$FIELD_TYPE == blr_blob)
1596
 
                                                        {
1597
 
                                                                FLD.RDB$FIELD_LENGTH = 8;
1598
 
                                                                FLD.RDB$FIELD_LENGTH.NULL = FALSE;
1599
 
                                                        }
1600
 
                                                        break;
 
1646
                                                        DYN_unsupported_verb();
1601
1647
                                                }
1602
 
                                                break;
1603
 
 
1604
 
                                        case isc_dyn_fld_scale:
1605
 
                                                FLD.RDB$FIELD_SCALE = (SSHORT) DYN_get_number(ptr);
1606
 
                                                FLD.RDB$FIELD_SCALE.NULL = FALSE;
1607
 
                                                break;
1608
 
 
1609
 
                                        case isc_dyn_fld_precision:
1610
 
                                                FLD.RDB$FIELD_PRECISION = (SSHORT) DYN_get_number(ptr);
1611
 
                                                FLD.RDB$FIELD_PRECISION.NULL = FALSE;
1612
 
                                                break;
1613
 
 
1614
 
                                        case isc_dyn_fld_sub_type:
1615
 
                                                FLD.RDB$FIELD_SUB_TYPE = (SSHORT) DYN_get_number(ptr);
1616
 
                                                FLD.RDB$FIELD_SUB_TYPE.NULL = FALSE;
1617
 
                                                break;
1618
 
 
1619
 
                                        case isc_dyn_fld_char_length:
1620
 
                                                FLD.RDB$CHARACTER_LENGTH = (USHORT) DYN_get_number(ptr);
1621
 
                                                FLD.RDB$CHARACTER_LENGTH.NULL = FALSE;
1622
 
                                                break;
1623
 
 
1624
 
                                        case isc_dyn_fld_character_set:
1625
 
                                                FLD.RDB$CHARACTER_SET_ID = (SSHORT) DYN_get_number(ptr);
1626
 
                                                FLD.RDB$CHARACTER_SET_ID.NULL = FALSE;
1627
 
                                                break;
1628
 
 
1629
 
                                        case isc_dyn_fld_collation:
1630
 
                                                FLD.RDB$COLLATION_ID = (SSHORT) DYN_get_number(ptr);
1631
 
                                                FLD.RDB$COLLATION_ID.NULL = FALSE;
1632
 
                                                break;
1633
 
 
1634
 
                                        case isc_dyn_fld_segment_length:
1635
 
                                                FLD.RDB$SEGMENT_LENGTH = (USHORT) DYN_get_number(ptr);
1636
 
                                                FLD.RDB$SEGMENT_LENGTH.NULL = FALSE;
1637
 
                                                break;
1638
 
 
1639
 
                                        case isc_dyn_fld_default_value:
1640
 
                                                DYN_put_blr_blob(gbl, ptr, &FLD.RDB$DEFAULT_VALUE);
1641
 
                                                FLD.RDB$DEFAULT_VALUE.NULL = FALSE;
1642
 
                                                break;
1643
 
 
1644
 
                                        case isc_dyn_fld_default_source:
1645
 
                                                DYN_put_text_blob(gbl, ptr, &FLD.RDB$DEFAULT_SOURCE);
1646
 
                                                FLD.RDB$DEFAULT_SOURCE.NULL = FALSE;
1647
 
                                                break;
1648
 
 
1649
 
                                        case isc_dyn_prm_mechanism:
1650
 
                                                PRM.RDB$PARAMETER_MECHANISM = (prm_mech_t) DYN_get_number(ptr);
1651
 
                                                PRM.RDB$PARAMETER_MECHANISM.NULL = FALSE;
1652
 
                                                break;
1653
 
 
1654
 
                                        default:
1655
 
                                                DYN_unsupported_verb();
1656
1648
                                        }
1657
1649
                                }
 
1650
                                END_MODIFY END_MODIFY
1658
1651
                        }
1659
 
                        END_MODIFY END_MODIFY
1660
1652
                }
1661
 
                END_FOR;
 
1653
                END_FOR
1662
1654
 
1663
1655
                if (!DYN_REQUEST(drq_m_prm))
1664
1656
                        DYN_REQUEST(drq_m_prm) = request;
1665
1657
        }
1666
 
        catch (const Exception& ex) {
 
1658
        catch (const Exception& ex)
 
1659
        {
1667
1660
                stuff_exception(tdbb->tdbb_status_vector, ex);
1668
1661
                DYN_rundown_request(request, -1);
1669
1662
                DYN_error_punt(true, 100);