mirror of
https://github.com/FirebirdSQL/firebird.git
synced 2025-01-31 18:43:03 +01:00
86cd8cb6b3
callback function, and helps to take correct action in it. This fixes CORE-1827: Win32 Embedded Server should pass control to application before calling exit(3). 2. Removed unneeded any more flag in isql and qli, used earlier to distinguish between kinds of shutdown.
368 lines
8.2 KiB
C++
368 lines
8.2 KiB
C++
/*
|
|
* PROGRAM: JRD Command Oriented Query Language
|
|
* MODULE: err.cpp
|
|
* DESCRIPTION: Error handlers
|
|
*
|
|
* The contents of this file are subject to the Interbase Public
|
|
* License Version 1.0 (the "License"); you may not use this file
|
|
* except in compliance with the License. You may obtain a copy
|
|
* of the License at http://www.Inprise.com/IPL.html
|
|
*
|
|
* Software distributed under the License is distributed on an
|
|
* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express
|
|
* or implied. See the License for the specific language governing
|
|
* rights and limitations under the License.
|
|
*
|
|
* The Original Code was created by Inprise Corporation
|
|
* and its predecessors. Portions created by Inprise Corporation are
|
|
* Copyright (C) Inprise Corporation.
|
|
*
|
|
* All Rights Reserved.
|
|
* Contributor(s): ______________________________________.
|
|
*/
|
|
|
|
#include "firebird.h"
|
|
#include <stdio.h>
|
|
#include <setjmp.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include "gen/iberror.h"
|
|
#include "../qli/dtr.h"
|
|
#include "../qli/parse.h"
|
|
#include "../qli/err_proto.h"
|
|
#include "../qli/help_proto.h"
|
|
#include "../qli/lex_proto.h"
|
|
#include "../jrd/gds_proto.h"
|
|
#include "../common/classes/MsgPrint.h"
|
|
|
|
using MsgFormat::SafeArg;
|
|
|
|
|
|
static TEXT ERRQ_message[256];
|
|
|
|
void ERRQ_bugcheck( USHORT number)
|
|
{
|
|
/**************************************
|
|
*
|
|
* E R R Q _ b u g c h e c k
|
|
*
|
|
**************************************
|
|
*
|
|
* Functional description
|
|
* Somebody has screwed up. Bugcheck.
|
|
*
|
|
**************************************/
|
|
TEXT s[256];
|
|
|
|
ERRQ_msg_format(number, sizeof(s), s);
|
|
ERRQ_error(9, SafeArg() << s); // Msg9 INTERNAL: %s
|
|
}
|
|
|
|
|
|
void ERRQ_database_error( DBB dbb, ISC_STATUS* status_vector)
|
|
{
|
|
/**************************************
|
|
*
|
|
* E R R Q _ d a t a b a s e _ e r r o r
|
|
*
|
|
**************************************
|
|
*
|
|
* Functional description
|
|
* Print message from database error and unwind.
|
|
*
|
|
**************************************/
|
|
|
|
if (dbb) {
|
|
ERRQ_msg_put(10, dbb->dbb_filename); /* Msg10 ** QLI error from database %s ** */
|
|
gds__print_status(status_vector);
|
|
}
|
|
else {
|
|
ERRQ_msg_put(11); /* Msg11 ** QLI error from database ** */
|
|
gds__print_status(status_vector);
|
|
}
|
|
|
|
QLI_skip_line = true;
|
|
|
|
/* if we've really got the database open and get an I/O error,
|
|
close up neatly. If we get an I/O error trying to open the
|
|
database, somebody else will clean up */
|
|
|
|
if (dbb && dbb->dbb_handle && status_vector[1] == isc_io_error)
|
|
ERRQ_msg_put(458, dbb->dbb_filename); /* Msg458 ** connection to database %s lost ** */
|
|
|
|
if (QLI_env) {
|
|
Firebird::LongJump::raise();
|
|
}
|
|
}
|
|
|
|
|
|
void ERRQ_error(USHORT number,
|
|
const SafeArg& arg)
|
|
{
|
|
/**************************************
|
|
*
|
|
* E R R Q _ e r r o r
|
|
*
|
|
**************************************
|
|
*
|
|
* Functional description
|
|
* An error has occurred. Put out an error message and
|
|
* unwind. If this was called before the unwind path
|
|
* was established, don't unwind just print error and exit.
|
|
*
|
|
**************************************/
|
|
|
|
ERRQ_pending();
|
|
ERRQ_error_format(number, arg);
|
|
|
|
if (QLI_env)
|
|
Firebird::LongJump::raise();
|
|
else {
|
|
ERRQ_pending();
|
|
ERRQ_exit(FINI_ERROR);
|
|
}
|
|
}
|
|
|
|
void ERRQ_error(USHORT number,
|
|
const char* str)
|
|
{
|
|
/**************************************
|
|
*
|
|
* E R R Q _ e r r o r
|
|
*
|
|
**************************************
|
|
*
|
|
* Functional description
|
|
* An error has occurred. Put out an error message and
|
|
* unwind. If this was called before the unwind path
|
|
* was established, don't unwind just print error and exit.
|
|
*
|
|
**************************************/
|
|
|
|
ERRQ_error(number, SafeArg() << str);
|
|
}
|
|
|
|
|
|
void ERRQ_error_format(USHORT number,
|
|
const SafeArg& arg)
|
|
{
|
|
/**************************************
|
|
*
|
|
* E R R Q _ e r r o r _ f o r m a t
|
|
*
|
|
**************************************
|
|
*
|
|
* Functional description
|
|
* Retrieve a message from the error file and format it
|
|
* in the standard qli error format, put it where
|
|
* ERRQ_pending expects to find it.
|
|
**************************************/
|
|
TEXT s[256];
|
|
|
|
fb_msg_format(0, QLI_MSG_FAC, number, sizeof(s), s, arg);
|
|
fb_msg_format(0, QLI_MSG_FAC, 12, sizeof(ERRQ_message), ERRQ_message, SafeArg() << s);
|
|
/* Msg12 ** QLI error: %s ** */
|
|
QLI_error = (TEXT*) ERRQ_message;
|
|
QLI_skip_line = true;
|
|
}
|
|
|
|
|
|
void ERRQ_exit( int status)
|
|
{
|
|
/**************************************
|
|
*
|
|
* E R R Q _ e x i t
|
|
*
|
|
**************************************
|
|
*
|
|
* Functional description
|
|
* Exit after shutting down a bit.
|
|
*
|
|
**************************************/
|
|
|
|
HELP_fini();
|
|
LEX_fini();
|
|
exit(status);
|
|
}
|
|
|
|
|
|
void ERRQ_msg_format(USHORT number,
|
|
USHORT length,
|
|
TEXT* output_string,
|
|
const SafeArg& arg)
|
|
{
|
|
/**************************************
|
|
*
|
|
* E R R Q _ m s g _ f o r m a t
|
|
*
|
|
**************************************
|
|
*
|
|
* Functional description
|
|
* Retrieve a message from the error file and format it
|
|
*
|
|
**************************************/
|
|
|
|
fb_msg_format(0, QLI_MSG_FAC, number, length, output_string, arg);
|
|
}
|
|
|
|
|
|
void ERRQ_msg_partial(
|
|
USHORT number,
|
|
const SafeArg& arg)
|
|
{
|
|
/**************************************
|
|
*
|
|
* E R R Q _ m s g _ p a r t i a l
|
|
*
|
|
**************************************
|
|
*
|
|
* Functional description
|
|
* Retrieve a message from the error file, format it, and print it
|
|
*
|
|
**************************************/
|
|
|
|
fb_msg_format(0, QLI_MSG_FAC, number, sizeof(ERRQ_message),
|
|
ERRQ_message, arg);
|
|
printf("%s", ERRQ_message);
|
|
}
|
|
|
|
|
|
void ERRQ_msg_put(USHORT number,
|
|
const SafeArg& arg)
|
|
{
|
|
/**************************************
|
|
*
|
|
* E R R Q _ m s g _ p u t
|
|
*
|
|
**************************************
|
|
*
|
|
* Functional description
|
|
* Retrieve a message from the error file, format it, and print it
|
|
* It's same outcome as ERRQ_msg_partial but with a newline at the end.
|
|
*
|
|
**************************************/
|
|
|
|
fb_msg_format(0, QLI_MSG_FAC, number, sizeof(ERRQ_message),
|
|
ERRQ_message, arg);
|
|
printf("%s\n", ERRQ_message);
|
|
}
|
|
|
|
|
|
void ERRQ_msg_put(USHORT number,
|
|
const char* str)
|
|
{
|
|
/**************************************
|
|
*
|
|
* E R R Q _ m s g _ p u t
|
|
*
|
|
**************************************
|
|
*
|
|
* Functional description
|
|
* Retrieve a message from the error file, format it, and print it
|
|
* It's same outcome as ERRQ_msg_partial but with a newline at the end.
|
|
*
|
|
**************************************/
|
|
|
|
fb_msg_format(0, QLI_MSG_FAC, number, sizeof(ERRQ_message),
|
|
ERRQ_message, SafeArg() << str);
|
|
printf("%s\n", ERRQ_message);
|
|
}
|
|
|
|
|
|
int ERRQ_msg_get( USHORT number, TEXT* output_msg, size_t s_size)
|
|
{
|
|
/**************************************
|
|
*
|
|
* E R R Q _ m s g _ g e t
|
|
*
|
|
**************************************
|
|
*
|
|
* Functional description
|
|
* Retrieve a message from the error file
|
|
*
|
|
**************************************/
|
|
static const SafeArg arg;
|
|
|
|
int l = fb_msg_format(0, QLI_MSG_FAC, number, s_size, output_msg, arg);
|
|
return (l >= 0);
|
|
}
|
|
|
|
|
|
void ERRQ_pending(void)
|
|
{
|
|
/**************************************
|
|
*
|
|
* E R R Q _ p e n d i n g
|
|
*
|
|
**************************************
|
|
*
|
|
* Functional description
|
|
* Print out an error message if one is pending.
|
|
*
|
|
**************************************/
|
|
|
|
if (QLI_error) {
|
|
printf("%s\n", (const char*)QLI_error);
|
|
QLI_error = NULL;
|
|
}
|
|
}
|
|
|
|
|
|
void ERRQ_print_error(USHORT number,
|
|
const SafeArg& arg)
|
|
{
|
|
/**************************************
|
|
*
|
|
* E R R Q _ p r i n t _ e r r o r
|
|
*
|
|
**************************************
|
|
*
|
|
* Functional description
|
|
* An error has occurred. Put out an error message and
|
|
* unwind.
|
|
*
|
|
**************************************/
|
|
|
|
ERRQ_error(number, arg);
|
|
}
|
|
|
|
|
|
void ERRQ_print_error(USHORT number,
|
|
const char* str)
|
|
{
|
|
/**************************************
|
|
*
|
|
* E R R Q _ p r i n t _ e r r o r
|
|
*
|
|
**************************************
|
|
*
|
|
* Functional description
|
|
* An error has occurred. Put out an error message and
|
|
* unwind.
|
|
*
|
|
**************************************/
|
|
|
|
ERRQ_error(number, SafeArg() << str);
|
|
}
|
|
|
|
|
|
void ERRQ_syntax( USHORT number)
|
|
{
|
|
/**************************************
|
|
*
|
|
* E R R Q _ s y n t a x
|
|
*
|
|
**************************************
|
|
*
|
|
* Functional description
|
|
* Syntax error has occurred. Give some hint of what went
|
|
* wrong.
|
|
*
|
|
**************************************/
|
|
TEXT s[256];
|
|
|
|
ERRQ_msg_format(number, sizeof(s), s);
|
|
ERRQ_error(13, SafeArg() << s << QLI_token->tok_string);
|
|
// Msg13 expected %s, encountered %s
|
|
}
|