Commit 91b76333 authored by Marcus D. Hanwell's avatar Marcus D. Hanwell
Browse files

ENH: Register SQL database callbacks for factories.

If the SQL database classes are not being compiled into VTK directly,
register their callback methods so that they can be registered later.
This is being used in the modularized VTK source tree, the ParseURL
method was made public in the derived classes. Alternatively the classes
could be friends with the callback function, or the superclass could
call ParseURL on the newly constructed database objects.

Change-Id: Iea878da34fb37b8fdf64188e80acca3fee988718
parent d0f44995
......@@ -33,8 +33,42 @@
#define VTK_MYSQL_DEFAULT_PORT 3306
vtkStandardNewMacro(vtkMySQLDatabase);
vtkStandardNewMacro(vtkMySQLDatabase)
// Registration of MySQL dynamically with the vtkSQLDatabase factory method.
vtkSQLDatabase * MySQLCreateFunction(const char* URL)
{
vtkstd::string urlstr(URL ? URL : "");
vtkstd::string protocol, unused;
vtkMySQLDatabase *db = 0;
if (vtksys::SystemTools::ParseURLProtocol(urlstr, protocol, unused) &&
protocol == "mysql")
{
db = vtkMySQLDatabase::New();
db->ParseURL(URL);
}
return db;
}
class vtkMySQLDatabaseRegister
{
public:
vtkMySQLDatabaseRegister()
{
vtkSQLDatabase::RegisterCreateFromURLCallback(MySQLCreateFunction);
}
~vtkMySQLDatabaseRegister()
{
vtkSQLDatabase::UnRegisterCreateFromURLCallback(MySQLCreateFunction);
}
};
// Remove ifndef in VTK 6.0: only register callback in old layout.
#ifndef VTK_USE_MYSQL
static vtkMySQLDatabaseRegister mySQLDataBaseRegister;
#endif
// ----------------------------------------------------------------------
vtkMySQLDatabase::vtkMySQLDatabase() :
......
......@@ -174,16 +174,16 @@ public:
// Returns true on success and false on failure.
bool DropDatabase( const char* dbName );
protected:
vtkMySQLDatabase();
~vtkMySQLDatabase();
// Description:
// Overridden to determine connection parameters given the URL.
// This is called by CreateFromURL() to initialize the instance.
// Look at CreateFromURL() for details about the URL format.
virtual bool ParseURL(const char* url);
protected:
vtkMySQLDatabase();
~vtkMySQLDatabase();
private:
// We want this to be private, a user of this class
// should not be setting this for any reason
......
......@@ -50,8 +50,43 @@
// ----------------------------------------------------------------------------
vtkStandardNewMacro(vtkODBCDatabase);
// ----------------------------------------------------------------------------
// Registration of ODBC dynamically with the vtkSQLDatabase factory method.
vtkSQLDatabase * ODBCCreateFunction(const char* URL)
{
vtkstd::string urlstr(URL ? URL : "");
vtkstd::string protocol, unused;
vtkODBCDatabase *db = 0;
if (vtksys::SystemTools::ParseURLProtocol(urlstr, protocol, unused) &&
protocol == "odbc")
{
db = vtkODBCDatabase::New();
db->ParseURL(URL);
}
return db;
}
class vtkODBCDatabaseRegister
{
public:
vtkODBCDatabaseRegister()
{
vtkSQLDatabase::RegisterCreateFromURLCallback(ODBCCreateFunction);
}
~vtkODBCDatabaseRegister()
{
vtkSQLDatabase::UnRegisterCreateFromURLCallback(ODBCCreateFunction);
}
};
// Remove ifndef in VTK 6.0: only register callback in old layout.
#ifndef VTK_USE_ODBC
static vtkODBCDatabaseRegister ODBCDataBaseRegister;
#endif
// ----------------------------------------------------------------------------
static vtkStdString GetErrorMessage(SQLSMALLINT handleType,
SQLHANDLE handle,
int *code=0)
......
......@@ -38,7 +38,7 @@
// from a configuration file (odbc.ini). That file can define an
// entire set of connection parameters and give it a single name
// called a data source name (DSN). Writing and maintaining odbc.ini
// files is beyond the scope of this header file.
// files is beyond the scope of this header file.
//
// .SECTION Caveats
//
......@@ -93,7 +93,7 @@ public:
// Description:
// Close the connection to the database.
void Close();
// Description:
// Return whether the database has an open connection
bool IsOpen();
......@@ -101,15 +101,15 @@ public:
// Description:
// Return an empty query on this database.
vtkSQLQuery* GetQueryInstance();
// Description:
// Get the last error text from the database
const char* GetLastErrorText();
// Description:
// Get the list of tables from the database
vtkStringArray* GetTables();
// Description:
// Get the list of fields for a particular table
vtkStringArray* GetRecord(const char *table);
......@@ -133,11 +133,11 @@ public:
vtkSetStringMacro(Password);
bool HasError();
// Description:
// String representing database type (e.g. "ODBC").
vtkGetStringMacro(DatabaseType);
vtkStdString GetURL();
// Description:
......@@ -149,7 +149,7 @@ public:
virtual vtkStdString GetColumnSpecification( vtkSQLDatabaseSchema* schema,
int tblHandle,
int colHandle );
// Description:
// Return the SQL string with the syntax to create an index inside a
// "CREATE TABLE" SQL statement.
......@@ -168,18 +168,18 @@ public:
// Returns true on success and false on failure.
bool DropDatabase( const char* dbName );
protected:
vtkODBCDatabase();
~vtkODBCDatabase();
vtkSetStringMacro(LastErrorText);
// Description:
// This will only handle URLs of the form
// odbc://[user@]datsourcename[:port]/[dbname]. Anything
// more complicated than that needs to be set up manually.
bool ParseURL(const char *url);
protected:
vtkODBCDatabase();
~vtkODBCDatabase();
vtkSetStringMacro(LastErrorText);
private:
vtkStringArray *Tables;
vtkStringArray *Record;
......@@ -194,13 +194,13 @@ private:
int ServerPort;
vtkODBCInternals *Internals;
// We want this to be private, a user of this class
// should not be setting this for any reason
vtkSetStringMacro(DatabaseType);
char *DatabaseType;
vtkODBCDatabase(const vtkODBCDatabase &); // Not implemented.
void operator=(const vtkODBCDatabase &); // Not implemented.
};
......
......@@ -38,6 +38,41 @@
vtkStandardNewMacro(vtkPostgreSQLDatabase);
// Registration of PostgreSQL dynamically with the vtkSQLDatabase factory method.
vtkSQLDatabase * PostgreSQLCreateFunction(const char* URL)
{
vtkstd::string urlstr(URL ? URL : "");
vtkstd::string protocol, unused;
vtkPostgreSQLDatabase *db = 0;
if (vtksys::SystemTools::ParseURLProtocol(urlstr, protocol, unused) &&
protocol == "psql")
{
db = vtkPostgreSQLDatabase::New();
db->ParseURL(URL);
}
return db;
}
class vtkPostgreSQLDatabaseRegister
{
public:
vtkPostgreSQLDatabaseRegister()
{
vtkSQLDatabase::RegisterCreateFromURLCallback(PostgreSQLCreateFunction);
}
~vtkPostgreSQLDatabaseRegister()
{
vtkSQLDatabase::UnRegisterCreateFromURLCallback(PostgreSQLCreateFunction);
}
};
// Remove ifndef in VTK 6.0: only register callback in old layout.
#ifndef VTK_USE_POSTGRES
static vtkPostgreSQLDatabaseRegister postgreSQLDataBaseRegister;
#endif
// ----------------------------------------------------------------------
vtkPostgreSQLDatabase::vtkPostgreSQLDatabase()
{
......
......@@ -71,7 +71,7 @@ public:
// Description:
// Close the connection to the database.
void Close();
// Description:
// Return whether the database has an open connection
bool IsOpen();
......@@ -79,11 +79,11 @@ public:
// Description:
// Return an empty query on this database.
vtkSQLQuery* GetQueryInstance();
// Description:
// Did the last operation generate an error
virtual bool HasError();
// Description:
// Get the last error text from the database
const char* GetLastErrorText();
......@@ -128,7 +128,7 @@ public:
return VTK_INT_MAX;
}
vtkGetMacro(ServerPort, int);
// Description:
// Get a URL referencing the current database connection.
// This is not well-defined if the HostName and DatabaseName
......@@ -139,7 +139,7 @@ public:
// Description:
// Get the list of tables from the database
vtkStringArray* GetTables();
// Description:
// Get the list of fields for a particular table
vtkStringArray* GetRecord( const char* table );
......@@ -169,7 +169,13 @@ public:
// <column name> <column type> <column attributes>
virtual vtkStdString GetColumnSpecification(
vtkSQLDatabaseSchema* schema, int tblHandle, int colHandle );
// Description:
// Overridden to determine connection parameters given the URL.
// This is called by CreateFromURL() to initialize the instance.
// Look at CreateFromURL() for details about the URL format.
virtual bool ParseURL(const char* url);
protected:
vtkPostgreSQLDatabase();
~vtkPostgreSQLDatabase();
......@@ -189,19 +195,13 @@ protected:
// database connection is initiated.
void UpdateDataTypeMap();
// Description:
// Overridden to determine connection parameters given the URL.
// This is called by CreateFromURL() to initialize the instance.
// Look at CreateFromURL() for details about the URL format.
virtual bool ParseURL(const char* url);
vtkSetStringMacro(DatabaseType);
vtkSetStringMacro(LastErrorText);
void NullTrailingWhitespace( char* msg );
bool OpenInternal( const char* connectionOptions );
vtkTimeStamp URLMTime;
vtkPostgreSQLDatabasePrivate *Connection;
vtkPostgreSQLDatabasePrivate *Connection;
vtkTimeStamp ConnectionMTime;
vtkStringArray *Tables;
char* DatabaseType;
......@@ -212,7 +212,7 @@ protected:
int ServerPort;
char* ConnectOptions;
char* LastErrorText;
private:
vtkPostgreSQLDatabase( const vtkPostgreSQLDatabase& ); // Not implemented.
void operator = ( const vtkPostgreSQLDatabase& ); // Not implemented.
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment