ROOT logo
// @(#)root/pgsql:$Id$
// Author: g.p.ciceri <gp.ciceri@acm.org> 01/06/2001

/*************************************************************************
 * Copyright (C) 1995-2001, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#include "TPgSQLServer.h"
#include "TPgSQLResult.h"
#include "TPgSQLStatement.h"

#include "TSQLColumnInfo.h"
#include "TSQLTableInfo.h"
#include "TSQLRow.h"
#include "TUrl.h"
#include "TList.h"

ClassImp(TPgSQLServer)

//______________________________________________________________________________
TPgSQLServer::TPgSQLServer(const char *db, const char *uid, const char *pw)
{
   // Open a connection to a PgSQL DB server. The db arguments should be
   // of the form "pgsql://<host>[:<port>][/<database>]", e.g.:
   // "pgsql://pcroot.cern.ch:3456/test". The uid is the username and pw
   // the password that should be used for the connection.

   fPgSQL = 0;
   fSrvInfo="";

   TUrl url(db);

   if (!url.IsValid()) {
      Error("TPgSQLServer", "malformed db argument %s", db);
      MakeZombie();
      return;
   }

   if (strncmp(url.GetProtocol(), "pgsql", 5)) {
      Error("TPgSQLServer", "protocol in db argument should be pgsql it is %s",
            url.GetProtocol());
      MakeZombie();
      return;
   }

   const char *dbase = url.GetFile();

   if (url.GetPort()) {
      TString port;
      port += url.GetPort();
      fPgSQL = PQsetdbLogin(url.GetHost(), port, 0, 0, dbase, uid, pw);
   } else {
      fPgSQL = PQsetdbLogin(url.GetHost(), 0, 0, 0, dbase, uid, pw);
   }

   if (PQstatus(fPgSQL) != CONNECTION_BAD) {
      fType = "PgSQL";
      fHost = url.GetHost();
      fDB   = dbase;
      fPort = url.GetPort();

      // Populate server-info
      fSrvInfo = "postgres ";
      static const char *sql = "select setting from pg_settings where name='server_version'";
      PGresult *res = PQexec(fPgSQL, sql);
      int stat = PQresultStatus(res);
      if (stat == PGRES_TUPLES_OK && PQntuples(res)) {
         char *vers = PQgetvalue(res,0,0);
         fSrvInfo += vers;
         PQclear(res);
      } else {
         fSrvInfo += "unknown version number";
      }
   } else {
      Error("TPgSQLServer", "connection to %s failed", url.GetHost());
      MakeZombie();
   }
}

//______________________________________________________________________________
TPgSQLServer::~TPgSQLServer()
{
   // Close connection to PgSQL DB server.

   if (IsConnected())
      Close();
}

//______________________________________________________________________________
void TPgSQLServer::Close(Option_t *)
{
   // Close connection to PgSQL DB server.

   if (!fPgSQL)
      return;

   PQfinish(fPgSQL);
   fPort = -1;
}

//______________________________________________________________________________
TSQLResult *TPgSQLServer::Query(const char *sql)
{
   // Execute SQL command. Result object must be deleted by the user.
   // Returns a pointer to a TSQLResult object if successful, 0 otherwise.
   // The result object must be deleted by the user.

   if (!IsConnected()) {
      Error("Query", "not connected");
      return 0;
   }

   PGresult *res = PQexec(fPgSQL, sql);
   //cout << " Query called " << sql << ":" << PQntuples(res) << endl;

   if ((PQresultStatus(res) != PGRES_COMMAND_OK) &&
       (PQresultStatus(res) != PGRES_TUPLES_OK)) {
      Error("Query", "%s",PQresultErrorMessage(res));
      PQclear(res);
      return 0;
   }

   return new TPgSQLResult(res);
}

//______________________________________________________________________________
Int_t TPgSQLServer::SelectDataBase(const char *dbname)
{
   // Select a database. Returns 0 if successful, non-zero otherwise.

   TString usr;
   TString pwd;
   TString port;
   TString opts;

   if (!IsConnected()) {
      Error("SelectDataBase", "not connected");
      return -1;
   }

   if (dbname == fDB) {
      return 0;
   } else {
      usr = PQuser(fPgSQL);
      pwd = PQpass(fPgSQL);
      port = PQport(fPgSQL);
      opts = PQoptions(fPgSQL);

      Close();
      fPgSQL = PQsetdbLogin(fHost.Data(), port.Data(),
                            opts.Data(), 0, dbname,
                            usr.Data(), pwd.Data());

      if (PQstatus(fPgSQL) == CONNECTION_OK) {
         fDB=dbname;
         fPort=port.Atoi();
      } else {
         Error("SelectDataBase", "%s",PQerrorMessage(fPgSQL));
         return -1;
      }
   }
   return 0;
}

//______________________________________________________________________________
TSQLResult *TPgSQLServer::GetDataBases(const char *wild)
{
   // List all available databases. Wild is for wildcarding "t%" list all
   // databases starting with "t".
   // Returns a pointer to a TSQLResult object if successful, 0 otherwise.
   // The result object must be deleted by the user.

   if (!IsConnected()) {
      Error("GetDataBases", "not connected");
      return 0;
   }

   TString sql = "SELECT pg_database.datname FROM pg_database";
   if (wild)
      sql += Form(" WHERE pg_database.datname LIKE '%s'", wild);

   return Query(sql);
}

//______________________________________________________________________________
TSQLResult *TPgSQLServer::GetTables(const char *dbname, const char *wild)
{
   // List all tables in the specified database. Wild is for wildcarding
   // "t%" list all tables starting with "t".
   // Returns a pointer to a TSQLResult object if successful, 0 otherwise.
   // The result object must be deleted by the user.

   if (!IsConnected()) {
      Error("GetTables", "not connected");
      return 0;
   }

   if (SelectDataBase(dbname) != 0) {
      Error("GetTables", "no such database %s", dbname);
      return 0;
   }

   TString sql = "SELECT relname FROM pg_class where relkind='r'";
   if (wild)
      sql += Form(" AND relname LIKE '%s'", wild);

   return Query(sql);
}

//______________________________________________________________________________
TSQLResult *TPgSQLServer::GetColumns(const char *dbname, const char *table,
                                     const char *wild)
{
   // List all columns in specified table in the specified database.
   // Wild is for wildcarding "t%" list all columns starting with "t".
   // Returns a pointer to a TSQLResult object if successful, 0 otherwise.
   // The result object must be deleted by the user.

   if (!IsConnected()) {
      Error("GetColumns", "not connected");
      return 0;
   }

   if (SelectDataBase(dbname) != 0) {
      Error("GetColumns", "no such database %s", dbname);
      return 0;
   }

   char *sql;
   if (wild)
      sql = Form("select a.attname,t.typname,a.attnotnull \
                  from pg_attribute a, pg_class c, pg_type t \
                  where c.oid=a.attrelid and c.relname='%s' and \
                  a.atttypid=t.oid and a.attnum>0 \
                  and a.attname like '%s' order by a.attnum ", table,wild);
   else
      sql = Form("select a.attname,t.typname,a.attnotnull \
                  from pg_attribute a, pg_class c, pg_type t \
                  where c.oid=a.attrelid and c.relname='%s' and \
                  a.atttypid=t.oid and a.attnum>0 order by a.attnum",table);

   return Query(sql);
}

//______________________________________________________________________________
Int_t TPgSQLServer::CreateDataBase(const char *dbname)
{
   // Create a database. Returns 0 if successful, non-zero otherwise.

   if (!IsConnected()) {
      Error("CreateDataBase", "not connected");
      return -1;
   }
   char *sql;
   sql = Form("CREATE DATABASE %s", dbname);
   PGresult *res = PQexec(fPgSQL, sql);
   PQclear(res);
   return 0;
}

//______________________________________________________________________________
Int_t TPgSQLServer::DropDataBase(const char *dbname)
{
   // Drop (i.e. delete) a database. Returns 0 if successful, non-zero
   // otherwise.

   if (!IsConnected()) {
      Error("DropDataBase", "not connected");
      return -1;
   }
   char *sql;
   sql = Form("DROP DATABASE %s", dbname);
   PGresult *res = PQexec(fPgSQL, sql);
   PQclear(res);
   return 0;
}

//______________________________________________________________________________
Int_t TPgSQLServer::Reload()
{
   // Reload permission tables. Returns 0 if successful, non-zero
   // otherwise. User must have reload permissions.

   if (!IsConnected()) {
      Error("Reload", "not connected");
      return -1;
   }

   Error("Reload", "not implemented");
   return 0;
}

//______________________________________________________________________________
Int_t TPgSQLServer::Shutdown()
{
   // Shutdown the database server. Returns 0 if successful, non-zero
   // otherwise. User must have shutdown permissions.

   if (!IsConnected()) {
      Error("Shutdown", "not connected");
      return -1;
   }

   Error("Shutdown", "not implemented");
   return 0;
}

//______________________________________________________________________________
const char *TPgSQLServer::ServerInfo()
{
   // Return server info.

   if (!IsConnected()) {
      Error("ServerInfo", "not connected");
      return 0;
   }

   return fSrvInfo.Data();
}

//______________________________________________________________________________
Bool_t TPgSQLServer::HasStatement() const
{
   // PG_VERSION_NUM conveniently only started being #defined at 8.2.3
   // which is the first version of libpq which explicitly supports prepared
   // statements

#ifdef PG_VERSION_NUM
   return kTRUE;
#else
   return kFALSE;
#endif
}

//______________________________________________________________________________
#ifdef PG_VERSION_NUM
TSQLStatement* TPgSQLServer::Statement(const char *sql, Int_t)
#else
TSQLStatement* TPgSQLServer::Statement(const char *, Int_t)
#endif
{
  // Produce TPgSQLStatement.

#ifdef PG_VERSION_NUM
   if (!sql || !*sql) {
      SetError(-1, "no query string specified","Statement");
      return 0;
   }

   PgSQL_Stmt_t *stmt = new PgSQL_Stmt_t;
   if (!stmt){
      SetError(-1, "cannot allocate PgSQL_Stmt_t", "Statement");
      return 0;
   }
   stmt->fConn = fPgSQL;
   stmt->fRes  = PQprepare(fPgSQL, "preparedstmt", sql, 0, (const Oid*)0);

   ExecStatusType stat = PQresultStatus(stmt->fRes);
   if (pgsql_success(stat)) {
      fErrorOut = stat;
      return new TPgSQLStatement(stmt, fErrorOut);
   } else {
      SetError(stat, PQresultErrorMessage(stmt->fRes), "Statement");
      stmt->fConn = 0;
      delete stmt;
      return 0;
   }
#else
   Error("Statement", "not implemented for pgsql < 8.2");
#endif
   return 0;
}

//______________________________________________________________________________
TSQLTableInfo *TPgSQLServer::GetTableInfo(const char* tablename)
{
   // Produce TSQLTableInfo. 

   if (!IsConnected()) {
      Error("GetColumns", "not connected");
      return NULL;
   }

   // Check table name
   if ((tablename==0) || (*tablename==0)) return 0;
      // Query first row ( works same way as MySQL) 
      PGresult *res = PQexec(fPgSQL, TString::Format("SELECT * FROM %s LIMIT 1;", tablename));
  
   if ((PQresultStatus(res) != PGRES_COMMAND_OK) &&
       (PQresultStatus(res) != PGRES_TUPLES_OK)) {
      Error("Query", "%s",PQresultErrorMessage(res));
      PQclear(res);
      return 0;
   }

   if (fOidTypNameMap.empty()) {
      // Oid-TypNameMap empty, populate it, stays valid at least for connection 
      // lifetime. 
      PGresult *res_type = PQexec(fPgSQL, "SELECT OID, TYPNAME FROM PG_TYPE;");

      if ((PQresultStatus(res_type) != PGRES_COMMAND_OK) &&
          (PQresultStatus(res_type) != PGRES_TUPLES_OK)) {
         Error("Query", "%s", PQresultErrorMessage(res_type));
         PQclear(res);
         PQclear(res_type);
         return 0;
      }

      Int_t nOids = PQntuples(res_type);
      for (Int_t oid=0; oid<nOids; oid++) {
         Int_t tOid;
         char* oidString  = PQgetvalue(res_type, oid, 0);
         char* typeString = PQgetvalue(res_type, oid, 1);
         if (sscanf(oidString, "%10d", &tOid) != 1) {
            Error("GetTableInfo", "Bad non-numeric oid '%s' for type '%s'", oidString, typeString);
         }
         fOidTypNameMap[tOid]=std::string(typeString);
      }
      PQclear(res_type);
   }

   TList * lst = NULL;

   Int_t nfields  = PQnfields(res);

   for (Int_t col=0;col<nfields;col++){
      Int_t sqltype = kSQL_NONE;
      Int_t data_size = -1;    // size in bytes
      Int_t data_length = -1;  // declaration like VARCHAR(n) or NUMERIC(n)
      Int_t data_scale = -1;   // second argument in declaration
      Int_t data_sign = -1;    // signed type or not
      Bool_t nullable = 0;

      const char* column_name = PQfname(res,col);
      const char* type_name;
      int   imod     = PQfmod(res,col);
      //int   isize    = PQfsize(res,col);

      int oid_code = PQftype(res,col);

      // Search for oid in map
      std::map<Int_t,std::string>::iterator lookupOid = fOidTypNameMap.find(oid_code);
      if (lookupOid == fOidTypNameMap.end()) {
         // Not found. 
         //default
         sqltype = kSQL_NUMERIC;
         type_name = "NUMERIC";
         data_size=-1;
      } else if (lookupOid->second == "int2"){
         sqltype = kSQL_INTEGER;
         type_name = "INT";
         data_size=2;
      } else if (lookupOid->second == "int4"){
         sqltype = kSQL_INTEGER;
         type_name = "INT";
         data_size=4;
      } else if (lookupOid->second == "int8"){
         sqltype = kSQL_INTEGER;
         type_name = "INT";
         data_size=8;
      } else if (lookupOid->second == "float4"){
         sqltype = kSQL_FLOAT;
         type_name = "FLOAT";
         data_size=4;
      } else if (lookupOid->second == "float8"){
         sqltype = kSQL_DOUBLE;
         type_name = "DOUBLE";
         data_size=8;
      } else if (lookupOid->second == "bool"){
         sqltype = kSQL_INTEGER;
         type_name = "INT";
         data_size=1;
      } else if (lookupOid->second == "char"){
         sqltype = kSQL_CHAR;
         type_name = "CHAR";
         data_size=1;
      } else if (lookupOid->second == "varchar"){
         sqltype = kSQL_VARCHAR;
         type_name = "VARCHAR";
         data_size=imod;
      } else if (lookupOid->second == "text"){
         sqltype = kSQL_VARCHAR;
         type_name = "VARCHAR";
         data_size=imod;
      } else if (lookupOid->second == "name"){
         sqltype = kSQL_VARCHAR;
         type_name = "VARCHAR";
         data_size=imod;
      } else if (lookupOid->second == "date"){
         sqltype = kSQL_TIMESTAMP;
         type_name = "TIMESTAMP";
         data_size=8;
      } else if (lookupOid->second == "time"){
         sqltype = kSQL_TIMESTAMP;
         type_name = "TIMESTAMP";
         data_size=8;
      } else if (lookupOid->second == "timetz"){
         sqltype = kSQL_TIMESTAMP;
         type_name = "TIMESTAMP";
         data_size=8;
      } else if (lookupOid->second == "timestamp"){
         sqltype = kSQL_TIMESTAMP;
         type_name = "TIMESTAMP";
         data_size=8;
      } else if (lookupOid->second == "timestamptz"){
         sqltype = kSQL_TIMESTAMP;
         type_name = "TIMESTAMP";
         data_size=8;
      } else if (lookupOid->second == "interval"){
         sqltype = kSQL_TIMESTAMP;
         type_name = "TIMESTAMP";
         data_size=8;
      } else if (lookupOid->second == "bytea"){
         sqltype = kSQL_BINARY;
         type_name = "BINARY";
         data_size=-1;
      } else if (lookupOid->second == ""){
         sqltype = kSQL_NONE;
         type_name = "UNKNOWN";
         data_size=-1;
      } else{
         //default
         sqltype = kSQL_NUMERIC;
         type_name = "NUMERIC";
         data_size=-1;
      }

      if (!lst) {
         lst = new TList;
      }

      lst->Add(new TSQLColumnInfo(column_name,
                                  type_name,
                                  nullable,
                                  sqltype,
                                  data_size,
                                  data_length,
                                  data_scale,
                                  data_sign));
   } //! ( cols)

   PQclear(res);
   return (new TSQLTableInfo(tablename,lst));
}
 TPgSQLServer.cxx:1
 TPgSQLServer.cxx:2
 TPgSQLServer.cxx:3
 TPgSQLServer.cxx:4
 TPgSQLServer.cxx:5
 TPgSQLServer.cxx:6
 TPgSQLServer.cxx:7
 TPgSQLServer.cxx:8
 TPgSQLServer.cxx:9
 TPgSQLServer.cxx:10
 TPgSQLServer.cxx:11
 TPgSQLServer.cxx:12
 TPgSQLServer.cxx:13
 TPgSQLServer.cxx:14
 TPgSQLServer.cxx:15
 TPgSQLServer.cxx:16
 TPgSQLServer.cxx:17
 TPgSQLServer.cxx:18
 TPgSQLServer.cxx:19
 TPgSQLServer.cxx:20
 TPgSQLServer.cxx:21
 TPgSQLServer.cxx:22
 TPgSQLServer.cxx:23
 TPgSQLServer.cxx:24
 TPgSQLServer.cxx:25
 TPgSQLServer.cxx:26
 TPgSQLServer.cxx:27
 TPgSQLServer.cxx:28
 TPgSQLServer.cxx:29
 TPgSQLServer.cxx:30
 TPgSQLServer.cxx:31
 TPgSQLServer.cxx:32
 TPgSQLServer.cxx:33
 TPgSQLServer.cxx:34
 TPgSQLServer.cxx:35
 TPgSQLServer.cxx:36
 TPgSQLServer.cxx:37
 TPgSQLServer.cxx:38
 TPgSQLServer.cxx:39
 TPgSQLServer.cxx:40
 TPgSQLServer.cxx:41
 TPgSQLServer.cxx:42
 TPgSQLServer.cxx:43
 TPgSQLServer.cxx:44
 TPgSQLServer.cxx:45
 TPgSQLServer.cxx:46
 TPgSQLServer.cxx:47
 TPgSQLServer.cxx:48
 TPgSQLServer.cxx:49
 TPgSQLServer.cxx:50
 TPgSQLServer.cxx:51
 TPgSQLServer.cxx:52
 TPgSQLServer.cxx:53
 TPgSQLServer.cxx:54
 TPgSQLServer.cxx:55
 TPgSQLServer.cxx:56
 TPgSQLServer.cxx:57
 TPgSQLServer.cxx:58
 TPgSQLServer.cxx:59
 TPgSQLServer.cxx:60
 TPgSQLServer.cxx:61
 TPgSQLServer.cxx:62
 TPgSQLServer.cxx:63
 TPgSQLServer.cxx:64
 TPgSQLServer.cxx:65
 TPgSQLServer.cxx:66
 TPgSQLServer.cxx:67
 TPgSQLServer.cxx:68
 TPgSQLServer.cxx:69
 TPgSQLServer.cxx:70
 TPgSQLServer.cxx:71
 TPgSQLServer.cxx:72
 TPgSQLServer.cxx:73
 TPgSQLServer.cxx:74
 TPgSQLServer.cxx:75
 TPgSQLServer.cxx:76
 TPgSQLServer.cxx:77
 TPgSQLServer.cxx:78
 TPgSQLServer.cxx:79
 TPgSQLServer.cxx:80
 TPgSQLServer.cxx:81
 TPgSQLServer.cxx:82
 TPgSQLServer.cxx:83
 TPgSQLServer.cxx:84
 TPgSQLServer.cxx:85
 TPgSQLServer.cxx:86
 TPgSQLServer.cxx:87
 TPgSQLServer.cxx:88
 TPgSQLServer.cxx:89
 TPgSQLServer.cxx:90
 TPgSQLServer.cxx:91
 TPgSQLServer.cxx:92
 TPgSQLServer.cxx:93
 TPgSQLServer.cxx:94
 TPgSQLServer.cxx:95
 TPgSQLServer.cxx:96
 TPgSQLServer.cxx:97
 TPgSQLServer.cxx:98
 TPgSQLServer.cxx:99
 TPgSQLServer.cxx:100
 TPgSQLServer.cxx:101
 TPgSQLServer.cxx:102
 TPgSQLServer.cxx:103
 TPgSQLServer.cxx:104
 TPgSQLServer.cxx:105
 TPgSQLServer.cxx:106
 TPgSQLServer.cxx:107
 TPgSQLServer.cxx:108
 TPgSQLServer.cxx:109
 TPgSQLServer.cxx:110
 TPgSQLServer.cxx:111
 TPgSQLServer.cxx:112
 TPgSQLServer.cxx:113
 TPgSQLServer.cxx:114
 TPgSQLServer.cxx:115
 TPgSQLServer.cxx:116
 TPgSQLServer.cxx:117
 TPgSQLServer.cxx:118
 TPgSQLServer.cxx:119
 TPgSQLServer.cxx:120
 TPgSQLServer.cxx:121
 TPgSQLServer.cxx:122
 TPgSQLServer.cxx:123
 TPgSQLServer.cxx:124
 TPgSQLServer.cxx:125
 TPgSQLServer.cxx:126
 TPgSQLServer.cxx:127
 TPgSQLServer.cxx:128
 TPgSQLServer.cxx:129
 TPgSQLServer.cxx:130
 TPgSQLServer.cxx:131
 TPgSQLServer.cxx:132
 TPgSQLServer.cxx:133
 TPgSQLServer.cxx:134
 TPgSQLServer.cxx:135
 TPgSQLServer.cxx:136
 TPgSQLServer.cxx:137
 TPgSQLServer.cxx:138
 TPgSQLServer.cxx:139
 TPgSQLServer.cxx:140
 TPgSQLServer.cxx:141
 TPgSQLServer.cxx:142
 TPgSQLServer.cxx:143
 TPgSQLServer.cxx:144
 TPgSQLServer.cxx:145
 TPgSQLServer.cxx:146
 TPgSQLServer.cxx:147
 TPgSQLServer.cxx:148
 TPgSQLServer.cxx:149
 TPgSQLServer.cxx:150
 TPgSQLServer.cxx:151
 TPgSQLServer.cxx:152
 TPgSQLServer.cxx:153
 TPgSQLServer.cxx:154
 TPgSQLServer.cxx:155
 TPgSQLServer.cxx:156
 TPgSQLServer.cxx:157
 TPgSQLServer.cxx:158
 TPgSQLServer.cxx:159
 TPgSQLServer.cxx:160
 TPgSQLServer.cxx:161
 TPgSQLServer.cxx:162
 TPgSQLServer.cxx:163
 TPgSQLServer.cxx:164
 TPgSQLServer.cxx:165
 TPgSQLServer.cxx:166
 TPgSQLServer.cxx:167
 TPgSQLServer.cxx:168
 TPgSQLServer.cxx:169
 TPgSQLServer.cxx:170
 TPgSQLServer.cxx:171
 TPgSQLServer.cxx:172
 TPgSQLServer.cxx:173
 TPgSQLServer.cxx:174
 TPgSQLServer.cxx:175
 TPgSQLServer.cxx:176
 TPgSQLServer.cxx:177
 TPgSQLServer.cxx:178
 TPgSQLServer.cxx:179
 TPgSQLServer.cxx:180
 TPgSQLServer.cxx:181
 TPgSQLServer.cxx:182
 TPgSQLServer.cxx:183
 TPgSQLServer.cxx:184
 TPgSQLServer.cxx:185
 TPgSQLServer.cxx:186
 TPgSQLServer.cxx:187
 TPgSQLServer.cxx:188
 TPgSQLServer.cxx:189
 TPgSQLServer.cxx:190
 TPgSQLServer.cxx:191
 TPgSQLServer.cxx:192
 TPgSQLServer.cxx:193
 TPgSQLServer.cxx:194
 TPgSQLServer.cxx:195
 TPgSQLServer.cxx:196
 TPgSQLServer.cxx:197
 TPgSQLServer.cxx:198
 TPgSQLServer.cxx:199
 TPgSQLServer.cxx:200
 TPgSQLServer.cxx:201
 TPgSQLServer.cxx:202
 TPgSQLServer.cxx:203
 TPgSQLServer.cxx:204
 TPgSQLServer.cxx:205
 TPgSQLServer.cxx:206
 TPgSQLServer.cxx:207
 TPgSQLServer.cxx:208
 TPgSQLServer.cxx:209
 TPgSQLServer.cxx:210
 TPgSQLServer.cxx:211
 TPgSQLServer.cxx:212
 TPgSQLServer.cxx:213
 TPgSQLServer.cxx:214
 TPgSQLServer.cxx:215
 TPgSQLServer.cxx:216
 TPgSQLServer.cxx:217
 TPgSQLServer.cxx:218
 TPgSQLServer.cxx:219
 TPgSQLServer.cxx:220
 TPgSQLServer.cxx:221
 TPgSQLServer.cxx:222
 TPgSQLServer.cxx:223
 TPgSQLServer.cxx:224
 TPgSQLServer.cxx:225
 TPgSQLServer.cxx:226
 TPgSQLServer.cxx:227
 TPgSQLServer.cxx:228
 TPgSQLServer.cxx:229
 TPgSQLServer.cxx:230
 TPgSQLServer.cxx:231
 TPgSQLServer.cxx:232
 TPgSQLServer.cxx:233
 TPgSQLServer.cxx:234
 TPgSQLServer.cxx:235
 TPgSQLServer.cxx:236
 TPgSQLServer.cxx:237
 TPgSQLServer.cxx:238
 TPgSQLServer.cxx:239
 TPgSQLServer.cxx:240
 TPgSQLServer.cxx:241
 TPgSQLServer.cxx:242
 TPgSQLServer.cxx:243
 TPgSQLServer.cxx:244
 TPgSQLServer.cxx:245
 TPgSQLServer.cxx:246
 TPgSQLServer.cxx:247
 TPgSQLServer.cxx:248
 TPgSQLServer.cxx:249
 TPgSQLServer.cxx:250
 TPgSQLServer.cxx:251
 TPgSQLServer.cxx:252
 TPgSQLServer.cxx:253
 TPgSQLServer.cxx:254
 TPgSQLServer.cxx:255
 TPgSQLServer.cxx:256
 TPgSQLServer.cxx:257
 TPgSQLServer.cxx:258
 TPgSQLServer.cxx:259
 TPgSQLServer.cxx:260
 TPgSQLServer.cxx:261
 TPgSQLServer.cxx:262
 TPgSQLServer.cxx:263
 TPgSQLServer.cxx:264
 TPgSQLServer.cxx:265
 TPgSQLServer.cxx:266
 TPgSQLServer.cxx:267
 TPgSQLServer.cxx:268
 TPgSQLServer.cxx:269
 TPgSQLServer.cxx:270
 TPgSQLServer.cxx:271
 TPgSQLServer.cxx:272
 TPgSQLServer.cxx:273
 TPgSQLServer.cxx:274
 TPgSQLServer.cxx:275
 TPgSQLServer.cxx:276
 TPgSQLServer.cxx:277
 TPgSQLServer.cxx:278
 TPgSQLServer.cxx:279
 TPgSQLServer.cxx:280
 TPgSQLServer.cxx:281
 TPgSQLServer.cxx:282
 TPgSQLServer.cxx:283
 TPgSQLServer.cxx:284
 TPgSQLServer.cxx:285
 TPgSQLServer.cxx:286
 TPgSQLServer.cxx:287
 TPgSQLServer.cxx:288
 TPgSQLServer.cxx:289
 TPgSQLServer.cxx:290
 TPgSQLServer.cxx:291
 TPgSQLServer.cxx:292
 TPgSQLServer.cxx:293
 TPgSQLServer.cxx:294
 TPgSQLServer.cxx:295
 TPgSQLServer.cxx:296
 TPgSQLServer.cxx:297
 TPgSQLServer.cxx:298
 TPgSQLServer.cxx:299
 TPgSQLServer.cxx:300
 TPgSQLServer.cxx:301
 TPgSQLServer.cxx:302
 TPgSQLServer.cxx:303
 TPgSQLServer.cxx:304
 TPgSQLServer.cxx:305
 TPgSQLServer.cxx:306
 TPgSQLServer.cxx:307
 TPgSQLServer.cxx:308
 TPgSQLServer.cxx:309
 TPgSQLServer.cxx:310
 TPgSQLServer.cxx:311
 TPgSQLServer.cxx:312
 TPgSQLServer.cxx:313
 TPgSQLServer.cxx:314
 TPgSQLServer.cxx:315
 TPgSQLServer.cxx:316
 TPgSQLServer.cxx:317
 TPgSQLServer.cxx:318
 TPgSQLServer.cxx:319
 TPgSQLServer.cxx:320
 TPgSQLServer.cxx:321
 TPgSQLServer.cxx:322
 TPgSQLServer.cxx:323
 TPgSQLServer.cxx:324
 TPgSQLServer.cxx:325
 TPgSQLServer.cxx:326
 TPgSQLServer.cxx:327
 TPgSQLServer.cxx:328
 TPgSQLServer.cxx:329
 TPgSQLServer.cxx:330
 TPgSQLServer.cxx:331
 TPgSQLServer.cxx:332
 TPgSQLServer.cxx:333
 TPgSQLServer.cxx:334
 TPgSQLServer.cxx:335
 TPgSQLServer.cxx:336
 TPgSQLServer.cxx:337
 TPgSQLServer.cxx:338
 TPgSQLServer.cxx:339
 TPgSQLServer.cxx:340
 TPgSQLServer.cxx:341
 TPgSQLServer.cxx:342
 TPgSQLServer.cxx:343
 TPgSQLServer.cxx:344
 TPgSQLServer.cxx:345
 TPgSQLServer.cxx:346
 TPgSQLServer.cxx:347
 TPgSQLServer.cxx:348
 TPgSQLServer.cxx:349
 TPgSQLServer.cxx:350
 TPgSQLServer.cxx:351
 TPgSQLServer.cxx:352
 TPgSQLServer.cxx:353
 TPgSQLServer.cxx:354
 TPgSQLServer.cxx:355
 TPgSQLServer.cxx:356
 TPgSQLServer.cxx:357
 TPgSQLServer.cxx:358
 TPgSQLServer.cxx:359
 TPgSQLServer.cxx:360
 TPgSQLServer.cxx:361
 TPgSQLServer.cxx:362
 TPgSQLServer.cxx:363
 TPgSQLServer.cxx:364
 TPgSQLServer.cxx:365
 TPgSQLServer.cxx:366
 TPgSQLServer.cxx:367
 TPgSQLServer.cxx:368
 TPgSQLServer.cxx:369
 TPgSQLServer.cxx:370
 TPgSQLServer.cxx:371
 TPgSQLServer.cxx:372
 TPgSQLServer.cxx:373
 TPgSQLServer.cxx:374
 TPgSQLServer.cxx:375
 TPgSQLServer.cxx:376
 TPgSQLServer.cxx:377
 TPgSQLServer.cxx:378
 TPgSQLServer.cxx:379
 TPgSQLServer.cxx:380
 TPgSQLServer.cxx:381
 TPgSQLServer.cxx:382
 TPgSQLServer.cxx:383
 TPgSQLServer.cxx:384
 TPgSQLServer.cxx:385
 TPgSQLServer.cxx:386
 TPgSQLServer.cxx:387
 TPgSQLServer.cxx:388
 TPgSQLServer.cxx:389
 TPgSQLServer.cxx:390
 TPgSQLServer.cxx:391
 TPgSQLServer.cxx:392
 TPgSQLServer.cxx:393
 TPgSQLServer.cxx:394
 TPgSQLServer.cxx:395
 TPgSQLServer.cxx:396
 TPgSQLServer.cxx:397
 TPgSQLServer.cxx:398
 TPgSQLServer.cxx:399
 TPgSQLServer.cxx:400
 TPgSQLServer.cxx:401
 TPgSQLServer.cxx:402
 TPgSQLServer.cxx:403
 TPgSQLServer.cxx:404
 TPgSQLServer.cxx:405
 TPgSQLServer.cxx:406
 TPgSQLServer.cxx:407
 TPgSQLServer.cxx:408
 TPgSQLServer.cxx:409
 TPgSQLServer.cxx:410
 TPgSQLServer.cxx:411
 TPgSQLServer.cxx:412
 TPgSQLServer.cxx:413
 TPgSQLServer.cxx:414
 TPgSQLServer.cxx:415
 TPgSQLServer.cxx:416
 TPgSQLServer.cxx:417
 TPgSQLServer.cxx:418
 TPgSQLServer.cxx:419
 TPgSQLServer.cxx:420
 TPgSQLServer.cxx:421
 TPgSQLServer.cxx:422
 TPgSQLServer.cxx:423
 TPgSQLServer.cxx:424
 TPgSQLServer.cxx:425
 TPgSQLServer.cxx:426
 TPgSQLServer.cxx:427
 TPgSQLServer.cxx:428
 TPgSQLServer.cxx:429
 TPgSQLServer.cxx:430
 TPgSQLServer.cxx:431
 TPgSQLServer.cxx:432
 TPgSQLServer.cxx:433
 TPgSQLServer.cxx:434
 TPgSQLServer.cxx:435
 TPgSQLServer.cxx:436
 TPgSQLServer.cxx:437
 TPgSQLServer.cxx:438
 TPgSQLServer.cxx:439
 TPgSQLServer.cxx:440
 TPgSQLServer.cxx:441
 TPgSQLServer.cxx:442
 TPgSQLServer.cxx:443
 TPgSQLServer.cxx:444
 TPgSQLServer.cxx:445
 TPgSQLServer.cxx:446
 TPgSQLServer.cxx:447
 TPgSQLServer.cxx:448
 TPgSQLServer.cxx:449
 TPgSQLServer.cxx:450
 TPgSQLServer.cxx:451
 TPgSQLServer.cxx:452
 TPgSQLServer.cxx:453
 TPgSQLServer.cxx:454
 TPgSQLServer.cxx:455
 TPgSQLServer.cxx:456
 TPgSQLServer.cxx:457
 TPgSQLServer.cxx:458
 TPgSQLServer.cxx:459
 TPgSQLServer.cxx:460
 TPgSQLServer.cxx:461
 TPgSQLServer.cxx:462
 TPgSQLServer.cxx:463
 TPgSQLServer.cxx:464
 TPgSQLServer.cxx:465
 TPgSQLServer.cxx:466
 TPgSQLServer.cxx:467
 TPgSQLServer.cxx:468
 TPgSQLServer.cxx:469
 TPgSQLServer.cxx:470
 TPgSQLServer.cxx:471
 TPgSQLServer.cxx:472
 TPgSQLServer.cxx:473
 TPgSQLServer.cxx:474
 TPgSQLServer.cxx:475
 TPgSQLServer.cxx:476
 TPgSQLServer.cxx:477
 TPgSQLServer.cxx:478
 TPgSQLServer.cxx:479
 TPgSQLServer.cxx:480
 TPgSQLServer.cxx:481
 TPgSQLServer.cxx:482
 TPgSQLServer.cxx:483
 TPgSQLServer.cxx:484
 TPgSQLServer.cxx:485
 TPgSQLServer.cxx:486
 TPgSQLServer.cxx:487
 TPgSQLServer.cxx:488
 TPgSQLServer.cxx:489
 TPgSQLServer.cxx:490
 TPgSQLServer.cxx:491
 TPgSQLServer.cxx:492
 TPgSQLServer.cxx:493
 TPgSQLServer.cxx:494
 TPgSQLServer.cxx:495
 TPgSQLServer.cxx:496
 TPgSQLServer.cxx:497
 TPgSQLServer.cxx:498
 TPgSQLServer.cxx:499
 TPgSQLServer.cxx:500
 TPgSQLServer.cxx:501
 TPgSQLServer.cxx:502
 TPgSQLServer.cxx:503
 TPgSQLServer.cxx:504
 TPgSQLServer.cxx:505
 TPgSQLServer.cxx:506
 TPgSQLServer.cxx:507
 TPgSQLServer.cxx:508
 TPgSQLServer.cxx:509
 TPgSQLServer.cxx:510
 TPgSQLServer.cxx:511
 TPgSQLServer.cxx:512
 TPgSQLServer.cxx:513
 TPgSQLServer.cxx:514
 TPgSQLServer.cxx:515
 TPgSQLServer.cxx:516
 TPgSQLServer.cxx:517
 TPgSQLServer.cxx:518
 TPgSQLServer.cxx:519
 TPgSQLServer.cxx:520
 TPgSQLServer.cxx:521
 TPgSQLServer.cxx:522
 TPgSQLServer.cxx:523
 TPgSQLServer.cxx:524
 TPgSQLServer.cxx:525
 TPgSQLServer.cxx:526
 TPgSQLServer.cxx:527
 TPgSQLServer.cxx:528
 TPgSQLServer.cxx:529
 TPgSQLServer.cxx:530
 TPgSQLServer.cxx:531
 TPgSQLServer.cxx:532
 TPgSQLServer.cxx:533
 TPgSQLServer.cxx:534
 TPgSQLServer.cxx:535
 TPgSQLServer.cxx:536
 TPgSQLServer.cxx:537
 TPgSQLServer.cxx:538
 TPgSQLServer.cxx:539
 TPgSQLServer.cxx:540
 TPgSQLServer.cxx:541
 TPgSQLServer.cxx:542
 TPgSQLServer.cxx:543
 TPgSQLServer.cxx:544
 TPgSQLServer.cxx:545
 TPgSQLServer.cxx:546
 TPgSQLServer.cxx:547
 TPgSQLServer.cxx:548