Skip to content

Commit 4bcddad

Browse files
committed
auto-init for db back-ends
Auto initialization for all DB back-ends and some tidy-up for network windows auto initialization
1 parent c7cb7e4 commit 4bcddad

7 files changed

Lines changed: 149 additions & 28 deletions

File tree

Data/MySQL/include/Poco/Data/MySQL/Connector.h

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,12 @@
4444
#include "Poco/Data/Connector.h"
4545

4646

47+
// Note: to avoid static (de)initialization problems,
48+
// during connector automatic (un)registration, it is
49+
// best to have this as a macro.
50+
#define POCO_DATA_MYSQL_CONNECTOR_NAME "mysql"
51+
52+
4753
namespace Poco {
4854
namespace Data {
4955
namespace MySQL {
@@ -80,4 +86,55 @@ class MySQL_API Connector: public Poco::Data::Connector
8086
} } } // namespace Poco::Data::MySQL
8187

8288

89+
//
90+
// Automatic Connector registration
91+
//
92+
93+
struct MySQL_API MySQLConnectorRegistrator
94+
/// Connector registering class.
95+
/// A global instance of this class is instantiated
96+
/// with sole purpose to automatically register the
97+
/// MySQL connector with central Poco Data registry.
98+
{
99+
MySQLConnectorRegistrator()
100+
/// Calls Poco::Data::MySQL::registerConnector();
101+
{
102+
Poco::Data::MySQL::Connector::registerConnector();
103+
}
104+
105+
~MySQLConnectorRegistrator()
106+
/// Calls Poco::Data::MySQL::unregisterConnector();
107+
{
108+
Poco::Data::MySQL::Connector::unregisterConnector();
109+
}
110+
};
111+
112+
113+
#if !defined(POCO_NO_AUTOMATIC_LIB_INIT)
114+
#if defined(POCO_OS_FAMILY_WINDOWS)
115+
extern "C" const struct MySQL_API MySQLConnectorRegistrator pocoMySQLConnectorRegistrator;
116+
#if defined(MySQL_EXPORTS)
117+
#if defined(_WIN64)
118+
#define POCO_DATA_MYSQL_FORCE_SYMBOL(s) __pragma(comment (linker, "/export:"#s))
119+
#elif defined(_WIN32)
120+
#define POCO_DATA_MYSQL_FORCE_SYMBOL(s) __pragma(comment (linker, "/export:_"#s))
121+
#endif
122+
#else // !MySQL_EXPORTS
123+
#if defined(_WIN64)
124+
#define POCO_DATA_MYSQL_FORCE_SYMBOL(s) __pragma(comment (linker, "/include:"#s))
125+
#elif defined(_WIN32)
126+
#define POCO_DATA_MYSQL_FORCE_SYMBOL(s) __pragma(comment (linker, "/include:_"#s))
127+
#endif
128+
#endif // MySQL_EXPORTS
129+
#else // !POCO_OS_FAMILY_WINDOWS
130+
#define POCO_DATA_MYSQL_FORCE_SYMBOL(s) extern "C" const struct MySQLConnectorRegistrator s;
131+
#endif // POCO_OS_FAMILY_WINDOWS
132+
POCO_DATA_MYSQL_FORCE_SYMBOL(pocoMySQLConnectorRegistrator)
133+
#endif // POCO_NO_AUTOMATIC_LIB_INIT
134+
135+
//
136+
// End automatic Connector registration
137+
//
138+
139+
83140
#endif // Data_MySQL_Connector_INCLUDED

Data/MySQL/src/Connector.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,16 +38,18 @@
3838
#include "Poco/Data/MySQL/SessionImpl.h"
3939
#include "Poco/Data/SessionFactory.h"
4040
#include "Poco/Exception.h"
41-
4241
#include <mysql.h>
4342

4443

44+
const MySQLConnectorRegistrator pocoMySQLConnectorRegistrator;
45+
46+
4547
namespace Poco {
4648
namespace Data {
4749
namespace MySQL {
4850

4951

50-
std::string Connector::KEY("mysql");
52+
std::string Connector::KEY(POCO_DATA_MYSQL_CONNECTOR_NAME);
5153

5254

5355
Connector::Connector()
@@ -61,7 +63,8 @@ Connector::~Connector()
6163

6264
const std::string& Connector::name() const
6365
{
64-
return KEY;
66+
static const std::string n(POCO_DATA_MYSQL_CONNECTOR_NAME);
67+
return n;
6568
}
6669

6770
Poco::AutoPtr<Poco::Data::SessionImpl> Connector::createSession(const std::string& connectionString,
@@ -84,7 +87,7 @@ void Connector::registerConnector()
8487

8588
void Connector::unregisterConnector()
8689
{
87-
Poco::Data::SessionFactory::instance().remove(KEY);
90+
Poco::Data::SessionFactory::instance().remove(POCO_DATA_MYSQL_CONNECTOR_NAME);
8891
mysql_library_end();
8992
}
9093

Data/ODBC/include/Poco/Data/ODBC/Connector.h

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,12 @@
4444
#include "Poco/Data/Connector.h"
4545

4646

47+
// Note: to avoid static (de)initialization problems,
48+
// during connector automatic (un)registration, it is
49+
// best to have this as a macro.
50+
#define POCO_DATA_ODBC_CONNECTOR_NAME "odbc"
51+
52+
4753
namespace Poco {
4854
namespace Data {
4955
namespace ODBC {
@@ -83,11 +89,63 @@ class ODBC_API Connector: public Poco::Data::Connector
8389

8490
inline const std::string& Connector::name() const
8591
{
86-
return KEY;
92+
static const std::string n(POCO_DATA_ODBC_CONNECTOR_NAME);
93+
return n;
8794
}
8895

8996

9097
} } } // namespace Poco::Data::ODBC
9198

9299

100+
//
101+
// Automatic Connector registration
102+
//
103+
104+
struct ODBC_API ODBCConnectorRegistrator
105+
/// Connector registering class.
106+
/// A global instance of this class is instantiated
107+
/// with sole purpose to automatically register the
108+
/// ODBC connector with central Poco Data registry.
109+
{
110+
ODBCConnectorRegistrator()
111+
/// Calls Poco::Data::ODBC::registerConnector();
112+
{
113+
Poco::Data::ODBC::Connector::registerConnector();
114+
}
115+
116+
~ODBCConnectorRegistrator()
117+
/// Calls Poco::Data::ODBC::unregisterConnector();
118+
{
119+
Poco::Data::ODBC::Connector::unregisterConnector();
120+
}
121+
};
122+
123+
124+
#if !defined(POCO_NO_AUTOMATIC_LIB_INIT)
125+
#if defined(POCO_OS_FAMILY_WINDOWS)
126+
extern "C" const struct ODBC_API ODBCConnectorRegistrator pocoODBCConnectorRegistrator;
127+
#if defined(ODBC_EXPORTS)
128+
#if defined(_WIN64)
129+
#define POCO_DATA_ODBC_FORCE_SYMBOL(s) __pragma(comment (linker, "/export:"#s))
130+
#elif defined(_WIN32)
131+
#define POCO_DATA_ODBC_FORCE_SYMBOL(s) __pragma(comment (linker, "/export:_"#s))
132+
#endif
133+
#else // !ODBC_EXPORTS
134+
#if defined(_WIN64)
135+
#define POCO_DATA_ODBC_FORCE_SYMBOL(s) __pragma(comment (linker, "/include:"#s))
136+
#elif defined(_WIN32)
137+
#define POCO_DATA_ODBC_FORCE_SYMBOL(s) __pragma(comment (linker, "/include:_"#s))
138+
#endif
139+
#endif // ODBC_EXPORTS
140+
#else // !POCO_OS_FAMILY_WINDOWS
141+
#define POCO_DATA_ODBC_FORCE_SYMBOL(s) extern "C" const struct ODBCConnectorRegistrator s;
142+
#endif // POCO_OS_FAMILY_WINDOWS
143+
POCO_DATA_ODBC_FORCE_SYMBOL(pocoODBCConnectorRegistrator)
144+
#endif // POCO_NO_AUTOMATIC_LIB_INIT
145+
146+
//
147+
// End automatic Connector registration
148+
//
149+
150+
93151
#endif // Data_ODBC_Connector_INCLUDED

Data/ODBC/src/Connector.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,15 @@
3939
#include "Poco/Data/SessionFactory.h"
4040

4141

42+
const ODBCConnectorRegistrator pocoODBCConnectorRegistrator;
43+
44+
4245
namespace Poco {
4346
namespace Data {
4447
namespace ODBC {
4548

4649

47-
const std::string Connector::KEY("odbc");
50+
const std::string Connector::KEY(POCO_DATA_ODBC_CONNECTOR_NAME);
4851

4952

5053
Connector::Connector()
@@ -72,7 +75,7 @@ void Connector::registerConnector()
7275

7376
void Connector::unregisterConnector()
7477
{
75-
Poco::Data::SessionFactory::instance().remove(KEY);
78+
Poco::Data::SessionFactory::instance().remove(POCO_DATA_ODBC_CONNECTOR_NAME);
7679
}
7780

7881

Data/ODBC/testsuite/src/ODBCTest.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1313,7 +1313,6 @@ ODBCTest::SessionPtr ODBCTest::init(const std::string& driver,
13131313
Utility::drivers(_drivers);
13141314
if (!canConnect(driver, dsn, uid, pwd, dbConnString, db)) return 0;
13151315

1316-
Poco::Data::ODBC::Connector::registerConnector();
13171316
try
13181317
{
13191318
std::cout << "Conecting to [" << dbConnString << ']' << std::endl;

Data/SQLite/include/Poco/Data/SQLite/Connector.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,8 @@ class SQLite_API Connector: public Poco::Data::Connector
9797
///
9898
inline const std::string& Connector::name() const
9999
{
100-
static const std::string name(POCO_DATA_SQLITE_CONNECTOR_NAME);
101-
return name;
100+
static const std::string n(POCO_DATA_SQLITE_CONNECTOR_NAME);
101+
return n;
102102
}
103103

104104

@@ -138,14 +138,14 @@ struct SQLite_API SQLiteConnectorRegistrator
138138
#elif defined(_WIN32)
139139
#define POCO_DATA_SQLITE_FORCE_SYMBOL(s) __pragma(comment (linker, "/export:_"#s))
140140
#endif
141-
#else // SQLite_EXPORTS
141+
#else // !SQLite_EXPORTS
142142
#if defined(_WIN64)
143143
#define POCO_DATA_SQLITE_FORCE_SYMBOL(s) __pragma(comment (linker, "/include:"#s))
144144
#elif defined(_WIN32)
145145
#define POCO_DATA_SQLITE_FORCE_SYMBOL(s) __pragma(comment (linker, "/include:_"#s))
146146
#endif
147147
#endif // SQLite_EXPORTS
148-
#else // !POCO_OS_FAMILY_WINDOWS
148+
#else // !POCO_OS_FAMILY_WINDOWS
149149
#define POCO_DATA_SQLITE_FORCE_SYMBOL(s) extern "C" const struct SQLiteConnectorRegistrator s;
150150
#endif // POCO_OS_FAMILY_WINDOWS
151151
POCO_DATA_SQLITE_FORCE_SYMBOL(pocoSQLiteConnectorRegistrator)

Net/src/Net.cpp

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -67,24 +67,25 @@ void Net_API uninitializeNetwork()
6767
} } // namespace Poco::Net
6868

6969

70-
struct NetworkInitializer
71-
/// Network initializer for windows statically
72-
/// linked library.
73-
{
74-
NetworkInitializer()
75-
/// Calls Poco::Net::initializeNetwork();
76-
{
77-
Poco::Net::initializeNetwork();
78-
}
70+
#if defined(POCO_OS_FAMILY_WINDOWS) && !defined(POCO_NO_AUTOMATIC_LIB_INIT)
7971

80-
~NetworkInitializer()
81-
/// Calls Poco::Net::uninitializeNetwork();
72+
struct NetworkInitializer
73+
/// Network initializer for windows statically
74+
/// linked library.
8275
{
83-
Poco::Net::uninitializeNetwork();
84-
}
85-
};
76+
NetworkInitializer()
77+
/// Calls Poco::Net::initializeNetwork();
78+
{
79+
Poco::Net::initializeNetwork();
80+
}
81+
82+
~NetworkInitializer()
83+
/// Calls Poco::Net::uninitializeNetwork();
84+
{
85+
Poco::Net::uninitializeNetwork();
86+
}
87+
};
8688

87-
88-
#ifndef POCO_NO_AUTOMATIC_LIB_INIT
8989
const NetworkInitializer pocoNetworkInitializer;
90+
9091
#endif

0 commit comments

Comments
 (0)