Ejemplo n.º 1
0
/*
** Name: pmerr_func	    - error handling function for PM errors.
**
** Description:
**	This routine is called when a PM error is encountered. Typically, this
**	is some sort of syntax error revolving around the contents of
**	config.dat. This routine formats the error message and displays it to
**	the screen.
**
** Inputs:
**	err_number	    - Some specific error number.
**	num_arguments	    - number ofentries in the args array.
**	args		    - an array of error message arguments.
**
** Outputs:
**	NOne
**
** Returns:
**	VOID
**
** History:
**	22-nov-1993 (bryanp)
**	    Created for handling config.dat errors.
*/
static VOID
pmerr_func( STATUS err_number, i4 num_arguments, ER_ARGUMENT *args)
{
    STATUS	status;
    char	message[ER_MAX_LEN];
    i4		text_length;
    CL_ERR_DESC	sys_err;

    status = ERslookup( err_number, (CL_ERR_DESC*)0,
			    0,
			    (char *)NULL,
			    message,
			    ER_MAX_LEN,
			    (i4) -1,
			    &text_length,
			    &sys_err,
			    num_arguments,
			    args
			  );

    if ( status != OK )
    {
	SIprintf( "IIRUNDBMS: Unable to look up PM error %x\n", err_number );
    }
    else
    {
	SIprintf( "IIRUNDBMS: %.*s\n", text_length, message );
    }
    return;
}
Ejemplo n.º 2
0
/*{
** Name: II_GetIngresErrorMessage - Lookup error message from message file
**
** Description:
**  Return the text associated with the Ingres status.
**  The function returns the text associated with the Ingres status including
**  the decoded facility representation of the status in the text.
**
** Inputs:
**  ingres_status           Retrieve the text message associated with this
**                          value.
**  message_length          Length of the buffer area to write the message
**                          including additional space for the end of string
**                          marker.
**  message                 Pointer to the memory area where the retrieved
**                          message is to be written.
**
** Outputs:
**  message_length          If the function returns II_SUCCESSFUL the
**                          message_length field contains the number of
**                          storage octets in the message area that were used.
**  message                 The message text associated with the Ingres
**                          status.
**
** Returns:
**  II_SUCCESSFUL           The message was retrieved successfully
**  II_NULL_PARAM           The parameters passed are invalid; no output
**                          fields are updated.
**  II_INSUFFICIENT_BUFFER  A larger message area is required.
**  II_GET_MESSAGE_ERROR    An error orccured during the execution of this
**                          function.
**
** Example:
**  # include "tngapi.h"
**
**  II_INT4 status;
**  II_INT4 ingres_status = 0xC0132;
**  II_INT4 message_length = 20;
**  II_CHAR message[MAX_IIERR_LEN + 1;
**
**  status = II_GetIngresMessage( ingres_status, &message_length, message );
**  if (status != II_SUCCESSFUL)
**  {
**      if (status == II_INSUFFICIENT_BUFFER)
**      {
**          printf( "A larger buffer is required\n" );
**      }
**  }
**
**  message_length = MAX_IIERR_LEN + 1;
**  status = II_GetIngresMessage( ingres_status, &message_length, message );
**  if (status != II_SUCCESSFUL)
**  {
**      printf( "II_GetIngresMessage failed\n" );
**  }
**
** History:
**      20-Jan-2005 (fanra01)
**          Created.
}*/
int
II_GetIngresMessage(
    unsigned int ingres_status,
    int* message_length,
    char* message )
{
    i4          status;
    CL_ERR_DESC clerror;
    i4          flags;
    i4          msglen = 0;

    CL_CLEAR_ERR( &clerror );
    
    while(TRUE)
    {
        /*
        ** If any of the parameters are not valid, stop.
        */
        if ((message == NULL) || (message_length == NULL) ||
            (*message_length == 0))
        {
            status = II_NULL_PARAM;
            break;
        }
        /*
        ** Call ERslookup to get the message text from the message file.
        ** Let the value of flags be:
        **      ~ER_TEXTONLY    is not set, the error is decoded to include
        **                      the error identifier.
        **      ER_NOPARAM      there are no parameter values provided to be
        **                      entered into the message string.
        ** Let the value of language be:
        **      -1              use the default language.
        */
        flags = ER_NOPARAM;
        status = ERslookup( ingres_status, NULL, flags, NULL, message,
            *message_length, -1, &msglen, &clerror, 0, NULL );
        switch(status)
        {
            case OK:
                *message_length = STlength( message );
                status = II_SUCCESSFUL;
                break;
            case ER_TOOSMALL:
                status = II_INSUFFICIENT_BUFFER;
                break;
            default:
                status = II_GET_MESSAGE_ERROR;
                break;
        }
        break;
    }
    return(status);
}
Ejemplo n.º 3
0
static char *
er_decode( STATUS msg_id )
{
    STATUS old_err;
    STATUS errstat;
    CL_ERR_DESC err_code;
    i4  ret_len;
    char lbuf[ sizeof(ERbuf) ];

    if( msg_id == OK )
    {
	errstat = OK;
	STcopy( "OK", ERbuf );
    }
    else if ((errstat = ERslookup(msg_id,		/* msg num */
			    NULL,		/* input cl err */
			    0,			/* flags */
			    (char *) NULL,	/* sqlstate */
			    ERbuf,		/* buf */
			    sizeof(ERbuf),	/* sizeof buf */
			    -1,			/* language */
			    &ret_len,		/* msg len */
			    &err_code,		/* output err */
			    0,			/* num params */
			    NULL)		/* params */
	 ) != OK)
    {
	/* Recurse to decode ER error.  If we were processing error
	   already, give up to halt recursion */

	old_err = ERstat;	/* OK first time in */
	ERstat = errstat;	/* now not OK second time through */

	if( old_err == OK )
	    STcopy( lbuf, er_decode( errstat ) );
	else
	    STprintf(ERbuf, "ER err 0x%x", errstat );

	STprintf( ERbuf, "0x%x not found: %s", msg_id, lbuf ); 
    }

    /* Clear recursion check */
    ERstat = OK;

    return( ERbuf );
}
Ejemplo n.º 4
0
int
main(int c, char **v)
{
    i4		msg_id;
    i4		cnt = 0;
    char	mbuf[ER_MAX_LEN];
    i4		ret_len = 0;
    char	msgbuf[101];
    CL_ERR_DESC	clerror;
    CL_ERR_DESC	err_code;
    STATUS	stat;
    i4		flag = 0;
    bool	testsysdep = FALSE;
    bool	logoper = FALSE;

    MEadvise(ME_INGRES_ALLOC);

    for (++v, --c; c > 0; ++v, --c)
    {
	char *w = *v;
	if (w[0] == '-')
	{
	    switch (w[1])
	    {
	        case 't':
		    flag |= ER_TIMESTAMP;
		    break;
	        case 'n':
		    flag |= ER_NOPARAM;
		    break;
	        case 's':
		    testsysdep = TRUE;
		    break;
		case 'o':
		    logoper = TRUE;
		    break;
	        default:
		    SIfprintf(stderr, "only valid options are -t, -s, -n and -o\n");
		    PCexit(FAIL);
	    }
	}
	else
	    SIfprintf(stderr, "ignoring invalid argument \"%s\"\n", v);
    }

    if (testsysdep)    /* test system dependent error reporting */
    {
        extern int    errno;

	errno = 13;    /* EACCES */
	SETCLERR(&clerror, 0x10911, /* ER_INTERR_TESTMSG */  ER_open);
	STcopy("II_MSGDIR/erclf.msg", clerror.moreinfo[0].data.string);
	clerror.moreinfo[0].size = STlength(clerror.moreinfo[0].data.string);
    }

    while ((cnt++) < MAX_NUM_OF_LOOKUPS)
    {
	msg_id = -1;
	SIfprintf(stderr, "msg id, in hex, no 0x%s: ",
	    testsysdep? " (try 10904) " : "");
	if( OK != SIgetrec(msgbuf, 100, stdin) )
           break;
#if defined(any_aix) && defined(BUILD_ARCH64)
	(VOID) STscanf(msgbuf, "%x", &msg_id);
#else
	(VOID) STscanf(msgbuf, "%p", &msg_id);
#endif

	if (msg_id == -1)
	    break;

	if ((stat = ERslookup(msg_id, testsysdep? &clerror : NULL, flag, 
	    (char *) NULL, mbuf, ER_MAX_LEN, -1, &ret_len, &err_code, 5, 
	    er_arg)) != OK)
	{
	    SIfprintf(stderr,
		"ERslookup error. msg id is 0x%x, status is 0x%x\n",
		msg_id, stat);
	}
	else
	{
	    SIfprintf(stderr, "*** ERslookup:\n%s\n", mbuf);
            SIfprintf(stderr, "*** ERget:\n%s\n", ERget(msg_id));
	}

	if (testsysdep)
	{
	    if ((stat = ERslookup(0, &clerror, flag, (char *) NULL, mbuf, 
		ER_MAX_LEN, -1, &ret_len, &err_code, 5, er_arg)) != OK)
	    {
	        SIfprintf(stderr,
		    "ERslookup error on CL_ERR_DESC. Status is 0x%x\n", stat);
	    }
	    else
	        SIfprintf(stderr, "*** ERslookup (CL error):\n%s\n",mbuf);
        }
	
	if (logoper)
	{
	    ERsend( ER_ERROR_MSG|ER_OPER_MSG, mbuf, ret_len, &err_code );
	}
    }
    PCexit(OK);
}
Ejemplo n.º 5
0
/*{
** Name: rms_dterr	- Datatype-related error handler
**
** Description:
**	This routine accepts an error code and up to 3 parameter/length pairs
**	and inserts this and other information into the ADF control block
**	passed to it.  This routine, therefore, returns errors as if it were
**	ADF; its callers should treat errors from this module the same way it
**	treats ADF errors.
**
** Inputs:
**      scb		    The ADF_CB which contains the error block
**	  adf_errcb
**	    ad_ebuflen	    Length of following buffer (if 0, no msg desired)
**	    ad_errmsgp	    Pointer to buffer for msg (if NULL, no msg desired)
**	errnum		    The GWF error number of the error
**	num_params	    The number of parameter pairs needed to format this
**			    error's error message
**	p1l		    Length of parameter 1
**	p1p		    Parameter 1
**	....		    More of the same (up to 3 pairs)
**
** Outputs:
**	scb		    Contains adf_errcb to hold error info
**	  adf_errcb
**	    ad_errcode		Error code of error being returned
**	    ad_class		User error or internal error
**	    ad_usererr		Same as ad_errcode
**	    ad_sqlstate 	The sqlstate status code for this error
**	    ad_emsglen		Length of msg put into following buffer
**	    ad_errmsgp		Error msg if this pointer was not NULL
**
**	Returns:
**	    E_DB_OK, E_DB_WARN, E_DB_ERROR  (depending on the error)
**	Exceptions:
**	    none
**
** Side Effects:
**	    none
**
** History:
**	01-apr-90 (jrb)
**	    Created.
**	29-oct-92 (andre)
**	    in ADF_ERROR, ad_generic_error has been replaced with ad_sqlstate +
**	    ERlookup() was renamed to ERslookup() and its interface was changed
**	    to return sqlstate status code instead of generic error number
**      06-nov-96 (lawst01) changed define name from SS50000_MISC_ING_ERRORS
**          to SS50000_MISC_ERRORS to match changed name in header file
**          sqlstate.h.
[@history_template@]...
*/
DB_STATUS
rms_dterr
(
    ADF_CB  *scb,
    i4 	    errnum,
    i4 	    num_params,
    i4 	    p1l,
    PTR	    p1p,
    i4 	    p2l,
    PTR	    p2p,
    i4 	    p3l,
    PTR	    p3p
)
{
    DB_STATUS		status = E_DB_ERROR;
    ADF_ERROR		*errcb;
    STATUS		tmp_status;
    CL_SYS_ERR		sys_err;
    ER_ARGUMENT		parms[3];

    if (scb == NULL)
	return(status);

    errcb = &scb->adf_errcb;

    switch (errnum)
    {
      case E_GW7026_BAD_FLT_TO_MNY:
      case E_GW7050_BAD_ERLOOKUP:
      case E_GW7100_NOCVT_AT_STARTUP:
      case E_GW7999_INTERNAL_ERROR:
	errcb->ad_errclass = ADF_INTERNAL_ERROR;

      default:
	errcb->ad_errclass = ADF_USER_ERROR;
    }

    errcb->ad_errcode = errcb->ad_usererr = errnum;

    /* see if user really wants an error msg */
    if (errcb->ad_ebuflen == 0  ||  errcb->ad_errmsgp == NULL)
    {
	char	    *sqlstate_str = SS50000_MISC_ERRORS;
	i4	    i;

	for (i = 0; i < DB_SQLSTATE_STRING_LEN; i++)
	    errcb->ad_sqlstate.db_sqlstate[i] = sqlstate_str[i];
	errcb->ad_emsglen = 0;
	return(status);
    }

    switch (num_params)
    {
      case 3:
	parms[2].er_size = p3l;
	parms[2].er_value = p3p;
	/* fall through */
      case 2:
	parms[1].er_size = p2l;
	parms[1].er_value = p2p;
	/* fall through */
      case 1:
	parms[0].er_size = p1l;
	parms[0].er_value = p1p;
	/* fall through */
      case 0:
	tmp_status  = ERslookup(errnum, 0, ER_TIMESTAMP,
				errcb->ad_sqlstate.db_sqlstate,
				errcb->ad_errmsgp, errcb->ad_ebuflen, -1,
				&errcb->ad_emsglen, &sys_err, num_params,
				parms);
	break;
    }

    /* If ERlookup failed, handle it */
    if (tmp_status != OK)
    {
	char	    *sqlstate_str = SS50000_MISC_ERRORS;
	i4	    i;

	for (i = 0; i < DB_SQLSTATE_STRING_LEN; i++)
	    errcb->ad_sqlstate.db_sqlstate[i] = sqlstate_str[i];

	errcb->ad_errcode = E_GW7050_BAD_ERLOOKUP;
	errcb->ad_errclass = ADF_INTERNAL_ERROR;

	parms[0].er_size = 4;
	parms[0].er_value = (PTR)&errnum;
	ERslookup(errcb->ad_errcode, 0, ER_TIMESTAMP,
				errcb->ad_sqlstate.db_sqlstate,
				errcb->ad_errmsgp,
				errcb->ad_ebuflen, -1, &errcb->ad_emsglen,
				&sys_err, 1, parms);
	status = E_DB_ERROR;
    }

    return (status);
}
Ejemplo n.º 6
0
/*
** this is a temporary stub for ERlookup().  It will go away as of the next
** integration.
*/ 
STATUS
ERlookup(
    i4		    msg_number,
    CL_ERR_DESC	    *clerror,
    i4		    flags,
    i4		    *generic_error,
    char	    *msg_buf,
    i4		    msg_buf_size,
    i4		    language,
    i4		    *msg_length,
    CL_ERR_DESC	    *err_code,
    i4		    num_param,
    ER_ARGUMENT	    *param )
{
    STATUS	stat;
    char	sqlstate[5];

    stat = ERslookup(msg_number, clerror, flags, sqlstate, msg_buf,
	msg_buf_size, language, msg_length, err_code, num_param, param);

    if (stat != OK || generic_error == (i4 *) NULL)
	return(stat);

    /*
    ** now convert SQLSTATE to a generic error
    **
    ** here we are using a (AWK-filtered) copy of the routine converting
    ** SQLSTATEs to generic errors (I am only doing it [making a copy of an ADF
    ** function] because this stub has a month and a half to live)
    */

    {
	i4        ss_class, ss_subclass;
	static struct
	{
	    i4		dbmserr;
	    i4		generr;
	} numeric_exception[] =
	{
	    { /* E_AD1127_DECOVF_ERROR */	0x021127L,	0x9D0B },
	    { /* E_GW7015_DECIMAL_OVF */	0x0F7015L,	0x9D0B },
	    { /* E_AD1013_EMBEDDED_NUMOVF */	0x021013L,	0x9D1C },
	    { /* E_CL0503_CV_OVERFLOW */	0x010503L,	0x9D1C },
	    { /* E_GW7000_INTEGER_OVF */	0x0F7000L,	0x9D1C },
	    { /* E_US1068_4200 */		0x001068L,	0x9D1C },
	    { /* E_GW7001_FLOAT_OVF */		0x0F7001L,	0x9D1D },
	    { /* E_GW7004_MONEY_OVF */		0x0F7004L,	0x9D1D },
	    { /* E_US106A_4202 */		0x00106AL,	0x9D1D },
	    { /* E_CL0502_CV_UNDERFLOW */	0x010502L,	0x9D21 },
	    { /* E_GW7002_FLOAT_UND */		0x0F7002L,	0x9D22 },
	    { /* E_GW7005_MONEY_OVF */		0x0F7005L,	0x9D22 },
	    { /* E_US106C_4204 */		0x00106CL,	0x9D22 },
	    { -1L, -1L},
	};
    
	static struct
	{
	    i4         dbmserr;
	    i4         generr;
	} division_by_zero[] =
	{
	    { /* E_US1069_4201 */		0x001069L,	0x9D1E },
	    { /* E_US106B_4203 */		0x00106BL,	0x9D1F },
	    { /* E_AD1126_DECDIV_ERROR */	0x021126L,	0x9D20 },
	    { -1L, -1L},
	};
    
	/*
	** convert SQLSTATE class (treated as a base 36 number) to a base 10 integer
	*/
	if (sqlstate[0] > '0' && sqlstate[0] <= '9')
	    ss_class = (sqlstate[0] - '0') * 36;
	else if (sqlstate[0] >= 'A' && sqlstate[0] <= 'Z')
	    ss_class = (sqlstate[0] - 'A' + 10) * 36;
	else
	    ss_class = 0;
    
	if (sqlstate[1] > '0' && sqlstate[1] <= '9')
	    ss_class += sqlstate[1] - '0';
	else if (sqlstate[1] >= 'A' && sqlstate[1] <= 'Z')
	    ss_class += sqlstate[1] - 'A' + 10;
    
	/*
	** convert SQLSTATE subclass (treated as a base 36 number) to a base 10
	** integer
	*/
	if (sqlstate[2] > '0' && sqlstate[2] <= '9')
	    ss_subclass = 36 * 36 * (sqlstate[2] - '0');
	else if (sqlstate[2] >= 'A' && sqlstate[2] <= 'Z')
	    ss_subclass = 36 * 36 * (sqlstate[2] - 'A' + 10);
	else
	    ss_subclass = 0;
    
	if (sqlstate[3] > '0' && sqlstate[3] <= '9')
	    ss_subclass += 36 * (sqlstate[3] - '0');
	else if (sqlstate[3] >= 'A' && sqlstate[3] <= 'Z')
	    ss_subclass += 36 * (sqlstate[3] - 'A' + 10);
	
	if (sqlstate[4] > '0' && sqlstate[4] <= '9')
	    ss_subclass += sqlstate[4] - '0';
	else if (sqlstate[4] >= 'A' && sqlstate[4] <= 'Z')
	    ss_subclass += sqlstate[4] - 'A' + 10;
    
	switch (ss_class)
	{
	    case 120:
	    {
		switch (ss_subclass)
		{
		    default:
		    {
			*generic_error = 0x9DD0L;
			break;
		    }
		}
    
		break;
	    }
	    case 73:
	    {
		switch (ss_subclass)
		{
		    default:
		    {
			*generic_error = 0x9CA4L;
			break;
		    }
		}
    
		break;
	    }
	    case 8:
	    {
		switch (ss_subclass)
		{
		    case 3:
		    {
			*generic_error = 0x80E8L;
			break;
		    }
		    case 6:
		    {
			*generic_error = 0x9088L;
			break;
		    }
		    case 2:
		    {
			*generic_error = 0x80E8L;
			break;
		    }
		    case 1:
		    {
			*generic_error = 0x98BCL;
			break;
		    }
		    case 4:
		    {
			*generic_error = 0x94D4L;
			break;
		    }
		    case 7:
		    {
			*generic_error = 0x9088L;
			break;
		    }
		    case 6480:
		    {
			*generic_error = 0x75BCL;
			break;
		    }
		    default:
		    {
			*generic_error = 0x98BCL;
			break;
		    }
		}
    
		break;
	    }
	    case 74:
	    {
		switch (ss_subclass)
		{
		    case 73:
		    {
			*generic_error = 0x9D08L;
			break;
		    }
		    case 8:
		    {
			*generic_error = 0x9D0EL;
			break;
		    }
		    case 38:
		    {
			i4    i;
    
			for (i = 0;
			     (   division_by_zero[i].dbmserr != -1L
			      && division_by_zero[i].dbmserr != msg_number);
			     i++)
			;
    
			if (division_by_zero[i].dbmserr == -1L)
			    *generic_error = 0x9D24L;
			else
			    *generic_error = division_by_zero[i].generr;
    
			break;
		    }
		    case 5:
		    {
			*generic_error = 0x9D0CL;
			break;
		    }
		    case 74:
		    {
			*generic_error = 0x9D11L;
			break;
		    }
		    case 41:
		    {
			*generic_error = 0x9D0FL;
			break;
		    }
		    case 44:
		    {
			*generic_error = 0x7918L;
			break;
		    }
		    case 7:
		    {
			*generic_error = 0x9D0FL;
			break;
		    }
		    case 45:
		    {
			*generic_error = 0x7918L;
			break;
		    }
		    case 77:
		    {
			*generic_error = 0x7918L;
			break;
		    }
		    case 75:
		    {
			*generic_error = 0x9D08L;
			break;
		    }
		    case 9:
		    {
			*generic_error = 0x9D0FL;
			break;
		    }
		    case 2:
		    {
			*generic_error = 0x9D0AL;
			break;
		    }
		    case 3:
		    {
			i4    i;
    
			for (i = 0;
			     (   numeric_exception[i].dbmserr != -1L
			      && numeric_exception[i].dbmserr != msg_number);
			     i++)
			;
    
			if (numeric_exception[i].dbmserr == -1L)
			    *generic_error = 0x9D24L;
			else
			    *generic_error = numeric_exception[i].generr;
    
			break;
		    }
		    case 78:
		    {
			*generic_error = 0x9D08L;
			break;
		    }
		    case 1:
		    {
			*generic_error = 0x9D09L;
			break;
		    }
		    case 37:
		    {
			*generic_error = 0x80E8L;
			break;
		    }
		    case 79:
		    {
			*generic_error = 0x7918L;
			break;
		    }
		    case 76:
		    {
			*generic_error = 0x98BCL;
			break;
		    }
		    case 6480:
		    {
			*generic_error = 0x9D17L;
			break;
		    }
		    default:
		    {
			*generic_error = 0x9D08L;
			break;
		    }
		}
    
		break;
	    }
	    case 83:
	    {
		switch (ss_subclass)
		{
		    default:
		    {
			*generic_error = 0x7D00L;
			break;
		    }
		}
    
		break;
	    }
	    case 7:
	    {
		switch (ss_subclass)
		{
		    case 3:
		    {
			*generic_error = 0x7D00L;
			break;
		    }
		    case 8:
		    {
			*generic_error = 0x7D00L;
			break;
		    }
		    case 9:
		    {
			*generic_error = 0x7D00L;
			break;
		    }
		    case 5:
		    {
			*generic_error = 0x7D00L;
			break;
		    }
		    case 6:
		    {
			*generic_error = 0x7D00L;
			break;
		    }
		    case 1:
		    {
			*generic_error = 0x7D00L;
			break;
		    }
		    case 2:
		    {
			*generic_error = 0x7D00L;
			break;
		    }
		    case 4:
		    {
			*generic_error = 0x7D00L;
			break;
		    }
		    case 7:
		    {
			*generic_error = 0x7D00L;
			break;
		    }
		    case 6480:
		    {
			*generic_error = 0x98BCL;
			break;
		    }
		    default:
		    {
			*generic_error = 0x7D00L;
			break;
		    }
		}
    
		break;
	    }
	    case 10:
	    {
		switch (ss_subclass)
		{
		    case 1:
		    {
			*generic_error = 0x98BCL;
			break;
		    }
		    case 6480:
		    {
			*generic_error = 0x79E0L;
			break;
		    }
		    default:
		    {
			*generic_error = 0x98BCL;
			break;
		    }
		}
    
		break;
	    }
	    case 75:
	    {
		switch (ss_subclass)
		{
		    default:
		    {
			*generic_error = 0x9D6CL;
			break;
		    }
		}
    
		break;
	    }
	    case 80:
	    {
		switch (ss_subclass)
		{
		    default:
		    {
			*generic_error = 0xA028L;
			break;
		    }
		}
    
		break;
	    }
	    case 121:
	    {
		switch (ss_subclass)
		{
		    default:
		    {
			*generic_error = 0x98BCL;
			break;
		    }
		}
    
		break;
	    }
	    case 84:
	    {
		switch (ss_subclass)
		{
		    default:
		    {
			*generic_error = 0x7918L;
			break;
		    }
		}
    
		break;
	    }
	    case 113:
	    {
		switch (ss_subclass)
		{
		    default:
		    {
			*generic_error = 0x7D00L;
			break;
		    }
		}
    
		break;
	    }
	    case 86:
	    {
		switch (ss_subclass)
		{
		    default:
		    {
			*generic_error = 0x797CL;
			break;
		    }
		}
    
		break;
	    }
	    case 112:
	    {
		switch (ss_subclass)
		{
		    default:
		    {
			*generic_error = 0x75A8L;
			break;
		    }
		}
    
		break;
	    }
	    case 76:
	    {
		switch (ss_subclass)
		{
		    default:
		    {
			*generic_error = 0x9DD0L;
			break;
		    }
		}
    
		break;
	    }
	    case 123:
	    {
		switch (ss_subclass)
		{
		    default:
		    {
			*generic_error = 0x797CL;
			break;
		    }
		}
    
		break;
	    }
	    case 111:
	    {
		switch (ss_subclass)
		{
		    default:
		    {
			*generic_error = 0x75BCL;
			break;
		    }
		}
    
		break;
	    }
	    case 78:
	    {
		switch (ss_subclass)
		{
		    default:
		    {
			*generic_error = 0x75B2L;
			break;
		    }
		}
    
		break;
	    }
	    case 77:
	    {
		switch (ss_subclass)
		{
		    default:
		    {
			*generic_error = 0x9E34L;
			break;
		    }
		}
    
		break;
	    }
	    case 85:
	    {
		switch (ss_subclass)
		{
		    default:
		    {
			*generic_error = 0x9E34L;
			break;
		    }
		}
    
		break;
	    }
	    case 2:
	    {
		switch (ss_subclass)
		{
		    default:
		    {
			*generic_error = 0x0064L;
			break;
		    }
		}
    
		break;
	    }
	    case 647:
	    {
		switch (ss_subclass)
		{
		    default:
		    {
			*generic_error = 0x9088L;
			break;
		    }
		}
    
		break;
	    }
	    case 0:
	    {
		switch (ss_subclass)
		{
		    default:
		    {
			*generic_error = 0x0000L;
			break;
		    }
		}
    
		break;
	    }
	    case 146:
	    {
		switch (ss_subclass)
		{
		    case 6480:
		    {
			*generic_error = 0x7594L;
			break;
		    }
		    case 6481:
		    {
			*generic_error = 0x759EL;
			break;
		    }
		    case 6482:
		    {
			*generic_error = 0x75F8L;
			break;
		    }
		    case 6483:
		    {
			*generic_error = 0x84D0L;
			break;
		    }
		    case 6484:
		    {
			*generic_error = 0x75A8L;
			break;
		    }
		    case 6485:
		    {
			*generic_error = 0x75B2L;
			break;
		    }
		    case 6486:
		    {
			*generic_error = 0x797CL;
			break;
		    }
		    case 6487:
		    {
			*generic_error = 0x797CL;
			break;
		    }
		    default:
		    {
			*generic_error = 0x7918L;
			break;
		    }
		}
    
		break;
	    }
	    case 82:
	    {
		switch (ss_subclass)
		{
		    case 6480:
		    {
			*generic_error = 0x7594L;
			break;
		    }
		    case 6481:
		    {
			*generic_error = 0x759EL;
			break;
		    }
		    case 6482:
		    {
			*generic_error = 0x75F8L;
			break;
		    }
		    case 6483:
		    {
			*generic_error = 0x84D0L;
			break;
		    }
		    case 6484:
		    {
			*generic_error = 0x75A8L;
			break;
		    }
		    case 6485:
		    {
			*generic_error = 0x75B2L;
			break;
		    }
		    case 6486:
		    {
			*generic_error = 0x797CL;
			break;
		    }
		    case 6487:
		    {
			*generic_error = 0x797CL;
			break;
		    }
		    default:
		    {
			*generic_error = 0x7918L;
			break;
		    }
		}
    
		break;
	    }
	    case 115:
	    {
		switch (ss_subclass)
		{
		    case 6480:
		    {
			*generic_error = 0x7594L;
			break;
		    }
		    case 6481:
		    {
			*generic_error = 0x759EL;
			break;
		    }
		    case 6482:
		    {
			*generic_error = 0x75F8L;
			break;
		    }
		    case 6483:
		    {
			*generic_error = 0x84D0L;
			break;
		    }
		    case 6484:
		    {
			*generic_error = 0x75A8L;
			break;
		    }
		    case 6485:
		    {
			*generic_error = 0x75B2L;
			break;
		    }
		    case 6486:
		    {
			*generic_error = 0x797CL;
			break;
		    }
		    case 6487:
		    {
			*generic_error = 0x797CL;
			break;
		    }
		    default:
		    {
			*generic_error = 0x7918L;
			break;
		    }
		}
    
		break;
	    }
	    case 144:
	    {
		switch (ss_subclass)
		{
		    case 2:
		    {
			*generic_error = 0x9D6CL;
			break;
		    }
		    case 1:
		    {
			*generic_error = 0xC2ECL;
			break;
		    }
		    case 3:
		    {
			*generic_error = 0x9088L;
			break;
		    }
		    default:
		    {
			*generic_error = 0x98BCL;
			break;
		    }
		}
    
		break;
	    }
	    case 79:
	    {
		switch (ss_subclass)
		{
		    default:
		    {
			*generic_error = 0x9EFCL;
			break;
		    }
		}
    
		break;
	    }
	    case 1:
	    {
		switch (ss_subclass)
		{
		    case 1:
		    {
			*generic_error = 0x0032L;
			break;
		    }
		    case 2:
		    {
			*generic_error = 0x0032L;
			break;
		    }
		    case 8:
		    {
			*generic_error = 0x0032L;
			break;
		    }
		    case 5:
		    {
			*generic_error = 0x0032L;
			break;
		    }
		    case 3:
		    {
			*generic_error = 0x0032L;
			break;
		    }
		    case 7:
		    {
			*generic_error = 0x0032L;
			break;
		    }
		    case 6:
		    {
			*generic_error = 0x0032L;
			break;
		    }
		    case 10:
		    {
			*generic_error = 0x0032L;
			break;
		    }
		    case 9:
		    {
			*generic_error = 0x0032L;
			break;
		    }
		    case 4:
		    {
			*generic_error = 0x0032L;
			break;
		    }
		    case 6480:
		    {
			*generic_error = 0x0032L;
			break;
		    }
		    case 6481:
		    {
			*generic_error = 0x0032L;
			break;
		    }
		    default:
		    {
			*generic_error = 0x0032L;
			break;
		    }
		}
    
		break;
	    }
	    case 148:
	    {
		switch (ss_subclass)
		{
		    default:
		    {
			*generic_error = 0x7D00L;
			break;
		    }
		}
    
		break;
	    }
	    case 180:
	    {
		switch (ss_subclass)
		{
		    case 1:
		    {
			*generic_error = 0x7602L;
			break;
		    }
		    case 2:
		    {
			*generic_error = 0x8CA0L;
			break;
		    }
		    case 3:
		    {
			*generic_error = 0x8D04L;
			break;
		    }
		    case 4:
		    {
			*generic_error = 0x8D68L;
			break;
		    }
		    case 5:
		    {
			*generic_error = 0x9470L;
			break;
		    }
		    case 6:
		    {
			*generic_error = 0x9858L;
			break;
		    }
		    case 7:
		    {
			*generic_error = 0x9E98L;
			break;
		    }
		    case 8:
		    {
			*generic_error = 0xA0F0L;
			break;
		    }
		    case 9:
		    {
			*generic_error = 0xA154L;
			break;
		    }
		    case 10:
		    {
			*generic_error = 0x7D00L;
			break;
		    }
		    case 11:
		    {
			*generic_error = 0x98BCL;
			break;
		    }
		    case 12:
		    {
			*generic_error = 0x9D0DL;
			break;
		    }
		    case 13:
		    {
			*generic_error = 0x9D12L;
			break;
		    }
		    case 14:
		    {
			*generic_error = 0xA21CL;
			break;
		    }
		    case 15:
		    {
			*generic_error = 0x98BCL;
			break;
		    }
		    case 16:
		    {
			*generic_error = msg_number;
			break;
		    }
		    case 17:
		    {
			*generic_error = 0x75BCL;
			break;
		    }
		    case 18:
		    {
			*generic_error = 0x98BCL;
			break;
		    }
		    case 19:
		    {
			*generic_error = 0x98BCL;
			break;
		    }
		    case 20:
		    {
			*generic_error = 0x98BCL;
			break;
		    }
		    case 21:
		    {
			*generic_error = 0x9088L;
			break;
		    }
		    case 22:
		    {
			*generic_error = 0x9088L;
			break;
		    }
		    default:
		    {
			*generic_error = 0x98BCL;
			break;
		    }
		}
    
		break;
	    }
	    default:
	    {
		*generic_error = 0x98BCL;
		break;
	    }
	}
    
    }

    return(OK);
}
Ejemplo n.º 7
0
STATUS
ERslookup(
    i4		    msg_number,
    CL_ERR_DESC	    *clerror,
    i4		    flags,
    char	    *sqlstate,
    char	    *msg_buf,
    i4		    msg_buf_size,
    i4		    language,
    i4		    *msg_length,
    CL_ERR_DESC	    *err_code,
    i4		    num_param,
    ER_ARGUMENT	    *param )
{
    i4			erindex;	/* index of ERmulti table */
    i4		status;
    i4			length = 0;
    ER_ARGUMENT		*p;
    ER_ARGUMENT		hidden[CLE_INFO_ITEMS];	/* to access info in clerror */
    char		tempbuf[ER_MAX_LEN+ER_MAX_NAME+2];
    i4			templen;
    char		*p_msg_buf;
    char		*p_tempbuf;
    SYSTIME		stime;
    char		langbuf[ER_MAX_LANGSTR];
    EX_CONTEXT		context;
    ER_SEMFUNCS		*sems;

#define			    D_WIDTH	    23
#define			    F_WIDTH	    20
#define			    X_WIDTH	    18


    /*	Validate the parameters. */

    if (msg_buf == 0 || msg_buf_size == 0 || msg_length == 0)
    {
	return (ER_BADPARAM);
    }
    if (language != -1 && ERlangstr(language,langbuf) != OK)
    {
	return (ER_BADLANGUAGE);
    }
 
    if (!(flags & ER_NAMEONLY))
    {
        EXdump(msg_number,0);
    }
 

    /*	Insert timestamp if requested. */

    if (flags & ER_TIMESTAMP)
    {
	if (msg_buf_size < 21)
	{
	    return (ER_TOOSMALL);
	}
	TMnow(&stime);
	TMstr(&stime,msg_buf);

	length = (i4)STlength(msg_buf);	
	msg_buf[length++] = ' ';
    }

    /*
    **    if (clerror && msg_number)
    **        look up msg_number, optional parameters in clerror->moreinfo
    **    else if (clerror)
    **    {
    **        if (clerror->intern)
    **            look up clerror.intern, optional params in clerror->moreinfo
    **        if (clerror->callid)
    **            look up system error message
    **    }
    */
    if (clerror)
    {
	if (msg_number)	/* Look up message after system error */
	{
	    /*
	    ** Set up an ER_ARGUMENT that references system-dependent
	    ** information in `clerror', and point `param' at it.
	    */
	    i4  i;

	    for (i = 0; i < CLE_INFO_ITEMS; ++i)
	    {
	        /* "...all of whose members begin at offset 0..." (K&R) */

	        hidden[i].er_value = (PTR)&clerror->moreinfo[i].data._i4;
	        hidden[i].er_size = clerror->moreinfo[i].size;
	    }

	    param = &hidden[0];
	    num_param = CLE_INFO_ITEMS;
	}
        else		/* retrieve system-dependent error messages */
	{
	    i4	        len;
	    ER_ARGUMENT	argv[3];

	    if (clerror->intern)    /* look up internal CL error */
	    {
	        i4  i;

	        for (i = 0; i < CLE_INFO_ITEMS; ++i)
	        {
	            argv[i].er_value = (PTR)&clerror->moreinfo[i].data._i4;
	            argv[i].er_size = clerror->moreinfo[i].size;
	        }

	        /*
	        ** Don't timestamp on recursive call, since it's been done
	        ** already (if requested).
	        */
	        if ((status = ERslookup((i4) clerror->intern,
		    (CL_ERR_DESC*) NULL, flags & ~ER_TIMESTAMP | ER_TEXTONLY,
		    NULL, &msg_buf[length], msg_buf_size-length, language, &len,
		    err_code, CLE_INFO_ITEMS, argv)) != OK)
	        {
	            return (status);
	        }
	        length += len;

		if (clerror->callid)
		    msg_buf[length++] = '\n';
	    }

	    if (clerror->callid)    /* look up system error message text */
	    {
                DESCRIPTOR	msg_desc;

    	        msg_desc.desc_length = sizeof(tempbuf) - 1;
	        msg_desc.desc_value = tempbuf;
	        if ((status = cer_sysgetmsg(clerror, &len, &msg_desc, err_code))
		    != OK)
	        {
	            return(status);
	        }

	        argv[0].er_size = argv[1].er_size = argv[2].er_size =
		    ER_PTR_ARGUMENT;

	        argv[0].er_value = (PTR)&clerror->errnum;
	        argv[1].er_value = (PTR)ERNAME((i4) clerror->callid);
	        argv[2].er_value = (PTR)tempbuf;

	        if ((status = ERslookup(ER_UNIXERROR, (CL_ERR_DESC*) NULL,
	                flags & ~ER_TIMESTAMP | ER_TEXTONLY, NULL,
			&msg_buf[length], msg_buf_size - length, language,
			&len,err_code, 3, argv))
		    != OK)
	        {
	            return (status);
	        }
	        length += len;
	    }

	    msg_buf[*msg_length = length] = EOS;
	    return (OK);
        }
    }


    /*
    **	Check if error message file is already opened or not yet. 
    **  First see if the language is initialized.  If not, initialize
    **  it and the message files.
    **	If it is already opened, cer_fndindex function returns the index of
    **	ERmulti table that internal language code is parameter 'language'.
    **  If not yet, it returns '-1'.
    */

    if (cer_issem(&sems))
    {
	if (((sems->sem_type & MU_SEM) ?
	    (*sems->er_p_semaphore)(&sems->er_mu_sem) :
	    (*sems->er_p_semaphore)(1, &sems->er_sem)) != OK)
	{
	    sems = NULL;
	}
    }

    if ((erindex = cer_fndindex(language)) == -1)
    {
	if ((status = cer_nxtindex(language,&erindex)) != OK)
	{   /* Error in initializing the language */
	    if (sems)
	    {
		if (sems->sem_type & MU_SEM)
		    _VOID_ (*sems->er_v_semaphore)(&sems->er_mu_sem);
		else
		    _VOID_ (*sems->er_v_semaphore)(&sems->er_sem);
	    }
	    return (status);
	}
    }

    /*  If the error message file is not opened, open the message file. */

    if (!cer_isopen(erindex,ER_SLOWSIDE))
    {
        if ((status = cer_sinit(language,msg_number,erindex,err_code)) != OK)
        {
	    if (sems)
	    {
		if (sems->sem_type & MU_SEM)
		    _VOID_ (*sems->er_v_semaphore)(&sems->er_mu_sem);
		else
		    _VOID_ (*sems->er_v_semaphore)(&sems->er_sem);
	    }
            return (status);
        }
    }

    /*	If not open then just return. */
    if (!cer_isopen(erindex,ER_SLOWSIDE))
    {
	if (sems)
	{
	    if (sems->sem_type & MU_SEM)
		_VOID_ (*sems->er_v_semaphore)(&sems->er_mu_sem);
	    else
		_VOID_ (*sems->er_v_semaphore)(&sems->er_sem);
	}
	/*
	**  As internal file id is '0', openning file will fail.
	**  In her,return status 'ER_BADOPEN' to show open fail.
	*/
	return (ER_BADOPEN);
    }
	
    /*
    **  Search message string from file and set to buffer.
    **	Error status on system call set to 'err_code'.
    */

    status = cer_sstr(msg_number, sqlstate, tempbuf,
			msg_buf_size - length, erindex, err_code,
			flags & ER_TEXTONLY? ER_GET : ER_LOOKUP);
    if (sems)
    {
	if (sems->sem_type & MU_SEM)
	    _VOID_ (*sems->er_v_semaphore)(&sems->er_mu_sem);
	else
	    _VOID_ (*sems->er_v_semaphore)(&sems->er_sem);
    }

    if (status != OK)
    {
	return (status);
    }

    /*
    **	Format the text with parameters into the callers buffer.
    **  The message is truncated if it will not fit.
    */

    /*  Insert part of name from temporary buffer to buffer */

    status = OK;
    templen = (i4)STlength(tempbuf);
    p_msg_buf = &msg_buf[length];
    p_tempbuf = tempbuf;
    if (!(flags & ER_TEXTONLY))
    {
        while(*p_tempbuf != '\t')
        {
	    CMcpyinc(p_tempbuf,p_msg_buf);
        }
        CMcpyinc(p_tempbuf,p_msg_buf);
    }
    

    /* ============================================ */
    /* Copy text to message substituting arguments. */
    /* -------------------------------------------- */
    /* (But first, declare an exception handler to  */
    /*  catch bad params that may access violate.)  */
    /* ============================================ */

    if (EXdeclare(er_exhandler, &context))
    {
	u_i4	res_len;
	u_i4	bytes_left_in_buf;

	bytes_left_in_buf = (u_i4)(msg_buf_size - (p_msg_buf - msg_buf));
	res_len = STlen( STncpy(p_msg_buf,
   ERx("*** ERslookup() ERROR: Missing or bad parameter for this message. ***"),
	bytes_left_in_buf ));
	p_msg_buf[ bytes_left_in_buf - 1 ] = EOS;
	p_msg_buf += res_len;
	*msg_length = (i4)(p_msg_buf - msg_buf);
	EXdelete();
	return (OK);
    }


    for( ;p_tempbuf - tempbuf < templen; CMnext(p_tempbuf))
    {
        long		number;
        u_long    	unumber;
        double		fnumber;
	i4		i;
	i4		pnum;
 
	if ( (*p_tempbuf != '%') || (flags & ER_NOPARAM) )
	{
	    if ((p_msg_buf - msg_buf) >= msg_buf_size)
		break;
	    CMcpychar(p_tempbuf,p_msg_buf);
	    CMnext(p_msg_buf);
	    continue;
	}
	if (p_tempbuf - tempbuf + 2 >= templen)
	    continue;
	CMnext(p_tempbuf);
	if (*p_tempbuf == '!')
	{
	    if ((p_msg_buf - msg_buf) + 3 >= msg_buf_size)
		continue;
	    CMcpychar(ERx("\r"),p_msg_buf);
	    CMnext(p_msg_buf);
	    CMcpychar(ERx("\n"),p_msg_buf);
	    CMnext(p_msg_buf);
	    CMcpychar(ERx("\t"),p_msg_buf);
	    CMnext(p_msg_buf);
	    continue;
	}
	/*
	** Only works for up to 10 parameters, and makes character set
	** assumptions - should be fixed.
	*/
	if ( *p_tempbuf < '0' || *p_tempbuf > '9' )
	{
	    /* treat any other character as a literal */
	    if ((p_msg_buf - msg_buf) >= msg_buf_size)
		break;
	    if ( *p_tempbuf != '%' )
	    {
	        CMcpychar("%",p_msg_buf);
	        CMnext(p_msg_buf);
	    }
	    CMcpychar(p_tempbuf,p_msg_buf);
	    CMnext(p_msg_buf);
	    continue;
	}
	pnum = *p_tempbuf - '0';
	if (pnum >= num_param)
	{
		EXdelete();
		return(ER_BADPARAM);
	}
	p = &param[pnum];
	CMnext(p_tempbuf);
	switch (*p_tempbuf)
	{
	  case 'd':
	    /* Convert an integer into the buffer with width D_WIDTH */

	    if (p->er_size == ER_PTR_ARGUMENT) /* this is ptr to i4 */
		number = *(i4 *)p->er_value;
	    else if (p->er_size == 0)   /* this is a i4 */
		number = (i4)(SCALARP)p->er_value;
	    else if (p->er_size == 1)
		number = *(i1 *)p->er_value;
	    else if (p->er_size == 2)
		number = *(i2 *)p->er_value;
	    else if (p->er_size == 4)
		number = *(i4 *)p->er_value;
	    else if (p->er_size == 8)
		number = *(i8 *)p->er_value;
	    else
		continue;

	    if (p_msg_buf - msg_buf + D_WIDTH >= msg_buf_size)
	        continue;

	    if (p->er_size == 8)
	    {
	        CVla8(number, p_msg_buf);
	    }
	    else
	    {
	        CVla((i4)number, p_msg_buf);
	    }
	    while (*p_msg_buf)
		CMnext(p_msg_buf);
	    continue;

	  case 'u':
	    /* Convert an integer into the buffer with width D_WIDTH */

	    if (p->er_size == ER_PTR_ARGUMENT) /* this is ptr to u_i4 */
		number = *(u_i4 *)p->er_value;
	    else if (p->er_size == 0)   /* this is a u_i4 */
		number = (u_i4)(SCALARP)p->er_value;
	    else if (p->er_size == 1)
		number = *(u_i1 *)p->er_value;
	    else if (p->er_size == 2)
		number = *(u_i2 *)p->er_value;
	    else if (p->er_size == 4)
		number = *(u_i4 *)p->er_value;
	    else if (p->er_size == 8)
		number = *(u_i8 *)p->er_value;
	    else
		continue;

	    if (p_msg_buf - msg_buf + D_WIDTH >= msg_buf_size)
	        continue;

	    if (p->er_size == 8)
	    {
	        CVula8(number, p_msg_buf);
	    }
	    else
	    {
	        CVula((u_i4)number, p_msg_buf);
	    }
	    while (*p_msg_buf)
		CMnext(p_msg_buf);
	    continue;

	  case 'f':
	  {
	    i2	    res_width;

	    /* Convert a float into the buffer with width F_WIDTH */

	    if (p->er_size == ER_PTR_ARGUMENT) /* Pointer to a double */
		fnumber = *(double *)p->er_value;
	    else if (p->er_size == 4)
		fnumber = *(f4 *)p->er_value;
	    else if (p->er_size == 8)
		fnumber = *(f8 *)p->er_value;
	    else
		continue;

	    if (p_msg_buf - msg_buf + F_WIDTH >= msg_buf_size)
		continue;

	    /* Always convert to 'e' format. */

	    CVfa(fnumber, (i4) 20, (i4) 5, 'e', '.', p_msg_buf, &res_width);
	    p_msg_buf += F_WIDTH;
	    continue;
	  }
	  case 'c':
	    /* Convert a character array into buffer. */

	    if (p->er_value == 0)
		p->er_value = (PTR)ERx("<missing>");
	    if ((p->er_size == 0) || (p->er_size == ER_PTR_ARGUMENT))
	    {
		for (i = 0; ((char *)p->er_value)[i]; i++)
		    ;
		p->er_size = i;
	    }
             
	    if (p_msg_buf - msg_buf + p->er_size >= msg_buf_size)
		continue;

	    if (p->er_size > msg_buf_size - (p_msg_buf - msg_buf))
		p->er_size = (i4)(msg_buf_size - (p_msg_buf - msg_buf));
/*	    p->er_size=STtrmwhite(p_msg_buf);*/
	    MEcopy(p->er_value, p->er_size, p_msg_buf);
	    p->er_size = (i4)STtrmnwhite(p_msg_buf, p->er_size);
	    p_msg_buf += p->er_size;
	    continue;

	  case 'x':
	    /* Convert an integer into the buffer with width D_WIDTH */

	    if (p->er_size == ER_PTR_ARGUMENT)
		unumber = *(u_i4 *)p->er_value;
	    else if (p->er_size == 0)
		unumber = (u_i4)(SCALARP)p->er_value;
	    else if (p->er_size == 1)
		unumber = *(u_i1 *)p->er_value;
	    else if (p->er_size == 2)
		unumber = *(u_i2 *)p->er_value;
	    else if (p->er_size == 4)
		unumber = *(u_i4 *)p->er_value;
	    else if (p->er_size == 8)
		unumber = *(u_i8 *)p->er_value;

	    if (p_msg_buf - msg_buf + X_WIDTH >= msg_buf_size)
		continue;

	    for (i = 8; --i >= 0; )
	    {
		/* {@fix_me@}
		** This is *NOT* machine independent.  This relys on an
		** ASCII-like character set, where the digits '0'-'9' are
		** contiguous and sequential, and the characters 'A'-'F'
		** are contiguous and sequential.  Both ASCII and EBCDIC
		** happen to be this way.
		*/
		if ((*(p_msg_buf + i) = (unumber & 0x0f) + '0') > '9')
		    *(p_msg_buf + i) += 'A' - '9' - 1;
		unumber >>= 4;
	    }
	    p_msg_buf += 8;
	    continue;

	default:
	    continue;
	}
    }
    *msg_length = (i4)(p_msg_buf - msg_buf);
    *p_msg_buf = EOS;
    EXdelete();
    return (OK);
}
Ejemplo n.º 8
0
DB_STATUS
uleFormatFcn(
DB_ERROR    *dberror,
i4	    err_code,
CL_ERR_DESC *clerror,
i4	    flag,
DB_SQLSTATE *sqlstate,
char	    *msg_buffer,  
i4	    msg_buf_length,
i4	    *msg_length,
i4          *uleError,
PTR	    uleFileName,
i4	    uleLineNumber,
i4	    num_parms,
	    ... )
{

#define  NUM_ER_ARGS 12

    struct  {
		ULE_MHDR	hdr;
/*  FIX ME should message size be ER_MAX_LEN - sizeof(ULE_MHDR) */
		char		message[ER_MAX_LEN];
	    }	    buffer;
    i4		    i;
    i4	    	    length = 0;
    i4		    text_length;
    i4	    	    status;
    CL_ERR_DESC	    sys_err;
    i4              language;
    SCF_SESSION	    sid;
    SCF_SCI	    info[10];
    SCF_CB	    scf_cb;
    ER_ARGUMENT     er_args[NUM_ER_ARGS];
    char	    hex_chars[16] = {'0','1','2','3','4','5','6','7',
                                     '8','9','a','b','c','d','e','f'};
    i4		    error_code;
    i4	    	    local_error_code;
    DB_ERROR	    localDBerror, *DBerror;
    PTR		    FileName;
    i4		    LineNumber;
    char	    *qbuf = NULL;
    char	    *prev_qbuf = NULL;
    char	    *psqbuf = NULL;
    i4		    qlen = 0;
    i4		    prev_qlen = 0;
    i4		    psqlen = 0;
    i4		    trace_errno = 0;
    i4		    trace_stack = 0;
    i4		    prlen;
    char	    *prbuf;
    i2		    hdr_size;
    i4		    NumParms;
    va_list	    ap;

    LOCATION	    loc;
    char	    dev[LO_NM_LEN];
    char	    fprefix[LO_NM_LEN];
    char	    fsuffix[LO_NM_LEN];
    char	    version[LO_NM_LEN];
    char	    path[MAX_LOC + 1];
    char	    filebuf[MAX_LOC + 1];
    char	    LineNo[LO_NM_LEN];
    char	    *MessageArea = (char*)&buffer.message;
    char	    SourceInfo[LO_NM_LEN];
    i4		    PrefixLen = sizeof(ULE_MHDR);

    if (Ule_started == 0)
    {
	MEfill(sizeof(ULE_MHDR), (u_char)' ', (PTR)&Ule_mhdr);
	Ule_started = -1;
    }

    /*
    ** If old form (no dberror) or overriding err_code,
    ** use caller's err_code, File, and Line information,
    ** otherwise use what's in "dberror".
    */
    if ( !dberror || err_code )
    {
        DBerror = &localDBerror;
	DBerror->err_file = uleFileName;
	DBerror->err_line = uleLineNumber;
	DBerror->err_code = err_code;
	DBerror->err_data = 0;

	/* Fill caller's dberror with that used */
	if ( dberror )
	    *dberror = *DBerror;
    }
    else
        DBerror = dberror;

    error_code = local_error_code = DBerror->err_code;

    MessageArea = (char*)&buffer.message;


    info[0].sci_code = SCI_SID;
    info[0].sci_length = sizeof(sid);
    info[0].sci_aresult = (char *) &sid;
    info[0].sci_rlength = 0;
    info[1].sci_code = SCI_LANGUAGE;
    info[1].sci_length = sizeof(language);
    info[1].sci_aresult = (char *) &language;
    info[1].sci_rlength = 0;
    scf_cb.scf_length = sizeof(SCF_CB);
    scf_cb.scf_type = SCF_CB_TYPE;
    scf_cb.scf_ascii_id = SCF_ASCII_ID;
    scf_cb.scf_facility = DB_ULF_ID;
    scf_cb.scf_session = DB_NOSESSION;
    scf_cb.scf_len_union.scf_ilength = 2;
    scf_cb.scf_ptr_union.scf_sci = (SCI_LIST *) &info[0];
    /* scf_error is not usually an input parameter */
    if (flag == ULE_LOG || flag == ULE_MESSAGE)
    {
	info[2].sci_code = SCI_QBUF;
	info[2].sci_length = sizeof(qbuf);
	info[2].sci_aresult = (char *) &qbuf;
	info[2].sci_rlength = 0;
	info[3].sci_code = SCI_QLEN;
	info[3].sci_length = sizeof(qlen);
	info[3].sci_aresult = (char *) &qlen;
	info[3].sci_rlength = 0;
	info[4].sci_code = SCI_TRACE_ERRNO;
	info[4].sci_length = sizeof(trace_errno);
	info[4].sci_aresult = (char *) &trace_errno;
	info[4].sci_rlength = 0;
	info[5].sci_code = SCI_PREV_QBUF;
	info[5].sci_length = sizeof(prev_qbuf);
	info[5].sci_aresult = (char *) &prev_qbuf;
	info[5].sci_rlength = 0;
	info[6].sci_code = SCI_PREV_QLEN;
	info[6].sci_length = sizeof(prev_qlen);
	info[6].sci_aresult = (char *) &prev_qlen;
	info[6].sci_rlength = 0;
	info[7].sci_code = SCI_PSQ_QBUF;
	info[7].sci_length = sizeof(psqbuf);
	info[7].sci_aresult = (char *) &psqbuf;
	info[7].sci_rlength = 0;
	info[8].sci_code = SCI_PSQ_QLEN;
	info[8].sci_length = sizeof(psqlen);
	info[8].sci_aresult = (char *) &psqlen;
	info[8].sci_rlength = 0;
	info[9].sci_code = SCI_TRACE_STACK;
	info[9].sci_length = sizeof(trace_stack);
	info[9].sci_aresult = (char *) &trace_stack;
	info[9].sci_rlength = 0;
	scf_cb.scf_len_union.scf_ilength = 10;
    }
    status = scf_call(SCU_INFORMATION, &scf_cb);
    if (status)
    {
	language = 1;
	sid = 0;
    }
    if (!language)
	language = 1;


    /* package up the stack parameters into an ER_ARGUMENT array */

    va_start( ap, num_parms );

    for( NumParms = 0; NumParms < num_parms && NumParms < NUM_ER_ARGS; NumParms++ )
    {
       er_args[NumParms].er_size = (i4) va_arg( ap, i4 );
       er_args[NumParms].er_value = (PTR) va_arg( ap, PTR );
    }

    va_end( ap );

    *uleError = 0;

    if (flag == 0 || flag == ULE_LOG || flag == ULE_LOOKUP)
    {
	/* Get INGRES message text. */

	status = ERslookup( local_error_code,
			    CLERROR(local_error_code)? clerror : (CL_ERR_DESC*) NULL,
			    ER_TIMESTAMP,
			    (sqlstate) ? sqlstate->db_sqlstate : (char *) NULL,
			    MessageArea,
			    (i4) sizeof(buffer.message),
			    (i4) language,
			    &text_length,
			    &sys_err,
			    NumParms,
			    er_args
			  );

	if (status != OK)
	{
	    CL_ERR_DESC    junk;

	    STprintf(MessageArea, "ULE_FORMAT: ");
	    length = STlength(MessageArea);

	    /*
	    ** If uleFormat caller is different than
	    ** error source, identify caller.
	    */
	    if ( flag == ULE_LOG && uleFileName &&
	        (uleFileName != DBerror->err_file ||
	         uleLineNumber != DBerror->err_line) )
	    {
		STcopy(uleFileName, filebuf);

		STprintf(LineNo, ":%d ", uleLineNumber);

		if ( LOfroms(PATH & FILENAME, filebuf, &loc) ||
		     LOdetail(&loc, dev, path, fprefix, fsuffix, version) )
		{
		    STpolycat(2, FileName,
		    		 LineNo,
				 &MessageArea[length]);
		}
		else
		{
		    STpolycat(4, fprefix,
				 ".", fsuffix, 
				 LineNo,
				 &MessageArea[length]);
		}
		length = STlength(MessageArea);
		MessageArea[length++] = ' ';
	    }

	    STprintf(&MessageArea[length],
			"Couldn't look up message %x ",
			local_error_code);
	    length = STlength(MessageArea);

	    STprintf(&MessageArea[length], "(reason: ER error %x)\n",status);
	    length = STlength(MessageArea);
	    status = ERslookup( (i4) status,
				&sys_err,
				(i4) 0,
				(sqlstate) ? sqlstate->db_sqlstate
					   : (char *) NULL,
				&MessageArea[length],
				(i4) (sizeof(buffer.message) - length),
				(i4) language,
				&text_length,
				&junk,
				0,
				(ER_ARGUMENT *) NULL
			     );
	    if (status != OK)
	    {
		STprintf(&MessageArea[length],
		    "... ERslookup failed twice:  status = %x", status);
		length = STlength(MessageArea);
	    }
	    else
	    {
		length += text_length;
	    }

	    *uleError = E_UL0002_BAD_ERROR_LOOKUP;
	}
	else
	{
	    length = text_length;
	}

	/* Get system message text. */

	if (clerror)
	{
	    MessageArea[length++] = '\n';

	    /*
	    ** Extract the distinct clerror source information, filename,
	    ** extension, and line number from CL_ERR_DESC
	    ** and prefix the message text with it.
	    */
	    if ( !CLERROR(error_code) && (FileName = clerror->errfile) )
	    {
		STcopy(FileName, filebuf);

		STprintf(LineNo, ":%d ", clerror->errline);

		if ( LOfroms(PATH & FILENAME, filebuf, &loc) ||
		     LOdetail(&loc, dev, path, fprefix, fsuffix, version) )
		{
		    STpolycat(2, FileName,
		    		 LineNo,
				 &MessageArea[length]);
		}
		else
		{
		    STpolycat(4, fprefix, 
				 ".", fsuffix, 
				 LineNo,
				 &MessageArea[length]);
		}

		length += STlength(&MessageArea[length]);
		MessageArea[length++] = ' ';
	    }

	    status = ERslookup(	(i4) 0,
				clerror,
				(i4) 0,
				(sqlstate) ? sqlstate->db_sqlstate
					   : (char *) NULL,
				&MessageArea[length],
				(i4) (sizeof(buffer.message) - length),
				(i4) language,
				&text_length,
				&sys_err,
				0,
				(ER_ARGUMENT *) NULL
			      );
	    if (status != OK)
	    {
	        CL_ERR_DESC    junk;

		STprintf(&MessageArea[length],
			"ULE_FORMAT: Couldn't look up system error ");
		length = STlength(MessageArea);

	        STprintf(&MessageArea[length],
		    "(reason: ER error %x)\n", status);
	        length = STlength(MessageArea);
	        status = ERslookup( (i4) status,
				    &sys_err,
				    (i4) 0,
				    (sqlstate) ? sqlstate->db_sqlstate
					       : (char *) NULL,
				    &MessageArea[length],
				    (i4) (sizeof(buffer.message) - length),
				    (i4) language,
				    &text_length,
				    &junk,
				    0,
				    (ER_ARGUMENT *) NULL
			         );
	        if (status != OK)
	        {
		    STprintf(&MessageArea[length],
		        "... ERslookup failed twice:  status = %x", status);
		    length = STlength(MessageArea);
	        }
		else
		{
		    length += text_length;
		}
		*uleError = E_UL0001_BAD_SYSTEM_LOOKUP;
	    }
	    else
	    {
		length += text_length;
	    }
	}

	/* Copy into callers buffer if requested. */

	if (msg_buffer && msg_buf_length)
	{
	    if (msg_buf_length < length)
		length = msg_buf_length;
	    MEcopy((PTR)MessageArea, length, (PTR)msg_buffer);
	    *msg_length = length;
	}
    }
    else if (flag == ULE_MESSAGE)
    {
	if (!msg_buffer || !msg_buf_length)
	{
	    *uleError = E_UL0003_BADPARM;
	    return (E_DB_ERROR);
	}
	MEcopy((PTR)msg_buffer, msg_buf_length, (PTR)MessageArea);
	length = msg_buf_length;
    }

    if (flag == ULE_LOG || flag == ULE_MESSAGE)
    {
	SCF_SESSION tmp_sid = sid;

	MEcopy((PTR)&Ule_mhdr, sizeof(ULE_MHDR), (PTR)&buffer.hdr);

        for (i = (sizeof(Ule_mhdr.ule_session)) ; --i >= 0; )
	{
            buffer.hdr.ule_session[i] = hex_chars[(tmp_sid & 0xf)];
            tmp_sid >>= 4;
	}
	
	/*
	** Extract the error source information, filename, extension,
	** and line number from CL_ERR_DESC or DB_ERROR
	** and format it into the ULE_MHDR.
	*/
	if ( CLERROR(DBerror->err_code) && clerror && clerror->errfile )
	{
	    FileName = clerror->errfile;
	    LineNumber = clerror->errline;
	}
	else
	{
	    FileName = DBerror->err_file;
	    LineNumber = DBerror->err_line;
	}

	if ( FileName )
	{

	    STprintf(LineNo, ":%d ", LineNumber);
	    
	    STcopy(FileName, filebuf);
	    if ( LOfroms(PATH & FILENAME, filebuf, &loc) ||
		 LOdetail(&loc, dev, path, fprefix, fsuffix, version) )
	    {
		STpolycat(2, FileName,
			     LineNo,
			     SourceInfo);
	    }
	    else
	    {
		STpolycat(4, fprefix, 
			     ".", fsuffix, 
			     LineNo,
			     SourceInfo);
	    }

	    STmove(SourceInfo, ' ', SourceInfoLen, (PTR)&buffer.hdr.ule_source);
	}

	/* Echo the message to II_DBMS_LOG, if defined */
	TRwrite(NULL, PrefixLen + length, (PTR)&buffer);
	
	status = ERsend(ER_ERROR_MSG, (PTR)&buffer,
		    PrefixLen + length, &sys_err);
    }