1/* src/interfaces/ecpg/ecpglib/ecpglib_extern.h */
2
3#ifndef _ECPG_ECPGLIB_EXTERN_H
4#define _ECPG_ECPGLIB_EXTERN_H
5
6#include "libpq-fe.h"
7#include "sqlca.h"
8#include "sqlda-native.h"
9#include "sqlda-compat.h"
10#include "ecpg_config.h"
11#include "ecpgtype.h"
12
13#ifndef CHAR_BIT
14#include <limits.h>
15#endif
16#ifdef LOCALE_T_IN_XLOCALE
17#include <xlocale.h>
18#endif
19
20enum COMPAT_MODE
21{
22 ECPG_COMPAT_PGSQL = 0, ECPG_COMPAT_INFORMIX, ECPG_COMPAT_INFORMIX_SE, ECPG_COMPAT_ORACLE
23};
24
25extern bool ecpg_internal_regression_mode;
26
27#define INFORMIX_MODE(X) ((X) == ECPG_COMPAT_INFORMIX || (X) == ECPG_COMPAT_INFORMIX_SE)
28#define ORACLE_MODE(X) ((X) == ECPG_COMPAT_ORACLE)
29
30enum ARRAY_TYPE
31{
32 ECPG_ARRAY_ERROR, ECPG_ARRAY_NOT_SET, ECPG_ARRAY_ARRAY, ECPG_ARRAY_VECTOR, ECPG_ARRAY_NONE
33};
34
35#define ECPG_IS_ARRAY(X) ((X) == ECPG_ARRAY_ARRAY || (X) == ECPG_ARRAY_VECTOR)
36
37/* A generic varchar type. */
38struct ECPGgeneric_varchar
39{
40 int len;
41 char arr[FLEXIBLE_ARRAY_MEMBER];
42};
43
44/* A generic bytea type. */
45struct ECPGgeneric_bytea
46{
47 int len;
48 char arr[FLEXIBLE_ARRAY_MEMBER];
49};
50
51/*
52 * type information cache
53 */
54
55struct ECPGtype_information_cache
56{
57 struct ECPGtype_information_cache *next;
58 int oid;
59 enum ARRAY_TYPE isarray;
60};
61
62/* structure to store one statement */
63struct statement
64{
65 int lineno;
66 char *command;
67 char *name;
68 struct connection *connection;
69 enum COMPAT_MODE compat;
70 bool force_indicator;
71 enum ECPG_statement_type statement_type;
72 bool questionmarks;
73 struct variable *inlist;
74 struct variable *outlist;
75#ifdef HAVE_USELOCALE
76 locale_t clocale;
77 locale_t oldlocale;
78#else
79 char *oldlocale;
80#ifdef HAVE__CONFIGTHREADLOCALE
81 int oldthreadlocale;
82#endif
83#endif
84 int nparams;
85 char **paramvalues;
86 int *paramlengths;
87 int *paramformats;
88 PGresult *results;
89};
90
91/* structure to store prepared statements for a connection */
92struct prepared_statement
93{
94 char *name;
95 bool prepared;
96 struct statement *stmt;
97 struct prepared_statement *next;
98};
99
100/* structure to store connections */
101struct connection
102{
103 char *name;
104 PGconn *connection;
105 bool autocommit;
106 struct ECPGtype_information_cache *cache_head;
107 struct prepared_statement *prep_stmts;
108 struct connection *next;
109};
110
111/* structure to store descriptors */
112struct descriptor
113{
114 char *name;
115 PGresult *result;
116 struct descriptor *next;
117 int count;
118 struct descriptor_item *items;
119};
120
121struct descriptor_item
122{
123 int num;
124 char *data;
125 int indicator;
126 int length;
127 int precision;
128 int scale;
129 int type;
130 bool is_binary;
131 int data_len;
132 struct descriptor_item *next;
133};
134
135struct variable
136{
137 enum ECPGttype type;
138 void *value;
139 void *pointer;
140 long varcharsize;
141 long arrsize;
142 long offset;
143 enum ECPGttype ind_type;
144 void *ind_value;
145 void *ind_pointer;
146 long ind_varcharsize;
147 long ind_arrsize;
148 long ind_offset;
149 struct variable *next;
150};
151
152struct var_list
153{
154 int number;
155 void *pointer;
156 struct var_list *next;
157};
158
159extern struct var_list *ivlist;
160
161/* Here are some methods used by the lib. */
162
163bool ecpg_add_mem(void *ptr, int lineno);
164
165bool ecpg_get_data(const PGresult *, int, int, int, enum ECPGttype type,
166 enum ECPGttype, char *, char *, long, long, long,
167 enum ARRAY_TYPE, enum COMPAT_MODE, bool);
168
169#ifdef ENABLE_THREAD_SAFETY
170void ecpg_pthreads_init(void);
171#endif
172struct connection *ecpg_get_connection(const char *);
173char *ecpg_alloc(long, int);
174char *ecpg_auto_alloc(long, int);
175char *ecpg_realloc(void *, long, int);
176void ecpg_free(void *);
177bool ecpg_init(const struct connection *, const char *, const int);
178char *ecpg_strdup(const char *, int);
179const char *ecpg_type_name(enum ECPGttype);
180int ecpg_dynamic_type(Oid);
181int sqlda_dynamic_type(Oid, enum COMPAT_MODE);
182void ecpg_free_auto_mem(void);
183void ecpg_clear_auto_mem(void);
184
185struct descriptor *ecpggetdescp(int, char *);
186
187struct descriptor *ecpg_find_desc(int line, const char *name);
188
189struct prepared_statement *ecpg_find_prepared_statement(const char *,
190 struct connection *, struct prepared_statement **);
191
192bool ecpg_store_result(const PGresult *results, int act_field,
193 const struct statement *stmt, struct variable *var);
194bool ecpg_store_input(const int, const bool, const struct variable *, char **, bool);
195void ecpg_free_params(struct statement *stmt, bool print);
196bool ecpg_do_prologue(int, const int, const int, const char *, const bool,
197 enum ECPG_statement_type, const char *, va_list,
198 struct statement **);
199bool ecpg_build_params(struct statement *);
200bool ecpg_autostart_transaction(struct statement *stmt);
201bool ecpg_execute(struct statement *stmt);
202bool ecpg_process_output(struct statement *, bool);
203void ecpg_do_epilogue(struct statement *);
204bool ecpg_do(const int, const int, const int, const char *, const bool,
205 const int, const char *, va_list);
206
207bool ecpg_check_PQresult(PGresult *, int, PGconn *, enum COMPAT_MODE);
208void ecpg_raise(int line, int code, const char *sqlstate, const char *str);
209void ecpg_raise_backend(int line, PGresult *result, PGconn *conn, int compat);
210char *ecpg_prepared(const char *, struct connection *);
211bool ecpg_deallocate_all_conn(int lineno, enum COMPAT_MODE c, struct connection *conn);
212void ecpg_log(const char *format,...) pg_attribute_printf(1, 2);
213bool ecpg_auto_prepare(int, const char *, const int, char **, const char *);
214bool ecpg_register_prepared_stmt(struct statement *);
215void ecpg_init_sqlca(struct sqlca_t *sqlca);
216
217struct sqlda_compat *ecpg_build_compat_sqlda(int, PGresult *, int, enum COMPAT_MODE);
218void ecpg_set_compat_sqlda(int, struct sqlda_compat **, const PGresult *, int, enum COMPAT_MODE);
219struct sqlda_struct *ecpg_build_native_sqlda(int, PGresult *, int, enum COMPAT_MODE);
220void ecpg_set_native_sqlda(int, struct sqlda_struct **, const PGresult *, int, enum COMPAT_MODE);
221unsigned ecpg_hex_dec_len(unsigned srclen);
222unsigned ecpg_hex_enc_len(unsigned srclen);
223unsigned ecpg_hex_encode(const char *src, unsigned len, char *dst);
224
225/* SQLSTATE values generated or processed by ecpglib (intentionally
226 * not exported -- users should refer to the codes directly) */
227
228#define ECPG_SQLSTATE_NO_DATA "02000"
229#define ECPG_SQLSTATE_USING_CLAUSE_DOES_NOT_MATCH_PARAMETERS "07001"
230#define ECPG_SQLSTATE_USING_CLAUSE_DOES_NOT_MATCH_TARGETS "07002"
231#define ECPG_SQLSTATE_RESTRICTED_DATA_TYPE_ATTRIBUTE_VIOLATION "07006"
232#define ECPG_SQLSTATE_INVALID_DESCRIPTOR_INDEX "07009"
233#define ECPG_SQLSTATE_SQLCLIENT_UNABLE_TO_ESTABLISH_SQLCONNECTION "08001"
234#define ECPG_SQLSTATE_CONNECTION_DOES_NOT_EXIST "08003"
235#define ECPG_SQLSTATE_TRANSACTION_RESOLUTION_UNKNOWN "08007"
236#define ECPG_SQLSTATE_CARDINALITY_VIOLATION "21000"
237#define ECPG_SQLSTATE_NULL_VALUE_NO_INDICATOR_PARAMETER "22002"
238#define ECPG_SQLSTATE_ACTIVE_SQL_TRANSACTION "25001"
239#define ECPG_SQLSTATE_NO_ACTIVE_SQL_TRANSACTION "25P01"
240#define ECPG_SQLSTATE_INVALID_SQL_STATEMENT_NAME "26000"
241#define ECPG_SQLSTATE_INVALID_SQL_DESCRIPTOR_NAME "33000"
242#define ECPG_SQLSTATE_INVALID_CURSOR_NAME "34000"
243#define ECPG_SQLSTATE_SYNTAX_ERROR "42601"
244#define ECPG_SQLSTATE_DATATYPE_MISMATCH "42804"
245#define ECPG_SQLSTATE_DUPLICATE_CURSOR "42P03"
246
247/* implementation-defined internal errors of ecpg */
248#define ECPG_SQLSTATE_ECPG_INTERNAL_ERROR "YE000"
249#define ECPG_SQLSTATE_ECPG_OUT_OF_MEMORY "YE001"
250
251#endif /* _ECPG_ECPGLIB_EXTERN_H */
252