Beispiel #1
0
DB_STATUS
qel_c6_ldb_tables(
QEF_RCB		    *v_qer_p,
QEC_LINK	    *v_lnk_p )
{
    DB_STATUS		status;
    DD_2LDB_TAB_INFO	*tabinfo_p = v_lnk_p->qec_1_ddl_info_p->
			    qed_d6_tab_info_p;
    DD_LDB_DESC		*ldb_p = v_lnk_p->qec_19_ldb_p;
    QEQ_1CAN_QRY	*sel_p = v_lnk_p->qec_6_select_p;
    QEC_L16_TABLES	*tables_p = v_lnk_p->qec_9_tables_p;



    /* 1.  set up for retrieving from IITABLES */

    MEcopy(tabinfo_p->dd_t1_tab_name, DB_TAB_MAXNAME, 
	tables_p->l16_1_tab_name);
    MEcopy(tabinfo_p->dd_t2_tab_owner, DB_OWN_MAXNAME, 
	tables_p->l16_2_tab_owner);
/*    if (v_qer_p->qef_r3_ddb_req.qer_d13_ctl_info & QEF_06_REG_PROC) */
    if (v_qer_p->qef_r3_ddb_req.qer_d7_ddl_info.qed_d6_tab_info_p->
	dd_t3_tab_type == DD_5OBJ_REG_PROC
       )
        sel_p->qeq_c1_can_id = SEL_118_II_PROCEDURES;
    else
	sel_p->qeq_c1_can_id = SEL_117_II_TABLES;
    sel_p->qeq_c2_rqf_bind_p = v_lnk_p->qec_20_rqf_bind_p;
    sel_p->qeq_c3_ptr_u.l16_tables_p = tables_p;
    sel_p->qeq_c4_ldb_p = ldb_p;
    sel_p->qeq_c5_eod_b = FALSE;
    sel_p->qeq_c6_col_cnt = 0;

    /* 2.  generate and send retrieve query */

    status = qel_s4_prepare(v_qer_p, v_lnk_p);
    if (status)
	return(status);

    if (! sel_p->qeq_c5_eod_b)
	status = qel_s3_flush(v_qer_p, v_lnk_p);

    if (v_lnk_p->qec_27_select_cnt == 0)
    {
	if ((v_lnk_p->qec_10_haves & ~QEC_03_INGRES)
	    &&
	    (tabinfo_p->dd_t3_tab_type == DD_4OBJ_INDEX))
	    v_lnk_p->qec_10_haves |= QEC_08_NO_IITABLES;
	else
	    status = qed_u2_set_interr(
			E_QE0902_NO_LDB_TAB_ON_CRE_LINK,
			& v_qer_p->error);
    }

    return(status);
}
Beispiel #2
0
DB_STATUS
qet_t6_ddl_cc(
QEF_RCB         *v_qer_p)
{
    DB_STATUS	    status= E_DB_OK;
    QEF_CB	    *qef_cb = v_qer_p->qef_cb;
    QEF_DDB_REQ	    *ddr_p = & v_qer_p->qef_r3_ddb_req;
    QES_DDB_SES	    *dds_p = & v_qer_p->qef_cb->qef_c2_ddb_ses;
    TPR_CB	    tpr_cb,
		    *tpr_p = & tpr_cb;


    /* make sure that this is a legal QEF call */

    if (qef_cb->qef_stat != QEF_NOTRAN)
    {
        status = qed_u2_set_interr(
		    E_QE0962_DDL_CC_ON_XACTION, & v_qer_p->error);
        return (E_DB_WARN);			/* a warning */
    }

    MEfill(sizeof(tpr_cb), '\0', (PTR) & tpr_cb);
    tpr_p->tpr_session = dds_p->qes_d2_tps_p;	/* TPF session cb ptr */
    tpr_p->tpr_rqf = dds_p->qes_d3_rqs_p;	/* RQF session cb ptr */

    if (ddr_p->qer_d12_ddl_concur_on_b == QEF_ON)
    {
	dds_p->qes_d9_ctl_info |= QES_01CTL_DDL_CONCURRENCY_ON;
	status = qed_u17_tpf_call(TPF_1T_DDL_CC, tpr_p, v_qer_p);
    }
    else
    {
	dds_p->qes_d9_ctl_info &= ~QES_01CTL_DDL_CONCURRENCY_ON;
	status = qed_u17_tpf_call(TPF_0F_DDL_CC, tpr_p, v_qer_p);
    }

    return(status);
}
Beispiel #3
0
DB_STATUS
qee_d3_agg(
    QEF_RCB		*qef_rcb,
    QEE_DSH		*dsh,
    ULM_RCB		*ulm)
{
    DB_STATUS	    status = E_DB_OK;
    QEF_QP_CB	    *qp_p = dsh->dsh_qp_ptr;
    QEQ_DDQ_CB	    *ddq_p = & qp_p->qp_ddq_cb;
    QEE_DDB_CB	    *qee_p = dsh->dsh_ddb_cb;
    QEQ_D1_QRY	    *sub_p;
    DB_DATA_VALUE   *dv1_p, *dv2_p;



    if (ddq_p->qeq_d4_total_cnt == 0)
        return(E_DB_OK);			/* no aggregate actions */

    qee_p->qee_d6_dynamic_cnt =
        ddq_p->qeq_d4_total_cnt - ddq_p->qeq_d5_fixed_cnt;

    /* 1.  allocate array for DB_DATA_VALUEs */

    ulm->ulm_psize = (ddq_p->qeq_d4_total_cnt + 1) * sizeof(DB_DATA_VALUE);
    /* 1-based */
    if (status = qec_malloc(ulm))
    {
        qef_rcb->error.err_code = ulm->ulm_error.err_code;
        qed_u10_trap();
        return(status);
    }

    qee_p->qee_d7_dv_p = (DB_DATA_VALUE *) ulm->ulm_pptr;
    /* ptr to array */

    /* 2.  copy user's parameters if any */

    if (ddq_p->qeq_d5_fixed_cnt > 0)
    {
        i4		    m;


        dv1_p = ddq_p->qeq_d6_fixed_data;
        dv2_p = qee_p->qee_d7_dv_p + 1;		/* 1-based */

        for (m = 0; m < ddq_p->qeq_d5_fixed_cnt; ++m)
        {
            STRUCT_ASSIGN_MACRO(*dv1_p, *dv2_p);
            ++dv1_p;
            ++dv2_p;
        }
    }

    if (qee_p->qee_d6_dynamic_cnt > 0)
    {
        QEF_AHD	    *act_p = qp_p->qp_ahd;
        i4	    maxbind = 0,
                aggcnt,
                ptrcnt,
                i, j;
        char	    **pp;


        /* 3.  allocate space for array of ptrs to aggregate spaces */

        ptrcnt = ddq_p->qeq_d4_total_cnt + 1;
        ulm->ulm_psize = ptrcnt * sizeof(char *);
        /* extra ptr space for safety */
        if (status = qec_malloc(ulm))
        {
            qef_rcb->error.err_code = ulm->ulm_error.err_code;
            qed_u10_trap();
            return(status);
        }

        qee_p->qee_d8_attr_pp = (char **) ulm->ulm_pptr;
        /* ptr to ptrs to attribute space */
        pp = qee_p->qee_d8_attr_pp;
        for (i = 0; i < ptrcnt; i++, pp++)
            *pp = (char *) NULL;

        pp = qee_p->qee_d8_attr_pp + 1;	/* initialize as 1-based */

        /* 4.  traverse the action list to allocate space for aggregates */

        aggcnt = 0;
        for (i = 0; i < qp_p->qp_ahd_cnt && act_p; ++i)
        {
            char	    *attr_p;
            i4		     curaggsize = 0;


            if (act_p->ahd_atype == QEA_D6_AGG)
            {

                /* 5.  allocate space to hold intermediate results
                **     for current aggregate action */

                sub_p = & act_p->qhd_obj.qhd_d1_qry;
                if (sub_p->qeq_q6_col_cnt > maxbind)
                    maxbind = sub_p->qeq_q6_col_cnt;
                /* record maximum bind space */
                aggcnt += sub_p->qeq_q6_col_cnt;

                ulm->ulm_psize = sub_p->qeq_q10_agg_size;
                if (status = qec_malloc(ulm))
                {
                    qef_rcb->error.err_code = ulm->ulm_error.err_code;
                    qed_u10_trap();
                    return(status);
                }

                *pp = (char *) ulm->ulm_pptr;
                /* set ptr to attribute space */
                /* 6.  set up DB_DATA_VALUE ptr for current aggregate action */

                dv1_p = sub_p->qeq_q9_dv_p;
                /* ptr to expected DB_DATA_VALUEs */
                dv2_p = qee_p->qee_d7_dv_p + sub_p->qeq_q11_dv_offset;
                /* ptr into DB_DATA_VALUE array */
                curaggsize = 0;
                attr_p = *pp;
                for (j = 0; j < sub_p->qeq_q6_col_cnt; ++j)
                {
                    STRUCT_ASSIGN_MACRO(*dv1_p, *dv2_p);
                    dv2_p->db_data = (PTR) attr_p;
                    attr_p += DB_ALIGN_MACRO(dv1_p->db_length);
                    curaggsize += DB_ALIGN_MACRO(dv1_p->db_length);
                    ++dv1_p;
                    ++dv2_p;
                }
                if (curaggsize != sub_p->qeq_q10_agg_size)
                {
                    qed_u10_trap();
                    status = qed_u2_set_interr(E_QE1995_BAD_AGGREGATE_ACTION,
                                               & qef_rcb->error);
                    return(status);
                }
                ++pp;			/* advance to pt to next slot */
            }
            act_p = act_p->ahd_next;	/* advance */
        }

        if (aggcnt != qee_p->qee_d6_dynamic_cnt
                ||
                maxbind <= 0)
        {
            qed_u10_trap();
            status = qed_u2_set_interr(E_QE1999_BAD_QP,
                                       & qef_rcb->error);
            return(status);
        }
        /* 7.  allocate max space for RQB_BIND array */

        ulm->ulm_psize = maxbind * sizeof(RQB_BIND);
        if (status = qec_malloc(ulm))
        {
            qef_rcb->error.err_code = ulm->ulm_error.err_code;
            qed_u10_trap();
            return(status);
        }

        qee_p->qee_d9_bind_p = (PTR) ulm->ulm_pptr;
        /* ptr to RQR_BIND array */
    }

    return(status);
}
Beispiel #4
0
DB_STATUS
qeq_c4_open(
QEF_RCB		*v_qer_p,
QEE_DSH		*v_dsh_p )
{
    DB_STATUS	    status = E_DB_OK;
    QEF_CB	    *qef_cb = v_qer_p->qef_cb;
    QEF_AHD	    *act_p = (QEF_AHD *) NULL,
		    *def_act_p = (QEF_AHD *) NULL;
    i4		    def_act_cnt = 0,
		    get_act_cnt = 0,
		    lnk_act_cnt = 0;
    QEQ_D1_QRY	    *sub_p = (QEQ_D1_QRY *) NULL;
    bool	    read_b = FALSE,
		    last_b = FALSE,
		    val_qp_51 = FALSE,
		    log_qry_55 = FALSE,
                    log_err_59 = FALSE;
    i4         i4_1, i4_2;


    if (ult_check_macro(& v_qer_p->qef_cb->qef_trace, QEF_TRACE_DDB_LOG_QRY_55,
        & i4_1, & i4_2))
    {
        log_qry_55 = TRUE;
        qeq_p31_opn_csr(v_qer_p, v_dsh_p);;
    }
    if (ult_check_macro(& v_qer_p->qef_cb->qef_trace, QEF_TRACE_DDB_LOG_ERR_59,
        & i4_1, & i4_2))
        log_err_59 = TRUE;

    /* verify that the following conditions are true of the query plan:
    **
    **  1)  there is exactly one last QEA_D7_OPN action,
    **  2)  there are no QEA_D2_GET, QEA_D4_LNK actions,
    **  3)  there are no read actions  */

    act_p = v_dsh_p->dsh_qp_ptr->qp_ahd; 

    while (act_p != (QEF_AHD *) NULL)
    {
	if (act_p->ahd_atype == QEA_D7_OPN)
	{
	    def_act_cnt++;
	    if (act_p->ahd_next == (QEF_AHD *) NULL)
		last_b = TRUE;
	}
	else if (act_p->ahd_atype == QEA_D2_GET)
	    get_act_cnt++;
	else if (act_p->ahd_atype == QEA_D4_LNK)
	    lnk_act_cnt++;
	else if (act_p->ahd_atype == QEA_D1_QRY)
	{
	    sub_p = & act_p->qhd_obj.qhd_d1_qry;
	    if (sub_p->qeq_q3_ctl_info & QEQ_001_READ_TUPLES)
		read_b = TRUE;
	}
	act_p = act_p->ahd_next;
    }
	
    if (! last_b || def_act_cnt != 1 || get_act_cnt != 0 || 
	lnk_act_cnt != 0 || read_b)
    {
	if (log_err_59 && !log_qry_55)
	    qeq_p31_opn_csr(v_qer_p, v_dsh_p);;

	status = qed_u2_set_interr(E_QE1999_BAD_QP, & v_qer_p->error);
	return(status);
    }

    qee_d1_qid(v_dsh_p);			/* generate query id for
						** sending to LDB */
    /* process each action in the QP */

    for (act_p = v_dsh_p->dsh_qp_ptr->qp_ahd; 
	 act_p != (QEF_AHD *)NULL; 
	 act_p = act_p->ahd_next)
    {
	/* check for deferred cursor, only one at a time is allowed */
	if (act_p->ahd_flags & QEA_DEF)
	{
	    v_dsh_p->dsh_qp_status |= DSH_DEFERRED_CURSOR;
	    if (qef_cb->qef_defr_curs)
	    {
		qed_u10_trap();
		v_qer_p->error.err_code = E_QE0026_DEFERRED_EXISTS;
		return(E_DB_ERROR);
	    }
	}

	switch (act_p->ahd_atype)
	{
	case QEA_D1_QRY:
	case QEA_D8_CRE:
	case QEA_D9_UPD:
	    status = qeq_d1_qry_act(v_qer_p, & act_p);
	    if (status)
		qed_u10_trap();
	    break;
	case QEA_D3_XFR:
	    status = qeq_d5_xfr_act(v_qer_p, act_p);
	    if (status)
		qed_u10_trap();
	    break;
	case QEA_D6_AGG:
	    status = qeq_d10_agg_act(v_qer_p, act_p);
	    if (status)
		qed_u10_trap();
	    break;
	case QEA_D7_OPN:
	    def_act_p = act_p;		/* keep track */

	    status = qeq_d8_def_act(v_qer_p, act_p);
	    if (status)
		qed_u10_trap();
	    break;
	default:
	    status = qed_u1_gen_interr(& v_qer_p->error);
	    qed_u10_trap();
	    break;
	}
	if (! status)
	    v_dsh_p->dsh_act_ptr = act_p;	/* promote to current dsh */
    }

    /* cleanup done by caller */

    v_dsh_p->dsh_act_ptr = def_act_p;    /* pt to define action */
    return (status);
}
Beispiel #5
0
DB_STATUS
qeu_d5_alt_tab(
QEF_RCB		*v_qer_p,
DMT_CB		*i_dmt_p)
{
    DB_STATUS	    status;
    QES_DDB_SES	    *dds_p = & v_qer_p->qef_cb->qef_c2_ddb_ses;
    DD_LDB_DESC	    *cdb_p = 
			& dds_p->qes_d4_ddb_p->dd_d3_cdb_info.dd_i1_ldb_desc;
    QEC_D9_TABLEINFO	
		    tabinfo;			/* dummy part of link */
    QEC_D6_OBJECTS  objects,
		    *objs_p = & objects;
    QEC_L16_TABLES  tables,
		    *tabs_p = & tables;
    QEQ_1CAN_QRY    upd,
		    *upd_p = & upd;
    QEC_LINK	    link,
		    *lnk_p = & link; 
    DMT_CHAR_ENTRY  *chr_p;
    bool	    err_b = FALSE;		/* assume no error */
    i4		    xact_mode;


    MEfill(sizeof(link), '\0', (PTR) & link);
    lnk_p->qec_2_tableinfo_p = & tabinfo;
    lnk_p->qec_13_objects_p = objs_p;

    /* 1.  vefify input parameters */

    chr_p = (DMT_CHAR_ENTRY *) i_dmt_p->dmt_char_array.data_address;

    if (chr_p->char_id != DMT_C_ZOPTSTATS)
	err_b = TRUE;
    else 
    {
	if (chr_p->char_value == DMT_C_ON)
	{
	    tabs_p->l16_9_stats[0] = 'Y';
	    tabs_p->l16_9_stats[1] = EOS;
	}
	else if (chr_p->char_value == DMT_C_OFF)
	{
	    tabs_p->l16_9_stats[0] = 'N';
	    tabs_p->l16_9_stats[1] = EOS;
	}
	else
	    err_b = TRUE;
    }
    if (err_b)
    {
	status = qed_u2_set_interr(E_QE0018_BAD_PARAM_IN_CB, & v_qer_p->error);
	return(status);
    }

    /* 2.  inform TPF of update */

    /* 2.1 2PC is required if DDL concurrency is off. */
    if (dds_p->qes_d9_ctl_info & QES_01CTL_DDL_CONCURRENCY_ON)
	xact_mode = QEK_4TPF_1PC;
    else
	xact_mode = QEK_3TPF_UPDATE;

    status = qet_t5_register(v_qer_p, cdb_p, DB_SQL, xact_mode);
    if (status)
	return(status);

    /* 3.  set up to update TABLE_STATS and MODIFY_DATE of IIDD_TABLES */

    qed_u0_trimtail( (char *) & i_dmt_p->dmt_table, DB_TAB_MAXNAME,
	tabs_p->l16_1_tab_name);

    qed_u0_trimtail( (char *) & i_dmt_p->dmt_owner, DB_OWN_MAXNAME,
	tabs_p->l16_2_tab_owner);

    status = qed_u8_gmt_now(v_qer_p, tabs_p->l16_21_mod_date);
    if (status)
	return(status);

    tabs_p->l16_21_mod_date[DD_25_DATE_SIZE] = EOS;

    upd_p->qeq_c1_can_id = UPD_731_DD_TABLES;
    upd_p->qeq_c2_rqf_bind_p = NULL;
    upd_p->qeq_c3_ptr_u.l16_tables_p = tabs_p;
    upd_p->qeq_c4_ldb_p = cdb_p;

    lnk_p->qec_23_update_p = upd_p;
    status = qel_u1_update(v_qer_p, lnk_p);    
    if (status)
    {
	return(status);
    }

    return(E_DB_OK);
}    
Beispiel #6
0
DB_STATUS
qeu_16_tree(
QEF_RCB		*i_qer_p,
QEUQ_CB		*i_quq_p,
QEC_LINK	*v_lnk_p)
{
    DB_STATUS	    status;
    QES_DDB_SES	    *dds_p = & i_qer_p->qef_cb->qef_c2_ddb_ses;
/*
    QED_DDL_INFO    *ddl_p = v_lnk_p->qec_1_ddl_info_p;
*/
    DD_LDB_DESC	    *cdb_p = 
			& dds_p->qes_d4_ddb_p->dd_d3_cdb_info.dd_i1_ldb_desc;
    QEC_D6_OBJECTS
		    *objects_p = v_lnk_p->qec_13_objects_p;
    QEF_DATA	    *data_p = i_quq_p->qeuq_tre_tup;
    QEC_D10_TREE    tree,
		    *tree_p = & tree;
    QEQ_1CAN_QRY    *ins_p = v_lnk_p->qec_22_insert_p;
    i4		    seq;


    /* 1.  set up constant values for all entries */

    tree_p->d10_1_treetabbase = objects_p->d6_3_obj_id.db_tab_base;
    tree_p->d10_2_treetabidx = objects_p->d6_3_obj_id.db_tab_index; 

    tree_p->d10_3_treeid1 = (i4) objects_p->d6_4_qry_id.db_qry_high_time;
    tree_p->d10_4_treeid2 = (i4) objects_p->d6_4_qry_id.db_qry_low_time; 

    tree_p->d10_6_treemode = DB_VIEW;
    tree_p->d10_7_treevers = DD_0TV_UNKNOWN;

#ifdef	DDB_1TV_VAX

    tree_p->d10_7_treevers = DD_1TV_VAX;
						/* VAX binary representation */
#endif

    for (seq = 0; seq < i_quq_p->qeuq_ct; seq++)
    {
	/* 2.  fill in specific information for current entry */

	tree_p->d10_5_treeseq = seq;		/* starts from 0 */

	if (data_p->dt_size > QEK_1024_TREE_SIZE + 2)
						/* include 2-byte length */
	{
	    status = qed_u2_set_interr(E_QE0018_BAD_PARAM_IN_CB,
			& i_qer_p->error);
	    return(status);
	}
	else
	{
	    MEcopy((char *) data_p->dt_data, data_p->dt_size,
		tree_p->d10_8_treetree);
	    tree_p->d10_8_treetree[data_p->dt_size] = EOS;
	    tree_p->d10_9_treesize = data_p->dt_size;
	}

	data_p = data_p->dt_next;		/* advance to next item */

	/* 3.  insert into IIDD_DDB_TREE */

	ins_p->qeq_c1_can_id = INS_619_DD_DDB_TREE;
	ins_p->qeq_c3_ptr_u.d10_tree_p = tree_p;
	ins_p->qeq_c4_ldb_p = cdb_p;
	status = qel_i1_insert(i_qer_p, v_lnk_p);
	if (status)
	    return(status);
    } 

    return(E_DB_OK);
}    
Beispiel #7
0
DB_STATUS
qeu_15_views(
QEF_RCB		*i_qer_p,
QEUQ_CB		*i_quq_p,
QEC_LINK	*v_lnk_p)
{
    DB_STATUS	    status;
    QES_DDB_SES	    *dds_p = & i_qer_p->qef_cb->qef_c2_ddb_ses;
    QED_DDL_INFO    *ddl_p = v_lnk_p->qec_1_ddl_info_p;
    DD_LDB_DESC	    *cdb_p = 
			& dds_p->qes_d4_ddb_p->dd_d3_cdb_info.dd_i1_ldb_desc;
    QEUQ_DDB_CB	    *ddu_p = & i_quq_p->qeuq_ddb_cb;
    QEF_DATA	    *data_p = i_quq_p->qeuq_qry_tup;
    QEC_L17_VIEWS   views,
		    *views_p = & views;
    QEQ_1CAN_QRY    *ins_p = v_lnk_p->qec_22_insert_p;
    i4		    seq;


    /* 1.  set up constant values for all entries */

    qed_u0_trimtail( ddl_p->qed_d1_obj_name, DB_OBJ_MAXNAME,
	views_p->l17_1_tab_name);

    qed_u0_trimtail( ddl_p->qed_d2_obj_owner, DB_OWN_MAXNAME,
	views_p->l17_2_tab_owner);

    if (ddu_p->qeu_1_lang == DB_SQL)
	views_p->l17_3_dml[0] = 'S';
    else if (ddu_p->qeu_1_lang == DB_QUEL)
	views_p->l17_3_dml[0] = 'Q';
    else
    {
	status = qed_u2_set_interr(E_QE0018_BAD_PARAM_IN_CB,
			& i_qer_p->error);
	return(status);
    }
    views_p->l17_3_dml[1] = EOS;

    if (ddu_p->qeu_2_view_chk_b)
	views_p->l17_4_chk_option[0] = 'Y';
    else
	views_p->l17_4_chk_option[0] = 'N';
    views_p->l17_4_chk_option[1] = EOS;

    for (seq = 0; seq < i_quq_p->qeuq_cq; seq++)
    {
	/* 2.  fill in specific information for current entry */

	views_p->l17_5_sequence = seq + 1;

	if (data_p->dt_size > QEK_256_VIEW_SIZE)
	{
	    status = qed_u2_set_interr(E_QE0018_BAD_PARAM_IN_CB,
			& i_qer_p->error);
	    return(status);
	}
	else
	{
	    MEcopy((char *) data_p->dt_data, data_p->dt_size,
		views_p->l17_6_txt_seg);
	    views_p->l17_6_txt_seg[data_p->dt_size] = EOS;
	    views_p->l17_7_txt_size = data_p->dt_size;
	}

	data_p = data_p->dt_next;		/* advance to next item */

	/* 3.  insert into IIDD_VIEWS */

	ins_p->qeq_c1_can_id = INS_632_DD_VIEWS;
	ins_p->qeq_c3_ptr_u.l17_views_p = views_p;
	ins_p->qeq_c4_ldb_p = cdb_p;
	status = qel_i1_insert(i_qer_p, v_lnk_p);
	if (status)
	    return(status);
    } 

    return(E_DB_OK);
}    
Beispiel #8
0
DB_STATUS
qeu_14_columns(
QEF_RCB		*i_qer_p,
QEUQ_CB		*i_quq_p,
QEC_LINK	*v_lnk_p)
{
    DB_STATUS	    status;
    QES_DDB_SES	    *dds_p = & i_qer_p->qef_cb->qef_c2_ddb_ses;
    QED_DDL_INFO    *ddl_p = v_lnk_p->qec_1_ddl_info_p;
    DD_LDB_DESC	    *cdb_p = 
			& dds_p->qes_d4_ddb_p->dd_d3_cdb_info.dd_i1_ldb_desc;
    QEC_L3_COLUMNS  dd_columns,
		    *columns_p = & dd_columns;	/* tuple struct */
    QEQ_1CAN_QRY    *ins_p = v_lnk_p->qec_22_insert_p;
    QEP_PTR_UNION   ptr_u;
    DMU_CB	    *dmu_p;
    DMF_ATTR_ENTRY  **col_pp,
		    *curcol_p;
    i4		    colnum,
		    coltype,
		    postype;
    QEC_LONGNAT_TO_I4  
		    coerce;
    ADI_DT_NAME	    adi_dname;


    ptr_u.qep_ptr_u.qep_1_ptr = i_quq_p->qeuq_dmf_cb;
    dmu_p = ptr_u.qep_ptr_u.qep_3_dmu_cb_p;

    ptr_u.qep_ptr_u.qep_1_ptr = dmu_p->dmu_attr_array.ptr_address;
    col_pp = ptr_u.qep_ptr_u.qep_4_dmu_attr_pp;

    /* 1.  set up constant values for all columns */

    qed_u0_trimtail( ddl_p->qed_d1_obj_name, DB_OBJ_MAXNAME,
	columns_p->l3_1_tab_name);

    qed_u0_trimtail( ddl_p->qed_d2_obj_owner, DB_OWN_MAXNAME,
	columns_p->l3_2_tab_owner);

    columns_p->l3_10_seq_in_key = 0;

    for (colnum = 0; colnum < i_quq_p->qeuq_ano; colnum++, col_pp++)
    {
	curcol_p = *col_pp;

	/* 2.  fill in specific information for current column */

	qed_u0_trimtail( curcol_p->attr_name.db_att_name, DB_ATT_MAXNAME,
	    columns_p->l3_3_col_name);

	coerce.qec_i4_i4.qec_1_i4 = curcol_p->attr_type;
	coltype = coerce.qec_i4_i4.qec_2_i4;
	if (coltype < 0)
	{
	    columns_p->l3_7_nulls[0] = 'Y';
	    postype = -coltype;			    /* must make positive */
	}
	else
	{
	    columns_p->l3_7_nulls[0] = 'N';
	    postype = coltype;
	}
	columns_p->l3_7_nulls[1] = EOS;

        /* call adi_tyname to get data type name */
	status = adi_tyname(i_qer_p->qef_adf_cb, postype, &adi_dname);
	if (status == E_DB_OK) 
		STcopy(adi_dname.adi_dtname, columns_p->l3_4_data_type);
	else
	{
	    status = qed_u2_set_interr(E_QE0018_BAD_PARAM_IN_CB,
			& i_qer_p->error);
	    return(status);
	}

	coerce.qec_i4_i4.qec_1_i4 = curcol_p->attr_size;
	columns_p->l3_5_length = coerce.qec_i4_i4.qec_2_i4;

	coerce.qec_i4_i4.qec_1_i4 = curcol_p->attr_precision;
	columns_p->l3_6_scale = coerce.qec_i4_i4.qec_2_i4;

	if (curcol_p->attr_flags_mask & DMU_F_NDEFAULT)
	    columns_p->l3_8_defaults[0] = 'N';
	else
	    columns_p->l3_8_defaults[0] = 'Y';
	columns_p->l3_8_defaults[1] = EOS;

	columns_p->l3_9_seq_in_row = colnum + 1;
	columns_p->l3_10_seq_in_key = 0;	/* none */

	columns_p->l3_11_sort_dir[0] = 'A';	/* assume ascending */
	columns_p->l3_11_sort_dir[1] = EOS;	/* null terminate */

	columns_p->l3_12_ing_datatype = coltype;

	/* 3.  insert into IIDD_COLUMNS */

	ins_p->qeq_c1_can_id = INS_602_DD_COLUMNS;
	ins_p->qeq_c3_ptr_u.l3_columns_p = columns_p;
	ins_p->qeq_c4_ldb_p = cdb_p;
	status = qel_i1_insert(i_qer_p, v_lnk_p);
	if (status)
	    return(status);
    } 

    return(E_DB_OK);
}    
Beispiel #9
0
DB_STATUS
qel_32_tables(
QEF_RCB		*i_qer_p,
QEC_LINK	*v_lnk_p )
{
    DB_STATUS	    status;
    QES_DDB_SES	    *dds_p = & i_qer_p->qef_cb->qef_c2_ddb_ses;
    QED_DDL_INFO    *ddl_p = v_lnk_p->qec_1_ddl_info_p;
    DD_2LDB_TAB_INFO
		    *tabinfo_p = ddl_p->qed_d6_tab_info_p;
    QEC_L16_TABLES  *tables_p = v_lnk_p->qec_9_tables_p;
    QEQ_1CAN_QRY    *sel_p = v_lnk_p->qec_6_select_p,
		    *ins_p = v_lnk_p->qec_22_insert_p;
						/* working structure */
    DD_LDB_DESC	    *cdb_p = 
			& dds_p->qes_d4_ddb_p->dd_d3_cdb_info.dd_i1_ldb_desc,
		    *ldb_p = v_lnk_p->qec_19_ldb_p;
    u_i4	    l_obj;


    if (v_lnk_p->qec_10_haves & QEC_08_NO_IITABLES)
	return(E_DB_OK);

    /* 1.  set up to retrieve from IITABLES */

    qed_u0_trimtail( tabinfo_p->dd_t1_tab_name, (u_i4) DB_TAB_MAXNAME,
		    tables_p->l16_1_tab_name);
    qed_u0_trimtail( tabinfo_p->dd_t2_tab_owner, (u_i4) DB_OWN_MAXNAME,
		    tables_p->l16_2_tab_owner);

    sel_p->qeq_c1_can_id = SEL_117_II_TABLES;
    sel_p->qeq_c3_ptr_u.l16_tables_p = tables_p;
    sel_p->qeq_c4_ldb_p = ldb_p;
    sel_p->qeq_c2_rqf_bind_p = v_lnk_p->qec_20_rqf_bind_p;

    /* 2.  send SELECT query and fetch first tuple */

    status = qel_s4_prepare(i_qer_p, v_lnk_p);
    if (status)
	return(status);
        
    if (! sel_p->qeq_c5_eod_b)
    {
	status = qel_s3_flush(i_qer_p, v_lnk_p);
	if (status)
	    return(status);
    }

    if (v_lnk_p->qec_27_select_cnt != 1)
    {
	status = qed_u1_gen_interr(& i_qer_p->error);
	return(status);
    }

    if (v_lnk_p->qec_10_haves & QEC_10_USE_PHY_SRC)
    {
	/* 3.  read remaining information from the LDB's IIPHYSICAL_TABLES */

	sel_p->qeq_c1_can_id = SEL_113_II_PHYSICAL_TABLES;

	/* 3.1  send SELECT query and fetch first tuple */

	status = qel_s4_prepare(i_qer_p, v_lnk_p);
	if (status)
	    return(status);
        
	if (! sel_p->qeq_c5_eod_b)
	{
	    status = qel_s3_flush(i_qer_p, v_lnk_p);
	    if (status)
		return(status);
	}

	if (v_lnk_p->qec_27_select_cnt != 1)
	{
	    status = qed_u1_gen_interr(& i_qer_p->error);
	    return(status);
	}
    }

    if (v_lnk_p->qec_10_haves & QEC_11_LDB_DIFF_ARCH)
    {
	/* binary statistics data cannot be propagated for use due to 
	** different LDB architecture */

	tables_p->l16_9_stats[0] = 'N';		/* declare no statistics */
    }
    else if (!
	(
	(tables_p->l16_9_stats[0] == 'N')
	||
	(tables_p->l16_9_stats[0] == 'n')
	))
	v_lnk_p->qec_10_haves |= QEC_05_STATS;

    if (!
	(
	(tables_p->l16_10_indexes[0] == 'N')
	||
	(tables_p->l16_10_indexes[0] == 'n')
	))
	v_lnk_p->qec_10_haves |= QEC_02_INDEXES;

    /* 3.  set up tuple for insertion */

    l_obj = (u_i4)qed_u0_trimtail( ddl_p->qed_d1_obj_name, (u_i4)DB_OBJ_MAXNAME,
		tables_p->l16_1_tab_name);

    qed_u0_trimtail( ddl_p->qed_d2_obj_owner, (u_i4) DB_OWN_MAXNAME,
		tables_p->l16_2_tab_owner);

    STcopy(v_lnk_p->qec_24_cur_time, 
	    tables_p->l16_3_cre_date);
    STcopy(v_lnk_p->qec_24_cur_time, 
	    tables_p->l16_4_alt_date);

    if (tabinfo_p->dd_t3_tab_type == DD_2OBJ_TABLE)
	tables_p->l16_5_tab_type[0] = 'T';	/* local table */
    else if (tabinfo_p->dd_t3_tab_type == DD_3OBJ_VIEW)
	tables_p->l16_5_tab_type[0] = 'V';	/* local view */
    else if (tabinfo_p->dd_t3_tab_type == DD_4OBJ_INDEX)
	tables_p->l16_5_tab_type[0] = 'I';	/* local index */
    else 
    {
	status = qed_u2_set_interr(E_QE0018_BAD_PARAM_IN_CB,
		    & i_qer_p->error);
	return(status);
    }
    tables_p->l16_5_tab_type[1] = EOS;		/* null terminate */

    if (ddl_p->qed_d8_obj_type == DD_1OBJ_LINK)
   	tables_p->l16_6_sub_type[0] = 'L';	/* DDB link */
    else if (ddl_p->qed_d8_obj_type == DD_2OBJ_TABLE
	     ||
	     ddl_p->qed_d8_obj_type == DD_3OBJ_VIEW)
	tables_p->l16_6_sub_type[0] = 'N';	/* DDB native */
    else
    {
	status = qed_u2_set_interr(E_QE0018_BAD_PARAM_IN_CB,
		    & i_qer_p->error);
	return(status);
    }
    tables_p->l16_6_sub_type[1] = EOS;		/* null terminate */

    STcopy(IIQE_42_ing_60, tables_p->l16_7_version);

    if (dds_p->qes_d9_ctl_info & QES_05CTL_SYSCAT_USER)
    {
	char *ch2 = ddl_p->qed_d1_obj_name + CMbytecnt(ddl_p->qed_d1_obj_name);

	if( ( l_obj >= 2 ) &&
	    (CMcmpnocase(ddl_p->qed_d1_obj_name, "i") == 0 ) &&
	    (CMcmpnocase(ch2, "i") == 0 ))
	{
	    tables_p->l16_8_sys_use[0] = 'S';	/* system object */

	}
	else
	    tables_p->l16_8_sys_use[0] = 'U';	/* user object */
    }
    else
	tables_p->l16_8_sys_use[0] = 'U';	/* user object */
    tables_p->l16_8_sys_use[1] = EOS;		/* null terminate */

    if (! (v_lnk_p->qec_10_haves & QEC_03_INGRES) )
    {
	/* index information NOT propagated for gateways */
	tables_p->l16_10_indexes[0] = 'N';	/* N */
	tables_p->l16_10_indexes[1] = EOS;	/* null terminate */
    }
    tables_p->l16_23_integrities[0] = 'N';	/* always N */
    tables_p->l16_23_integrities[1] = EOS;	/* null terminate */

    tables_p->l16_24_permits[0] = 'N';		/* always N */
    tables_p->l16_24_permits[1] = EOS;	/* null terminate */

    if (tabinfo_p->dd_t3_tab_type == DD_4OBJ_INDEX)
	tables_p->l16_25_all_to_all[0] = 'N';	/* always N if an index */
    else
	tables_p->l16_25_all_to_all[0] = 'Y';	/* always Y otherwise */
    tables_p->l16_25_all_to_all[1] = EOS;	/* null terminate */

    /* 4.  insert into IIDD_TABLES */

    ins_p->qeq_c1_can_id = INS_631_DD_TABLES;	
    ins_p->qeq_c3_ptr_u.l16_tables_p = tables_p;	
    ins_p->qeq_c4_ldb_p = cdb_p;
    status = qel_i1_insert(i_qer_p, v_lnk_p);

    return(status);
}