-
Notifications
You must be signed in to change notification settings - Fork 36
/
Pg.h
175 lines (147 loc) · 8.4 KB
/
Pg.h
1
2
3
4
5
6
7
8
9
10
11
12
13
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
70
71
72
73
74
75
76
77
78
79
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
/*
Copyright (c) 2000-2024 Greg Sabino Mullane and others: see the Changes file
Copyright (c) 1997-2000 Edmund Mergl
Portions Copyright (c) 1994-1997 Tim Bunce
You may distribute under the terms of either the GNU General Public
License or the Artistic License, as specified in the Perl README file.
*/
#include <wchar.h>
#ifdef WIN32
#if (!defined(_MSC_VER) || (_MSC_VER < 1900))
static int errno;
#endif
#include <string.h>
#define strcasecmp(s1,s2) stricmp((s1), (s2))
#else
#include <strings.h>
#endif
#define DBDPG_TRUE (bool)1
#define DBDPG_FALSE (bool)0
#define PG_ASYNC 1
#define PG_OLDQUERY_CANCEL 2
#define PG_OLDQUERY_WAIT 4
#define PG_UNKNOWN_VERSION 0
/* Force preprocessors to use this variable. Default to something valid yet noticeable */
#ifndef PGLIBVERSION
#define PGLIBVERSION 80009
#endif
#include "libpq-fe.h"
#ifndef INV_READ
#define INV_READ 0x00040000
#endif
#ifndef INV_WRITE
#define INV_WRITE 0x00020000
#endif
#ifndef PGRES_COPY_BOTH
#define PGRES_COPY_BOTH 8
#endif
#ifdef BUFSIZ
#undef BUFSIZ
#endif
/* this should improve I/O performance for large objects */
#define BUFSIZ 32768
#define NEED_DBIXS_VERSION 93
#define PERL_NO_GET_CONTEXT
#include <DBIXS.h> /* installed by the DBI module */
#include <dbivport.h> /* DBI portability macros */
#include <dbd_xsh.h> /* installed by the DBI module */
DBISTATE_DECLARE;
#include "types.h"
#include "dbdimp.h"
#include "quote.h"
#define TLEVEL_slow (DBIS->debug & DBIc_TRACE_LEVEL_MASK)
#define TFLAGS_slow (DBIS->debug & DBIc_TRACE_FLAGS_MASK)
#define TSQL (TFLAGS_slow & 256) /* Defined in DBI */
#define FLAGS_LIBPQ 0x01000000
#define FLAGS_START 0x02000000
#define FLAGS_END 0x04000000
#define FLAGS_PREFIX 0x08000000
#define FLAGS_LOGIN 0x10000000
#define TFLIBPQ_slow (TFLAGS_slow & FLAGS_LIBPQ)
#define TFSTART_slow (TFLAGS_slow & FLAGS_START)
#define TFEND_slow (TFLAGS_slow & FLAGS_END)
#define TFPREFIX_slow (TFLAGS_slow & FLAGS_PREFIX)
#define TFLOGIN_slow (TFLAGS_slow & FLAGS_LOGIN)
#define TRACE1_slow (TLEVEL_slow >= 1) /* Avoid using directly: DBI only */
#define TRACE2_slow (TLEVEL_slow >= 2) /* Avoid using directly: DBI only */
#define TRACE3_slow (TLEVEL_slow >= 3) /* Basic debugging */
#define TRACE4_slow (TLEVEL_slow >= 4) /* More detailed debugging */
#define TRACE5_slow (TLEVEL_slow >= 5) /* Very detailed debugging */
#define TRACE6_slow (TLEVEL_slow >= 6)
#define TRACE7_slow (TLEVEL_slow >= 7)
#define TRACE8_slow (TLEVEL_slow >= 8)
#define TLIBPQ_slow (TRACE5_slow || TFLIBPQ_slow)
#define TSTART_slow (TRACE4_slow || TFSTART_slow) /* Start of a major function */
#define TEND_slow (TRACE4_slow || TFEND_slow) /* End of a major function */
#define TLOGIN_slow (TRACE5_slow || TFLOGIN_slow) /* Connect and disconnect */
#define TRACEWARN_slow (TRACE1_slow) /* Non-fatal but serious problems */
/* Do we show a "dbdpg: " header? */
#define THEADER_slow (TFPREFIX_slow) ? "dbdpg: " : ""
#define TRC (void)PerlIO_printf
/* Fancy stuff for tracing of commonly used libpq functions */
#define TRACE_XX if (TLIBPQ_slow) TRC(DBILOGFP,
/* XXX every use of every one of these costs at least one call to DBIS
* and possibly +1 for DBILOGFP and another for THEADER_slow!
* A better approach may be something like DBD::Oracle's
* http://cpansearch.perl.org/src/PYTHIAN/DBD-Oracle-1.42/ocitrace.h
* #define PGfooBar_log_stat(imp_xxh, stat, a,b,c) ... where imp_xxh
* is used to determine the logging and stat holds the result.
* That makes the code uncluttered and gives good flexibility.
*/
#define TRACE_PQBACKENDPID TRACE_XX "%sPQbackendPID\n", THEADER_slow)
#define TRACE_PQCANCEL TRACE_XX "%sPQcancel\n", THEADER_slow)
#define TRACE_PQCLEAR TRACE_XX "%sPQclear\n", THEADER_slow)
#define TRACE_PQCMDSTATUS TRACE_XX "%sPQcmdStatus\n", THEADER_slow)
#define TRACE_PQCMDTUPLES TRACE_XX "%sPQcmdTuples\n", THEADER_slow)
#define TRACE_PQCONNECTDB TRACE_XX "%sPQconnectdb\n", THEADER_slow)
#define TRACE_PQCONSUMEINPUT TRACE_XX "%sPQconsumeInput\n", THEADER_slow)
#define TRACE_PQDB TRACE_XX "%sPQdb\n", THEADER_slow)
#define TRACE_PQENDCOPY TRACE_XX "%sPQendcopy\n", THEADER_slow)
#define TRACE_PQERRORMESSAGE TRACE_XX "%sPQerrorMessage\n", THEADER_slow)
#define TRACE_PQEXEC TRACE_XX "%sPQexec\n", THEADER_slow)
#define TRACE_PQEXECPARAMS TRACE_XX "%sPQexecParams\n", THEADER_slow)
#define TRACE_PQEXECPREPARED TRACE_XX "%sPQexecPrepared\n", THEADER_slow)
#define TRACE_PQFINISH TRACE_XX "%sPQfinish\n", THEADER_slow)
#define TRACE_PQFMOD TRACE_XX "%sPQfmod\n", THEADER_slow)
#define TRACE_PQFNAME TRACE_XX "%sPQfname\n", THEADER_slow)
#define TRACE_PQFREECANCEL TRACE_XX "%sPQfreeCancel\n", THEADER_slow)
#define TRACE_PQFREEMEM TRACE_XX "%sPQfreemem\n", THEADER_slow)
#define TRACE_PQFSIZE TRACE_XX "%sPQfsize\n", THEADER_slow)
#define TRACE_PQFTABLECOL TRACE_XX "%sPQftableCol\n", THEADER_slow)
#define TRACE_PQFTABLE TRACE_XX "%sPQftable\n", THEADER_slow)
#define TRACE_PQFTYPE TRACE_XX "%sPQftype\n", THEADER_slow)
#define TRACE_PQGETCANCEL TRACE_XX "%sPQgetCancel\n", THEADER_slow)
#define TRACE_PQGETCOPYDATA TRACE_XX "%sPQgetCopyData\n", THEADER_slow)
#define TRACE_PQGETISNULL TRACE_XX "%sPQgetisnull\n", THEADER_slow)
#define TRACE_PQGETRESULT TRACE_XX "%sPQgetResult\n", THEADER_slow)
#define TRACE_PQGETLENGTH TRACE_XX "%sPQgetLength\n", THEADER_slow)
#define TRACE_PQGETVALUE TRACE_XX "%sPQgetvalue\n", THEADER_slow)
#define TRACE_PQHOST TRACE_XX "%sPQhost\n", THEADER_slow)
#define TRACE_PQISBUSY TRACE_XX "%sPQisBusy\n", THEADER_slow)
#define TRACE_PQNFIELDS TRACE_XX "%sPQnfields\n", THEADER_slow)
#define TRACE_PQNOTIFIES TRACE_XX "%sPQnotifies\n", THEADER_slow)
#define TRACE_PQNTUPLES TRACE_XX "%sPQntuples\n", THEADER_slow)
#define TRACE_PQOIDVALUE TRACE_XX "%sPQoidValue\n", THEADER_slow)
#define TRACE_PQOPTIONS TRACE_XX "%sPQoptions\n", THEADER_slow)
#define TRACE_PQPARAMETERSTATUS TRACE_XX "%sPQparameterStatus\n", THEADER_slow)
#define TRACE_PQPASS TRACE_XX "%sPQpass\n", THEADER_slow)
#define TRACE_PQPORT TRACE_XX "%sPQport\n", THEADER_slow)
#define TRACE_PQPREPARE TRACE_XX "%sPQprepare\n", THEADER_slow)
#define TRACE_PQPROTOCOLVERSION TRACE_XX "%sPQprotocolVersion\n", THEADER_slow)
#define TRACE_PQPUTCOPYDATA TRACE_XX "%sPQputCopyData\n", THEADER_slow)
#define TRACE_PQPUTCOPYEND TRACE_XX "%sPQputCopyEnd\n", THEADER_slow)
#define TRACE_PQRESULTERRORFIELD TRACE_XX "%sPQresultErrorField\n", THEADER_slow)
#define TRACE_PQRESULTSTATUS TRACE_XX "%sPQresultStatus\n", THEADER_slow)
#define TRACE_PQSENDQUERY TRACE_XX "%sPQsendQuery\n", THEADER_slow)
#define TRACE_PQSENDQUERYPARAMS TRACE_XX "%sPQsendQueryParams\n", THEADER_slow)
#define TRACE_PQSENDQUERYPREPARED TRACE_XX "%sPQsendQueryPrepared\n", THEADER_slow)
#define TRACE_PQSERVERVERSION TRACE_XX "%sPQserverVersion\n", THEADER_slow)
#define TRACE_PQSETERRORVERBOSITY TRACE_XX "%sPQsetErrorVerbosity\n", THEADER_slow)
#define TRACE_PQSETNOTICEPROCESSOR TRACE_XX "%sPQsetNoticeProcessor\n", THEADER_slow)
#define TRACE_PQSOCKET TRACE_XX "%sPQsocket\n", THEADER_slow)
#define TRACE_PQSTATUS TRACE_XX "%sPQstatus\n", THEADER_slow)
#define TRACE_PQTRACE TRACE_XX "%sPQtrace\n", THEADER_slow)
#define TRACE_PQTRANSACTIONSTATUS TRACE_XX "%sPQtransactionStatus\n", THEADER_slow)
#define TRACE_PQUNTRACE TRACE_XX "%sPQuntrace\n", THEADER_slow)
#define TRACE_PQUSER TRACE_XX "%sPQuser\n", THEADER_slow)
/* end of Pg.h */