From 0b0a2a52016c5169dff138d5c4fe5fd0c05b7434 Mon Sep 17 00:00:00 2001 From: Cooperl Arc Atlantique Date: Fri, 23 Jun 2017 15:54:36 +0200 Subject: [PATCH] Refactoring --- README.md | 166 ++++++++++---------- src/Connectors/DB2Connector.php | 35 +++++ src/Connectors/IBMConnector.php | 82 +--------- src/Connectors/ODBCConnector.php | 118 ++++---------- src/DB2Connection.php | 31 +++- src/DB2ServiceProvider.php | 28 ++-- src/Query/Grammars/DB2Grammar.php | 31 +++- src/Query/Processors/DB2Processor.php | 47 +----- src/Query/Processors/DB2ZOSProcessor.php | 11 +- src/Schema/Grammars/DB2ExpressCGrammar.php | 32 ++++ src/Schema/Grammars/DB2Grammar.php | 22 +-- src/config/config.php | 171 +++++++++++---------- 12 files changed, 351 insertions(+), 423 deletions(-) create mode 100644 src/Connectors/DB2Connector.php create mode 100644 src/Schema/Grammars/DB2ExpressCGrammar.php diff --git a/README.md b/README.md index 274666a..60bab9c 100644 --- a/README.md +++ b/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). diff --git a/src/Connectors/DB2Connector.php b/src/Connectors/DB2Connector.php new file mode 100644 index 0000000..391a650 --- /dev/null +++ b/src/Connectors/DB2Connector.php @@ -0,0 +1,35 @@ +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; + } +} diff --git a/src/Connectors/IBMConnector.php b/src/Connectors/IBMConnector.php index 6e65eb2..25fb6b8 100644 --- a/src/Connectors/IBMConnector.php +++ b/src/Connectors/IBMConnector.php @@ -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 * diff --git a/src/Connectors/ODBCConnector.php b/src/Connectors/ODBCConnector.php index a95c12b..486bc5f 100644 --- a/src/Connectors/ODBCConnector.php +++ b/src/Connectors/ODBCConnector.php @@ -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); } } diff --git a/src/DB2Connection.php b/src/DB2Connection.php index 7481789..0425d9a 100644 --- a/src/DB2Connection.php +++ b/src/DB2Connection.php @@ -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; } } diff --git a/src/DB2ServiceProvider.php b/src/DB2ServiceProvider.php index 096caf1..3c9c8d8 100644 --- a/src/DB2ServiceProvider.php +++ b/src/DB2ServiceProvider.php @@ -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; } diff --git a/src/Query/Grammars/DB2Grammar.php b/src/Query/Grammars/DB2Grammar.php index 85031de..22d9b68 100644 --- a/src/Query/Grammars/DB2Grammar.php +++ b/src/Query/Grammars/DB2Grammar.php @@ -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; } } diff --git a/src/Query/Processors/DB2Processor.php b/src/Query/Processors/DB2Processor.php index f2fb4d7..a63f8a4 100644 --- a/src/Query/Processors/DB2Processor.php +++ b/src/Query/Processors/DB2Processor.php @@ -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]); diff --git a/src/Query/Processors/DB2ZOSProcessor.php b/src/Query/Processors/DB2ZOSProcessor.php index 3175844..166f14d 100644 --- a/src/Query/Processors/DB2ZOSProcessor.php +++ b/src/Query/Processors/DB2ZOSProcessor.php @@ -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]); diff --git a/src/Schema/Grammars/DB2ExpressCGrammar.php b/src/Schema/Grammars/DB2ExpressCGrammar.php new file mode 100644 index 0000000..8f7d1c0 --- /dev/null +++ b/src/Schema/Grammars/DB2ExpressCGrammar.php @@ -0,0 +1,32 @@ +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(?)'; } /** diff --git a/src/config/config.php b/src/config/config.php index ee2b0ff..f78cb05 100644 --- a/src/config/config.php +++ b/src/config/config.php @@ -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 - ] ], - ] + ], ];