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

数据库系统

开发平台:

Unix_Linux

  1. /*
  2.  * misc_utils.c --
  3.  *
  4.  * This file defines miscellaneous PostgreSQL utility functions.
  5.  *
  6.  * Copyright (c) 1998, Massimo Dal Zotto <dz@cs.unitn.it>
  7.  *
  8.  * This file is distributed under the GNU General Public License
  9.  * either version 2, or (at your option) any later version.
  10.  */
  11. #include <unistd.h>
  12. #include <signal.h>
  13. #include <string.h>
  14. #include <errno.h>
  15. #include "postgres.h"
  16. #include "access/heapam.h"
  17. #include "access/htup.h"
  18. #include "access/relscan.h"
  19. #include "access/skey.h"
  20. #include "access/tupdesc.h"
  21. #include "catalog/catname.h"
  22. #include "catalog/pg_listener.h"
  23. #include "storage/lmgr.h"
  24. #include "utils/fmgr.h"
  25. #include "utils/palloc.h"
  26. #include "utils/rel.h"
  27. #include "utils/tqual.h"
  28. #include "misc_utils.h"
  29. #define MIN(x,y) ((x)<=(y) ? (x) : (y))
  30. extern int ExecutorLimit(int limit);
  31. extern void Async_Unlisten(char *relname, int pid);
  32. extern int assertTest(int val);
  33. #ifdef ASSERT_CHECKING_TEST
  34. extern int assertEnable(int val);
  35. #endif
  36. int
  37. query_limit(int limit)
  38. {
  39. return ExecutorLimit(limit);
  40. }
  41. int
  42. backend_pid()
  43. {
  44. return getpid();
  45. }
  46. int
  47. unlisten(char *relname)
  48. {
  49. Async_Unlisten(relname, getpid());
  50. return 0;
  51. }
  52. int
  53. max(int x, int y)
  54. {
  55. return ((x > y) ? x : y);
  56. }
  57. int
  58. min(int x, int y)
  59. {
  60. return ((x < y) ? x : y);
  61. }
  62. /*
  63.  * Return the number of active listeners on a relation name.
  64.  */
  65. int
  66. active_listeners(text *relname)
  67. {
  68. HeapTuple lTuple;
  69. Relation lRel;
  70. HeapScanDesc sRel;
  71. TupleDesc tdesc;
  72. ScanKeyData key;
  73. Datum d;
  74. bool isnull;
  75. int len, pid;
  76. int count = 0;
  77. int ourpid = getpid();
  78. char listen_name[NAMEDATALEN];
  79. lRel = heap_openr(ListenerRelationName);
  80. tdesc = RelationGetDescr(lRel);
  81. LockRelation(lRel, AccessShareLock);
  82. if (relname && (VARSIZE(relname) > VARHDRSZ)) {
  83. len = MIN(VARSIZE(relname)-VARHDRSZ, NAMEDATALEN-1);
  84. strncpy(listen_name, VARDATA(relname), len);
  85. listen_name[len] = '';
  86. ScanKeyEntryInitialize(&key, 0,
  87.    Anum_pg_listener_relname,
  88.    F_NAMEEQ,
  89.    PointerGetDatum(listen_name));
  90. sRel = heap_beginscan(lRel, 0, SnapshotNow, 1, &key);
  91. } else {
  92. sRel = heap_beginscan(lRel, 0, SnapshotNow, 0, (ScanKey)NULL);
  93. }
  94. while (HeapTupleIsValid(lTuple = heap_getnext(sRel, 0)))
  95. {
  96. d = heap_getattr(lTuple, Anum_pg_listener_pid, tdesc, &isnull);
  97. pid = DatumGetInt32(d);
  98. #ifdef HAVE_KILL
  99. if ((pid == ourpid) || (kill(pid, SIGTSTP) == 0)) {
  100. /* elog(NOTICE, "%d ok", pid); */
  101. count++;
  102. }
  103. #else
  104. count++;
  105. #endif
  106. }
  107. heap_endscan(sRel);
  108. UnlockRelation(lRel, AccessShareLock);
  109. heap_close(lRel);
  110. return count;
  111. }
  112. int
  113. assert_enable(int val)
  114. {
  115. return assertEnable(val);
  116. }
  117. #ifdef ASSERT_CHECKING_TEST
  118. int
  119. assert_test(int val)
  120. {
  121. return assertTest(val);
  122. }
  123. #endif
  124. /* end of file */
  125. /*
  126.  * Local Variables:
  127.  *  tab-width: 4
  128.  *  c-indent-level: 4
  129.  *  c-basic-offset: 4
  130.  * End:
  131.  */