diff --git a/hmailserver/source/Server/COM/InterfaceDatabase.cpp b/hmailserver/source/Server/COM/InterfaceDatabase.cpp index a8cb8bad9..0afc9f841 100644 --- a/hmailserver/source/Server/COM/InterfaceDatabase.cpp +++ b/hmailserver/source/Server/COM/InterfaceDatabase.cpp @@ -488,7 +488,7 @@ STDMETHODIMP InterfaceDatabase::CreateInternalDatabase() // Create a settings object which we use to connect to the server. std::shared_ptr pSettings = std::shared_ptr( - new HM::DatabaseSettings(sEmpty, sDatabaseName, sEmpty, sPassword, sDirectory, sEmpty, HM::DatabaseSettings::TypeMSSQLCompactEdition, 0)); + new HM::DatabaseSettings(sEmpty, sEmpty, sDatabaseName, sEmpty, sPassword, sDirectory, sEmpty, HM::DatabaseSettings::TypeMSSQLCompactEdition, 0)); // Connect to the new database std::shared_ptr pConn = HM::DALConnectionFactory::CreateConnection(pSettings); @@ -537,13 +537,14 @@ STDMETHODIMP InterfaceDatabase::CreateExternalDatabase(eDBtype ServerType, BSTR const HM::String sDatabaseName = DatabaseName; const HM::String sUsername = Username; const HM::String sPassword = Password; - + const HM::String sProvider = ini_file_settings_->GetDatabaseProvider(); + if (sDatabaseName.Find(_T(" ")) >= 0) return COMError::GenerateError("The database name may not contain spaces."); // Create a settings object for the connection ... std::shared_ptr pSettings = std::shared_ptr( - new HM::DatabaseSettings(sServerName, sEmpty, sUsername, sPassword, sEmpty, sEmpty,(HM::DatabaseSettings::SQLDBType) ServerType, lPort)); + new HM::DatabaseSettings(sProvider, sServerName, sEmpty, sUsername, sPassword, sEmpty, sEmpty, (HM::DatabaseSettings::SQLDBType) ServerType, lPort)); // Connect to the database serve std::shared_ptr pConn = HM::DALConnectionFactory::CreateConnection(pSettings); @@ -563,7 +564,7 @@ STDMETHODIMP InterfaceDatabase::CreateExternalDatabase(eDBtype ServerType, BSTR // Create a new settings object where we specify the database name as well. pSettings = std::shared_ptr( - new HM::DatabaseSettings(sServerName, sDatabaseName, sUsername, sPassword, sEmpty, sEmpty,(HM::DatabaseSettings::SQLDBType) ServerType, lPort)); + new HM::DatabaseSettings(sProvider, sServerName, sDatabaseName, sUsername, sPassword, sEmpty, sEmpty, (HM::DatabaseSettings::SQLDBType) ServerType, lPort)); // Reconnect to the new database. pConn = HM::DALConnectionFactory::CreateConnection(pSettings); @@ -574,7 +575,7 @@ STDMETHODIMP InterfaceDatabase::CreateExternalDatabase(eDBtype ServerType, BSTR HM::SQLScriptRunner scriptRunner; if (!scriptRunner.ExecuteScript(pConn, pSettings->GetDefaultScript(), sErrorMessage)) return COMError::GenerateError(sErrorMessage); - + ini_file_settings_->SetDatabaseDirectory(""); ini_file_settings_->SetDatabaseType((HM::DatabaseSettings::SQLDBType) ServerType); ini_file_settings_->SetUsername(sUsername); @@ -583,7 +584,7 @@ STDMETHODIMP InterfaceDatabase::CreateExternalDatabase(eDBtype ServerType, BSTR ini_file_settings_->SetDatabaseServer(sServerName); ini_file_settings_->SetDatabaseName(sDatabaseName); ini_file_settings_->SetIsInternalDatabase(false); - + return S_OK; } catch (...) @@ -609,8 +610,10 @@ STDMETHODIMP InterfaceDatabase::SetDefaultDatabase(eDBtype ServerType, BSTR Serv return COMError::GenerateError("The database name may not contain spaces."); // Create a settings object for the connection ... + HM::String sProvider = ini_file_settings_->GetDatabaseProvider(); + std::shared_ptr pSettings = std::shared_ptr( - new HM::DatabaseSettings(sServerName, sEmpty, sUsername, sPassword, sEmpty, sEmpty,(HM::DatabaseSettings::SQLDBType) ServerType, lPort)); + new HM::DatabaseSettings(sProvider, sServerName, sEmpty, sUsername, sPassword, sEmpty, sEmpty, (HM::DatabaseSettings::SQLDBType) ServerType, lPort)); // Connect to the database server. std::shared_ptr pConn = HM::DALConnectionFactory::CreateConnection(pSettings); @@ -630,7 +633,7 @@ STDMETHODIMP InterfaceDatabase::SetDefaultDatabase(eDBtype ServerType, BSTR Serv ini_file_settings_->SetDatabaseServer(sServerName); ini_file_settings_->SetDatabaseName(sDatabaseName); ini_file_settings_->SetIsInternalDatabase(ServerType == hDBTypeMSSQLCE); - + return S_OK; } catch (...) diff --git a/hmailserver/source/Server/Common/Application/IniFileSettings.cpp b/hmailserver/source/Server/Common/Application/IniFileSettings.cpp index 1b79c271d..22783dcc4 100644 --- a/hmailserver/source/Server/Common/Application/IniFileSettings.cpp +++ b/hmailserver/source/Server/Common/Application/IniFileSettings.cpp @@ -61,6 +61,7 @@ namespace HM password_ = ReadIniSettingString_("Database", "Password", ""); is_internal_database_ = ReadIniSettingInteger_("Database", "Internal", 0) == 1; database_server_FailoverPartner = ReadIniSettingString_("Database", "ServerFailoverPartner", ""); + database_provider_ = ReadIniSettingString_("Database", "Provider", ""); String sDatabaseType = ReadIniSettingString_("Database", "Type", ""); diff --git a/hmailserver/source/Server/Common/Application/IniFileSettings.h b/hmailserver/source/Server/Common/Application/IniFileSettings.h index 64935e282..b08f9d8c8 100644 --- a/hmailserver/source/Server/Common/Application/IniFileSettings.h +++ b/hmailserver/source/Server/Common/Application/IniFileSettings.h @@ -22,6 +22,7 @@ namespace HM bool GetDatabaseSettingsExists(); + String GetDatabaseProvider() const { return database_provider_; } String GetDatabaseServer() const { return database_server_; } String GetDatabaseName() const { return database_name_; } String GetUsername() const { return username_; } @@ -185,6 +186,7 @@ namespace HM bool backup_messages_dbonly_; bool add_xauth_user_ip_; bool rewrite_envelope_from_when_forwarding_; + String database_provider_; String m_sDisableAUTHList; }; diff --git a/hmailserver/source/Server/Common/SQL/ADOConnection.cpp b/hmailserver/source/Server/Common/SQL/ADOConnection.cpp index 96c786c86..ca288df14 100644 --- a/hmailserver/source/Server/Common/SQL/ADOConnection.cpp +++ b/hmailserver/source/Server/Common/SQL/ADOConnection.cpp @@ -84,10 +84,19 @@ namespace HM String sDatabase = database_settings_->GetDatabaseName(); String sServerFailoverPartner = database_settings_->GetDatabaseServerFailoverPartner(); - String sProvider = "sqloledb"; - if (!sServerFailoverPartner.IsEmpty()) + String sProvider = database_settings_->GetProvider(); + + if (sProvider.IsEmpty()) { - sProvider = "SQLNCLI"; + if (sServerFailoverPartner.IsEmpty()) + { + sProvider = "sqloledb"; + } + else + { + sProvider = "SQLNCLI"; + } + } if (bConnected) diff --git a/hmailserver/source/Server/Common/SQL/DatabaseConnectionManager.cpp b/hmailserver/source/Server/Common/SQL/DatabaseConnectionManager.cpp index 4b87a7846..feeb65879 100644 --- a/hmailserver/source/Server/Common/SQL/DatabaseConnectionManager.cpp +++ b/hmailserver/source/Server/Common/SQL/DatabaseConnectionManager.cpp @@ -84,6 +84,7 @@ namespace HM IniFileSettings *pIniFileSettings = IniFileSettings::Instance(); + String sProvider = pIniFileSettings->GetDatabaseProvider(); String sServer = pIniFileSettings->GetDatabaseServer(); String sUsername = pIniFileSettings->GetUsername(); String sPassword = pIniFileSettings->GetPassword(); @@ -91,10 +92,11 @@ namespace HM String sDatabaseDirectory = pIniFileSettings->GetDatabaseDirectory(); String sDatabaseServerFailoverPartner = pIniFileSettings->GetDatabaseServerFailoverPartner(); long lDBPort = pIniFileSettings->GetDatabasePort(); + HM::DatabaseSettings::SQLDBType dbType = IniFileSettings::Instance()->GetDatabaseType(); std::shared_ptr pSettings = std::shared_ptr - (new DatabaseSettings(sServer, sDatabase, sUsername, sPassword, sDatabaseDirectory, sDatabaseServerFailoverPartner, dbType, lDBPort)); + (new DatabaseSettings(sProvider, sServer, sDatabase, sUsername, sPassword, sDatabaseDirectory, sDatabaseServerFailoverPartner, dbType, lDBPort)); for (int i = 0; i < iNoOfConnections; i++) { diff --git a/hmailserver/source/Server/Common/SQL/DatabaseSettings.cpp b/hmailserver/source/Server/Common/SQL/DatabaseSettings.cpp index fa0ed64cf..9da8054ba 100644 --- a/hmailserver/source/Server/Common/SQL/DatabaseSettings.cpp +++ b/hmailserver/source/Server/Common/SQL/DatabaseSettings.cpp @@ -12,8 +12,8 @@ namespace HM { - DatabaseSettings::DatabaseSettings(const String &sDatabaseServer, const String &sDatabaseName, const String &sUsername, const String &sPassword, - const String &sDatabaseDirectory, const String &sDatabaseServerFailoverPartner, HM::DatabaseSettings::SQLDBType dbType, long lDBPort) : + DatabaseSettings::DatabaseSettings(const String &sDatabaseProvider, const String &sDatabaseServer, const String &sDatabaseName, const String &sUsername, const String &sPassword, + const String &sDatabaseDirectory, const String &sDatabaseServerFailoverPartner, HM::DatabaseSettings::SQLDBType dbType, long lDBPort) : database_server_(sDatabaseServer), database_name_(sDatabaseName), username_(sUsername), @@ -21,7 +21,8 @@ namespace HM database_directory_(sDatabaseDirectory), sqldbtype_(dbType), database_server_failover_partner_(sDatabaseServerFailoverPartner), - dbport_(lDBPort) + dbport_(lDBPort), + database_provider_(sDatabaseProvider) { } diff --git a/hmailserver/source/Server/Common/SQL/DatabaseSettings.h b/hmailserver/source/Server/Common/SQL/DatabaseSettings.h index 17fb83d87..9368da3c6 100644 --- a/hmailserver/source/Server/Common/SQL/DatabaseSettings.h +++ b/hmailserver/source/Server/Common/SQL/DatabaseSettings.h @@ -19,10 +19,11 @@ namespace HM TypeMSSQLCompactEdition = 4 }; - DatabaseSettings(const String &sDatabaseServer, const String &sDatabaseName, const String &sUsername, const String &sPassword, - const String &sDatabaseDirectory, const String &sDatabaseServerFailoverPartner, HM::DatabaseSettings::SQLDBType dbType, long lDBPort); + DatabaseSettings(const String &sDatabaseProvider, const String &sDatabaseServer, const String &sDatabaseName, const String &sUsername, const String &sPassword, + const String &sDatabaseDirectory, const String &sDatabaseServerFailoverPartner, HM::DatabaseSettings::SQLDBType dbType, long lDBPort); virtual ~DatabaseSettings(); + String GetProvider() { return database_provider_; } String GetServer() {return database_server_; } String GetDatabaseName() {return database_name_;} String GetUsername() {return username_;} @@ -33,11 +34,12 @@ namespace HM String GetDatabaseServerFailoverPartner() const { return database_server_failover_partner_; } String GetDefaultScript(); - + static String GetDatabaseTypeName(HM::DatabaseSettings::SQLDBType type); private: + String database_provider_; String database_server_; String database_name_; String username_; @@ -46,8 +48,6 @@ namespace HM String database_server_failover_partner_; HM::DatabaseSettings::SQLDBType sqldbtype_; long dbport_; - - }; }