]> granicus.if.org Git - postgresql/commitdiff
Here's a version of my suggested diffs transplanted to 7.1 beta 5. I'm
authorBruce Momjian <bruce@momjian.us>
Wed, 9 May 2001 17:29:10 +0000 (17:29 +0000)
committerBruce Momjian <bruce@momjian.us>
Wed, 9 May 2001 17:29:10 +0000 (17:29 +0000)
still looking at the best way to integrate Tom Vijlbrief's fixes
(insofar as they're still needed); would 7.2 be a suitable time for
incompatible API changes?

Jeroen

Changes:

(*) Introduced bool, true, false (replacing some int, 1, 0)
(*) Made some member functions const
(*) Documented GetIsNull()
(*) Marked DisplayTuples() and PrintTuples() as obsolescent; fixed possible
    portability problem (assumed that NULL pointer equals all-zero bit pattern)
(*) PrintTuples(): renamed width parameter to fillAlign to conform with other
    usage; fixed memory leak and compile issue w.r.t. field separator (should
    also slightly improve performance)
(*) Fixed some minor compilation issues
(*) Moved "using namespace std;" out of headers, where they didn't belong; used
    new (temporary) preprocessor macro PGSTD to do this
(*) Made ToString() static, removed unneeded memset(), made buffer size adapt
    to sizeof(int)
(*) Made some constructors explicit
(*) Changed some const std::string & parameters to plain std::string
(*) Marked PgCursor::Cursor(std::string) as obsolescent (setter with same name
    as getter--bad style)
(*) Renamed some paramaters previously named "string"
(*) Introduced size_type typedef for number of tuples in result set
(*) PgTransaction now supports re-opening after closing, and aborts if not
    explicitly committed prior to destruction

J. T. Vermeulen

18 files changed:
doc/src/sgml/libpq++.sgml
doc/src/sgml/ref/psql-ref.sgml
src/bin/psql/command.c
src/bin/psql/describe.c
src/bin/psql/describe.h
src/interfaces/libpq++/examples/testlibpq4.cc
src/interfaces/libpq++/examples/testlibpq5.cc
src/interfaces/libpq++/examples/testlibpq6.cc
src/interfaces/libpq++/pgconnection.cc
src/interfaces/libpq++/pgconnection.h
src/interfaces/libpq++/pgcursordb.cc
src/interfaces/libpq++/pgcursordb.h
src/interfaces/libpq++/pgdatabase.cc
src/interfaces/libpq++/pgdatabase.h
src/interfaces/libpq++/pglobject.cc
src/interfaces/libpq++/pglobject.h
src/interfaces/libpq++/pgtransdb.cc
src/interfaces/libpq++/pgtransdb.h

index ad782013a35dd5652720ed87f20f8bd3db596ece..d4b53557ddc27a1b365de6a5993f83375330a139 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-$Header: /cvsroot/pgsql/doc/src/sgml/Attic/libpq++.sgml,v 1.28 2001/05/01 10:48:57 petere Exp $
+$Header: /cvsroot/pgsql/doc/src/sgml/Attic/libpq++.sgml,v 1.29 2001/05/09 17:29:09 momjian Exp $
 -->
 
  <chapter id="libpqplusplus">
@@ -227,9 +227,9 @@ $Header: /cvsroot/pgsql/doc/src/sgml/Attic/libpq++.sgml,v 1.28 2001/05/01 10:48:
        returns whether or not the connection to the backend server succeeded or
        failed.  
        <synopsis>
-       int PgConnection::ConnectionBad()
+       bool PgConnection::ConnectionBad() const
        </synopsis>
-       Returns TRUE if the connection failed.
+       Returns true if the connection failed.
       </para>
      </listitem>
      <listitem>
@@ -368,7 +368,7 @@ $Header: /cvsroot/pgsql/doc/src/sgml/Attic/libpq++.sgml,v 1.28 2001/05/01 10:48:
        <function>Tuples</function>
        Returns the number of tuples (rows) in the query result. 
        <synopsis>
-       int PgDatabase::Tuples()
+       int PgDatabase::Tuples() const
        </synopsis>
       </para>
      </listitem>
@@ -387,7 +387,7 @@ $Header: /cvsroot/pgsql/doc/src/sgml/Attic/libpq++.sgml,v 1.28 2001/05/01 10:48:
        Returns the field (attribute) name associated with the given field index. 
        Field indices start at 0. 
        <synopsis>
-       const char *PgDatabase::FieldName(int field_num)
+       const char *PgDatabase::FieldName(int field_num) const
        </synopsis>
       </para>
      </listitem>
@@ -397,7 +397,7 @@ $Header: /cvsroot/pgsql/doc/src/sgml/Attic/libpq++.sgml,v 1.28 2001/05/01 10:48:
        PQfnumber Returns the field (attribute) index associated with 
        the given field name. 
        <synopsis>
-       int PgDatabase::FieldNum(const char* field_name)
+       int PgDatabase::FieldNum(const char* field_name) const
        </synopsis>
        -1 is returned if the given name does not match any field.
       </para>
@@ -409,7 +409,7 @@ $Header: /cvsroot/pgsql/doc/src/sgml/Attic/libpq++.sgml,v 1.28 2001/05/01 10:48:
        integer returned is an internal coding of the type. Field indices
        start at 0. 
        <synopsis>
-       Oid PgDatabase::FieldType(int field_num)
+       Oid PgDatabase::FieldType(int field_num) const
        </synopsis>
       </para>
      </listitem>
@@ -420,7 +420,7 @@ $Header: /cvsroot/pgsql/doc/src/sgml/Attic/libpq++.sgml,v 1.28 2001/05/01 10:48:
        integer returned is an internal coding of the type. Field indices
        start at 0. 
        <synopsis>
-       Oid PgDatabase::FieldType(const char* field_name)
+       Oid PgDatabase::FieldType(const char* field_name) const
        </synopsis>
       </para>
      </listitem>
@@ -430,7 +430,7 @@ $Header: /cvsroot/pgsql/doc/src/sgml/Attic/libpq++.sgml,v 1.28 2001/05/01 10:48:
        Returns the size in bytes of the field associated with the given 
        field index. Field indices start at 0. 
        <synopsis>
-       short PgDatabase::FieldSize(int field_num)
+       short PgDatabase::FieldSize(int field_num) const
        </synopsis>
        Returns the space allocated for this field in a database tuple given
        the field number. In other words the size of the server's binary 
@@ -444,7 +444,7 @@ $Header: /cvsroot/pgsql/doc/src/sgml/Attic/libpq++.sgml,v 1.28 2001/05/01 10:48:
        Returns the size in bytes of the field associated with the given 
        field index. Field indices start at 0. 
        <synopsis>
-       short PgDatabase::FieldSize(const char *field_name)
+       short PgDatabase::FieldSize(const char *field_name) const
        </synopsis>
        Returns the space allocated for this field in a database tuple given
        the field name. In other words the size of the server's binary 
@@ -466,7 +466,7 @@ $Header: /cvsroot/pgsql/doc/src/sgml/Attic/libpq++.sgml,v 1.28 2001/05/01 10:48:
        Returns a single field (attribute) value of one tuple of a PGresult. 
        Tuple and field indices start at 0. 
        <synopsis>
-       const char *PgDatabase::GetValue(int tup_num, int field_num)
+       const char *PgDatabase::GetValue(int tup_num, int field_num) const
        </synopsis>
        For most queries, the value returned by GetValue is a null-terminated 
        ASCII string representation of the attribute value. But if BinaryTuples() 
@@ -486,7 +486,7 @@ $Header: /cvsroot/pgsql/doc/src/sgml/Attic/libpq++.sgml,v 1.28 2001/05/01 10:48:
        Returns a single field (attribute) value of one tuple of a PGresult. 
        Tuple and field indices start at 0. 
        <synopsis>
-       const char *PgDatabase::GetValue(int tup_num, const char *field_name)
+       const char *PgDatabase::GetValue(int tup_num, const char *field_name) const
        </synopsis>
        For most queries, the value returned by GetValue is a null-terminated 
        ASCII string representation of the attribute value. But if BinaryTuples() 
@@ -506,7 +506,7 @@ $Header: /cvsroot/pgsql/doc/src/sgml/Attic/libpq++.sgml,v 1.28 2001/05/01 10:48:
        Returns the length of a field (attribute) in bytes. Tuple and field 
        indices start at 0. 
        <synopsis>
-       int PgDatabase::GetLength(int tup_num, int field_num)
+       int PgDatabase::GetLength(int tup_num, int field_num) const
        </synopsis>
        This is the actual data length for the particular data value, that 
        is the size of the object pointed to by GetValue. Note that for
@@ -520,7 +520,7 @@ $Header: /cvsroot/pgsql/doc/src/sgml/Attic/libpq++.sgml,v 1.28 2001/05/01 10:48:
        Returns the length of a field (attribute) in bytes. Tuple and field 
        indices start at 0. 
        <synopsis>
-       int PgDatabase::GetLength(int tup_num, const char* field_name)
+       int PgDatabase::GetLength(int tup_num, const char* field_name) const
        </synopsis>
        This is the actual data length for the particular data value, that 
        is the size of the object pointed to by GetValue. Note that for
@@ -528,25 +528,47 @@ $Header: /cvsroot/pgsql/doc/src/sgml/Attic/libpq++.sgml,v 1.28 2001/05/01 10:48:
        size reported by PQfsize.
       </para>
      </listitem>
+     <listitem>
+      <para>
+       <function>GetIsNull</function>
+       Returns whether a field has the null value.
+       <synopsis>
+        bool GetIsNull(int tup_num, int field_num) const
+       </synopsis>
+       Note that GetValue will return the empty string for null fields, not
+       the NULL pointer.
+      </para>
+     </listitem>
+     <listitem>
+      <para>
+       <function>GetIsNull</function>
+       Returns whether a field has the null value.
+       <synopsis>
+        bool GetIsNull(int tup_num, const char *field_name) const
+       </synopsis>
+       Note that GetValue will return the empty string for null fields, not
+       the NULL pointer.
+      </para>
+     </listitem>
      <listitem>
       <para>
        <function>DisplayTuples</function>
-       Prints out all the tuples and, optionally, the attribute names to the 
+       OBSOLESCENT: Prints out all the tuples and, optionally, the attribute names to the 
        specified output stream. 
        <synopsis>
-       void PgDatabase::DisplayTuples(FILE *out = 0, int fillAlign = 1
-       const char* fieldSep = "|",int printHeader = 1, int quiet = 0)
+       void PgDatabase::DisplayTuples(FILE *out = 0, bool fillAlign = true
+       const char* fieldSep = "|",bool printHeader = true, bool quiet = false) const
        </synopsis>
       </para>
      </listitem>
      <listitem>
       <para>
        <function>PrintTuples</function>
-       Prints out all the tuples and, optionally, the attribute names to the 
+       OBSOLESCENT: Prints out all the tuples and, optionally, the attribute names to the 
        specified output stream. 
        <synopsis>
-       void PgDatabase::PrintTuples(FILE *out = 0, int printAttName = 1
-       int terseOutput = 0, int width = 0) 
+       void PgDatabase::PrintTuples(FILE *out = 0, bool printAttName = true
+       bool terseOutput = false, bool fillAlign = false) const
        </synopsis>
       </para>
      </listitem>
@@ -563,7 +585,7 @@ $Header: /cvsroot/pgsql/doc/src/sgml/Attic/libpq++.sgml,v 1.28 2001/05/01 10:48:
               Returns the number of rows affected after an INSERT, UPDATE or DELETE. 
               If the command was anything else, it returns -1. 
        <synopsis>
-      int PgDatabase::CmdTuples()
+      int PgDatabase::CmdTuples() const
        </synopsis>
       </para>
      </listitem>
@@ -572,7 +594,7 @@ $Header: /cvsroot/pgsql/doc/src/sgml/Attic/libpq++.sgml,v 1.28 2001/05/01 10:48:
       <para>
        <function>OidStatus</function>
        <synopsis>
-       const char *PgDatabase::OidStatus()
+       const char *PgDatabase::OidStatus() const
        </synopsis>
       </para>
      </listitem>
@@ -650,8 +672,8 @@ $Header: /cvsroot/pgsql/doc/src/sgml/Attic/libpq++.sgml,v 1.28 2001/05/01 10:48:
     to see if any notification data is currently available from the backend. 
     <function>PgDatabase::Notifies</function>
     returns the notification from a list of unhandled notifications from the
-    backend. The function eturns NULL if there is no pending notifications from the
-    backend.   
+    backend. The function returns NULL if there are no pending notifications 
+    from the backend.   
     <function>PgDatabase::Notifies</function>
     behaves like the popping of a stack.  Once a notification is returned
     from <function>PgDatabase::Notifies</function>,
index c1f405f3f3e6e8081e434bb5cb41216eb9211ad7..a5a1dc8ac00022a0048b51b2ca01973637d3aabb 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-$Header: /cvsroot/pgsql/doc/src/sgml/ref/psql-ref.sgml,v 1.50 2001/05/07 19:31:33 petere Exp $
+$Header: /cvsroot/pgsql/doc/src/sgml/ref/psql-ref.sgml,v 1.51 2001/05/09 17:29:10 momjian Exp $
 Postgres documentation
 -->
 
@@ -494,6 +494,16 @@ testdb=>
       </varlistentry>
 
 
+      <varlistentry>
+        <term><literal>\du [ <replaceable class="parameter">pattern</replaceable> ]</literal></term>
+        <listitem>
+        <para>
+        Lists all configured users or only those that match <replaceable class="parameter">pattern</replaceable>.
+        </para>
+        </listitem>
+      </varlistentry>
+
+
       <varlistentry>
         <term><literal>\edit</literal> (or <literal>\e</literal>) [ <replaceable class="parameter">filename</replaceable> ]</term>
 
index fd3c9f8d92e53007207f811c3de657432c5e8784..966fbaafe4f48c3a47a120567f73b2c67c1b2fce 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright 2000 by PostgreSQL Global Development Group
  *
- * $Header: /cvsroot/pgsql/src/bin/psql/command.c,v 1.51 2001/05/07 19:31:33 petere Exp $
+ * $Header: /cvsroot/pgsql/src/bin/psql/command.c,v 1.52 2001/05/09 17:29:10 momjian Exp $
  */
 #include "postgres_fe.h"
 #include "command.h"
@@ -357,6 +357,9 @@ exec_command(const char *cmd,
                        case 'S':
                                success = listTables(&cmd[1], name, show_verbose);
                                break;
+                       case 'u':
+                               success = describeUsers(name);
+                               break;
                        default:
                                status = CMD_UNKNOWN;
                }
index d31d68bbbed27c43e7847e35583fe578553c6cff..f7e544bc78f5062c8792911d9d21febcad847191 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright 2000 by PostgreSQL Global Development Group
  *
- * $Header: /cvsroot/pgsql/src/bin/psql/describe.c,v 1.28 2001/03/22 04:00:19 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/bin/psql/describe.c,v 1.29 2001/05/09 17:29:10 momjian Exp $
  */
 #include "postgres_fe.h"
 #include "describe.h"
@@ -890,6 +890,103 @@ describeTableDetails(const char *name, bool desc)
 }
 
 
+/*
+ * describeUsers()
+ *
+ * \du [user]
+ *
+ * Describes users, possibly based on a simplistic prefix search on the
+ * argument.
+ */
+
+bool
+describeUsers (const char *name)
+{
+       char            buf[384 + REGEXP_CUTOFF];
+       PGresult   *res;
+       printTableOpt myopt = pset.popt.topt;
+       int             i;
+       char       *title;
+    const char *headers[4];
+       char      **cells       = NULL;
+       unsigned int cols;
+       
+       /*
+        * All we want to know is the user names and permissions
+        * for the system.
+        */
+
+       title = "List of Users";
+
+       cols = 0;
+       headers[cols++] = "User Name";
+       headers[cols++] = "User ID";
+       headers[cols++] = "Attributes";
+       headers[cols] = NULL;
+
+       strcpy(buf,
+                  "SELECT u.usename AS \"User Name\"\n
+                 , u.usesysid AS \"User ID\"\n
+                 , u.usesuper AS \"Super User\"\n
+                 , u.usecreatedb AS \"Create DB\"\n
+              FROM pg_user u\n");
+       if (name)
+       {
+               strcat(buf, "   WHERE u.usename ~ '^");
+               strncat(buf, name, REGEXP_CUTOFF);
+               strcat(buf, "'\n");
+       }
+       strcat(buf, "ORDER BY \"User Name\"\n");
+
+       res = PSQLexec(buf);
+       if (!res)
+               return false;
+
+       cells = xmalloc((PQntuples(res) * cols + 1) * sizeof(*cells));
+       cells[PQntuples(res) * cols] = NULL;
+
+       for (i = 0; i < PQntuples(res); i++)
+       {
+               char createuser[2] = "";
+               char createdb[2]  = "";
+
+               /* Name */
+               cells[i * cols + 0] = PQgetvalue(res, i, 0);
+
+               /* ID */
+               cells[i * cols + 1] = PQgetvalue(res, i, 1);
+
+               /* Super */
+               strcpy(createuser, PQgetvalue(res, i, 2));
+
+               /* Create DB */
+               strcpy(createdb, PQgetvalue(res, i, 3));
+
+               cells[i * cols + 2] = xmalloc((strlen("create user, create DB") * sizeof(char)) + 1);
+               strcpy(cells[i * cols + 2], "");
+               
+               if (strcmp(createuser, "t") == 0)
+                       strcat(cells[i * cols + 2], "create user");
+               
+               if (strcmp(createdb, "t") == 0) {
+                       if (strcmp(createuser, "t") == 0) 
+                               strcat(cells[i * cols + 2], ", ");
+                       strcat(cells[i * cols + 2], "create DB");
+               }
+       }          
+
+       printTable(title, headers,
+                          (const char **) cells,
+                          NULL,
+                          "lll", &myopt, pset.queryFout);
+
+       /* clean up */
+       free(cells);
+
+       PQclear(res);
+       return true;
+}
+
 
 /*
  * listTables()
index 7383ea6fa664e0ec7139609d8899a54cb106a381..98821fbed0507a009eddb3a4a54f1e6472f578fc 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright 2000 by PostgreSQL Global Development Group
  *
- * $Header: /cvsroot/pgsql/src/bin/psql/describe.h,v 1.9 2000/04/12 17:16:22 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/bin/psql/describe.h,v 1.10 2001/05/09 17:29:10 momjian Exp $
  */
 #ifndef DESCRIBE_H
 #define DESCRIBE_H
@@ -22,6 +22,9 @@ bool          describeTypes(const char *name, bool verbose);
 /* \do */
 bool           describeOperators(const char *name);
 
+/* \du */
+bool           describeUsers(const char *name);
+
 /* \z (or \dp) */
 bool           permissionsList(const char *name);
 
index 98f91686c9d2591a880b7b61abcba92a0eb9d7dc..a3248ea2586311978a2353263135c22032c3e71d 100644 (file)
@@ -22,12 +22,12 @@ INSERT INTO TBL1 values (10);
 #include "libpq++.h"
 #include <stdlib.h>
 
-main()
+int main()
 {
   // Begin, by connecting to the backend using hardwired constants
   // and a test database created by the user prior to the invokation
   // of this test program.
-  char* dbName = "dbname=template1";
+  const char* dbName = "dbname=template1";
   PgDatabase data(dbName);
 
   // Check to see that the backend connection was successfully made
index 9f74d4d5309bb317bd26844576eea15510b6bcc2..04e600d5316b858bb01b7f7739e169f5d0845467 100644 (file)
@@ -34,12 +34,12 @@ extern "C" {
 #include "utils/geo_decls.h" // for the POLYGON type
 }
 
-main()
+int main()
 {
   // Begin, by connecting to the backend using hardwired constants
   // and a test database created by the user prior to the invokation
   // of this test program.  Connect using cursor interface.
-  char* dbName = "dbname=template1"; // change this to the name of your test database
+  const char* dbName = "dbname=template1"; // change this to the name of your test database
   PgCursor data(dbName, "mycursor");
 
   // check to see that the backend connection was successfully made
index 23263d9c361cd9cb3f78e8283b8845d3a0b65ff3..1f469f145f5f94a336c018a56726e17e73e47f78 100644 (file)
@@ -8,12 +8,12 @@
 #include "libpq++.h"
 #include <stdlib.h>
 
-main()
+int main()
 {
   // Begin, by connecting to the backend using hardwired constants
   // and a test database created by the user prior to the invokation
   // of this test program.  Connect using transaction interface.
-  char* dbName = "dbname=template1";
+  const char* dbName = "dbname=template1";
   PgTransaction data(dbName);
 
   // check to see that the backend connection was successfully made
index 80b45685dcbf9b247a709c49813370e8d0656cb6..2f10264deaaf801584266d9922de7b4fb2f06df3 100644 (file)
  * Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/interfaces/libpq++/Attic/pgconnection.cc,v 1.10 2000/07/27 19:44:01 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/interfaces/libpq++/Attic/pgconnection.cc,v 1.11 2001/05/09 17:29:10 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
 
 #include "pgconnection.h"
 
+using namespace std;
+
 
 // ****************************************************************
 //
 // ****************************************************************
 // default constructor -- initialize everything
 PgConnection::PgConnection()
-       : pgConn(NULL), pgResult(NULL), pgCloseConnection(0)
+       : pgConn(NULL), pgResult(NULL), pgCloseConnection(false)
 {}
 
 
 // constructor -- checks environment variable for database name
 // Now uses PQconnectdb
 PgConnection::PgConnection(const char* conninfo)
-       : pgConn(NULL), pgResult(NULL), pgCloseConnection(1)
+       : pgConn(NULL), pgResult(NULL), pgCloseConnection(true)
 {
     
   // Connect to the database
@@ -60,14 +62,14 @@ void PgConnection::CloseConnection()
        pgResult=NULL;
        if(pgConn) PQfinish(pgConn);
        pgConn=NULL;
-       pgCloseConnection=0;
+       pgCloseConnection=false;
   }
 }
 
 
 // PgConnection::connect
 // establish a connection to a backend
-ConnStatusType PgConnection::Connect(const char* conninfo)
+ConnStatusType PgConnection::Connect(const char conninfo[])
 {
   // if the connection is open, close it first
   CloseConnection();
@@ -76,14 +78,14 @@ ConnStatusType PgConnection::Connect(const char* conninfo)
   pgConn = PQconnectdb(conninfo);
 
   // Now we have a connection we must close (even if it's bad!)
-  pgCloseConnection = 1;
+  pgCloseConnection = true;
   
   // Status will return either CONNECTION_OK or CONNECTION_BAD
   return Status();
 }
 
 // PgConnection::status -- return connection or result status
-ConnStatusType PgConnection::Status()
+ConnStatusType PgConnection::Status() const
 {
   return PQstatus(pgConn);
 }
@@ -131,27 +133,26 @@ PGnotify* PgConnection::Notifies()
 // From Integer To String Conversion Function
 string PgConnection::IntToString(int n)
 {
-  char buffer [32];
-  memset(buffer, 0, sizeof(buffer));
+  char buffer [4*sizeof(n) + 2];
   sprintf(buffer, "%d", n);
   return buffer;
 }
 
 
 
-int PgConnection::ConnectionBad() 
+bool PgConnection::ConnectionBad() const
 { 
 return Status() == CONNECTION_BAD; 
 }
 
 
-const char* PgConnection::ErrorMessage() 
+const char* PgConnection::ErrorMessage() const
 { 
 return (const char *)PQerrorMessage(pgConn); 
 }
   
 
-const char* PgConnection::DBName()
+const char* PgConnection::DBName() const
 { 
 return (const char *)PQdb(pgConn); 
 }
index 4310dac61db3b823ab951a82c01359e28093b5ee..76cb6ec3670ad45d5723465f0a8da3cedd490abb 100644 (file)
@@ -13,7 +13,7 @@
  * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  * 
- * $Id: pgconnection.h,v 1.10 2001/02/10 02:31:30 tgl Exp $
+ * $Id: pgconnection.h,v 1.11 2001/05/09 17:29:10 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -43,7 +43,9 @@ extern "C" {
 }
 
 #ifdef HAVE_NAMESPACE_STD
-using namespace std;
+#define PGSTD std::
+#else
+#define PGSTD
 #endif
 
 
@@ -57,21 +59,21 @@ using namespace std;
 // derived from this class to obtain the connection interface.
 class PgConnection {
 protected:
-  PGconn* pgConn;                              // Connection Structure
+  PGconn* pgConn;                      // Connection Structure
   PGresult* pgResult;                  // Current Query Result
-  int pgCloseConnection; // TRUE if connection should be closed by destructor
+  bool pgCloseConnection; // true if connection should be closed by destructor
   
 public:
-   PgConnection(const char* conninfo);         // use reasonable & environment defaults
+   explicit PgConnection(const char* conninfo); // use reasonable & environment defaults
    virtual ~PgConnection();                    // close connection and clean up
    
    // Connection status and error messages
-   ConnStatusType Status();
-   int ConnectionBad();
-   const char* ErrorMessage();
+   ConnStatusType Status() const;
+   bool ConnectionBad() const;
+   const char* ErrorMessage() const;
   
    // returns the database name of the connection
-   const char* DBName();
+   const char* DBName() const;
 
    // Query Execution interface
    ExecStatusType Exec(const char* query);  // send a query to the backend
@@ -82,7 +84,7 @@ public:
 protected:
    ConnStatusType Connect(const char* conninfo);
    void CloseConnection();
-   string IntToString(int);
+   static PGSTD string IntToString(int);
    // Default constructor is only available to subclasses
    PgConnection();
 
@@ -93,4 +95,10 @@ private:
    PgConnection& operator= (const PgConnection&);
 };
 
+
+#ifdef HAVE_NAMESPACE_STD
+#undef PGSTD
+#endif
+
+
 #endif // PGCONNECTION_H
index e2bfd2480f021c2414921951c6e4bf0b60166cdd..369bc15f6e0602df1ed6c9174451897f7ddf983b 100644 (file)
  * Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/interfaces/libpq++/Attic/pgcursordb.cc,v 1.4 1999/06/01 02:43:37 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/interfaces/libpq++/Attic/pgcursordb.cc,v 1.5 2001/05/09 17:29:10 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
  
 #include "pgcursordb.h"
  
+
+using namespace std;
+
+
 // ****************************************************************
 //
 // PgCursor Implementation
@@ -48,7 +52,7 @@ PgCursor::~PgCursor()
 //
 // ****************************************************************
 // Declare a cursor: name has already been supplied in the constructor
-int PgCursor::Declare(const string& query, int binary)
+int PgCursor::Declare(string query, bool binary)
 {
        string cmd = "DECLARE " + pgCursor;
        if ( binary )
@@ -70,7 +74,7 @@ int PgCursor::Fetch(unsigned num, const char* dir)
 } // End Fetch()
 
 // Create and execute the actual fetch command with the given arguments
-int PgCursor::Fetch(const string& num, const string& dir)
+int PgCursor::Fetch(string num, string dir)
 {
        string cmd = "FETCH " + dir + " " + num + " IN " + pgCursor;
        return ExecTuplesOk( cmd.c_str() );
index 4f8ad4e1db94ec439db401e554c472fff2b1b699..bbf8757ce4d9bc4fa48f770520e86f33679276dc 100644 (file)
@@ -14,7 +14,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  *
- *  $Id: pgcursordb.h,v 1.6 2001/01/24 19:43:32 momjian Exp $
+ *  $Id: pgcursordb.h,v 1.7 2001/05/09 17:29:10 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
 #include "pgtransdb.h"
 #endif
 
+#ifdef HAVE_NAMESPACE_STD
+#define PGSTD std::
+#else
+#define PGSTD
+#endif
+
 
 // ****************************************************************
 //
@@ -44,20 +50,22 @@ public:
   ~PgCursor(); // close connection and clean up
   
   // Commands associated with cursor interface
-  int Declare(const string& query, int binary = 0);    // Declare a cursor with given name
+  int Declare(PGSTD string query, bool binary=false);  // Declare a cursor with given name
   int Fetch(const char* dir = "FORWARD");              // Fetch ALL tuples in given direction
   int Fetch(unsigned num, const char* dir = "FORWARD");        // Fetch specified amount of tuples
   int Close(); // Close the cursor
   
   // Accessors to the cursor name
   const char* Cursor() const { return pgCursor.c_str(); }
-  void Cursor(const string& cursor) { pgCursor = cursor; }
+  // TODO: Setter has same name as getter--ouch!
+  // OBSOLESCENT
+  void Cursor(PGSTD string cursor) { pgCursor = cursor; }
   
 protected:
-  int Fetch(const string& num, const string& dir);
+  int Fetch(PGSTD string num, PGSTD string dir);
   
 protected:
-  string pgCursor;
+  PGSTD string pgCursor;
   
 protected:
   PgCursor() : PgTransaction() {}      // Do not connect
@@ -69,4 +77,10 @@ private:
    PgCursor& operator= (const PgCursor&);
 }; // End PgCursor Class Declaration
 
+
+#ifdef HAVE_NAMESPACE_STD
+#undef PGSTD
+#endif
+
 #endif // PGCURSORDB_H
+
index 545c71c08d3a3728a294893ce98bd264998697f5..73eab788629e0e411b3ba887082399a0df962b73 100644 (file)
@@ -10,7 +10,7 @@
  * Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/interfaces/libpq++/Attic/pgdatabase.cc,v 1.9 2000/01/29 16:58:52 petere Exp $
+ *       $Header: /cvsroot/pgsql/src/interfaces/libpq++/Attic/pgdatabase.cc,v 1.10 2001/05/09 17:29:10 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
 #include "pgdatabase.h"
 
 
-void PgDatabase::DisplayTuples(FILE *out, int fillAlign, 
-                                                          const char* fieldSep, int printHeader,
-                                                          int /* quiet */) 
+using namespace std;
+
+
+// OBSOLESCENT (uses PQprint(), which is no longer being maintained)
+void PgDatabase::DisplayTuples(FILE *out, 
+       bool fillAlign, 
+       const char* fieldSep, 
+       bool printHeader,
+       bool /* quiet */) const
 {
        PQprintOpt po;
 
-       memset(&po,0,sizeof(po));
-
-       po.align = fillAlign;
-       po.fieldSep = (char *)fieldSep;
        po.header = printHeader;
+       po.align = fillAlign;
+       po.standard = po.html3 = po.expanded = po.pager = 0;
+       po.fieldSep = const_cast<char *>(fieldSep);
+       po.tableOpt = po.caption = 0;
+       po.fieldName = 0;
 
        PQprint(out,pgResult,&po);
 }
 
 
 
-
-void PgDatabase::PrintTuples(FILE *out, int printAttName, int terseOutput,
-                                                        int width)
+// OBSOLESCENT (uses PQprint(), which is no longer being maintained)
+void PgDatabase::PrintTuples(FILE *out, 
+       bool printAttName, 
+       bool terseOutput,
+       bool fillAlign) const
 {
        PQprintOpt po;
 
-       memset(&po,0,sizeof(po));
-
-       po.align = width;
-
-       if(terseOutput) po.fieldSep = strdup("|");
-       else po.fieldSep = "";
-
        po.header = printAttName;
+       po.align = fillAlign;
+       po.standard = po.html3 = po.expanded = po.pager = 0;
+       po.tableOpt = po.caption = 0;
+       po.fieldSep = const_cast<char *>(terseOutput ? "" : "|");
+       po.fieldName = 0;
 
        PQprint(out,pgResult,&po);
 }
 
 
 
-int PgDatabase::Tuples()
+int PgDatabase::Tuples() const
 { 
 return PQntuples(pgResult); 
 }
 
 
-int PgDatabase::CmdTuples()
+int PgDatabase::CmdTuples() const
 {
-char *a;
-
-  a = (char *)PQcmdTuples(pgResult);
-  if(!a[0]) return -1;
-
-return atoi(a);
+const char *a = PQcmdTuples(pgResult);
+return a[0] ? atoi(a) : -1;
 }
 
 
+// TODO: Make const?
 int PgDatabase::Fields()
 { 
 return PQnfields(pgResult); 
 }
 
 
-const char* PgDatabase::FieldName(int field_num)
+const char* PgDatabase::FieldName(int field_num) const
 { 
 return PQfname(pgResult, field_num); 
 }
 
 
-int PgDatabase::FieldNum(const char* field_name)
+int PgDatabase::FieldNum(const char* field_name) const
 { 
 return PQfnumber(pgResult, field_name); 
 }
 
 
-Oid PgDatabase::FieldType(int field_num)
+Oid PgDatabase::FieldType(int field_num) const
 { 
 return PQftype(pgResult, field_num); 
 }
 
 
-Oid PgDatabase::FieldType(const char* field_name)
+Oid PgDatabase::FieldType(const char* field_name) const
 { 
 return PQftype(pgResult, FieldNum(field_name)); 
 }
 
 
-short PgDatabase::FieldSize(int field_num)
+short PgDatabase::FieldSize(int field_num) const
 { 
 return PQfsize(pgResult, field_num); 
 }
 
 
-short PgDatabase::FieldSize(const char* field_name)
+short PgDatabase::FieldSize(const char* field_name) const
 { 
 return PQfsize(pgResult, FieldNum(field_name)); 
 }
 
 
-const char* PgDatabase::GetValue(int tup_num, int field_num)
+const char* PgDatabase::GetValue(int tup_num, int field_num) const
 { 
 return PQgetvalue(pgResult, tup_num, field_num); 
 }
 
 
-const char* PgDatabase::GetValue(int tup_num, const char* field_name)
+const char* PgDatabase::GetValue(int tup_num, const char* field_name) const
 { 
 return PQgetvalue(pgResult, tup_num, FieldNum(field_name)); 
 }
 
 
-int PgDatabase::GetIsNull(int tup_num, int field_num)
+bool PgDatabase::GetIsNull(int tup_num, int field_num) const
 { 
 return PQgetisnull(pgResult, tup_num, field_num); 
 }
 
 
-int PgDatabase::GetIsNull(int tup_num, const char* field_name)
+bool PgDatabase::GetIsNull(int tup_num, const char* field_name) const
 { 
 return PQgetisnull(pgResult, tup_num, FieldNum(field_name)); 
 }
 
 
-int PgDatabase::GetLength(int tup_num, int field_num)
+int PgDatabase::GetLength(int tup_num, int field_num) const
 { 
 return PQgetlength(pgResult, tup_num, field_num); 
 }
 
 
-int PgDatabase::GetLength(int tup_num, const char* field_name)
+int PgDatabase::GetLength(int tup_num, const char* field_name) const
 { 
 return PQgetlength(pgResult, tup_num, FieldNum(field_name)); 
 }
 
 
-int PgDatabase::GetLine(char* string, int length)
+int PgDatabase::GetLine(char str[], int length)
 { 
-return PQgetline(pgConn, string, length); 
+return PQgetline(pgConn, str, length); 
 }
 
 
-void PgDatabase::PutLine(const char* string)
+void PgDatabase::PutLine(const char str[])
 { 
-PQputline(pgConn, string); 
+PQputline(pgConn, str); 
 }
 
 
-const char* PgDatabase::OidStatus()
+const char* PgDatabase::OidStatus() const
 { 
 return PQoidStatus(pgResult); 
 }
index 76ed2159300e4d354d1935b10cc23e10668a0268..3815a8641e7928a36d8202a6a6f515a341cd3e66 100644 (file)
@@ -14,7 +14,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  *
- *  $Id: pgdatabase.h,v 1.9 2001/01/24 19:43:32 momjian Exp $
+ *  $Id: pgdatabase.h,v 1.10 2001/05/09 17:29:10 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
 class PgDatabase : public PgConnection {
 public:
   // connect to the database with conninfo
-  PgDatabase(const char* conninfo) : PgConnection(conninfo) {}
+  explicit PgDatabase(const char* conninfo) : PgConnection(conninfo) {}
 
   ~PgDatabase() {}                             // close connection and clean up
+
+  typedef int size_type;
   
   // query result access
-  int Tuples();
-  int CmdTuples()
+  size_type Tuples() const;
+  size_type CmdTuples() const
   int Fields();
-  const char* FieldName(int field_num);
-  int FieldNum(const char* field_name);
-  Oid FieldType(int field_num);
-  Oid FieldType(const char* field_name);
-  short FieldSize(int field_num);
-  short FieldSize(const char* field_name);
-  const char* GetValue(int tup_num, int field_num);
-  const char* GetValue(int tup_num, const char* field_name);
-  int GetIsNull(int tup_num, int field_num);
-  int GetIsNull(int tup_num, const char* field_name);
-  int GetLength(int tup_num, int field_num);
-  int GetLength(int tup_num, const char* field_name);
-  void DisplayTuples(FILE *out = 0, int fillAlign = 1, 
-       const char* fieldSep = "|",int printHeader = 1, int quiet = 0) ;
-  void PrintTuples(FILE *out = 0, int printAttName = 1, 
-       int terseOutput = 0, int width = 0) ;
+  const char* FieldName(int field_num) const;
+  int FieldNum(const char* field_name) const;
+  Oid FieldType(int field_num) const;
+  Oid FieldType(const char* field_name) const;
+  short FieldSize(int field_num) const;
+  short FieldSize(const char* field_name) const;
+  const char* GetValue(size_type tup_num, int field_num) const;
+  const char* GetValue(size_type tup_num, const char* field_name) const;
+  bool GetIsNull(size_type tup_num, int field_num) const;
+  bool GetIsNull(size_type tup_num, const char* field_name) const;
+  int GetLength(size_type tup_num, int field_num) const;
+  int GetLength(size_type tup_num, const char* field_name) const;
+
+  // OBSOLESCENT (use PQprint()):
+  void DisplayTuples(FILE *out=0, bool fillAlign=true, 
+       const char* fieldSep="|", bool printHeader=true, bool quiet=false) const;
+  void PrintTuples(FILE *out=0, bool printAttName=true, 
+       bool terseOutput=false, bool fillAlign=false) const;
 
   // copy command related access
-  int GetLine(char* string, int length);
-  void PutLine(const char* string);
-  const char* OidStatus();
+  int GetLine(char str[], int length);
+  void PutLine(const char str[]);
+  const char* OidStatus() const;
   int EndCopy();
     
 protected:
index 5eee2436869c5f850cf0924768776a41799892ba..0523ec8f91a08a16c206cd98ee667c90ca91b50a 100644 (file)
@@ -10,7 +10,7 @@
  * Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/interfaces/libpq++/Attic/pglobject.cc,v 1.6 2000/04/22 22:39:15 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/interfaces/libpq++/Attic/pglobject.cc,v 1.7 2001/05/09 17:29:10 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -21,6 +21,10 @@ extern "C" {
 #include "libpq/libpq-fs.h"
 }
 
+
+using namespace std;
+
+
 // ****************************************************************
 //
 // PgLargeObject Implementation
@@ -142,7 +146,7 @@ int PgLargeObject::LSeek(int offset, int whence)
 }
 
 
-int PgLargeObject::Tell()
+int PgLargeObject::Tell() const
 { 
   return lo_tell(pgConn, pgFd); 
 }
@@ -160,7 +164,7 @@ int PgLargeObject::Export(const char* filename)
 }
 
 
-string PgLargeObject::Status() 
+string PgLargeObject::Status() const
 { 
   return loStatus; 
 }
index 3e3664a1dde9b31759dedf672ffdf15975160b30..493182e97b7b8e548d304b28147b7c62f17817cd 100644 (file)
@@ -11,7 +11,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  *
- *  $Id: pglobject.h,v 1.6 2001/01/24 19:43:32 momjian Exp $
+ *  $Id: pglobject.h,v 1.7 2001/05/09 17:29:10 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
 #include "pgconnection.h"
 #endif
 
+#ifdef HAVE_NAMESPACE_STD
+#define PGSTD std::
+#else
+#define PGSTD
+#endif
+
 
 // ****************************************************************
 //
@@ -33,12 +39,12 @@ class PgLargeObject : public PgConnection {
 private:
   int pgFd;
   Oid pgObject;
-  string loStatus;
+  PGSTD string loStatus;
   void Init(Oid lobjId = 0);
 
 public:
-  PgLargeObject(const char* conninfo = 0);   // use reasonable defaults and create large object
-  PgLargeObject(Oid lobjId, const char* conninfo = 0); // use reasonable defaults and open large object
+  explicit PgLargeObject(const char* conninfo = 0);   // use reasonable defaults and create large object
+  explicit PgLargeObject(Oid lobjId, const char* conninfo = 0); // use reasonable defaults and open large object
   ~PgLargeObject(); // close connection and clean up
   
   void Create();
@@ -47,12 +53,12 @@ public:
   int Read(char* buf, int len);
   int Write(const char* buf, int len);
   int LSeek(int offset, int whence);
-  int Tell();
+  int Tell() const;
   int Unlink();
   Oid LOid();
   Oid Import(const char* filename);
   int Export(const char* filename); 
-  string Status();
+  PGSTD string Status() const;
 
 private:
 // We don't support copying of PgLargeObject objects,
@@ -61,4 +67,10 @@ private:
    PgLargeObject& operator= (const PgLargeObject&);
 };
 
+
+#ifdef HAVE_NAMESPACE_STD
+#undef PGSTD
+#endif
+
+
 #endif // PGLOBJECT_H
index 61549d01243fb7eb71e0a9075efe04c953315f38..dd7195e1bf937c1943af6648ccfc5bac198041dd 100644 (file)
@@ -10,7 +10,7 @@
  * Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/interfaces/libpq++/Attic/pgtransdb.cc,v 1.3 1999/05/30 15:17:58 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/interfaces/libpq++/Attic/pgtransdb.cc,v 1.4 2001/05/09 17:29:10 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -25,7 +25,8 @@
 // Make a connection to the specified database with default environment
 // See PQconnectdb() for conninfo usage. 
 PgTransaction::PgTransaction(const char* conninfo)
-   : PgDatabase(conninfo)
+   : PgDatabase(conninfo),
+     pgCommitted(true)
 {
        BeginTransaction();
 }
@@ -33,17 +34,20 @@ PgTransaction::PgTransaction(const char* conninfo)
 // Destructor: End the transaction block
 PgTransaction::~PgTransaction()
 {
-       EndTransaction();
+       if (!pgCommitted) Exec("ABORT");
 }
 
 // Begin the transaction block
 ExecStatusType PgTransaction::BeginTransaction()
 {
+       pgCommitted = false;
        return Exec("BEGIN");
 } // End BeginTransaction()
 
 // Begin the transaction block
 ExecStatusType PgTransaction::EndTransaction()
 {
+       pgCommitted = true;
        return Exec("END");
 } // End EndTransaction()
+
index d8e616772f1c7b91dab12087c7400ebaa856f331..b0f645fd02a3e86dd06d3f0704b212aead04b35b 100644 (file)
@@ -14,7 +14,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  *
- *  $Id: pgtransdb.h,v 1.6 2001/01/24 19:43:32 momjian Exp $
+ *  $Id: pgtransdb.h,v 1.7 2001/05/09 17:29:10 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -36,9 +36,9 @@
 // the object is destroyed.
 class PgTransaction : public PgDatabase {
 public:
-  PgTransaction(const char* conninfo); // use reasonable & environment defaults
+  explicit PgTransaction(const char* conninfo);        // use reasonable & environment defaults
   // connect to the database with given environment and database name
-  // PgTransaction(const PgConnection&);
+  // explicit PgTransaction(const PgConnection&);
   ~PgTransaction();    // close connection and clean up
   
 protected:
@@ -46,9 +46,11 @@ protected:
   ExecStatusType EndTransaction();
   
 protected:
-  PgTransaction() : PgDatabase() {}    // Do not connect
+  PgTransaction() : PgDatabase(), pgCommitted(true) {} // Do not connect
 
 private:
+  bool pgCommitted;
+
 // We don't support copying of PgTransaction objects,
 // so make copy constructor and assignment op private.
    PgTransaction(const PgTransaction&);