diff --git a/libs/picodb/lib/PicoDb/Driver/Mssql.php b/libs/picodb/lib/PicoDb/Driver/Mssql.php index 82f4b1c3f..3f5e2fbe4 100644 --- a/libs/picodb/lib/PicoDb/Driver/Mssql.php +++ b/libs/picodb/lib/PicoDb/Driver/Mssql.php @@ -19,10 +19,6 @@ class Mssql extends Base * @var array */ protected $requiredAttributes = array( - 'hostname', - 'username', - 'password', - 'database', ); /** @@ -53,13 +49,45 @@ class Mssql extends Base */ public function createConnection(array $settings) { - $dsn = 'sqlsrv:Server=' . $settings['hostname'] . ';Database=' . $settings['database']; + $dsn = $settings['driver'] . ':'; - if (! empty($settings['port'])) { - $dsn .= ';port=' . $settings['port']; + // exactly one of hostname/DSN needed, port is optional + if ($settings['driver'] == 'odbc') { + $dsn .= $settings['odbc-dsn']; + } else { + if ($settings['driver'] == 'dblib') { + $dsn .= 'host=' . $settings['hostname']; + } elseif ($settings['driver'] == 'sqlsrv') { + $dsn .= 'Server=' . $settings['hostname']; + } + if (! empty($settings['port'])) { + $dsn .= ',' . $settings['port']; + } } - $this->pdo = new PDO($dsn, $settings['username'], $settings['password']); + if (! empty($settings['database'])) { + if ($settings['driver'] == 'dblib') { + $dsn .= ';dbname=' . $settings['database']; + } elseif ($settings['driver'] == 'sqlsrv') { + $dsn .= ';Database=' . $settings['database']; + } + } + + + if (! empty($settings['appname'])) { + if ($settings['driver'] == 'dblib') { + $dsn .= ';appname=' . $settings['appname']; + } elseif ($settings['driver'] == 'sqlsrv') { + $dsn .= ';APP=' . $settings['appname']; + } + } + + // create PDO object + if (! empty($settings['username'])) { + $this->pdo = new PDO($dsn, $settings['username'], $settings['password']); + } else { + $this->pdo = new PDO($dsn); + } if (isset($settings['schema_table'])) { $this->schemaTable = $settings['schema_table']; diff --git a/libs/picodb/lib/PicoDb/DriverFactory.php b/libs/picodb/lib/PicoDb/DriverFactory.php index 13151ba71..4547bc526 100644 --- a/libs/picodb/lib/PicoDb/DriverFactory.php +++ b/libs/picodb/lib/PicoDb/DriverFactory.php @@ -32,6 +32,10 @@ class DriverFactory switch ($settings['driver']) { case 'sqlite': return new Sqlite($settings); + case 'odbc': + return new Mssql($settings); + case 'dblib': + return new Mssql($settings); case 'mssql': return new Mssql($settings); case 'mysql':