picodb(mssql): support all MSSQL pdo drivers

For MSSQL make all connection attributes optional.
Handle differing DB connection params based on driver used.
connection can be made via ODBC DSN or server/hostname
username/password can be embedded in DSN definition or simply
omitted and single-signon will be attempted.
This commit is contained in:
Joe Nahmias 2022-07-08 09:00:04 -04:00 committed by Frédéric Guillot
parent bb7f8b4621
commit ee6cdb3565
2 changed files with 40 additions and 8 deletions

View File

@ -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'];

View File

@ -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':