예제 #1
0
/*static*/
short NAType::convertTypeToText(char * text,	   // OUTPUT
				Lng32 fs_datatype,  // all other vars: INPUT
				Lng32 length,
				Lng32 precision,
				Lng32 scale,
				rec_datetime_field datetimestart,
				rec_datetime_field datetimeend,
				short datetimefractprec,
				short intervalleadingprec,
				short upshift,
				short caseinsensitive,
                                CharInfo::CharSet charSet,
                                CharInfo::Collation collation,
                                const char * displaydatatype,
				short displayCaseSpecific)
{
  return convertTypeToText_basic(text,
                                 fs_datatype,
                                 length,
                                 precision,
                                 scale,
                                 datetimestart,
                                 datetimeend,
                                 datetimefractprec,
                                 intervalleadingprec,
                                 upshift,
				 caseinsensitive,
                                 charSet,
                                 CharInfo::getCollationName(collation),
                                 displaydatatype,
				 displayCaseSpecific);
}
예제 #2
0
//Detailed error support for conversions, especially for use in convdoit.
ComDiagsArea *ExRaiseDetailSqlError(CollHeap* heap, 
				    ComDiagsArea** diagsArea,
				    ExeErrorCode err, 
				    char *src,
                                    Int32 srcLength,
                                    Int16 srcType,
                                    Int32 srcScale,
                                    Int16 tgtType,
                                    UInt32 flags,
                                    Int32 tgtLength,
                                    Int32 tgtScale,
                                    Int32 tgtPrecision,
                                    Int32 srcPrecision)
{
  //if looping situation, no need to proceed further, return back.
  if(flags & CONV_CONTROL_LOOPING)
    return NULL;

  NABoolean intermediate;

  if( flags & CONV_INTERMEDIATE_CONVERSION )
    intermediate = TRUE;
  else
    intermediate = FALSE;

  if (diagsArea == NULL)
    return NULL;
  
  if (*diagsArea == NULL){
  
    if (heap == NULL)
      return NULL;
    *diagsArea = ComDiagsArea::allocate(heap);
  }
  
  //Allocate buf once, for formatting and opstring[1].
  // |--------formatting--------|--opstring[1]------|
  char *buf = new (heap) char[FORMATTING+ OPVALUE_LEN] ;
  if( !buf ){
    ExRaiseSqlError(heap, diagsArea, err);
    return *diagsArea;
  }
  char *opString = &buf[FORMATTING];
    
  ExConvertErrorToString(heap,
                         diagsArea,
                         src,
                         srcLength,
                         srcType,
                         srcScale,
                         opString,
                         OPVALUE_LEN);

  char srcDatatypeDetail[200];
  char tgtDatatypeDetail[200];
  char srcTypeAsText[1000];
  char tgtTypeAsText[100];
  srcTypeAsText[0] = 0;
  tgtTypeAsText[0] = 0;

  if (srcPrecision != -1)
    {
      rec_datetime_field startField;
      rec_datetime_field endField;
      ExpDatetime::getDatetimeFields(srcPrecision, startField, endField);
      convertTypeToText_basic(srcTypeAsText, 
                              srcType, srcLength, srcPrecision, srcScale,
                              startField, endField, 0, 0, 0, 0,
                              (CharInfo::CharSet)srcScale,
                              NULL, NULL, 0);
      strcpy(srcDatatypeDetail, getDatatypeAsString(srcType, false));
    }
  else if ((DFS2REC::isCharacterString(srcType)) &&
           (srcLength >= 0) &&
           (srcScale > 0) &&
           (srcPrecision == -1))
    str_sprintf(srcDatatypeDetail, "%s,%d BYTES,%s", 
                getDatatypeAsString(srcType, false), 
                srcLength,
                (srcScale == CharInfo::ISO88591 ? "ISO88591" : "UTF8"));
  else
    strcpy(srcDatatypeDetail, getDatatypeAsString(srcType, false));

  if (tgtLength != -1)
    {
      rec_datetime_field startField;
      rec_datetime_field endField;
      ExpDatetime::getDatetimeFields(tgtPrecision, startField, endField);

      convertTypeToText_basic(tgtTypeAsText, 
                              tgtType, tgtLength, tgtPrecision, tgtScale,
                              startField, endField, 0, 0, 0, 0, 
                              (CharInfo::CharSet)tgtScale,
                              NULL, NULL, 0);
      strcpy(tgtDatatypeDetail, getDatatypeAsString(tgtType, false));
    }
  else if ((DFS2REC::isCharacterString(tgtType)) &&
           (tgtLength >= 0) &&
           (tgtScale > 0))
    str_sprintf(tgtDatatypeDetail, "%s,%d %s,%s", 
                getDatatypeAsString(tgtType, false), 
                tgtPrecision ? tgtPrecision : tgtLength,
                tgtPrecision ? "CHARS" : "BYTES",
                (tgtScale == CharInfo::ISO88591 ? "ISO88591" : "UTF8"));
  else
    strcpy(tgtDatatypeDetail, getDatatypeAsString(tgtType, false));

  str_sprintf(buf,
              " %s of Source Type:%s(%s) Source Value:%s to Target Type:%s(%s).",
              intermediate? "Intermediate conversion" : "Conversion",
              (strlen(srcTypeAsText) == 0 ? getDatatypeAsString(srcType,true) :
               srcTypeAsText),              
              srcDatatypeDetail,
              opString,
              (strlen(tgtTypeAsText) == 0 ? getDatatypeAsString(tgtType,true) :
               tgtTypeAsText),
              tgtDatatypeDetail);
  
  **diagsArea << DgSqlCode(-err);
  **diagsArea<<DgString0(buf);
  
  NADELETEBASICARRAY(buf, (heap));
  return *diagsArea;
}