3
* Description: See "qresult.c"
5
* Comments: See "notice.txt" for copyright and license information.
14
#include "connection.h"
16
#include "columninfo.h"
17
#include "tuplelist.h"
22
PGRES_EMPTY_QUERY = 0,
23
PGRES_COMMAND_OK, /* a query command that doesn't return */
24
/* anything was executed properly by the backend */
25
PGRES_TUPLES_OK, /* a query command that returns tuples */
26
/* was executed properly by the backend, PGresult */
27
/* contains the resulttuples */
30
PGRES_BAD_RESPONSE, /* an unexpected response was recv'd from
34
PGRES_FIELDS_OK, /* field information from a query was
39
typedef enum QueryResultCode_ QueryResultCode;
44
ColumnInfoClass *fields; /* the Column information */
45
TupleListClass *manual_tuples; /* manual result tuple list */
46
ConnectionClass *conn; /* the connection this result is using
48
QResultClass *next; /* the following result class */
50
/* Stuff for declare/fetch tuples */
51
int num_total_rows; /* total count of rows read in */
52
int count_backend_allocated;/* m(re)alloced count */
53
int count_keyset_allocated; /* m(re)alloced count */
54
int num_backend_rows; /* count of tuples kept in backend_tuples member */
55
int fetch_count; /* logical rows read so far */
59
int num_fields; /* number of fields in the result */
62
Int4 recent_processed_row_count;
64
QueryResultCode status;
67
char *cursor; /* The name of the cursor for select
72
TupleField *backend_tuples; /* data from the backend (the tuple cache) */
73
TupleField *tupleField; /* current backend tuple being retrieved */
75
char inTuples; /* is a fetch of rows from the backend in
77
char aborted; /* was aborted? */
78
char haskeyset; /* this result contains keyset ? */
80
UInt2 rb_alloc; /* count of allocated rollback info */
81
UInt2 rb_count; /* count of rollback info */
83
UInt2 dl_alloc; /* count of allocated deleted info */
84
UInt2 dl_count; /* count of deleted info */
88
#define QR_get_fields(self) (self->fields)
91
/* These functions are for retrieving data from the qresult */
92
#define QR_get_value_manual(self, tupleno, fieldno) (TL_get_fieldval(self->manual_tuples, tupleno, fieldno))
93
#define QR_get_value_backend(self, fieldno) (self->tupleField[fieldno].value)
94
#define QR_get_value_backend_row(self, tupleno, fieldno) ((self->backend_tuples + (tupleno * self->num_fields))[fieldno].value)
96
/* These functions are used by both manual and backend results */
97
#define QR_NumResultCols(self) (CI_get_num_fields(self->fields))
98
#define QR_NumPublicResultCols(self) (self->haskeyset ? CI_get_num_fields(self->fields) - 2 : CI_get_num_fields(self->fields))
99
#define QR_get_fieldname(self, fieldno_) (CI_get_fieldname(self->fields, fieldno_))
100
#define QR_get_fieldsize(self, fieldno_) (CI_get_fieldsize(self->fields, fieldno_))
101
#define QR_get_display_size(self, fieldno_) (CI_get_display_size(self->fields, fieldno_))
102
#define QR_get_atttypmod(self, fieldno_) (CI_get_atttypmod(self->fields, fieldno_))
103
#define QR_get_field_type(self, fieldno_) (CI_get_oid(self->fields, fieldno_))
105
/* These functions are used only for manual result sets */
106
#define QR_get_num_total_tuples(self) (self->manual_tuples ? TL_get_num_tuples(self->manual_tuples) : self->num_total_rows)
107
#define QR_get_num_backend_tuples(self) (self->manual_tuples ? TL_get_num_tuples(self->manual_tuples) : self->num_backend_rows)
108
#define QR_add_tuple(self, new_tuple) (TL_add_tuple(self->manual_tuples, new_tuple))
109
#define QR_set_field_info(self, field_num, name, adtid, adtsize) (CI_set_field_info(self->fields, field_num, name, adtid, adtsize, -1))
112
#define QR_command_successful(self) ( !(self->status == PGRES_BAD_RESPONSE || self->status == PGRES_NONFATAL_ERROR || self->status == PGRES_FATAL_ERROR))
113
#define QR_command_maybe_successful(self) ( !(self->status == PGRES_BAD_RESPONSE || self->status == PGRES_FATAL_ERROR))
114
#define QR_command_nonfatal(self) ( self->status == PGRES_NONFATAL_ERROR)
115
#define QR_end_tuples(self) ( self->status == PGRES_END_TUPLES)
116
#define QR_set_status(self, condition) ( self->status = condition )
117
#define QR_set_aborted(self, aborted_) ( self->aborted = aborted_)
118
#define QR_set_haskeyset(self) (self->haskeyset = TRUE)
120
#define QR_get_message(self) (self->message)
121
#define QR_get_command(self) (self->command)
122
#define QR_get_notice(self) (self->notice)
123
#define QR_get_status(self) (self->status)
124
#define QR_get_aborted(self) (self->aborted)
126
#define QR_aborted(self) (!self || self->aborted)
129
QResultClass *QR_Constructor(void);
130
void QR_Destructor(QResultClass *self);
131
char QR_read_tuple(QResultClass *self, char binary);
132
int QR_next_tuple(QResultClass *self);
133
int QR_close(QResultClass *self);
134
char QR_fetch_tuples(QResultClass *self, ConnectionClass *conn, char *cursor);
135
void QR_free_memory(QResultClass *self);
136
void QR_set_command(QResultClass *self, const char *msg);
137
void QR_set_message(QResultClass *self, const char *msg);
138
void QR_set_notice(QResultClass *self, const char *msg);
140
void QR_set_num_fields(QResultClass *self, int new_num_fields); /* manual result only */
142
void QR_inc_base(QResultClass *self, int base_inc);
143
void QR_set_cache_size(QResultClass *self, int cache_size);
144
void QR_set_rowset_size(QResultClass *self, int rowset_size);
145
void QR_set_position(QResultClass *self, int pos);