Refactoring
This commit is contained in:
parent
dd6771f8fe
commit
0b0a2a5201
166
README.md
166
README.md
@ -43,7 +43,11 @@ Add the laravel-db2 Service Provider to your config in ``app/config/app.php``:
|
||||
|
||||
### 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
|
||||
|
||||
@ -57,97 +61,103 @@ Simply add this code at the end of your ``app/config/database.php`` file:
|
||||
*/
|
||||
|
||||
'ibmi' => [
|
||||
'driver' => 'odbc' / 'ibm' / 'odbczos',
|
||||
'driverName' => '{IBM i Access ODBC Driver}' / '{iSeries Access ODBC Driver}',
|
||||
// General settings
|
||||
'host' => 'server',
|
||||
'username' => '',
|
||||
'password' => '',
|
||||
//Server settings
|
||||
'database' => 'WRKRDBDIRE entry',
|
||||
'prefix' => '',
|
||||
'schema' => 'default schema',
|
||||
'port' => 50000,
|
||||
'signon' => 3,
|
||||
'ssl' => 0,
|
||||
'commitMode' => 2,
|
||||
'connectionType' => 0,
|
||||
'defaultLibraries' => '',
|
||||
'naming' => 0,
|
||||
'unicodeSql' => 0,
|
||||
// Format settings
|
||||
'dateFormat' => 5,
|
||||
'dateSeperator' => 0,
|
||||
'decimal' => 0,
|
||||
'timeFormat' => 0,
|
||||
'timeSeparator' => 0,
|
||||
// Performances settings
|
||||
'blockFetch' => 1,
|
||||
'blockSizeKB' => 32,
|
||||
'allowDataCompression' => 1,
|
||||
'concurrency' => 0,
|
||||
'lazyClose' => 0,
|
||||
'maxFieldLength' => 15360,
|
||||
'prefetch' => 0,
|
||||
'queryTimeout' => 1,
|
||||
// Modules settings
|
||||
'defaultPkgLibrary' => 'QGPL',
|
||||
'defaultPackage' => 'A/DEFAULT(IBM),2,0,1,0',
|
||||
'extendedDynamic' => 1,
|
||||
// Diagnostic settings
|
||||
'QAQQINILibrary' => '',
|
||||
'sqDiagCode' => '',
|
||||
// Sort settings
|
||||
'languageId' => 'ENU',
|
||||
'sortTable' => '',
|
||||
'sortSequence' => 0,
|
||||
'sortWeight' => 0,
|
||||
'jobSort' => 0,
|
||||
// Conversion settings
|
||||
'allowUnsupportedChar' => 0,
|
||||
'ccsid' => 1208,
|
||||
'graphic' => 0,
|
||||
'forceTranslation' => 0,
|
||||
// Other settings
|
||||
'allowProcCalls' => 0,
|
||||
'DB2SqlStates' => 0,
|
||||
'debug' => 0,
|
||||
'trueAutoCommit' => 0,
|
||||
'catalogOptions' => 3,
|
||||
'libraryView' => 0,
|
||||
'ODBCRemarks' => 0,
|
||||
'searchPattern' => 1,
|
||||
'translationDLL' => '',
|
||||
'translationOption' => 0,
|
||||
'maxTraceSize' => 0,
|
||||
'multipleTraceFiles' => 1,
|
||||
'trace' => 0,
|
||||
'traceFilename' => '',
|
||||
'extendedColInfo' => 0,
|
||||
'options' => [
|
||||
'driver' => 'db2_ibmi_odbc',
|
||||
// or 'db2_ibmi_ibm' / 'db2_zos_odbc' / 'db2_expressc_odbc
|
||||
'driverName' => '{IBM i Access ODBC Driver}',
|
||||
// or '{iSeries Access ODBC Driver}' / '{IBM i Access ODBC Driver 64-bit}'
|
||||
'host' => 'server',
|
||||
'username' => '',
|
||||
'password' => '',
|
||||
'database' => 'WRKRDBDIRE entry',
|
||||
'prefix' => '',
|
||||
'schema' => 'default schema',
|
||||
'port' => 50000,
|
||||
'date_format' => 'Y-m-d H:i:s',
|
||||
// or 'Y-m-d H:i:s.u' / 'Y-m-d-H.i.s.u'...
|
||||
'odbc_keywords' => [
|
||||
'SIGNON' => 3,
|
||||
'SSL' => 0,
|
||||
'CommitMode' => 2,
|
||||
'ConnectionType' => 0,
|
||||
'DefaultLibraries' => '',
|
||||
'Naming' => 0,
|
||||
'UNICODESQL' => 0,
|
||||
'DateFormat' => 5,
|
||||
'DateSeperator' => 0,
|
||||
'Decimal' => 0,
|
||||
'TimeFormat' => 0,
|
||||
'TimeSeparator' => 0,
|
||||
'TimestampFormat' => 0,
|
||||
'ConvertDateTimeToChar' => 0,
|
||||
'BLOCKFETCH' => 1,
|
||||
'BlockSizeKB' => 32,
|
||||
'AllowDataCompression' => 1,
|
||||
'CONCURRENCY' => 0,
|
||||
'LAZYCLOSE' => 0,
|
||||
'MaxFieldLength' => 15360,
|
||||
'PREFETCH' => 0,
|
||||
'QUERYTIMEOUT' => 1,
|
||||
'DefaultPkgLibrary' => 'QGPL',
|
||||
'DefaultPackage' => 'A /DEFAULT(IBM),2,0,1,0',
|
||||
'ExtendedDynamic' => 0,
|
||||
'QAQQINILibrary' => '',
|
||||
'SQDIAGCODE' => '',
|
||||
'LANGUAGEID' => 'ENU',
|
||||
'SORTTABLE' => '',
|
||||
'SortSequence' => 0,
|
||||
'SORTWEIGHT' => 0,
|
||||
'AllowUnsupportedChar' => 0,
|
||||
'CCSID' => 819,
|
||||
'GRAPHIC' => 0,
|
||||
'ForceTranslation' => 0,
|
||||
'ALLOWPROCCALLS' => 0,
|
||||
'DB2SQLSTATES' => 0,
|
||||
'DEBUG' => 0,
|
||||
'TRUEAUTOCOMMIT' => 0,
|
||||
'CATALOGOPTIONS' => 3,
|
||||
'LibraryView' => 0,
|
||||
'ODBCRemarks' => 0,
|
||||
'SEARCHPATTERN' => 1,
|
||||
'TranslationDLL' => '',
|
||||
'TranslationOption' => 0,
|
||||
'MAXTRACESIZE' => 0,
|
||||
'MultipleTraceFiles' => 1,
|
||||
'TRACE' => 0,
|
||||
'TRACEFILENAME' => '',
|
||||
'ExtendedColInfo' => 0,
|
||||
],
|
||||
'options' => [
|
||||
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
|
||||
Then if driver is 'odbc', database must be set to ODBC connection name.
|
||||
if driver is 'ibm', database must be set to IBMi database name (WRKRDBDIRE).
|
||||
```
|
||||
driver setting can be:
|
||||
- 'db2_ibmi_odbc' for IBMi ODBC connection
|
||||
- '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
|
||||
|
||||
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
|
||||
|
||||
|
||||
## Usage
|
||||
|
||||
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;
|
||||
|
||||
use Illuminate\Database\Connectors\Connector;
|
||||
use Illuminate\Database\Connectors\ConnectorInterface;
|
||||
|
||||
/**
|
||||
* Class IBMConnector
|
||||
*
|
||||
* @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
|
||||
*
|
||||
|
@ -2,37 +2,13 @@
|
||||
|
||||
namespace Cooperl\Database\DB2\Connectors;
|
||||
|
||||
use Illuminate\Database\Connectors\Connector;
|
||||
use Illuminate\Database\Connectors\ConnectorInterface;
|
||||
|
||||
/**
|
||||
* Class ODBCConnector
|
||||
*
|
||||
* @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
|
||||
*
|
||||
@ -40,73 +16,33 @@ class ODBCConnector extends Connector implements ConnectorInterface
|
||||
*/
|
||||
protected function getDsn(array $config)
|
||||
{
|
||||
extract($config);
|
||||
$dsnParts = [
|
||||
'odbc:DRIVER=%s',
|
||||
'System=%s',
|
||||
'Database=%s',
|
||||
'UserID=%s',
|
||||
'Password=%s',
|
||||
];
|
||||
|
||||
$dsn = "odbc:"
|
||||
// General settings
|
||||
. "DRIVER=$driverName;"
|
||||
. "SYSTEM=$host;"
|
||||
. "UserID=$username;"
|
||||
. "Password=$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;"
|
||||
;
|
||||
$dsnConfig = [
|
||||
$config['driverName'],
|
||||
$config['host'],
|
||||
$config['database'],
|
||||
$config['username'],
|
||||
$config['password'],
|
||||
];
|
||||
|
||||
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
|
||||
*/
|
||||
protected $defaultSchema;
|
||||
|
||||
/**
|
||||
* The name of the current schema in use.
|
||||
*
|
||||
@ -91,7 +90,13 @@ class DB2Connection extends Connection
|
||||
*/
|
||||
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()
|
||||
{
|
||||
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()
|
||||
{
|
||||
if ($this->config['driver'] == 'odbczos') {
|
||||
return new DB2ZOSProcessor();
|
||||
switch ($this->config['driver']) {
|
||||
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()
|
||||
{
|
||||
$this->publishes([
|
||||
__DIR__ . '/config/config.php' => config_path('db2.php'),
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -38,7 +41,7 @@ class DB2ServiceProvider extends ServiceProvider
|
||||
public function register()
|
||||
{
|
||||
// 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
|
||||
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
|
||||
foreach (config('database.connections') as $conn => $config) {
|
||||
// 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;
|
||||
}
|
||||
|
||||
// Create a connector
|
||||
$this->app['db']->extend($conn, function ($config) {
|
||||
$this->app['db']->extend($conn, function($config) {
|
||||
switch ($config['driver']) {
|
||||
case 'odbcexpress':
|
||||
case 'odbc':
|
||||
case 'db2_expressc_odbc':
|
||||
case 'db2_ibmi_odbc':
|
||||
$connector = new ODBCConnector();
|
||||
|
||||
break;
|
||||
case 'odbczos':
|
||||
|
||||
case 'db2_zos_odbc':
|
||||
$connector = new ODBCZOSConnector();
|
||||
|
||||
break;
|
||||
case 'ibm':
|
||||
|
||||
case 'db2_ibmi_ibm':
|
||||
default:
|
||||
$connector = new IBMConnector();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -12,6 +12,13 @@ use Illuminate\Database\Query\Builder;
|
||||
*/
|
||||
class DB2Grammar extends Grammar
|
||||
{
|
||||
/**
|
||||
* The format for database stored dates.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $dateFormat;
|
||||
|
||||
/**
|
||||
* Wrap a single string in keyword identifiers.
|
||||
*
|
||||
@ -32,7 +39,7 @@ class DB2Grammar extends Grammar
|
||||
* Compile the "limit" portions of the query.
|
||||
*
|
||||
* @param \Illuminate\Database\Query\Builder $query
|
||||
* @param int $limit
|
||||
* @param int $limit
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
@ -70,7 +77,7 @@ class DB2Grammar extends Grammar
|
||||
* Create a full ANSI offset clause for the query.
|
||||
*
|
||||
* @param \Illuminate\Database\Query\Builder $query
|
||||
* @param array $components
|
||||
* @param array $components
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
@ -90,10 +97,10 @@ class DB2Grammar extends Grammar
|
||||
// the "select" that will give back the row numbers on each of the records.
|
||||
$orderings = $components['orders'];
|
||||
|
||||
$columns = (!empty($components['columns']) ? $components['columns'].', ' : 'select');
|
||||
$columns = (!empty($components['columns']) ? $components['columns'] . ', ' : 'select');
|
||||
|
||||
if ($columns == 'select *, ' && $query->from) {
|
||||
$columns = 'select '.$this->tablePrefix.$query->from.'.*, ';
|
||||
$columns = 'select ' . $this->tablePrefix . $query->from . '.*, ';
|
||||
}
|
||||
|
||||
$components['columns'] = $this->compileOver($orderings, $columns);
|
||||
@ -119,7 +126,7 @@ class DB2Grammar extends Grammar
|
||||
* Compile the over statement for a table expression.
|
||||
*
|
||||
* @param string $orderings
|
||||
* @param $columns
|
||||
* @param $columns
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
@ -163,7 +170,7 @@ class DB2Grammar extends Grammar
|
||||
* Compile the "offset" portions of the query.
|
||||
*
|
||||
* @param \Illuminate\Database\Query\Builder $query
|
||||
* @param int $offset
|
||||
* @param int $offset
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
@ -179,6 +186,16 @@ class DB2Grammar extends Grammar
|
||||
*/
|
||||
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
|
||||
{
|
||||
|
||||
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.
|
||||
*
|
||||
@ -66,14 +28,15 @@ class DB2Processor extends Processor
|
||||
$sequenceStr = $sequence ?: 'id';
|
||||
|
||||
if (is_array($sequence)) {
|
||||
$grammar = new DB2Grammar($this->bdType);
|
||||
$grammar = new DB2Grammar;
|
||||
$sequenceStr = $grammar->columnize($sequence);
|
||||
}
|
||||
|
||||
$sql = 'select ' . $sequenceStr . ' from new table (' . $sql;
|
||||
$sql .= ')';
|
||||
$sqlStr = 'select %s from new table (%s)';
|
||||
|
||||
$finalSql = sprintf($sqlStr, $sequenceStr, $sql);
|
||||
$results = $query->getConnection()
|
||||
->select($sql, $values);
|
||||
->select($finalSql, $values);
|
||||
|
||||
if (is_array($sequence)) {
|
||||
return array_values((array) $results[0]);
|
||||
|
@ -17,9 +17,9 @@ class DB2ZOSProcessor extends Processor
|
||||
* Process an "insert get ID" query.
|
||||
*
|
||||
* @param \Illuminate\Database\Query\Builder $query
|
||||
* @param string $sql
|
||||
* @param array $values
|
||||
* @param string $sequence
|
||||
* @param string $sql
|
||||
* @param array $values
|
||||
* @param string $sequence
|
||||
*
|
||||
* @return int/array
|
||||
*/
|
||||
@ -28,14 +28,15 @@ class DB2ZOSProcessor extends Processor
|
||||
$sequenceStr = $sequence ?: 'id';
|
||||
|
||||
if (is_array($sequence)) {
|
||||
$grammar = new DB2Grammar("z");
|
||||
$grammar = new DB2Grammar;
|
||||
$sequenceStr = $grammar->columnize($sequence);
|
||||
}
|
||||
|
||||
$sqlStr = 'select %s from final table (%s)';
|
||||
|
||||
$finalSql = sprintf($sqlStr, $sequenceStr, $sql);
|
||||
$results = $query->getConnection()->select($finalSql, $values);
|
||||
$results = $query->getConnection()
|
||||
->select($finalSql, $values);
|
||||
|
||||
if (is_array($sequence)) {
|
||||
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()
|
||||
{
|
||||
if ($this->dbType == "i") {
|
||||
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(?)';
|
||||
}
|
||||
return 'select * from information_schema.tables where table_schema = upper(?) and table_name = upper(?)';
|
||||
}
|
||||
|
||||
/**
|
||||
@ -84,21 +80,7 @@ class DB2Grammar extends Grammar
|
||||
*/
|
||||
public function compileColumnExists()
|
||||
{
|
||||
if ($this->dbType == "i") {
|
||||
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(?)
|
||||
";
|
||||
}
|
||||
return 'select column_name from information_schema.columns where table_schema = upper(?) and table_name = upper(?)';
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -54,6 +54,21 @@ PDO::CASE_LOWER
|
||||
PDO::CASE_UPPER
|
||||
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 [
|
||||
@ -61,91 +76,81 @@ return [
|
||||
'connections' => [
|
||||
|
||||
'ibmi' => [
|
||||
'driver' => 'odbc' / 'ibm' / 'odbczos',
|
||||
'driverName' => '{IBM i Access ODBC Driver}' / '{iSeries Access ODBC Driver}',
|
||||
// General settings
|
||||
'host' => 'server',
|
||||
'username' => '',
|
||||
'password' => '',
|
||||
//Server settings
|
||||
'database' => 'WRKRDBDIRE entry',
|
||||
'prefix' => '',
|
||||
'schema' => 'default schema',
|
||||
'port' => 50000,
|
||||
'signon' => 3,
|
||||
'ssl' => 0,
|
||||
'commitMode' => 2,
|
||||
'connectionType' => 0,
|
||||
'defaultLibraries' => '',
|
||||
'naming' => 0,
|
||||
'unicodeSql' => 0,
|
||||
// Format settings
|
||||
'dateFormat' => 5,
|
||||
'dateSeperator' => 0,
|
||||
'decimal' => 0,
|
||||
'timeFormat' => 0,
|
||||
'timeSeparator' => 0,
|
||||
// Performances settings
|
||||
'blockFetch' => 1,
|
||||
'blockSizeKB' => 32,
|
||||
'allowDataCompression' => 1,
|
||||
'concurrency' => 0,
|
||||
'lazyClose' => 0,
|
||||
'maxFieldLength' => 15360,
|
||||
'prefetch' => 0,
|
||||
'queryTimeout' => 1,
|
||||
// Modules settings
|
||||
'defaultPkgLibrary' => 'QGPL',
|
||||
'defaultPackage' => 'A/DEFAULT(IBM),2,0,1,0',
|
||||
'extendedDynamic' => 1,
|
||||
// Diagnostic settings
|
||||
'QAQQINILibrary' => '',
|
||||
'sqDiagCode' => '',
|
||||
// Sort settings
|
||||
'languageId' => 'ENU',
|
||||
'sortTable' => '',
|
||||
'sortSequence' => 0,
|
||||
'sortWeight' => 0,
|
||||
'jobSort' => 0,
|
||||
// Conversion settings
|
||||
'allowUnsupportedChar' => 0,
|
||||
'ccsid' => 1208,
|
||||
'graphic' => 0,
|
||||
'forceTranslation' => 0,
|
||||
// Other settings
|
||||
'allowProcCalls' => 0,
|
||||
'DB2SqlStates' => 0,
|
||||
'debug' => 0,
|
||||
'trueAutoCommit' => 0,
|
||||
'catalogOptions' => 3,
|
||||
'libraryView' => 0,
|
||||
'ODBCRemarks' => 0,
|
||||
'searchPattern' => 1,
|
||||
'translationDLL' => '',
|
||||
'translationOption' => 0,
|
||||
'maxTraceSize' => 0,
|
||||
'multipleTraceFiles' => 1,
|
||||
'trace' => 0,
|
||||
'traceFilename' => '',
|
||||
'extendedColInfo' => 0,
|
||||
'options' => [
|
||||
PDO::ATTR_CASE => PDO::CASE_LOWER,
|
||||
PDO::ATTR_EMULATE_PREPARES => false,
|
||||
PDO::ATTR_PERSISTENT => false
|
||||
'driver' => 'db2_ibmi_odbc',
|
||||
// or 'db2_ibmi_ibm' / 'db2_zos_odbc' / 'db2_expressc_odbc
|
||||
'driverName' => '{IBM i Access ODBC Driver}',
|
||||
// or '{iSeries Access ODBC Driver}' '{IBM i Access ODBC Driver 64-bit}'
|
||||
'host' => 'server',
|
||||
'username' => '',
|
||||
'password' => '',
|
||||
'database' => 'WRKRDBDIRE entry',
|
||||
'prefix' => '',
|
||||
'schema' => 'default schema',
|
||||
'port' => 50000,
|
||||
'date_format' => 'Y-m-d H:i:s',
|
||||
'odbc_keywords' => [
|
||||
'SIGNON' => 3,
|
||||
'SSL' => 0,
|
||||
'CommitMode' => 2,
|
||||
'ConnectionType' => 0,
|
||||
'DefaultLibraries' => '',
|
||||
'Naming' => 0,
|
||||
'UNICODESQL' => 0,
|
||||
'DateFormat' => 5,
|
||||
'DateSeperator' => 0,
|
||||
'Decimal' => 0,
|
||||
'TimeFormat' => 0,
|
||||
'TimeSeparator' => 0,
|
||||
'TimestampFormat' => 0,
|
||||
'ConvertDateTimeToChar' => 0,
|
||||
'BLOCKFETCH' => 1,
|
||||
'BlockSizeKB' => 32,
|
||||
'AllowDataCompression' => 1,
|
||||
'CONCURRENCY' => 0,
|
||||
'LAZYCLOSE' => 0,
|
||||
'MaxFieldLength' => 15360,
|
||||
'PREFETCH' => 0,
|
||||
'QUERYTIMEOUT' => 1,
|
||||
'DefaultPkgLibrary' => 'QGPL',
|
||||
'DefaultPackage' => 'A /DEFAULT(IBM),2,0,1,0',
|
||||
'ExtendedDynamic' => 0,
|
||||
'QAQQINILibrary' => '',
|
||||
'SQDIAGCODE' => '',
|
||||
'LANGUAGEID' => 'ENU',
|
||||
'SORTTABLE' => '',
|
||||
'SortSequence' => 0,
|
||||
'SORTWEIGHT' => 0,
|
||||
'AllowUnsupportedChar' => 0,
|
||||
'CCSID' => 819,
|
||||
'GRAPHIC' => 0,
|
||||
'ForceTranslation' => 0,
|
||||
'ALLOWPROCCALLS' => 0,
|
||||
'DB2SQLSTATES' => 0,
|
||||
'DEBUG' => 0,
|
||||
'TRUEAUTOCOMMIT' => 0,
|
||||
'CATALOGOPTIONS' => 3,
|
||||
'LibraryView' => 0,
|
||||
'ODBCRemarks' => 0,
|
||||
'SEARCHPATTERN' => 1,
|
||||
'TranslationDLL' => '',
|
||||
'TranslationOption' => 0,
|
||||
'MAXTRACESIZE' => 0,
|
||||
'MultipleTraceFiles' => 1,
|
||||
'TRACE' => 0,
|
||||
'TRACEFILENAME' => '',
|
||||
'ExtendedColInfo' => 0,
|
||||
],
|
||||
'options' => [
|
||||
PDO::ATTR_CASE => PDO::CASE_LOWER,
|
||||
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