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

数据库系统

开发平台:

Unix_Linux

  1. /* Module:          columninfo.c
  2.  *
  3.  * Description:     This module contains routines related to 
  4.  *                  reading and storing the field information from a query.
  5.  *
  6.  * Classes:         ColumnInfoClass (Functions prefix: "CI_")
  7.  *
  8.  * API functions:   none
  9.  *
  10.  * Comments:        See "notice.txt" for copyright and license information.
  11.  *
  12.  */
  13. #include "columninfo.h"
  14. #include "connection.h"
  15. #include "socket.h"
  16. #include <stdlib.h>
  17. #include <malloc.h>
  18. #include <string.h>
  19. ColumnInfoClass *
  20. CI_Constructor()
  21. {
  22. ColumnInfoClass *rv;
  23. rv = (ColumnInfoClass *) malloc(sizeof(ColumnInfoClass));
  24. if (rv) {
  25. rv->num_fields = 0;
  26. rv->name = NULL;
  27. rv->adtid = NULL;
  28. rv->adtsize = NULL;
  29. rv->display_size = NULL;
  30. rv->atttypmod = NULL;
  31. }
  32. return rv;
  33. }
  34. void
  35. CI_Destructor(ColumnInfoClass *self)
  36. {
  37. CI_free_memory(self);
  38. free(self);
  39. }
  40. /*  Read in field descriptions.
  41.     If self is not null, then also store the information.
  42. If self is null, then just read, don't store.
  43. */
  44. char
  45. CI_read_fields(ColumnInfoClass *self, ConnectionClass *conn)
  46. {
  47. Int2 lf;
  48. int new_num_fields;
  49. Oid new_adtid;
  50. Int2 new_adtsize;
  51. Int4 new_atttypmod = -1;
  52. char new_field_name[MAX_MESSAGE_LEN+1];
  53. SocketClass *sock;
  54. ConnInfo *ci;
  55. sock = CC_get_socket(conn);
  56. ci = &conn->connInfo;
  57. /* at first read in the number of fields that are in the query */
  58. new_num_fields = (Int2) SOCK_get_int(sock, sizeof(Int2));
  59. mylog("num_fields = %dn", new_num_fields);
  60. if (self) {  /* according to that allocate memory */
  61. CI_set_num_fields(self, new_num_fields);
  62. }
  63. /* now read in the descriptions */
  64. for(lf = 0; lf < new_num_fields; lf++) {
  65. SOCK_get_string(sock, new_field_name, MAX_MESSAGE_LEN);
  66. new_adtid = (Oid) SOCK_get_int(sock, 4);
  67. new_adtsize = (Int2) SOCK_get_int(sock, 2);
  68. /* If 6.4 protocol, then read the atttypmod field */
  69. if ( ! PROTOCOL_63(ci) && ! PROTOCOL_62(ci)) {
  70. mylog("READING ATTTYPMODn");
  71. new_atttypmod = (Int4) SOCK_get_int(sock, 4);
  72. /* Subtract the header length */
  73. new_atttypmod -= 4;
  74. if (new_atttypmod < 0)
  75. new_atttypmod = -1;
  76. }
  77. mylog("CI_read_fields: fieldname='%s', adtid=%d, adtsize=%d, atttypmod=%dn", new_field_name, new_adtid, new_adtsize, new_atttypmod);
  78. if (self)
  79. CI_set_field_info(self, lf, new_field_name, new_adtid, new_adtsize, new_atttypmod);
  80. }
  81. return (SOCK_get_errcode(sock) == 0);
  82. }
  83. void
  84. CI_free_memory(ColumnInfoClass *self)
  85. {
  86. register Int2 lf;
  87. int num_fields = self->num_fields;
  88. for (lf = 0; lf < num_fields; lf++) {
  89. if( self->name[lf])
  90. free (self->name[lf]);
  91. }
  92. /* Safe to call even if null */
  93. free(self->name);
  94. free(self->adtid);
  95. free(self->adtsize);
  96. free(self->display_size);
  97. free(self->atttypmod);
  98. }
  99. void
  100. CI_set_num_fields(ColumnInfoClass *self, int new_num_fields)
  101. {
  102. CI_free_memory(self); /* always safe to call */
  103. self->num_fields = new_num_fields;
  104. self->name = (char **) malloc (sizeof(char *) * self->num_fields);
  105. self->adtid = (Oid *) malloc (sizeof(Oid) * self->num_fields);
  106. self->adtsize = (Int2 *) malloc (sizeof(Int2) * self->num_fields);
  107. self->display_size = (Int2 *) malloc(sizeof(Int2) * self->num_fields);
  108. self->atttypmod = (Int4 *) malloc(sizeof(Int4) * self->num_fields);
  109. }
  110. void
  111. CI_set_field_info(ColumnInfoClass *self, int field_num, char *new_name, 
  112.                                       Oid new_adtid, Int2 new_adtsize, Int4 new_atttypmod)
  113. {
  114.     
  115. // check bounds
  116. if((field_num < 0) || (field_num >= self->num_fields)) {
  117. return;
  118. }
  119. // store the info
  120. self->name[field_num] = strdup(new_name);  
  121. self->adtid[field_num] = new_adtid;
  122. self->adtsize[field_num] = new_adtsize;
  123. self->atttypmod[field_num] = new_atttypmod;
  124. self->display_size[field_num] = 0;
  125. }