/* ** Name: adu_ascii_2arg() - Convert a data value to character string data value. ** ** Description: ** Support the two argument version of string functions CHAR(), VARCHAR(), ** TEXT() and C(). Simply call adu_ascii() to do the real work. ** ** Inputs: ** adf_scb Pointer to an ADF session control block. ** dv1 DB_DATA_VALUE describing Ingres datatype ** to be converted. ** .db_datatype Its type. ** .db_prec Its precision/scale. ** .db_length Its length. ** .db_data Ptr to the data to be converted into ** a character string. ** rdv DB_DATA_VALUE describing character ** string result. ** .db_length The maximum length of the result. ** .db_data Ptr to buffer to hold converted string. ** ** Outputs: ** adf_scb Pointer to an ADF session control block. ** rdv ** .db_data The converted string. ** ** Returns: ** The following DB_STATUS codes may be returned: ** E_DB_OK, E_DB_WARN, E_DB_ERROR, E_DB_SEVERE, E_DB_FATAL ** ** If a DB_STATUS code other than E_DB_OK is returned, the caller ** can look in the field adf_scb.adf_errcb.ad_errcode to determine ** the ADF error code. The following is a list of possible ADF error ** codes that can be returned by this routine: ** ** E_AD0000_OK Routine completed successfully. ** E_AD5001_BAD_STRING_TYPE Either dv1's or rdv's datatype was ** inappropriate for this operation. ** ** History: ** 31-dec-1992 (stevet) ** Created. ** 10-jun-1993 (stevet) ** Modified to disable string truncation detection since this function ** is behaved like the left() function. */ DB_STATUS adu_ascii_2arg( ADF_CB *adf_scb, DB_DATA_VALUE *dv1, DB_DATA_VALUE *dv2, DB_DATA_VALUE *rdv) { ADF_STRTRUNC_OPT input_strtrunc=adf_scb->adf_strtrunc_opt; STATUS status; adf_scb->adf_strtrunc_opt = ADF_IGN_STRTRUNC; if (dv1->db_datatype == DB_NCHR_TYPE || dv1->db_datatype == DB_NVCHR_TYPE) status = adu_nvchr_coerce(adf_scb, dv1, rdv); else status = adu_ascii(adf_scb, dv1, rdv); adf_scb->adf_strtrunc_opt = input_strtrunc; return( status); }
DB_STATUS adu_dbmsinfo( ADF_CB *adf_scb, DB_DATA_VALUE *dv1, DB_DATA_VALUE *rdv) { i4 i = Adf_globs->Adi_num_dbis; i4 found = FALSE; ADF_DBMSINFO *dbi = Adf_globs->Adi_dbi; i4 dbi_size = sizeof(dbi->dbi_reqname); i4 in_size = ((DB_TEXT_STRING *)dv1->db_data)->db_t_count; char *in_str = (char *) ((DB_TEXT_STRING *)dv1->db_data)->db_t_text; register i4 j; register char *c1; register char *c2; char ch_tmp; ALIGN_RESTRICT *tbuf; DB_STATUS db_stat = E_DB_OK; i4 cmp; DB_DATA_VALUE tmp_dv; DB_ERROR err; ADK_MAP *kmap; char localbuf[2004]; bool uselocal = TRUE; if (in_size <= dbi_size) /* No possible match if input is bigger */ { /* Find the request in the dbmsinfo() request table */ while (i--) { cmp = TRUE; c1 = dbi->dbi_reqname; c2 = in_str; j = 0; while (j < in_size && *c1 != 0) { CMtolower(c2, &ch_tmp); if (*c1 != ch_tmp) { cmp = FALSE; break; } c1++; c2++; j++; } if ( cmp && (in_size == dbi_size || (*c1 == 0 && j == in_size)) ) { found = TRUE; break; } dbi++; } } if (!found) { ((DB_TEXT_STRING *)rdv->db_data)->db_t_count = 0; db_stat = E_DB_OK; } else { /* {@fix_me@} ... eventually, we have to handle 1 input, and ** lenspecs that are not FIXED LENGTH */ if (dbi->dbi_num_inputs || dbi->dbi_lenspec.adi_lncompute != ADI_FIXED) return(adu_error(adf_scb, E_AD9999_INTERNAL_ERROR, 0)); tmp_dv.db_datatype = dbi->dbi_dtr; tmp_dv.db_length = dbi->dbi_lenspec.adi_fixedsize; if (tmp_dv.db_length >= 2004) { uselocal = FALSE; tbuf = (ALIGN_RESTRICT *)MEreqmem(0, ((DB_GW4_MAXSTRING + DB_CNTSIZE - 1) / sizeof(ALIGN_RESTRICT)) + 1, FALSE, NULL); tmp_dv.db_data = (PTR)tbuf; } else tmp_dv.db_data = (PTR)&localbuf[0]; /* ** Is request one of the query constants? If so, use adu_dbconst() ** instead of the dbi function found in the dbi table. */ if (dbi == Adf_globs->Adk_bintim_map.adk_dbi) kmap = &Adf_globs->Adk_bintim_map; else if (dbi == Adf_globs->Adk_cpu_ms_map.adk_dbi) kmap = &Adf_globs->Adk_cpu_ms_map; else if (dbi == Adf_globs->Adk_et_sec_map.adk_dbi) kmap = &Adf_globs->Adk_et_sec_map; else if (dbi == Adf_globs->Adk_dio_cnt_map.adk_dbi) kmap = &Adf_globs->Adk_dio_cnt_map; else if (dbi == Adf_globs->Adk_bio_cnt_map.adk_dbi) kmap = &Adf_globs->Adk_bio_cnt_map; else if (dbi == Adf_globs->Adk_pfault_cnt_map.adk_dbi) kmap = &Adf_globs->Adk_pfault_cnt_map; else if (dbi == Adf_globs->Adk_curr_date_map.adk_dbi) kmap = &Adf_globs->Adk_curr_date_map; else if (dbi == Adf_globs->Adk_curr_time_map.adk_dbi) kmap = &Adf_globs->Adk_curr_time_map; else if (dbi == Adf_globs->Adk_curr_tstmp_map.adk_dbi) kmap = &Adf_globs->Adk_curr_tstmp_map; else if (dbi == Adf_globs->Adk_local_time_map.adk_dbi) kmap = &Adf_globs->Adk_local_time_map; else if (dbi == Adf_globs->Adk_local_tstmp_map.adk_dbi) kmap = &Adf_globs->Adk_local_tstmp_map; else kmap = NULL; if (kmap == NULL) db_stat = (*dbi->dbi_func)(dbi, NULL, &tmp_dv, &err); else db_stat = adu_dbconst(adf_scb, kmap, &tmp_dv); if (DB_SUCCESS_MACRO(db_stat)) { db_stat = adu_ascii(adf_scb, &tmp_dv, rdv); } if (!uselocal) MEfree((PTR)tbuf); } return (db_stat); }