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