Merge pull request #15 from lucasmezencio/master

Add IBM Mainframe z/OS support
This commit is contained in:
Cooperl Arc Atlantique 2016-08-30 15:19:24 +02:00 committed by GitHub
commit 437479657b
13 changed files with 594 additions and 377 deletions

View File

@ -57,7 +57,7 @@ Simply add this code at the end of your ``app/config/database.php`` file:
*/ */
'ibmi' => [ 'ibmi' => [
'driver' => 'odbc' / 'ibm', 'driver' => 'odbc' / 'ibm' / 'odbczos',
'driverName' => '{IBM i Access ODBC Driver}' / '{iSeries Access ODBC Driver}', 'driverName' => '{IBM i Access ODBC Driver}' / '{iSeries Access ODBC Driver}',
// General settings // General settings
'host' => 'server', 'host' => 'server',
@ -67,6 +67,7 @@ Simply add this code at the end of your ``app/config/database.php`` file:
'database' => 'WRKRDBDIRE entry', 'database' => 'WRKRDBDIRE entry',
'prefix' => '', 'prefix' => '',
'schema' => 'default schema', 'schema' => 'default schema',
'port' => 50000,
'signon' => 3, 'signon' => 3,
'ssl' => 0, 'ssl' => 0,
'commitMode' => 2, 'commitMode' => 2,

View File

@ -1,72 +1,86 @@
<?php <?php
namespace Cooperl\Database\DB2\Connectors; namespace Cooperl\Database\DB2\Connectors;
use Illuminate\Database\Connectors\Connector; use Illuminate\Database\Connectors\Connector;
use Illuminate\Database\Connectors\ConnectorInterface; use Illuminate\Database\Connectors\ConnectorInterface;
use PDO; /**
* Class IBMConnector
*
* @package Cooperl\Database\DB2\Connectors
*/
class IBMConnector extends Connector implements ConnectorInterface class IBMConnector extends Connector implements ConnectorInterface
{ {
/**
* @param array $config
*
* @return \PDO
*/
public function connect(array $config) public function connect(array $config)
{ {
$dsn = $this->getDsn($config); $dsn = $this->getDsn($config);
$options = [ $options = [
PDO::I5_ATTR_DBC_SYS_NAMING => false, \PDO::I5_ATTR_DBC_SYS_NAMING => false,
PDO::I5_ATTR_COMMIT => PDO::I5_TXN_NO_COMMIT, \PDO::I5_ATTR_COMMIT => \PDO::I5_TXN_NO_COMMIT,
PDO::I5_ATTR_JOB_SORT => false \PDO::I5_ATTR_JOB_SORT => false,
]; ];
// Naming mode // Naming mode
switch ($config['naming']) { switch ($config['naming']) {
case 1: case 1:
$options[PDO::I5_ATTR_DBC_SYS_NAMING] = true; $options[\PDO::I5_ATTR_DBC_SYS_NAMING] = true;
break; break;
case 0: case 0:
default: default:
$options[PDO::I5_ATTR_DBC_SYS_NAMING] = false; $options[\PDO::I5_ATTR_DBC_SYS_NAMING] = false;
break; break;
} }
// Isolation mode // Isolation mode
switch ($config['commitMode']) { switch ($config['commitMode']) {
case 1: case 1:
$options[PDO::I5_ATTR_COMMIT] = PDO::I5_TXN_READ_COMMITTED; $options[\PDO::I5_ATTR_COMMIT] = \PDO::I5_TXN_READ_COMMITTED;
break; break;
case 2: case 2:
$options[PDO::I5_ATTR_COMMIT] = PDO::I5_TXN_READ_UNCOMMITTED; $options[\PDO::I5_ATTR_COMMIT] = \PDO::I5_TXN_READ_UNCOMMITTED;
break; break;
case 3: case 3:
$options[PDO::I5_ATTR_COMMIT] = PDO::I5_TXN_REPEATABLE_READ; $options[\PDO::I5_ATTR_COMMIT] = \PDO::I5_TXN_REPEATABLE_READ;
break; break;
case 4: case 4:
$options[PDO::I5_ATTR_COMMIT] = PDO::I5_TXN_SERIALIZABLE; $options[\PDO::I5_ATTR_COMMIT] = \PDO::I5_TXN_SERIALIZABLE;
break; break;
case 0: case 0:
default: default:
$options[PDO::I5_ATTR_COMMIT] = PDO::I5_TXN_NO_COMMIT; $options[PDO::I5_ATTR_COMMIT] = PDO::I5_TXN_NO_COMMIT;
break; break;
} }
// Job sort mode // Job sort mode
switch ($config['jobSort']) { switch ($config['jobSort']) {
case 1: case 1:
$options[PDO::I5_ATTR_DBC_SYS_NAMING] = true; $options[\PDO::I5_ATTR_DBC_SYS_NAMING] = true;
break; break;
case 0: case 0:
default: default:
$options[PDO::I5_ATTR_DBC_SYS_NAMING] = false; $options[\PDO::I5_ATTR_DBC_SYS_NAMING] = false;
break; break;
} }
$options = $this->getOptions($config) + $options; $options = $this->getOptions($config) + $options;
$connection = $this->createConnection($dsn, $config, $options); $connection = $this->createConnection($dsn, $config, $options);
if (isset($config['schema'])) if (isset($config['schema'])) {
{
$schema = $config['schema']; $schema = $config['schema'];
$connection->prepare("set schema $schema")->execute(); $connection->prepare("set schema $schema")->execute();
@ -75,10 +89,15 @@ class IBMConnector extends Connector implements ConnectorInterface
return $connection; return $connection;
} }
protected function getDsn(array $config) { /**
extract($config); * @param array $config
$dsn = "ibm:$database"; *
* @return string
*/
protected function getDsn(array $config)
{
$dsn = "ibm:{$config['database']}";
return $dsn; return $dsn;
} }
} }

View File

@ -1,99 +1,86 @@
<?php <?php
namespace Cooperl\Database\DB2\Connectors; namespace Cooperl\Database\DB2\Connectors;
use Illuminate\Database\Connectors\Connector; use Illuminate\Database\Connectors\Connector;
use Illuminate\Database\Connectors\ConnectorInterface; use Illuminate\Database\Connectors\ConnectorInterface;
/**
* Class ODBCConnector
*
* @package Cooperl\Database\DB2\Connectors
*/
class ODBCConnector extends Connector implements ConnectorInterface class ODBCConnector extends Connector implements ConnectorInterface
{ {
/**
* @param array $config
*
* @return \PDO
*/
public function connect(array $config) public function connect(array $config)
{ {
$dsn = $this->getDsn($config); $dsn = $this->getDsn($config);
$options = $this->getOptions($config); $options = $this->getOptions($config);
$connection = $this->createConnection($dsn, $config, $options); $connection = $this->createConnection($dsn, $config, $options);
if (isset($config['schema'])) if (isset($config['schema'])) {
{
$schema = $config['schema']; $schema = $config['schema'];
$connection->prepare("set schema $schema")->execute(); $connection->prepare('set schema '.$schema)->execute();
} }
return $connection; return $connection;
} }
protected function getDsn(array $config) { /**
extract($config); * @param array $config
*
* @return string
*/
protected function getDsn(array $config)
{
$dsnParts = [
'odbc:DRIVER=%s', 'SYSTEM=%s', 'UserID=%s', 'Password=%s', 'DATABASE=%s', 'SIGNON=%s', 'SSL=%s',
'CommitMode=%s', 'ConnectionType=%s', 'DefaultLibraries=%s', 'Naming=%s', 'UNICODESQL=%s', 'DateFormat=%s',
'DateSeperator=%s', 'Decimal=%s', 'TimeFormat=%s', 'TimeSeparator=%s', 'BLOCKFETCH=%s', 'BlockSizeKB=%s',
'AllowDataCompression=%s', 'CONCURRENCY=%s', 'LAZYCLOSE=%s', 'MaxFieldLength=%s', 'PREFETCH=%s',
'QUERYTIMEOUT=%s', 'DefaultPkgLibrary=%s', 'DefaultPackage=%s', 'ExtendedDynamic=%s', 'QAQQINILibrary=%s',
'SQDIAGCODE=%s', 'LANGUAGEID=%s', 'SORTTABLE=%s', 'SortSequence=%s', 'SORTWEIGHT=%s',
'AllowUnsupportedChar=%s', 'CCSID=%s', 'GRAPHIC=%s', 'ForceTranslation=%s', 'ALLOWPROCCALLS=%s',
'DB2SQLSTATES=%s', 'DEBUG=%s', 'TRUEAUTOCOMMIT=%s', 'CATALOGOPTIONS=%s', 'LibraryView=%s', 'ODBCRemarks=%s',
'SEARCHPATTERN=%s', 'TranslationDLL=%s', 'TranslationOption=%s', 'MAXTRACESIZE=%s', 'MultipleTraceFiles=%s',
'TRACE=%s', 'TRACEFILENAME=%s', 'ExtendedColInfo=%s',
'', // Just to add a semicolon to the end of string
];
$dsn = "odbc:" $dsnConfig = [
// General settings // General settings
. "DRIVER=$driverName;" $config['driverName'], $config['host'], $config['username'], $config['password'],
. "SYSTEM=$host;"
. "UserID=$username;"
. "Password=$password;"
//Server settings //Server settings
. "DATABASE=$database;" $config['database'], $config['signon'], $config['ssl'], $config['commitMode'], $config['connectionType'],
. "SIGNON=$signon;" $config['defaultLibraries'], $config['naming'], $config['unicodeSql'],
. "SSL=$ssl;"
. "CommitMode=$commitMode;"
. "ConnectionType=$connectionType;"
. "DefaultLibraries=$defaultLibraries;"
. "Naming=$naming;"
. "UNICODESQL=$unicodeSql;"
// Format settings // Format settings
. "DateFormat=$dateFormat;" $config['dateFormat'], $config['dateSeperator'], $config['decimal'], $config['timeFormat'],
. "DateSeperator=$dateSeperator;" $config['timeSeparator'],
. "Decimal=$decimal;"
. "TimeFormat=$timeFormat;"
. "TimeSeparator=$timeSeparator;"
// Performances settings // Performances settings
. "BLOCKFETCH=$blockFetch;" $config['blockFetch'], $config['blockSizeKB'], $config['allowDataCompression'], $config['concurrency'],
. "BlockSizeKB=$blockSizeKB;" $config['lazyClose'], $config['maxFieldLength'], $config['prefetch'], $config['queryTimeout'],
. "AllowDataCompression=$allowDataCompression;"
. "CONCURRENCY=$concurrency;"
. "LAZYCLOSE=$lazyClose;"
. "MaxFieldLength=$maxFieldLength;"
. "PREFETCH=$prefetch;"
. "QUERYTIMEOUT=$queryTimeout;"
// Modules settings // Modules settings
. "DefaultPkgLibrary=$defaultPkgLibrary;" $config['defaultPkgLibrary'], $config['defaultPackage'], $config['extendedDynamic'],
. "DefaultPackage=$defaultPackage;"
. "ExtendedDynamic=$extendedDynamic;"
// Diagnostic settings // Diagnostic settings
. "QAQQINILibrary=$QAQQINILibrary;" $config['QAQQINILibrary'], $config['sqDiagCode'],
. "SQDIAGCODE=$sqDiagCode;"
// Sort settings // Sort settings
. "LANGUAGEID=$languageId;" $config['languageId'], $config['sortTable'], $config['sortSequence'], $config['sortWeight'],
. "SORTTABLE=$sortTable;"
. "SortSequence=$sortSequence;"
. "SORTWEIGHT=$sortWeight;"
// Conversion settings // Conversion settings
. "AllowUnsupportedChar=$allowUnsupportedChar;" $config['allowUnsupportedChar'], $config['ccsid'], $config['graphic'], $config['forceTranslation'],
. "CCSID=$ccsid;"
. "GRAPHIC=$graphic;"
. "ForceTranslation=$forceTranslation;"
// Other settings // Other settings
. "ALLOWPROCCALLS=$allowProcCalls;" $config['allowProcCalls'], $config['DB2SqlStates'], $config['debug'], $config['trueAutoCommit'],
. "DB2SQLSTATES=$DB2SqlStates;" $config['catalogOptions'], $config['libraryView'], $config['ODBCRemarks'], $config['searchPattern'],
. "DEBUG=$debug;" $config['translationDLL'], $config['translationOption'], $config['maxTraceSize'],
. "TRUEAUTOCOMMIT=$trueAutoCommit;" $config['multipleTraceFiles'], $config['trace'], $config['traceFilename'], $config['extendedColInfo'],
. "CATALOGOPTIONS=$catalogOptions;" ];
. "LibraryView=$libraryView;"
. "ODBCRemarks=$ODBCRemarks;"
. "SEARCHPATTERN=$searchPattern;"
. "TranslationDLL=$translationDLL;"
. "TranslationOption=$translationOption;"
. "MAXTRACESIZE=$maxTraceSize;"
. "MultipleTraceFiles=$multipleTraceFiles;"
. "TRACE=$trace;"
. "TRACEFILENAME=$traceFilename;"
. "ExtendedColInfo=$extendedColInfo;"
;
return $dsn; return sprintf(implode(';', $dsnParts), ...$dsnConfig);
} }
} }

View File

@ -0,0 +1,40 @@
<?php
namespace Cooperl\Database\DB2\Connectors;
/**
* Class ODBCZOSConnector
*
* @package Cooperl\Database\DB2\Connectors
*/
class ODBCZOSConnector extends ODBCConnector
{
/**
* @param array $config
*
* @return string
*/
protected function getDsn(array $config)
{
$dsnParts = [
'odbc:DRIVER={IBM DB2 ODBC DRIVER}',
'Database=%s',
'Hostname=%s',
'Port=%s',
'Protocol=TCPIP',
'Uid=%s',
'Pwd=%s',
'', // Just to add a semicolon to the end of string
];
$dsnConfig = [
$config['database'],
$config['host'],
$config['port'],
$config['username'],
$config['password'],
];
return sprintf(implode(';', $dsnParts), ...$dsnConfig);
}
}

View File

@ -1,6 +1,8 @@
<?php <?php
namespace Cooperl\Database\DB2; namespace Cooperl\Database\DB2;
use Cooperl\Database\DB2\Query\Processors\DB2ZOSProcessor;
use PDO; use PDO;
use Illuminate\Database\Connection; use Illuminate\Database\Connection;
@ -10,9 +12,13 @@ use Cooperl\Database\DB2\Query\Processors\DB2Processor;
use Cooperl\Database\DB2\Query\Grammars\DB2Grammar as QueryGrammar; use Cooperl\Database\DB2\Query\Grammars\DB2Grammar as QueryGrammar;
use Cooperl\Database\DB2\Schema\Grammars\DB2Grammar as SchemaGrammar; use Cooperl\Database\DB2\Schema\Grammars\DB2Grammar as SchemaGrammar;
/**
* Class DB2Connection
*
* @package Cooperl\Database\DB2
*/
class DB2Connection extends Connection class DB2Connection extends Connection
{ {
/** /**
* The name of the default schema. * The name of the default schema.
* *
@ -20,6 +26,13 @@ class DB2Connection extends Connection
*/ */
protected $defaultSchema; protected $defaultSchema;
/**
* The name of the current schema in use.
*
* @var string
*/
protected $currentSchema;
public function __construct(PDO $pdo, $database = '', $tablePrefix = '', array $config = []) public function __construct(PDO $pdo, $database = '', $tablePrefix = '', array $config = [])
{ {
parent::__construct($pdo, $database, $tablePrefix, $config); parent::__construct($pdo, $database, $tablePrefix, $config);
@ -49,6 +62,8 @@ class DB2Connection extends Connection
/** /**
* Set the name of the current schema. * Set the name of the current schema.
* *
* @param $schema
*
* @return string * @return string
*/ */
public function setCurrentSchema($schema) public function setCurrentSchema($schema)
@ -64,27 +79,29 @@ class DB2Connection extends Connection
*/ */
public function getSchemaBuilder() public function getSchemaBuilder()
{ {
if (is_null($this->schemaGrammar)) { $this->useDefaultSchemaGrammar(); } if (is_null($this->schemaGrammar)) {
$this->useDefaultSchemaGrammar();
}
return new Builder($this); return new Builder($this);
} }
/** /**
* @return Query\Grammars\Grammar * @return \Illuminate\Database\Grammar
*/ */
protected function getDefaultQueryGrammar() protected function getDefaultQueryGrammar()
{ {
return $this->withTablePrefix(new QueryGrammar); return $this->withTablePrefix(new QueryGrammar());
} }
/** /**
* Default grammar for specified Schema * Default grammar for specified Schema
* @return Schema\Grammars\Grammar *
* @return \Illuminate\Database\Grammar
*/ */
protected function getDefaultSchemaGrammar() protected function getDefaultSchemaGrammar()
{ {
return $this->withTablePrefix(new SchemaGrammar());
return $this->withTablePrefix(new SchemaGrammar);
} }
/** /**
@ -94,7 +111,10 @@ class DB2Connection extends Connection
*/ */
protected function getDefaultPostProcessor() protected function getDefaultPostProcessor()
{ {
return new DB2Processor; if ($this->config['driver'] == 'odbczos') {
return new DB2ZOSProcessor();
} }
return new DB2Processor();
}
} }

View File

@ -1,15 +1,20 @@
<?php <?php
namespace Cooperl\Database\DB2; namespace Cooperl\Database\DB2;
use Cooperl\Database\DB2\Connectors\ODBCConnector; use Cooperl\Database\DB2\Connectors\ODBCConnector;
use Cooperl\Database\DB2\Connectors\IBMConnector; use Cooperl\Database\DB2\Connectors\IBMConnector;
use Cooperl\Database\DB2\Connectors\ODBCZOSConnector;
use Illuminate\Support\ServiceProvider; use Illuminate\Support\ServiceProvider;
use Illuminate\Foundation\AliasLoader;
use Config; use Config;
class DB2ServiceProvider extends ServiceProvider { /**
* Class DB2ServiceProvider
*
* @package Cooperl\Database\DB2
*/
class DB2ServiceProvider extends ServiceProvider
{
/** /**
* Indicates if loading of the provider is deferred. * Indicates if loading of the provider is deferred.
* *
@ -33,42 +38,47 @@ class DB2ServiceProvider extends ServiceProvider {
*/ */
public function register() public function register()
{ {
// get the configs // get the configs
$conns = is_array(Config::get('laravel-db2::database.connections')) ? Config::get('laravel-db2::database.connections') : []; $conns = is_array(Config::get('laravel-db2::database.connections'))
? Config::get('laravel-db2::database.connections')
: [];
// Add my database configurations to the default set of configurations // Add my database configurations to the default set of configurations
$this->app['config']['database.connections'] = array_merge($conns, $this->app['config']['database.connections']); $this->app['config']['database.connections'] = array_merge(
$conns,
$this->app['config']['database.connections']
);
//Extend the connections with pdo_odbc and pdo_ibm drivers // Extend the connections with pdo_odbc and pdo_ibm drivers
foreach(Config::get('database.connections') as $conn => $config) foreach (Config::get('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'])) {
//Only use configurations that feature a "odbc" or "ibm" driver
if(!isset($config['driver']) || !in_array($config['driver'], ['odbc', 'ibm']) )
{
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 'odbc': case 'odbc':
$connector = new ODBCConnector(); $connector = new ODBCConnector();
break;
case 'odbczos':
$connector = new ODBCZOSConnector();
break; break;
case 'ibm': case 'ibm':
$connector = new IBMConnector();
break;
default: default:
$connector = new IBMConnector();
break; break;
} }
$db2Connection = $connector->connect($config); $db2Connection = $connector->connect($config);
return new DB2Connection($db2Connection, $config["database"], $config["prefix"], $config); return new DB2Connection($db2Connection, $config["database"], $config["prefix"], $config);
}); });
} }
} }
/** /**
@ -80,5 +90,4 @@ class DB2ServiceProvider extends ServiceProvider {
{ {
return []; return [];
} }
} }

View File

@ -1,21 +1,29 @@
<?php <?php
namespace Cooperl\Database\DB2\Query\Grammars; namespace Cooperl\Database\DB2\Query\Grammars;
use Illuminate\Database\Query\Grammars\Grammar; use Illuminate\Database\Query\Grammars\Grammar;
use Illuminate\Database\Query\Builder; use Illuminate\Database\Query\Builder;
/**
* Class DB2Grammar
*
* @package Cooperl\Database\DB2\Query\Grammars
*/
class DB2Grammar extends Grammar class DB2Grammar extends Grammar
{ {
/** /**
* Wrap a single string in keyword identifiers. * Wrap a single string in keyword identifiers.
* *
* @param string $value * @param string $value
*
* @return string * @return string
*/ */
protected function wrapValue($value) protected function wrapValue($value)
{ {
if ($value === '*') return $value; if ($value === '*') {
return $value;
}
return str_replace('"', '""', $value); return str_replace('"', '""', $value);
} }
@ -23,8 +31,9 @@ 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
*/ */
protected function compileLimit(Builder $query, $limit) protected function compileLimit(Builder $query, $limit)
@ -35,20 +44,22 @@ class DB2Grammar extends Grammar
/** /**
* Compile a select query into SQL. * Compile a select query into SQL.
* *
* @param Illuminate\Database\Query\Builder * @param \Illuminate\Database\Query\Builder $query
*
* @return string * @return string
*/ */
public function compileSelect(Builder $query) public function compileSelect(Builder $query)
{ {
if (is_null($query->columns)) $query->columns = array('*'); if (is_null($query->columns)) {
$query->columns = array('*');
}
$components = $this->compileComponents($query); $components = $this->compileComponents($query);
// If an offset is present on the query, we will need to wrap the query in // If an offset is present on the query, we will need to wrap the query in
// a big "ANSI" offset syntax block. This is very nasty compared to the // a big "ANSI" offset syntax block. This is very nasty compared to the
// other database systems but is necessary for implementing features. // other database systems but is necessary for implementing features.
if ($query->offset > 0) if ($query->offset > 0) {
{
return $this->compileAnsiOffset($query, $components); return $this->compileAnsiOffset($query, $components);
} }
@ -58,8 +69,9 @@ 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
*/ */
protected function compileAnsiOffset(Builder $query, $components) protected function compileAnsiOffset(Builder $query, $components)
@ -67,8 +79,7 @@ class DB2Grammar extends Grammar
// An ORDER BY clause is required to make this offset query work, so if one does // An ORDER BY clause is required to make this offset query work, so if one does
// not exist we'll just create a dummy clause to trick the database and so it // not exist we'll just create a dummy clause to trick the database and so it
// does not complain about the queries for not having an "order by" clause. // does not complain about the queries for not having an "order by" clause.
if ( ! isset($components['orders'])) if (!isset($components['orders'])) {
{
$components['orders'] = 'order by 1'; $components['orders'] = 'order by 1';
} }
@ -79,12 +90,7 @@ 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)
{
$columns = 'select ' . $this->tablePrefix . $query->from . '.*, ';
}
$components['columns'] = $this->compileOver($orderings, $columns); $components['columns'] = $this->compileOver($orderings, $columns);
@ -109,6 +115,8 @@ 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
*
* @return string * @return string
*/ */
protected function compileOver($orderings, $columns) protected function compileOver($orderings, $columns)
@ -116,12 +124,16 @@ class DB2Grammar extends Grammar
return "{$columns} row_number() over ({$orderings}) as row_num"; return "{$columns} row_number() over ({$orderings}) as row_num";
} }
/**
* @param $query
*
* @return string
*/
protected function compileRowConstraint($query) protected function compileRowConstraint($query)
{ {
$start = $query->offset + 1; $start = $query->offset + 1;
if ($query->limit > 0) if ($query->limit > 0) {
{
$finish = $query->offset + $query->limit; $finish = $query->offset + $query->limit;
return "between {$start} and {$finish}"; return "between {$start} and {$finish}";
@ -135,6 +147,7 @@ class DB2Grammar extends Grammar
* *
* @param string $sql * @param string $sql
* @param string $constraint * @param string $constraint
*
* @return string * @return string
*/ */
protected function compileTableExpression($sql, $constraint) protected function compileTableExpression($sql, $constraint)
@ -145,8 +158,9 @@ 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
*/ */
protected function compileOffset(Builder $query, $offset) protected function compileOffset(Builder $query, $offset)
@ -163,5 +177,4 @@ class DB2Grammar extends Grammar
{ {
return 'Y-m-d H:i:s.u'; return 'Y-m-d H:i:s.u';
} }
} }

View File

@ -1,17 +1,24 @@
<?php <?php
namespace Cooperl\Database\DB2\Query\Processors; namespace Cooperl\Database\DB2\Query\Processors;
use Illuminate\Database\Query\Builder; use Illuminate\Database\Query\Builder;
use Illuminate\Database\Query\Processors\Processor; use Illuminate\Database\Query\Processors\Processor;
use Cooperl\Database\DB2\Query\Grammars\DB2Grammar; use Cooperl\Database\DB2\Query\Grammars\DB2Grammar;
class DB2Processor extends Processor { /**
* Class DB2Processor
*
* @package Cooperl\Database\DB2\Query\Processors
*/
class DB2Processor extends Processor
{
/** /**
* Process the results of a "select" query. * Process the results of a "select" query.
* *
* @param \Illuminate\Database\Query\Builder $query * @param \Illuminate\Database\Query\Builder $query
* @param array $results * @param array $results
*
* @return array * @return array
*/ */
/*public function processSelect(Builder $query, $results) /*public function processSelect(Builder $query, $results)
@ -37,29 +44,29 @@ class DB2Processor extends Processor {
* @param string $sql * @param string $sql
* @param array $values * @param array $values
* @param string $sequence * @param string $sequence
*
* @return int/array * @return int/array
*/ */
public function processInsertGetId(Builder $query, $sql, $values, $sequence = null) public function processInsertGetId(Builder $query, $sql, $values, $sequence = null)
{ {
$sequenceStr = $sequence ?: 'id'; $sequenceStr = $sequence ?: 'id';
if (is_array($sequence))
{ if (is_array($sequence)) {
$grammar = new DB2Grammar; $grammar = new DB2Grammar();
$sequenceStr = $grammar->columnize($sequence); $sequenceStr = $grammar->columnize($sequence);
} }
$sql = 'select ' . $sequenceStr . ' from new table (' . $sql;
$sql = 'select '.$sequenceStr.' from new table ('.$sql;
$sql .= ')'; $sql .= ')';
$results = $query->getConnection()->select($sql, $values); $results = $query->getConnection()->select($sql, $values);
if (is_array($sequence))
{ if (is_array($sequence)) {
return array_values((array) $results[0]); return array_values((array) $results[0]);
} } else {
else
{
$result = (array) $results[0]; $result = (array) $results[0];
$id = $result[$sequenceStr]; $id = $result[$sequenceStr];
return is_numeric($id) ? (int) $id : $id; return is_numeric($id) ? (int) $id : $id;
} }
} }
} }

View File

@ -0,0 +1,49 @@
<?php
namespace Cooperl\Database\DB2\Query\Processors;
use Illuminate\Database\Query\Builder;
use Illuminate\Database\Query\Processors\Processor;
use Cooperl\Database\DB2\Query\Grammars\DB2Grammar;
/**
* Class DB2ZOSProcessor
*
* @package Cooperl\Database\DB2\Query\Processors
*/
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
*
* @return int/array
*/
public function processInsertGetId(Builder $query, $sql, $values, $sequence = null)
{
$sequenceStr = $sequence ?: 'id';
if (is_array($sequence)) {
$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);
if (is_array($sequence)) {
return array_values((array) $results[0]);
} else {
$result = (array) $results[0];
$id = $result[strtolower($sequenceStr)];
return is_numeric($id) ? (int) $id : $id;
}
}
}

View File

@ -1,8 +1,14 @@
<?php <?php
namespace Cooperl\Database\DB2\Schema; namespace Cooperl\Database\DB2\Schema;
class Blueprint extends \Illuminate\Database\Schema\Blueprint { /**
* Class Blueprint
*
* @package Cooperl\Database\DB2\Schema
*/
class Blueprint extends \Illuminate\Database\Schema\Blueprint
{
/** /**
* Specify a system name for the table. * Specify a system name for the table.
* *
@ -17,6 +23,7 @@ class Blueprint extends \Illuminate\Database\Schema\Blueprint {
* Specify a label for the table. * Specify a label for the table.
* *
* @param string $label * @param string $label
*
* @return \Illuminate\Support\Fluent * @return \Illuminate\Support\Fluent
*/ */
public function label($label) public function label($label)
@ -30,6 +37,7 @@ class Blueprint extends \Illuminate\Database\Schema\Blueprint {
* @param string $type * @param string $type
* @param string|array $columns * @param string|array $columns
* @param string $index * @param string $index
*
* @return \Illuminate\Support\Fluent * @return \Illuminate\Support\Fluent
*/ */
protected function indexCommand($type, $columns, $index) protected function indexCommand($type, $columns, $index)
@ -39,13 +47,14 @@ class Blueprint extends \Illuminate\Database\Schema\Blueprint {
switch ($type) { switch ($type) {
case 'index': case 'index':
$indexSystem = false; $indexSystem = false;
if (!is_null($index))
{ if (!is_null($index)) {
$indexSystem = $index; $indexSystem = $index;
} }
$index = $this->createIndexName($type, $columns); $index = $this->createIndexName($type, $columns);
return $this->addCommand($type, compact('index', 'indexSystem', 'columns')); return $this->addCommand($type, compact('index', 'indexSystem', 'columns'));
break;
default: default:
break; break;
} }
@ -53,8 +62,7 @@ class Blueprint extends \Illuminate\Database\Schema\Blueprint {
// If no name was specified for this index, we will create one using a basic // If no name was specified for this index, we will create one using a basic
// convention of the table name, followed by the columns, followed by an // convention of the table name, followed by the columns, followed by an
// index type, such as primary or index, which makes the index unique. // index type, such as primary or index, which makes the index unique.
if (is_null($index)) if (is_null($index)) {
{
$index = $this->createIndexName($type, $columns); $index = $this->createIndexName($type, $columns);
} }
@ -65,6 +73,7 @@ class Blueprint extends \Illuminate\Database\Schema\Blueprint {
* Create a new boolean column on the table. * Create a new boolean column on the table.
* *
* @param string $column * @param string $column
*
* @return \Illuminate\Support\Fluent * @return \Illuminate\Support\Fluent
*/ */
public function boolean($column) public function boolean($column)
@ -72,10 +81,11 @@ class Blueprint extends \Illuminate\Database\Schema\Blueprint {
$prefix = $this->table; $prefix = $this->table;
// Aucune utilité d'avoir le nom du schéma dans le préfixe de la contrainte check pour le type booléen // Aucune utilité d'avoir le nom du schéma dans le préfixe de la contrainte check pour le type booléen
$schemaTable = explode(".", $this->table); $schemaTable = explode(".", $this->table);
if (count($schemaTable) > 1)
{ if (count($schemaTable) > 1) {
$prefix = $schemaTable[1]; $prefix = $schemaTable[1];
} }
return $this->addColumn('boolean', $column, ['prefix' => $prefix]); return $this->addColumn('boolean', $column, ['prefix' => $prefix]);
} }
@ -85,11 +95,11 @@ class Blueprint extends \Illuminate\Database\Schema\Blueprint {
* @param string $column * @param string $column
* @param int $total * @param int $total
* @param int $places * @param int $places
*
* @return \Illuminate\Support\Fluent * @return \Illuminate\Support\Fluent
*/ */
public function numeric($column, $total = 8, $places = 2) public function numeric($column, $total = 8, $places = 2)
{ {
return $this->addColumn('numeric', $column, compact('total', 'places')); return $this->addColumn('numeric', $column, compact('total', 'places'));
} }
} }

View File

@ -1,29 +1,34 @@
<?php <?php
namespace Cooperl\Database\DB2\Schema; namespace Cooperl\Database\DB2\Schema;
use Closure; use Closure;
use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Blueprint;
class Builder extends \Illuminate\Database\Schema\Builder { /**
* Class Builder
*
* @package Cooperl\Database\DB2\Schema
*/
class Builder extends \Illuminate\Database\Schema\Builder
{
/** /**
* Determine if the given table exists. * Determine if the given table exists.
* *
* @param string $table * @param string $table
*
* @return bool * @return bool
*/ */
public function hasTable($table) public function hasTable($table)
{ {
$sql = $this->grammar->compileTableExists(); $sql = $this->grammar->compileTableExists();
$schemaTable = explode(".", $table); $schemaTable = explode(".", $table);
if (count($schemaTable) > 1)
{ if (count($schemaTable) > 1) {
$schema = $schemaTable[0]; $schema = $schemaTable[0];
$table = $this->connection->getTablePrefix().$schemaTable[1]; $table = $this->connection->getTablePrefix().$schemaTable[1];
} } else {
else
{
$schema = $this->connection->getDefaultSchema(); $schema = $this->connection->getDefaultSchema();
$table = $this->connection->getTablePrefix().$table; $table = $this->connection->getTablePrefix().$table;
} }
@ -35,16 +40,14 @@ class Builder extends \Illuminate\Database\Schema\Builder {
* Get the column listing for a given table. * Get the column listing for a given table.
* *
* @param string $table * @param string $table
*
* @return array * @return array
*/ */
public function getColumnListing($table) public function getColumnListing($table)
{ {
$sql = $this->grammar->compileColumnExists(); $sql = $this->grammar->compileColumnExists();
$database = $this->connection->getDatabaseName(); $database = $this->connection->getDatabaseName();
$table = $this->connection->getTablePrefix().$table; $table = $this->connection->getTablePrefix().$table;
$results = $this->connection->select($sql, [$database, $table]); $results = $this->connection->select($sql, [$database, $table]);
return $this->connection->getPostProcessor()->processColumnListing($results); return $this->connection->getPostProcessor()->processColumnListing($results);
@ -53,19 +56,17 @@ class Builder extends \Illuminate\Database\Schema\Builder {
/** /**
* Execute the blueprint to build / modify the table. * Execute the blueprint to build / modify the table.
* *
* @param \Cooperl\Database\DB2\Schema\Blueprint $blueprint * @param Blueprint $blueprint
* @return void
*/ */
protected function build(Blueprint $blueprint) protected function build(Blueprint $blueprint)
{ {
$schemaTable = explode(".", $blueprint->getTable()); $schemaTable = explode(".", $blueprint->getTable());
if (count($schemaTable) > 1)
{ if (count($schemaTable) > 1) {
$this->connection->setCurrentSchema($schemaTable[0]); $this->connection->setCurrentSchema($schemaTable[0]);
} }
$blueprint->build($this->connection, $this->grammar); $blueprint->build($this->connection, $this->grammar);
$this->connection->resetCurrentSchema(); $this->connection->resetCurrentSchema();
} }
@ -74,16 +75,15 @@ class Builder extends \Illuminate\Database\Schema\Builder {
* *
* @param string $table * @param string $table
* @param \Closure $callback * @param \Closure $callback
*
* @return \Cooperl\Database\DB2\Schema\Blueprint * @return \Cooperl\Database\DB2\Schema\Blueprint
*/ */
protected function createBlueprint($table, Closure $callback = null) protected function createBlueprint($table, Closure $callback = null)
{ {
if (isset($this->resolver)) if (isset($this->resolver)) {
{
return call_user_func($this->resolver, $table, $callback); return call_user_func($this->resolver, $table, $callback);
} }
return new \Cooperl\Database\DB2\Schema\Blueprint($table, $callback); return new \Cooperl\Database\DB2\Schema\Blueprint($table, $callback);
} }
} }

View File

@ -1,14 +1,15 @@
<?php <?php
namespace Cooperl\Database\DB2\Schema\Grammars; namespace Cooperl\Database\DB2\Schema\Grammars;
use Illuminate\Database\Query\Expression;
use Illuminate\Support\Fluent; use Illuminate\Support\Fluent;
use Illuminate\Database\Connection; use Illuminate\Database\Connection;
use Illuminate\Database\Schema\Grammars\Grammar; use Illuminate\Database\Schema\Grammars\Grammar;
use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Blueprint;
class DB2Grammar extends Grammar { class DB2Grammar extends Grammar
{
/** /**
* The possible column modifiers. * The possible column modifiers.
* *
@ -28,11 +29,14 @@ class DB2Grammar extends Grammar {
* Wrap a single string in keyword identifiers. * Wrap a single string in keyword identifiers.
* *
* @param string $value * @param string $value
*
* @return string * @return string
*/ */
protected function wrapValue($value) protected function wrapValue($value)
{ {
if ($value === '*') return $value; if ($value === '*') {
return $value;
}
return str_replace('"', '""', $value); return str_replace('"', '""', $value);
} }
@ -50,12 +54,16 @@ class DB2Grammar extends Grammar {
/** /**
* Compile the query to determine the list of columns. * Compile the query to determine the list of columns.
* *
* @param string $table
* @return string * @return string
*/ */
public function compileColumnExists() public function compileColumnExists()
{ {
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(?)
";
} }
@ -65,16 +73,15 @@ class DB2Grammar extends Grammar {
* @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Database\Schema\Blueprint $blueprint
* @param \Illuminate\Support\Fluent $command * @param \Illuminate\Support\Fluent $command
* @param \Illuminate\Database\Connection $connection * @param \Illuminate\Database\Connection $connection
*
* @return string * @return string
*/ */
public function compileCreate(Blueprint $blueprint, Fluent $command, Connection $connection) public function compileCreate(Blueprint $blueprint, Fluent $command, Connection $connection)
{ {
$columns = implode(', ', $this->getColumns($blueprint)); $columns = implode(', ', $this->getColumns($blueprint));
$sql = 'create table '.$this->wrapTable($blueprint); $sql = 'create table '.$this->wrapTable($blueprint);
if (isset($blueprint->systemName)) if (isset($blueprint->systemName)) {
{
$sql .= ' for system name '.$blueprint->systemName; $sql .= ' for system name '.$blueprint->systemName;
} }
@ -89,25 +96,26 @@ class DB2Grammar extends Grammar {
* @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Database\Schema\Blueprint $blueprint
* @param \Illuminate\Support\Fluent $command * @param \Illuminate\Support\Fluent $command
* @param \Illuminate\Database\Connection $connection * @param \Illuminate\Database\Connection $connection
*
* @return string * @return string
*/ */
public function compileLabel(Blueprint $blueprint, Fluent $command, Connection $connection) public function compileLabel(Blueprint $blueprint, Fluent $command, Connection $connection)
{ {
return 'label on table '.$this->wrapTable($blueprint).' is \'' . $command->label . '\''; return 'label on table '.$this->wrapTable($blueprint).' is \''.$command->label.'\'';
} }
/** /**
* Compile the blueprint's column definitions. * Compile the blueprint's column definitions.
* *
* @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Database\Schema\Blueprint $blueprint
*
* @return array * @return array
*/ */
protected function getColumns(Blueprint $blueprint) protected function getColumns(Blueprint $blueprint)
{ {
$columns = []; $columns = [];
foreach ($blueprint->getColumns() as $column) foreach ($blueprint->getColumns() as $column) {
{
// Each of the column types have their own compiler functions which are tasked // Each of the column types have their own compiler functions which are tasked
// with turning the column definition into its SQL format for this platform // with turning the column definition into its SQL format for this platform
// used by the connection. The column's modifiers are compiled and added. // used by the connection. The column's modifiers are compiled and added.
@ -127,14 +135,13 @@ class DB2Grammar extends Grammar {
* @param string $sql * @param string $sql
* @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Database\Schema\Blueprint $blueprint
* @param \Illuminate\Support\Fluent $column * @param \Illuminate\Support\Fluent $column
*
* @return string * @return string
*/ */
protected function addPreModifiers($sql, Blueprint $blueprint, Fluent $column) protected function addPreModifiers($sql, Blueprint $blueprint, Fluent $column)
{ {
foreach ($this->preModifiers as $preModifier) foreach ($this->preModifiers as $preModifier) {
{ if (method_exists($this, $method = "modify{$preModifier}")) {
if (method_exists($this, $method = "modify{$preModifier}"))
{
$sql .= $this->{$method}($blueprint, $column); $sql .= $this->{$method}($blueprint, $column);
} }
} }
@ -147,16 +154,16 @@ class DB2Grammar extends Grammar {
* *
* @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Database\Schema\Blueprint $blueprint
* @param \Illuminate\Support\Fluent $command * @param \Illuminate\Support\Fluent $command
*
* @return string * @return string
*/ */
public function compileAdd(Blueprint $blueprint, Fluent $command) public function compileAdd(Blueprint $blueprint, Fluent $command)
{ {
$table = $this->wrapTable($blueprint); $table = $this->wrapTable($blueprint);
$columns = $this->prefixArray('add', $this->getColumns($blueprint)); $columns = $this->prefixArray('add', $this->getColumns($blueprint));
$statements = [];
foreach ($columns as $column) foreach ($columns as $column) {
{
$statements[] = 'alter table '.$table.' '.$column; $statements[] = 'alter table '.$table.' '.$column;
} }
@ -168,18 +175,18 @@ class DB2Grammar extends Grammar {
* *
* @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Database\Schema\Blueprint $blueprint
* @param \Illuminate\Support\Fluent $command * @param \Illuminate\Support\Fluent $command
*
* @return string * @return string
*/ */
public function compilePrimary(Blueprint $blueprint, Fluent $command) public function compilePrimary(Blueprint $blueprint, Fluent $command)
{ {
$table = $this->wrapTable($blueprint); $table = $this->wrapTable($blueprint);
$columns = $this->columnize($command->columns); $columns = $this->columnize($command->columns);
// Aucune utilité d'avoir le nom du schéma dans le nom de la contrainte Primary // Aucune utilité d'avoir le nom du schéma dans le nom de la contrainte Primary
$schemaTable = explode(".", $table); $schemaTable = explode(".", $table);
if (count($schemaTable) > 1)
{ if (count($schemaTable) > 1) {
$command->index = str_replace($schemaTable[0]."_", "", $command->index); $command->index = str_replace($schemaTable[0]."_", "", $command->index);
} }
@ -191,42 +198,38 @@ class DB2Grammar extends Grammar {
* *
* @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Database\Schema\Blueprint $blueprint
* @param \Illuminate\Support\Fluent $command * @param \Illuminate\Support\Fluent $command
*
* @return string * @return string
*/ */
public function compileForeign(Blueprint $blueprint, Fluent $command) public function compileForeign(Blueprint $blueprint, Fluent $command)
{ {
$table = $this->wrapTable($blueprint); $table = $this->wrapTable($blueprint);
$on = $this->wrapTable($command->on); $on = $this->wrapTable($command->on);
// We need to prepare several of the elements of the foreign key definition // We need to prepare several of the elements of the foreign key definition
// before we can create the SQL, such as wrapping the tables and convert // before we can create the SQL, such as wrapping the tables and convert
// an array of columns to comma-delimited strings for the SQL queries. // an array of columns to comma-delimited strings for the SQL queries.
$columns = $this->columnize($command->columns); $columns = $this->columnize($command->columns);
$onColumns = $this->columnize((array) $command->references); $onColumns = $this->columnize((array) $command->references);
// Aucune utilité d'avoir le nom du schéma dans le nom de la contrainte Foreign // Aucune utilité d'avoir le nom du schéma dans le nom de la contrainte Foreign
$schemaTable = explode(".", $table); $schemaTable = explode(".", $table);
if (count($schemaTable) > 1)
{ if (count($schemaTable) > 1) {
$command->index = str_replace($schemaTable[0]."_", "", $command->index); $command->index = str_replace($schemaTable[0]."_", "", $command->index);
} }
$sql = "alter table {$table} add constraint {$command->index} "; $sql = "alter table {$table} add constraint {$command->index} ";
$sql .= "foreign key ({$columns}) references {$on} ({$onColumns})"; $sql .= "foreign key ({$columns}) references {$on} ({$onColumns})";
// Once we have the basic foreign key creation statement constructed we can // Once we have the basic foreign key creation statement constructed we can
// build out the syntax for what should happen on an update or delete of // build out the syntax for what should happen on an update or delete of
// the affected columns, which will get something like "cascade", etc. // the affected columns, which will get something like "cascade", etc.
if ( ! is_null($command->onDelete)) if (!is_null($command->onDelete)) {
{
$sql .= " on delete {$command->onDelete}"; $sql .= " on delete {$command->onDelete}";
} }
if ( ! is_null($command->onUpdate)) if (!is_null($command->onUpdate)) {
{
$sql .= " on update {$command->onUpdate}"; $sql .= " on update {$command->onUpdate}";
} }
@ -238,18 +241,18 @@ class DB2Grammar extends Grammar {
* *
* @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Database\Schema\Blueprint $blueprint
* @param \Illuminate\Support\Fluent $command * @param \Illuminate\Support\Fluent $command
*
* @return string * @return string
*/ */
public function compileUnique(Blueprint $blueprint, Fluent $command) public function compileUnique(Blueprint $blueprint, Fluent $command)
{ {
$table = $this->wrapTable($blueprint); $table = $this->wrapTable($blueprint);
$columns = $this->columnize($command->columns); $columns = $this->columnize($command->columns);
// Aucune utilité d'avoir le nom du schéma dans le nom de la contrainte Unique // Aucune utilité d'avoir le nom du schéma dans le nom de la contrainte Unique
$schemaTable = explode(".", $table); $schemaTable = explode(".", $table);
if (count($schemaTable) > 1)
{ if (count($schemaTable) > 1) {
$command->index = str_replace($schemaTable[0]."_", "", $command->index); $command->index = str_replace($schemaTable[0]."_", "", $command->index);
} }
@ -261,26 +264,27 @@ class DB2Grammar extends Grammar {
* *
* @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Database\Schema\Blueprint $blueprint
* @param \Illuminate\Support\Fluent $command * @param \Illuminate\Support\Fluent $command
*
* @return string * @return string
*/ */
public function compileIndex(Blueprint $blueprint, Fluent $command) public function compileIndex(Blueprint $blueprint, Fluent $command)
{ {
$table = $this->wrapTable($blueprint); $table = $this->wrapTable($blueprint);
$columns = $this->columnize($command->columns); $columns = $this->columnize($command->columns);
// Aucune utilité d'avoir le nom du schéma dans le nom de la contrainte Index // Aucune utilité d'avoir le nom du schéma dans le nom de la contrainte Index
$schemaTable = explode(".", $table); $schemaTable = explode(".", $table);
if (count($schemaTable) > 1)
{ if (count($schemaTable) > 1) {
$command->index = str_replace($schemaTable[0]."_", "", $command->index); $command->index = str_replace($schemaTable[0]."_", "", $command->index);
} }
$sql = "create index {$command->index}"; $sql = "create index {$command->index}";
if ($command->indexSystem)
{ if ($command->indexSystem) {
$sql .= " for system name {$command->indexSystem}"; $sql .= " for system name {$command->indexSystem}";
} }
$sql .= " on {$table}($columns)"; $sql .= " on {$table}($columns)";
//return "create index {$command->index} for system name on {$table}($columns)"; //return "create index {$command->index} for system name on {$table}($columns)";
@ -292,6 +296,7 @@ class DB2Grammar extends Grammar {
* *
* @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Database\Schema\Blueprint $blueprint
* @param \Illuminate\Support\Fluent $command * @param \Illuminate\Support\Fluent $command
*
* @return string * @return string
*/ */
public function compileDrop(Blueprint $blueprint, Fluent $command) public function compileDrop(Blueprint $blueprint, Fluent $command)
@ -304,6 +309,7 @@ class DB2Grammar extends Grammar {
* *
* @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Database\Schema\Blueprint $blueprint
* @param \Illuminate\Support\Fluent $command * @param \Illuminate\Support\Fluent $command
*
* @return string * @return string
*/ */
public function compileDropIfExists(Blueprint $blueprint, Fluent $command) public function compileDropIfExists(Blueprint $blueprint, Fluent $command)
@ -316,12 +322,12 @@ class DB2Grammar extends Grammar {
* *
* @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Database\Schema\Blueprint $blueprint
* @param \Illuminate\Support\Fluent $command * @param \Illuminate\Support\Fluent $command
*
* @return string * @return string
*/ */
public function compileDropColumn(Blueprint $blueprint, Fluent $command) public function compileDropColumn(Blueprint $blueprint, Fluent $command)
{ {
$columns = $this->prefixArray('drop', $this->wrapArray($command->columns)); $columns = $this->prefixArray('drop', $this->wrapArray($command->columns));
$table = $this->wrapTable($blueprint); $table = $this->wrapTable($blueprint);
return 'alter table '.$table.' '.implode(', ', $columns); return 'alter table '.$table.' '.implode(', ', $columns);
@ -332,6 +338,7 @@ class DB2Grammar extends Grammar {
* *
* @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Database\Schema\Blueprint $blueprint
* @param \Illuminate\Support\Fluent $command * @param \Illuminate\Support\Fluent $command
*
* @return string * @return string
*/ */
public function compileDropPrimary(Blueprint $blueprint, Fluent $command) public function compileDropPrimary(Blueprint $blueprint, Fluent $command)
@ -344,6 +351,7 @@ class DB2Grammar extends Grammar {
* *
* @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Database\Schema\Blueprint $blueprint
* @param \Illuminate\Support\Fluent $command * @param \Illuminate\Support\Fluent $command
*
* @return string * @return string
*/ */
public function compileDropUnique(Blueprint $blueprint, Fluent $command) public function compileDropUnique(Blueprint $blueprint, Fluent $command)
@ -352,8 +360,8 @@ class DB2Grammar extends Grammar {
// Aucune utilité d'avoir le nom du schéma dans le nom de la contrainte Unique // Aucune utilité d'avoir le nom du schéma dans le nom de la contrainte Unique
$schemaTable = explode(".", $table); $schemaTable = explode(".", $table);
if (count($schemaTable) > 1)
{ if (count($schemaTable) > 1) {
$command->index = str_replace($schemaTable[0]."_", "", $command->index); $command->index = str_replace($schemaTable[0]."_", "", $command->index);
} }
@ -365,6 +373,7 @@ class DB2Grammar extends Grammar {
* *
* @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Database\Schema\Blueprint $blueprint
* @param \Illuminate\Support\Fluent $command * @param \Illuminate\Support\Fluent $command
*
* @return string * @return string
*/ */
public function compileDropIndex(Blueprint $blueprint, Fluent $command) public function compileDropIndex(Blueprint $blueprint, Fluent $command)
@ -373,8 +382,8 @@ class DB2Grammar extends Grammar {
// Aucune utilité d'avoir le nom du schéma dans le nom de la contrainte Index // Aucune utilité d'avoir le nom du schéma dans le nom de la contrainte Index
$schemaTable = explode(".", $table); $schemaTable = explode(".", $table);
if (count($schemaTable) > 1)
{ if (count($schemaTable) > 1) {
$command->index = str_replace($schemaTable[0]."_", "", $command->index); $command->index = str_replace($schemaTable[0]."_", "", $command->index);
} }
@ -386,6 +395,7 @@ class DB2Grammar extends Grammar {
* *
* @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Database\Schema\Blueprint $blueprint
* @param \Illuminate\Support\Fluent $command * @param \Illuminate\Support\Fluent $command
*
* @return string * @return string
*/ */
public function compileDropForeign(Blueprint $blueprint, Fluent $command) public function compileDropForeign(Blueprint $blueprint, Fluent $command)
@ -394,8 +404,8 @@ class DB2Grammar extends Grammar {
// Aucune utilité d'avoir le nom du schéma dans le nom de la contrainte Foreign // Aucune utilité d'avoir le nom du schéma dans le nom de la contrainte Foreign
$schemaTable = explode(".", $table); $schemaTable = explode(".", $table);
if (count($schemaTable) > 1)
{ if (count($schemaTable) > 1) {
$command->index = str_replace($schemaTable[0]."_", "", $command->index); $command->index = str_replace($schemaTable[0]."_", "", $command->index);
} }
@ -407,6 +417,7 @@ class DB2Grammar extends Grammar {
* *
* @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Database\Schema\Blueprint $blueprint
* @param \Illuminate\Support\Fluent $command * @param \Illuminate\Support\Fluent $command
*
* @return string * @return string
*/ */
public function compileRename(Blueprint $blueprint, Fluent $command) public function compileRename(Blueprint $blueprint, Fluent $command)
@ -420,6 +431,7 @@ class DB2Grammar extends Grammar {
* Create the column definition for a char type. * Create the column definition for a char type.
* *
* @param \Illuminate\Support\Fluent $column * @param \Illuminate\Support\Fluent $column
*
* @return string * @return string
*/ */
protected function typeChar(Fluent $column) protected function typeChar(Fluent $column)
@ -431,6 +443,7 @@ class DB2Grammar extends Grammar {
* Create the column definition for a string type. * Create the column definition for a string type.
* *
* @param \Illuminate\Support\Fluent $column * @param \Illuminate\Support\Fluent $column
*
* @return string * @return string
*/ */
protected function typeString(Fluent $column) protected function typeString(Fluent $column)
@ -442,11 +455,13 @@ class DB2Grammar extends Grammar {
* Create the column definition for a text type. * Create the column definition for a text type.
* *
* @param \Illuminate\Support\Fluent $column * @param \Illuminate\Support\Fluent $column
*
* @return string * @return string
*/ */
protected function typeText(Fluent $column) protected function typeText(Fluent $column)
{ {
$colLength = ($column->length ? $column->length : 16369); $colLength = ($column->length ? $column->length : 16369);
return "varchar($colLength)"; return "varchar($colLength)";
} }
@ -454,11 +469,13 @@ class DB2Grammar extends Grammar {
* Create the column definition for a medium text type. * Create the column definition for a medium text type.
* *
* @param \Illuminate\Support\Fluent $column * @param \Illuminate\Support\Fluent $column
*
* @return string * @return string
*/ */
protected function typeMediumText(Fluent $column) protected function typeMediumText(Fluent $column)
{ {
$colLength = ($column->length ? $column->length : 16369); $colLength = ($column->length ? $column->length : 16369);
return "varchar($colLength)"; return "varchar($colLength)";
} }
@ -466,11 +483,13 @@ class DB2Grammar extends Grammar {
* Create the column definition for a long text type. * Create the column definition for a long text type.
* *
* @param \Illuminate\Support\Fluent $column * @param \Illuminate\Support\Fluent $column
*
* @return string * @return string
*/ */
protected function typeLongText(Fluent $column) protected function typeLongText(Fluent $column)
{ {
$colLength = ($column->length ? $column->length : 16369); $colLength = ($column->length ? $column->length : 16369);
return "varchar($colLength)"; return "varchar($colLength)";
} }
@ -478,6 +497,7 @@ class DB2Grammar extends Grammar {
* Create the column definition for a big integer type. * Create the column definition for a big integer type.
* *
* @param \Illuminate\Support\Fluent $column * @param \Illuminate\Support\Fluent $column
*
* @return string * @return string
*/ */
protected function typeBigInteger(Fluent $column) protected function typeBigInteger(Fluent $column)
@ -489,6 +509,7 @@ class DB2Grammar extends Grammar {
* Create the column definition for a integer type. * Create the column definition for a integer type.
* *
* @param \Illuminate\Support\Fluent $column * @param \Illuminate\Support\Fluent $column
*
* @return string * @return string
*/ */
protected function typeInteger(Fluent $column) protected function typeInteger(Fluent $column)
@ -500,6 +521,7 @@ class DB2Grammar extends Grammar {
* Create the column definition for a small integer type. * Create the column definition for a small integer type.
* *
* @param \Illuminate\Support\Fluent $column * @param \Illuminate\Support\Fluent $column
*
* @return string * @return string
*/ */
protected function typeSmallInteger(Fluent $column) protected function typeSmallInteger(Fluent $column)
@ -511,6 +533,7 @@ class DB2Grammar extends Grammar {
* Create the column definition for a numeric type. * Create the column definition for a numeric type.
* *
* @param \Illuminate\Support\Fluent $column * @param \Illuminate\Support\Fluent $column
*
* @return string * @return string
*/ */
protected function typeNumeric(Fluent $column) protected function typeNumeric(Fluent $column)
@ -522,6 +545,7 @@ class DB2Grammar extends Grammar {
* Create the column definition for a float type. * Create the column definition for a float type.
* *
* @param \Illuminate\Support\Fluent $column * @param \Illuminate\Support\Fluent $column
*
* @return string * @return string
*/ */
protected function typeFloat(Fluent $column) protected function typeFloat(Fluent $column)
@ -533,24 +557,23 @@ class DB2Grammar extends Grammar {
* Create the column definition for a double type. * Create the column definition for a double type.
* *
* @param \Illuminate\Support\Fluent $column * @param \Illuminate\Support\Fluent $column
*
* @return string * @return string
*/ */
protected function typeDouble(Fluent $column) protected function typeDouble(Fluent $column)
{ {
if ($column->total && $column->places) if ($column->total && $column->places) {
{
return "double({$column->total}, {$column->places})"; return "double({$column->total}, {$column->places})";
} }
else
{
return 'double'; return 'double';
} }
}
/** /**
* Create the column definition for a decimal type. * Create the column definition for a decimal type.
* *
* @param \Illuminate\Support\Fluent $column * @param \Illuminate\Support\Fluent $column
*
* @return string * @return string
*/ */
protected function typeDecimal(Fluent $column) protected function typeDecimal(Fluent $column)
@ -562,17 +585,28 @@ class DB2Grammar extends Grammar {
* Create the column definition for a boolean type. * Create the column definition for a boolean type.
* *
* @param \Illuminate\Support\Fluent $column * @param \Illuminate\Support\Fluent $column
*
* @return string * @return string
*/ */
protected function typeBoolean(Fluent $column) protected function typeBoolean(Fluent $column)
{ {
return 'smallint constraint '.$column->type.'_'.$column->prefix.'_'.$column->name.' check('.$column->name.' in(0,1))'.(is_null($column->default) ? ' default 0' : ''); $definition = 'smallint constraint %s_%s_%s check(%s in(0, 1)) %s';
return sprintf(
$definition,
$column->type,
$column->prefix,
$column->name,
$column->name,
is_null($column->default) ? ' default 0' : ''
);
} }
/** /**
* Create the column definition for an enum type. * Create the column definition for an enum type.
* *
* @param \Illuminate\Support\Fluent $column * @param \Illuminate\Support\Fluent $column
*
* @return string * @return string
*/ */
protected function typeEnum(Fluent $column) protected function typeEnum(Fluent $column)
@ -584,12 +618,14 @@ class DB2Grammar extends Grammar {
* Create the column definition for a date type. * Create the column definition for a date type.
* *
* @param \Illuminate\Support\Fluent $column * @param \Illuminate\Support\Fluent $column
*
* @return string * @return string
*/ */
protected function typeDate(Fluent $column) protected function typeDate(Fluent $column)
{ {
if ( ! $column->nullable) if (!$column->nullable) {
return 'date default current_date'; return 'date default current_date';
}
return 'date'; return 'date';
} }
@ -598,6 +634,7 @@ class DB2Grammar extends Grammar {
* Create the column definition for a date-time type. * Create the column definition for a date-time type.
* *
* @param \Illuminate\Support\Fluent $column * @param \Illuminate\Support\Fluent $column
*
* @return string * @return string
*/ */
protected function typeDateTime(Fluent $column) protected function typeDateTime(Fluent $column)
@ -609,12 +646,14 @@ class DB2Grammar extends Grammar {
* Create the column definition for a time type. * Create the column definition for a time type.
* *
* @param \Illuminate\Support\Fluent $column * @param \Illuminate\Support\Fluent $column
*
* @return string * @return string
*/ */
protected function typeTime(Fluent $column) protected function typeTime(Fluent $column)
{ {
if ( ! $column->nullable) if (!$column->nullable) {
return 'time default current_time'; return 'time default current_time';
}
return 'time'; return 'time';
} }
@ -623,12 +662,14 @@ class DB2Grammar extends Grammar {
* Create the column definition for a timestamp type. * Create the column definition for a timestamp type.
* *
* @param \Illuminate\Support\Fluent $column * @param \Illuminate\Support\Fluent $column
*
* @return string * @return string
*/ */
protected function typeTimestamp(Fluent $column) protected function typeTimestamp(Fluent $column)
{ {
if ( ! $column->nullable) if (!$column->nullable) {
return 'timestamp default current_timestamp'; return 'timestamp default current_timestamp';
}
return 'timestamp'; return 'timestamp';
} }
@ -637,6 +678,7 @@ class DB2Grammar extends Grammar {
* Create the column definition for a binary type. * Create the column definition for a binary type.
* *
* @param \Illuminate\Support\Fluent $column * @param \Illuminate\Support\Fluent $column
*
* @return string * @return string
*/ */
protected function typeBinary(Fluent $column) protected function typeBinary(Fluent $column)
@ -649,6 +691,7 @@ class DB2Grammar extends Grammar {
* *
* @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Database\Schema\Blueprint $blueprint
* @param \Illuminate\Support\Fluent $column * @param \Illuminate\Support\Fluent $column
*
* @return string|null * @return string|null
*/ */
protected function modifyNullable(Blueprint $blueprint, Fluent $column) protected function modifyNullable(Blueprint $blueprint, Fluent $column)
@ -661,14 +704,16 @@ class DB2Grammar extends Grammar {
* *
* @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Database\Schema\Blueprint $blueprint
* @param \Illuminate\Support\Fluent $column * @param \Illuminate\Support\Fluent $column
*
* @return string|null * @return string|null
*/ */
protected function modifyDefault(Blueprint $blueprint, Fluent $column) protected function modifyDefault(Blueprint $blueprint, Fluent $column)
{ {
if ( ! is_null($column->default)) if (!is_null($column->default)) {
{
return " default ".$this->getDefaultValue($column->default); return " default ".$this->getDefaultValue($column->default);
} }
return null;
} }
/** /**
@ -676,14 +721,16 @@ class DB2Grammar extends Grammar {
* *
* @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Database\Schema\Blueprint $blueprint
* @param \Illuminate\Support\Fluent $column * @param \Illuminate\Support\Fluent $column
*
* @return string|null * @return string|null
*/ */
protected function modifyIncrement(Blueprint $blueprint, Fluent $column) protected function modifyIncrement(Blueprint $blueprint, Fluent $column)
{ {
if (in_array($column->type, $this->serials) && $column->autoIncrement) if (in_array($column->type, $this->serials) && $column->autoIncrement) {
{ return ' as identity constraint '.$blueprint->getTable().'_'.$column->name.'_primary primary key';
return ' as identity constraint ' . $blueprint->getTable() . '_' . $column->name . '_primary primary key';
} }
return null;
} }
@ -692,14 +739,16 @@ class DB2Grammar extends Grammar {
* *
* @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Database\Schema\Blueprint $blueprint
* @param \Illuminate\Support\Fluent $column * @param \Illuminate\Support\Fluent $column
*
* @return string|null * @return string|null
*/ */
protected function modifyBefore(Blueprint $blueprint, Fluent $column) protected function modifyBefore(Blueprint $blueprint, Fluent $column)
{ {
if ( ! is_null($column->before)) if (!is_null($column->before)) {
{
return ' before '.$this->wrap($column->before); return ' before '.$this->wrap($column->before);
} }
return null;
} }
/** /**
@ -707,14 +756,16 @@ class DB2Grammar extends Grammar {
* *
* @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Database\Schema\Blueprint $blueprint
* @param \Illuminate\Support\Fluent $column * @param \Illuminate\Support\Fluent $column
*
* @return string|null * @return string|null
*/ */
protected function modifyForColumn(Blueprint $blueprint, Fluent $column) protected function modifyForColumn(Blueprint $blueprint, Fluent $column)
{ {
if ( ! is_null($column->forColumn)) if (!is_null($column->forColumn)) {
{
return ' for column '.$this->wrap($column->forColumn); return ' for column '.$this->wrap($column->forColumn);
} }
return null;
} }
/** /**
@ -722,14 +773,16 @@ class DB2Grammar extends Grammar {
* *
* @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Database\Schema\Blueprint $blueprint
* @param \Illuminate\Support\Fluent $column * @param \Illuminate\Support\Fluent $column
*
* @return string|null * @return string|null
*/ */
protected function modifyGenerated(Blueprint $blueprint, Fluent $column) protected function modifyGenerated(Blueprint $blueprint, Fluent $column)
{ {
if ( ! is_null($column->generated)) if (!is_null($column->generated)) {
{
return ' generated '.($column->generated === true ? 'always' : $this->wrap($column->generated)); return ' generated '.($column->generated === true ? 'always' : $this->wrap($column->generated));
} }
return null;
} }
/** /**
@ -737,14 +790,16 @@ class DB2Grammar extends Grammar {
* *
* @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Database\Schema\Blueprint $blueprint
* @param \Illuminate\Support\Fluent $column * @param \Illuminate\Support\Fluent $column
*
* @return string|null * @return string|null
*/ */
protected function modifyStartWith(Blueprint $blueprint, Fluent $column) protected function modifyStartWith(Blueprint $blueprint, Fluent $column)
{ {
if ( ! is_null($column->startWith)) if (!is_null($column->startWith)) {
{
return ' (start with '.$column->startWith.')'; return ' (start with '.$column->startWith.')';
} }
return null;
} }
/** /**
@ -752,29 +807,35 @@ class DB2Grammar extends Grammar {
* *
* @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Database\Schema\Blueprint $blueprint
* @param \Illuminate\Support\Fluent $column * @param \Illuminate\Support\Fluent $column
*
* @return string|null * @return string|null
*/ */
protected function modifyImplicitlyHidden(Blueprint $blueprint, Fluent $column) protected function modifyImplicitlyHidden(Blueprint $blueprint, Fluent $column)
{ {
if ( ! is_null($column->implicitlyHidden)) if (!is_null($column->implicitlyHidden)) {
{
return ' implicitly hidden'; return ' implicitly hidden';
} }
return null;
} }
/** /**
* Format a value so that it can be used in "default" clauses. * Format a value so that it can be used in "default" clauses.
* *
* @param mixed $value * @param mixed $value
*
* @return string * @return string
*/ */
protected function getDefaultValue($value) protected function getDefaultValue($value)
{ {
if ($value instanceof Expression if (
$value instanceof Expression
|| is_bool($value) || is_bool($value)
|| is_numeric($value)) return $value; || is_numeric($value)
) {
return $value;
}
return "'".strval($value)."'"; return "'".strval($value)."'";
} }
} }

View File

@ -61,7 +61,7 @@ return [
'connections' => [ 'connections' => [
'ibmi' => [ 'ibmi' => [
'driver' => 'odbc' / 'ibm', 'driver' => 'odbc' / 'ibm' / 'odbczos',
'driverName' => '{IBM i Access ODBC Driver}' / '{iSeries Access ODBC Driver}', 'driverName' => '{IBM i Access ODBC Driver}' / '{iSeries Access ODBC Driver}',
// General settings // General settings
'host' => 'server', 'host' => 'server',
@ -71,6 +71,7 @@ return [
'database' => 'WRKRDBDIRE entry', 'database' => 'WRKRDBDIRE entry',
'prefix' => '', 'prefix' => '',
'schema' => 'default schema', 'schema' => 'default schema',
'port' => 50000,
'signon' => 3, 'signon' => 3,
'ssl' => 0, 'ssl' => 0,
'commitMode' => 2, 'commitMode' => 2,