1 
2 /* File:            qresult.h
3  *
4  * Description:     See "qresult.c"
5  *
6  * Comments:        See "notice.txt" for copyright and license information.
7  *
8  */
9 
10 #ifndef __QRESULT_H__
11 #define __QRESULT_H__
12 
13 #include "connection.h"
14 #include "socket.h"
15 #include "columninfo.h"
16 #include "tuplelist.h"
17 #include "psqlodbc.h"
18 #include "tuple.h"
19 
20 enum QueryResultCode_ {
21   PGRES_EMPTY_QUERY = 0,
22   PGRES_COMMAND_OK,  /* a query command that doesn't return */
23                     /* anything was executed properly by the backend */
24   PGRES_TUPLES_OK,  /* a query command that returns tuples */
25                    /* was executed properly by the backend, PGresult */
26                    /* contains the resulttuples */
27   PGRES_COPY_OUT,
28   PGRES_COPY_IN,
29   PGRES_BAD_RESPONSE, /* an unexpected response was recv'd from the backend */
30   PGRES_NONFATAL_ERROR,
31   PGRES_FATAL_ERROR,
32   PGRES_FIELDS_OK,	/* field information from a query was successful */
33   PGRES_END_TUPLES,
34   PGRES_INTERNAL_ERROR
35 };
36 typedef enum QueryResultCode_ QueryResultCode;
37 
38 
39 struct QResultClass_ {
40     ColumnInfoClass *fields;			/* the Column information */
41     TupleListClass *manual_tuples;		/* manual result tuple list */
42 	ConnectionClass *conn;				/* the connection this result is using (backend) */
43 
44 	/*	Stuff for declare/fetch tuples */
45 	int fetch_count;					/* logical rows read so far */
46 	int fcount;							/* actual rows read in the fetch */
47 	int currTuple;
48 	int base;
49 
50 	int num_fields;						/* number of fields in the result */
51 	int cache_size;
52 	int rowset_size;
53 
54     QueryResultCode status;
55 
56     char *message;
57 	char *cursor;						/* The name of the cursor for select statements */
58 	char *command;
59 	char *notice;
60 
61 	TupleField *backend_tuples;			/* data from the backend (the tuple cache) */
62 	TupleField *tupleField;				/* current backend tuple being retrieved */
63 
64 	char inTuples;						/* is a fetch of rows from the backend in progress? */
65 	char aborted;					/* was aborted?*/
66 };
67 
68 #define QR_get_fields(self)				(self->fields)
69 
70 
71 /*	These functions are for retrieving data from the qresult */
72 #define QR_get_value_manual(self, tupleno, fieldno)	(TL_get_fieldval(self->manual_tuples, tupleno, fieldno))
73 #define QR_get_value_backend(self, fieldno)			(self->tupleField[fieldno].value)
74 #define QR_get_value_backend_row(self, tupleno, fieldno) ((self->backend_tuples + (tupleno * self->num_fields))[fieldno].value)
75 
76 /*	These functions are used by both manual and backend results */
77 #define QR_NumResultCols(self)				(CI_get_num_fields(self->fields))
78 #define QR_get_fieldname(self, fieldno_)	(CI_get_fieldname(self->fields, fieldno_))
79 #define QR_get_fieldsize(self, fieldno_)	(CI_get_fieldsize(self->fields, fieldno_))
80 #define QR_get_display_size(self, fieldno_)	(CI_get_display_size(self->fields, fieldno_))
81 #define QR_get_atttypmod(self, fieldno_)	(CI_get_atttypmod(self->fields, fieldno_))
82 #define QR_get_field_type(self, fieldno_)   (CI_get_oid(self->fields, fieldno_))
83 
84 /*	These functions are used only for manual result sets */
85 #define QR_get_num_tuples(self)				(self->manual_tuples ? TL_get_num_tuples(self->manual_tuples) : self->fcount)
86 #define QR_add_tuple(self, new_tuple)		(TL_add_tuple(self->manual_tuples, new_tuple))
87 #define QR_set_field_info(self, field_num, name, adtid, adtsize)  (CI_set_field_info(self->fields, field_num, name, adtid, adtsize, -1))
88 
89 /* status macros */
90 #define QR_command_successful(self)		( !(self->status == PGRES_BAD_RESPONSE || self->status == PGRES_NONFATAL_ERROR || self->status == PGRES_FATAL_ERROR))
91 #define QR_command_nonfatal(self)		( self->status == PGRES_NONFATAL_ERROR)
92 #define QR_end_tuples(self)				( self->status == PGRES_END_TUPLES)
93 #define QR_set_status(self, condition)	( self->status = condition )
94 #define QR_set_message(self, message_)	( self->message = message_)
95 #define QR_set_aborted(self, aborted_)	( self->aborted = aborted_)
96 
97 #define QR_get_message(self)			(self->message)
98 #define QR_get_command(self)			(self->command)
99 #define QR_get_notice(self)				(self->notice)
100 #define QR_get_status(self)				(self->status)
101 #define QR_get_aborted(self)				(self->aborted)
102 
103 #define QR_aborted(self)		(!self || self->aborted)
104 
105 /*	Core Functions */
106 QResultClass *QR_Constructor(void);
107 void QR_Destructor(QResultClass *self);
108 char QR_read_tuple(QResultClass *self, char binary);
109 int QR_next_tuple(QResultClass *self);
110 int QR_close(QResultClass *self);
111 char QR_fetch_tuples(QResultClass *self, ConnectionClass *conn, char *cursor);
112 void QR_free_memory(QResultClass *self);
113 void QR_set_command(QResultClass *self, char *msg);
114 void QR_set_notice(QResultClass *self, char *msg);
115 
116 void QR_set_num_fields(QResultClass *self, int new_num_fields); /* manual result only */
117 
118 void QR_inc_base(QResultClass *self, int base_inc);
119 void QR_set_cache_size(QResultClass *self, int cache_size);
120 void QR_set_rowset_size(QResultClass *self, int rowset_size);
121 void QR_set_position(QResultClass *self, int pos);
122 
123 #endif
124