VTK
|
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 00173 protected: 00174 vtkPostgreSQLDatabase(); 00175 ~vtkPostgreSQLDatabase(); 00176 00187 void UpdateDataTypeMap(); 00188 00192 virtual bool ParseURL(const char* url); 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 char* DatabaseType; 00203 char* HostName; 00204 char* User; 00205 char* Password; 00206 char* DatabaseName; 00207 int ServerPort; 00208 char* ConnectOptions; 00209 char* LastErrorText; 00210 00211 private: 00212 vtkPostgreSQLDatabase( const vtkPostgreSQLDatabase& ); // Not implemented. 00213 void operator = ( const vtkPostgreSQLDatabase& ); // Not implemented. 00214 }; 00215 00216 // This is basically the body of the SetStringMacro but with a 00217 // call to update an additional vtkTimeStamp. We inline the implementation 00218 // so that wrapping will work. 00219 #define vtkSetStringPlusMTimeMacro(className,name,timeStamp) \ 00220 inline void className::Set##name (const char* _arg) \ 00221 { \ 00222 vtkDebugMacro(<< this->GetClassName() << " (" << this << "): setting " << #name " to " << (_arg?_arg:"(null)") ); \ 00223 if ( this->name == NULL && _arg == NULL) { return;} \ 00224 if ( this->name && _arg && (!strcmp(this->name,_arg))) { return;} \ 00225 if (this->name) { delete [] this->name; } \ 00226 if (_arg) \ 00227 { \ 00228 size_t n = strlen(_arg) + 1; \ 00229 char *cp1 = new char[n]; \ 00230 const char *cp2 = (_arg); \ 00231 this->name = cp1; \ 00232 do { *cp1++ = *cp2++; } while ( --n ); \ 00233 } \ 00234 else \ 00235 { \ 00236 this->name = NULL; \ 00237 } \ 00238 this->Modified(); \ 00239 this->timeStamp.Modified(); \ 00240 this->Close(); /* Force a re-open on next query */ \ 00241 } 00242 00243 vtkSetStringPlusMTimeMacro(vtkPostgreSQLDatabase,HostName,URLMTime); 00244 vtkSetStringPlusMTimeMacro(vtkPostgreSQLDatabase,User,URLMTime); 00245 vtkSetStringPlusMTimeMacro(vtkPostgreSQLDatabase,Password,URLMTime); 00246 vtkSetStringPlusMTimeMacro(vtkPostgreSQLDatabase,DatabaseName,URLMTime); 00247 vtkSetStringPlusMTimeMacro(vtkPostgreSQLDatabase,ConnectOptions,URLMTime); 00248 00249 inline void vtkPostgreSQLDatabase::SetServerPort( int _arg ) 00250 { 00251 vtkDebugMacro(<< this->GetClassName() << " (" << this << "): setting ServerPort to " << _arg ); 00252 if ( this->ServerPort != ( _arg < 0 ? 0 : ( _arg > VTK_INT_MAX ? VTK_INT_MAX : _arg ) ) ) 00253 { 00254 this->ServerPort = ( _arg < 0 ? 0 : ( _arg > VTK_INT_MAX ? VTK_INT_MAX : _arg ) ); 00255 this->Modified(); 00256 this->URLMTime.Modified(); 00257 this->Close(); // Force a re-open on next query 00258 } 00259 } 00260 00261 #endif // __vtkPostgreSQLDatabase_h