void NAWriteConsole(const NAWchar *str, ostream& outStream,
		    NABoolean newline,
		    NABoolean comment,
                    CharInfo::CharSet terminal_cs)
{
  if (!str) return;
  char mbstr[DEST_BUF_SIZE + 16];

#pragma nowarn(1506)   // warning elimination 
  UnicodeStringToLocale(terminal_cs, str, NAWstrlen(str), mbstr, DEST_BUF_SIZE+16);
#pragma warn(1506)  // warning elimination 
  NAWriteConsole(mbstr, outStream, newline, comment);
}
// Changes to this function should be emulated in HandleCLIError (SqlCmd.C)
void NADumpDiags(ostream& outStream, ComDiagsArea* diags,
		 NABoolean newline,
		 Int32 commentIf,
		 FILE* fp,
		 short verbose,
                 CharInfo::CharSet terminal_cs)
{
  if (!diags) return;

  Int32 numDiags = diags->getNumber();
  
  if (!numDiags) return;

  Int32 numWarns = diags->getNumber(DgSqlCode::WARNING_);

  if ( commentIf != NO_COMMENT )
    outStream << endl;		// blank line at beginning

  if (fp) fprintf(fp, "\n");

  NABoolean sqlcodePrefixAdded = (commentIf != NO_COMMENT);
  for (Int32 i = 0; i++ < numDiags; )
  {
    NABoolean cmt = sqlcodePrefixAdded && commentIf && 
                    (commentIf < 0 || (*diags)[i].getSQLCODE() >= 0);

    if ( verbose || (!verbose) && (*diags)[i].getSQLCODE() <= 0  )
    {
     const NAWchar *msg = (*diags)[i].getMessageText(sqlcodePrefixAdded);	// NAWchar, not TCHAR
     NAWriteConsole(msg, outStream, newline, cmt, terminal_cs);

    if (fp)			// if a logfile is open, mirror messages to it
    {
      char mbstr[DEST_BUF_SIZE + 16]; 
#pragma nowarn(1506)   // warning elimination 
      UnicodeStringToLocale(terminal_cs, msg, NAWstrlen(msg),  
                            mbstr, DEST_BUF_SIZE);
#pragma warn(1506)  // warning elimination

      FixCarriageReturn(mbstr);
      fprintf(fp, "%s\n", mbstr);

      if (newline) fprintf(fp, "\n"); 
    }
    }
  }

  outStream << flush;
  if (fp) fflush(fp);
}
Esempio n. 3
0
//////////////////////////////////////////////
// Begin ERROR
////////////////////////////////////////////////
short Error::process(SqlciEnv * sqlci_env)
{
  NAWchar   *error_msg;
  Int32        codeE, codeW;
  char       stateE[10], stateW[10];
  NABoolean  msgNotFound;

  ostringstream omsg;

  #define GETERRORMESS(in, out, typ)	GetErrorMessage(in, (NAWchar *&)out, typ)

  codeW = ABS(atoi(get_argument()));	// >= 0, i.e. warning
  codeE = -codeW;			// <= 0, i.e. error

  // These calls must be done before any of the GETERRORMESS(),
  // as they all use (overwrite) the same static buffer in GetErrorMessage.cpp.
  ComSQLSTATE(codeE, stateE);
  ComSQLSTATE(codeW, stateW);
  msgNotFound = GETERRORMESS(codeE, error_msg, ERROR_TEXT);

  if (type == ENVCMD_)
    {
      if (msgNotFound)
        {
	  error_msg[0] = NAWchar('\n');
	  error_msg[1] = NAWchar('\0');
	}
      else
        {
	  // Extract the {braces-enclosed version string}
	  // that msgfileVrsn.ksh (called by GenErrComp.bat)
	  // has put into this ENVCMD_ message.
	  NAWchar *v = NAWstrchr(error_msg, NAWchar(']'));
	  if (v) error_msg = v;
	  v = NAWstrchr(error_msg, NAWchar('{'));
	  if (v) error_msg = v;
	  v = NAWstrchr(error_msg, NAWchar('}'));
	  if (v++ && *v == NAWchar('.')) *v = NAWchar(' ');
	}
      NAWriteConsole(error_msg, omsg, FALSE);
    }
  else if (!msgNotFound || codeE == 0)		// SQL "success", special case
    {
      omsg << "\n*** SQLSTATE (Err): " << stateE
           << " SQLSTATE (Warn): " << stateW;
      omsg << endl;
      NAWriteConsole(error_msg,omsg, TRUE);
    }
  else
    {
      // Msg not found.  
      ComDiagsArea diags;
      diags << DgSqlCode(codeW);
      NADumpDiags(omsg, &diags, TRUE/*newline*/);
    }

#if 0			// CAUSE/EFFECT/RECOVERY text not implemented yet!
  if (!msgNotFound && type == DETAIL_)
    {
      GETERRORMESS(codeE, error_msg, CAUSE_TEXT);
      NAWriteConsole(error_msg,omsg, TRUE);

      GETERRORMESS(codeE, error_msg, EFFECT_TEXT);
      NAWriteConsole(error_msg,omsg, TRUE);

      GETERRORMESS(codeE, error_msg, RECOVERY_TEXT);
      NAWriteConsole(error_msg,omsg, TRUE);

    }
#endif // 0		// CAUSE/EFFECT/RECOVERY text not implemented yet!

  omsg << ends;					// to tack on a null-terminator
  sqlci_env->get_logfile()->WriteAllWithoutEOL(omsg.str().c_str());
  return 0;
}