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

数据库系统

开发平台:

Unix_Linux

  1. /*-------------------------------------------------------------------------
  2.  *
  3.  *   FILE
  4.  * pgconnection.cpp
  5.  *
  6.  *   DESCRIPTION
  7.  *      implementation of the PgConnection class.
  8.  *   PgConnection encapsulates a frontend to backend connection
  9.  *
  10.  * Copyright (c) 1994, Regents of the University of California
  11.  *
  12.  * IDENTIFICATION
  13.  *   $Header: /usr/local/cvsroot/pgsql/src/interfaces/libpq++/pgconnection.cc,v 1.6 1999/05/30 15:17:56 tgl Exp $
  14.  *
  15.  *-------------------------------------------------------------------------
  16.  */
  17. #include <stdlib.h>
  18. #include <string.h>
  19. #include "pgconnection.h"
  20. extern "C" {
  21. #include "fe-auth.h"
  22. }
  23. // ****************************************************************
  24. //
  25. // PgConnection Implementation
  26. //
  27. // ****************************************************************
  28. // default constructor -- initialize everything
  29. PgConnection::PgConnection()
  30. : pgConn(NULL), pgResult(NULL), pgCloseConnection(0)
  31. {}
  32. // constructor -- checks environment variable for database name
  33. // Now uses PQconnectdb
  34. PgConnection::PgConnection(const char* conninfo)
  35. : pgConn(NULL), pgResult(NULL), pgCloseConnection(1)
  36. {
  37.     
  38.   // Connect to the database
  39.   Connect( conninfo );
  40. }
  41. // destructor - closes down the connection and cleanup
  42. PgConnection::~PgConnection()
  43. {
  44.   // Terminate the debugging output if it was turned on
  45.   #if defined(DEBUG)
  46.    PQuntrace(pgConn);
  47.   #endif
  48.   
  49.   // Close the conneciton only if needed
  50.   // This feature will most probably be used by the derived classes that
  51.   // need not close the connection after they are destructed.
  52.   if ( pgCloseConnection ) {
  53.        if(pgResult) PQclear(pgResult);
  54.        if(pgConn) PQfinish(pgConn);
  55.   }
  56. }
  57. // PgConnection::connect
  58. // establish a connection to a backend
  59. ConnStatusType PgConnection::Connect(const char* conninfo)
  60. {
  61. ConnStatusType cst;
  62.   // Turn the trace on
  63. #if defined(DEBUG)
  64.   FILE *debug = fopen("/tmp/trace.out","w");
  65.   PQtrace(pgConn, debug);
  66. #endif
  67.   
  68.   // Connect to the database
  69.   pgConn = PQconnectdb(conninfo);
  70.   
  71.   // Status will return either CONNECTION_OK or CONNECTION_BAD
  72.   cst =  Status();
  73.   if(CONNECTION_OK == cst) pgCloseConnection = (ConnStatusType)1;
  74.   else pgCloseConnection = (ConnStatusType)0;
  75. return cst;
  76. }
  77. // PgConnection::status -- return connection or result status
  78. ConnStatusType PgConnection::Status()
  79. {
  80.   return PQstatus(pgConn);
  81. }
  82. // PgConnection::exec  -- send a query to the backend
  83. ExecStatusType PgConnection::Exec(const char* query)
  84. {
  85.   // Clear the Result Stucture if needed
  86.   if (pgResult)
  87.     PQclear(pgResult); 
  88.   // Execute the given query
  89.   pgResult = PQexec(pgConn, query);
  90.   
  91.   // Return the status
  92.   if (pgResult)
  93. return PQresultStatus(pgResult);
  94.   else 
  95. return PGRES_FATAL_ERROR;
  96. }
  97. // Return true if the Postgres command was executed OK
  98. int PgConnection::ExecCommandOk(const char* query)
  99. {
  100. return Exec(query) == PGRES_COMMAND_OK;
  101. } // End ExecCommandOk()
  102. int PgConnection::ExecTuplesOk(const char* query)
  103. {
  104. return Exec(query) == PGRES_TUPLES_OK;
  105. } // End ExecTuplesOk()
  106. // Don't know why these next two need to be part of Connection
  107. // PgConnection::notifies() -- returns a notification from a list of unhandled notifications
  108. PGnotify* PgConnection::Notifies()
  109. {
  110.   Exec(" "); 
  111.   return PQnotifies(pgConn);
  112. }
  113. // From Integer To String Conversion Function
  114. string PgConnection::IntToString(int n)
  115. {
  116.   char buffer [32];
  117.   memset(buffer, 0, sizeof(buffer));
  118.   sprintf(buffer, "%d", n);
  119.   return buffer;
  120. }
  121. int PgConnection::ConnectionBad() 
  122. return Status() == CONNECTION_BAD; 
  123. }
  124. const char* PgConnection::ErrorMessage() 
  125. return (const char *)PQerrorMessage(pgConn); 
  126. }
  127.   
  128. const char* PgConnection::DBName()
  129. return (const char *)PQdb(pgConn); 
  130. }