VTK  9.2.6
vtkPostgreSQLDatabase.h
Go to the documentation of this file.
1 /* -*- Mode: C++; -*- */
2 /*=========================================================================
3 
4  Program: Visualization Toolkit
5  Module: vtkPostgreSQLDatabase.h
6 
7  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
8  All rights reserved.
9  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
10 
11  This software is distributed WITHOUT ANY WARRANTY; without even
12  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
13  PURPOSE. See the above copyright notice for more information.
14 
15 =========================================================================*/
16 /*-------------------------------------------------------------------------
17  Copyright 2008 Sandia Corporation.
18  Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
19  the U.S. Government retains certain rights in this software.
20 -------------------------------------------------------------------------*/
49 #ifndef vtkPostgreSQLDatabase_h
50 #define vtkPostgreSQLDatabase_h
51 
52 #include "vtkIOPostgreSQLModule.h" // For export macro
53 #include "vtkSQLDatabase.h"
54 
55 class vtkPostgreSQLQuery;
56 class vtkStringArray;
58 struct PQconn;
59 
60 class VTKIOPOSTGRESQL_EXPORT vtkPostgreSQLDatabase : public vtkSQLDatabase
61 {
62 
63  friend class vtkPostgreSQLQuery;
64  friend class vtkPostgreSQLQueryPrivate;
65 
66 public:
68  void PrintSelf(ostream& os, vtkIndent indent) override;
69  static vtkPostgreSQLDatabase* New();
70 
76  bool Open(const char* password = nullptr) override;
77 
81  void Close() override;
82 
86  bool IsOpen() override;
87 
91  vtkSQLQuery* GetQueryInstance() override;
92 
96  bool HasError() override;
97 
101  const char* GetLastErrorText() override;
102 
104 
107  const char* GetDatabaseType() override { return this->DatabaseType; }
109 
111 
114  virtual void SetHostName(const char*);
115  vtkGetStringMacro(HostName);
117 
119 
122  virtual void SetUser(const char*);
123  vtkGetStringMacro(User);
125 
129  virtual void SetPassword(const char*);
130 
132 
135  virtual void SetDatabaseName(const char*);
136  vtkGetStringMacro(DatabaseName);
138 
140 
143  virtual void SetConnectOptions(const char*);
144  vtkGetStringMacro(ConnectOptions);
146 
148 
151  virtual void SetServerPort(int);
152  virtual int GetServerPortMinValue() { return 0; }
153  virtual int GetServerPortMaxValue() { return VTK_INT_MAX; }
154  vtkGetMacro(ServerPort, int);
156 
163  vtkStdString GetURL() override;
164 
168  vtkStringArray* GetTables() override;
169 
173  vtkStringArray* GetRecord(const char* table) override;
174 
178  bool IsSupported(int feature) override;
179 
183  vtkStringArray* GetDatabases();
184 
189  bool CreateDatabase(const char* dbName, bool dropExisting = false);
190 
195  bool DropDatabase(const char* dbName);
196 
206  vtkSQLDatabaseSchema* schema, int tblHandle, int colHandle) override;
207 
213  bool ParseURL(const char* url) override;
214 
215 protected:
217  ~vtkPostgreSQLDatabase() override;
218 
233  void UpdateDataTypeMap();
234 
235  vtkSetStringMacro(DatabaseType);
236  vtkSetStringMacro(LastErrorText);
237  void NullTrailingWhitespace(char* msg);
238  bool OpenInternal(const char* connectionOptions);
239 
245  char* HostName;
246  char* User;
247  char* Password;
252 
253 private:
255  void operator=(const vtkPostgreSQLDatabase&) = delete;
256 };
257 
258 // This is basically the body of the SetStringMacro but with a
259 // call to update an additional vtkTimeStamp. We inline the implementation
260 // so that wrapping will work.
261 #define vtkSetStringPlusMTimeMacro(className, name, timeStamp) \
262  inline void className::Set##name(const char* _arg) \
263  { \
264  vtkDebugMacro(<< this->GetClassName() << " (" << this << "): setting " << #name " to " \
265  << (_arg ? _arg : "(null)")); \
266  if (this->name == nullptr && _arg == nullptr) \
267  { \
268  return; \
269  } \
270  if (this->name && _arg && (!strcmp(this->name, _arg))) \
271  { \
272  return; \
273  } \
274  delete[] this->name; \
275  if (_arg) \
276  { \
277  size_t n = strlen(_arg) + 1; \
278  char* cp1 = new char[n]; \
279  const char* cp2 = (_arg); \
280  this->name = cp1; \
281  do \
282  { \
283  *cp1++ = *cp2++; \
284  } while (--n); \
285  } \
286  else \
287  { \
288  this->name = nullptr; \
289  } \
290  this->Modified(); \
291  this->timeStamp.Modified(); \
292  this->Close(); /* Force a re-open on next query */ \
293  }
294 
298 vtkSetStringPlusMTimeMacro(vtkPostgreSQLDatabase, DatabaseName, URLMTime);
299 vtkSetStringPlusMTimeMacro(vtkPostgreSQLDatabase, ConnectOptions, URLMTime);
300 
302 {
303  vtkDebugMacro(<< this->GetClassName() << " (" << this << "): setting ServerPort to " << _arg);
304  if (this->ServerPort != (_arg < 0 ? 0 : (_arg > VTK_INT_MAX ? VTK_INT_MAX : _arg)))
305  {
306  this->ServerPort = (_arg < 0 ? 0 : (_arg > VTK_INT_MAX ? VTK_INT_MAX : _arg));
307  this->Modified();
308  this->URLMTime.Modified();
309  this->Close(); // Force a re-open on next query
310  }
311 }
312 
313 #endif // vtkPostgreSQLDatabase_h
Wrapper around std::string to keep symbols short.
Definition: vtkStdString.h:38
virtual vtkStdString GetColumnSpecification(vtkSQLDatabaseSchema *schema, int tblHandle, int colHandle)
Return the SQL string with the syntax to create a column inside a "CREATE TABLE" SQL statement...
const char * GetDatabaseType() override
String representing database type (e.g.
maintain a connection to a PostgreSQL database
virtual bool IsSupported(int vtkNotUsed(feature))
Return whether a feature is supported by the database.
#define VTK_INT_MAX
Definition: vtkType.h:155
record modification and/or execution time
Definition: vtkTimeStamp.h:35
virtual bool Open(const char *password)=0
Open a new connection to the database.
virtual bool ParseURL(const char *url)=0
Subclasses should override this method to determine connection parameters given the URL...
internal details of a connection to a PostgreSQL database
void Modified()
Set this objects time to the current time.
virtual bool HasError()=0
Did the last operation generate an error.
a vtkAbstractArray subclass for strings
virtual vtkStdString GetURL()=0
Get the URL of the database.
represent an SQL database schema
virtual vtkStringArray * GetRecord(const char *table)=0
Get the list of fields for a particular table.
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
virtual int GetServerPortMaxValue()
The port used for connecting to the database.
virtual int GetServerPortMinValue()
The port used for connecting to the database.
maintain a connection to an sql database
virtual void Close()=0
Close the connection to the database.
vtkPostgreSQLDatabasePrivate * Connection
a simple class to control print indentation
Definition: vtkIndent.h:39
const char * GetClassName() const
Return the class name as a string.
vtkSQLQuery implementation for PostgreSQL databases
void Close() override
Close the connection to the database.
virtual vtkSQLQuery * GetQueryInstance()=0
Return an empty query on this database.
virtual bool IsOpen()=0
Return whether the database has an open connection.
virtual void Modified()
Update the modification time for this object.
#define vtkSetStringPlusMTimeMacro(className, name, timeStamp)
virtual const char * GetLastErrorText()=0
Get the last error text from the database I'm using const so that people do NOT use the standard vtkG...
executes an sql query and retrieves results
Definition: vtkSQLQuery.h:74
static vtkObject * New()
Create an object with Debug turned off, modified time initialized to zero, and reference counting on...
virtual vtkStringArray * GetTables()=0
Get the list of tables from the database.
virtual void SetServerPort(int)
The port used for connecting to the database.