qresult.h
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:5k
源码类别:

数据库系统

开发平台:

Unix_Linux

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