VTK
dox/IO/vtkPostgreSQLDatabase.h
Go to the documentation of this file.
00001 /* -*- Mode: C++; -*- */
00002 /*=========================================================================
00003 
00004   Program:   Visualization Toolkit
00005   Module:    vtkPostgreSQLDatabase.h
00006 
00007   Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
00008   All rights reserved.
00009   See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
00010 
00011      This software is distributed WITHOUT ANY WARRANTY; without even
00012      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
00013      PURPOSE.  See the above copyright notice for more information.
00014 
00015 =========================================================================*/
00016 /*-------------------------------------------------------------------------
00017   Copyright 2008 Sandia Corporation.
00018   Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
00019   the U.S. Government retains certain rights in this software.
00020 -------------------------------------------------------------------------*/
00048 #ifndef __vtkPostgreSQLDatabase_h
00049 #define __vtkPostgreSQLDatabase_h
00050 
00051 #include "vtkSQLDatabase.h"
00052 
00053 class vtkPostgreSQLQuery;
00054 class vtkStringArray;
00055 class vtkPostgreSQLDatabasePrivate;
00056 struct PQconn;
00057 
00058 class VTK_IO_EXPORT vtkPostgreSQLDatabase : public vtkSQLDatabase
00059 {
00060   //BTX
00061   friend class vtkPostgreSQLQuery;
00062   friend class vtkPostgreSQLQueryPrivate;
00063   //ETX
00064 
00065 public:
00066   vtkTypeMacro(vtkPostgreSQLDatabase, vtkSQLDatabase);
00067   void PrintSelf(ostream& os, vtkIndent indent);
00068   static vtkPostgreSQLDatabase *New();
00069 
00073   bool Open( const char* password = 0 );
00074 
00076   void Close();
00077 
00079   bool IsOpen();
00080 
00082   vtkSQLQuery* GetQueryInstance();
00083 
00085   virtual bool HasError();
00086 
00088   const char* GetLastErrorText();
00089 
00091 
00092   vtkGetStringMacro(DatabaseType);
00094 
00096 
00097   virtual void SetHostName( const char* );
00098   vtkGetStringMacro(HostName);
00100 
00102 
00103   virtual void SetUser( const char* );
00104   vtkGetStringMacro(User);
00106 
00108   virtual void SetPassword( const char* );
00109 
00111 
00112   virtual void SetDatabaseName( const char* );
00113   vtkGetStringMacro(DatabaseName);
00115 
00117 
00118   virtual void SetConnectOptions( const char* );
00119   vtkGetStringMacro(ConnectOptions);
00121 
00123 
00124   virtual void SetServerPort( int );
00125   virtual int GetServerPortMinValue()
00126     {
00127     return 0;
00128     }
00129   virtual int GetServerPortMaxValue()
00130     {
00131     return VTK_INT_MAX;
00132     }
00133   vtkGetMacro(ServerPort, int);
00135 
00141   virtual vtkStdString GetURL();
00142 
00144   vtkStringArray* GetTables();
00145 
00147   vtkStringArray* GetRecord( const char* table );
00148 
00150   bool IsSupported( int feature );
00151 
00153   vtkStringArray* GetDatabases();
00154 
00158   bool CreateDatabase( const char* dbName, bool dropExisting = false );
00159 
00162   bool DropDatabase( const char* dbName );
00163 
00165 
00169   virtual vtkStdString GetColumnSpecification(
00170     vtkSQLDatabaseSchema* schema, int tblHandle, int colHandle );
00172 
00176   virtual bool ParseURL(const char* url);
00177 
00178 protected:
00179   vtkPostgreSQLDatabase();
00180   ~vtkPostgreSQLDatabase();
00181 
00192   void UpdateDataTypeMap();
00193 
00194   vtkSetStringMacro(DatabaseType);
00195   vtkSetStringMacro(LastErrorText);
00196   void NullTrailingWhitespace( char* msg );
00197   bool OpenInternal( const char* connectionOptions );
00198 
00199   vtkTimeStamp URLMTime;
00200   vtkPostgreSQLDatabasePrivate *Connection;
00201   vtkTimeStamp ConnectionMTime;
00202   vtkStringArray *Tables;
00203   char* DatabaseType;
00204   char* HostName;
00205   char* User;
00206   char* Password;
00207   char* DatabaseName;
00208   int ServerPort;
00209   char* ConnectOptions;
00210   char* LastErrorText;
00211 
00212 private:
00213   vtkPostgreSQLDatabase( const vtkPostgreSQLDatabase& ); // Not implemented.
00214   void operator = ( const vtkPostgreSQLDatabase& ); // Not implemented.
00215 };
00216 
00217 // This is basically the body of the SetStringMacro but with a
00218 // call to update an additional vtkTimeStamp. We inline the implementation
00219 // so that wrapping will work.
00220 #define vtkSetStringPlusMTimeMacro(className,name,timeStamp) \
00221   inline void className::Set##name (const char* _arg) \
00222   { \
00223     vtkDebugMacro(<< this->GetClassName() << " (" << this << "): setting " << #name " to " << (_arg?_arg:"(null)") ); \
00224     if ( this->name == NULL && _arg == NULL) { return;} \
00225     if ( this->name && _arg && (!strcmp(this->name,_arg))) { return;} \
00226     if (this->name) { delete [] this->name; } \
00227     if (_arg) \
00228       { \
00229           size_t n = strlen(_arg) + 1; \
00230           char *cp1 =  new char[n]; \
00231           const char *cp2 = (_arg); \
00232           this->name = cp1; \
00233           do { *cp1++ = *cp2++; } while ( --n ); \
00234           } \
00235      else \
00236       { \
00237           this->name = NULL; \
00238           } \
00239     this->Modified(); \
00240     this->timeStamp.Modified(); \
00241     this->Close(); /* Force a re-open on next query */ \
00242     }
00243 
00244 vtkSetStringPlusMTimeMacro(vtkPostgreSQLDatabase,HostName,URLMTime);
00245 vtkSetStringPlusMTimeMacro(vtkPostgreSQLDatabase,User,URLMTime);
00246 vtkSetStringPlusMTimeMacro(vtkPostgreSQLDatabase,Password,URLMTime);
00247 vtkSetStringPlusMTimeMacro(vtkPostgreSQLDatabase,DatabaseName,URLMTime);
00248 vtkSetStringPlusMTimeMacro(vtkPostgreSQLDatabase,ConnectOptions,URLMTime);
00249 
00250 inline void vtkPostgreSQLDatabase::SetServerPort( int _arg )
00251 {
00252   vtkDebugMacro(<< this->GetClassName() << " (" << this << "): setting ServerPort to " << _arg );
00253   if ( this->ServerPort != ( _arg < 0 ? 0 : ( _arg > VTK_INT_MAX ? VTK_INT_MAX : _arg ) ) )
00254     {
00255     this->ServerPort = ( _arg < 0 ? 0 : ( _arg > VTK_INT_MAX ? VTK_INT_MAX : _arg ) );
00256     this->Modified();
00257     this->URLMTime.Modified();
00258     this->Close(); // Force a re-open on next query
00259     }
00260 }
00261 
00262 #endif // __vtkPostgreSQLDatabase_h