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

数据库系统

开发平台:

Unix_Linux

  1. /*
  2.  * findoidjoins.c, required pgsql/contrib/pginterface
  3.  *
  4.  */
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include "halt.h"
  8. #include <libpq-fe.h>
  9. #include "pginterface.h"
  10. PGresult   *attres,
  11.    *relres;
  12. int
  13. main(int argc, char **argv)
  14. {
  15. char query[4000];
  16. char relname[256];
  17. char relname2[256];
  18. char attname[256];
  19. char typname[256];
  20. int count;
  21. if (argc != 2)
  22. halt("Usage:  %s databasen", argv[0]);
  23. connectdb(argv[1], NULL, NULL, NULL, NULL);
  24. on_error_continue();
  25. on_error_stop();
  26. doquery("BEGIN WORK");
  27. doquery("
  28. DECLARE c_attributes BINARY CURSOR FOR 
  29. SELECT typname, relname, a.attname 
  30. FROM pg_class c, pg_attribute a, pg_type t 
  31. WHERE a.attnum > 0 AND 
  32.   relkind = 'r' AND 
  33.   relhasrules = 'f' AND 
  34.   (typname = 'oid' OR 
  35.    typname = 'regproc') AND 
  36.   a.attrelid = c.oid AND 
  37.   a.atttypid = t.oid 
  38. ORDER BY 2, a.attnum ; 
  39. ");
  40. doquery("FETCH ALL IN c_attributes");
  41. attres = get_result();
  42. doquery("
  43. DECLARE c_relations BINARY CURSOR FOR 
  44. SELECT relname 
  45. FROM pg_class c 
  46. WHERE relkind = 'r' AND 
  47.   relhasrules = 'f' 
  48. ORDER BY 1; 
  49. ");
  50. doquery("FETCH ALL IN c_relations");
  51. relres = get_result();
  52. set_result(attres);
  53. while (fetch(typname, relname, attname) != END_OF_TUPLES)
  54. {
  55. set_result(relres);
  56. reset_fetch();
  57. while (fetch(relname2) != END_OF_TUPLES)
  58. {
  59. unset_result(relres);
  60. if (strcmp(typname, "oid") == 0)
  61. sprintf(query, "
  62. DECLARE c_matches BINARY CURSOR FOR 
  63. SELECT count(*) 
  64. FROM % s t1, %s t2 
  65. WHERE t1.% s = t2.oid ", relname, relname2, attname);
  66. else
  67. sprintf(query, "
  68. DECLARE c_matches BINARY CURSOR FOR 
  69. SELECT count(*) 
  70. FROM % s t1, %s t2 
  71. WHERE RegprocToOid(t1.% s) = t2.oid ", relname, relname2, attname);
  72. doquery(query);
  73. doquery("FETCH ALL IN c_matches");
  74. fetch(&count);
  75. if (count != 0)
  76. printf("Join %s.%s => %s.oidn", relname, attname, relname2);
  77. doquery("CLOSE c_matches");
  78. set_result(relres);
  79. }
  80. set_result(attres);
  81. }
  82. set_result(relres);
  83. doquery("CLOSE c_relations");
  84. PQclear(relres);
  85. set_result(attres);
  86. doquery("CLOSE c_attributes");
  87. PQclear(attres);
  88. unset_result(attres);
  89. doquery("COMMIT WORK");
  90. disconnectdb();
  91. return 0;
  92. }