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

数据库系统

开发平台:

Unix_Linux

  1. /*-------------------------------------------------------------------------
  2.  *
  3.  * temprel.c
  4.  *   POSTGRES temporary relation handling
  5.  *
  6.  * Copyright (c) 1994, Regents of the University of California
  7.  *
  8.  *
  9.  * IDENTIFICATION
  10.  *   $Header: /usr/local/cvsroot/pgsql/src/backend/utils/cache/temprel.c,v 1.6.2.1 1999/08/02 05:25:01 scrappy Exp $
  11.  *
  12.  *-------------------------------------------------------------------------
  13.  */
  14. /*
  15.  * This implements temp tables by modifying the relname cache lookups
  16.  * of pg_class.
  17.  * When a temp table is created, a linked list of temp table tuples is
  18.  * stored here.  When a relname cache lookup is done, references to user-named
  19.  * temp tables are converted to the internal temp table names.
  20.  *
  21.  */
  22. #include <sys/types.h>
  23. #include "postgres.h"
  24. #include "access/heapam.h"
  25. #include "catalog/heap.h"
  26. #include "catalog/index.h"
  27. #include "utils/temprel.h"
  28. GlobalMemory CacheCxt;
  29. /* ----------------
  30.  * global variables
  31.  * ----------------
  32.  */
  33. static List *temp_rels = NIL;
  34. typedef struct TempTable
  35. {
  36. char    *user_relname;
  37. HeapTuple pg_class_tuple;
  38. } TempTable;
  39. void
  40. create_temp_relation(char *relname, HeapTuple pg_class_tuple)
  41. {
  42. MemoryContext oldcxt;
  43. TempTable  *temp_rel;
  44. oldcxt = MemoryContextSwitchTo((MemoryContext) CacheCxt);
  45. temp_rel = palloc(sizeof(TempTable));
  46. temp_rel->user_relname = palloc(NAMEDATALEN);
  47. /* save user-supplied name */
  48. strcpy(temp_rel->user_relname, relname);
  49. temp_rel->pg_class_tuple = heap_copytuple(pg_class_tuple);
  50. temp_rels = lcons(temp_rel, temp_rels);
  51. MemoryContextSwitchTo(oldcxt);
  52. }
  53. void
  54. remove_all_temp_relations(void)
  55. {
  56. List    *l,
  57.    *next;
  58. AbortOutOfAnyTransaction();
  59. StartTransactionCommand();
  60. l = temp_rels;
  61. while (l != NIL)
  62. {
  63. TempTable  *temp_rel = lfirst(l);
  64. Form_pg_class classtuple;
  65. classtuple = (Form_pg_class) GETSTRUCT(temp_rel->pg_class_tuple);
  66. next = lnext(l); /* do this first, l is deallocated */
  67. if (classtuple->relkind != RELKIND_INDEX)
  68. {
  69. char relname[NAMEDATALEN];
  70. /* safe from deallocation */
  71. strcpy(relname, temp_rel->user_relname);
  72. heap_destroy_with_catalog(relname);
  73. }
  74. else
  75. index_destroy(temp_rel->pg_class_tuple->t_data->t_oid);
  76. l = next;
  77. }
  78. CommitTransactionCommand();
  79. }
  80. /* we don't have the relname for indexes, so we just pass the oid */
  81. void
  82. remove_temp_relation(Oid relid)
  83. {
  84. MemoryContext oldcxt;
  85. List    *l,
  86.    *prev;
  87. oldcxt = MemoryContextSwitchTo((MemoryContext) CacheCxt);
  88. prev = NIL;
  89. l = temp_rels;
  90. while (l != NIL)
  91. {
  92. TempTable  *temp_rel = lfirst(l);
  93. if (temp_rel->pg_class_tuple->t_data->t_oid == relid)
  94. {
  95. pfree(temp_rel->user_relname);
  96. pfree(temp_rel->pg_class_tuple);
  97. pfree(temp_rel);
  98. /* remove from linked list */
  99. if (prev != NIL)
  100. {
  101. lnext(prev) = lnext(l);
  102. pfree(l);
  103. l = lnext(prev);
  104. }
  105. else
  106. {
  107. temp_rels = lnext(l);
  108. pfree(l);
  109. l = temp_rels;
  110. }
  111. }
  112. else
  113. {
  114. prev = l;
  115. l = lnext(l);
  116. }
  117. }
  118. MemoryContextSwitchTo(oldcxt);
  119. }
  120. HeapTuple
  121. get_temp_rel_by_name(char *user_relname)
  122. {
  123. List    *l;
  124. foreach(l, temp_rels)
  125. {
  126. TempTable  *temp_rel = lfirst(l);
  127. if (strcmp(temp_rel->user_relname, user_relname) == 0)
  128. return temp_rel->pg_class_tuple;
  129. }
  130. return NULL;
  131. }