error.c 4.55 KB
Newer Older
Michael Meskes's avatar
Michael Meskes committed
1 2 3 4 5
#include <stdio.h>

#include <ecpgerrno.h>
#include <ecpgtype.h>
#include <ecpglib.h>
Michael Meskes's avatar
Michael Meskes committed
6
#include "extern.h"
Michael Meskes's avatar
Michael Meskes committed
7 8 9
#include <sqlca.h>

void
Michael Meskes's avatar
Michael Meskes committed
10
ECPGraise(int line, int code, char *str)
Michael Meskes's avatar
Michael Meskes committed
11 12
{
	sqlca.sqlcode = code;
Michael Meskes's avatar
Michael Meskes committed
13
	
Michael Meskes's avatar
Michael Meskes committed
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
	switch (code)
	{ 
		case ECPG_NOT_FOUND: 
			snprintf(sqlca.sqlerrm.sqlerrmc,sizeof(sqlca.sqlerrm.sqlerrmc),
				"No data found in line %d.", line);
			break;
			
		case ECPG_OUT_OF_MEMORY: 
			snprintf(sqlca.sqlerrm.sqlerrmc,sizeof(sqlca.sqlerrm.sqlerrmc),
				"Out of memory in line %d.", line);
			break;
			
		case ECPG_UNSUPPORTED: 
			snprintf(sqlca.sqlerrm.sqlerrmc,sizeof(sqlca.sqlerrm.sqlerrmc),
				"Unsupported type %s in line %d.", str, line);
			break;
			
		case ECPG_TOO_MANY_ARGUMENTS: 
			snprintf(sqlca.sqlerrm.sqlerrmc,sizeof(sqlca.sqlerrm.sqlerrmc),
				"Too many arguments in line %d.", line);
			break;
		
		case ECPG_TOO_FEW_ARGUMENTS: 
			snprintf(sqlca.sqlerrm.sqlerrmc,sizeof(sqlca.sqlerrm.sqlerrmc),
				"Too few arguments in line %d.", line);
			break;
		
		case ECPG_INT_FORMAT: 
			snprintf(sqlca.sqlerrm.sqlerrmc,sizeof(sqlca.sqlerrm.sqlerrmc),
				"Not correctly formatted int type: %s line %d.", str, line);
			break;
			
		case ECPG_UINT_FORMAT: 
			snprintf(sqlca.sqlerrm.sqlerrmc,sizeof(sqlca.sqlerrm.sqlerrmc),
				"Not correctly formatted unsigned type: %s in line %d.", str, line);
			break;
				
		case ECPG_FLOAT_FORMAT: 
			snprintf(sqlca.sqlerrm.sqlerrmc,sizeof(sqlca.sqlerrm.sqlerrmc),
				"Not correctly formatted floating point type: %s in line %d.", str, line);
			break;

		case ECPG_CONVERT_BOOL: 
			snprintf(sqlca.sqlerrm.sqlerrmc,sizeof(sqlca.sqlerrm.sqlerrmc),
				"Unable to convert %s to bool on line %d.", str, line);
			break;

		case ECPG_EMPTY: 
			snprintf(sqlca.sqlerrm.sqlerrmc,sizeof(sqlca.sqlerrm.sqlerrmc),
				"Empty query in line %d.", line);
			break;

		case ECPG_MISSING_INDICATOR: 
			snprintf(sqlca.sqlerrm.sqlerrmc,sizeof(sqlca.sqlerrm.sqlerrmc),
				"NULL value without indicator in line %d.", line);
			break;
Michael Meskes's avatar
Michael Meskes committed
70 71 72 73 74 75 76 77 78 79
		
		case ECPG_NO_ARRAY: 
			snprintf(sqlca.sqlerrm.sqlerrmc,sizeof(sqlca.sqlerrm.sqlerrmc),
				"variable is not an array in line %d.", line);
			break;
			
		case ECPG_DATA_NOT_ARRAY: 
			snprintf(sqlca.sqlerrm.sqlerrmc,sizeof(sqlca.sqlerrm.sqlerrmc),
				"data read from backend is not an array in line %d.", line);
			break;
Michael Meskes's avatar
Michael Meskes committed
80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
			
		case ECPG_NO_CONN: 
			snprintf(sqlca.sqlerrm.sqlerrmc,sizeof(sqlca.sqlerrm.sqlerrmc),
				"No such connection %s in line %d.", str, line);
			break;
			
		case ECPG_NOT_CONN: 
			snprintf(sqlca.sqlerrm.sqlerrmc,sizeof(sqlca.sqlerrm.sqlerrmc),
				"Not connected in line %d.", line);
			break;

		case ECPG_INVALID_STMT: 
			snprintf(sqlca.sqlerrm.sqlerrmc,sizeof(sqlca.sqlerrm.sqlerrmc),
				"Invalid statement name in line %d.", line);
			break;
			
		case ECPG_UNKNOWN_DESCRIPTOR: 
			snprintf(sqlca.sqlerrm.sqlerrmc,sizeof(sqlca.sqlerrm.sqlerrmc),
				"Sescriptor %s not found in line %d.", str, line);
			break;
			
		case ECPG_INVALID_DESCRIPTOR_INDEX: 
			snprintf(sqlca.sqlerrm.sqlerrmc,sizeof(sqlca.sqlerrm.sqlerrmc),
				"Sescriptor index out of range in line %d.", line);
			break;
		
		case ECPG_UNKNOWN_DESCRIPTOR_ITEM: 
			snprintf(sqlca.sqlerrm.sqlerrmc,sizeof(sqlca.sqlerrm.sqlerrmc),
				"Unknown descriptor item %s in line %d.", str, line);
			break;
		
		case ECPG_VAR_NOT_NUMERIC: 
			snprintf(sqlca.sqlerrm.sqlerrmc,sizeof(sqlca.sqlerrm.sqlerrmc),
				"Variable is not a numeric type in line %d.", line);
			break;
		
		case ECPG_VAR_NOT_CHAR: 
			snprintf(sqlca.sqlerrm.sqlerrmc,sizeof(sqlca.sqlerrm.sqlerrmc),
				"Variable is not a character type in line %d.", line);
			break;
			
Michael Meskes's avatar
Michael Meskes committed
121 122 123 124 125
		case ECPG_PGSQL:
			/* strip trailing newline */
			if (str[strlen(str)-1] == '\n') 
				str[strlen(str)-1] = '\0';
							
Michael Meskes's avatar
Michael Meskes committed
126
			snprintf(sqlca.sqlerrm.sqlerrmc,sizeof(sqlca.sqlerrm.sqlerrmc),
Michael Meskes's avatar
Michael Meskes committed
127
				"'%s' in line %d.", str, line);
Michael Meskes's avatar
Michael Meskes committed
128 129 130 131 132 133 134 135 136 137 138 139 140 141
			break;
			
		case ECPG_TRANS: 
			snprintf(sqlca.sqlerrm.sqlerrmc,sizeof(sqlca.sqlerrm.sqlerrmc),
				"Error in transaction processing in line %d.", line);
			break;
			
		case ECPG_CONNECT: 
			snprintf(sqlca.sqlerrm.sqlerrmc,sizeof(sqlca.sqlerrm.sqlerrmc),
				"Could not connect to database %s in line %d.", str, line);
			break;
			
		default:
		    	snprintf(sqlca.sqlerrm.sqlerrmc,sizeof(sqlca.sqlerrm.sqlerrmc),
Michael Meskes's avatar
Michael Meskes committed
142
				"SQL error #%d in line %d.", code, line);
Michael Meskes's avatar
Michael Meskes committed
143 144 145 146
			break;
	}
	
	sqlca.sqlerrm.sqlerrml = strlen(sqlca.sqlerrm.sqlerrmc);
Michael Meskes's avatar
Michael Meskes committed
147

Michael Meskes's avatar
Michael Meskes committed
148
        /* free all memory we have allocated for the user */
Michael Meskes's avatar
Michael Meskes committed
149
        free_auto_mem();
Michael Meskes's avatar
Michael Meskes committed
150 151 152 153 154 155 156 157 158
}

/* print out an error message */
void
sqlprint(void)
{
	sqlca.sqlerrm.sqlerrmc[sqlca.sqlerrm.sqlerrml] = '\0';
	fprintf(stderr, "sql error %s\n", sqlca.sqlerrm.sqlerrmc);
}