Refactoring

This commit is contained in:
Cooperl Arc Atlantique 2017-06-23 15:54:36 +02:00 committed by Maxime Rault
parent dd6771f8fe
commit 0b0a2a5201
12 changed files with 351 additions and 423 deletions

164
README.md
View File

@ -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}',
'host' => 'server', // or '{iSeries Access ODBC Driver}' / '{IBM i Access ODBC Driver 64-bit}'
'username' => '', 'host' => 'server',
'password' => '', 'username' => '',
//Server settings 'password' => '',
'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',
'QAQQINILibrary' => '', 'ExtendedDynamic' => 0,
'sqDiagCode' => '', 'QAQQINILibrary' => '',
// Sort settings 'SQDIAGCODE' => '',
'languageId' => 'ENU', 'LANGUAGEID' => 'ENU',
'sortTable' => '', 'SORTTABLE' => '',
'sortSequence' => 0, 'SortSequence' => 0,
'sortWeight' => 0, 'SORTWEIGHT' => 0,
'jobSort' => 0, 'AllowUnsupportedChar' => 0,
// Conversion settings 'CCSID' => 819,
'allowUnsupportedChar' => 0, 'GRAPHIC' => 0,
'ccsid' => 1208, 'ForceTranslation' => 0,
'graphic' => 0, 'ALLOWPROCCALLS' => 0,
'forceTranslation' => 0, 'DB2SQLSTATES' => 0,
// Other settings 'DEBUG' => 0,
'allowProcCalls' => 0, 'TRUEAUTOCOMMIT' => 0,
'DB2SqlStates' => 0, 'CATALOGOPTIONS' => 3,
'debug' => 0, 'LibraryView' => 0,
'trueAutoCommit' => 0, 'ODBCRemarks' => 0,
'catalogOptions' => 3, 'SEARCHPATTERN' => 1,
'libraryView' => 0, 'TranslationDLL' => '',
'ODBCRemarks' => 0, 'TranslationOption' => 0,
'searchPattern' => 1, 'MAXTRACESIZE' => 0,
'translationDLL' => '', 'MultipleTraceFiles' => 1,
'translationOption' => 0, 'TRACE' => 0,
'maxTraceSize' => 0, 'TRACEFILENAME' => '',
'multipleTraceFiles' => 1, 'ExtendedColInfo' => 0,
'trace' => 0, ],
'traceFilename' => '', 'options' => [
'extendedColInfo' => 0,
'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).

View 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;
}
}

View File

@ -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
* *

View File

@ -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);
} }
} }

View File

@ -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;
} }
} }

View File

@ -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;
} }

View File

@ -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.
* *
@ -32,7 +39,7 @@ class DB2Grammar extends Grammar
* Compile the "limit" portions of the query. * Compile the "limit" portions of the query.
* *
* @param \Illuminate\Database\Query\Builder $query * @param \Illuminate\Database\Query\Builder $query
* @param int $limit * @param int $limit
* *
* @return string * @return string
*/ */
@ -70,7 +77,7 @@ class DB2Grammar extends Grammar
* Create a full ANSI offset clause for the query. * Create a full ANSI offset clause for the query.
* *
* @param \Illuminate\Database\Query\Builder $query * @param \Illuminate\Database\Query\Builder $query
* @param array $components * @param array $components
* *
* @return string * @return string
*/ */
@ -90,10 +97,10 @@ class DB2Grammar extends Grammar
// the "select" that will give back the row numbers on each of the records. // the "select" that will give back the row numbers on each of the records.
$orderings = $components['orders']; $orderings = $components['orders'];
$columns = (!empty($components['columns']) ? $components['columns'].', ' : 'select'); $columns = (!empty($components['columns']) ? $components['columns'] . ', ' : 'select');
if ($columns == 'select *, ' && $query->from) { if ($columns == 'select *, ' && $query->from) {
$columns = 'select '.$this->tablePrefix.$query->from.'.*, '; $columns = 'select ' . $this->tablePrefix . $query->from . '.*, ';
} }
$components['columns'] = $this->compileOver($orderings, $columns); $components['columns'] = $this->compileOver($orderings, $columns);
@ -119,7 +126,7 @@ class DB2Grammar extends Grammar
* Compile the over statement for a table expression. * Compile the over statement for a table expression.
* *
* @param string $orderings * @param string $orderings
* @param $columns * @param $columns
* *
* @return string * @return string
*/ */
@ -163,7 +170,7 @@ class DB2Grammar extends Grammar
* Compile the "offset" portions of the query. * Compile the "offset" portions of the query.
* *
* @param \Illuminate\Database\Query\Builder $query * @param \Illuminate\Database\Query\Builder $query
* @param int $offset * @param int $offset
* *
* @return string * @return string
*/ */
@ -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;
} }
} }

View File

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

View File

@ -17,9 +17,9 @@ class DB2ZOSProcessor extends Processor
* Process an "insert get ID" query. * Process an "insert get ID" query.
* *
* @param \Illuminate\Database\Query\Builder $query * @param \Illuminate\Database\Query\Builder $query
* @param string $sql * @param string $sql
* @param array $values * @param array $values
* @param string $sequence * @param string $sequence
* *
* @return int/array * @return int/array
*/ */
@ -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]);

View 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(?)';
}
}

View File

@ -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(?)
";
}
} }
/** /**

View File

@ -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}',
'host' => 'server', // or '{iSeries Access ODBC Driver}' '{IBM i Access ODBC Driver 64-bit}'
'username' => '', 'host' => 'server',
'password' => '', 'username' => '',
//Server settings 'password' => '',
'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, 'ODBCRemarks' => 0,
'trueAutoCommit' => 0, 'SEARCHPATTERN' => 1,
'catalogOptions' => 3, 'TranslationDLL' => '',
'libraryView' => 0, 'TranslationOption' => 0,
'ODBCRemarks' => 0, 'MAXTRACESIZE' => 0,
'searchPattern' => 1, 'MultipleTraceFiles' => 1,
'translationDLL' => '', 'TRACE' => 0,
'translationOption' => 0, 'TRACEFILENAME' => '',
'maxTraceSize' => 0, 'ExtendedColInfo' => 0,
'multipleTraceFiles' => 1, ],
'trace' => 0, 'options' => [
'traceFilename' => '', PDO::ATTR_CASE => PDO::CASE_LOWER,
'extendedColInfo' => 0, PDO::ATTR_PERSISTENT => false,
'options' => [ PDO::I5_ATTR_DBC_SYS_NAMING => false,
PDO::ATTR_CASE => PDO::CASE_LOWER, PDO::I5_ATTR_COMMIT => PDO::I5_TXN_NO_COMMIT,
PDO::ATTR_EMULATE_PREPARES => false, PDO::I5_ATTR_JOB_SORT => false,
PDO::ATTR_PERSISTENT => 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
]
], ],
] ],
]; ];