Refactoring
This commit is contained in:
parent
dd6771f8fe
commit
0b0a2a5201
144
README.md
144
README.md
@ -43,7 +43,11 @@ Add the laravel-db2 Service Provider to your config in ``app/config/app.php``:
|
|||||||
|
|
||||||
### Configuration
|
### Configuration
|
||||||
|
|
||||||
There are two ways to configure laravel-db2. You can choose the most convenient way for you. You can put your DB2 credentials into ``app/config/database.php`` (option 1) file or use package config file which you can be generated through command line by artisan (option 2).
|
There are two ways to configure laravel-db2. You can choose the most convenient way for you. You can put your DB2 credentials into ``app/config/database.php`` (option 1) file or use package config file which you can generate through command line by artisan (option 2).
|
||||||
|
|
||||||
|
Please check appropriate specific DSN parameters for your connection.
|
||||||
|
For instance here are the ODBC keywords for IBMi
|
||||||
|
https://www.ibm.com/support/knowledgecenter/fr/ssw_ibm_i_73/rzaik/connectkeywords.htm
|
||||||
|
|
||||||
#### Option 1: Configure DB2 using ``app/config/database.php`` file
|
#### Option 1: Configure DB2 using ``app/config/database.php`` file
|
||||||
|
|
||||||
@ -57,97 +61,103 @@ Simply add this code at the end of your ``app/config/database.php`` file:
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
'ibmi' => [
|
'ibmi' => [
|
||||||
'driver' => 'odbc' / 'ibm' / 'odbczos',
|
'driver' => 'db2_ibmi_odbc',
|
||||||
'driverName' => '{IBM i Access ODBC Driver}' / '{iSeries Access ODBC Driver}',
|
// or 'db2_ibmi_ibm' / 'db2_zos_odbc' / 'db2_expressc_odbc
|
||||||
// General settings
|
'driverName' => '{IBM i Access ODBC Driver}',
|
||||||
|
// or '{iSeries Access ODBC Driver}' / '{IBM i Access ODBC Driver 64-bit}'
|
||||||
'host' => 'server',
|
'host' => 'server',
|
||||||
'username' => '',
|
'username' => '',
|
||||||
'password' => '',
|
'password' => '',
|
||||||
//Server settings
|
|
||||||
'database' => 'WRKRDBDIRE entry',
|
'database' => 'WRKRDBDIRE entry',
|
||||||
'prefix' => '',
|
'prefix' => '',
|
||||||
'schema' => 'default schema',
|
'schema' => 'default schema',
|
||||||
'port' => 50000,
|
'port' => 50000,
|
||||||
'signon' => 3,
|
'date_format' => 'Y-m-d H:i:s',
|
||||||
'ssl' => 0,
|
// or 'Y-m-d H:i:s.u' / 'Y-m-d-H.i.s.u'...
|
||||||
'commitMode' => 2,
|
'odbc_keywords' => [
|
||||||
'connectionType' => 0,
|
'SIGNON' => 3,
|
||||||
'defaultLibraries' => '',
|
'SSL' => 0,
|
||||||
'naming' => 0,
|
'CommitMode' => 2,
|
||||||
'unicodeSql' => 0,
|
'ConnectionType' => 0,
|
||||||
// Format settings
|
'DefaultLibraries' => '',
|
||||||
'dateFormat' => 5,
|
'Naming' => 0,
|
||||||
'dateSeperator' => 0,
|
'UNICODESQL' => 0,
|
||||||
'decimal' => 0,
|
'DateFormat' => 5,
|
||||||
'timeFormat' => 0,
|
'DateSeperator' => 0,
|
||||||
'timeSeparator' => 0,
|
'Decimal' => 0,
|
||||||
// Performances settings
|
'TimeFormat' => 0,
|
||||||
'blockFetch' => 1,
|
'TimeSeparator' => 0,
|
||||||
'blockSizeKB' => 32,
|
'TimestampFormat' => 0,
|
||||||
'allowDataCompression' => 1,
|
'ConvertDateTimeToChar' => 0,
|
||||||
'concurrency' => 0,
|
'BLOCKFETCH' => 1,
|
||||||
'lazyClose' => 0,
|
'BlockSizeKB' => 32,
|
||||||
'maxFieldLength' => 15360,
|
'AllowDataCompression' => 1,
|
||||||
'prefetch' => 0,
|
'CONCURRENCY' => 0,
|
||||||
'queryTimeout' => 1,
|
'LAZYCLOSE' => 0,
|
||||||
// Modules settings
|
'MaxFieldLength' => 15360,
|
||||||
'defaultPkgLibrary' => 'QGPL',
|
'PREFETCH' => 0,
|
||||||
'defaultPackage' => 'A/DEFAULT(IBM),2,0,1,0',
|
'QUERYTIMEOUT' => 1,
|
||||||
'extendedDynamic' => 1,
|
'DefaultPkgLibrary' => 'QGPL',
|
||||||
// Diagnostic settings
|
'DefaultPackage' => 'A /DEFAULT(IBM),2,0,1,0',
|
||||||
|
'ExtendedDynamic' => 0,
|
||||||
'QAQQINILibrary' => '',
|
'QAQQINILibrary' => '',
|
||||||
'sqDiagCode' => '',
|
'SQDIAGCODE' => '',
|
||||||
// Sort settings
|
'LANGUAGEID' => 'ENU',
|
||||||
'languageId' => 'ENU',
|
'SORTTABLE' => '',
|
||||||
'sortTable' => '',
|
'SortSequence' => 0,
|
||||||
'sortSequence' => 0,
|
'SORTWEIGHT' => 0,
|
||||||
'sortWeight' => 0,
|
'AllowUnsupportedChar' => 0,
|
||||||
'jobSort' => 0,
|
'CCSID' => 819,
|
||||||
// Conversion settings
|
'GRAPHIC' => 0,
|
||||||
'allowUnsupportedChar' => 0,
|
'ForceTranslation' => 0,
|
||||||
'ccsid' => 1208,
|
'ALLOWPROCCALLS' => 0,
|
||||||
'graphic' => 0,
|
'DB2SQLSTATES' => 0,
|
||||||
'forceTranslation' => 0,
|
'DEBUG' => 0,
|
||||||
// Other settings
|
'TRUEAUTOCOMMIT' => 0,
|
||||||
'allowProcCalls' => 0,
|
'CATALOGOPTIONS' => 3,
|
||||||
'DB2SqlStates' => 0,
|
'LibraryView' => 0,
|
||||||
'debug' => 0,
|
|
||||||
'trueAutoCommit' => 0,
|
|
||||||
'catalogOptions' => 3,
|
|
||||||
'libraryView' => 0,
|
|
||||||
'ODBCRemarks' => 0,
|
'ODBCRemarks' => 0,
|
||||||
'searchPattern' => 1,
|
'SEARCHPATTERN' => 1,
|
||||||
'translationDLL' => '',
|
'TranslationDLL' => '',
|
||||||
'translationOption' => 0,
|
'TranslationOption' => 0,
|
||||||
'maxTraceSize' => 0,
|
'MAXTRACESIZE' => 0,
|
||||||
'multipleTraceFiles' => 1,
|
'MultipleTraceFiles' => 1,
|
||||||
'trace' => 0,
|
'TRACE' => 0,
|
||||||
'traceFilename' => '',
|
'TRACEFILENAME' => '',
|
||||||
'extendedColInfo' => 0,
|
'ExtendedColInfo' => 0,
|
||||||
|
],
|
||||||
'options' => [
|
'options' => [
|
||||||
PDO::ATTR_CASE => PDO::CASE_LOWER,
|
PDO::ATTR_CASE => PDO::CASE_LOWER,
|
||||||
PDO::ATTR_EMULATE_PREPARES => false,
|
PDO::ATTR_PERSISTENT => false,
|
||||||
PDO::ATTR_PERSISTENT => false
|
PDO::I5_ATTR_DBC_SYS_NAMING => false,
|
||||||
|
PDO::I5_ATTR_COMMIT => PDO::I5_TXN_NO_COMMIT,
|
||||||
|
PDO::I5_ATTR_JOB_SORT => false,
|
||||||
|
PDO::I5_ATTR_DBC_LIBL => '',
|
||||||
|
PDO::I5_ATTR_DBC_CURLIB => '',
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
|
||||||
```
|
```
|
||||||
driver setting is either 'odbc' for ODBC connection or 'ibm' for pdo_ibm connection
|
driver setting can be:
|
||||||
Then if driver is 'odbc', database must be set to ODBC connection name.
|
- 'db2_ibmi_odbc' for IBMi ODBC connection
|
||||||
if driver is 'ibm', database must be set to IBMi database name (WRKRDBDIRE).
|
- 'db2_ibmi_ibm' for IBMi PDO_IBM connection
|
||||||
|
- 'db2_zos_odbc' for zOS ODBC connection
|
||||||
|
- 'db2_expressc_odbc for Express-C ODBC connection
|
||||||
|
|
||||||
|
Then if driver is 'db2_*_odbc', database must be set to ODBC connection name.
|
||||||
|
if driver is 'db2_ibmi_ibm', database must be set to IBMi database name (WRKRDBDIRE).
|
||||||
|
|
||||||
#### Option 2: Configure DB2 using package config file
|
#### Option 2: Configure DB2 using package config file
|
||||||
|
|
||||||
Run on the command line from the root of your project:
|
Run on the command line from the root of your project:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ php artisan config:publish cooperl/laravel-db2
|
$ php artisan vendor:publish
|
||||||
```
|
```
|
||||||
|
|
||||||
Set your laravel-db2 credentials in ``app/config/packages/cooperl/laravel-db2/config.php``
|
Set your laravel-db2 credentials in ``app/config/db2.php``
|
||||||
the same way as above
|
the same way as above
|
||||||
|
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
Consult the [Laravel framework documentation](http://laravel.com/docs).
|
Consult the [Laravel framework documentation](http://laravel.com/docs).
|
||||||
|
35
src/Connectors/DB2Connector.php
Normal file
35
src/Connectors/DB2Connector.php
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Cooperl\Database\DB2\Connectors;
|
||||||
|
|
||||||
|
use Illuminate\Database\Connectors\Connector;
|
||||||
|
use Illuminate\Database\Connectors\ConnectorInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class IBMConnector
|
||||||
|
*
|
||||||
|
* @package Cooperl\Database\DB2\Connectors
|
||||||
|
*/
|
||||||
|
class DB2Connector extends Connector implements ConnectorInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @param array $config
|
||||||
|
*
|
||||||
|
* @return \PDO
|
||||||
|
*/
|
||||||
|
public function connect(array $config)
|
||||||
|
{
|
||||||
|
$dsn = $this->getDsn($config);
|
||||||
|
$options = $this->getOptions($config);
|
||||||
|
$connection = $this->createConnection($dsn, $config, $options);
|
||||||
|
|
||||||
|
if (isset($config['schema'])) {
|
||||||
|
$schema = $config['schema'];
|
||||||
|
|
||||||
|
$connection->prepare('set schema ' . $schema)
|
||||||
|
->execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
return $connection;
|
||||||
|
}
|
||||||
|
}
|
@ -2,93 +2,13 @@
|
|||||||
|
|
||||||
namespace Cooperl\Database\DB2\Connectors;
|
namespace Cooperl\Database\DB2\Connectors;
|
||||||
|
|
||||||
use Illuminate\Database\Connectors\Connector;
|
|
||||||
use Illuminate\Database\Connectors\ConnectorInterface;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class IBMConnector
|
* Class IBMConnector
|
||||||
*
|
*
|
||||||
* @package Cooperl\Database\DB2\Connectors
|
* @package Cooperl\Database\DB2\Connectors
|
||||||
*/
|
*/
|
||||||
class IBMConnector extends Connector implements ConnectorInterface
|
class IBMConnector extends DB2Connector
|
||||||
{
|
{
|
||||||
/**
|
|
||||||
* @param array $config
|
|
||||||
*
|
|
||||||
* @return \PDO
|
|
||||||
*/
|
|
||||||
public function connect(array $config)
|
|
||||||
{
|
|
||||||
$dsn = $this->getDsn($config);
|
|
||||||
$options = [
|
|
||||||
\PDO::I5_ATTR_DBC_SYS_NAMING => false,
|
|
||||||
\PDO::I5_ATTR_COMMIT => \PDO::I5_TXN_NO_COMMIT,
|
|
||||||
\PDO::I5_ATTR_JOB_SORT => false,
|
|
||||||
];
|
|
||||||
|
|
||||||
// Naming mode
|
|
||||||
switch ($config['naming']) {
|
|
||||||
case 1:
|
|
||||||
$options[\PDO::I5_ATTR_DBC_SYS_NAMING] = true;
|
|
||||||
|
|
||||||
break;
|
|
||||||
case 0:
|
|
||||||
default:
|
|
||||||
$options[\PDO::I5_ATTR_DBC_SYS_NAMING] = false;
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Isolation mode
|
|
||||||
switch ($config['commitMode']) {
|
|
||||||
case 1:
|
|
||||||
$options[\PDO::I5_ATTR_COMMIT] = \PDO::I5_TXN_READ_COMMITTED;
|
|
||||||
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
$options[\PDO::I5_ATTR_COMMIT] = \PDO::I5_TXN_READ_UNCOMMITTED;
|
|
||||||
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
$options[\PDO::I5_ATTR_COMMIT] = \PDO::I5_TXN_REPEATABLE_READ;
|
|
||||||
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
$options[\PDO::I5_ATTR_COMMIT] = \PDO::I5_TXN_SERIALIZABLE;
|
|
||||||
|
|
||||||
break;
|
|
||||||
case 0:
|
|
||||||
default:
|
|
||||||
$options[PDO::I5_ATTR_COMMIT] = PDO::I5_TXN_NO_COMMIT;
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Job sort mode
|
|
||||||
switch ($config['jobSort']) {
|
|
||||||
case 1:
|
|
||||||
$options[\PDO::I5_ATTR_DBC_SYS_NAMING] = true;
|
|
||||||
|
|
||||||
break;
|
|
||||||
case 0:
|
|
||||||
default:
|
|
||||||
$options[\PDO::I5_ATTR_DBC_SYS_NAMING] = false;
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
$options = $this->getOptions($config) + $options;
|
|
||||||
$connection = $this->createConnection($dsn, $config, $options);
|
|
||||||
|
|
||||||
if (isset($config['schema'])) {
|
|
||||||
$schema = $config['schema'];
|
|
||||||
|
|
||||||
$connection->prepare("set schema $schema")->execute();
|
|
||||||
}
|
|
||||||
|
|
||||||
return $connection;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param array $config
|
* @param array $config
|
||||||
*
|
*
|
||||||
|
@ -2,37 +2,13 @@
|
|||||||
|
|
||||||
namespace Cooperl\Database\DB2\Connectors;
|
namespace Cooperl\Database\DB2\Connectors;
|
||||||
|
|
||||||
use Illuminate\Database\Connectors\Connector;
|
|
||||||
use Illuminate\Database\Connectors\ConnectorInterface;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class ODBCConnector
|
* Class ODBCConnector
|
||||||
*
|
*
|
||||||
* @package Cooperl\Database\DB2\Connectors
|
* @package Cooperl\Database\DB2\Connectors
|
||||||
*/
|
*/
|
||||||
class ODBCConnector extends Connector implements ConnectorInterface
|
class ODBCConnector extends DB2Connector
|
||||||
{
|
{
|
||||||
|
|
||||||
/**
|
|
||||||
* @param array $config
|
|
||||||
*
|
|
||||||
* @return \PDO
|
|
||||||
*/
|
|
||||||
public function connect(array $config)
|
|
||||||
{
|
|
||||||
$dsn = $this->getDsn($config);
|
|
||||||
$options = $this->getOptions($config);
|
|
||||||
$connection = $this->createConnection($dsn, $config, $options);
|
|
||||||
|
|
||||||
if (isset($config['schema'])) {
|
|
||||||
$schema = $config['schema'];
|
|
||||||
|
|
||||||
$connection->prepare('set schema '.$schema)->execute();
|
|
||||||
}
|
|
||||||
|
|
||||||
return $connection;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param array $config
|
* @param array $config
|
||||||
*
|
*
|
||||||
@ -40,73 +16,33 @@ class ODBCConnector extends Connector implements ConnectorInterface
|
|||||||
*/
|
*/
|
||||||
protected function getDsn(array $config)
|
protected function getDsn(array $config)
|
||||||
{
|
{
|
||||||
extract($config);
|
$dsnParts = [
|
||||||
|
'odbc:DRIVER=%s',
|
||||||
|
'System=%s',
|
||||||
|
'Database=%s',
|
||||||
|
'UserID=%s',
|
||||||
|
'Password=%s',
|
||||||
|
];
|
||||||
|
|
||||||
$dsn = "odbc:"
|
$dsnConfig = [
|
||||||
// General settings
|
$config['driverName'],
|
||||||
. "DRIVER=$driverName;"
|
$config['host'],
|
||||||
. "SYSTEM=$host;"
|
$config['database'],
|
||||||
. "UserID=$username;"
|
$config['username'],
|
||||||
. "Password=$password;"
|
$config['password'],
|
||||||
//Server settings
|
];
|
||||||
. "DATABASE=$database;"
|
|
||||||
. "SIGNON=$signon;"
|
|
||||||
. "SSL=$ssl;"
|
|
||||||
. "CommitMode=$commitMode;"
|
|
||||||
. "ConnectionType=$connectionType;"
|
|
||||||
. "DefaultLibraries=$defaultLibraries;"
|
|
||||||
. "Naming=$naming;"
|
|
||||||
. "UNICODESQL=$unicodeSql;"
|
|
||||||
// Format settings
|
|
||||||
. "DateFormat=$dateFormat;"
|
|
||||||
. "DateSeperator=$dateSeperator;"
|
|
||||||
. "Decimal=$decimal;"
|
|
||||||
. "TimeFormat=$timeFormat;"
|
|
||||||
. "TimeSeparator=$timeSeparator;"
|
|
||||||
// Performances settings
|
|
||||||
. "BLOCKFETCH=$blockFetch;"
|
|
||||||
. "BlockSizeKB=$blockSizeKB;"
|
|
||||||
. "AllowDataCompression=$allowDataCompression;"
|
|
||||||
. "CONCURRENCY=$concurrency;"
|
|
||||||
. "LAZYCLOSE=$lazyClose;"
|
|
||||||
. "MaxFieldLength=$maxFieldLength;"
|
|
||||||
. "PREFETCH=$prefetch;"
|
|
||||||
. "QUERYTIMEOUT=$queryTimeout;"
|
|
||||||
// Modules settings
|
|
||||||
. "DefaultPkgLibrary=$defaultPkgLibrary;"
|
|
||||||
. "DefaultPackage=$defaultPackage;"
|
|
||||||
. "ExtendedDynamic=$extendedDynamic;"
|
|
||||||
// Diagnostic settings
|
|
||||||
. "QAQQINILibrary=$QAQQINILibrary;"
|
|
||||||
. "SQDIAGCODE=$sqDiagCode;"
|
|
||||||
// Sort settings
|
|
||||||
. "LANGUAGEID=$languageId;"
|
|
||||||
. "SORTTABLE=$sortTable;"
|
|
||||||
. "SortSequence=$sortSequence;"
|
|
||||||
. "SORTWEIGHT=$sortWeight;"
|
|
||||||
// Conversion settings
|
|
||||||
. "AllowUnsupportedChar=$allowUnsupportedChar;"
|
|
||||||
. "CCSID=$ccsid;"
|
|
||||||
. "GRAPHIC=$graphic;"
|
|
||||||
. "ForceTranslation=$forceTranslation;"
|
|
||||||
// Other settings
|
|
||||||
. "ALLOWPROCCALLS=$allowProcCalls;"
|
|
||||||
. "DB2SQLSTATES=$DB2SqlStates;"
|
|
||||||
. "DEBUG=$debug;"
|
|
||||||
. "TRUEAUTOCOMMIT=$trueAutoCommit;"
|
|
||||||
. "CATALOGOPTIONS=$catalogOptions;"
|
|
||||||
. "LibraryView=$libraryView;"
|
|
||||||
. "ODBCRemarks=$ODBCRemarks;"
|
|
||||||
. "SEARCHPATTERN=$searchPattern;"
|
|
||||||
. "TranslationDLL=$translationDLL;"
|
|
||||||
. "TranslationOption=$translationOption;"
|
|
||||||
. "MAXTRACESIZE=$maxTraceSize;"
|
|
||||||
. "MultipleTraceFiles=$multipleTraceFiles;"
|
|
||||||
. "TRACE=$trace;"
|
|
||||||
. "TRACEFILENAME=$traceFilename;"
|
|
||||||
. "ExtendedColInfo=$extendedColInfo;"
|
|
||||||
;
|
|
||||||
|
|
||||||
return $dsn;
|
if (array_key_exists('odbc_keywords', $config)) {
|
||||||
|
$odbcKeywords = $config['odbc_keywords'];
|
||||||
|
$parts = array_map(function($part) {
|
||||||
|
return $part . '=%s';
|
||||||
|
}, array_keys($odbcKeywords));
|
||||||
|
$config = array_values($odbcKeywords);
|
||||||
|
|
||||||
|
$dsnParts = array_merge($dsnParts, $parts);
|
||||||
|
$dsnConfig = array_merge($dsnConfig, $config);
|
||||||
|
}
|
||||||
|
|
||||||
|
return sprintf(implode(';', $dsnParts), ...$dsnConfig);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -25,7 +25,6 @@ class DB2Connection extends Connection
|
|||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
protected $defaultSchema;
|
protected $defaultSchema;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The name of the current schema in use.
|
* The name of the current schema in use.
|
||||||
*
|
*
|
||||||
@ -91,7 +90,13 @@ class DB2Connection extends Connection
|
|||||||
*/
|
*/
|
||||||
protected function getDefaultQueryGrammar()
|
protected function getDefaultQueryGrammar()
|
||||||
{
|
{
|
||||||
return $this->withTablePrefix(new QueryGrammar());
|
$defaultGrammar = new QueryGrammar;
|
||||||
|
|
||||||
|
if (array_key_exists('date_format', $this->config)) {
|
||||||
|
$defaultGrammar->setDateFormat($this->config['date_format']);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->withTablePrefix($defaultGrammar);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -101,7 +106,16 @@ class DB2Connection extends Connection
|
|||||||
*/
|
*/
|
||||||
protected function getDefaultSchemaGrammar()
|
protected function getDefaultSchemaGrammar()
|
||||||
{
|
{
|
||||||
return $this->withTablePrefix(new SchemaGrammar($this->config['driver'] == 'odbc' ? 'i' : 'c'));
|
switch ($this->config['driver']) {
|
||||||
|
case 'db2_expressc_odbc':
|
||||||
|
$defaultGrammar = $this->withTablePrefix(new DB2ExpressCGrammar);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$defaultGrammar = $this->withTablePrefix(new SchemaGrammar);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $defaultGrammar;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -111,10 +125,15 @@ class DB2Connection extends Connection
|
|||||||
*/
|
*/
|
||||||
protected function getDefaultPostProcessor()
|
protected function getDefaultPostProcessor()
|
||||||
{
|
{
|
||||||
if ($this->config['driver'] == 'odbczos') {
|
switch ($this->config['driver']) {
|
||||||
return new DB2ZOSProcessor();
|
case 'db2_zos_odbc':
|
||||||
|
$defaultProcessor = new DB2ZOSProcessor;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$defaultProcessor = new DB2Processor;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return new DB2Processor($this->config['driver'] == 'odbc' ? 'i' : 'c');
|
return $defaultProcessor;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -28,6 +28,9 @@ class DB2ServiceProvider extends ServiceProvider
|
|||||||
*/
|
*/
|
||||||
public function boot()
|
public function boot()
|
||||||
{
|
{
|
||||||
|
$this->publishes([
|
||||||
|
__DIR__ . '/config/config.php' => config_path('db2.php'),
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -38,7 +41,7 @@ class DB2ServiceProvider extends ServiceProvider
|
|||||||
public function register()
|
public function register()
|
||||||
{
|
{
|
||||||
// get the configs
|
// get the configs
|
||||||
$conns = is_array(config('laravel-db2::database.connections')) ? config('laravel-db2::database.connections') : [];
|
$conns = is_array(config('db2.connections')) ? config('db2.connections') : [];
|
||||||
|
|
||||||
// Add my database configurations to the default set of configurations
|
// Add my database configurations to the default set of configurations
|
||||||
config(['database.connections' => array_merge($conns, config('database.connections'))]);
|
config(['database.connections' => array_merge($conns, config('database.connections'))]);
|
||||||
@ -46,26 +49,31 @@ class DB2ServiceProvider extends ServiceProvider
|
|||||||
// Extend the connections with pdo_odbc and pdo_ibm drivers
|
// Extend the connections with pdo_odbc and pdo_ibm drivers
|
||||||
foreach (config('database.connections') as $conn => $config) {
|
foreach (config('database.connections') as $conn => $config) {
|
||||||
// Only use configurations that feature a "odbc", "ibm" or "odbczos" driver
|
// Only use configurations that feature a "odbc", "ibm" or "odbczos" driver
|
||||||
if (!isset($config['driver']) || !in_array($config['driver'], ['odbc', 'ibm', 'odbczos', 'odbcexpress'])) {
|
if (!isset($config['driver']) || !in_array($config['driver'], [
|
||||||
|
'db2_ibmi_odbc',
|
||||||
|
'db2_ibmi_ibm',
|
||||||
|
'db2_zos_odbc',
|
||||||
|
'db2_expressc_odbc',
|
||||||
|
])
|
||||||
|
) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create a connector
|
// Create a connector
|
||||||
$this->app['db']->extend($conn, function($config) {
|
$this->app['db']->extend($conn, function($config) {
|
||||||
switch ($config['driver']) {
|
switch ($config['driver']) {
|
||||||
case 'odbcexpress':
|
case 'db2_expressc_odbc':
|
||||||
case 'odbc':
|
case 'db2_ibmi_odbc':
|
||||||
$connector = new ODBCConnector();
|
$connector = new ODBCConnector();
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case 'odbczos':
|
|
||||||
|
case 'db2_zos_odbc':
|
||||||
$connector = new ODBCZOSConnector();
|
$connector = new ODBCZOSConnector();
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case 'ibm':
|
|
||||||
|
case 'db2_ibmi_ibm':
|
||||||
default:
|
default:
|
||||||
$connector = new IBMConnector();
|
$connector = new IBMConnector();
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,6 +12,13 @@ use Illuminate\Database\Query\Builder;
|
|||||||
*/
|
*/
|
||||||
class DB2Grammar extends Grammar
|
class DB2Grammar extends Grammar
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* The format for database stored dates.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $dateFormat;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Wrap a single string in keyword identifiers.
|
* Wrap a single string in keyword identifiers.
|
||||||
*
|
*
|
||||||
@ -179,6 +186,16 @@ class DB2Grammar extends Grammar
|
|||||||
*/
|
*/
|
||||||
public function getDateFormat()
|
public function getDateFormat()
|
||||||
{
|
{
|
||||||
return 'Y-m-d H:i:s.u';
|
return $this->dateFormat ?? parent::getDateFormat();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the format for database stored dates.
|
||||||
|
*
|
||||||
|
* @param $dateFormat
|
||||||
|
*/
|
||||||
|
public function setDateFormat($dateFormat)
|
||||||
|
{
|
||||||
|
$this->dateFormat = $dateFormat;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,44 +13,6 @@ use Cooperl\Database\DB2\Query\Grammars\DB2Grammar;
|
|||||||
*/
|
*/
|
||||||
class DB2Processor extends Processor
|
class DB2Processor extends Processor
|
||||||
{
|
{
|
||||||
|
|
||||||
private $bdType;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* DB2Processor constructor.
|
|
||||||
*
|
|
||||||
* @param $bdType
|
|
||||||
*/
|
|
||||||
public function __construct($bdType)
|
|
||||||
{
|
|
||||||
$this->bdType = $bdType;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Process the results of a "select" query.
|
|
||||||
*
|
|
||||||
* @param \Illuminate\Database\Query\Builder $query
|
|
||||||
* @param array $results
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
/*public function processSelect(Builder $query, $results)
|
|
||||||
{
|
|
||||||
$results = array_map(function($result) {
|
|
||||||
foreach (get_object_vars($result) as $field => $value) {
|
|
||||||
if (is_string($value))
|
|
||||||
{
|
|
||||||
$result->$field = trim(preg_split('/[^\r\n\t\x20-\x7E\xA0-\xFF]/', $value)[0]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $result;
|
|
||||||
}, $results);
|
|
||||||
|
|
||||||
return $results;
|
|
||||||
}*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Process an "insert get ID" query.
|
* Process an "insert get ID" query.
|
||||||
*
|
*
|
||||||
@ -66,14 +28,15 @@ class DB2Processor extends Processor
|
|||||||
$sequenceStr = $sequence ?: 'id';
|
$sequenceStr = $sequence ?: 'id';
|
||||||
|
|
||||||
if (is_array($sequence)) {
|
if (is_array($sequence)) {
|
||||||
$grammar = new DB2Grammar($this->bdType);
|
$grammar = new DB2Grammar;
|
||||||
$sequenceStr = $grammar->columnize($sequence);
|
$sequenceStr = $grammar->columnize($sequence);
|
||||||
}
|
}
|
||||||
|
|
||||||
$sql = 'select ' . $sequenceStr . ' from new table (' . $sql;
|
$sqlStr = 'select %s from new table (%s)';
|
||||||
$sql .= ')';
|
|
||||||
|
$finalSql = sprintf($sqlStr, $sequenceStr, $sql);
|
||||||
$results = $query->getConnection()
|
$results = $query->getConnection()
|
||||||
->select($sql, $values);
|
->select($finalSql, $values);
|
||||||
|
|
||||||
if (is_array($sequence)) {
|
if (is_array($sequence)) {
|
||||||
return array_values((array) $results[0]);
|
return array_values((array) $results[0]);
|
||||||
|
@ -28,14 +28,15 @@ class DB2ZOSProcessor extends Processor
|
|||||||
$sequenceStr = $sequence ?: 'id';
|
$sequenceStr = $sequence ?: 'id';
|
||||||
|
|
||||||
if (is_array($sequence)) {
|
if (is_array($sequence)) {
|
||||||
$grammar = new DB2Grammar("z");
|
$grammar = new DB2Grammar;
|
||||||
$sequenceStr = $grammar->columnize($sequence);
|
$sequenceStr = $grammar->columnize($sequence);
|
||||||
}
|
}
|
||||||
|
|
||||||
$sqlStr = 'select %s from final table (%s)';
|
$sqlStr = 'select %s from final table (%s)';
|
||||||
|
|
||||||
$finalSql = sprintf($sqlStr, $sequenceStr, $sql);
|
$finalSql = sprintf($sqlStr, $sequenceStr, $sql);
|
||||||
$results = $query->getConnection()->select($finalSql, $values);
|
$results = $query->getConnection()
|
||||||
|
->select($finalSql, $values);
|
||||||
|
|
||||||
if (is_array($sequence)) {
|
if (is_array($sequence)) {
|
||||||
return array_values((array) $results[0]);
|
return array_values((array) $results[0]);
|
||||||
|
32
src/Schema/Grammars/DB2ExpressCGrammar.php
Normal file
32
src/Schema/Grammars/DB2ExpressCGrammar.php
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Cooperl\Database\DB2\Schema\Grammars;
|
||||||
|
|
||||||
|
use Illuminate\Database\Query\Expression;
|
||||||
|
use Illuminate\Support\Fluent;
|
||||||
|
use Illuminate\Database\Connection;
|
||||||
|
use Illuminate\Database\Schema\Grammars\Grammar;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
|
||||||
|
class DB2ExpressCGrammar extends DB2Grammar
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Compile the query to determine the list of tables.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function compileTableExists()
|
||||||
|
{
|
||||||
|
return 'select * from syspublic.all_tables where table_schema = upper(?) and table_name = upper(?)';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compile the query to determine the list of columns.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function compileColumnExists()
|
||||||
|
{
|
||||||
|
return 'select column_name from syspublic.all_ind_columns where table_schema = upper(?) and table_name = upper(?)';
|
||||||
|
}
|
||||||
|
}
|
@ -70,11 +70,7 @@ class DB2Grammar extends Grammar
|
|||||||
*/
|
*/
|
||||||
public function compileTableExists()
|
public function compileTableExists()
|
||||||
{
|
{
|
||||||
if ($this->dbType == "i") {
|
|
||||||
return 'select * from information_schema.tables where table_schema = upper(?) and table_name = upper(?)';
|
return 'select * from information_schema.tables where table_schema = upper(?) and table_name = upper(?)';
|
||||||
} else {
|
|
||||||
return 'select * from syspublic.all_tables where table_schema = upper(?) and table_name = upper(?)';
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -84,21 +80,7 @@ class DB2Grammar extends Grammar
|
|||||||
*/
|
*/
|
||||||
public function compileColumnExists()
|
public function compileColumnExists()
|
||||||
{
|
{
|
||||||
if ($this->dbType == "i") {
|
return 'select column_name from information_schema.columns where table_schema = upper(?) and table_name = upper(?)';
|
||||||
return "
|
|
||||||
select column_name
|
|
||||||
from information_schema.columns
|
|
||||||
where table_schema = upper(?)
|
|
||||||
and table_name = upper(?)
|
|
||||||
";
|
|
||||||
} else {
|
|
||||||
return "
|
|
||||||
select column_name
|
|
||||||
from syspublic.all_ind_columns
|
|
||||||
where table_schema = upper(?)
|
|
||||||
and table_name = upper(?)
|
|
||||||
";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -54,6 +54,21 @@ PDO::CASE_LOWER
|
|||||||
PDO::CASE_UPPER
|
PDO::CASE_UPPER
|
||||||
PDO::CASE_NATURAL
|
PDO::CASE_NATURAL
|
||||||
|
|
||||||
|
* PDO::I5_ATTR_DBC_SYS_NAMING
|
||||||
|
true
|
||||||
|
false
|
||||||
|
|
||||||
|
* PDO::I5_ATTR_COMMIT
|
||||||
|
PDO::I5_TXN_READ_COMMITTED
|
||||||
|
PDO::I5_TXN_READ_UNCOMMITTED
|
||||||
|
PDO::I5_TXN_REPEATABLE_READ
|
||||||
|
PDO::I5_TXN_SERIALIZABLE
|
||||||
|
PDO::I5_TXN_NO_COMMIT
|
||||||
|
|
||||||
|
* PDO::I5_ATTR_DBC_LIBL
|
||||||
|
,
|
||||||
|
* PDO::I5_ATTR_DBC_CURLIB,
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
return [
|
return [
|
||||||
@ -61,91 +76,81 @@ return [
|
|||||||
'connections' => [
|
'connections' => [
|
||||||
|
|
||||||
'ibmi' => [
|
'ibmi' => [
|
||||||
'driver' => 'odbc' / 'ibm' / 'odbczos',
|
'driver' => 'db2_ibmi_odbc',
|
||||||
'driverName' => '{IBM i Access ODBC Driver}' / '{iSeries Access ODBC Driver}',
|
// or 'db2_ibmi_ibm' / 'db2_zos_odbc' / 'db2_expressc_odbc
|
||||||
// General settings
|
'driverName' => '{IBM i Access ODBC Driver}',
|
||||||
|
// or '{iSeries Access ODBC Driver}' '{IBM i Access ODBC Driver 64-bit}'
|
||||||
'host' => 'server',
|
'host' => 'server',
|
||||||
'username' => '',
|
'username' => '',
|
||||||
'password' => '',
|
'password' => '',
|
||||||
//Server settings
|
|
||||||
'database' => 'WRKRDBDIRE entry',
|
'database' => 'WRKRDBDIRE entry',
|
||||||
'prefix' => '',
|
'prefix' => '',
|
||||||
'schema' => 'default schema',
|
'schema' => 'default schema',
|
||||||
'port' => 50000,
|
'port' => 50000,
|
||||||
'signon' => 3,
|
'date_format' => 'Y-m-d H:i:s',
|
||||||
'ssl' => 0,
|
'odbc_keywords' => [
|
||||||
'commitMode' => 2,
|
'SIGNON' => 3,
|
||||||
'connectionType' => 0,
|
'SSL' => 0,
|
||||||
'defaultLibraries' => '',
|
'CommitMode' => 2,
|
||||||
'naming' => 0,
|
'ConnectionType' => 0,
|
||||||
'unicodeSql' => 0,
|
'DefaultLibraries' => '',
|
||||||
// Format settings
|
'Naming' => 0,
|
||||||
'dateFormat' => 5,
|
'UNICODESQL' => 0,
|
||||||
'dateSeperator' => 0,
|
'DateFormat' => 5,
|
||||||
'decimal' => 0,
|
'DateSeperator' => 0,
|
||||||
'timeFormat' => 0,
|
'Decimal' => 0,
|
||||||
'timeSeparator' => 0,
|
'TimeFormat' => 0,
|
||||||
// Performances settings
|
'TimeSeparator' => 0,
|
||||||
'blockFetch' => 1,
|
'TimestampFormat' => 0,
|
||||||
'blockSizeKB' => 32,
|
'ConvertDateTimeToChar' => 0,
|
||||||
'allowDataCompression' => 1,
|
'BLOCKFETCH' => 1,
|
||||||
'concurrency' => 0,
|
'BlockSizeKB' => 32,
|
||||||
'lazyClose' => 0,
|
'AllowDataCompression' => 1,
|
||||||
'maxFieldLength' => 15360,
|
'CONCURRENCY' => 0,
|
||||||
'prefetch' => 0,
|
'LAZYCLOSE' => 0,
|
||||||
'queryTimeout' => 1,
|
'MaxFieldLength' => 15360,
|
||||||
// Modules settings
|
'PREFETCH' => 0,
|
||||||
'defaultPkgLibrary' => 'QGPL',
|
'QUERYTIMEOUT' => 1,
|
||||||
'defaultPackage' => 'A/DEFAULT(IBM),2,0,1,0',
|
'DefaultPkgLibrary' => 'QGPL',
|
||||||
'extendedDynamic' => 1,
|
'DefaultPackage' => 'A /DEFAULT(IBM),2,0,1,0',
|
||||||
// Diagnostic settings
|
'ExtendedDynamic' => 0,
|
||||||
'QAQQINILibrary' => '',
|
'QAQQINILibrary' => '',
|
||||||
'sqDiagCode' => '',
|
'SQDIAGCODE' => '',
|
||||||
// Sort settings
|
'LANGUAGEID' => 'ENU',
|
||||||
'languageId' => 'ENU',
|
'SORTTABLE' => '',
|
||||||
'sortTable' => '',
|
'SortSequence' => 0,
|
||||||
'sortSequence' => 0,
|
'SORTWEIGHT' => 0,
|
||||||
'sortWeight' => 0,
|
'AllowUnsupportedChar' => 0,
|
||||||
'jobSort' => 0,
|
'CCSID' => 819,
|
||||||
// Conversion settings
|
'GRAPHIC' => 0,
|
||||||
'allowUnsupportedChar' => 0,
|
'ForceTranslation' => 0,
|
||||||
'ccsid' => 1208,
|
'ALLOWPROCCALLS' => 0,
|
||||||
'graphic' => 0,
|
'DB2SQLSTATES' => 0,
|
||||||
'forceTranslation' => 0,
|
'DEBUG' => 0,
|
||||||
// Other settings
|
'TRUEAUTOCOMMIT' => 0,
|
||||||
'allowProcCalls' => 0,
|
'CATALOGOPTIONS' => 3,
|
||||||
'DB2SqlStates' => 0,
|
'LibraryView' => 0,
|
||||||
'debug' => 0,
|
|
||||||
'trueAutoCommit' => 0,
|
|
||||||
'catalogOptions' => 3,
|
|
||||||
'libraryView' => 0,
|
|
||||||
'ODBCRemarks' => 0,
|
'ODBCRemarks' => 0,
|
||||||
'searchPattern' => 1,
|
'SEARCHPATTERN' => 1,
|
||||||
'translationDLL' => '',
|
'TranslationDLL' => '',
|
||||||
'translationOption' => 0,
|
'TranslationOption' => 0,
|
||||||
'maxTraceSize' => 0,
|
'MAXTRACESIZE' => 0,
|
||||||
'multipleTraceFiles' => 1,
|
'MultipleTraceFiles' => 1,
|
||||||
'trace' => 0,
|
'TRACE' => 0,
|
||||||
'traceFilename' => '',
|
'TRACEFILENAME' => '',
|
||||||
'extendedColInfo' => 0,
|
'ExtendedColInfo' => 0,
|
||||||
|
],
|
||||||
'options' => [
|
'options' => [
|
||||||
PDO::ATTR_CASE => PDO::CASE_LOWER,
|
PDO::ATTR_CASE => PDO::CASE_LOWER,
|
||||||
PDO::ATTR_EMULATE_PREPARES => false,
|
PDO::ATTR_PERSISTENT => false,
|
||||||
PDO::ATTR_PERSISTENT => false
|
PDO::I5_ATTR_DBC_SYS_NAMING => false,
|
||||||
|
PDO::I5_ATTR_COMMIT => PDO::I5_TXN_NO_COMMIT,
|
||||||
|
PDO::I5_ATTR_JOB_SORT => false,
|
||||||
|
PDO::I5_ATTR_DBC_LIBL => '',
|
||||||
|
PDO::I5_ATTR_DBC_CURLIB => '',
|
||||||
],
|
],
|
||||||
'toolkit' => [
|
|
||||||
'XMLServiceLib' => 'XMLSERVICE',
|
|
||||||
'debug' => false,
|
|
||||||
'debugLogFile' => storage_path() . '/logs/toolkit.log',
|
|
||||||
'InternalKey' => '/tmp/' . 'Toolkit_' . app()->environment() . '_' . rand(1, 10),
|
|
||||||
'stateless' => false,
|
|
||||||
'plugSize' => '4K',
|
|
||||||
'ccsidBefore' => "819/1147",
|
|
||||||
'ccsidAfter' => "1147/819",
|
|
||||||
'useHex' => true
|
|
||||||
]
|
|
||||||
],
|
],
|
||||||
|
|
||||||
]
|
],
|
||||||
|
|
||||||
];
|
];
|
||||||
|
Loading…
Reference in New Issue
Block a user