error.c 6.3 KB
Newer Older
1
/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/error.c,v 1.7 2003/08/08 13:16:20 petere Exp $ */
2

B
Bruce Momjian 已提交
3
#define POSTGRES_ECPG_INTERNAL
4 5 6 7 8 9 10 11 12 13
#include "postgres_fe.h"

#include <stdio.h>

#include "ecpgerrno.h"
#include "ecpgtype.h"
#include "ecpglib.h"
#include "extern.h"
#include "sqlca.h"

14

15
void
B
Bruce Momjian 已提交
16
ECPGraise(int line, int code, const char *sqlstate, const char *str)
17
{
B
Bruce Momjian 已提交
18
	struct sqlca_t *sqlca = ECPGget_sqlca();
B
Bruce Momjian 已提交
19

B
Bruce Momjian 已提交
20
	sqlca->sqlcode = code;
21
	strncpy(sqlca->sqlstate, sqlstate, sizeof(sqlca->sqlstate));
22 23 24 25

	switch (code)
	{
		case ECPG_NOT_FOUND:
B
Bruce Momjian 已提交
26
			snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
27 28 29 30
					 "No data found in line %d.", line);
			break;

		case ECPG_OUT_OF_MEMORY:
B
Bruce Momjian 已提交
31
			snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
32 33 34 35
					 "Out of memory in line %d.", line);
			break;

		case ECPG_UNSUPPORTED:
B
Bruce Momjian 已提交
36
			snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
37 38 39 40
					 "Unsupported type %s in line %d.", str, line);
			break;

		case ECPG_TOO_MANY_ARGUMENTS:
B
Bruce Momjian 已提交
41
			snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
42 43 44 45
					 "Too many arguments in line %d.", line);
			break;

		case ECPG_TOO_FEW_ARGUMENTS:
B
Bruce Momjian 已提交
46
			snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
47 48 49 50
					 "Too few arguments in line %d.", line);
			break;

		case ECPG_INT_FORMAT:
B
Bruce Momjian 已提交
51
			snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
52 53 54 55
			 "Not correctly formatted int type: %s line %d.", str, line);
			break;

		case ECPG_UINT_FORMAT:
B
Bruce Momjian 已提交
56
			snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
57 58 59 60
					 "Not correctly formatted unsigned type: %s in line %d.", str, line);
			break;

		case ECPG_FLOAT_FORMAT:
B
Bruce Momjian 已提交
61
			snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
62 63 64 65
					 "Not correctly formatted floating-point type: %s in line %d.", str, line);
			break;

		case ECPG_CONVERT_BOOL:
B
Bruce Momjian 已提交
66
			snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
67 68 69 70
				  "Unable to convert %s to bool on line %d.", str, line);
			break;

		case ECPG_EMPTY:
B
Bruce Momjian 已提交
71
			snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
72 73 74 75
					 "Empty query in line %d.", line);
			break;

		case ECPG_MISSING_INDICATOR:
B
Bruce Momjian 已提交
76
			snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
77 78 79 80
					 "NULL value without indicator in line %d.", line);
			break;

		case ECPG_NO_ARRAY:
B
Bruce Momjian 已提交
81
			snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
82 83 84 85
					 "Variable is not an array in line %d.", line);
			break;

		case ECPG_DATA_NOT_ARRAY:
B
Bruce Momjian 已提交
86
			snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
87 88 89 90
			 "Data read from backend is not an array in line %d.", line);
			break;

		case ECPG_ARRAY_INSERT:
B
Bruce Momjian 已提交
91
			snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
92 93 94 95
			 "Trying to insert an array of variables in line %d.", line);
			break;

		case ECPG_NO_CONN:
B
Bruce Momjian 已提交
96
			snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
97 98 99 100
					 "No such connection %s in line %d.", str, line);
			break;

		case ECPG_NOT_CONN:
B
Bruce Momjian 已提交
101
			snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
102 103 104 105
					 "Not connected to '%s' in line %d.", str, line);
			break;

		case ECPG_INVALID_STMT:
B
Bruce Momjian 已提交
106
			snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
107 108 109 110
					 "Invalid statement name %s in line %d.", str, line);
			break;

		case ECPG_UNKNOWN_DESCRIPTOR:
B
Bruce Momjian 已提交
111
			snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
112 113 114 115
					 "Descriptor %s not found in line %d.", str, line);
			break;

		case ECPG_INVALID_DESCRIPTOR_INDEX:
B
Bruce Momjian 已提交
116
			snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
117 118 119 120
					 "Descriptor index out of range in line %d.", line);
			break;

		case ECPG_UNKNOWN_DESCRIPTOR_ITEM:
B
Bruce Momjian 已提交
121
			snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
122 123 124 125
					 "Unknown descriptor item %s in line %d.", str, line);
			break;

		case ECPG_VAR_NOT_NUMERIC:
B
Bruce Momjian 已提交
126
			snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
127 128 129 130
					 "Variable is not a numeric type in line %d.", line);
			break;

		case ECPG_VAR_NOT_CHAR:
B
Bruce Momjian 已提交
131
			snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
132 133 134 135
				   "Variable is not a character type in line %d.", line);
			break;

		case ECPG_TRANS:
B
Bruce Momjian 已提交
136
			snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
137 138 139 140
					 "Error in transaction processing in line %d.", line);
			break;

		case ECPG_CONNECT:
B
Bruce Momjian 已提交
141
			snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
142 143 144 145
			  "Could not connect to database %s in line %d.", str, line);
			break;

		default:
B
Bruce Momjian 已提交
146
			snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
147 148 149 150
					 "SQL error #%d in line %d.", code, line);
			break;
	}

B
Bruce Momjian 已提交
151 152
	sqlca->sqlerrm.sqlerrml = strlen(sqlca->sqlerrm.sqlerrmc);
	ECPGlog("raising sqlcode %d in line %d, '%s'.\n", code, line, sqlca->sqlerrm.sqlerrmc);
153 154 155 156 157

	/* free all memory we have allocated for the user */
	ECPGfree_auto_mem();
}

158 159 160 161
void
ECPGraise_backend(int line, PGresult *result, PGconn *conn, int compat)
{
	struct sqlca_t *sqlca = ECPGget_sqlca();
162 163 164 165 166 167 168 169 170 171 172 173 174 175 176
	char	   *sqlstate;
	char	   *message;

	if (result)
	{
		sqlstate = PQresultErrorField(result, 'C');
		if (sqlstate == NULL)
			sqlstate = ECPG_SQLSTATE_ECPG_INTERNAL_ERROR;
		message = PQresultErrorField(result, 'M');
	}
	else
	{
		sqlstate = ECPG_SQLSTATE_ECPG_INTERNAL_ERROR;
		message = PQerrorMessage(conn);
	}
177 178 179

	/* copy error message */
	snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
180
			 "'%s' in line %d.", message, line);
181 182 183
	sqlca->sqlerrm.sqlerrml = strlen(sqlca->sqlerrm.sqlerrmc);

	/* copy SQLSTATE */
184
	strncpy(sqlca->sqlstate, sqlstate, sizeof(sqlca->sqlstate));
185 186

	/* assign SQLCODE for backward compatibility */
B
Bruce Momjian 已提交
187
	if (strncmp(sqlca->sqlstate, "23505", sizeof(sqlca->sqlstate)) == 0)
188
		sqlca->sqlcode = INFORMIX_MODE(compat) ? ECPG_INFORMIX_DUPLICATE_KEY : ECPG_DUPLICATE_KEY;
B
Bruce Momjian 已提交
189
	if (strncmp(sqlca->sqlstate, "21000", sizeof(sqlca->sqlstate)) == 0)
190 191 192 193 194 195 196 197 198 199 200
		sqlca->sqlcode = INFORMIX_MODE(compat) ? ECPG_INFORMIX_SUBSELECT_NOT_ONE : ECPG_SUBSELECT_NOT_ONE;
	else
		sqlca->sqlcode = ECPG_PGSQL;

	ECPGlog("raising sqlstate %.*s in line %d, '%s'.\n",
			sqlca->sqlstate, sizeof(sqlca->sqlstate), line, sqlca->sqlerrm.sqlerrmc);

	/* free all memory we have allocated for the user */
	ECPGfree_auto_mem();
}

201 202 203 204
/* print out an error message */
void
sqlprint(void)
{
B
Bruce Momjian 已提交
205 206 207 208
	struct sqlca_t *sqlca = ECPGget_sqlca();

	sqlca->sqlerrm.sqlerrmc[sqlca->sqlerrm.sqlerrml] = '\0';
	fprintf(stderr, "sql error %s\n", sqlca->sqlerrm.sqlerrmc);
209
}