mirror of
https://github.com/dg/dibi.git
synced 2025-09-05 20:03:12 +02:00
Compare commits
17 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
0a2d12c47a | ||
|
19748f7c5b | ||
|
ee5f1dd293 | ||
|
f4ae1e692f | ||
|
443661f0e9 | ||
|
ac0ab9041b | ||
|
d7885921e6 | ||
|
ce459f440a | ||
|
df37a500fa | ||
|
8a5eddfabc | ||
|
a57f3dfc83 | ||
|
2702de6ccb | ||
|
73e1f366d4 | ||
|
656cbfc40c | ||
|
e778096641 | ||
|
68521d69e3 | ||
|
a68886f51d |
2
.gitattributes
vendored
2
.gitattributes
vendored
@@ -1,4 +1,2 @@
|
|||||||
.gitattributes export-ignore
|
.gitattributes export-ignore
|
||||||
.gitignore export-ignore
|
.gitignore export-ignore
|
||||||
.travis.yml export-ignore
|
|
||||||
tests/ export-ignore
|
|
||||||
|
38
.travis.yml
38
.travis.yml
@@ -1,38 +0,0 @@
|
|||||||
language: php
|
|
||||||
php:
|
|
||||||
- 5.3.3
|
|
||||||
- 5.4
|
|
||||||
- 5.5
|
|
||||||
- 5.6
|
|
||||||
- 7.0
|
|
||||||
- hhvm
|
|
||||||
|
|
||||||
matrix:
|
|
||||||
allow_failures:
|
|
||||||
- php: 7.0
|
|
||||||
- php: hhvm
|
|
||||||
|
|
||||||
script:
|
|
||||||
- vendor/bin/tester tests -s -p php -c tests/php-unix.ini
|
|
||||||
- php code-checker/src/code-checker.php
|
|
||||||
|
|
||||||
after_failure:
|
|
||||||
# Print *.actual content
|
|
||||||
- for i in $(find tests -name \*.actual); do echo "--- $i"; cat $i; echo; echo; done
|
|
||||||
|
|
||||||
before_script:
|
|
||||||
# Install Nette Tester & Code Checker
|
|
||||||
- travis_retry composer install --no-interaction
|
|
||||||
- travis_retry composer create-project nette/code-checker code-checker ~2.5 --no-interaction
|
|
||||||
|
|
||||||
# Create databases.ini
|
|
||||||
- cp ./tests/databases.sample.ini ./tests/databases.ini
|
|
||||||
|
|
||||||
# Create Postgre database
|
|
||||||
- psql -c 'CREATE DATABASE dibi_test' -U postgres
|
|
||||||
|
|
||||||
sudo: false
|
|
||||||
|
|
||||||
cache:
|
|
||||||
directories:
|
|
||||||
- $HOME/.composer/cache
|
|
@@ -2,7 +2,7 @@
|
|||||||
"name": "dibi/dibi",
|
"name": "dibi/dibi",
|
||||||
"description": "Dibi is Database Abstraction Library for PHP",
|
"description": "Dibi is Database Abstraction Library for PHP",
|
||||||
"keywords": ["database", "dbal", "mysql", "postgresql", "sqlite", "mssql", "oracle", "access", "pdo", "odbc"],
|
"keywords": ["database", "dbal", "mysql", "postgresql", "sqlite", "mssql", "oracle", "access", "pdo", "odbc"],
|
||||||
"homepage": "https://dibiphp.com",
|
"homepage": "http://dibiphp.com",
|
||||||
"license": ["BSD-3-Clause", "GPL-2.0", "GPL-3.0"],
|
"license": ["BSD-3-Clause", "GPL-2.0", "GPL-3.0"],
|
||||||
"authors": [
|
"authors": [
|
||||||
{
|
{
|
||||||
@@ -14,18 +14,12 @@
|
|||||||
"php": ">=5.2.0"
|
"php": ">=5.2.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"tracy/tracy": "~2.2",
|
"tracy/tracy": "~2.2"
|
||||||
"nette/tester": "~1.3"
|
|
||||||
},
|
},
|
||||||
"replace": {
|
"replace": {
|
||||||
"dg/dibi": "self.version"
|
"dg/dibi": "self.version"
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"classmap": ["dibi/"]
|
"classmap": ["dibi/"]
|
||||||
},
|
|
||||||
"extra": {
|
|
||||||
"branch-alias": {
|
|
||||||
"dev-master": "2.3-dev"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,27 +0,0 @@
|
|||||||
How to contribute & use the issue tracker
|
|
||||||
=========================================
|
|
||||||
|
|
||||||
The issue tracker is the preferred channel for bug reports, features requests
|
|
||||||
and submitting pull requests, but please respect the following restrictions:
|
|
||||||
|
|
||||||
* Please **do not** use the issue tracker for personal support requests (use
|
|
||||||
[dibi forum](https://forum.dibiphp.com) or [Stack Overflow](http://stackoverflow.com)).
|
|
||||||
|
|
||||||
* Please **do not** derail or troll issues. Keep the discussion on topic and
|
|
||||||
respect the opinions of others.
|
|
||||||
|
|
||||||
* Use the GitHub **issue search** — check if the issue has already been
|
|
||||||
reported.
|
|
||||||
|
|
||||||
A good **bug report** shouldn't leave others needing to chase you up for more
|
|
||||||
information. Please try to be as detailed as possible in your report.
|
|
||||||
|
|
||||||
**Feature requests** are welcome. But take a moment to find out whether your idea
|
|
||||||
fits with the scope and aims of the project. It's up to *you* to make a strong
|
|
||||||
case to convince the project's developers of the merits of this feature.
|
|
||||||
|
|
||||||
We welcome **pull requests**. If you'd like to contribute, please take a moment
|
|
||||||
to [read the guidelines](https://nette.org/en/contributing) in order to make
|
|
||||||
the contribution process easy and effective for everyone involved.
|
|
||||||
|
|
||||||
Thanks!
|
|
55
dibi/bridges/Nette-2.0/DibiNette20Extension.php
Normal file
55
dibi/bridges/Nette-2.0/DibiNette20Extension.php
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This file is part of the "dibi" - smart database abstraction layer.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2005 David Grudl (https://davidgrudl.com)
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view
|
||||||
|
* the file license.txt that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dibi extension for Nette Framework 2.0. Creates 'connection' service.
|
||||||
|
*
|
||||||
|
* @author David Grudl
|
||||||
|
* @package dibi\nette
|
||||||
|
* @phpversion 5.3
|
||||||
|
*/
|
||||||
|
class DibiNette20Extension extends Nette\Config\CompilerExtension
|
||||||
|
{
|
||||||
|
|
||||||
|
public function loadConfiguration()
|
||||||
|
{
|
||||||
|
$container = $this->getContainerBuilder();
|
||||||
|
$config = $this->getConfig();
|
||||||
|
|
||||||
|
$useProfiler = isset($config['profiler'])
|
||||||
|
? $config['profiler']
|
||||||
|
: !$container->parameters['productionMode'];
|
||||||
|
|
||||||
|
unset($config['profiler']);
|
||||||
|
|
||||||
|
if (isset($config['flags'])) {
|
||||||
|
$flags = 0;
|
||||||
|
foreach ((array) $config['flags'] as $flag) {
|
||||||
|
$flags |= constant($flag);
|
||||||
|
}
|
||||||
|
$config['flags'] = $flags;
|
||||||
|
}
|
||||||
|
|
||||||
|
$connection = $container->addDefinition($this->prefix('connection'))
|
||||||
|
->setClass('DibiConnection', array($config));
|
||||||
|
|
||||||
|
if ($useProfiler) {
|
||||||
|
$panel = $container->addDefinition($this->prefix('panel'))
|
||||||
|
->setClass('DibiNettePanel')
|
||||||
|
->addSetup('Nette\Diagnostics\Debugger::$bar->addPanel(?)', array('@self'))
|
||||||
|
->addSetup('Nette\Diagnostics\Debugger::$blueScreen->addPanel(?)', array('DibiNettePanel::renderException'));
|
||||||
|
|
||||||
|
$connection->addSetup('$service->onEvent[] = ?', array(array($panel, 'logEvent')));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
17
dibi/bridges/Nette-2.0/config.sample.neon
Normal file
17
dibi/bridges/Nette-2.0/config.sample.neon
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
# Requires Nette Framework 2.0 for PHP 5.3
|
||||||
|
#
|
||||||
|
# In bootstrap.php append these lines after line $configurator = new Nette\Config\Configurator;
|
||||||
|
#
|
||||||
|
# $configurator->onCompile[] = function($configurator, $compiler) {
|
||||||
|
# $compiler->addExtension('dibi', new DibiNette20Extension);
|
||||||
|
# };
|
||||||
|
#
|
||||||
|
# This will create service named 'dibi.connection'.
|
||||||
|
|
||||||
|
common:
|
||||||
|
dibi:
|
||||||
|
host: localhost
|
||||||
|
username: root
|
||||||
|
password: ***
|
||||||
|
database: foo
|
||||||
|
lazy: TRUE
|
@@ -9,6 +9,7 @@
|
|||||||
/**
|
/**
|
||||||
* Dibi extension for Nette Framework 2.1. Creates 'connection' service.
|
* Dibi extension for Nette Framework 2.1. Creates 'connection' service.
|
||||||
*
|
*
|
||||||
|
* @author David Grudl
|
||||||
* @package dibi\nette
|
* @package dibi\nette
|
||||||
* @phpversion 5.3
|
* @phpversion 5.3
|
||||||
*/
|
*/
|
||||||
@@ -35,8 +36,7 @@ class DibiNette21Extension extends Nette\DI\CompilerExtension
|
|||||||
}
|
}
|
||||||
|
|
||||||
$connection = $container->addDefinition($this->prefix('connection'))
|
$connection = $container->addDefinition($this->prefix('connection'))
|
||||||
->setClass('DibiConnection', array($config))
|
->setClass('DibiConnection', array($config));
|
||||||
->setAutowired(isset($config['autowired']) ? $config['autowired'] : TRUE);
|
|
||||||
|
|
||||||
if ($useProfiler) {
|
if ($useProfiler) {
|
||||||
$panel = $container->addDefinition($this->prefix('panel'))
|
$panel = $container->addDefinition($this->prefix('panel'))
|
||||||
|
@@ -5,15 +5,19 @@
|
|||||||
* Copyright (c) 2005 David Grudl (https://davidgrudl.com)
|
* Copyright (c) 2005 David Grudl (https://davidgrudl.com)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Nette\Diagnostics\Debugger;
|
|
||||||
|
if (interface_exists('Nette\Diagnostics\IBarPanel')) {
|
||||||
|
class_alias('Nette\Diagnostics\IBarPanel', 'IBarPanel');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Dibi panel for Nette\Diagnostics.
|
* Dibi panel for Nette\Diagnostics.
|
||||||
*
|
*
|
||||||
|
* @author David Grudl
|
||||||
* @package dibi\nette
|
* @package dibi\nette
|
||||||
*/
|
*/
|
||||||
class DibiNettePanel extends DibiObject implements Nette\Diagnostics\IBarPanel
|
class DibiNettePanel extends DibiObject implements IBarPanel
|
||||||
{
|
{
|
||||||
/** @var int maximum SQL length */
|
/** @var int maximum SQL length */
|
||||||
static public $maxLength = 1000;
|
static public $maxLength = 1000;
|
||||||
@@ -37,9 +41,24 @@ class DibiNettePanel extends DibiObject implements Nette\Diagnostics\IBarPanel
|
|||||||
|
|
||||||
public function register(DibiConnection $connection)
|
public function register(DibiConnection $connection)
|
||||||
{
|
{
|
||||||
Debugger::getBar()->addPanel($this);
|
if (is_callable('Nette\Diagnostics\Debugger::enable') && !class_exists('NDebugger')) {
|
||||||
Debugger::getBlueScreen()->addPanel(array(__CLASS__, 'renderException'));
|
class_alias('Nette\Diagnostics\Debugger', 'NDebugger'); // PHP 5.2 code compatibility
|
||||||
$connection->onEvent[] = array($this, 'logEvent');
|
}
|
||||||
|
if (is_callable('NDebugger::enable') && is_callable('NDebugger::getBlueScreen')) { // Nette Framework 2.1
|
||||||
|
NDebugger::getBar()->addPanel($this);
|
||||||
|
NDebugger::getBlueScreen()->addPanel(array(__CLASS__, 'renderException'));
|
||||||
|
$connection->onEvent[] = array($this, 'logEvent');
|
||||||
|
|
||||||
|
} elseif (is_callable('NDebugger::enable')) { // Nette Framework 2.0 (for PHP 5.3 or PHP 5.2 prefixed)
|
||||||
|
NDebugger::$bar && NDebugger::$bar->addPanel($this);
|
||||||
|
NDebugger::$blueScreen && NDebugger::$blueScreen->addPanel(array(__CLASS__, 'renderException'), __CLASS__);
|
||||||
|
$connection->onEvent[] = array($this, 'logEvent');
|
||||||
|
|
||||||
|
} elseif (is_callable('Debugger::enable') && !is_callable('Debugger::getBlueScreen')) { // Nette Framework 2.0 for PHP 5.2 non-prefixed
|
||||||
|
Debugger::$bar && Debugger::$bar->addPanel($this);
|
||||||
|
Debugger::$blueScreen && Debugger::$blueScreen->addPanel(array(__CLASS__, 'renderException'), __CLASS__);
|
||||||
|
$connection->onEvent[] = array($this, 'logEvent');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -103,7 +122,7 @@ class DibiNettePanel extends DibiObject implements Nette\Diagnostics\IBarPanel
|
|||||||
try {
|
try {
|
||||||
$backup = array($event->connection->onEvent, dibi::$numOfQueries, dibi::$totalTime);
|
$backup = array($event->connection->onEvent, dibi::$numOfQueries, dibi::$totalTime);
|
||||||
$event->connection->onEvent = NULL;
|
$event->connection->onEvent = NULL;
|
||||||
$cmd = is_string($this->explain) ? $this->explain : ($event->connection->getConfig('driver') === 'oracle' ? 'EXPLAIN PLAN FOR' : 'EXPLAIN');
|
$cmd = is_string($this->explain) ? $this->explain : ($event->connection->getConfig('driver') === 'oracle' ? 'EXPLAIN PLAN' : 'EXPLAIN');
|
||||||
$explain = dibi::dump($event->connection->nativeQuery("$cmd $event->sql"), TRUE);
|
$explain = dibi::dump($event->connection->nativeQuery("$cmd $event->sql"), TRUE);
|
||||||
} catch (DibiException $e) {
|
} catch (DibiException $e) {
|
||||||
}
|
}
|
||||||
|
@@ -14,6 +14,7 @@ use Nette;
|
|||||||
/**
|
/**
|
||||||
* Dibi extension for Nette Framework 2.2. Creates 'connection' & 'panel' services.
|
* Dibi extension for Nette Framework 2.2. Creates 'connection' & 'panel' services.
|
||||||
*
|
*
|
||||||
|
* @author David Grudl
|
||||||
* @package dibi\nette
|
* @package dibi\nette
|
||||||
*/
|
*/
|
||||||
class DibiExtension22 extends Nette\DI\CompilerExtension
|
class DibiExtension22 extends Nette\DI\CompilerExtension
|
||||||
@@ -39,8 +40,7 @@ class DibiExtension22 extends Nette\DI\CompilerExtension
|
|||||||
}
|
}
|
||||||
|
|
||||||
$connection = $container->addDefinition($this->prefix('connection'))
|
$connection = $container->addDefinition($this->prefix('connection'))
|
||||||
->setClass('DibiConnection', array($config))
|
->setClass('DibiConnection', array($config));
|
||||||
->setAutowired(isset($config['autowired']) ? $config['autowired'] : TRUE);
|
|
||||||
|
|
||||||
if ($useProfiler) {
|
if ($useProfiler) {
|
||||||
$panel = $container->addDefinition($this->prefix('panel'))
|
$panel = $container->addDefinition($this->prefix('panel'))
|
||||||
|
@@ -14,6 +14,7 @@ use Tracy;
|
|||||||
/**
|
/**
|
||||||
* Dibi panel for Tracy.
|
* Dibi panel for Tracy.
|
||||||
* @package dibi\nette
|
* @package dibi\nette
|
||||||
|
* @author David Grudl
|
||||||
*/
|
*/
|
||||||
class Panel extends \DibiObject implements Tracy\IBarPanel
|
class Panel extends \DibiObject implements Tracy\IBarPanel
|
||||||
{
|
{
|
||||||
@@ -80,14 +81,13 @@ class Panel extends \DibiObject implements Tracy\IBarPanel
|
|||||||
public function getTab()
|
public function getTab()
|
||||||
{
|
{
|
||||||
$totalTime = 0;
|
$totalTime = 0;
|
||||||
$count = count($this->events);
|
|
||||||
foreach ($this->events as $event) {
|
foreach ($this->events as $event) {
|
||||||
$totalTime += $event->time;
|
$totalTime += $event->time;
|
||||||
}
|
}
|
||||||
return '<span title="dibi"><svg viewBox="0 0 2048 2048" style="vertical-align: bottom; width:1.23em; height:1.55em"><path fill="' . ($count ? '#b079d6' : '#aaa') . '" d="M1024 896q237 0 443-43t325-127v170q0 69-103 128t-280 93.5-385 34.5-385-34.5-280-93.5-103-128v-170q119 84 325 127t443 43zm0 768q237 0 443-43t325-127v170q0 69-103 128t-280 93.5-385 34.5-385-34.5-280-93.5-103-128v-170q119 84 325 127t443 43zm0-384q237 0 443-43t325-127v170q0 69-103 128t-280 93.5-385 34.5-385-34.5-280-93.5-103-128v-170q119 84 325 127t443 43zm0-1152q208 0 385 34.5t280 93.5 103 128v128q0 69-103 128t-280 93.5-385 34.5-385-34.5-280-93.5-103-128v-128q0-69 103-128t280-93.5 385-34.5z"/></svg><span class="tracy-label">'
|
return '<span title="dibi"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAEYSURBVBgZBcHPio5hGAfg6/2+R980k6wmJgsJ5U/ZOAqbSc2GnXOwUg7BESgLUeIQ1GSjLFnMwsKGGg1qxJRmPM97/1zXFAAAAEADdlfZzr26miup2svnelq7d2aYgt3rebl585wN6+K3I1/9fJe7O/uIePP2SypJkiRJ0vMhr55FLCA3zgIAOK9uQ4MS361ZOSX+OrTvkgINSjS/HIvhjxNNFGgQsbSmabohKDNoUGLohsls6BaiQIMSs2FYmnXdUsygQYmumy3Nhi6igwalDEOJEjPKP7CA2aFNK8Bkyy3fdNCg7r9/fW3jgpVJbDmy5+PB2IYp4MXFelQ7izPrhkPHB+P5/PjhD5gCgCenx+VR/dODEwD+A3T7nqbxwf1HAAAAAElFTkSuQmCC" />'
|
||||||
. $count . ' queries'
|
. count($this->events) . ' queries'
|
||||||
. ($totalTime ? sprintf(' / %0.1f ms', $totalTime * 1000) : '')
|
. ($totalTime ? sprintf(' / %0.1f ms', $totalTime * 1000) : '')
|
||||||
. '</span></span>';
|
. '</span>';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -106,7 +106,7 @@ class Panel extends \DibiObject implements Tracy\IBarPanel
|
|||||||
try {
|
try {
|
||||||
$backup = array($event->connection->onEvent, dibi::$numOfQueries, dibi::$totalTime);
|
$backup = array($event->connection->onEvent, dibi::$numOfQueries, dibi::$totalTime);
|
||||||
$event->connection->onEvent = NULL;
|
$event->connection->onEvent = NULL;
|
||||||
$cmd = is_string($this->explain) ? $this->explain : ($event->connection->getConfig('driver') === 'oracle' ? 'EXPLAIN PLAN FOR' : 'EXPLAIN');
|
$cmd = is_string($this->explain) ? $this->explain : ($event->connection->getConfig('driver') === 'oracle' ? 'EXPLAIN PLAN' : 'EXPLAIN');
|
||||||
$explain = dibi::dump($event->connection->nativeQuery("$cmd $event->sql"), TRUE);
|
$explain = dibi::dump($event->connection->nativeQuery("$cmd $event->sql"), TRUE);
|
||||||
} catch (\DibiException $e) {
|
} catch (\DibiException $e) {
|
||||||
}
|
}
|
||||||
|
@@ -33,3 +33,7 @@ require_once dirname(__FILE__) . '/libs/DibiDatabaseInfo.php';
|
|||||||
require_once dirname(__FILE__) . '/libs/DibiEvent.php';
|
require_once dirname(__FILE__) . '/libs/DibiEvent.php';
|
||||||
require_once dirname(__FILE__) . '/libs/DibiFileLogger.php';
|
require_once dirname(__FILE__) . '/libs/DibiFileLogger.php';
|
||||||
require_once dirname(__FILE__) . '/libs/DibiFirePhpLogger.php';
|
require_once dirname(__FILE__) . '/libs/DibiFirePhpLogger.php';
|
||||||
|
|
||||||
|
if (interface_exists('Nette\Diagnostics\IBarPanel') || interface_exists('IBarPanel')) {
|
||||||
|
require_once dirname(__FILE__) . '/bridges/Nette-2.1/DibiNettePanel.php';
|
||||||
|
}
|
||||||
|
@@ -18,6 +18,7 @@
|
|||||||
* - resource (resource) => existing connection resource
|
* - resource (resource) => existing connection resource
|
||||||
* - lazy, profiler, result, substitutes, ... => see DibiConnection options
|
* - lazy, profiler, result, substitutes, ... => see DibiConnection options
|
||||||
*
|
*
|
||||||
|
* @author Tomáš Kraina, Roman Sklenář
|
||||||
* @package dibi\drivers
|
* @package dibi\drivers
|
||||||
*/
|
*/
|
||||||
class DibiFirebirdDriver extends DibiObject implements IDibiDriver, IDibiResultDriver, IDibiReflector
|
class DibiFirebirdDriver extends DibiObject implements IDibiDriver, IDibiResultDriver, IDibiReflector
|
||||||
@@ -400,7 +401,7 @@ class DibiFirebirdDriver extends DibiObject implements IDibiDriver, IDibiResultD
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the result set resource.
|
* Returns the result set resource.
|
||||||
* @return resource
|
* @return mysqli_result
|
||||||
*/
|
*/
|
||||||
public function getResultResource()
|
public function getResultResource()
|
||||||
{
|
{
|
||||||
@@ -806,6 +807,8 @@ class DibiFirebirdDriver extends DibiObject implements IDibiDriver, IDibiResultD
|
|||||||
/**
|
/**
|
||||||
* Database procedure exception.
|
* Database procedure exception.
|
||||||
*
|
*
|
||||||
|
* @author Roman Sklenář
|
||||||
|
* @copyright Copyright (c) 2010
|
||||||
* @package dibi\drivers
|
* @package dibi\drivers
|
||||||
*/
|
*/
|
||||||
class DibiProcedureException extends DibiException
|
class DibiProcedureException extends DibiException
|
||||||
|
@@ -22,6 +22,7 @@ require_once dirname(__FILE__) . '/DibiMsSql2005Reflector.php';
|
|||||||
* - resource (resource) => existing connection resource
|
* - resource (resource) => existing connection resource
|
||||||
* - lazy, profiler, result, substitutes, ... => see DibiConnection options
|
* - lazy, profiler, result, substitutes, ... => see DibiConnection options
|
||||||
*
|
*
|
||||||
|
* @author David Grudl
|
||||||
* @package dibi\drivers
|
* @package dibi\drivers
|
||||||
*/
|
*/
|
||||||
class DibiMsSql2005Driver extends DibiObject implements IDibiDriver, IDibiResultDriver
|
class DibiMsSql2005Driver extends DibiObject implements IDibiDriver, IDibiResultDriver
|
||||||
|
@@ -9,6 +9,7 @@
|
|||||||
/**
|
/**
|
||||||
* The dibi reflector for MSSQL2005 databases.
|
* The dibi reflector for MSSQL2005 databases.
|
||||||
*
|
*
|
||||||
|
* @author Daniel Kouba
|
||||||
* @package dibi\drivers
|
* @package dibi\drivers
|
||||||
* @internal
|
* @internal
|
||||||
*/
|
*/
|
||||||
|
@@ -19,6 +19,7 @@ require_once dirname(__FILE__) . '/DibiMsSqlReflector.php';
|
|||||||
* - resource (resource) => existing connection resource
|
* - resource (resource) => existing connection resource
|
||||||
* - lazy, profiler, result, substitutes, ... => see DibiConnection options
|
* - lazy, profiler, result, substitutes, ... => see DibiConnection options
|
||||||
*
|
*
|
||||||
|
* @author David Grudl
|
||||||
* @package dibi\drivers
|
* @package dibi\drivers
|
||||||
*/
|
*/
|
||||||
class DibiMsSqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriver
|
class DibiMsSqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriver
|
||||||
|
@@ -2,13 +2,17 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* This file is part of the "dibi" - smart database abstraction layer.
|
* This file is part of the "dibi" - smart database abstraction layer.
|
||||||
* Copyright (c) 2005 David Grudl (https://davidgrudl.com)
|
*
|
||||||
|
* Copyright (c) 2005, 2010 David Grudl (https://davidgrudl.com)
|
||||||
|
*
|
||||||
|
* @package dibi\drivers
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The dibi reflector for MsSQL databases.
|
* The dibi reflector for MsSQL databases.
|
||||||
*
|
*
|
||||||
|
* @author Steven Bredenberg
|
||||||
* @package dibi\drivers
|
* @package dibi\drivers
|
||||||
* @internal
|
* @internal
|
||||||
*/
|
*/
|
||||||
|
@@ -27,6 +27,7 @@ require_once dirname(__FILE__) . '/DibiMySqlReflector.php';
|
|||||||
* - resource (resource) => existing connection resource
|
* - resource (resource) => existing connection resource
|
||||||
* - lazy, profiler, result, substitutes, ... => see DibiConnection options
|
* - lazy, profiler, result, substitutes, ... => see DibiConnection options
|
||||||
*
|
*
|
||||||
|
* @author David Grudl
|
||||||
* @package dibi\drivers
|
* @package dibi\drivers
|
||||||
*/
|
*/
|
||||||
class DibiMySqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriver
|
class DibiMySqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriver
|
||||||
|
@@ -9,6 +9,7 @@
|
|||||||
/**
|
/**
|
||||||
* The dibi reflector for MySQL databases.
|
* The dibi reflector for MySQL databases.
|
||||||
*
|
*
|
||||||
|
* @author David Grudl
|
||||||
* @package dibi\drivers
|
* @package dibi\drivers
|
||||||
* @internal
|
* @internal
|
||||||
*/
|
*/
|
||||||
@@ -30,6 +31,11 @@ class DibiMySqlReflector extends DibiObject implements IDibiReflector
|
|||||||
*/
|
*/
|
||||||
public function getTables()
|
public function getTables()
|
||||||
{
|
{
|
||||||
|
/*$this->query("
|
||||||
|
SELECT TABLE_NAME as name, TABLE_TYPE = 'VIEW' as view
|
||||||
|
FROM INFORMATION_SCHEMA.TABLES
|
||||||
|
WHERE TABLE_SCHEMA = DATABASE()
|
||||||
|
");*/
|
||||||
$res = $this->driver->query('SHOW FULL TABLES');
|
$res = $this->driver->query('SHOW FULL TABLES');
|
||||||
$tables = array();
|
$tables = array();
|
||||||
while ($row = $res->fetch(FALSE)) {
|
while ($row = $res->fetch(FALSE)) {
|
||||||
@@ -49,6 +55,12 @@ class DibiMySqlReflector extends DibiObject implements IDibiReflector
|
|||||||
*/
|
*/
|
||||||
public function getColumns($table)
|
public function getColumns($table)
|
||||||
{
|
{
|
||||||
|
/*$table = $this->escape($table, dibi::TEXT);
|
||||||
|
$this->query("
|
||||||
|
SELECT *
|
||||||
|
FROM INFORMATION_SCHEMA.COLUMNS
|
||||||
|
WHERE TABLE_NAME = $table AND TABLE_SCHEMA = DATABASE()
|
||||||
|
");*/
|
||||||
$res = $this->driver->query("SHOW FULL COLUMNS FROM {$this->driver->escape($table, dibi::IDENTIFIER)}");
|
$res = $this->driver->query("SHOW FULL COLUMNS FROM {$this->driver->escape($table, dibi::IDENTIFIER)}");
|
||||||
$columns = array();
|
$columns = array();
|
||||||
while ($row = $res->fetch(TRUE)) {
|
while ($row = $res->fetch(TRUE)) {
|
||||||
@@ -76,6 +88,13 @@ class DibiMySqlReflector extends DibiObject implements IDibiReflector
|
|||||||
*/
|
*/
|
||||||
public function getIndexes($table)
|
public function getIndexes($table)
|
||||||
{
|
{
|
||||||
|
/*$table = $this->escape($table, dibi::TEXT);
|
||||||
|
$this->query("
|
||||||
|
SELECT *
|
||||||
|
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
|
||||||
|
WHERE TABLE_NAME = $table AND TABLE_SCHEMA = DATABASE()
|
||||||
|
AND REFERENCED_COLUMN_NAME IS NULL
|
||||||
|
");*/
|
||||||
$res = $this->driver->query("SHOW INDEX FROM {$this->driver->escape($table, dibi::IDENTIFIER)}");
|
$res = $this->driver->query("SHOW INDEX FROM {$this->driver->escape($table, dibi::IDENTIFIER)}");
|
||||||
$indexes = array();
|
$indexes = array();
|
||||||
while ($row = $res->fetch(TRUE)) {
|
while ($row = $res->fetch(TRUE)) {
|
||||||
|
@@ -28,6 +28,7 @@ require_once dirname(__FILE__) . '/DibiMySqlReflector.php';
|
|||||||
* - resource (mysqli) => existing connection resource
|
* - resource (mysqli) => existing connection resource
|
||||||
* - lazy, profiler, result, substitutes, ... => see DibiConnection options
|
* - lazy, profiler, result, substitutes, ... => see DibiConnection options
|
||||||
*
|
*
|
||||||
|
* @author David Grudl
|
||||||
* @package dibi\drivers
|
* @package dibi\drivers
|
||||||
*/
|
*/
|
||||||
class DibiMySqliDriver extends DibiObject implements IDibiDriver, IDibiResultDriver
|
class DibiMySqliDriver extends DibiObject implements IDibiDriver, IDibiResultDriver
|
||||||
@@ -78,7 +79,7 @@ class DibiMySqliDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
'timezone' => date('P'),
|
'timezone' => date('P'),
|
||||||
'username' => ini_get('mysqli.default_user'),
|
'username' => ini_get('mysqli.default_user'),
|
||||||
'password' => ini_get('mysqli.default_pw'),
|
'password' => ini_get('mysqli.default_pw'),
|
||||||
'socket' => (string) ini_get('mysqli.default_socket'),
|
'socket' => ini_get('mysqli.default_socket'),
|
||||||
'port' => NULL,
|
'port' => NULL,
|
||||||
);
|
);
|
||||||
if (!isset($config['host'])) {
|
if (!isset($config['host'])) {
|
||||||
@@ -419,10 +420,9 @@ class DibiMySqliDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
public function getResultColumns()
|
public function getResultColumns()
|
||||||
{
|
{
|
||||||
static $types;
|
static $types;
|
||||||
if ($types === NULL) {
|
if (empty($types)) {
|
||||||
$consts = get_defined_constants(TRUE);
|
$consts = get_defined_constants(TRUE);
|
||||||
$types = array();
|
foreach ($consts['mysqli'] as $key => $value) {
|
||||||
foreach (isset($consts['mysqli']) ? $consts['mysqli'] : array() as $key => $value) {
|
|
||||||
if (strncmp($key, 'MYSQLI_TYPE_', 12) === 0) {
|
if (strncmp($key, 'MYSQLI_TYPE_', 12) === 0) {
|
||||||
$types[$value] = substr($key, 12);
|
$types[$value] = substr($key, 12);
|
||||||
}
|
}
|
||||||
@@ -438,7 +438,7 @@ class DibiMySqliDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
'name' => $row['name'],
|
'name' => $row['name'],
|
||||||
'table' => $row['orgtable'],
|
'table' => $row['orgtable'],
|
||||||
'fullname' => $row['table'] ? $row['table'] . '.' . $row['name'] : $row['name'],
|
'fullname' => $row['table'] ? $row['table'] . '.' . $row['name'] : $row['name'],
|
||||||
'nativetype' => isset($types[$row['type']]) ? $types[$row['type']] : $row['type'],
|
'nativetype' => $types[$row['type']],
|
||||||
'vendor' => $row,
|
'vendor' => $row,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -453,7 +453,7 @@ class DibiMySqliDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
public function getResultResource()
|
public function getResultResource()
|
||||||
{
|
{
|
||||||
$this->autoFree = FALSE;
|
$this->autoFree = FALSE;
|
||||||
return $this->resultSet;
|
return $this->resultSet === NULL || $this->resultSet->type === NULL ? NULL : $this->resultSet;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -17,6 +17,7 @@
|
|||||||
* - resource (resource) => existing connection resource
|
* - resource (resource) => existing connection resource
|
||||||
* - lazy, profiler, result, substitutes, ... => see DibiConnection options
|
* - lazy, profiler, result, substitutes, ... => see DibiConnection options
|
||||||
*
|
*
|
||||||
|
* @author David Grudl
|
||||||
* @package dibi\drivers
|
* @package dibi\drivers
|
||||||
*/
|
*/
|
||||||
class DibiOdbcDriver extends DibiObject implements IDibiDriver, IDibiResultDriver, IDibiReflector
|
class DibiOdbcDriver extends DibiObject implements IDibiDriver, IDibiResultDriver, IDibiReflector
|
||||||
@@ -289,7 +290,7 @@ class DibiOdbcDriver extends DibiObject implements IDibiDriver, IDibiResultDrive
|
|||||||
{
|
{
|
||||||
// offset support is missing
|
// offset support is missing
|
||||||
if ($limit >= 0) {
|
if ($limit >= 0) {
|
||||||
$sql = 'SELECT TOP ' . (int) $limit . ' * FROM (' . $sql . ') t';
|
$sql = 'SELECT TOP ' . (int) $limit . ' * FROM (' . $sql . ')';
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($offset) {
|
if ($offset) {
|
||||||
|
@@ -14,13 +14,13 @@
|
|||||||
* - username (or user)
|
* - username (or user)
|
||||||
* - password (or pass)
|
* - password (or pass)
|
||||||
* - charset => character encoding to set
|
* - charset => character encoding to set
|
||||||
* - schema => alters session schema
|
|
||||||
* - formatDate => how to format date in SQL (@see date)
|
* - formatDate => how to format date in SQL (@see date)
|
||||||
* - formatDateTime => how to format datetime in SQL (@see date)
|
* - formatDateTime => how to format datetime in SQL (@see date)
|
||||||
* - resource (resource) => existing connection resource
|
* - resource (resource) => existing connection resource
|
||||||
* - persistent => Creates persistent connections with oci_pconnect instead of oci_new_connect
|
* - persistent => Creates persistent connections with oci_pconnect instead of oci_new_connect
|
||||||
* - lazy, profiler, result, substitutes, ... => see DibiConnection options
|
* - lazy, profiler, result, substitutes, ... => see DibiConnection options
|
||||||
*
|
*
|
||||||
|
* @author David Grudl
|
||||||
* @package dibi\drivers
|
* @package dibi\drivers
|
||||||
*/
|
*/
|
||||||
class DibiOracleDriver extends DibiObject implements IDibiDriver, IDibiResultDriver, IDibiReflector
|
class DibiOracleDriver extends DibiObject implements IDibiDriver, IDibiResultDriver, IDibiReflector
|
||||||
@@ -75,10 +75,6 @@ class DibiOracleDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
$err = oci_error();
|
$err = oci_error();
|
||||||
throw new DibiDriverException($err['message'], $err['code']);
|
throw new DibiDriverException($err['message'], $err['code']);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isset($config['schema'])) {
|
|
||||||
$this->query('ALTER SESSION SET CURRENT_SCHEMA=' . $config['schema']);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -102,7 +98,7 @@ class DibiOracleDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
{
|
{
|
||||||
$res = oci_parse($this->connection, $sql);
|
$res = oci_parse($this->connection, $sql);
|
||||||
if ($res) {
|
if ($res) {
|
||||||
@oci_execute($res, $this->autocommit ? OCI_COMMIT_ON_SUCCESS : OCI_DEFAULT);
|
oci_execute($res, $this->autocommit ? OCI_COMMIT_ON_SUCCESS : OCI_DEFAULT);
|
||||||
$err = oci_error($res);
|
$err = oci_error($res);
|
||||||
if ($err) {
|
if ($err) {
|
||||||
throw new DibiDriverException($err['message'], $err['code'], $sql);
|
throw new DibiDriverException($err['message'], $err['code'], $sql);
|
||||||
@@ -364,12 +360,11 @@ class DibiOracleDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
$count = oci_num_fields($this->resultSet);
|
$count = oci_num_fields($this->resultSet);
|
||||||
$columns = array();
|
$columns = array();
|
||||||
for ($i = 1; $i <= $count; $i++) {
|
for ($i = 1; $i <= $count; $i++) {
|
||||||
$type = oci_field_type($this->resultSet, $i);
|
|
||||||
$columns[] = array(
|
$columns[] = array(
|
||||||
'name' => oci_field_name($this->resultSet, $i),
|
'name' => oci_field_name($this->resultSet, $i),
|
||||||
'table' => NULL,
|
'table' => NULL,
|
||||||
'fullname' => oci_field_name($this->resultSet, $i),
|
'fullname' => oci_field_name($this->resultSet, $i),
|
||||||
'nativetype' => $type === 'NUMBER' && oci_field_scale($this->resultSet, $i) === 0 ? 'INTEGER' : $type,
|
'nativetype'=> oci_field_type($this->resultSet, $i),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return $columns;
|
return $columns;
|
||||||
|
@@ -19,9 +19,9 @@ require_once dirname(__FILE__) . '/DibiSqliteReflector.php';
|
|||||||
* - password (or pass)
|
* - password (or pass)
|
||||||
* - options (array) => driver specific options {@see PDO::__construct}
|
* - options (array) => driver specific options {@see PDO::__construct}
|
||||||
* - resource (PDO) => existing connection
|
* - resource (PDO) => existing connection
|
||||||
* - version
|
|
||||||
* - lazy, profiler, result, substitutes, ... => see DibiConnection options
|
* - lazy, profiler, result, substitutes, ... => see DibiConnection options
|
||||||
*
|
*
|
||||||
|
* @author David Grudl
|
||||||
* @package dibi\drivers
|
* @package dibi\drivers
|
||||||
*/
|
*/
|
||||||
class DibiPdoDriver extends DibiObject implements IDibiDriver, IDibiResultDriver
|
class DibiPdoDriver extends DibiObject implements IDibiDriver, IDibiResultDriver
|
||||||
@@ -38,9 +38,6 @@ class DibiPdoDriver extends DibiObject implements IDibiDriver, IDibiResultDriver
|
|||||||
/** @var string */
|
/** @var string */
|
||||||
private $driverName;
|
private $driverName;
|
||||||
|
|
||||||
/** @var string */
|
|
||||||
private $serverVersion;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @throws DibiNotSupportedException
|
* @throws DibiNotSupportedException
|
||||||
@@ -66,22 +63,20 @@ class DibiPdoDriver extends DibiObject implements IDibiDriver, IDibiResultDriver
|
|||||||
|
|
||||||
if ($config['resource'] instanceof PDO) {
|
if ($config['resource'] instanceof PDO) {
|
||||||
$this->connection = $config['resource'];
|
$this->connection = $config['resource'];
|
||||||
unset($config['resource'], $config['pdo']);
|
|
||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
$this->connection = new PDO($config['dsn'], $config['username'], $config['password'], $config['options']);
|
$this->connection = new PDO($config['dsn'], $config['username'], $config['password'], $config['options']);
|
||||||
} catch (PDOException $e) {
|
} catch (PDOException $e) {
|
||||||
if ($e->getMessage() === 'could not find driver') {
|
throw new DibiDriverException($e->getMessage(), $e->getCode());
|
||||||
throw new DibiNotSupportedException('PHP extension for PDO is not loaded.');
|
}
|
||||||
}
|
}
|
||||||
throw new DibiDriverException($e->getMessage(), $e->getCode());
|
|
||||||
}
|
if (!$this->connection) {
|
||||||
|
throw new DibiDriverException('Connecting error.');
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->driverName = $this->connection->getAttribute(PDO::ATTR_DRIVER_NAME);
|
$this->driverName = $this->connection->getAttribute(PDO::ATTR_DRIVER_NAME);
|
||||||
$this->serverVersion = isset($config['version'])
|
|
||||||
? $config['version']
|
|
||||||
: @$this->connection->getAttribute(PDO::ATTR_SERVER_VERSION); // @ - may be not supported
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -105,7 +100,7 @@ class DibiPdoDriver extends DibiObject implements IDibiDriver, IDibiResultDriver
|
|||||||
{
|
{
|
||||||
// must detect if SQL returns result set or num of affected rows
|
// must detect if SQL returns result set or num of affected rows
|
||||||
$cmd = strtoupper(substr(ltrim($sql), 0, 6));
|
$cmd = strtoupper(substr(ltrim($sql), 0, 6));
|
||||||
static $list = array('UPDATE' => 1, 'DELETE' => 1, 'INSERT' => 1, 'REPLAC' => 1);
|
static $list = array('UPDATE'=>1, 'DELETE'=>1, 'INSERT'=>1, 'REPLAC'=>1);
|
||||||
$this->affectedRows = FALSE;
|
$this->affectedRows = FALSE;
|
||||||
|
|
||||||
if (isset($list[$cmd])) {
|
if (isset($list[$cmd])) {
|
||||||
@@ -251,12 +246,10 @@ class DibiPdoDriver extends DibiObject implements IDibiDriver, IDibiResultDriver
|
|||||||
{
|
{
|
||||||
switch ($type) {
|
switch ($type) {
|
||||||
case dibi::TEXT:
|
case dibi::TEXT:
|
||||||
|
return $this->connection->quote($value, PDO::PARAM_STR);
|
||||||
|
|
||||||
case dibi::BINARY:
|
case dibi::BINARY:
|
||||||
if ($this->driverName === 'odbc') {
|
return $this->connection->quote($value, PDO::PARAM_LOB);
|
||||||
return "'" . str_replace("'", "''", $value) . "'";
|
|
||||||
} else {
|
|
||||||
return $this->connection->quote($value, $type === dibi::TEXT ? PDO::PARAM_STR : PDO::PARAM_LOB);
|
|
||||||
}
|
|
||||||
|
|
||||||
case dibi::IDENTIFIER:
|
case dibi::IDENTIFIER:
|
||||||
switch ($this->driverName) {
|
switch ($this->driverName) {
|
||||||
@@ -275,7 +268,6 @@ class DibiPdoDriver extends DibiObject implements IDibiDriver, IDibiResultDriver
|
|||||||
case 'mssql':
|
case 'mssql':
|
||||||
return '[' . str_replace(array('[', ']'), array('[[', ']]'), $value) . ']';
|
return '[' . str_replace(array('[', ']'), array('[[', ']]'), $value) . ']';
|
||||||
|
|
||||||
case 'dblib':
|
|
||||||
case 'sqlsrv':
|
case 'sqlsrv':
|
||||||
return '[' . str_replace(']', ']]', $value) . ']';
|
return '[' . str_replace(']', ']]', $value) . ']';
|
||||||
|
|
||||||
@@ -284,22 +276,14 @@ class DibiPdoDriver extends DibiObject implements IDibiDriver, IDibiResultDriver
|
|||||||
}
|
}
|
||||||
|
|
||||||
case dibi::BOOL:
|
case dibi::BOOL:
|
||||||
if ($this->driverName === 'pgsql') {
|
return $this->connection->quote($value, PDO::PARAM_BOOL);
|
||||||
return $value ? 'TRUE' : 'FALSE';
|
|
||||||
} else {
|
|
||||||
return $value ? 1 : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
case dibi::DATE:
|
case dibi::DATE:
|
||||||
case dibi::DATETIME:
|
case dibi::DATETIME:
|
||||||
if (!$value instanceof DateTime && !$value instanceof DateTimeInterface) {
|
if (!$value instanceof DateTime && !$value instanceof DateTimeInterface) {
|
||||||
$value = new DibiDateTime($value);
|
$value = new DibiDateTime($value);
|
||||||
}
|
}
|
||||||
if ($this->driverName === 'odbc') {
|
return $value->format($type === dibi::DATETIME ? "'Y-m-d H:i:s'" : "'Y-m-d'");
|
||||||
return $value->format($type === dibi::DATETIME ? '#m/d/Y H:i:s#' : '#m/d/Y#');
|
|
||||||
} else {
|
|
||||||
return $value->format($type === dibi::DATETIME ? "'Y-m-d H:i:s'" : "'Y-m-d'");
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
throw new InvalidArgumentException('Unsupported type.');
|
throw new InvalidArgumentException('Unsupported type.');
|
||||||
@@ -315,37 +299,7 @@ class DibiPdoDriver extends DibiObject implements IDibiDriver, IDibiResultDriver
|
|||||||
*/
|
*/
|
||||||
public function escapeLike($value, $pos)
|
public function escapeLike($value, $pos)
|
||||||
{
|
{
|
||||||
switch ($this->driverName) {
|
throw new DibiNotImplementedException;
|
||||||
case 'mysql':
|
|
||||||
$value = addcslashes(str_replace('\\', '\\\\', $value), "\x00\n\r\\'%_");
|
|
||||||
return ($pos <= 0 ? "'%" : "'") . $value . ($pos >= 0 ? "%'" : "'");
|
|
||||||
|
|
||||||
case 'oci':
|
|
||||||
$value = addcslashes(str_replace('\\', '\\\\', $value), "\x00\\%_");
|
|
||||||
$value = str_replace("'", "''", $value);
|
|
||||||
return ($pos <= 0 ? "'%" : "'") . $value . ($pos >= 0 ? "%'" : "'");
|
|
||||||
|
|
||||||
case 'pgsql':
|
|
||||||
$bs = substr($this->connection->quote('\\', PDO::PARAM_STR), 1, -1); // standard_conforming_strings = on/off
|
|
||||||
$value = substr($this->connection->quote($value, PDO::PARAM_STR), 1, -1);
|
|
||||||
$value = strtr($value, array('%' => $bs . '%', '_' => $bs . '_', '\\' => '\\\\'));
|
|
||||||
return ($pos <= 0 ? "'%" : "'") . $value . ($pos >= 0 ? "%'" : "'");
|
|
||||||
|
|
||||||
case 'sqlite':
|
|
||||||
case 'sqlite2':
|
|
||||||
$value = addcslashes(substr($this->connection->quote($value, PDO::PARAM_STR), 1, -1), '%_\\');
|
|
||||||
return ($pos <= 0 ? "'%" : "'") . $value . ($pos >= 0 ? "%'" : "'") . " ESCAPE '\\'";
|
|
||||||
|
|
||||||
case 'odbc':
|
|
||||||
case 'mssql':
|
|
||||||
case 'dblib':
|
|
||||||
case 'sqlsrv':
|
|
||||||
$value = strtr($value, array("'" => "''", '%' => '[%]', '_' => '[_]', '[' => '[[]'));
|
|
||||||
return ($pos <= 0 ? "'%" : "'") . $value . ($pos >= 0 ? "%'" : "'");
|
|
||||||
|
|
||||||
default:
|
|
||||||
throw new DibiNotImplementedException;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -405,19 +359,10 @@ class DibiPdoDriver extends DibiObject implements IDibiDriver, IDibiResultDriver
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'odbc':
|
||||||
|
case 'dblib':
|
||||||
case 'mssql':
|
case 'mssql':
|
||||||
case 'sqlsrv':
|
case 'sqlsrv':
|
||||||
case 'dblib':
|
|
||||||
if (version_compare($this->serverVersion, '11.0') >= 0) {
|
|
||||||
if ($offset >= 0 || $limit >= 0) {
|
|
||||||
$sql .= ' OFFSET ' . (int) $offset . ' ROWS'
|
|
||||||
. ($limit > 0 ? ' FETCH NEXT ' . (int) $limit . ' ROWS ONLY' : '');
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
// intentionally break omitted
|
|
||||||
|
|
||||||
case 'odbc':
|
|
||||||
if ($offset < 1) {
|
if ($offset < 1) {
|
||||||
$sql = 'SELECT TOP ' . (int) $limit . ' * FROM (' . $sql . ') t';
|
$sql = 'SELECT TOP ' . (int) $limit . ' * FROM (' . $sql . ') t';
|
||||||
break;
|
break;
|
||||||
@@ -456,7 +401,7 @@ class DibiPdoDriver extends DibiObject implements IDibiDriver, IDibiResultDriver
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Moves cursor position without fetching row.
|
* Moves cursor position without fetching row.
|
||||||
* @param int the 0-based cursor pos to seek to
|
* @param int the 0-based cursor pos to seek to
|
||||||
* @return bool TRUE on success, FALSE if unable to seek to specified record
|
* @return bool TRUE on success, FALSE if unable to seek to specified record
|
||||||
*/
|
*/
|
||||||
public function seek($row)
|
public function seek($row)
|
||||||
|
@@ -18,6 +18,7 @@
|
|||||||
* - resource (resource) => existing connection resource
|
* - resource (resource) => existing connection resource
|
||||||
* - lazy, profiler, result, substitutes, ... => see DibiConnection options
|
* - lazy, profiler, result, substitutes, ... => see DibiConnection options
|
||||||
*
|
*
|
||||||
|
* @author David Grudl
|
||||||
* @package dibi\drivers
|
* @package dibi\drivers
|
||||||
*/
|
*/
|
||||||
class DibiPostgreDriver extends DibiObject implements IDibiDriver, IDibiResultDriver, IDibiReflector
|
class DibiPostgreDriver extends DibiObject implements IDibiDriver, IDibiResultDriver, IDibiReflector
|
||||||
@@ -66,7 +67,7 @@ class DibiPostgreDriver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
$string = '';
|
$string = '';
|
||||||
DibiConnection::alias($config, 'user', 'username');
|
DibiConnection::alias($config, 'user', 'username');
|
||||||
DibiConnection::alias($config, 'dbname', 'database');
|
DibiConnection::alias($config, 'dbname', 'database');
|
||||||
foreach (array('host', 'hostaddr', 'port', 'dbname', 'user', 'password', 'connect_timeout', 'options', 'sslmode', 'service') as $key) {
|
foreach (array('host','hostaddr','port','dbname','user','password','connect_timeout','options','sslmode','service') as $key) {
|
||||||
if (isset($config[$key])) {
|
if (isset($config[$key])) {
|
||||||
$string .= $key . '=' . $config[$key] . ' ';
|
$string .= $key . '=' . $config[$key] . ' ';
|
||||||
}
|
}
|
||||||
@@ -112,16 +113,6 @@ class DibiPostgreDriver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Pings database.
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
public function ping()
|
|
||||||
{
|
|
||||||
return pg_ping($this->connection);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Executes the SQL query.
|
* Executes the SQL query.
|
||||||
* @param string SQL statement.
|
* @param string SQL statement.
|
||||||
@@ -384,7 +375,7 @@ class DibiPostgreDriver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Moves cursor position without fetching row.
|
* Moves cursor position without fetching row.
|
||||||
* @param int the 0-based cursor pos to seek to
|
* @param int the 0-based cursor pos to seek to
|
||||||
* @return bool TRUE on success, FALSE if unable to seek to specified record
|
* @return bool TRUE on success, FALSE if unable to seek to specified record
|
||||||
*/
|
*/
|
||||||
public function seek($row)
|
public function seek($row)
|
||||||
@@ -414,9 +405,9 @@ class DibiPostgreDriver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
$columns = array();
|
$columns = array();
|
||||||
for ($i = 0; $i < $count; $i++) {
|
for ($i = 0; $i < $count; $i++) {
|
||||||
$row = array(
|
$row = array(
|
||||||
'name' => pg_field_name($this->resultSet, $i),
|
'name' => pg_field_name($this->resultSet, $i),
|
||||||
'table' => pg_field_table($this->resultSet, $i),
|
'table' => pg_field_table($this->resultSet, $i),
|
||||||
'nativetype' => pg_field_type($this->resultSet, $i),
|
'nativetype'=> pg_field_type($this->resultSet, $i),
|
||||||
);
|
);
|
||||||
$row['fullname'] = $row['table'] ? $row['table'] . '.' . $row['name'] : $row['name'];
|
$row['fullname'] = $row['table'] ? $row['table'] . '.' . $row['name'] : $row['name'];
|
||||||
$columns[] = $row;
|
$columns[] = $row;
|
||||||
|
@@ -21,6 +21,7 @@ require_once dirname(__FILE__) . '/DibiSqliteReflector.php';
|
|||||||
* - resource (SQLite3) => existing connection resource
|
* - resource (SQLite3) => existing connection resource
|
||||||
* - lazy, profiler, result, substitutes, ... => see DibiConnection options
|
* - lazy, profiler, result, substitutes, ... => see DibiConnection options
|
||||||
*
|
*
|
||||||
|
* @author David Grudl
|
||||||
* @package dibi\drivers
|
* @package dibi\drivers
|
||||||
*/
|
*/
|
||||||
class DibiSqlite3Driver extends DibiObject implements IDibiDriver, IDibiResultDriver
|
class DibiSqlite3Driver extends DibiObject implements IDibiDriver, IDibiResultDriver
|
||||||
|
@@ -9,6 +9,7 @@
|
|||||||
/**
|
/**
|
||||||
* The dibi reflector for SQLite database.
|
* The dibi reflector for SQLite database.
|
||||||
*
|
*
|
||||||
|
* @author David Grudl
|
||||||
* @package dibi\drivers
|
* @package dibi\drivers
|
||||||
* @internal
|
* @internal
|
||||||
*/
|
*/
|
||||||
@@ -51,10 +52,17 @@ class DibiSqliteReflector extends DibiObject implements IDibiReflector
|
|||||||
*/
|
*/
|
||||||
public function getColumns($table)
|
public function getColumns($table)
|
||||||
{
|
{
|
||||||
|
$meta = $this->driver->query("
|
||||||
|
SELECT sql FROM sqlite_master WHERE type = 'table' AND name = {$this->driver->escape($table, dibi::TEXT)}
|
||||||
|
UNION ALL
|
||||||
|
SELECT sql FROM sqlite_temp_master WHERE type = 'table' AND name = {$this->driver->escape($table, dibi::TEXT)}
|
||||||
|
")->fetch(TRUE);
|
||||||
|
|
||||||
$res = $this->driver->query("PRAGMA table_info({$this->driver->escape($table, dibi::IDENTIFIER)})");
|
$res = $this->driver->query("PRAGMA table_info({$this->driver->escape($table, dibi::IDENTIFIER)})");
|
||||||
$columns = array();
|
$columns = array();
|
||||||
while ($row = $res->fetch(TRUE)) {
|
while ($row = $res->fetch(TRUE)) {
|
||||||
$column = $row['name'];
|
$column = $row['name'];
|
||||||
|
$pattern = "/(\"$column\"|\[$column\]|$column)\\s+[^,]+\\s+PRIMARY\\s+KEY\\s+AUTOINCREMENT/Ui";
|
||||||
$type = explode('(', $row['type']);
|
$type = explode('(', $row['type']);
|
||||||
$columns[] = array(
|
$columns[] = array(
|
||||||
'name' => $column,
|
'name' => $column,
|
||||||
@@ -64,7 +72,7 @@ class DibiSqliteReflector extends DibiObject implements IDibiReflector
|
|||||||
'size' => isset($type[1]) ? (int) $type[1] : NULL,
|
'size' => isset($type[1]) ? (int) $type[1] : NULL,
|
||||||
'nullable' => $row['notnull'] == '0',
|
'nullable' => $row['notnull'] == '0',
|
||||||
'default' => $row['dflt_value'],
|
'default' => $row['dflt_value'],
|
||||||
'autoincrement' => $row['pk'] && $type[0] === 'INTEGER',
|
'autoincrement' => (bool) preg_match($pattern, $meta['sql']),
|
||||||
'vendor' => $row,
|
'vendor' => $row,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@@ -1,14 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This file is part of the "dibi" - smart database abstraction layer.
|
|
||||||
* Copyright (c) 2005 David Grudl (https://davidgrudl.com)
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
require_once dirname(__FILE__) . '/DibiMsSql2005Driver.php';
|
|
||||||
|
|
||||||
|
|
||||||
class DibiSqlsrvDriver extends DibiMsSql2005Driver
|
|
||||||
{
|
|
||||||
}
|
|
@@ -10,6 +10,7 @@
|
|||||||
* This class is static container class for creating DB objects and
|
* This class is static container class for creating DB objects and
|
||||||
* store connections info.
|
* store connections info.
|
||||||
*
|
*
|
||||||
|
* @author David Grudl
|
||||||
* @package dibi
|
* @package dibi
|
||||||
*/
|
*/
|
||||||
class dibi
|
class dibi
|
||||||
@@ -38,8 +39,8 @@ class dibi
|
|||||||
FIELD_TIME = self::TIME;
|
FIELD_TIME = self::TIME;
|
||||||
|
|
||||||
/** version */
|
/** version */
|
||||||
const VERSION = '2.3.5',
|
const VERSION = '2.2.4',
|
||||||
REVISION = 'released on 2015-12-16';
|
REVISION = 'released on 2015-10-22';
|
||||||
|
|
||||||
/** sorting order */
|
/** sorting order */
|
||||||
const ASC = 'ASC',
|
const ASC = 'ASC',
|
||||||
@@ -67,7 +68,7 @@ class dibi
|
|||||||
public static $numOfQueries = 0;
|
public static $numOfQueries = 0;
|
||||||
|
|
||||||
/** @var string Default dibi driver */
|
/** @var string Default dibi driver */
|
||||||
public static $defaultDriver = 'mysqli';
|
public static $defaultDriver = 'mysql';
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -151,11 +152,13 @@ class dibi
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @deprecated
|
* Change active connection.
|
||||||
|
* @param string connection registy name
|
||||||
|
* @return void
|
||||||
|
* @throws DibiException
|
||||||
*/
|
*/
|
||||||
public static function activate($name)
|
public static function activate($name)
|
||||||
{
|
{
|
||||||
trigger_error(__METHOD__ . '() is deprecated.', E_USER_DEPRECATED);
|
|
||||||
self::$connection = self::getConnection($name);
|
self::$connection = self::getConnection($name);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -368,6 +371,18 @@ class dibi
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Replacement for majority of dibi::methods() in future.
|
||||||
|
*/
|
||||||
|
public static function __callStatic($name, $args)
|
||||||
|
{
|
||||||
|
//if ($name = 'select', 'update', ...') {
|
||||||
|
// return self::command()->$name($args);
|
||||||
|
//}
|
||||||
|
return call_user_func_array(array(self::getConnection(), $name), $args);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/********************* fluent SQL builders ****************d*g**/
|
/********************* fluent SQL builders ****************d*g**/
|
||||||
|
|
||||||
|
|
||||||
@@ -456,7 +471,7 @@ class dibi
|
|||||||
$sql = self::$sql;
|
$sql = self::$sql;
|
||||||
}
|
}
|
||||||
|
|
||||||
static $keywords1 = 'SELECT|(?:ON\s+DUPLICATE\s+KEY)?UPDATE|INSERT(?:\s+INTO)?|REPLACE(?:\s+INTO)?|DELETE|CALL|UNION|FROM|WHERE|HAVING|GROUP\s+BY|ORDER\s+BY|LIMIT|OFFSET|FETCH\s+NEXT|SET|VALUES|LEFT\s+JOIN|INNER\s+JOIN|TRUNCATE|START\s+TRANSACTION|BEGIN|COMMIT|ROLLBACK(?:\s+TO\s+SAVEPOINT)?|(?:RELEASE\s+)?SAVEPOINT';
|
static $keywords1 = 'SELECT|(?:ON\s+DUPLICATE\s+KEY)?UPDATE|INSERT(?:\s+INTO)?|REPLACE(?:\s+INTO)?|DELETE|CALL|UNION|FROM|WHERE|HAVING|GROUP\s+BY|ORDER\s+BY|LIMIT|OFFSET|SET|VALUES|LEFT\s+JOIN|INNER\s+JOIN|TRUNCATE';
|
||||||
static $keywords2 = 'ALL|DISTINCT|DISTINCTROW|IGNORE|AS|USING|ON|AND|OR|IN|IS|NOT|NULL|LIKE|RLIKE|REGEXP|TRUE|FALSE';
|
static $keywords2 = 'ALL|DISTINCT|DISTINCTROW|IGNORE|AS|USING|ON|AND|OR|IN|IS|NOT|NULL|LIKE|RLIKE|REGEXP|TRUE|FALSE';
|
||||||
|
|
||||||
// insert new lines
|
// insert new lines
|
||||||
|
@@ -9,6 +9,7 @@
|
|||||||
/**
|
/**
|
||||||
* dibi connection.
|
* dibi connection.
|
||||||
*
|
*
|
||||||
|
* @author David Grudl
|
||||||
* @package dibi
|
* @package dibi
|
||||||
*
|
*
|
||||||
* @property-read int $affectedRows
|
* @property-read int $affectedRows
|
||||||
@@ -75,26 +76,19 @@ class DibiConnection extends DibiObject
|
|||||||
$config['driver'] = dibi::$defaultDriver;
|
$config['driver'] = dibi::$defaultDriver;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($config['driver'] instanceof IDibiDriver) {
|
$class = preg_replace(array('#\W#', '#sql#'), array('_', 'Sql'), ucfirst(strtolower($config['driver'])));
|
||||||
$this->driver = $config['driver'];
|
$class = "Dibi{$class}Driver";
|
||||||
$config['driver'] = get_class($this->driver);
|
if (!class_exists($class)) {
|
||||||
} elseif (PHP_VERSION_ID >= 50307 && is_subclass_of($config['driver'], 'IDibiDriver')) {
|
include_once dirname(__FILE__) . "/../drivers/$class.php";
|
||||||
$this->driver = new $config['driver'];
|
|
||||||
} else {
|
|
||||||
$class = preg_replace(array('#\W#', '#sql#'), array('_', 'Sql'), ucfirst(strtolower($config['driver'])));
|
|
||||||
$class = "Dibi{$class}Driver";
|
|
||||||
if (!class_exists($class)) {
|
|
||||||
include_once dirname(__FILE__) . "/../drivers/$class.php";
|
|
||||||
|
|
||||||
if (!class_exists($class, FALSE)) {
|
if (!class_exists($class, FALSE)) {
|
||||||
throw new DibiException("Unable to create instance of dibi driver '$class'.");
|
throw new DibiException("Unable to create instance of dibi driver '$class'.");
|
||||||
}
|
|
||||||
}
|
}
|
||||||
$this->driver = new $class;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$config['name'] = $name;
|
$config['name'] = $name;
|
||||||
$this->config = $config;
|
$this->config = $config;
|
||||||
|
$this->driver = new $class;
|
||||||
$this->translator = new DibiTranslator($this);
|
$this->translator = new DibiTranslator($this);
|
||||||
|
|
||||||
// profiler
|
// profiler
|
||||||
@@ -113,7 +107,7 @@ class DibiConnection extends DibiObject
|
|||||||
$this->onEvent[] = array(new DibiFirePhpLogger($filter), 'logEvent');
|
$this->onEvent[] = array(new DibiFirePhpLogger($filter), 'logEvent');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!interface_exists('Tracy\IBarPanel') && interface_exists('Nette\Diagnostics\IBarPanel') && class_exists('DibiNettePanel')) {
|
if (!interface_exists('Tracy\IBarPanel') && (interface_exists('Nette\Diagnostics\IBarPanel') || interface_exists('IBarPanel'))) {
|
||||||
$panel = new DibiNettePanel(isset($profilerCfg['explain']) ? $profilerCfg['explain'] : TRUE, $filter);
|
$panel = new DibiNettePanel(isset($profilerCfg['explain']) ? $profilerCfg['explain'] : TRUE, $filter);
|
||||||
$panel->register($this);
|
$panel->register($this);
|
||||||
}
|
}
|
||||||
|
@@ -9,6 +9,7 @@
|
|||||||
/**
|
/**
|
||||||
* Default implementation of IDataSource for dibi.
|
* Default implementation of IDataSource for dibi.
|
||||||
*
|
*
|
||||||
|
* @author David Grudl
|
||||||
* @package dibi
|
* @package dibi
|
||||||
*/
|
*/
|
||||||
class DibiDataSource extends DibiObject implements IDataSource
|
class DibiDataSource extends DibiObject implements IDataSource
|
||||||
|
@@ -9,6 +9,7 @@
|
|||||||
/**
|
/**
|
||||||
* Reflection metadata class for a database.
|
* Reflection metadata class for a database.
|
||||||
*
|
*
|
||||||
|
* @author David Grudl
|
||||||
* @package dibi\reflection
|
* @package dibi\reflection
|
||||||
*
|
*
|
||||||
* @property-read string $name
|
* @property-read string $name
|
||||||
@@ -114,6 +115,7 @@ class DibiDatabaseInfo extends DibiObject
|
|||||||
/**
|
/**
|
||||||
* Reflection metadata class for a database table.
|
* Reflection metadata class for a database table.
|
||||||
*
|
*
|
||||||
|
* @author David Grudl
|
||||||
* @package dibi\reflection
|
* @package dibi\reflection
|
||||||
*
|
*
|
||||||
* @property-read string $name
|
* @property-read string $name
|
||||||
@@ -305,6 +307,7 @@ class DibiTableInfo extends DibiObject
|
|||||||
/**
|
/**
|
||||||
* Reflection metadata class for a result set.
|
* Reflection metadata class for a result set.
|
||||||
*
|
*
|
||||||
|
* @author David Grudl
|
||||||
* @package dibi\reflection
|
* @package dibi\reflection
|
||||||
*
|
*
|
||||||
* @property-read array $columns
|
* @property-read array $columns
|
||||||
@@ -390,7 +393,7 @@ class DibiResultInfo extends DibiObject
|
|||||||
$this->columns = array();
|
$this->columns = array();
|
||||||
$reflector = $this->driver instanceof IDibiReflector ? $this->driver : NULL;
|
$reflector = $this->driver instanceof IDibiReflector ? $this->driver : NULL;
|
||||||
foreach ($this->driver->getResultColumns() as $info) {
|
foreach ($this->driver->getResultColumns() as $info) {
|
||||||
$this->columns[] = $this->names[strtolower($info['name'])] = new DibiColumnInfo($reflector, $info);
|
$this->columns[] = $this->names[$info['name']] = new DibiColumnInfo($reflector, $info);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -401,6 +404,7 @@ class DibiResultInfo extends DibiObject
|
|||||||
/**
|
/**
|
||||||
* Reflection metadata class for a table or result set column.
|
* Reflection metadata class for a table or result set column.
|
||||||
*
|
*
|
||||||
|
* @author David Grudl
|
||||||
* @package dibi\reflection
|
* @package dibi\reflection
|
||||||
*
|
*
|
||||||
* @property-read string $name
|
* @property-read string $name
|
||||||
@@ -477,7 +481,7 @@ class DibiColumnInfo extends DibiObject
|
|||||||
*/
|
*/
|
||||||
public function getTableName()
|
public function getTableName()
|
||||||
{
|
{
|
||||||
return isset($this->info['table']) && $this->info['table'] != NULL ? $this->info['table'] : NULL; // intentionally ==
|
return isset($this->info['table']) ? $this->info['table'] : NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -566,7 +570,7 @@ class DibiColumnInfo extends DibiObject
|
|||||||
'^_' => dibi::TEXT, // PostgreSQL arrays
|
'^_' => dibi::TEXT, // PostgreSQL arrays
|
||||||
'BYTEA|BLOB|BIN' => dibi::BINARY,
|
'BYTEA|BLOB|BIN' => dibi::BINARY,
|
||||||
'TEXT|CHAR|POINT|INTERVAL' => dibi::TEXT,
|
'TEXT|CHAR|POINT|INTERVAL' => dibi::TEXT,
|
||||||
'YEAR|BYTE|COUNTER|SERIAL|INT|LONG|SHORT|^TINY$' => dibi::INTEGER,
|
'YEAR|BYTE|COUNTER|SERIAL|INT|LONG|SHORT' => dibi::INTEGER,
|
||||||
'CURRENCY|REAL|MONEY|FLOAT|DOUBLE|DECIMAL|NUMERIC|NUMBER' => dibi::FLOAT,
|
'CURRENCY|REAL|MONEY|FLOAT|DOUBLE|DECIMAL|NUMERIC|NUMBER' => dibi::FLOAT,
|
||||||
'^TIME$' => dibi::TIME,
|
'^TIME$' => dibi::TIME,
|
||||||
'TIME' => dibi::DATETIME, // DATETIME, TIMESTAMP
|
'TIME' => dibi::DATETIME, // DATETIME, TIMESTAMP
|
||||||
@@ -600,6 +604,7 @@ class DibiColumnInfo extends DibiObject
|
|||||||
/**
|
/**
|
||||||
* Reflection metadata class for a foreign key.
|
* Reflection metadata class for a foreign key.
|
||||||
*
|
*
|
||||||
|
* @author David Grudl
|
||||||
* @package dibi\reflection
|
* @package dibi\reflection
|
||||||
* @todo
|
* @todo
|
||||||
*
|
*
|
||||||
@@ -645,6 +650,7 @@ class DibiForeignKeyInfo extends DibiObject
|
|||||||
/**
|
/**
|
||||||
* Reflection metadata class for a index or primary key.
|
* Reflection metadata class for a index or primary key.
|
||||||
*
|
*
|
||||||
|
* @author David Grudl
|
||||||
* @package dibi\reflection
|
* @package dibi\reflection
|
||||||
*
|
*
|
||||||
* @property-read string $name
|
* @property-read string $name
|
||||||
|
@@ -9,6 +9,7 @@
|
|||||||
/**
|
/**
|
||||||
* DateTime with serialization and timestamp support for PHP 5.2.
|
* DateTime with serialization and timestamp support for PHP 5.2.
|
||||||
*
|
*
|
||||||
|
* @author David Grudl
|
||||||
* @package dibi
|
* @package dibi
|
||||||
*/
|
*/
|
||||||
class DibiDateTime extends DateTime
|
class DibiDateTime extends DateTime
|
||||||
|
@@ -9,6 +9,7 @@
|
|||||||
/**
|
/**
|
||||||
* Profiler & logger event.
|
* Profiler & logger event.
|
||||||
*
|
*
|
||||||
|
* @author David Grudl
|
||||||
* @package dibi
|
* @package dibi
|
||||||
*/
|
*/
|
||||||
class DibiEvent
|
class DibiEvent
|
||||||
|
@@ -9,6 +9,7 @@
|
|||||||
/**
|
/**
|
||||||
* dibi common exception.
|
* dibi common exception.
|
||||||
*
|
*
|
||||||
|
* @author David Grudl
|
||||||
* @package dibi
|
* @package dibi
|
||||||
*/
|
*/
|
||||||
class DibiException extends Exception
|
class DibiException extends Exception
|
||||||
@@ -53,6 +54,7 @@ class DibiException extends Exception
|
|||||||
/**
|
/**
|
||||||
* database server exception.
|
* database server exception.
|
||||||
*
|
*
|
||||||
|
* @author David Grudl
|
||||||
* @package dibi
|
* @package dibi
|
||||||
*/
|
*/
|
||||||
class DibiDriverException extends DibiException
|
class DibiDriverException extends DibiException
|
||||||
@@ -112,6 +114,7 @@ class DibiDriverException extends DibiException
|
|||||||
/**
|
/**
|
||||||
* PCRE exception.
|
* PCRE exception.
|
||||||
*
|
*
|
||||||
|
* @author David Grudl
|
||||||
* @package dibi
|
* @package dibi
|
||||||
*/
|
*/
|
||||||
class DibiPcreException extends Exception
|
class DibiPcreException extends Exception
|
||||||
|
@@ -9,6 +9,7 @@
|
|||||||
/**
|
/**
|
||||||
* dibi file logger.
|
* dibi file logger.
|
||||||
*
|
*
|
||||||
|
* @author David Grudl
|
||||||
* @package dibi
|
* @package dibi
|
||||||
*/
|
*/
|
||||||
class DibiFileLogger extends DibiObject
|
class DibiFileLogger extends DibiObject
|
||||||
|
@@ -9,6 +9,7 @@
|
|||||||
/**
|
/**
|
||||||
* dibi FirePHP logger.
|
* dibi FirePHP logger.
|
||||||
*
|
*
|
||||||
|
* @author David Grudl
|
||||||
* @package dibi
|
* @package dibi
|
||||||
*/
|
*/
|
||||||
class DibiFirePhpLogger extends DibiObject
|
class DibiFirePhpLogger extends DibiObject
|
||||||
@@ -19,9 +20,6 @@ class DibiFirePhpLogger extends DibiObject
|
|||||||
/** maximum SQL length */
|
/** maximum SQL length */
|
||||||
static public $maxLength = 1000;
|
static public $maxLength = 1000;
|
||||||
|
|
||||||
/** size of json stream chunk */
|
|
||||||
static public $streamChunkSize = 4990;
|
|
||||||
|
|
||||||
/** @var int */
|
/** @var int */
|
||||||
public $filter;
|
public $filter;
|
||||||
|
|
||||||
@@ -60,11 +58,6 @@ class DibiFirePhpLogger extends DibiObject
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$this->numOfQueries) {
|
|
||||||
header('X-Wf-Protocol-dibi: http://meta.wildfirehq.org/Protocol/JsonStream/0.2');
|
|
||||||
header('X-Wf-dibi-Plugin-1: http://meta.firephp.org/Wildfire/Plugin/FirePHP/Library-FirePHPCore/0.2.0');
|
|
||||||
header('X-Wf-dibi-Structure-1: http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1');
|
|
||||||
}
|
|
||||||
$this->totalTime += $event->time;
|
$this->totalTime += $event->time;
|
||||||
$this->numOfQueries++;
|
$this->numOfQueries++;
|
||||||
self::$fireTable[] = array(
|
self::$fireTable[] = array(
|
||||||
@@ -74,6 +67,10 @@ class DibiFirePhpLogger extends DibiObject
|
|||||||
$event->connection->getConfig('driver') . '/' . $event->connection->getConfig('name'),
|
$event->connection->getConfig('driver') . '/' . $event->connection->getConfig('name'),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
header('X-Wf-Protocol-dibi: http://meta.wildfirehq.org/Protocol/JsonStream/0.2');
|
||||||
|
header('X-Wf-dibi-Plugin-1: http://meta.firephp.org/Wildfire/Plugin/FirePHP/Library-FirePHPCore/0.2.0');
|
||||||
|
header('X-Wf-dibi-Structure-1: http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1');
|
||||||
|
|
||||||
$payload = json_encode(array(
|
$payload = json_encode(array(
|
||||||
array(
|
array(
|
||||||
'Type' => 'TABLE',
|
'Type' => 'TABLE',
|
||||||
@@ -81,7 +78,7 @@ class DibiFirePhpLogger extends DibiObject
|
|||||||
),
|
),
|
||||||
self::$fireTable,
|
self::$fireTable,
|
||||||
));
|
));
|
||||||
foreach (str_split($payload, self::$streamChunkSize) as $num => $s) {
|
foreach (str_split($payload, 4990) as $num => $s) {
|
||||||
$num++;
|
$num++;
|
||||||
header("X-Wf-dibi-1-1-d$num: |$s|\\"); // protocol-, structure-, plugin-, message-index
|
header("X-Wf-dibi-1-1-d$num: |$s|\\"); // protocol-, structure-, plugin-, message-index
|
||||||
}
|
}
|
||||||
|
@@ -9,22 +9,20 @@
|
|||||||
/**
|
/**
|
||||||
* dibi SQL builder via fluent interfaces. EXPERIMENTAL!
|
* dibi SQL builder via fluent interfaces. EXPERIMENTAL!
|
||||||
*
|
*
|
||||||
* @method DibiFluent select(...$field)
|
* @author David Grudl
|
||||||
|
* @package dibi
|
||||||
|
*
|
||||||
|
* @method DibiFluent select($field)
|
||||||
* @method DibiFluent distinct()
|
* @method DibiFluent distinct()
|
||||||
* @method DibiFluent from($table)
|
* @method DibiFluent from($table)
|
||||||
* @method DibiFluent where(...$cond)
|
* @method DibiFluent where($cond)
|
||||||
* @method DibiFluent groupBy(...$field)
|
* @method DibiFluent groupBy($field)
|
||||||
* @method DibiFluent having(...$cond)
|
* @method DibiFluent having($cond)
|
||||||
* @method DibiFluent orderBy(...$field)
|
* @method DibiFluent orderBy($field)
|
||||||
* @method DibiFluent limit(int $limit)
|
* @method DibiFluent limit(int $limit)
|
||||||
* @method DibiFluent offset(int $offset)
|
* @method DibiFluent offset(int $offset)
|
||||||
* @method DibiFluent join(...$table)
|
* @method DibiFluent leftJoin($table)
|
||||||
* @method DibiFluent leftJoin(...$table)
|
* @method DibiFluent on($cond)
|
||||||
* @method DibiFluent innerJoin(...$table)
|
|
||||||
* @method DibiFluent rightJoin(...$table)
|
|
||||||
* @method DibiFluent outerJoin(...$table)
|
|
||||||
* @method DibiFluent on(...$cond)
|
|
||||||
* @method DibiFluent using(...$cond)
|
|
||||||
*/
|
*/
|
||||||
class DibiFluent extends DibiObject implements IDataSource
|
class DibiFluent extends DibiObject implements IDataSource
|
||||||
{
|
{
|
||||||
@@ -178,10 +176,7 @@ class DibiFluent extends DibiObject implements IDataSource
|
|||||||
} elseif (is_string($arg) && preg_match('#^[a-z:_][a-z0-9_.:]*\z#i', $arg)) { // identifier
|
} elseif (is_string($arg) && preg_match('#^[a-z:_][a-z0-9_.:]*\z#i', $arg)) { // identifier
|
||||||
$args = array('%n', $arg);
|
$args = array('%n', $arg);
|
||||||
|
|
||||||
} elseif ($arg instanceof self) {
|
} elseif (is_array($arg) || ($arg instanceof Traversable && !$arg instanceof self)) { // any array
|
||||||
$args = array('%SQL', $arg);
|
|
||||||
|
|
||||||
} elseif (is_array($arg) || $arg instanceof Traversable) { // any array
|
|
||||||
if (isset(self::$modifiers[$clause])) {
|
if (isset(self::$modifiers[$clause])) {
|
||||||
$args = array(self::$modifiers[$clause], $arg);
|
$args = array(self::$modifiers[$clause], $arg);
|
||||||
|
|
||||||
@@ -321,11 +316,12 @@ class DibiFluent extends DibiObject implements IDataSource
|
|||||||
*/
|
*/
|
||||||
public function fetch()
|
public function fetch()
|
||||||
{
|
{
|
||||||
if ($this->command === 'SELECT' && !$this->clauses['LIMIT'] && !$this->clauses['OFFSET']) {
|
if ($this->command === 'SELECT' && !$this->clauses['LIMIT']) {
|
||||||
return $this->query($this->_export(NULL, array('%lmt', 1)))->fetch();
|
$result = $this->query($this->limit(1)->_export())->fetch();
|
||||||
} else {
|
$this->removeClause('LIMIT');
|
||||||
return $this->query($this->_export())->fetch();
|
return $result;
|
||||||
}
|
}
|
||||||
|
return $this->query($this->_export())->fetch();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -335,11 +331,12 @@ class DibiFluent extends DibiObject implements IDataSource
|
|||||||
*/
|
*/
|
||||||
public function fetchSingle()
|
public function fetchSingle()
|
||||||
{
|
{
|
||||||
if ($this->command === 'SELECT' && !$this->clauses['LIMIT'] && !$this->clauses['OFFSET']) {
|
if ($this->command === 'SELECT' && !$this->clauses['LIMIT']) {
|
||||||
return $this->query($this->_export(NULL, array('%lmt', 1)))->fetchSingle();
|
$result = $this->query($this->limit(1)->_export())->fetchSingle();
|
||||||
} else {
|
$this->removeClause('LIMIT');
|
||||||
return $this->query($this->_export())->fetchSingle();
|
return $result;
|
||||||
}
|
}
|
||||||
|
return $this->query($this->_export())->fetchSingle();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -9,6 +9,7 @@
|
|||||||
/**
|
/**
|
||||||
* Lazy cached storage.
|
* Lazy cached storage.
|
||||||
*
|
*
|
||||||
|
* @author David Grudl
|
||||||
* @package dibi
|
* @package dibi
|
||||||
* @internal
|
* @internal
|
||||||
*/
|
*/
|
||||||
@@ -44,6 +45,7 @@ abstract class DibiHashMapBase
|
|||||||
/**
|
/**
|
||||||
* Lazy cached storage.
|
* Lazy cached storage.
|
||||||
*
|
*
|
||||||
|
* @author David Grudl
|
||||||
* @internal
|
* @internal
|
||||||
*/
|
*/
|
||||||
final class DibiHashMap extends DibiHashMapBase
|
final class DibiHashMap extends DibiHashMapBase
|
||||||
|
@@ -9,6 +9,7 @@
|
|||||||
/**
|
/**
|
||||||
* SQL literal value.
|
* SQL literal value.
|
||||||
*
|
*
|
||||||
|
* @author David Grudl
|
||||||
* @package dibi
|
* @package dibi
|
||||||
*/
|
*/
|
||||||
class DibiLiteral extends DibiObject
|
class DibiLiteral extends DibiObject
|
||||||
|
@@ -44,6 +44,7 @@
|
|||||||
* $obj->newMethod($x);
|
* $obj->newMethod($x);
|
||||||
* </code>
|
* </code>
|
||||||
*
|
*
|
||||||
|
* @author David Grudl
|
||||||
* @package dibi
|
* @package dibi
|
||||||
*/
|
*/
|
||||||
abstract class DibiObject
|
abstract class DibiObject
|
||||||
|
@@ -22,6 +22,7 @@
|
|||||||
* unset($result);
|
* unset($result);
|
||||||
* </code>
|
* </code>
|
||||||
*
|
*
|
||||||
|
* @author David Grudl
|
||||||
* @package dibi
|
* @package dibi
|
||||||
*
|
*
|
||||||
* @property-read int $rowCount
|
* @property-read int $rowCount
|
||||||
@@ -253,7 +254,7 @@ class DibiResult extends DibiObject implements IDataSource
|
|||||||
* - associative descriptor: col1|col2->col3=col4
|
* - associative descriptor: col1|col2->col3=col4
|
||||||
* builds a tree: $tree[$val1][$val2]->col3[$val3] = val4
|
* builds a tree: $tree[$val1][$val2]->col3[$val3] = val4
|
||||||
* @param string associative descriptor
|
* @param string associative descriptor
|
||||||
* @return array
|
* @return DibiRow
|
||||||
* @throws InvalidArgumentException
|
* @throws InvalidArgumentException
|
||||||
*/
|
*/
|
||||||
final public function fetchAssoc($assoc)
|
final public function fetchAssoc($assoc)
|
||||||
@@ -488,10 +489,12 @@ class DibiResult extends DibiObject implements IDataSource
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
$value = $row[$key];
|
$value = $row[$key];
|
||||||
if ($type === dibi::TEXT) {
|
if ($value === FALSE || $type === dibi::TEXT) {
|
||||||
|
|
||||||
} elseif ($type === dibi::INTEGER) {
|
} elseif ($type === dibi::INTEGER) {
|
||||||
$row[$key] = is_float($tmp = $value * 1) ? $value : $tmp;
|
$row[$key] = is_float($tmp = $value * 1)
|
||||||
|
? (is_string($value) ? $value : (int) $value)
|
||||||
|
: $tmp;
|
||||||
|
|
||||||
} elseif ($type === dibi::FLOAT) {
|
} elseif ($type === dibi::FLOAT) {
|
||||||
$value = ltrim($value, '0');
|
$value = ltrim($value, '0');
|
||||||
|
@@ -18,6 +18,7 @@
|
|||||||
* unset($result);
|
* unset($result);
|
||||||
* </code>
|
* </code>
|
||||||
*
|
*
|
||||||
|
* @author David Grudl
|
||||||
* @package dibi
|
* @package dibi
|
||||||
*/
|
*/
|
||||||
class DibiResultIterator implements Iterator, Countable
|
class DibiResultIterator implements Iterator, Countable
|
||||||
|
@@ -9,6 +9,7 @@
|
|||||||
/**
|
/**
|
||||||
* Result set single row.
|
* Result set single row.
|
||||||
*
|
*
|
||||||
|
* @author David Grudl
|
||||||
* @package dibi
|
* @package dibi
|
||||||
*/
|
*/
|
||||||
class DibiRow implements ArrayAccess, IteratorAggregate, Countable
|
class DibiRow implements ArrayAccess, IteratorAggregate, Countable
|
||||||
|
@@ -9,6 +9,7 @@
|
|||||||
/**
|
/**
|
||||||
* dibi SQL translator.
|
* dibi SQL translator.
|
||||||
*
|
*
|
||||||
|
* @author David Grudl
|
||||||
* @package dibi
|
* @package dibi
|
||||||
*/
|
*/
|
||||||
final class DibiTranslator extends DibiObject
|
final class DibiTranslator extends DibiObject
|
||||||
@@ -215,7 +216,7 @@ final class DibiTranslator extends DibiObject
|
|||||||
$v = $this->formatValue($v, FALSE);
|
$v = $this->formatValue($v, FALSE);
|
||||||
$vx[] = $k . ($v === 'NULL' ? 'IS ' : '= ') . $v;
|
$vx[] = $k . ($v === 'NULL' ? 'IS ' : '= ') . $v;
|
||||||
|
|
||||||
} elseif ($pair[1] === 'ex') {
|
} elseif ($pair[1] === 'ex') { // TODO: this will be removed
|
||||||
$vx[] = $k . $this->formatValue($v, 'ex');
|
$vx[] = $k . $this->formatValue($v, 'ex');
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@@ -356,24 +357,19 @@ final class DibiTranslator extends DibiObject
|
|||||||
|
|
||||||
case 'i': // signed int
|
case 'i': // signed int
|
||||||
case 'u': // unsigned int, ignored
|
case 'u': // unsigned int, ignored
|
||||||
if ($value === NULL) {
|
// support for long numbers - keep them unchanged
|
||||||
return 'NULL';
|
if (is_string($value) && preg_match('#[+-]?\d++(e\d+)?\z#A', $value)) {
|
||||||
} elseif (is_string($value) && preg_match('#[+-]?\d++(?:e\d+)?\z#A', $value)) {
|
return $value;
|
||||||
return $value; // support for long numbers - keep them unchanged
|
|
||||||
} elseif (is_string($value) && substr($value, 1, 1) === 'x' && is_numeric($value)) {
|
|
||||||
trigger_error('Support for hex strings has been deprecated.', E_USER_DEPRECATED);
|
|
||||||
return (string) hexdec($value);
|
|
||||||
} else {
|
} else {
|
||||||
return (string) (int) $value;
|
return $value === NULL ? 'NULL' : (string) (int) ($value + 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
case 'f': // float
|
case 'f': // float
|
||||||
if ($value === NULL) {
|
// support for extreme numbers - keep them unchanged
|
||||||
return 'NULL';
|
if (is_string($value) && is_numeric($value) && strpos($value, 'x') === FALSE) {
|
||||||
} elseif (is_string($value) && is_numeric($value) && substr($value, 1, 1) !== 'x') {
|
return $value; // something like -9E-005 is accepted by SQL, HEX values are not
|
||||||
return $value; // support for extreme numbers - keep them unchanged
|
|
||||||
} else {
|
} else {
|
||||||
return rtrim(rtrim(number_format($value + 0, 10, '.', ''), '0'), '.');
|
return $value === NULL ? 'NULL' : rtrim(rtrim(number_format($value + 0, 10, '.', ''), '0'), '.');
|
||||||
}
|
}
|
||||||
|
|
||||||
case 'd': // date
|
case 'd': // date
|
||||||
@@ -546,23 +542,17 @@ final class DibiTranslator extends DibiObject
|
|||||||
return '';
|
return '';
|
||||||
|
|
||||||
} elseif ($mod === 'lmt') { // apply limit
|
} elseif ($mod === 'lmt') { // apply limit
|
||||||
$arg = $this->args[$cursor++];
|
if ($this->args[$cursor] !== NULL) {
|
||||||
if ($arg === NULL) {
|
$this->limit = (int) $this->args[$cursor];
|
||||||
} elseif ($this->comment) {
|
|
||||||
return "(limit $arg)";
|
|
||||||
} else {
|
|
||||||
$this->limit = (int) $arg;
|
|
||||||
}
|
}
|
||||||
|
$cursor++;
|
||||||
return '';
|
return '';
|
||||||
|
|
||||||
} elseif ($mod === 'ofs') { // apply offset
|
} elseif ($mod === 'ofs') { // apply offset
|
||||||
$arg = $this->args[$cursor++];
|
if ($this->args[$cursor] !== NULL) {
|
||||||
if ($arg === NULL) {
|
$this->offset = (int) $this->args[$cursor];
|
||||||
} elseif ($this->comment) {
|
|
||||||
return "(offset $arg)";
|
|
||||||
} else {
|
|
||||||
$this->offset = (int) $arg;
|
|
||||||
}
|
}
|
||||||
|
$cursor++;
|
||||||
return '';
|
return '';
|
||||||
|
|
||||||
} else { // default processing
|
} else { // default processing
|
||||||
@@ -598,7 +588,7 @@ final class DibiTranslator extends DibiObject
|
|||||||
return $matches[9] == '' ? $this->formatValue($m, FALSE) : $m . $matches[9]; // value or identifier
|
return $matches[9] == '' ? $this->formatValue($m, FALSE) : $m . $matches[9]; // value or identifier
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new Exception('this should be never executed');
|
die('this should be never executed');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -184,6 +184,7 @@ interface IDibiResultDriver
|
|||||||
/**
|
/**
|
||||||
* dibi driver reflection.
|
* dibi driver reflection.
|
||||||
*
|
*
|
||||||
|
* @author David Grudl
|
||||||
* @package dibi
|
* @package dibi
|
||||||
*/
|
*/
|
||||||
interface IDibiReflector
|
interface IDibiReflector
|
||||||
|
BIN
examples/data/sample.sdb
Normal file
BIN
examples/data/sample.sdb
Normal file
Binary file not shown.
@@ -1,10 +1,7 @@
|
|||||||
[Dibi](https://dibiphp.com) - smart database layer for PHP [](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=9XXL5ZJHAYQUN)
|
[Dibi](http://dibiphp.com) - smart database layer for PHP [](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=9XXL5ZJHAYQUN)
|
||||||
=========================================================
|
=========================================================
|
||||||
|
|
||||||
[](https://packagist.org/packages/dibi/dibi)
|
[](https://packagist.org/packages/dibi/dibi)
|
||||||
[](https://travis-ci.org/dg/dibi)
|
|
||||||
[](https://github.com/dg/dibi/releases)
|
|
||||||
[](https://github.com/dg/dibi/blob/master/license.md)
|
|
||||||
|
|
||||||
Database access functions in PHP are not standardised. This library
|
Database access functions in PHP are not standardised. This library
|
||||||
hides the differences between them, and above all, it gives you a very handy interface.
|
hides the differences between them, and above all, it gives you a very handy interface.
|
||||||
@@ -13,7 +10,7 @@ The best way to install Dibi is to use a [Composer](https://getcomposer.org/down
|
|||||||
|
|
||||||
php composer.phar require dibi/dibi
|
php composer.phar require dibi/dibi
|
||||||
|
|
||||||
Or you can download the latest package from https://dibiphp.com. In this
|
Or you can download the latest package from http://dibiphp.com. In this
|
||||||
package is also `Dibi.minified`, shrinked single-file version of whole Dibi,
|
package is also `Dibi.minified`, shrinked single-file version of whole Dibi,
|
||||||
useful when you don't want to modify the library, but just use it.
|
useful when you don't want to modify the library, but just use it.
|
||||||
|
|
||||||
@@ -24,7 +21,7 @@ Examples
|
|||||||
--------
|
--------
|
||||||
|
|
||||||
Refer to the `examples` directory for examples. Dibi documentation is
|
Refer to the `examples` directory for examples. Dibi documentation is
|
||||||
available on the [homepage](https://dibiphp.com).
|
available on the [homepage](http://dibiphp.com).
|
||||||
|
|
||||||
Connect to database:
|
Connect to database:
|
||||||
|
|
||||||
|
4
tests/.gitignore
vendored
4
tests/.gitignore
vendored
@@ -1,4 +0,0 @@
|
|||||||
output
|
|
||||||
/tmp
|
|
||||||
/test.log
|
|
||||||
/databases.ini
|
|
@@ -1,104 +0,0 @@
|
|||||||
[sqlite] ; default
|
|
||||||
driver = sqlite3
|
|
||||||
database = :memory:
|
|
||||||
system = sqlite
|
|
||||||
|
|
||||||
[sqlite 2]
|
|
||||||
driver = sqlite
|
|
||||||
database = :memory:
|
|
||||||
system = sqlite
|
|
||||||
|
|
||||||
[sqlite pdo]
|
|
||||||
driver = pdo
|
|
||||||
dsn = "sqlite::memory:"
|
|
||||||
system = sqlite
|
|
||||||
|
|
||||||
[mysql]
|
|
||||||
driver = mysql
|
|
||||||
host = 127.0.0.1
|
|
||||||
username = root
|
|
||||||
password =
|
|
||||||
charset = utf8
|
|
||||||
system = mysql
|
|
||||||
|
|
||||||
[mysql improved]
|
|
||||||
driver = mysqli
|
|
||||||
host = 127.0.0.1
|
|
||||||
username = root
|
|
||||||
password =
|
|
||||||
charset = utf8
|
|
||||||
system = mysql
|
|
||||||
|
|
||||||
[mysql pdo]
|
|
||||||
driver = pdo
|
|
||||||
dsn = "mysql:host=127.0.0.1"
|
|
||||||
username = root
|
|
||||||
password =
|
|
||||||
system = mysql
|
|
||||||
|
|
||||||
[postgre]
|
|
||||||
driver = postgre
|
|
||||||
host = 127.0.0.1
|
|
||||||
username = postgres
|
|
||||||
password =
|
|
||||||
system = postgre
|
|
||||||
|
|
||||||
[postgre pdo]
|
|
||||||
driver = pdo
|
|
||||||
dsn = "pgsql:host=127.0.0.1;dbname=dibi_test"
|
|
||||||
username = postgres
|
|
||||||
password =
|
|
||||||
system = postgre
|
|
||||||
|
|
||||||
[odbc]
|
|
||||||
driver = odbc
|
|
||||||
dsn = "Driver={Microsoft Access Driver (*.mdb)};Dbq=data/odbc.mdb"
|
|
||||||
system = odbc
|
|
||||||
|
|
||||||
[odbc pdo]
|
|
||||||
driver = pdo
|
|
||||||
dsn = "odbc:Driver={Microsoft Access Driver (*.mdb)};Dbq=data/odbc.mdb"
|
|
||||||
username =
|
|
||||||
password =
|
|
||||||
system = odbc
|
|
||||||
|
|
||||||
[mssql]
|
|
||||||
driver = mssql
|
|
||||||
host = 127.0.0.1
|
|
||||||
username = dibi
|
|
||||||
password =
|
|
||||||
system = sqlsrv
|
|
||||||
|
|
||||||
[sqlsrv]
|
|
||||||
driver = mssql2005
|
|
||||||
host = (local)
|
|
||||||
username = dibi
|
|
||||||
password =
|
|
||||||
system = sqlsrv
|
|
||||||
|
|
||||||
[sqlsrv pdo]
|
|
||||||
driver = pdo
|
|
||||||
dsn = "sqlsrv:Server=127.0.0.1"
|
|
||||||
username = dibi
|
|
||||||
password =
|
|
||||||
system = sqlsrv
|
|
||||||
|
|
||||||
[oracle]
|
|
||||||
driver = oracle
|
|
||||||
username = dibi
|
|
||||||
password =
|
|
||||||
system = oracle
|
|
||||||
|
|
||||||
[oracle pdo]
|
|
||||||
driver = pdo
|
|
||||||
dsn = "oci:dbname=dibi"
|
|
||||||
username = dibi
|
|
||||||
password =
|
|
||||||
system = oracle
|
|
||||||
|
|
||||||
[firebird]
|
|
||||||
driver = firebird
|
|
||||||
database = database.fdb
|
|
||||||
username = dibi
|
|
||||||
password =
|
|
||||||
system = firebird
|
|
@@ -1,159 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
use Tester\Assert;
|
|
||||||
|
|
||||||
require __DIR__ . '/bootstrap.php';
|
|
||||||
|
|
||||||
|
|
||||||
$conn = new DibiConnection($config);
|
|
||||||
$conn->loadFile(__DIR__ . "/data/$config[system].sql");
|
|
||||||
|
|
||||||
|
|
||||||
$ds = $conn->dataSource('SELECT * FROM products');
|
|
||||||
Assert::match(
|
|
||||||
reformat('
|
|
||||||
SELECT *
|
|
||||||
FROM (SELECT * FROM products) t'),
|
|
||||||
(string) $ds
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
Assert::same(3, $ds->count());
|
|
||||||
Assert::same(3, $ds->getTotalCount());
|
|
||||||
Assert::same(
|
|
||||||
reformat('SELECT COUNT(*) FROM (SELECT * FROM products) t'),
|
|
||||||
dibi::$sql
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
$ds->select('title');
|
|
||||||
$ds->orderBy('title', dibi::DESC);
|
|
||||||
$ds->where('title like "%a%"');
|
|
||||||
Assert::match(
|
|
||||||
reformat("
|
|
||||||
SELECT [title]
|
|
||||||
FROM (SELECT * FROM products) t
|
|
||||||
WHERE (title like '%a%')
|
|
||||||
ORDER BY [title] DESC
|
|
||||||
"),
|
|
||||||
(string) $ds
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
$ds->select('product_id');
|
|
||||||
$ds->orderBy('product_id', dibi::ASC);
|
|
||||||
$ds->where('product_id = %i', 1);
|
|
||||||
Assert::match(
|
|
||||||
reformat("
|
|
||||||
SELECT [title], [product_id]
|
|
||||||
FROM (SELECT * FROM products) t
|
|
||||||
WHERE (title like '%a%') AND (product_id = 1)
|
|
||||||
ORDER BY [title] DESC, [product_id] ASC
|
|
||||||
"),
|
|
||||||
(string) $ds
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
$ds->select(array('product_id'));
|
|
||||||
$ds->orderBy(array('product_id' => dibi::ASC));
|
|
||||||
$ds->where(array('product_id = 1'));
|
|
||||||
Assert::match(
|
|
||||||
reformat("
|
|
||||||
SELECT [product_id]
|
|
||||||
FROM (SELECT * FROM products) t
|
|
||||||
WHERE (title like '%a%') AND (product_id = 1) AND (product_id = 1)
|
|
||||||
ORDER BY [product_id] ASC
|
|
||||||
"),
|
|
||||||
(string) $ds
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
Assert::same(1, $ds->count());
|
|
||||||
Assert::same(3, $ds->getTotalCount());
|
|
||||||
Assert::match(reformat("SELECT COUNT(*) FROM (
|
|
||||||
SELECT [product_id]
|
|
||||||
FROM (SELECT * FROM products) t
|
|
||||||
WHERE (title like '%a%') AND (product_id = 1) AND (product_id = 1)
|
|
||||||
ORDER BY [product_id] ASC
|
|
||||||
) t"), dibi::$sql);
|
|
||||||
Assert::same(1, $ds->toDataSource()->count());
|
|
||||||
|
|
||||||
|
|
||||||
Assert::equal(array(
|
|
||||||
new DibiRow(array(
|
|
||||||
'product_id' => 1,
|
|
||||||
)),
|
|
||||||
), iterator_to_array($ds));
|
|
||||||
|
|
||||||
Assert::match(
|
|
||||||
reformat("
|
|
||||||
SELECT [product_id]
|
|
||||||
FROM (SELECT * FROM products) t
|
|
||||||
WHERE (title like '%a%') AND (product_id = 1) AND (product_id = 1)
|
|
||||||
ORDER BY [product_id] ASC
|
|
||||||
"),
|
|
||||||
dibi::$sql
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
$fluent = $ds->toFluent();
|
|
||||||
Assert::same(1, $fluent->count());
|
|
||||||
Assert::match(
|
|
||||||
reformat("SELECT * FROM (
|
|
||||||
SELECT [product_id]
|
|
||||||
FROM (SELECT * FROM products) t
|
|
||||||
WHERE (title like '%a%') AND (product_id = 1) AND (product_id = 1)
|
|
||||||
ORDER BY [product_id] ASC
|
|
||||||
) t"),
|
|
||||||
(string) $fluent
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
$ds = $conn->select('title')->from('products')->toDataSource();
|
|
||||||
Assert::match(
|
|
||||||
reformat('
|
|
||||||
SELECT *
|
|
||||||
FROM (SELECT [title] FROM [products]) t'),
|
|
||||||
(string) $ds
|
|
||||||
);
|
|
||||||
|
|
||||||
Assert::equal(new DibiRow(array(
|
|
||||||
'product_id' => 1,
|
|
||||||
'title' => 'Chair',
|
|
||||||
)), $conn->dataSource('SELECT * FROM products ORDER BY product_id')->fetch());
|
|
||||||
|
|
||||||
Assert::same(1, $conn->dataSource('SELECT * FROM products ORDER BY product_id')->fetchSingle());
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
array(1 => 'Chair', 'Table', 'Computer'),
|
|
||||||
$conn->dataSource('SELECT * FROM products ORDER BY product_id')->fetchPairs()
|
|
||||||
);
|
|
||||||
|
|
||||||
Assert::equal(array(
|
|
||||||
1 => new DibiRow(array(
|
|
||||||
'product_id' => 1,
|
|
||||||
'title' => 'Chair',
|
|
||||||
)),
|
|
||||||
new DibiRow(array(
|
|
||||||
'product_id' => 2,
|
|
||||||
'title' => 'Table',
|
|
||||||
)),
|
|
||||||
new DibiRow(array(
|
|
||||||
'product_id' => 3,
|
|
||||||
'title' => 'Computer',
|
|
||||||
)),
|
|
||||||
), $conn->dataSource('SELECT * FROM products ORDER BY product_id')->fetchAssoc('product_id'));
|
|
||||||
|
|
||||||
|
|
||||||
$ds = new DibiDataSource('products', $conn);
|
|
||||||
|
|
||||||
Assert::match(
|
|
||||||
reformat('
|
|
||||||
SELECT *
|
|
||||||
FROM [products]'),
|
|
||||||
(string) $ds
|
|
||||||
);
|
|
||||||
|
|
||||||
Assert::same(3, $ds->count());
|
|
||||||
Assert::same(3, $ds->getTotalCount());
|
|
||||||
Assert::same(reformat('SELECT COUNT(*) FROM [products]'), dibi::$sql);
|
|
@@ -1,35 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @dataProvider ../databases.ini
|
|
||||||
*/
|
|
||||||
|
|
||||||
use Tester\Assert;
|
|
||||||
|
|
||||||
require __DIR__ . '/bootstrap.php';
|
|
||||||
|
|
||||||
$conn = new DibiConnection($config);
|
|
||||||
$conn->loadFile(__DIR__ . "/data/$config[system].sql");
|
|
||||||
|
|
||||||
|
|
||||||
$conn->query('INSERT INTO products', array(
|
|
||||||
'title' => 'Test product',
|
|
||||||
));
|
|
||||||
Assert::same(1, $conn->getAffectedRows());
|
|
||||||
|
|
||||||
|
|
||||||
$conn->query('UPDATE products SET title="xxx" WHERE product_id > 100');
|
|
||||||
Assert::same(0, $conn->getAffectedRows());
|
|
||||||
|
|
||||||
|
|
||||||
$conn->query('UPDATE products SET title="xxx"');
|
|
||||||
Assert::same(4, $conn->getAffectedRows());
|
|
||||||
|
|
||||||
|
|
||||||
$conn->query('DELETE FROM orders');
|
|
||||||
$conn->query('DELETE FROM products WHERE product_id > 100');
|
|
||||||
Assert::same(0, $conn->getAffectedRows());
|
|
||||||
|
|
||||||
|
|
||||||
$conn->query('DELETE FROM products WHERE product_id < 3');
|
|
||||||
Assert::same(2, $conn->getAffectedRows());
|
|
@@ -1,37 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @dataProvider ../databases.ini
|
|
||||||
*/
|
|
||||||
|
|
||||||
use Tester\Assert;
|
|
||||||
|
|
||||||
require __DIR__ . '/bootstrap.php';
|
|
||||||
|
|
||||||
|
|
||||||
test(function () use ($config) {
|
|
||||||
$conn = new DibiConnection($config);
|
|
||||||
Assert::true($conn->isConnected());
|
|
||||||
|
|
||||||
$conn->disconnect();
|
|
||||||
Assert::false($conn->isConnected());
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
test(function () use ($config) { // lazy
|
|
||||||
$conn = new DibiConnection($config + array('lazy' => TRUE));
|
|
||||||
Assert::false($conn->isConnected());
|
|
||||||
|
|
||||||
$conn->query('SELECT 1');
|
|
||||||
Assert::true($conn->isConnected());
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
test(function () use ($config) { // query string
|
|
||||||
$conn = new DibiConnection(http_build_query($config, NULL, '&'));
|
|
||||||
Assert::true($conn->isConnected());
|
|
||||||
|
|
||||||
Assert::null($conn->getConfig('lazy'));
|
|
||||||
Assert::same($config['driver'], $conn->getConfig('driver'));
|
|
||||||
Assert::type('IDibiDriver', $conn->getDriver());
|
|
||||||
});
|
|
@@ -1,319 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @dataProvider ../databases.ini
|
|
||||||
*/
|
|
||||||
|
|
||||||
use Tester\Assert;
|
|
||||||
|
|
||||||
require __DIR__ . '/bootstrap.php';
|
|
||||||
|
|
||||||
$conn = new DibiConnection($config);
|
|
||||||
$conn->loadFile(__DIR__ . "/data/$config[system].sql");
|
|
||||||
|
|
||||||
|
|
||||||
// fetch a single value
|
|
||||||
$res = $conn->query('SELECT [title] FROM [products]');
|
|
||||||
Assert::same('Chair', $res->fetchSingle());
|
|
||||||
|
|
||||||
|
|
||||||
// fetch complete result set
|
|
||||||
$res = $conn->query('SELECT * FROM [products] ORDER BY product_id');
|
|
||||||
Assert::equal(array(
|
|
||||||
new DibiRow(array('product_id' => num(1), 'title' => 'Chair')),
|
|
||||||
new DibiRow(array('product_id' => num(2), 'title' => 'Table')),
|
|
||||||
new DibiRow(array('product_id' => num(3), 'title' => 'Computer')),
|
|
||||||
), $res->fetchAll());
|
|
||||||
|
|
||||||
|
|
||||||
// fetch complete result set like pairs key => value
|
|
||||||
$res = $conn->query('SELECT * FROM [products] ORDER BY product_id');
|
|
||||||
Assert::same(
|
|
||||||
array(1 => 'Chair', 'Table', 'Computer'),
|
|
||||||
$res->fetchPairs('product_id', 'title')
|
|
||||||
);
|
|
||||||
|
|
||||||
$res = $conn->query('SELECT * FROM [products] ORDER BY product_id');
|
|
||||||
Assert::same(
|
|
||||||
array(1 => 'Chair', 'Table', 'Computer'),
|
|
||||||
$res->fetchPairs()
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
// fetch row by row
|
|
||||||
$res = $conn->query('SELECT * FROM [products] ORDER BY product_id');
|
|
||||||
Assert::equal(array(
|
|
||||||
new DibiRow(array('product_id' => num(1), 'title' => 'Chair')),
|
|
||||||
new DibiRow(array('product_id' => num(2), 'title' => 'Table')),
|
|
||||||
new DibiRow(array('product_id' => num(3), 'title' => 'Computer')),
|
|
||||||
), iterator_to_array($res));
|
|
||||||
|
|
||||||
|
|
||||||
// fetch complete result set like association array
|
|
||||||
$res = $conn->query('SELECT * FROM [products] ORDER BY product_id');
|
|
||||||
Assert::equal(array(
|
|
||||||
'Chair' => new DibiRow(array('product_id' => num(1), 'title' => 'Chair')),
|
|
||||||
'Table' => new DibiRow(array('product_id' => num(2), 'title' => 'Table')),
|
|
||||||
'Computer' => new DibiRow(array('product_id' => num(3), 'title' => 'Computer')),
|
|
||||||
), $res->fetchAssoc('title'));
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// more complex association array
|
|
||||||
function query($conn) {
|
|
||||||
|
|
||||||
return $conn->query($conn->getConfig('system') === 'odbc' ? '
|
|
||||||
SELECT products.title, customers.name, orders.amount
|
|
||||||
FROM ([products]
|
|
||||||
INNER JOIN [orders] ON [products.product_id] = [orders.product_id])
|
|
||||||
INNER JOIN [customers] ON [orders.customer_id] = [customers.customer_id]
|
|
||||||
ORDER BY orders.order_id
|
|
||||||
' : '
|
|
||||||
SELECT products.title AS title, customers.name AS name, orders.amount AS amount
|
|
||||||
FROM [products]
|
|
||||||
INNER JOIN [orders] USING ([product_id])
|
|
||||||
INNER JOIN [customers] USING ([customer_id])
|
|
||||||
ORDER BY orders.order_id
|
|
||||||
');
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Assert::equal(array(
|
|
||||||
'Arnold Rimmer' => array(
|
|
||||||
'Chair' => new DibiRow(array('title' => 'Chair', 'name' => 'Arnold Rimmer', 'amount' => num(7.0))),
|
|
||||||
'Computer' => new DibiRow(array('title' => 'Computer', 'name' => 'Arnold Rimmer', 'amount' => num(2.0))),
|
|
||||||
),
|
|
||||||
'Dave Lister' => array(
|
|
||||||
'Table' => new DibiRow(array('title' => 'Table', 'name' => 'Dave Lister', 'amount' => num(3.0))),
|
|
||||||
),
|
|
||||||
'Kristine Kochanski' => array(
|
|
||||||
'Computer' => new DibiRow(array('title' => 'Computer', 'name' => 'Kristine Kochanski', 'amount' => num(5.0))),
|
|
||||||
),
|
|
||||||
), query($conn)->fetchAssoc('name,title'));
|
|
||||||
|
|
||||||
|
|
||||||
Assert::equal(array(
|
|
||||||
'Arnold Rimmer' => array(
|
|
||||||
array(
|
|
||||||
'Chair' => new DibiRow(array('title' => 'Chair', 'name' => 'Arnold Rimmer', 'amount' => num(7.0))),
|
|
||||||
),
|
|
||||||
array(
|
|
||||||
'Computer' => new DibiRow(array('title' => 'Computer', 'name' => 'Arnold Rimmer', 'amount' => num(2.0))),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
'Dave Lister' => array(
|
|
||||||
array(
|
|
||||||
'Table' => new DibiRow(array('title' => 'Table', 'name' => 'Dave Lister', 'amount' => num(3.0))),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
'Kristine Kochanski' => array(
|
|
||||||
array(
|
|
||||||
'Computer' => new DibiRow(array('title' => 'Computer', 'name' => 'Kristine Kochanski', 'amount' => num(5.0))),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
), query($conn)->fetchAssoc('name,#,title'));
|
|
||||||
|
|
||||||
|
|
||||||
Assert::equal(array(
|
|
||||||
'Arnold Rimmer' => array(
|
|
||||||
'title' => array(
|
|
||||||
'Chair' => new DibiRow(array('title' => 'Chair', 'name' => 'Arnold Rimmer', 'amount' => num(7.0))),
|
|
||||||
'Computer' => new DibiRow(array('title' => 'Computer', 'name' => 'Arnold Rimmer', 'amount' => num(2.0))),
|
|
||||||
),
|
|
||||||
'name' => 'Arnold Rimmer',
|
|
||||||
'amount' => num(7.0),
|
|
||||||
),
|
|
||||||
'Dave Lister' => array(
|
|
||||||
'title' => array(
|
|
||||||
'Table' => new DibiRow(array('title' => 'Table', 'name' => 'Dave Lister', 'amount' => num(3.0))),
|
|
||||||
),
|
|
||||||
'name' => 'Dave Lister',
|
|
||||||
'amount' => num(3.0),
|
|
||||||
),
|
|
||||||
'Kristine Kochanski' => array(
|
|
||||||
'title' => array(
|
|
||||||
'Computer' => new DibiRow(array('title' => 'Computer', 'name' => 'Kristine Kochanski', 'amount' => num(5.0))),
|
|
||||||
),
|
|
||||||
'name' => 'Kristine Kochanski',
|
|
||||||
'amount' => num(5.0),
|
|
||||||
),
|
|
||||||
), query($conn)->fetchAssoc('name,=,title'));
|
|
||||||
|
|
||||||
|
|
||||||
Assert::equal(array(
|
|
||||||
'Arnold Rimmer' => new DibiRow(array(
|
|
||||||
'title' => array(
|
|
||||||
'Chair' => new DibiRow(array('title' => 'Chair', 'name' => 'Arnold Rimmer', 'amount' => num(7.0))),
|
|
||||||
'Computer' => new DibiRow(array('title' => 'Computer', 'name' => 'Arnold Rimmer', 'amount' => num(2.0))),
|
|
||||||
),
|
|
||||||
'name' => 'Arnold Rimmer',
|
|
||||||
'amount' => num(7.0),
|
|
||||||
)),
|
|
||||||
'Dave Lister' => new DibiRow(array(
|
|
||||||
'title' => array(
|
|
||||||
'Table' => new DibiRow(array('title' => 'Table', 'name' => 'Dave Lister', 'amount' => num(3.0))),
|
|
||||||
),
|
|
||||||
'name' => 'Dave Lister',
|
|
||||||
'amount' => num(3.0),
|
|
||||||
)),
|
|
||||||
'Kristine Kochanski' => new DibiRow(array(
|
|
||||||
'title' => array(
|
|
||||||
'Computer' => new DibiRow(array('title' => 'Computer', 'name' => 'Kristine Kochanski', 'amount' => num(5.0))),
|
|
||||||
),
|
|
||||||
'name' => 'Kristine Kochanski',
|
|
||||||
'amount' => num(5.0),
|
|
||||||
)),
|
|
||||||
), query($conn)->fetchAssoc('name,@,title'));
|
|
||||||
|
|
||||||
|
|
||||||
Assert::equal(array(
|
|
||||||
new DibiRow(array('title' => 'Chair', 'name' => 'Arnold Rimmer', 'amount' => num(7.0))),
|
|
||||||
new DibiRow(array(
|
|
||||||
'title' => 'Computer', 'name' => 'Arnold Rimmer', 'amount' => num(2.0))),
|
|
||||||
new DibiRow(array(
|
|
||||||
'title' => 'Table', 'name' => 'Dave Lister', 'amount' => num(3.0))),
|
|
||||||
new DibiRow(array(
|
|
||||||
'title' => 'Computer', 'name' => 'Kristine Kochanski', 'amount' => num(5.0))),
|
|
||||||
), query($conn)->fetchAssoc('@,='));
|
|
||||||
|
|
||||||
|
|
||||||
Assert::equal(array(
|
|
||||||
'Arnold Rimmer' => array(
|
|
||||||
'title' => array(
|
|
||||||
'Chair' => new DibiRow(array('title' => 'Chair', 'name' => 'Arnold Rimmer', 'amount' => num(7.0))),
|
|
||||||
'Computer' => new DibiRow(array('title' => 'Computer', 'name' => 'Arnold Rimmer', 'amount' => num(2.0))),
|
|
||||||
),
|
|
||||||
'name' => 'Arnold Rimmer',
|
|
||||||
'amount' => num(7.0),
|
|
||||||
),
|
|
||||||
'Dave Lister' => array(
|
|
||||||
'title' => array(
|
|
||||||
'Table' => new DibiRow(array('title' => 'Table', 'name' => 'Dave Lister', 'amount' => num(3.0))),
|
|
||||||
),
|
|
||||||
'name' => 'Dave Lister',
|
|
||||||
'amount' => num(3.0),
|
|
||||||
),
|
|
||||||
'Kristine Kochanski' => array(
|
|
||||||
'title' => array(
|
|
||||||
'Computer' => new DibiRow(array('title' => 'Computer', 'name' => 'Kristine Kochanski', 'amount' => num(5.0))),
|
|
||||||
),
|
|
||||||
'name' => 'Kristine Kochanski',
|
|
||||||
'amount' => num(5.0),
|
|
||||||
),
|
|
||||||
), query($conn)->fetchAssoc('name,=,title,@'));
|
|
||||||
|
|
||||||
|
|
||||||
// old syntax
|
|
||||||
Assert::equal(array(
|
|
||||||
'Arnold Rimmer' => array(
|
|
||||||
'Chair' => new DibiRow(array('title' => 'Chair', 'name' => 'Arnold Rimmer', 'amount' => num(7.0))),
|
|
||||||
'Computer' => new DibiRow(array('title' => 'Computer', 'name' => 'Arnold Rimmer', 'amount' => num(2.0))),
|
|
||||||
),
|
|
||||||
'Dave Lister' => array(
|
|
||||||
'Table' => new DibiRow(array('title' => 'Table', 'name' => 'Dave Lister', 'amount' => num(3.0))),
|
|
||||||
),
|
|
||||||
'Kristine Kochanski' => array(
|
|
||||||
'Computer' => new DibiRow(array('title' => 'Computer', 'name' => 'Kristine Kochanski', 'amount' => num(5.0))),
|
|
||||||
),
|
|
||||||
), query($conn)->fetchAssoc('name|title'));
|
|
||||||
|
|
||||||
|
|
||||||
Assert::equal(array(
|
|
||||||
'Arnold Rimmer' => array(
|
|
||||||
array(
|
|
||||||
'Chair' => new DibiRow(array('title' => 'Chair', 'name' => 'Arnold Rimmer', 'amount' => num(7.0))),
|
|
||||||
),
|
|
||||||
array(
|
|
||||||
'Computer' => new DibiRow(array('title' => 'Computer', 'name' => 'Arnold Rimmer', 'amount' => num(2.0))),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
'Dave Lister' => array(
|
|
||||||
array(
|
|
||||||
'Table' => new DibiRow(array('title' => 'Table', 'name' => 'Dave Lister', 'amount' => num(3.0))),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
'Kristine Kochanski' => array(
|
|
||||||
array(
|
|
||||||
'Computer' => new DibiRow(array('title' => 'Computer', 'name' => 'Kristine Kochanski', 'amount' => num(5.0))),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
), query($conn)->fetchAssoc('name[]title'));
|
|
||||||
|
|
||||||
|
|
||||||
Assert::equal(array(
|
|
||||||
'Arnold Rimmer' => new DibiRow(array(
|
|
||||||
'title' => array(
|
|
||||||
'Chair' => new DibiRow(array('title' => 'Chair', 'name' => 'Arnold Rimmer', 'amount' => num(7.0))),
|
|
||||||
'Computer' => new DibiRow(array('title' => 'Computer', 'name' => 'Arnold Rimmer', 'amount' => num(2.0))),
|
|
||||||
),
|
|
||||||
'name' => 'Arnold Rimmer',
|
|
||||||
'amount' => num(7.0),
|
|
||||||
)),
|
|
||||||
'Dave Lister' => new DibiRow(array(
|
|
||||||
'title' => array(
|
|
||||||
'Table' => new DibiRow(array('title' => 'Table', 'name' => 'Dave Lister', 'amount' => num(3.0))),
|
|
||||||
),
|
|
||||||
'name' => 'Dave Lister',
|
|
||||||
'amount' => num(3.0),
|
|
||||||
)),
|
|
||||||
'Kristine Kochanski' => new DibiRow(array(
|
|
||||||
'title' => array(
|
|
||||||
'Computer' => new DibiRow(array('title' => 'Computer', 'name' => 'Kristine Kochanski', 'amount' => num(5.0))),
|
|
||||||
),
|
|
||||||
'name' => 'Kristine Kochanski',
|
|
||||||
'amount' => num(5.0),
|
|
||||||
)),
|
|
||||||
), query($conn)->fetchAssoc('name->title'));
|
|
||||||
|
|
||||||
|
|
||||||
Assert::equal(array(
|
|
||||||
'Arnold Rimmer' => new DibiRow(array(
|
|
||||||
'title' => array('Chair' => 'Arnold Rimmer', 'Computer' => 'Arnold Rimmer'),
|
|
||||||
'name' => 'Arnold Rimmer',
|
|
||||||
'amount' => num(7.0),
|
|
||||||
)),
|
|
||||||
'Dave Lister' => new DibiRow(array(
|
|
||||||
'title' => array('Table' => 'Dave Lister'),
|
|
||||||
'name' => 'Dave Lister',
|
|
||||||
'amount' => num(3.0),
|
|
||||||
)),
|
|
||||||
'Kristine Kochanski' => new DibiRow(array(
|
|
||||||
'title' => array('Computer' => 'Kristine Kochanski'),
|
|
||||||
'name' => 'Kristine Kochanski',
|
|
||||||
'amount' => num(5.0),
|
|
||||||
)),
|
|
||||||
), query($conn)->fetchAssoc('name->title=name'));
|
|
||||||
|
|
||||||
|
|
||||||
Assert::equal(array(
|
|
||||||
new DibiRow(array('title' => 'Chair', 'name' => 'Arnold Rimmer', 'amount' => num(7.0))),
|
|
||||||
new DibiRow(array('title' => 'Computer', 'name' => 'Arnold Rimmer', 'amount' => num(2.0))),
|
|
||||||
new DibiRow(array('title' => 'Table', 'name' => 'Dave Lister', 'amount' => num(3.0))),
|
|
||||||
new DibiRow(array('title' => 'Computer', 'name' => 'Kristine Kochanski', 'amount' => num(5.0))),
|
|
||||||
), query($conn)->fetchAssoc('[]'));
|
|
||||||
|
|
||||||
|
|
||||||
Assert::equal(array(
|
|
||||||
'Arnold Rimmer' => new DibiRow(array(
|
|
||||||
'title' => array(
|
|
||||||
'Chair' => new DibiRow(array('title' => 'Chair', 'name' => 'Arnold Rimmer', 'amount' => num(7.0))),
|
|
||||||
'Computer' => new DibiRow(array('title' => 'Computer', 'name' => 'Arnold Rimmer', 'amount' => num(2.0))),
|
|
||||||
),
|
|
||||||
'name' => 'Arnold Rimmer',
|
|
||||||
'amount' => num(7.0),
|
|
||||||
)),
|
|
||||||
'Dave Lister' => new DibiRow(array(
|
|
||||||
'title' => array(
|
|
||||||
'Table' => new DibiRow(array('title' => 'Table', 'name' => 'Dave Lister', 'amount' => num(3.0))),
|
|
||||||
),
|
|
||||||
'name' => 'Dave Lister',
|
|
||||||
'amount' => num(3.0),
|
|
||||||
)),
|
|
||||||
'Kristine Kochanski' => new DibiRow(array(
|
|
||||||
'title' => array(
|
|
||||||
'Computer' => new DibiRow(array('title' => 'Computer', 'name' => 'Kristine Kochanski', 'amount' => num(5.0))),
|
|
||||||
),
|
|
||||||
'name' => 'Kristine Kochanski',
|
|
||||||
'amount' => num(5.0),
|
|
||||||
)),
|
|
||||||
), query($conn)->fetchAssoc('name->title->'));
|
|
@@ -1,56 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
use Tester\Assert;
|
|
||||||
|
|
||||||
require __DIR__ . '/bootstrap.php';
|
|
||||||
|
|
||||||
|
|
||||||
$conn = new DibiConnection($config);
|
|
||||||
|
|
||||||
// create new substitution :blog: ==> wp_
|
|
||||||
$conn->getSubstitutes()->blog = 'wp_';
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat('UPDATE wp_items SET [val]=1'),
|
|
||||||
$conn->translate('UPDATE :blog:items SET [val]=1')
|
|
||||||
);
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat('UPDATE [wp_items] SET [val]=1'),
|
|
||||||
$conn->translate('UPDATE [:blog:items] SET [val]=1')
|
|
||||||
);
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat("UPDATE 'wp_' SET [val]=1"),
|
|
||||||
$conn->translate('UPDATE :blog: SET [val]=1')
|
|
||||||
);
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat("UPDATE ':blg:' SET [val]=1"),
|
|
||||||
$conn->translate('UPDATE :blg: SET [val]=1')
|
|
||||||
);
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat("UPDATE table SET [text]=':blog:a'"),
|
|
||||||
$conn->translate("UPDATE table SET [text]=':blog:a'")
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
// create new substitution :: (empty) ==> my_
|
|
||||||
$conn->getSubstitutes()->{''} = 'my_';
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat('UPDATE my_table SET [val]=1'),
|
|
||||||
$conn->translate('UPDATE ::table SET [val]=1')
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
// create substitutions using fallback callback
|
|
||||||
$conn->getSubstitutes()->setCallback(function ($expr) {
|
|
||||||
return '_' . $expr . '_';
|
|
||||||
});
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat('UPDATE _account_user SET [val]=1'),
|
|
||||||
$conn->translate('UPDATE :account:user SET [val]=1')
|
|
||||||
);
|
|
@@ -1,48 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @dataProvider ../databases.ini
|
|
||||||
*/
|
|
||||||
|
|
||||||
use Tester\Assert;
|
|
||||||
|
|
||||||
require __DIR__ . '/bootstrap.php';
|
|
||||||
|
|
||||||
|
|
||||||
$conn = new DibiConnection($config);
|
|
||||||
$conn->loadFile(__DIR__ . "/data/$config[system].sql");
|
|
||||||
|
|
||||||
|
|
||||||
/*Assert::exception(function () use ($conn) {
|
|
||||||
$conn->rollback();
|
|
||||||
}, 'DibiException');
|
|
||||||
|
|
||||||
Assert::exception(function () use ($conn) {
|
|
||||||
$conn->commit();
|
|
||||||
}, 'DibiException');
|
|
||||||
|
|
||||||
$conn->begin();
|
|
||||||
Assert::exception(function () use ($conn) {
|
|
||||||
$conn->begin();
|
|
||||||
}, 'DibiException');
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
$conn->begin();
|
|
||||||
Assert::same(3, (int) $conn->query('SELECT COUNT(*) FROM [products]')->fetchSingle());
|
|
||||||
$conn->query('INSERT INTO [products]', array(
|
|
||||||
'title' => 'Test product',
|
|
||||||
));
|
|
||||||
Assert::same(4, (int) $conn->query('SELECT COUNT(*) FROM [products]')->fetchSingle());
|
|
||||||
$conn->rollback();
|
|
||||||
Assert::same(3, (int) $conn->query('SELECT COUNT(*) FROM [products]')->fetchSingle());
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
$conn->begin();
|
|
||||||
$conn->query('INSERT INTO [products]', array(
|
|
||||||
'title' => 'Test product',
|
|
||||||
));
|
|
||||||
$conn->commit();
|
|
||||||
Assert::same(4, (int) $conn->query('SELECT COUNT(*) FROM [products]')->fetchSingle());
|
|
@@ -1,35 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
use Tester\Assert;
|
|
||||||
|
|
||||||
require __DIR__ . '/bootstrap.php';
|
|
||||||
|
|
||||||
|
|
||||||
$conn = new DibiConnection($config);
|
|
||||||
|
|
||||||
$fluent = new DibiFluent($conn);
|
|
||||||
$fluent->select('*')->from('table')->where('x=1');
|
|
||||||
$dolly = clone $fluent;
|
|
||||||
$dolly->where('y=1');
|
|
||||||
$dolly->clause('FOO');
|
|
||||||
|
|
||||||
Assert::same(reformat('SELECT * FROM [table] WHERE x=1'), (string) $fluent);
|
|
||||||
Assert::same(reformat('SELECT * FROM [table] WHERE x=1 AND y=1 FOO'), (string) $dolly);
|
|
||||||
|
|
||||||
|
|
||||||
$fluent = new DibiFluent($conn);
|
|
||||||
$fluent->select('id')->from('table')->where('id = %i', 1);
|
|
||||||
$dolly = clone $fluent;
|
|
||||||
$dolly->where('cd = %i', 5);
|
|
||||||
|
|
||||||
Assert::same(reformat('SELECT [id] FROM [table] WHERE id = 1'), (string) $fluent);
|
|
||||||
Assert::same(reformat('SELECT [id] FROM [table] WHERE id = 1 AND cd = 5'), (string) $dolly);
|
|
||||||
|
|
||||||
|
|
||||||
$fluent = new DibiFluent($conn);
|
|
||||||
$fluent->select('*')->from('table');
|
|
||||||
$dolly = clone $fluent;
|
|
||||||
$dolly->removeClause('select')->select('count(*)');
|
|
||||||
|
|
||||||
Assert::same(reformat('SELECT * FROM [table]'), (string) $fluent);
|
|
||||||
Assert::same(reformat('SELECT count(*) FROM [table]'), (string) $dolly);
|
|
@@ -1,45 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
use Tester\Assert;
|
|
||||||
|
|
||||||
require __DIR__ . '/bootstrap.php';
|
|
||||||
|
|
||||||
|
|
||||||
$conn = new DibiConnection($config);
|
|
||||||
|
|
||||||
|
|
||||||
$fluent = $conn->delete('table')->as('bAlias')
|
|
||||||
->setFlag('IGNORE');
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat('DELETE IGNORE FROM [table] AS [bAlias]'),
|
|
||||||
(string) $fluent
|
|
||||||
);
|
|
||||||
|
|
||||||
$fluent->removeClause('from')->from('anotherTable');
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat('DELETE IGNORE FROM [anotherTable]'),
|
|
||||||
(string) $fluent
|
|
||||||
);
|
|
||||||
|
|
||||||
$fluent->using('thirdTable');
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat('DELETE IGNORE FROM [anotherTable] USING [thirdTable]'),
|
|
||||||
(string) $fluent
|
|
||||||
);
|
|
||||||
|
|
||||||
$fluent->setFlag('IGNORE', FALSE);
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat('DELETE FROM [anotherTable] USING [thirdTable]'),
|
|
||||||
(string) $fluent
|
|
||||||
);
|
|
||||||
|
|
||||||
$fluent->limit(10);
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat('DELETE FROM [anotherTable] USING [thirdTable] LIMIT 10'),
|
|
||||||
(string) $fluent
|
|
||||||
);
|
|
@@ -1,98 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @dataProvider? ../databases.ini mysql
|
|
||||||
*/
|
|
||||||
|
|
||||||
use Tester\Assert;
|
|
||||||
|
|
||||||
require __DIR__ . '/bootstrap.php';
|
|
||||||
|
|
||||||
$conn = new DibiConnection($config);
|
|
||||||
$conn->loadFile(__DIR__ . "/data/$config[system].sql");
|
|
||||||
|
|
||||||
|
|
||||||
// fetch & limit
|
|
||||||
$fluent = $conn->select('*')
|
|
||||||
->from('customers')
|
|
||||||
->limit(1)
|
|
||||||
->offset(3)
|
|
||||||
->orderBy('customer_id');
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat('SELECT * FROM [customers] ORDER BY [customer_id] LIMIT 1 OFFSET 3'),
|
|
||||||
(string) $fluent
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
$fluent->fetch();
|
|
||||||
Assert::same(
|
|
||||||
reformat('SELECT * FROM [customers] ORDER BY [customer_id] LIMIT 1 OFFSET 3'),
|
|
||||||
dibi::$sql
|
|
||||||
);
|
|
||||||
$fluent->fetchSingle();
|
|
||||||
Assert::same(
|
|
||||||
reformat('SELECT * FROM [customers] ORDER BY [customer_id] LIMIT 1 OFFSET 3'),
|
|
||||||
dibi::$sql
|
|
||||||
);
|
|
||||||
Assert::same(
|
|
||||||
reformat('SELECT * FROM [customers] ORDER BY [customer_id] LIMIT 1 OFFSET 3'),
|
|
||||||
(string) $fluent
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
$fluent->limit(0);
|
|
||||||
$fluent->fetch();
|
|
||||||
Assert::same(
|
|
||||||
reformat('SELECT * FROM [customers] ORDER BY [customer_id] LIMIT 0 OFFSET 3'),
|
|
||||||
dibi::$sql
|
|
||||||
);
|
|
||||||
$fluent->fetchSingle();
|
|
||||||
Assert::same(
|
|
||||||
reformat('SELECT * FROM [customers] ORDER BY [customer_id] LIMIT 0 OFFSET 3'),
|
|
||||||
dibi::$sql
|
|
||||||
);
|
|
||||||
Assert::same(
|
|
||||||
reformat('SELECT * FROM [customers] ORDER BY [customer_id] LIMIT 0 OFFSET 3'),
|
|
||||||
(string) $fluent
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
$fluent->removeClause('limit');
|
|
||||||
try {
|
|
||||||
$fluent->fetch();
|
|
||||||
} catch (DibiException $e) {
|
|
||||||
}
|
|
||||||
Assert::same(
|
|
||||||
reformat('SELECT * FROM [customers] ORDER BY [customer_id] OFFSET 3'),
|
|
||||||
dibi::$sql
|
|
||||||
);
|
|
||||||
try {
|
|
||||||
$fluent->fetchSingle();
|
|
||||||
} catch (DibiException $e) {
|
|
||||||
}
|
|
||||||
Assert::same(
|
|
||||||
reformat('SELECT * FROM [customers] ORDER BY [customer_id] OFFSET 3'),
|
|
||||||
dibi::$sql
|
|
||||||
);
|
|
||||||
Assert::same(
|
|
||||||
reformat('SELECT * FROM [customers] ORDER BY [customer_id] OFFSET 3'),
|
|
||||||
(string) $fluent
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
$fluent->removeClause('offset');
|
|
||||||
$fluent->fetch();
|
|
||||||
Assert::same(
|
|
||||||
reformat(' SELECT * FROM [customers] ORDER BY [customer_id] LIMIT 1'),
|
|
||||||
dibi::$sql
|
|
||||||
);
|
|
||||||
$fluent->fetchSingle();
|
|
||||||
Assert::same(
|
|
||||||
reformat(' SELECT * FROM [customers] ORDER BY [customer_id] LIMIT 1'),
|
|
||||||
dibi::$sql
|
|
||||||
);
|
|
||||||
Assert::same(
|
|
||||||
reformat('SELECT * FROM [customers] ORDER BY [customer_id]'),
|
|
||||||
(string) $fluent
|
|
||||||
);
|
|
@@ -1,49 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @dataProvider ../databases.ini
|
|
||||||
*/
|
|
||||||
|
|
||||||
use Tester\Assert;
|
|
||||||
|
|
||||||
require __DIR__ . '/bootstrap.php';
|
|
||||||
|
|
||||||
$conn = new DibiConnection($config);
|
|
||||||
$conn->loadFile(__DIR__ . "/data/$config[system].sql");
|
|
||||||
|
|
||||||
|
|
||||||
// fetch a single value
|
|
||||||
$res = $conn->select('title')->from('products')->orderBy('product_id');
|
|
||||||
Assert::equal('Chair', $res->fetchSingle());
|
|
||||||
|
|
||||||
|
|
||||||
// fetch complete result set
|
|
||||||
$res = $conn->select('*')->from('products')->orderBy('product_id');
|
|
||||||
Assert::equal(array(
|
|
||||||
new DibiRow(array('product_id' => num(1), 'title' => 'Chair')),
|
|
||||||
new DibiRow(array('product_id' => num(2), 'title' => 'Table')),
|
|
||||||
new DibiRow(array('product_id' => num(3), 'title' => 'Computer')),
|
|
||||||
), $res->fetchAll());
|
|
||||||
|
|
||||||
|
|
||||||
// more complex association array
|
|
||||||
if ($config['system'] !== 'odbc') {
|
|
||||||
$res = $conn->select(array('products.title' => 'title', 'customers.name' => 'name'))->select('orders.amount')->as('amount')
|
|
||||||
->from('products')
|
|
||||||
->innerJoin('orders')->using('(product_id)')
|
|
||||||
->innerJoin('customers')->using('([customer_id])')
|
|
||||||
->orderBy('order_id');
|
|
||||||
|
|
||||||
Assert::equal(array(
|
|
||||||
'Arnold Rimmer' => array(
|
|
||||||
'Chair' => new DibiRow(array('title' => 'Chair', 'name' => 'Arnold Rimmer', 'amount' => num(7.0))),
|
|
||||||
'Computer' => new DibiRow(array('title' => 'Computer', 'name' => 'Arnold Rimmer', 'amount' => num(2.0))),
|
|
||||||
),
|
|
||||||
'Dave Lister' => array(
|
|
||||||
'Table' => new DibiRow(array('title' => 'Table', 'name' => 'Dave Lister', 'amount' => num(3.0))),
|
|
||||||
),
|
|
||||||
'Kristine Kochanski' => array(
|
|
||||||
'Computer' => new DibiRow(array('title' => 'Computer', 'name' => 'Kristine Kochanski', 'amount' => num(5.0))),
|
|
||||||
),
|
|
||||||
), $res->fetchAssoc('name,title'));
|
|
||||||
}
|
|
@@ -1,58 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
use Tester\Assert;
|
|
||||||
|
|
||||||
require __DIR__ . '/bootstrap.php';
|
|
||||||
|
|
||||||
|
|
||||||
$conn = new DibiConnection($config);
|
|
||||||
|
|
||||||
|
|
||||||
$arr = array(
|
|
||||||
'title' => 'Super Product',
|
|
||||||
'price' => 12,
|
|
||||||
'brand' => NULL,
|
|
||||||
);
|
|
||||||
|
|
||||||
$fluent = $conn->insert('table', $arr)
|
|
||||||
->setFlag('IGNORE')->setFlag('DELAYED');
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat('INSERT IGNORE DELAYED INTO [table] ([title], [price], [brand]) VALUES (\'Super Product\', 12, NULL)'),
|
|
||||||
(string) $fluent
|
|
||||||
);
|
|
||||||
|
|
||||||
$fluent->setFlag('IGNORE', FALSE);
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat('INSERT DELAYED INTO [table] ([title], [price], [brand]) VALUES (\'Super Product\', 12, NULL)'),
|
|
||||||
(string) $fluent
|
|
||||||
);
|
|
||||||
|
|
||||||
$fluent->setFlag('HIGH_priority');
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat('INSERT DELAYED HIGH_PRIORITY INTO [table] ([title], [price], [brand]) VALUES (\'Super Product\', 12, NULL)'),
|
|
||||||
(string) $fluent
|
|
||||||
);
|
|
||||||
|
|
||||||
$fluent->into('anotherTable');
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat('INSERT DELAYED HIGH_PRIORITY INTO [anotherTable] VALUES (\'Super Product\', 12, NULL)'),
|
|
||||||
(string) $fluent
|
|
||||||
);
|
|
||||||
|
|
||||||
$fluent->values('%l', $arr);
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat('INSERT DELAYED HIGH_PRIORITY INTO [anotherTable] VALUES (\'Super Product\', 12, NULL) , (\'Super Product\', 12, NULL)'),
|
|
||||||
(string) $fluent
|
|
||||||
);
|
|
||||||
|
|
||||||
$fluent->values($arr);
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat('INSERT DELAYED HIGH_PRIORITY INTO [anotherTable] VALUES (\'Super Product\', 12, NULL) , (\'Super Product\', 12, NULL) , (\'Super Product\', 12, NULL)'),
|
|
||||||
(string) $fluent
|
|
||||||
);
|
|
@@ -1,142 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @dataProvider ../databases.ini
|
|
||||||
*/
|
|
||||||
|
|
||||||
use Tester\Assert;
|
|
||||||
|
|
||||||
require __DIR__ . '/bootstrap.php';
|
|
||||||
|
|
||||||
|
|
||||||
$conn = new DibiConnection($config);
|
|
||||||
|
|
||||||
|
|
||||||
$max = 10;
|
|
||||||
$min = 5;
|
|
||||||
|
|
||||||
$fluent = $conn->select('*')
|
|
||||||
->select('a')
|
|
||||||
->select('b')->as('bAlias')
|
|
||||||
->select(array('c', 'd', 'e'))
|
|
||||||
->select('%n', 'd');
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat('SELECT * , [a] , [b] AS [bAlias] , [c], [d], [e] , [d]'),
|
|
||||||
(string) $fluent
|
|
||||||
);
|
|
||||||
|
|
||||||
$fluent->from('table')->as('tableAlias')
|
|
||||||
->innerJoin('table1')->on('table.col = table1.col')
|
|
||||||
->innerJoin('table2')->on('table.col = table2.col');
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat('SELECT * , [a] , [b] AS [bAlias] , [c], [d], [e] , [d] FROM [table] AS [tableAlias] INNER JOIN [table1] ON table.col = table1.col INNER JOIN [table2] ON table.col = table2.col'),
|
|
||||||
(string) $fluent
|
|
||||||
);
|
|
||||||
|
|
||||||
$fluent->from('anotherTable');
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat('SELECT * , [a] , [b] AS [bAlias] , [c], [d], [e] , [d] FROM [table] AS [tableAlias] INNER JOIN [table1] ON table.col = table1.col INNER JOIN [table2] ON table.col = table2.col , [anotherTable]'),
|
|
||||||
(string) $fluent
|
|
||||||
);
|
|
||||||
|
|
||||||
$fluent->removeClause('from')->from('anotherTable');
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat('SELECT * , [a] , [b] AS [bAlias] , [c], [d], [e] , [d] FROM [anotherTable]'),
|
|
||||||
(string) $fluent
|
|
||||||
);
|
|
||||||
|
|
||||||
$fluent->as('anotherAlias')
|
|
||||||
->clause('from')
|
|
||||||
->innerJoin('table3')
|
|
||||||
->on('table.col = table3.col');
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat('SELECT * , [a] , [b] AS [bAlias] , [c], [d], [e] , [d] FROM [anotherTable] AS [anotherAlias] INNER JOIN [table3] ON table.col = table3.col'),
|
|
||||||
(string) $fluent
|
|
||||||
);
|
|
||||||
|
|
||||||
$fluent->where('col > %i', $max)
|
|
||||||
->or('col < %i', $min)
|
|
||||||
->where('active = 1')
|
|
||||||
->where('col')->in(array(1, 2, 3))
|
|
||||||
->orderBy('val')->asc()
|
|
||||||
->orderBy('[val2] DESC')
|
|
||||||
->orderBy(array('val3' => -1));
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat('SELECT * , [a] , [b] AS [bAlias] , [c], [d], [e] , [d] FROM [anotherTable] AS [anotherAlias] INNER JOIN [table3] ON table.col = table3.col WHERE col > 10 OR col < 5 AND active = 1 AND [col] IN (1, 2, 3) ORDER BY [val] ASC , [val2] DESC , [val3] DESC'),
|
|
||||||
(string) $fluent
|
|
||||||
);
|
|
||||||
|
|
||||||
$fluent->orderBy(DibiFluent::REMOVE);
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat('SELECT * , [a] , [b] AS [bAlias] , [c], [d], [e] , [d] FROM [anotherTable] AS [anotherAlias] INNER JOIN [table3] ON table.col = table3.col WHERE col > 10 OR col < 5 AND active = 1 AND [col] IN (1, 2, 3)'),
|
|
||||||
(string) $fluent
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
$fluent = $conn->select('*')
|
|
||||||
->select(
|
|
||||||
$conn->select('count(*)')
|
|
||||||
->from('precteni')->as('P')
|
|
||||||
->where('P.id_clanku', '=', 'C.id_clanku')
|
|
||||||
)
|
|
||||||
->from('clanky')->as('C')
|
|
||||||
->where('id_clanku=%i', 123)
|
|
||||||
->limit(1)
|
|
||||||
->offset(0);
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat('SELECT * , (SELECT count(*) FROM [precteni] AS [P] WHERE P.id_clanku = C.id_clanku) FROM [clanky] AS [C] WHERE id_clanku=123 LIMIT 1 OFFSET 0'),
|
|
||||||
(string) $fluent
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
$fluent = $conn->select('*')
|
|
||||||
->select(array('x' => 'xAlias'))
|
|
||||||
->from('products')
|
|
||||||
->innerJoin('orders')->using('(product_id)')
|
|
||||||
->innerJoin('customers')->using('([customer_id])')
|
|
||||||
->innerJoin('items')->using('(%n)', array('customer_id', 'order_id'));
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat('SELECT * , [x] AS [xAlias] FROM [products] INNER JOIN [orders] USING (product_id) INNER JOIN [customers] USING ([customer_id]) INNER JOIN [items] USING ([customer_id], [order_id])'),
|
|
||||||
(string) $fluent
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
$fluent = $conn->command()->select()
|
|
||||||
->from('products')
|
|
||||||
->select('*')
|
|
||||||
->innerJoin('orders')->using('(product_id)');
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat('SELECT * FROM [products] INNER JOIN [orders] USING (product_id)'),
|
|
||||||
(string) $fluent
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
$fluent = $conn->select('*')
|
|
||||||
->from(array('me' => 't'))
|
|
||||||
->where('col > %i', $max)
|
|
||||||
->where(array('x' => 'a', 'b', 'c'));
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat('SELECT * FROM [me] AS [t] WHERE col > 10 AND ([x] = \'a\') AND (b) AND (c)'),
|
|
||||||
(string) $fluent
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
$fluent = $conn->select('*')->from('abc')
|
|
||||||
->where('x IN (%SQL)', $conn->select('id')->from('xyz'));
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat('SELECT * FROM [abc] WHERE x IN ((SELECT [id] FROM [xyz]))'),
|
|
||||||
(string) $fluent
|
|
||||||
);
|
|
@@ -1,30 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
use Tester\Assert;
|
|
||||||
|
|
||||||
require __DIR__ . '/bootstrap.php';
|
|
||||||
|
|
||||||
|
|
||||||
$conn = new DibiConnection($config);
|
|
||||||
|
|
||||||
|
|
||||||
$arr = array(
|
|
||||||
'title' => 'Super Product',
|
|
||||||
'price' => 12,
|
|
||||||
'brand' => NULL,
|
|
||||||
);
|
|
||||||
|
|
||||||
$fluent = $conn->update('table', $arr)
|
|
||||||
->setFlag('IGNORE')->setFlag('DELAYED');
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat('UPDATE IGNORE DELAYED [table] SET [title]=\'Super Product\', [price]=12, [brand]=NULL'),
|
|
||||||
(string) $fluent
|
|
||||||
);
|
|
||||||
|
|
||||||
$fluent->set(array('another' => 123));
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat('UPDATE IGNORE DELAYED [table] SET [title]=\'Super Product\', [price]=12, [brand]=NULL , [another]=123'),
|
|
||||||
(string) $fluent
|
|
||||||
);
|
|
@@ -1,56 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @dataProvider ../databases.ini !=odbc
|
|
||||||
*/
|
|
||||||
|
|
||||||
use Tester\Assert;
|
|
||||||
|
|
||||||
require __DIR__ . '/bootstrap.php';
|
|
||||||
|
|
||||||
$conn = new DibiConnection($config);
|
|
||||||
$conn->loadFile(__DIR__ . "/data/$config[system].sql");
|
|
||||||
|
|
||||||
$info = $conn->query('
|
|
||||||
SELECT products.product_id, orders.order_id, customers.name, products.product_id + 1 AS [xXx]
|
|
||||||
FROM products
|
|
||||||
INNER JOIN orders USING (product_id)
|
|
||||||
INNER JOIN customers USING (customer_id)
|
|
||||||
')->getInfo();
|
|
||||||
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
array('product_id', 'order_id', 'name', 'xXx'),
|
|
||||||
$info->getColumnNames()
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
if ($config['driver'] !== 'sqlite3' && $config['driver'] !== 'pdo') {
|
|
||||||
Assert::same(
|
|
||||||
array('products.product_id', 'orders.order_id', 'customers.name', 'xXx'),
|
|
||||||
$info->getColumnNames(TRUE)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
$columns = $info->getColumns();
|
|
||||||
|
|
||||||
Assert::same('product_id', $columns[0]->name);
|
|
||||||
if ($config['driver'] !== 'sqlite3' && $config['driver'] !== 'pdo') {
|
|
||||||
Assert::same('products', $columns[0]->tableName);
|
|
||||||
}
|
|
||||||
Assert::null($columns[0]->getVendorInfo('xxx'));
|
|
||||||
if ($config['system'] !== 'sqlite') {
|
|
||||||
Assert::same('i', $columns[0]->type);
|
|
||||||
}
|
|
||||||
Assert::null($columns[0]->nullable);
|
|
||||||
|
|
||||||
Assert::same('xXx', $columns[3]->name);
|
|
||||||
Assert::null($columns[3]->tableName);
|
|
||||||
if ($config['system'] !== 'sqlite') {
|
|
||||||
Assert::same('i', $columns[0]->type);
|
|
||||||
}
|
|
||||||
Assert::null($columns[3]->nullable);
|
|
||||||
|
|
||||||
Assert::same('xXx', $info->getColumn('xxx')->getName());
|
|
||||||
Assert::same('xXx', $info->getColumn('xXx')->getName());
|
|
@@ -1,130 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
use Tester\Assert;
|
|
||||||
|
|
||||||
require __DIR__ . '/bootstrap.php';
|
|
||||||
|
|
||||||
|
|
||||||
class MockResult extends DibiResult
|
|
||||||
{
|
|
||||||
function __construct()
|
|
||||||
{}
|
|
||||||
|
|
||||||
function test($row)
|
|
||||||
{
|
|
||||||
$normalize = new ReflectionMethod('DibiResult', 'normalize');
|
|
||||||
$normalize->setAccessible(TRUE);
|
|
||||||
$normalize->invokeArgs($this, array(& $row));
|
|
||||||
return $row;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
test(function () {
|
|
||||||
$result = new MockResult;
|
|
||||||
$result->setType('col', dibi::BOOL);
|
|
||||||
|
|
||||||
Assert::same(array('col' => NULL), $result->test(array('col' => NULL)));
|
|
||||||
Assert::same(array('col' => TRUE), $result->test(array('col' => TRUE)));
|
|
||||||
Assert::same(array('col' => FALSE), $result->test(array('col' => FALSE)));
|
|
||||||
|
|
||||||
Assert::same(array('col' => FALSE), $result->test(array('col' => '')));
|
|
||||||
Assert::same(array('col' => FALSE), $result->test(array('col' => '0')));
|
|
||||||
Assert::same(array('col' => TRUE), $result->test(array('col' => '1')));
|
|
||||||
Assert::same(array('col' => TRUE), $result->test(array('col' => 't')));
|
|
||||||
Assert::same(array('col' => FALSE), $result->test(array('col' => 'f')));
|
|
||||||
Assert::same(array('col' => TRUE), $result->test(array('col' => 'T')));
|
|
||||||
Assert::same(array('col' => FALSE), $result->test(array('col' => 'F')));
|
|
||||||
Assert::same(array('col' => FALSE), $result->test(array('col' => 0)));
|
|
||||||
Assert::same(array('col' => FALSE), $result->test(array('col' => 0.0)));
|
|
||||||
Assert::same(array('col' => TRUE), $result->test(array('col' => 1)));
|
|
||||||
Assert::same(array('col' => TRUE), $result->test(array('col' => 1.0)));
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
test(function () {
|
|
||||||
$result = new MockResult;
|
|
||||||
$result->setType('col', dibi::TEXT); // means TEXT or UNKNOWN
|
|
||||||
|
|
||||||
Assert::same(array('col' => NULL), $result->test(array('col' => NULL)));
|
|
||||||
Assert::same(array('col' => TRUE), $result->test(array('col' => TRUE)));
|
|
||||||
Assert::same(array('col' => FALSE), $result->test(array('col' => FALSE)));
|
|
||||||
|
|
||||||
Assert::same(array('col' => ''), $result->test(array('col' => '')));
|
|
||||||
Assert::same(array('col' => '0'), $result->test(array('col' => '0')));
|
|
||||||
Assert::same(array('col' => '1'), $result->test(array('col' => '1')));
|
|
||||||
Assert::same(array('col' => 0), $result->test(array('col' => 0)));
|
|
||||||
Assert::same(array('col' => 1), $result->test(array('col' => 1)));
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
test(function () {
|
|
||||||
$result = new MockResult;
|
|
||||||
$result->setType('col', dibi::FLOAT);
|
|
||||||
|
|
||||||
Assert::same(array('col' => NULL), $result->test(array('col' => NULL)));
|
|
||||||
Assert::same(array('col' => 1.0), $result->test(array('col' => TRUE)));
|
|
||||||
Assert::same(array('col' => 0.0), $result->test(array('col' => FALSE)));
|
|
||||||
|
|
||||||
Assert::same(array('col' => 0.0), $result->test(array('col' => '')));
|
|
||||||
Assert::same(array('col' => 0.0), $result->test(array('col' => '0')));
|
|
||||||
Assert::same(array('col' => 1.0), $result->test(array('col' => '1')));
|
|
||||||
Assert::same(array('col' => 0.0), $result->test(array('col' => '.0')));
|
|
||||||
Assert::same(array('col' => 0.1), $result->test(array('col' => '.1')));
|
|
||||||
Assert::same(array('col' => 0.0), $result->test(array('col' => '0.0')));
|
|
||||||
Assert::same(array('col' => 0.1), $result->test(array('col' => '0.1')));
|
|
||||||
Assert::same(array('col' => 0.0), $result->test(array('col' => '0.000')));
|
|
||||||
Assert::same(array('col' => 0.1), $result->test(array('col' => '0.100')));
|
|
||||||
Assert::same(array('col' => 1.0), $result->test(array('col' => '1.0')));
|
|
||||||
Assert::same(array('col' => 1.1), $result->test(array('col' => '1.1')));
|
|
||||||
Assert::same(array('col' => 1.0), $result->test(array('col' => '1.000')));
|
|
||||||
Assert::same(array('col' => 1.1), $result->test(array('col' => '1.100')));
|
|
||||||
Assert::same(array('col' => 1.0), $result->test(array('col' => '001.000')));
|
|
||||||
Assert::same(array('col' => 1.1), $result->test(array('col' => '001.100')));
|
|
||||||
Assert::same(array('col' => 10.0), $result->test(array('col' => '10')));
|
|
||||||
Assert::same(array('col' => 11.0), $result->test(array('col' => '11')));
|
|
||||||
Assert::same(array('col' => 10.0), $result->test(array('col' => '0010')));
|
|
||||||
Assert::same(array('col' => 11.0), $result->test(array('col' => '0011')));
|
|
||||||
Assert::same(array('col' => '0.00000000000000000001'), $result->test(array('col' => '0.00000000000000000001')));
|
|
||||||
Assert::same(array('col' => '12345678901234567890'), $result->test(array('col' => '12345678901234567890')));
|
|
||||||
Assert::same(array('col' => '12345678901234567890'), $result->test(array('col' => '012345678901234567890')));
|
|
||||||
Assert::same(array('col' => '12345678901234567890'), $result->test(array('col' => '12345678901234567890.000')));
|
|
||||||
Assert::same(array('col' => '12345678901234567890.1'), $result->test(array('col' => '012345678901234567890.100')));
|
|
||||||
|
|
||||||
Assert::same(array('col' => 0.0), $result->test(array('col' => 0)));
|
|
||||||
Assert::same(array('col' => 0.0), $result->test(array('col' => 0.0)));
|
|
||||||
Assert::same(array('col' => 1.0), $result->test(array('col' => 1)));
|
|
||||||
Assert::same(array('col' => 1.0), $result->test(array('col' => 1.0)));
|
|
||||||
|
|
||||||
setlocale(LC_ALL, 'de_DE@euro', 'de_DE', 'deu_deu');
|
|
||||||
Assert::same(array('col' => 0.0), $result->test(array('col' => '')));
|
|
||||||
Assert::same(array('col' => 0.0), $result->test(array('col' => '0')));
|
|
||||||
Assert::same(array('col' => 1.0), $result->test(array('col' => '1')));
|
|
||||||
Assert::same(array('col' => 0.0), $result->test(array('col' => '.0')));
|
|
||||||
Assert::same(array('col' => 0.1), $result->test(array('col' => '.1')));
|
|
||||||
Assert::same(array('col' => 0.0), $result->test(array('col' => '0.0')));
|
|
||||||
Assert::same(array('col' => 0.1), $result->test(array('col' => '0.1')));
|
|
||||||
Assert::same(array('col' => 0.0), $result->test(array('col' => '0.000')));
|
|
||||||
Assert::same(array('col' => 0.1), $result->test(array('col' => '0.100')));
|
|
||||||
Assert::same(array('col' => 1.0), $result->test(array('col' => '1.0')));
|
|
||||||
Assert::same(array('col' => 1.1), $result->test(array('col' => '1.1')));
|
|
||||||
Assert::same(array('col' => 1.0), $result->test(array('col' => '1.000')));
|
|
||||||
Assert::same(array('col' => 1.1), $result->test(array('col' => '1.100')));
|
|
||||||
Assert::same(array('col' => 1.0), $result->test(array('col' => '001.000')));
|
|
||||||
Assert::same(array('col' => 1.1), $result->test(array('col' => '001.100')));
|
|
||||||
Assert::same(array('col' => 10.0), $result->test(array('col' => '10')));
|
|
||||||
Assert::same(array('col' => 11.0), $result->test(array('col' => '11')));
|
|
||||||
Assert::same(array('col' => 10.0), $result->test(array('col' => '0010')));
|
|
||||||
Assert::same(array('col' => 11.0), $result->test(array('col' => '0011')));
|
|
||||||
Assert::same(array('col' => '0.00000000000000000001'), $result->test(array('col' => '0.00000000000000000001')));
|
|
||||||
Assert::same(array('col' => '12345678901234567890'), $result->test(array('col' => '12345678901234567890')));
|
|
||||||
Assert::same(array('col' => '12345678901234567890'), $result->test(array('col' => '012345678901234567890')));
|
|
||||||
Assert::same(array('col' => '12345678901234567890'), $result->test(array('col' => '12345678901234567890.000')));
|
|
||||||
Assert::same(array('col' => '12345678901234567890.1'), $result->test(array('col' => '012345678901234567890.100')));
|
|
||||||
|
|
||||||
Assert::same(array('col' => 0.0), $result->test(array('col' => 0)));
|
|
||||||
Assert::same(array('col' => 0.0), $result->test(array('col' => 0.0)));
|
|
||||||
Assert::same(array('col' => 1.0), $result->test(array('col' => 1)));
|
|
||||||
Assert::same(array('col' => 1.0), $result->test(array('col' => 1.0)));
|
|
||||||
setlocale(LC_NUMERIC, 'C');
|
|
||||||
});
|
|
@@ -1,18 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
use Tester\Assert;
|
|
||||||
|
|
||||||
require __DIR__ . '/bootstrap.php';
|
|
||||||
|
|
||||||
$conn = new DibiConnection($config);
|
|
||||||
$conn->loadFile(__DIR__ . "/data/$config[system].sql");
|
|
||||||
|
|
||||||
$res = $conn->query('SELECT * FROM [customers]');
|
|
||||||
|
|
||||||
// auto-converts this column to integer
|
|
||||||
$res->setType('customer_id', Dibi::DATETIME, 'H:i j.n.Y');
|
|
||||||
|
|
||||||
Assert::equal(new DibiRow(array(
|
|
||||||
'customer_id' => new DibiDateTime('1970-01-01 01:00:01'),
|
|
||||||
'name' => 'Dave Lister',
|
|
||||||
)), $res->fetch());
|
|
@@ -1,42 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @dataProvider ../databases.ini
|
|
||||||
*/
|
|
||||||
|
|
||||||
use Tester\Assert;
|
|
||||||
|
|
||||||
require __DIR__ . '/bootstrap.php';
|
|
||||||
|
|
||||||
$conn = new DibiConnection($config);
|
|
||||||
$conn->loadFile(__DIR__ . "/data/$config[system].sql");
|
|
||||||
|
|
||||||
|
|
||||||
$row = $conn->fetch('SELECT * FROM [products] ORDER BY product_id');
|
|
||||||
|
|
||||||
// existing
|
|
||||||
Assert::same('Chair', $row->title);
|
|
||||||
Assert::true(isset($row->title));
|
|
||||||
Assert::same('Chair', $row['title']);
|
|
||||||
Assert::true(isset($row['title']));
|
|
||||||
|
|
||||||
|
|
||||||
// missing
|
|
||||||
Assert::error(function () use ($row) {
|
|
||||||
$x = $row->missing;
|
|
||||||
}, E_NOTICE, 'Undefined property: DibiRow::$missing');
|
|
||||||
|
|
||||||
Assert::error(function () use ($row) {
|
|
||||||
$x = $row['missing'];
|
|
||||||
}, E_NOTICE, 'Undefined property: DibiRow::$missing');
|
|
||||||
|
|
||||||
Assert::false(isset($row->missing));
|
|
||||||
Assert::false(isset($row['missing']));
|
|
||||||
|
|
||||||
|
|
||||||
// to array
|
|
||||||
Assert::same(array('product_id' => num(1), 'title' => 'Chair'), iterator_to_array($row));
|
|
||||||
Assert::same(array('product_id' => num(1), 'title' => 'Chair'), $row->toArray());
|
|
||||||
|
|
||||||
// counting
|
|
||||||
Assert::same(2, count($row));
|
|
@@ -1,17 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @phpversion 5.5
|
|
||||||
*/
|
|
||||||
|
|
||||||
use Tester\Assert;
|
|
||||||
|
|
||||||
require __DIR__ . '/bootstrap.php';
|
|
||||||
|
|
||||||
$conn = new DibiConnection($config);
|
|
||||||
$translator = new DibiTranslator($conn);
|
|
||||||
|
|
||||||
$datetime = new DateTime('1978-01-23 00:00:00');
|
|
||||||
|
|
||||||
Assert::equal($datetime->format('U'), $translator->formatValue(new DateTime($datetime->format('c')), NULL));
|
|
||||||
Assert::equal($datetime->format('U'), $translator->formatValue(new DateTimeImmutable($datetime->format('c')), NULL));
|
|
@@ -1,88 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @dataProvider ../databases.ini
|
|
||||||
*/
|
|
||||||
|
|
||||||
use Tester\Assert;
|
|
||||||
|
|
||||||
require __DIR__ . '/bootstrap.php';
|
|
||||||
|
|
||||||
$conn = new DibiConnection($config);
|
|
||||||
|
|
||||||
|
|
||||||
// if & end
|
|
||||||
Assert::same(
|
|
||||||
reformat('
|
|
||||||
SELECT *
|
|
||||||
FROM [customers]
|
|
||||||
/* WHERE ... LIKE ... */'),
|
|
||||||
|
|
||||||
$conn->translate('
|
|
||||||
SELECT *
|
|
||||||
FROM [customers]
|
|
||||||
%if', isset($name), 'WHERE [name] LIKE %s', 'xxx', '%end'
|
|
||||||
));
|
|
||||||
|
|
||||||
|
|
||||||
// if & else & end (last end is optional)
|
|
||||||
Assert::same(
|
|
||||||
reformat('
|
|
||||||
SELECT *
|
|
||||||
FROM [customers] /* ... */'),
|
|
||||||
|
|
||||||
$conn->translate('
|
|
||||||
SELECT *
|
|
||||||
FROM %if', TRUE, '[customers] %else [products]'
|
|
||||||
));
|
|
||||||
|
|
||||||
|
|
||||||
// if & else & (optional) end
|
|
||||||
Assert::match(
|
|
||||||
reformat('
|
|
||||||
SELECT *
|
|
||||||
FROM [people]
|
|
||||||
WHERE [id] > 0
|
|
||||||
/* AND ...=...
|
|
||||||
*/ AND [bar]=1
|
|
||||||
'),
|
|
||||||
|
|
||||||
$conn->translate('
|
|
||||||
SELECT *
|
|
||||||
FROM [people]
|
|
||||||
WHERE [id] > 0
|
|
||||||
%if', FALSE, 'AND [foo]=%i', 1, '
|
|
||||||
%else %if', TRUE, 'AND [bar]=%i', 1, '
|
|
||||||
'));
|
|
||||||
|
|
||||||
|
|
||||||
// nested condition
|
|
||||||
Assert::match(
|
|
||||||
reformat("
|
|
||||||
SELECT *
|
|
||||||
FROM [customers]
|
|
||||||
WHERE
|
|
||||||
[name] LIKE 'xxx'
|
|
||||||
/* AND ...=1 */
|
|
||||||
/* 1 LIMIT 10 */"),
|
|
||||||
|
|
||||||
$conn->translate('
|
|
||||||
SELECT *
|
|
||||||
FROM [customers]
|
|
||||||
WHERE
|
|
||||||
%if', TRUE, '[name] LIKE %s', 'xxx', '
|
|
||||||
%if', FALSE, 'AND [admin]=1 %end
|
|
||||||
%else 1 LIMIT 10 %end'
|
|
||||||
));
|
|
||||||
|
|
||||||
|
|
||||||
// limit & offset
|
|
||||||
Assert::same(
|
|
||||||
'SELECT * FROM foo /* (limit 3) (offset 5) */',
|
|
||||||
$conn->translate(
|
|
||||||
'SELECT * FROM foo',
|
|
||||||
'%if', FALSE,
|
|
||||||
'%lmt', 3,
|
|
||||||
'%ofs', 5,
|
|
||||||
'%end'
|
|
||||||
));
|
|
@@ -1,47 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @dataProvider ../databases.ini
|
|
||||||
*/
|
|
||||||
|
|
||||||
use Tester\Assert;
|
|
||||||
|
|
||||||
require __DIR__ . '/bootstrap.php';
|
|
||||||
|
|
||||||
$conn = new DibiConnection($config);
|
|
||||||
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat('SELECT * FROM where WHERE select < 2'),
|
|
||||||
$conn->translate('SELECT * FROM where WHERE select < 2')
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat('SELECT * FROM [where] WHERE where.select < 2'),
|
|
||||||
$conn->translate('SELECT * FROM [where] WHERE where.select < 2')
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat('SELECT * FROM [where] WHERE [where].[select] < 2'),
|
|
||||||
$conn->translate('SELECT * FROM [where] WHERE [where.select] < 2')
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat('SELECT * FROM [where] as [temp] WHERE [temp].[select] < 2'),
|
|
||||||
$conn->translate('SELECT * FROM [where] as [temp] WHERE [temp.select] < 2')
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat('SELECT * FROM [where] WHERE [quot\'n\' space] > 2'),
|
|
||||||
$conn->translate("SELECT * FROM [where] WHERE [quot'n' space] > 2")
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat('SELECT * FROM [where] WHERE [where].[quot\'n\' space] > 2'),
|
|
||||||
$conn->translate("SELECT * FROM [where] WHERE [where.quot'n' space] > 2")
|
|
||||||
);
|
|
@@ -1,524 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @dataProvider ../databases.ini
|
|
||||||
*/
|
|
||||||
|
|
||||||
use Tester\Assert;
|
|
||||||
|
|
||||||
require __DIR__ . '/bootstrap.php';
|
|
||||||
|
|
||||||
$conn = new DibiConnection($config + array('formatDateTime' => "'Y-m-d H:i:s'", 'formatDate' => "'Y-m-d'"));
|
|
||||||
|
|
||||||
|
|
||||||
// dibi detects INSERT or REPLACE command & booleans
|
|
||||||
Assert::same(
|
|
||||||
reformat("REPLACE INTO [products] ([title], [price]) VALUES ('Drticka', 318)"),
|
|
||||||
$conn->translate('REPLACE INTO [products]', array(
|
|
||||||
'title' => 'Drticka',
|
|
||||||
'price' => 318,
|
|
||||||
)));
|
|
||||||
|
|
||||||
|
|
||||||
// multiple INSERT command
|
|
||||||
$array = array(
|
|
||||||
'title' => 'Super Product',
|
|
||||||
'price' => 12,
|
|
||||||
'brand' => NULL,
|
|
||||||
);
|
|
||||||
Assert::same(
|
|
||||||
reformat('INSERT INTO [products] ([title], [price], [brand]) VALUES (\'Super Product\', 12, NULL) , (\'Super Product\', 12, NULL) , (\'Super Product\', 12, NULL)'),
|
|
||||||
$conn->translate('INSERT INTO [products]', $array, $array, $array)
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
// multiple INSERT command II
|
|
||||||
$array = array(
|
|
||||||
array('pole' => 'hodnota1', 'bit' => 1),
|
|
||||||
array('pole' => 'hodnota2', 'bit' => 1),
|
|
||||||
array('pole' => 'hodnota3', 'bit' => 1),
|
|
||||||
);
|
|
||||||
Assert::same(
|
|
||||||
reformat('INSERT INTO [products] ([pole], [bit]) VALUES (\'hodnota1\', 1) , (\'hodnota2\', 1) , (\'hodnota3\', 1)'),
|
|
||||||
$conn->translate('INSERT INTO [products] %ex', $array)
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
// dibi detects UPDATE command
|
|
||||||
Assert::same(
|
|
||||||
reformat("UPDATE [colors] SET [color]='blue', [order]=12 WHERE [id]=123"),
|
|
||||||
$conn->translate('UPDATE [colors] SET', array(
|
|
||||||
'color' => 'blue',
|
|
||||||
'order' => 12,
|
|
||||||
), 'WHERE [id]=%i', 123));
|
|
||||||
|
|
||||||
|
|
||||||
// IN array
|
|
||||||
$array = array(1, 2, 3);
|
|
||||||
Assert::same(
|
|
||||||
reformat('SELECT * FROM [people] WHERE [id] IN ( 1, 2, 3 )'),
|
|
||||||
$conn->translate('SELECT * FROM [people] WHERE [id] IN (', $array, ')')
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
// long numbers
|
|
||||||
Assert::same(
|
|
||||||
reformat('SELECT -123456789123456789123456789'),
|
|
||||||
$conn->translate('SELECT %i', '-123456789123456789123456789')
|
|
||||||
);
|
|
||||||
|
|
||||||
// long float numbers
|
|
||||||
Assert::same(
|
|
||||||
reformat('SELECT -.12345678912345678912345678e10'),
|
|
||||||
$conn->translate('SELECT %f', '-.12345678912345678912345678e10')
|
|
||||||
);
|
|
||||||
|
|
||||||
// invalid input
|
|
||||||
$e = Assert::exception(function () use ($conn) {
|
|
||||||
$conn->translate('SELECT %s', (object) array(123), ', %m', 123);
|
|
||||||
}, 'DibiException', 'SQL translate error');
|
|
||||||
Assert::same('SELECT **Unexpected type object** , **Unknown or invalid modifier %m**', $e->getSql());
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat('SELECT * FROM [table] WHERE id=10 AND name=\'ahoj\''),
|
|
||||||
$conn->translate('SELECT * FROM [table] WHERE id=%i AND name=%s', 10, 'ahoj')
|
|
||||||
);
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat('TEST ([cond] > 2) OR ([cond2] = \'3\') OR (cond3 < RAND())'),
|
|
||||||
$conn->translate('TEST %or', array('[cond] > 2', '[cond2] = "3"', 'cond3 < RAND()'))
|
|
||||||
);
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat('TEST ([cond] > 2) AND ([cond2] = \'3\') AND (cond3 < RAND())'),
|
|
||||||
$conn->translate('TEST %and', array('[cond] > 2', '[cond2] = "3"', 'cond3 < RAND()'))
|
|
||||||
);
|
|
||||||
|
|
||||||
//
|
|
||||||
$where = array();
|
|
||||||
$where[] = '[age] > 20';
|
|
||||||
$where[] = '[email] IS NOT NULL';
|
|
||||||
Assert::same(
|
|
||||||
reformat('SELECT * FROM [table] WHERE ([age] > 20) AND ([email] IS NOT NULL)'),
|
|
||||||
$conn->translate('SELECT * FROM [table] WHERE %and', $where)
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
$where = array();
|
|
||||||
$where['age'] = NULL;
|
|
||||||
$where['email'] = 'ahoj';
|
|
||||||
$where['id%l'] = array(10, 20, 30);
|
|
||||||
Assert::same(
|
|
||||||
reformat('SELECT * FROM [table] WHERE ([age] IS NULL) AND ([email] = \'ahoj\') AND ([id] IN (10, 20, 30))'),
|
|
||||||
$conn->translate('SELECT * FROM [table] WHERE %and', $where)
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
$where = array();
|
|
||||||
Assert::same(
|
|
||||||
reformat('SELECT * FROM [table] WHERE 1=1'),
|
|
||||||
$conn->translate('SELECT * FROM [table] WHERE %and', $where)
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
// ORDER BY array
|
|
||||||
$order = array(
|
|
||||||
'field1' => 'asc',
|
|
||||||
'field2' => 'desc',
|
|
||||||
'field3' => 1,
|
|
||||||
'field4' => -1,
|
|
||||||
'field5' => TRUE,
|
|
||||||
'field6' => FALSE,
|
|
||||||
);
|
|
||||||
Assert::same(
|
|
||||||
reformat('SELECT * FROM [people] ORDER BY [field1] ASC, [field2] DESC, [field3] ASC, [field4] DESC, [field5] ASC, [field6] DESC'),
|
|
||||||
$conn->translate('SELECT * FROM [people] ORDER BY %by', $order)
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
// with limit = 2
|
|
||||||
Assert::same(
|
|
||||||
reformat(array(
|
|
||||||
'odbc' => 'SELECT TOP 2 * FROM (SELECT * FROM [products] ) t',
|
|
||||||
'SELECT * FROM [products] LIMIT 2',
|
|
||||||
)),
|
|
||||||
$conn->translate('SELECT * FROM [products] %lmt', 2)
|
|
||||||
);
|
|
||||||
|
|
||||||
if ($config['system'] === 'odbc') {
|
|
||||||
Assert::exception(function () use ($conn) {
|
|
||||||
$conn->translate('SELECT * FROM [products] %lmt %ofs', 2, 1);
|
|
||||||
}, 'DibiException');
|
|
||||||
} else {
|
|
||||||
// with limit = 2, offset = 1
|
|
||||||
Assert::same(
|
|
||||||
reformat('SELECT * FROM [products] LIMIT 2 OFFSET 1'),
|
|
||||||
$conn->translate('SELECT * FROM [products] %lmt %ofs', 2, 1)
|
|
||||||
);
|
|
||||||
|
|
||||||
// with offset = 50
|
|
||||||
Assert::same(
|
|
||||||
reformat(array(
|
|
||||||
'mysql' => 'SELECT * FROM `products` LIMIT 18446744073709551615 OFFSET 50',
|
|
||||||
'postgre' => 'SELECT * FROM "products" OFFSET 50',
|
|
||||||
'SELECT * FROM [products] LIMIT -1 OFFSET 50',
|
|
||||||
)),
|
|
||||||
$conn->translate('SELECT * FROM [products] %ofs', 50)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat(array(
|
|
||||||
'odbc' => 'INSERT INTO test ([a2], [a4], [b1], [b2], [b3], [b4], [b5], [b6], [b7], [b8], [b9]) VALUES (#09/26/1212 00:00:00#, #12/31/1969 22:13:20#, #09/26/1212#, #09/26/1212 00:00:00#, #12/31/1969#, #12/31/1969 22:13:20#, #09/26/1212 00:00:00#, #09/26/1212#, #09/26/1212 00:00:00#, NULL, NULL)',
|
|
||||||
"INSERT INTO test ([a2], [a4], [b1], [b2], [b3], [b4], [b5], [b6], [b7], [b8], [b9]) VALUES ('1212-09-26 00:00:00', '1969-12-31 22:13:20', '1212-09-26', '1212-09-26 00:00:00', '1969-12-31', '1969-12-31 22:13:20', '1212-09-26 00:00:00', '1212-09-26', '1212-09-26 00:00:00', NULL, NULL)",
|
|
||||||
)),
|
|
||||||
$conn->translate('INSERT INTO test', array(
|
|
||||||
'a2' => new DibiDateTime('1212-09-26'),
|
|
||||||
'a4' => new DibiDateTime(-10000),
|
|
||||||
'b1%d' => '1212-09-26',
|
|
||||||
'b2%t' => '1212-09-26',
|
|
||||||
'b3%d' => -10000,
|
|
||||||
'b4%t' => -10000,
|
|
||||||
'b5' => new DateTime('1212-09-26'),
|
|
||||||
'b6%d' => new DateTime('1212-09-26'),
|
|
||||||
'b7%t' => new DateTime('1212-09-26'),
|
|
||||||
'b8%d' => NULL,
|
|
||||||
'b9%t' => NULL,
|
|
||||||
)));
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// like
|
|
||||||
$args = array(
|
|
||||||
'SELECT * FROM products WHERE (title LIKE %like~ AND title LIKE %~like) OR title LIKE %~like~',
|
|
||||||
'C',
|
|
||||||
'r',
|
|
||||||
"a\n%_\\'\"",
|
|
||||||
);
|
|
||||||
|
|
||||||
if ($config['system'] === 'postgre') {
|
|
||||||
$conn->query('SET escape_string_warning = off'); // do not log warnings
|
|
||||||
|
|
||||||
$conn->query('SET standard_conforming_strings = off');
|
|
||||||
Assert::same(
|
|
||||||
"SELECT * FROM products WHERE (title LIKE 'C%' AND title LIKE '%r') OR title LIKE '%a\n\\\\%\\\\_\\\\\\\\''\"%'",
|
|
||||||
$conn->translate($args[0], $args[1], $args[2], $args[3])
|
|
||||||
);
|
|
||||||
|
|
||||||
$conn->query('SET standard_conforming_strings = on');
|
|
||||||
Assert::same(
|
|
||||||
"SELECT * FROM products WHERE (title LIKE 'C%' AND title LIKE '%r') OR title LIKE '%a\n\\%\\_\\\\''\"%'",
|
|
||||||
$conn->translate($args[0], $args[1], $args[2], $args[3])
|
|
||||||
);
|
|
||||||
} elseif ($config['driver'] !== 'sqlite') { // sqlite2
|
|
||||||
Assert::same(
|
|
||||||
reformat(array(
|
|
||||||
'sqlite' => "SELECT * FROM products WHERE (title LIKE 'C%' ESCAPE '\\' AND title LIKE '%r' ESCAPE '\\') OR title LIKE '%a\n\\%\\_\\\\''\"%' ESCAPE '\\'",
|
|
||||||
'odbc' => "SELECT * FROM products WHERE (title LIKE 'C%' AND title LIKE '%r') OR title LIKE '%a\n[%][_]\\''\"%'",
|
|
||||||
"SELECT * FROM products WHERE (title LIKE 'C%' AND title LIKE '%r') OR title LIKE '%a\\n\\%\\_\\\\\\\\\'\"%'",
|
|
||||||
)),
|
|
||||||
$conn->translate($args[0], $args[1], $args[2], $args[3])
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
$e = Assert::exception(function () use ($conn) {
|
|
||||||
$conn->translate("SELECT '");
|
|
||||||
}, 'DibiException', 'SQL translate error');
|
|
||||||
Assert::same('SELECT **Alone quote**', $e->getSql());
|
|
||||||
|
|
||||||
Assert::match(
|
|
||||||
reformat(array(
|
|
||||||
'mysql' => "SELECT DISTINCT HIGH_PRIORITY SQL_BUFFER_RESULT
|
|
||||||
CONCAT(last_name, ', ', first_name) AS full_name
|
|
||||||
GROUP BY `user`
|
|
||||||
HAVING MAX(salary) > %i 123
|
|
||||||
INTO OUTFILE '/tmp/result\'.txt'
|
|
||||||
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\\\"'
|
|
||||||
LINES TERMINATED BY '\\\\n'
|
|
||||||
",
|
|
||||||
"SELECT DISTINCT HIGH_PRIORITY SQL_BUFFER_RESULT
|
|
||||||
CONCAT(last_name, ', ', first_name) AS full_name
|
|
||||||
GROUP BY [user]
|
|
||||||
HAVING MAX(salary) > %i 123
|
|
||||||
INTO OUTFILE '/tmp/result''.txt'
|
|
||||||
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"'
|
|
||||||
LINES TERMINATED BY '\\n'
|
|
||||||
",
|
|
||||||
)),
|
|
||||||
$conn->translate('%sql', 'SELECT DISTINCT HIGH_PRIORITY SQL_BUFFER_RESULT
|
|
||||||
CONCAT(last_name, ", ", first_name) AS full_name
|
|
||||||
GROUP BY [user]
|
|
||||||
HAVING MAX(salary) > %i', 123, "
|
|
||||||
INTO OUTFILE '/tmp/result''.txt'
|
|
||||||
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"'
|
|
||||||
LINES TERMINATED BY '\\n'
|
|
||||||
")
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
$array1 = array(1, 2, 3);
|
|
||||||
$array2 = array('one', 'two', 'three');
|
|
||||||
$array3 = array(
|
|
||||||
'col1' => 'one',
|
|
||||||
'col2' => 'two',
|
|
||||||
'col3' => 'three',
|
|
||||||
);
|
|
||||||
$array4 = array(
|
|
||||||
'a' => 12,
|
|
||||||
'b' => NULL,
|
|
||||||
'c' => new DibiDateTime('12.3.2007'),
|
|
||||||
'd' => 'any string',
|
|
||||||
);
|
|
||||||
|
|
||||||
$array5 = array('RAND()', '[col1] > [col2]');
|
|
||||||
|
|
||||||
|
|
||||||
Assert::match(
|
|
||||||
reformat(array(
|
|
||||||
'mysql' => "SELECT *
|
|
||||||
FROM `db`.`table`
|
|
||||||
WHERE (`test`.`a` LIKE '1995-03-01'
|
|
||||||
OR `b1` IN ( 1, 2, 3 )
|
|
||||||
OR `b2` IN ('1', '2', '3' )
|
|
||||||
OR `b3` IN ( )
|
|
||||||
OR `b4` IN ( 'one', 'two', 'three' )
|
|
||||||
OR `b5` IN (`col1` AS `one`, `col2` AS `two`, `col3` AS `three` )
|
|
||||||
OR `b6` IN ('one', 'two', 'three')
|
|
||||||
OR `b7` IN (NULL)
|
|
||||||
OR `b8` IN (RAND() `col1` > `col2` )
|
|
||||||
OR `b9` IN ( )
|
|
||||||
AND `c` = 'embedded \' string'
|
|
||||||
OR `d`=10
|
|
||||||
OR `e`=NULL
|
|
||||||
OR `true`= 1
|
|
||||||
OR `false`= 0
|
|
||||||
OR `str_null`=NULL
|
|
||||||
OR `str_not_null`='hello'
|
|
||||||
LIMIT 10",
|
|
||||||
'postgre' => 'SELECT *
|
|
||||||
FROM "db"."table"
|
|
||||||
WHERE ("test"."a" LIKE \'1995-03-01\'
|
|
||||||
OR "b1" IN ( 1, 2, 3 )
|
|
||||||
OR "b2" IN (\'1\', \'2\', \'3\' )
|
|
||||||
OR "b3" IN ( )
|
|
||||||
OR "b4" IN ( \'one\', \'two\', \'three\' )
|
|
||||||
OR "b5" IN ("col1" AS "one", "col2" AS "two", "col3" AS "three" )
|
|
||||||
OR "b6" IN (\'one\', \'two\', \'three\')
|
|
||||||
OR "b7" IN (NULL)
|
|
||||||
OR "b8" IN (RAND() "col1" > "col2" )
|
|
||||||
OR "b9" IN ( )
|
|
||||||
AND "c" = \'embedded \'\' string\'
|
|
||||||
OR "d"=10
|
|
||||||
OR "e"=NULL
|
|
||||||
OR "true"= TRUE
|
|
||||||
OR "false"= FALSE
|
|
||||||
OR "str_null"=NULL
|
|
||||||
OR "str_not_null"=\'hello\'
|
|
||||||
LIMIT 10',
|
|
||||||
'odbc' => "SELECT *
|
|
||||||
FROM [db].[table]
|
|
||||||
WHERE ([test].[a] LIKE #03/01/1995#
|
|
||||||
OR [b1] IN ( 1, 2, 3 )
|
|
||||||
OR [b2] IN ('1', '2', '3' )
|
|
||||||
OR [b3] IN ( )
|
|
||||||
OR [b4] IN ( 'one', 'two', 'three' )
|
|
||||||
OR [b5] IN ([col1] AS [one], [col2] AS [two], [col3] AS [three] )
|
|
||||||
OR [b6] IN ('one', 'two', 'three')
|
|
||||||
OR [b7] IN (NULL)
|
|
||||||
OR [b8] IN (RAND() [col1] > [col2] )
|
|
||||||
OR [b9] IN ( )
|
|
||||||
AND [c] = 'embedded '' string'
|
|
||||||
OR [d]=10
|
|
||||||
OR [e]=NULL
|
|
||||||
OR [true]= 1
|
|
||||||
OR [false]= 0
|
|
||||||
OR [str_null]=NULL
|
|
||||||
OR [str_not_null]='hello'
|
|
||||||
LIMIT 10",
|
|
||||||
"SELECT *
|
|
||||||
FROM [db].[table]
|
|
||||||
WHERE ([test].[a] LIKE '1995-03-01'
|
|
||||||
OR [b1] IN ( 1, 2, 3 )
|
|
||||||
OR [b2] IN ('1', '2', '3' )
|
|
||||||
OR [b3] IN ( )
|
|
||||||
OR [b4] IN ( 'one', 'two', 'three' )
|
|
||||||
OR [b5] IN ([col1] AS [one], [col2] AS [two], [col3] AS [three] )
|
|
||||||
OR [b6] IN ('one', 'two', 'three')
|
|
||||||
OR [b7] IN (NULL)
|
|
||||||
OR [b8] IN (RAND() [col1] > [col2] )
|
|
||||||
OR [b9] IN ( )
|
|
||||||
AND [c] = 'embedded '' string'
|
|
||||||
OR [d]=10
|
|
||||||
OR [e]=NULL
|
|
||||||
OR [true]= 1
|
|
||||||
OR [false]= 0
|
|
||||||
OR [str_null]=NULL
|
|
||||||
OR [str_not_null]='hello'
|
|
||||||
LIMIT 10",
|
|
||||||
)),
|
|
||||||
|
|
||||||
$conn->translate('SELECT *
|
|
||||||
FROM [db.table]
|
|
||||||
WHERE ([test.a] LIKE %d', '1995-03-01', '
|
|
||||||
OR [b1] IN (', $array1, ')
|
|
||||||
OR [b2] IN (%s', $array1, ')
|
|
||||||
OR [b3] IN (%s', array(), ')
|
|
||||||
OR [b4] IN (', $array2, ')
|
|
||||||
OR [b5] IN (%n', $array3, ')
|
|
||||||
OR [b6] IN %l', $array3, '
|
|
||||||
OR [b7] IN %in', array(), '
|
|
||||||
OR [b8] IN (%sql', $array5, ')
|
|
||||||
OR [b9] IN (', array(), ")
|
|
||||||
AND [c] = 'embedded '' string'
|
|
||||||
OR [d]=%i", 10.3, '
|
|
||||||
OR [e]=%i', NULL, '
|
|
||||||
OR [true]=', TRUE, '
|
|
||||||
OR [false]=', FALSE, '
|
|
||||||
OR [str_null]=%sn', '', '
|
|
||||||
OR [str_not_null]=%sn', 'hello', '
|
|
||||||
LIMIT 10')
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat('TEST [cond] > 2 [cond2] = \'3\' cond3 < RAND() 123'),
|
|
||||||
$conn->translate('TEST %ex', array('[cond] > 2', '[cond2] = "3"', 'cond3 < RAND()'), 123)
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat('TEST ([cond] > 2) OR ([cond2] > 3) OR ([cond3] = 10 + 1)'),
|
|
||||||
$conn->translate('TEST %or', array('`cond` > 2', array('[cond2] > %i', '3'), 'cond3%sql' => array('10 + 1')))
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat('TEST ([cond] = 2) OR ([cond3] = RAND())'),
|
|
||||||
$conn->translate('TEST %or', array('cond' => 2, 'cond3%sql' => 'RAND()'))
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat('TEST ([cond1] 3) OR ([cond2] RAND()) OR ([cond3] LIKE \'string\')'),
|
|
||||||
$conn->translate('TEST %or', array('cond1%ex' => 3, 'cond2%ex' => 'RAND()', 'cond3%ex' => array('LIKE %s', 'string')))
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat(array(
|
|
||||||
'odbc' => 'SELECT TOP 10 * FROM (SELECT * FROM [test] WHERE [id] LIKE \'%d%t\' ) t',
|
|
||||||
'SELECT * FROM [test] WHERE [id] LIKE \'%d%t\' LIMIT 10',
|
|
||||||
)),
|
|
||||||
$conn->translate("SELECT * FROM [test] WHERE %n LIKE '%d%t' %lmt", 'id', 10)
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
$where = array(
|
|
||||||
'tablename.column' => 1,
|
|
||||||
);
|
|
||||||
Assert::same(
|
|
||||||
reformat('SELECT * FROM [tablename] WHERE ([tablename].[column] = 1)'),
|
|
||||||
$conn->translate('SELECT * FROM [tablename] WHERE %and', $where)
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat('SELECT FROM ... '),
|
|
||||||
$conn->translate('SELECT FROM ... %lmt', NULL)
|
|
||||||
);
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat('SELECT \'%i\''),
|
|
||||||
$conn->translate("SELECT '%i'")
|
|
||||||
);
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat('SELECT \'%i\''),
|
|
||||||
$conn->translate('SELECT "%i"')
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat('INSERT INTO [products] ([product_id], [title]) VALUES (1, SHA1(\'Test product\')) , (1, SHA1(\'Test product\'))'),
|
|
||||||
$conn->translate('INSERT INTO [products]', array(
|
|
||||||
'product_id' => 1,
|
|
||||||
'title' => array('SHA1(%s)', 'Test product'),
|
|
||||||
), array(
|
|
||||||
'product_id' => 1,
|
|
||||||
'title' => array('SHA1(%s)', 'Test product'),
|
|
||||||
))
|
|
||||||
);
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat('UPDATE [products] [product_id]=1, [title]=SHA1(\'Test product\')'),
|
|
||||||
$conn->translate('UPDATE [products]', array(
|
|
||||||
'product_id' => 1,
|
|
||||||
'title' => array('SHA1(%s)', 'Test product'),
|
|
||||||
))
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
$e = Assert::exception(function () use ($conn) {
|
|
||||||
$array6 = array(
|
|
||||||
'id' => array(1, 2, 3, 4),
|
|
||||||
'text' => array('ahoj', 'jak', 'se', array('SUM(%i)', '5')),
|
|
||||||
'num%i' => array('1', ''),
|
|
||||||
);
|
|
||||||
$conn->translate('INSERT INTO test %m', $array6);
|
|
||||||
}, 'DibiException', 'SQL translate error');
|
|
||||||
Assert::same('INSERT INTO test **Multi-insert array "num%i" is different.**', $e->getSql());
|
|
||||||
|
|
||||||
$array6 = array(
|
|
||||||
'id' => array(1, 2, 3, 4),
|
|
||||||
'text' => array('ahoj', 'jak', 'se', array('SUM(%i)', '5')),
|
|
||||||
'num%i' => array('1', '', 10.3, 1),
|
|
||||||
);
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat('INSERT INTO test ([id], [text], [num]) VALUES (1, \'ahoj\', 1), (2, \'jak\', 0), (3, \'se\', 10), (4, SUM(5), 1)'),
|
|
||||||
$conn->translate('INSERT INTO test %m', $array6)
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
$by = array(
|
|
||||||
array('funkce(nazev_pole) ASC'),
|
|
||||||
'jine_pole' => 'DESC',
|
|
||||||
);
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat('SELECT * FROM table ORDER BY funkce(nazev_pole) ASC, [jine_pole] DESC'),
|
|
||||||
$conn->translate('SELECT * FROM table ORDER BY %by', $by)
|
|
||||||
);
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat('INSERT INTO [test].*'),
|
|
||||||
$conn->translate('INSERT INTO [test.*]')
|
|
||||||
);
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat('INSERT INTO 0'),
|
|
||||||
$conn->translate('INSERT INTO %f', 'ahoj')
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
setLocale(LC_ALL, 'czech');
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
reformat("UPDATE [colors] SET [color]='blue', [price]=-12.4, [spec]=-9E-005, [spec2]=1000, [spec3]=10000, [spec4]=10000 WHERE [price]=123.5"),
|
|
||||||
|
|
||||||
$conn->translate('UPDATE [colors] SET', array(
|
|
||||||
'color' => 'blue',
|
|
||||||
'price' => -12.4,
|
|
||||||
'spec%f' => '-9E-005',
|
|
||||||
'spec2%f' => 1000.00,
|
|
||||||
'spec3%i' => 10000,
|
|
||||||
'spec4' => 10000,
|
|
||||||
), 'WHERE [price]=%f', 123.5)
|
|
||||||
);
|
|
@@ -1,76 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @dataProvider? ../databases.ini sqlsrv
|
|
||||||
*/
|
|
||||||
|
|
||||||
use Tester\Assert;
|
|
||||||
|
|
||||||
require __DIR__ . '/bootstrap.php';
|
|
||||||
|
|
||||||
$tests = function ($conn) {
|
|
||||||
$version = $conn->getDriver()->getResource()->getAttribute(PDO::ATTR_SERVER_VERSION);
|
|
||||||
|
|
||||||
// MsSQL2012+
|
|
||||||
if (version_compare($version, '11.0') >= 0) {
|
|
||||||
// Limit and offset
|
|
||||||
Assert::same(
|
|
||||||
'SELECT 1 OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY',
|
|
||||||
$conn->translate('SELECT 1 %ofs %lmt', 10, 10)
|
|
||||||
);
|
|
||||||
|
|
||||||
// Limit only
|
|
||||||
Assert::same(
|
|
||||||
'SELECT 1 OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY',
|
|
||||||
$conn->translate('SELECT 1 %lmt', 10)
|
|
||||||
);
|
|
||||||
|
|
||||||
// Offset only
|
|
||||||
Assert::same(
|
|
||||||
'SELECT 1 OFFSET 10 ROWS',
|
|
||||||
$conn->translate('SELECT 1 %ofs', 10)
|
|
||||||
);
|
|
||||||
|
|
||||||
// Offset invalid
|
|
||||||
Assert::same(
|
|
||||||
'SELECT 1',
|
|
||||||
$conn->translate('SELECT 1 %ofs', -10)
|
|
||||||
);
|
|
||||||
|
|
||||||
// Limit invalid
|
|
||||||
Assert::same(
|
|
||||||
'SELECT 1',
|
|
||||||
$conn->translate('SELECT 1 %lmt', -10)
|
|
||||||
);
|
|
||||||
|
|
||||||
// Limit invalid, offset valid
|
|
||||||
Assert::same(
|
|
||||||
'SELECT 1',
|
|
||||||
$conn->translate('SELECT 1 %ofs %lmt', 10, -10)
|
|
||||||
);
|
|
||||||
|
|
||||||
// Limit valid, offset invalid
|
|
||||||
Assert::same(
|
|
||||||
'SELECT 1',
|
|
||||||
$conn->translate('SELECT 1 %ofs %lmt', -10, 10)
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
Assert::same(
|
|
||||||
'SELECT TOP 1 * FROM (SELECT 1) t',
|
|
||||||
$conn->translate('SELECT 1 %lmt', 1)
|
|
||||||
);
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
'SELECT 1',
|
|
||||||
$conn->translate('SELECT 1 %lmt', -10)
|
|
||||||
);
|
|
||||||
|
|
||||||
Assert::exception(
|
|
||||||
$conn->translate('SELECT 1 %ofs %lmt', 10, 10),
|
|
||||||
'DibiNotSupportedException'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
$conn = new DibiConnection($config);
|
|
||||||
$tests($conn);
|
|
@@ -1,30 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @dataProvider? ../databases.ini postgre
|
|
||||||
*/
|
|
||||||
|
|
||||||
use Tester\Assert;
|
|
||||||
|
|
||||||
require __DIR__ . '/bootstrap.php';
|
|
||||||
|
|
||||||
|
|
||||||
$tests = function ($conn) {
|
|
||||||
Assert::false($conn->query("SELECT 'AAxBB' LIKE %~like~", 'A_B')->fetchSingle());
|
|
||||||
Assert::true($conn->query("SELECT 'AA_BB' LIKE %~like~", 'A_B')->fetchSingle());
|
|
||||||
|
|
||||||
Assert::false($conn->query("SELECT 'AAxBB' LIKE %~like~", 'A%B')->fetchSingle());
|
|
||||||
Assert::true($conn->query("SELECT 'AA%BB' LIKE %~like~", 'A%B')->fetchSingle());
|
|
||||||
|
|
||||||
Assert::same('AA\\BB', $conn->query("SELECT 'AA\\BB'")->fetchSingle());
|
|
||||||
Assert::false($conn->query("SELECT 'AAxBB' LIKE %~like~", 'A\\B')->fetchSingle());
|
|
||||||
Assert::true($conn->query("SELECT 'AA\\BB' LIKE %~like~", 'A\\B')->fetchSingle());
|
|
||||||
};
|
|
||||||
|
|
||||||
$conn = new DibiConnection($config);
|
|
||||||
$conn->query('SET escape_string_warning = off'); // do not log warnings
|
|
||||||
|
|
||||||
$conn->query('SET standard_conforming_strings = on');
|
|
||||||
$tests($conn);
|
|
||||||
$conn->query('SET standard_conforming_strings = off');
|
|
||||||
$tests($conn);
|
|
@@ -1,81 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
// The Nette Tester command-line runner can be
|
|
||||||
// invoked through the command: ../../vendor/bin/tester .
|
|
||||||
|
|
||||||
if (@!include __DIR__ . '/../../vendor/autoload.php') {
|
|
||||||
echo 'Install Nette Tester using `composer update --dev`';
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// configure environment
|
|
||||||
Tester\Environment::setup();
|
|
||||||
date_default_timezone_set('Europe/Prague');
|
|
||||||
|
|
||||||
|
|
||||||
// load connection
|
|
||||||
try {
|
|
||||||
$config = Tester\Environment::loadData();
|
|
||||||
} catch (Exception $e) {
|
|
||||||
$config = parse_ini_file(__DIR__ . '/../databases.ini', TRUE);
|
|
||||||
$config = reset($config);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// lock
|
|
||||||
define('TEMP_DIR', __DIR__ . '/../tmp');
|
|
||||||
@mkdir(TEMP_DIR); // @ - directory may already exist
|
|
||||||
Tester\Environment::lock($config['system'], TEMP_DIR);
|
|
||||||
|
|
||||||
|
|
||||||
// ODBC
|
|
||||||
if ($config['system'] === 'odbc') {
|
|
||||||
copy(__DIR__ . '/data/odbc.mdb', TEMP_DIR . '/odbc.mdb');
|
|
||||||
$config['dsn'] = str_replace('data/odbc.mdb', TEMP_DIR . '/odbc.mdb', $config['dsn']);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
try {
|
|
||||||
new DibiConnection($config);
|
|
||||||
} catch (DibiNotSupportedException $e) {
|
|
||||||
Tester\Environment::skip($e->getMessage());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function test(\Closure $function)
|
|
||||||
{
|
|
||||||
$function();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** Replaces [] with driver-specific quotes */
|
|
||||||
function reformat($s)
|
|
||||||
{
|
|
||||||
global $config;
|
|
||||||
if (is_array($s)) {
|
|
||||||
if (isset($s[$config['system']])) {
|
|
||||||
return $s[$config['system']];
|
|
||||||
}
|
|
||||||
$s = $s[0];
|
|
||||||
}
|
|
||||||
if ($config['system'] === 'mysql') {
|
|
||||||
return strtr($s, '[]', '``');
|
|
||||||
} elseif ($config['system'] === 'postgre') {
|
|
||||||
return strtr($s, '[]', '""');
|
|
||||||
} elseif (in_array($config['system'], array('odbc', 'sqlite', 'sqlsrv'))) {
|
|
||||||
return $s;
|
|
||||||
} else {
|
|
||||||
trigger_error("Unsupported driver $config[system]", E_USER_WARNING);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function num($n)
|
|
||||||
{
|
|
||||||
global $config;
|
|
||||||
if (substr(@$config['dsn'], 0, 5) === 'odbc:' || $config['driver'] === 'sqlite') {
|
|
||||||
$n = is_float($n) ? "$n.0" : (string) $n;
|
|
||||||
}
|
|
||||||
return $n;
|
|
||||||
}
|
|
@@ -1,52 +0,0 @@
|
|||||||
/*!40102 SET storage_engine = InnoDB */;
|
|
||||||
|
|
||||||
DROP DATABASE IF EXISTS dibi_test;
|
|
||||||
CREATE DATABASE dibi_test;
|
|
||||||
USE dibi_test;
|
|
||||||
|
|
||||||
DROP TABLE IF EXISTS `products`;
|
|
||||||
CREATE TABLE `products` (
|
|
||||||
`product_id` int(11) NOT NULL AUTO_INCREMENT,
|
|
||||||
`title` varchar(100) NOT NULL,
|
|
||||||
PRIMARY KEY (`product_id`),
|
|
||||||
KEY `title` (`title`)
|
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
|
||||||
|
|
||||||
INSERT INTO `products` (`product_id`, `title`) VALUES
|
|
||||||
(1, 'Chair'),
|
|
||||||
(3, 'Computer'),
|
|
||||||
(2, 'Table');
|
|
||||||
|
|
||||||
DROP TABLE IF EXISTS `customers`;
|
|
||||||
CREATE TABLE `customers` (
|
|
||||||
`customer_id` int(11) NOT NULL AUTO_INCREMENT,
|
|
||||||
`name` varchar(100) NOT NULL,
|
|
||||||
PRIMARY KEY (`customer_id`)
|
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
|
||||||
|
|
||||||
INSERT INTO `customers` (`customer_id`, `name`) VALUES
|
|
||||||
(1, 'Dave Lister'),
|
|
||||||
(2, 'Arnold Rimmer'),
|
|
||||||
(3, 'The Cat'),
|
|
||||||
(4, 'Holly'),
|
|
||||||
(5, 'Kryten'),
|
|
||||||
(6, 'Kristine Kochanski');
|
|
||||||
|
|
||||||
DROP TABLE IF EXISTS `orders`;
|
|
||||||
CREATE TABLE `orders` (
|
|
||||||
`order_id` int(11) NOT NULL AUTO_INCREMENT,
|
|
||||||
`customer_id` int(11) NOT NULL,
|
|
||||||
`product_id` int(11) NOT NULL,
|
|
||||||
`amount` float NOT NULL,
|
|
||||||
PRIMARY KEY (`order_id`),
|
|
||||||
KEY `customer_id` (`customer_id`),
|
|
||||||
KEY `product_id` (`product_id`),
|
|
||||||
CONSTRAINT `orders_ibfk_4` FOREIGN KEY (`product_id`) REFERENCES `products` (`product_id`) ON UPDATE CASCADE,
|
|
||||||
CONSTRAINT `orders_ibfk_3` FOREIGN KEY (`customer_id`) REFERENCES `customers` (`customer_id`) ON UPDATE CASCADE
|
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
|
||||||
|
|
||||||
INSERT INTO `orders` (`order_id`, `customer_id`, `product_id`, `amount`) VALUES
|
|
||||||
(1, 2, 1, 7),
|
|
||||||
(2, 2, 3, 2),
|
|
||||||
(3, 1, 2, 3),
|
|
||||||
(4, 6, 3, 5);
|
|
Binary file not shown.
@@ -1,32 +0,0 @@
|
|||||||
CREATE TABLE products (
|
|
||||||
product_id COUNTER,
|
|
||||||
title TEXT(50)
|
|
||||||
);
|
|
||||||
|
|
||||||
INSERT INTO products (product_id, title) VALUES (1, 'Chair');
|
|
||||||
INSERT INTO products (product_id, title) VALUES (2, 'Table');
|
|
||||||
INSERT INTO products (product_id, title) VALUES (3, 'Computer');
|
|
||||||
|
|
||||||
CREATE TABLE [customers] (
|
|
||||||
[customer_id] COUNTER,
|
|
||||||
[name] TEXT(50)
|
|
||||||
);
|
|
||||||
|
|
||||||
INSERT INTO `customers` (`customer_id`, `name`) VALUES (1, 'Dave Lister');
|
|
||||||
INSERT INTO `customers` (`customer_id`, `name`) VALUES (2, 'Arnold Rimmer');
|
|
||||||
INSERT INTO `customers` (`customer_id`, `name`) VALUES (3, 'The Cat');
|
|
||||||
INSERT INTO `customers` (`customer_id`, `name`) VALUES (4, 'Holly');
|
|
||||||
INSERT INTO `customers` (`customer_id`, `name`) VALUES (5, 'Kryten');
|
|
||||||
INSERT INTO `customers` (`customer_id`, `name`) VALUES (6, 'Kristine Kochanski');
|
|
||||||
|
|
||||||
CREATE TABLE [orders] (
|
|
||||||
[order_id] COUNTER,
|
|
||||||
[customer_id] INTEGER,
|
|
||||||
[product_id] INTEGER,
|
|
||||||
[amount] FLOAT
|
|
||||||
);
|
|
||||||
|
|
||||||
INSERT INTO `orders` (`order_id`, `customer_id`, `product_id`, `amount`) VALUES (1, 2, 1, 7);
|
|
||||||
INSERT INTO `orders` (`order_id`, `customer_id`, `product_id`, `amount`) VALUES (2, 2, 3, 2);
|
|
||||||
INSERT INTO `orders` (`order_id`, `customer_id`, `product_id`, `amount`) VALUES (3, 1, 2, 3);
|
|
||||||
INSERT INTO `orders` (`order_id`, `customer_id`, `product_id`, `amount`) VALUES (4, 6, 3, 5);
|
|
@@ -1,52 +0,0 @@
|
|||||||
SET client_encoding = 'UTF8';
|
|
||||||
DROP SCHEMA IF EXISTS public CASCADE;
|
|
||||||
CREATE SCHEMA public;
|
|
||||||
|
|
||||||
CREATE TABLE products (
|
|
||||||
product_id serial NOT NULL,
|
|
||||||
title varchar(100) NOT NULL,
|
|
||||||
PRIMARY KEY (product_id)
|
|
||||||
);
|
|
||||||
|
|
||||||
INSERT INTO products (product_id, title) VALUES
|
|
||||||
(1, 'Chair'),
|
|
||||||
(2, 'Table'),
|
|
||||||
(3, 'Computer');
|
|
||||||
SELECT setval('products_product_id_seq', 3, TRUE);
|
|
||||||
|
|
||||||
CREATE INDEX title ON products USING btree (title);
|
|
||||||
|
|
||||||
CREATE TABLE customers (
|
|
||||||
customer_id serial NOT NULL,
|
|
||||||
name varchar(100) NOT NULL,
|
|
||||||
PRIMARY KEY (customer_id)
|
|
||||||
);
|
|
||||||
|
|
||||||
INSERT INTO customers (customer_id, name) VALUES
|
|
||||||
(1, 'Dave Lister'),
|
|
||||||
(2, 'Arnold Rimmer'),
|
|
||||||
(3, 'The Cat'),
|
|
||||||
(4, 'Holly'),
|
|
||||||
(5, 'Kryten'),
|
|
||||||
(6, 'Kristine Kochanski');
|
|
||||||
SELECT setval('customers_customer_id_seq', 6, TRUE);
|
|
||||||
|
|
||||||
CREATE TABLE orders (
|
|
||||||
order_id serial NOT NULL,
|
|
||||||
customer_id integer NOT NULL,
|
|
||||||
product_id integer NOT NULL,
|
|
||||||
amount real NOT NULL
|
|
||||||
);
|
|
||||||
|
|
||||||
INSERT INTO orders (order_id, customer_id, product_id, amount) VALUES
|
|
||||||
(1, 2, 1, 7),
|
|
||||||
(2, 2, 3, 2),
|
|
||||||
(3, 1, 2, 3),
|
|
||||||
(4, 6, 3, 5);
|
|
||||||
SELECT setval('orders_order_id_seq', 4, TRUE);
|
|
||||||
|
|
||||||
ALTER TABLE ONLY orders
|
|
||||||
ADD CONSTRAINT orders_customer_id_fkey FOREIGN KEY (customer_id) REFERENCES customers(customer_id) ON UPDATE CASCADE ON DELETE RESTRICT;
|
|
||||||
|
|
||||||
ALTER TABLE ONLY orders
|
|
||||||
ADD CONSTRAINT orders_product_id_fkey FOREIGN KEY (product_id) REFERENCES products(product_id) ON UPDATE CASCADE ON DELETE RESTRICT;
|
|
@@ -1,36 +0,0 @@
|
|||||||
CREATE TABLE [products] (
|
|
||||||
[product_id] INTEGER NOT NULL PRIMARY KEY,
|
|
||||||
[title] VARCHAR(100) NOT NULL
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE INDEX "title" ON "products" ("title");
|
|
||||||
|
|
||||||
INSERT INTO "products" ("product_id", "title") VALUES (1, 'Chair');
|
|
||||||
INSERT INTO "products" ("product_id", "title") VALUES (2, 'Table');
|
|
||||||
INSERT INTO "products" ("product_id", "title") VALUES (3, 'Computer');
|
|
||||||
|
|
||||||
CREATE TABLE [customers] (
|
|
||||||
[customer_id] INTEGER PRIMARY KEY NOT NULL,
|
|
||||||
[name] VARCHAR(100) NOT NULL
|
|
||||||
);
|
|
||||||
|
|
||||||
INSERT INTO "customers" ("customer_id", "name") VALUES (1, 'Dave Lister');
|
|
||||||
INSERT INTO "customers" ("customer_id", "name") VALUES (2, 'Arnold Rimmer');
|
|
||||||
INSERT INTO "customers" ("customer_id", "name") VALUES (3, 'The Cat');
|
|
||||||
INSERT INTO "customers" ("customer_id", "name") VALUES (4, 'Holly');
|
|
||||||
INSERT INTO "customers" ("customer_id", "name") VALUES (5, 'Kryten');
|
|
||||||
INSERT INTO "customers" ("customer_id", "name") VALUES (6, 'Kristine Kochanski');
|
|
||||||
|
|
||||||
CREATE TABLE [orders] (
|
|
||||||
[order_id] INTEGER NOT NULL PRIMARY KEY,
|
|
||||||
[customer_id] INTEGER NOT NULL,
|
|
||||||
[product_id] INTEGER NOT NULL,
|
|
||||||
[amount] FLOAT NOT NULL,
|
|
||||||
CONSTRAINT orders_product FOREIGN KEY (product_id) REFERENCES products (product_id),
|
|
||||||
CONSTRAINT orders_customer FOREIGN KEY (customer_id) REFERENCES customers (customer_id)
|
|
||||||
);
|
|
||||||
|
|
||||||
INSERT INTO "orders" ("order_id", "customer_id", "product_id", "amount") VALUES (1, 2, 1, '7.0');
|
|
||||||
INSERT INTO "orders" ("order_id", "customer_id", "product_id", "amount") VALUES (2, 2, 3, '2.0');
|
|
||||||
INSERT INTO "orders" ("order_id", "customer_id", "product_id", "amount") VALUES (3, 1, 2, '3.0');
|
|
||||||
INSERT INTO "orders" ("order_id", "customer_id", "product_id", "amount") VALUES (4, 6, 3, '5.0');
|
|
@@ -1,46 +0,0 @@
|
|||||||
IF OBJECT_ID('orders', 'U') IS NOT NULL DROP TABLE orders;
|
|
||||||
IF OBJECT_ID('products', 'U') IS NOT NULL DROP TABLE products;
|
|
||||||
IF OBJECT_ID('customers', 'U') IS NOT NULL DROP TABLE customers;
|
|
||||||
|
|
||||||
|
|
||||||
CREATE TABLE products (
|
|
||||||
product_id int NOT NULL IDENTITY(11,1),
|
|
||||||
title varchar(50) NOT NULL,
|
|
||||||
PRIMARY KEY(product_id)
|
|
||||||
);
|
|
||||||
|
|
||||||
SET IDENTITY_INSERT products ON;
|
|
||||||
INSERT INTO products (product_id, title) VALUES (1, 'Chair');
|
|
||||||
INSERT INTO products (product_id, title) VALUES (2, 'Table');
|
|
||||||
INSERT INTO products (product_id, title) VALUES (3, 'Computer');
|
|
||||||
SET IDENTITY_INSERT products OFF;
|
|
||||||
|
|
||||||
CREATE TABLE customers (
|
|
||||||
customer_id int NOT NULL IDENTITY(11,1),
|
|
||||||
name varchar(50) NOT NULL,
|
|
||||||
PRIMARY KEY(customer_id)
|
|
||||||
);
|
|
||||||
|
|
||||||
SET IDENTITY_INSERT customers ON;
|
|
||||||
INSERT INTO customers (customer_id, name) VALUES (1, 'Dave Lister');
|
|
||||||
INSERT INTO customers (customer_id, name) VALUES (2, 'Arnold Rimmer');
|
|
||||||
INSERT INTO customers (customer_id, name) VALUES (3, 'The Cat');
|
|
||||||
INSERT INTO customers (customer_id, name) VALUES (4, 'Holly');
|
|
||||||
INSERT INTO customers (customer_id, name) VALUES (5, 'Kryten');
|
|
||||||
INSERT INTO customers (customer_id, name) VALUES (6, 'Kristine Kochanski');
|
|
||||||
SET IDENTITY_INSERT customers OFF;
|
|
||||||
|
|
||||||
CREATE TABLE orders (
|
|
||||||
order_id int NOT NULL IDENTITY(11,1),
|
|
||||||
customer_id int NOT NULL,
|
|
||||||
product_id int NOT NULL,
|
|
||||||
amount float NOT NULL,
|
|
||||||
PRIMARY KEY(order_id)
|
|
||||||
);
|
|
||||||
|
|
||||||
SET IDENTITY_INSERT orders ON;
|
|
||||||
INSERT INTO orders (order_id, customer_id, product_id, amount) VALUES (1, 2, 1, 7);
|
|
||||||
INSERT INTO orders (order_id, customer_id, product_id, amount) VALUES (2, 2, 3, 2);
|
|
||||||
INSERT INTO orders (order_id, customer_id, product_id, amount) VALUES (3, 1, 2, 3);
|
|
||||||
INSERT INTO orders (order_id, customer_id, product_id, amount) VALUES (4, 6, 3, 5);
|
|
||||||
SET IDENTITY_INSERT orders OFF;
|
|
@@ -1,74 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @dataProvider ../databases.ini !=odbc
|
|
||||||
*/
|
|
||||||
|
|
||||||
use Tester\Assert;
|
|
||||||
|
|
||||||
require __DIR__ . '/bootstrap.php';
|
|
||||||
|
|
||||||
$conn = new DibiConnection($config);
|
|
||||||
$conn->loadFile(__DIR__ . "/data/$config[system].sql");
|
|
||||||
|
|
||||||
try {
|
|
||||||
$meta = $conn->getDatabaseInfo();
|
|
||||||
} catch (DibiNotSupportedException $e) {
|
|
||||||
Tester\Environment::skip($e->getMessage());
|
|
||||||
}
|
|
||||||
|
|
||||||
Assert::same(3, count($meta->getTables()));
|
|
||||||
|
|
||||||
$names = $meta->getTableNames();
|
|
||||||
sort($names);
|
|
||||||
Assert::equal(array('customers', 'orders', 'products'), $names);
|
|
||||||
|
|
||||||
Assert::false($meta->hasTable('xxxx'));
|
|
||||||
|
|
||||||
$table = $meta->getTable('products');
|
|
||||||
Assert::same('products', $table->name);
|
|
||||||
Assert::false($table->isView());
|
|
||||||
|
|
||||||
Assert::same(2, count($table->getColumns()));
|
|
||||||
Assert::false($table->hasColumn('xxxx'));
|
|
||||||
Assert::true($table->hasColumn('product_id'));
|
|
||||||
Assert::true($table->hasColumn('Product_id'));
|
|
||||||
Assert::same('product_id', $table->getColumn('Product_id')->name);
|
|
||||||
|
|
||||||
$column = $table->getColumn('product_id');
|
|
||||||
Assert::same('product_id', $column->name);
|
|
||||||
Assert::same('products', $column->table->name);
|
|
||||||
Assert::same('i', $column->type);
|
|
||||||
Assert::type('string', $column->nativeType);
|
|
||||||
Assert::false($column->nullable);
|
|
||||||
Assert::true($column->autoIncrement);
|
|
||||||
|
|
||||||
$column = $table->getColumn('title');
|
|
||||||
Assert::same('title', $column->name);
|
|
||||||
Assert::same('products', $column->table->name);
|
|
||||||
Assert::same('s', $column->type);
|
|
||||||
Assert::type('string', $column->nativeType);
|
|
||||||
Assert::same(100, $column->size);
|
|
||||||
Assert::false($column->nullable);
|
|
||||||
Assert::false($column->autoIncrement);
|
|
||||||
//Assert::null($column->default);
|
|
||||||
|
|
||||||
|
|
||||||
$indexes = $table->getIndexes();
|
|
||||||
$index = reset($indexes);
|
|
||||||
|
|
||||||
if ($config['system'] !== 'sqlite') {
|
|
||||||
Assert::same(2, count($indexes));
|
|
||||||
Assert::true($index->primary);
|
|
||||||
Assert::true($index->unique);
|
|
||||||
Assert::same(1, count($index->getColumns()));
|
|
||||||
Assert::same('product_id', $index->columns[0]->name);
|
|
||||||
|
|
||||||
$index = next($indexes);
|
|
||||||
}
|
|
||||||
|
|
||||||
Assert::same('title', $index->name);
|
|
||||||
Assert::false($index->primary);
|
|
||||||
Assert::false($index->unique);
|
|
||||||
Assert::same(1, count($index->getColumns()));
|
|
||||||
Assert::same('title', $index->columns[0]->name);
|
|
@@ -1,2 +0,0 @@
|
|||||||
[PHP]
|
|
||||||
;extension_dir = "./ext"
|
|
@@ -1,18 +0,0 @@
|
|||||||
[PHP]
|
|
||||||
extension_dir = "./ext"
|
|
||||||
;extension=php_mssql.dll
|
|
||||||
extension=php_mysql.dll
|
|
||||||
extension=php_mysqli.dll
|
|
||||||
;extension=php_oci8.dll
|
|
||||||
;extension=php_oci8_11g.dll
|
|
||||||
;extension=php_pdo_firebird.dll
|
|
||||||
;extension=php_pdo_mssql.dll
|
|
||||||
extension=php_pdo_mysql.dll
|
|
||||||
;extension=php_pdo_oci.dll
|
|
||||||
extension=php_pdo_odbc.dll
|
|
||||||
extension=php_pdo_pgsql.dll
|
|
||||||
extension=php_pdo_sqlite.dll
|
|
||||||
extension=php_pgsql.dll
|
|
||||||
extension=php_sqlite.dll
|
|
||||||
extension=php_sqlite3.dll
|
|
||||||
;extension=php_sqlsrv_ts.dll
|
|
1
version.txt
Normal file
1
version.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
Dibi 2.2.3 (released on 2015-01-13)
|
Reference in New Issue
Block a user