pg.ddx.io  pgsql-interfaces@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: J. T. Vermeulen <jtv@cistron-office.nl>
To: pgsql-interfaces@postgresql.org
Subject: Re: Suggested patches for libpq++/pgdatabase.*
Date: Mon, 26 Feb 2001 15:21:06 +0100
Message-ID: <20010226152106.C17746@cistron.nl> (raw)
In-Reply-To: <20010226143446.B17746@cistron.nl>
References: <20010226143446.B17746@cistron.nl>

On Mon, 26 Feb 2001, J. T. Vermeulen wrote:

> Suggest the following fixes for a future version.  These include some minor
> changes of interface (ints changed to bools) that should be compatible at the
> source level but incompatible at the linking level, so those may have to be
> skipped or deferred to some more convenient time.
> 
> Other changes: fixed possible portability problem for weird platforms (using 
> memset() to clear pointers); fixed minor memory leak in PrintTuples(), and
> marked PrintTuples() / DisplayTuples() as obsolescent; changed dubious 
> parameter names "string" to "str".

Oh, and made constructor 'explicit' for greater safety.

Here's an updated version of the same patch.  Added changes:
 - made lots of member functions 'const'
 - documented GetIsNull()
 - updated documentation for interface changes


Diffs follow:


inline patch 1: postgresql-7.0.3-jtv/src/interfaces/libpq++/pgdatabase.h (+24/-22 lines) download inline-1.patch--- postgresql-7.0.3/src/interfaces/libpq++/pgdatabase.h Sun Apr 23 00:39:15 2000 +++ postgresql-7.0.3-jtv/src/interfaces/libpq++/pgdatabase.h Mon Feb 26 15:06:59 2001 @@ -37,35 +37,37 @@ 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 // query result access - int Tuples(); - int CmdTuples(); + int Tuples() const; + int 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(int tup_num, int field_num) const; + const char* GetValue(int tup_num, const char* field_name) const; + bool GetIsNull(int tup_num, int field_num) const; + bool GetIsNull(int tup_num, const char* field_name) const; + int GetLength(int tup_num, int field_num) const; + int GetLength(int 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:
inline patch 2: postgresql-7.0.3-jtv/src/interfaces/libpq++/pgdatabase.cc (+42/-42 lines) download inline-2.patch--- postgresql-7.0.3/src/interfaces/libpq++/pgdatabase.cc Sat Jan 29 17:58:52 2000 +++ postgresql-7.0.3-jtv/src/interfaces/libpq++/pgdatabase.cc Mon Feb 26 15:09:59 2001 @@ -18,57 +18,57 @@ #include "pgdatabase.h" -void PgDatabase::DisplayTuples(FILE *out, int fillAlign, - const char* fieldSep, int printHeader, - int /* quiet */) +// 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; } @@ -78,91 +78,91 @@ } -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); }
inline patch 3: postgresql-7.0.3-jtv/doc/src/sgml/libpq++.sgml (+41/-19 lines) download inline-3.patch--- postgresql-7.0.3/doc/src/sgml/libpq++.sgml Tue May 2 22:01:51 2000 +++ postgresql-7.0.3-jtv/doc/src/sgml/libpq++.sgml Mon Feb 26 15:17:14 2001 @@ -354,7 +354,7 @@ <function>Tuples</function> Returns the number of tuples (instances) in the query result. <synopsis> - int PgDatabase::Tuples() + int PgDatabase::Tuples() const </synopsis> </para> </listitem> @@ -364,7 +364,7 @@ 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> @@ -383,7 +383,7 @@ 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> @@ -393,7 +393,7 @@ 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> @@ -405,7 +405,7 @@ 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> @@ -416,7 +416,7 @@ 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> @@ -426,7 +426,7 @@ 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 @@ -440,7 +440,7 @@ 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 @@ -454,7 +454,7 @@ 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() @@ -474,7 +474,7 @@ 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() @@ -490,11 +490,33 @@ </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>GetLength</function> 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 @@ -508,7 +530,7 @@ 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 @@ -522,8 +544,8 @@ 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> @@ -533,8 +555,8 @@ 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> @@ -558,7 +580,7 @@ <para> <function>OidStatus</function> <synopsis> - const char *PgDatabase::OidStatus() + const char *PgDatabase::OidStatus() const </synopsis> </para> </listitem> @@ -612,8 +634,8 @@ 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 is 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>,
Jeroen Patches: download all (3 files, .tar.gz)

view thread (2+ messages)

Message-ID: <20010226152106.C17746@cistron.nl>
Permalink:  ../20010226152106.C17746@cistron.nl/
Also on:    postgresql.org/message-id/20010226152106.C17746@cistron.nl

 ·  · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-interfaces@postgresql.org
  Cc: jtv@cistron-office.nl
  Subject: Re: Suggested patches for libpq++/pgdatabase.*
  In-Reply-To: <20010226152106.C17746@cistron.nl>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox