mirror of
https://github.com/dg/dibi.git
synced 2025-09-03 11:02:35 +02:00
Compare commits
20 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
6f99db544f | ||
|
c399d79ab8 | ||
|
67f8468a38 | ||
|
72944ae012 | ||
|
4843882e61 | ||
|
669ce73096 | ||
|
6e4a6474cd | ||
|
2dc30747e5 | ||
|
23531a0f3d | ||
|
22c6f2dfda | ||
|
f51ac0b67e | ||
|
43f5e08296 | ||
|
997f5a98f8 | ||
|
e4b3cfb12c | ||
|
26082294b6 | ||
|
b3052b4ce2 | ||
|
efa3a48232 | ||
|
24511a1d96 | ||
|
a20ba29b13 | ||
|
a606be0efa |
@@ -10,13 +10,7 @@
|
|||||||
"homepage": "http://davidgrudl.com"
|
"homepage": "http://davidgrudl.com"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"require-dev": {
|
|
||||||
"nette/tester": "@dev"
|
|
||||||
},
|
|
||||||
"replace": {
|
|
||||||
"dg/dibi": "self.version"
|
|
||||||
},
|
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"classmap": ["dibi/"]
|
"classmap": ["dibi/"]
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -10,14 +10,15 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Dibi extension for Nette Framework 2.0. Creates 'connection' service.
|
* Dibi extension for Nette Framework. Creates 'connection' service.
|
||||||
*
|
*
|
||||||
* @author David Grudl
|
* @author David Grudl
|
||||||
* @package dibi\nette
|
* @package dibi\nette
|
||||||
* @phpversion 5.3
|
* @phpversion 5.3
|
||||||
*/
|
*/
|
||||||
class DibiNette20Extension extends Nette\Config\CompilerExtension
|
class DibiNetteExtension extends Nette\Config\CompilerExtension
|
||||||
{
|
{
|
||||||
|
|
||||||
public function loadConfiguration()
|
public function loadConfiguration()
|
||||||
@@ -46,7 +47,7 @@ class DibiNette20Extension extends Nette\Config\CompilerExtension
|
|||||||
$panel = $container->addDefinition($this->prefix('panel'))
|
$panel = $container->addDefinition($this->prefix('panel'))
|
||||||
->setClass('DibiNettePanel')
|
->setClass('DibiNettePanel')
|
||||||
->addSetup('Nette\Diagnostics\Debugger::$bar->addPanel(?)', array('@self'))
|
->addSetup('Nette\Diagnostics\Debugger::$bar->addPanel(?)', array('@self'))
|
||||||
->addSetup('Nette\Diagnostics\Debugger::$blueScreen->addPanel(?)', array('DibiNettePanel::renderException'));
|
->addSetup('Nette\Diagnostics\Debugger::$blueScreen->addPanel(?)', array(array('@self', 'renderException')));
|
||||||
|
|
||||||
$connection->addSetup('$service->onEvent[] = ?', array(array($panel, 'logEvent')));
|
$connection->addSetup('$service->onEvent[] = ?', array(array($panel, 'logEvent')));
|
||||||
}
|
}
|
@@ -10,11 +10,13 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (interface_exists('Nette\Diagnostics\IBarPanel')) {
|
if (interface_exists('Nette\Diagnostics\IBarPanel')) {
|
||||||
class_alias('Nette\Diagnostics\IBarPanel', 'IBarPanel');
|
class_alias('Nette\Diagnostics\IBarPanel', 'IBarPanel');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Dibi panel for Nette\Diagnostics.
|
* Dibi panel for Nette\Diagnostics.
|
||||||
*
|
*
|
||||||
@@ -36,6 +38,7 @@ class DibiNettePanel extends DibiObject implements IBarPanel
|
|||||||
private $events = array();
|
private $events = array();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public function __construct($explain = TRUE, $filter = NULL)
|
public function __construct($explain = TRUE, $filter = NULL)
|
||||||
{
|
{
|
||||||
$this->filter = $filter ? (int) $filter : DibiEvent::QUERY;
|
$this->filter = $filter ? (int) $filter : DibiEvent::QUERY;
|
||||||
@@ -43,29 +46,25 @@ class DibiNettePanel extends DibiObject implements IBarPanel
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public function register(DibiConnection $connection)
|
public function register(DibiConnection $connection)
|
||||||
{
|
{
|
||||||
if (is_callable('Nette\Diagnostics\Debugger::enable') && !class_exists('NDebugger')) {
|
if (is_callable('Nette\Diagnostics\Debugger::enable') && !class_exists('NDebugger')) {
|
||||||
class_alias('Nette\Diagnostics\Debugger', 'NDebugger'); // PHP 5.2 code compatibility
|
class_alias('Nette\Diagnostics\Debugger', 'NDebugger'); // PHP 5.2 code compatibility
|
||||||
}
|
}
|
||||||
if (is_callable('NDebugger::enable') && is_callable('NDebugger::getBlueScreen')) { // Nette Framework 2.1
|
if (is_callable('NDebugger::enable')) {
|
||||||
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::$bar && NDebugger::$bar->addPanel($this);
|
||||||
NDebugger::$blueScreen && NDebugger::$blueScreen->addPanel(array(__CLASS__, 'renderException'), __CLASS__);
|
NDebugger::$blueScreen && NDebugger::$blueScreen->addPanel(array($this, 'renderException'), __CLASS__);
|
||||||
$connection->onEvent[] = array($this, 'logEvent');
|
$connection->onEvent[] = array($this, 'logEvent');
|
||||||
|
} elseif (is_callable('Debugger::enable')) {
|
||||||
} 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::$bar && Debugger::$bar->addPanel($this);
|
||||||
Debugger::$blueScreen && Debugger::$blueScreen->addPanel(array(__CLASS__, 'renderException'), __CLASS__);
|
Debugger::$blueScreen && Debugger::$blueScreen->addPanel(array($this, 'renderException'), __CLASS__);
|
||||||
$connection->onEvent[] = array($this, 'logEvent');
|
$connection->onEvent[] = array($this, 'logEvent');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* After event notification.
|
* After event notification.
|
||||||
* @return void
|
* @return void
|
||||||
@@ -79,11 +78,12 @@ class DibiNettePanel extends DibiObject implements IBarPanel
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns blue-screen custom tab.
|
* Returns blue-screen custom tab.
|
||||||
* @return mixed
|
* @return mixed
|
||||||
*/
|
*/
|
||||||
public static function renderException($e)
|
public function renderException($e)
|
||||||
{
|
{
|
||||||
if ($e instanceof DibiException && $e->getSql()) {
|
if ($e instanceof DibiException && $e->getSql()) {
|
||||||
return array(
|
return array(
|
||||||
@@ -94,6 +94,7 @@ class DibiNettePanel extends DibiObject implements IBarPanel
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns HTML code for custom tab. (Nette\Diagnostics\IBarPanel)
|
* Returns HTML code for custom tab. (Nette\Diagnostics\IBarPanel)
|
||||||
* @return mixed
|
* @return mixed
|
||||||
@@ -111,6 +112,7 @@ class DibiNettePanel extends DibiObject implements IBarPanel
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns HTML code for custom panel. (Nette\Diagnostics\IBarPanel)
|
* Returns HTML code for custom panel. (Nette\Diagnostics\IBarPanel)
|
||||||
* @return mixed
|
* @return mixed
|
||||||
@@ -136,7 +138,7 @@ class DibiNettePanel extends DibiObject implements IBarPanel
|
|||||||
if ($explain) {
|
if ($explain) {
|
||||||
static $counter;
|
static $counter;
|
||||||
$counter++;
|
$counter++;
|
||||||
$s .= "<br /><a href='#nette-debug-DibiProfiler-row-$counter' class='nette-toggler nette-toggle-collapsed' rel='#nette-debug-DibiProfiler-row-$counter'>explain</a>";
|
$s .= "<br /><a href='#' class='nette-toggler' rel='#nette-debug-DibiProfiler-row-$counter'>explain ►</a>";
|
||||||
}
|
}
|
||||||
|
|
||||||
$s .= '</td><td class="nette-DibiProfiler-sql">' . dibi::dump(strlen($event->sql) > self::$maxLength ? substr($event->sql, 0, self::$maxLength) . '...' : $event->sql, TRUE);
|
$s .= '</td><td class="nette-DibiProfiler-sql">' . dibi::dump(strlen($event->sql) > self::$maxLength ? substr($event->sql, 0, self::$maxLength) . '...' : $event->sql, TRUE);
|
@@ -1,55 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This file is part of the "dibi" - smart database abstraction layer.
|
|
||||||
*
|
|
||||||
* Copyright (c) 2005 David Grudl (http://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.1. Creates 'connection' service.
|
|
||||||
*
|
|
||||||
* @author David Grudl
|
|
||||||
* @package dibi\nette
|
|
||||||
* @phpversion 5.3
|
|
||||||
*/
|
|
||||||
class DibiNette21Extension extends Nette\DI\CompilerExtension
|
|
||||||
{
|
|
||||||
|
|
||||||
public function loadConfiguration()
|
|
||||||
{
|
|
||||||
$container = $this->getContainerBuilder();
|
|
||||||
$config = $this->getConfig();
|
|
||||||
|
|
||||||
$useProfiler = isset($config['profiler'])
|
|
||||||
? $config['profiler']
|
|
||||||
: $container->parameters['debugMode'];
|
|
||||||
|
|
||||||
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::getBar()->addPanel(?)', array('@self'))
|
|
||||||
->addSetup('Nette\Diagnostics\Debugger::getBlueScreen()->addPanel(?)', array('DibiNettePanel::renderException'));
|
|
||||||
|
|
||||||
$connection->addSetup('$service->onEvent[] = ?', array(array($panel, 'logEvent')));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@@ -1,17 +0,0 @@
|
|||||||
# 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
|
|
@@ -1,12 +0,0 @@
|
|||||||
# This will create service named 'dibi.connection'.
|
|
||||||
# Requires Nette Framework 2.1
|
|
||||||
|
|
||||||
extensions:
|
|
||||||
dibi: DibiNette21Extension
|
|
||||||
|
|
||||||
dibi:
|
|
||||||
host: localhost
|
|
||||||
username: root
|
|
||||||
password: ***
|
|
||||||
database: foo
|
|
||||||
lazy: TRUE
|
|
101
dibi/dibi.php
101
dibi/dibi.php
@@ -20,6 +20,7 @@ if (version_compare(PHP_VERSION, '5.2.0', '<')) {
|
|||||||
@set_magic_quotes_runtime(FALSE); // intentionally @
|
@set_magic_quotes_runtime(FALSE); // intentionally @
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
require_once dirname(__FILE__) . '/libs/interfaces.php';
|
require_once dirname(__FILE__) . '/libs/interfaces.php';
|
||||||
require_once dirname(__FILE__) . '/libs/DibiDateTime.php';
|
require_once dirname(__FILE__) . '/libs/DibiDateTime.php';
|
||||||
require_once dirname(__FILE__) . '/libs/DibiObject.php';
|
require_once dirname(__FILE__) . '/libs/DibiObject.php';
|
||||||
@@ -38,10 +39,13 @@ 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')) {
|
if (interface_exists('Nette\Diagnostics\IBarPanel') || interface_exists('IBarPanel')) {
|
||||||
require_once dirname(__FILE__) . '/bridges/Nette/DibiNettePanel.php';
|
require_once dirname(__FILE__) . '/Nette/DibiNettePanel.php';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Interface for database drivers.
|
* Interface for database drivers.
|
||||||
*
|
*
|
||||||
@@ -76,7 +80,7 @@ class dibi
|
|||||||
FIELD_TIME = dibi::TIME;
|
FIELD_TIME = dibi::TIME;
|
||||||
|
|
||||||
/** version */
|
/** version */
|
||||||
const VERSION = '2.1.1',
|
const VERSION = '2.0.3',
|
||||||
REVISION = '$WCREV$ released on $WCDATE$';
|
REVISION = '$WCREV$ released on $WCDATE$';
|
||||||
|
|
||||||
/** sorting order */
|
/** sorting order */
|
||||||
@@ -108,6 +112,7 @@ class dibi
|
|||||||
public static $defaultDriver = 'mysql';
|
public static $defaultDriver = 'mysql';
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Static class - cannot be instantiated.
|
* Static class - cannot be instantiated.
|
||||||
*/
|
*/
|
||||||
@@ -117,9 +122,11 @@ class dibi
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************* connections handling ****************d*g**/
|
/********************* connections handling ****************d*g**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new DibiConnection object and connects it to specified database.
|
* Creates a new DibiConnection object and connects it to specified database.
|
||||||
* @param mixed connection parameters
|
* @param mixed connection parameters
|
||||||
@@ -133,6 +140,7 @@ class dibi
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Disconnects from database (doesn't destroy DibiConnection object).
|
* Disconnects from database (doesn't destroy DibiConnection object).
|
||||||
* @return void
|
* @return void
|
||||||
@@ -143,6 +151,7 @@ class dibi
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns TRUE when connection was established.
|
* Returns TRUE when connection was established.
|
||||||
* @return bool
|
* @return bool
|
||||||
@@ -153,6 +162,7 @@ class dibi
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieve active connection.
|
* Retrieve active connection.
|
||||||
* @param string connection registy name
|
* @param string connection registy name
|
||||||
@@ -177,6 +187,7 @@ class dibi
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets connection.
|
* Sets connection.
|
||||||
* @param DibiConnection
|
* @param DibiConnection
|
||||||
@@ -188,6 +199,7 @@ class dibi
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Change active connection.
|
* Change active connection.
|
||||||
* @param string connection registy name
|
* @param string connection registy name
|
||||||
@@ -200,9 +212,11 @@ class dibi
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************* monostate for active connection ****************d*g**/
|
/********************* monostate for active connection ****************d*g**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates and executes SQL query - Monostate for DibiConnection::query().
|
* Generates and executes SQL query - Monostate for DibiConnection::query().
|
||||||
* @param array|mixed one or more arguments
|
* @param array|mixed one or more arguments
|
||||||
@@ -216,6 +230,7 @@ class dibi
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Executes the SQL query - Monostate for DibiConnection::nativeQuery().
|
* Executes the SQL query - Monostate for DibiConnection::nativeQuery().
|
||||||
* @param string SQL statement.
|
* @param string SQL statement.
|
||||||
@@ -227,6 +242,7 @@ class dibi
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates and prints SQL query - Monostate for DibiConnection::test().
|
* Generates and prints SQL query - Monostate for DibiConnection::test().
|
||||||
* @param array|mixed one or more arguments
|
* @param array|mixed one or more arguments
|
||||||
@@ -239,6 +255,7 @@ class dibi
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates and returns SQL query as DibiDataSource - Monostate for DibiConnection::test().
|
* Generates and returns SQL query as DibiDataSource - Monostate for DibiConnection::test().
|
||||||
* @param array|mixed one or more arguments
|
* @param array|mixed one or more arguments
|
||||||
@@ -251,6 +268,7 @@ class dibi
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Executes SQL query and fetch result - Monostate for DibiConnection::query() & fetch().
|
* Executes SQL query and fetch result - Monostate for DibiConnection::query() & fetch().
|
||||||
* @param array|mixed one or more arguments
|
* @param array|mixed one or more arguments
|
||||||
@@ -264,6 +282,7 @@ class dibi
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Executes SQL query and fetch results - Monostate for DibiConnection::query() & fetchAll().
|
* Executes SQL query and fetch results - Monostate for DibiConnection::query() & fetchAll().
|
||||||
* @param array|mixed one or more arguments
|
* @param array|mixed one or more arguments
|
||||||
@@ -277,6 +296,7 @@ class dibi
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Executes SQL query and fetch first column - Monostate for DibiConnection::query() & fetchSingle().
|
* Executes SQL query and fetch first column - Monostate for DibiConnection::query() & fetchSingle().
|
||||||
* @param array|mixed one or more arguments
|
* @param array|mixed one or more arguments
|
||||||
@@ -290,6 +310,7 @@ class dibi
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Executes SQL query and fetch pairs - Monostate for DibiConnection::query() & fetchPairs().
|
* Executes SQL query and fetch pairs - Monostate for DibiConnection::query() & fetchPairs().
|
||||||
* @param array|mixed one or more arguments
|
* @param array|mixed one or more arguments
|
||||||
@@ -303,6 +324,7 @@ class dibi
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the number of affected rows.
|
* Gets the number of affected rows.
|
||||||
* Monostate for DibiConnection::getAffectedRows()
|
* Monostate for DibiConnection::getAffectedRows()
|
||||||
@@ -315,6 +337,7 @@ class dibi
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the number of affected rows. Alias for getAffectedRows().
|
* Gets the number of affected rows. Alias for getAffectedRows().
|
||||||
* @return int number of rows
|
* @return int number of rows
|
||||||
@@ -326,6 +349,7 @@ class dibi
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves the ID generated for an AUTO_INCREMENT column by the previous INSERT query.
|
* Retrieves the ID generated for an AUTO_INCREMENT column by the previous INSERT query.
|
||||||
* Monostate for DibiConnection::getInsertId()
|
* Monostate for DibiConnection::getInsertId()
|
||||||
@@ -339,6 +363,7 @@ class dibi
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves the ID generated for an AUTO_INCREMENT column. Alias for getInsertId().
|
* Retrieves the ID generated for an AUTO_INCREMENT column. Alias for getInsertId().
|
||||||
* @param string optional sequence name
|
* @param string optional sequence name
|
||||||
@@ -351,6 +376,7 @@ class dibi
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Begins a transaction - Monostate for DibiConnection::begin().
|
* Begins a transaction - Monostate for DibiConnection::begin().
|
||||||
* @param string optional savepoint name
|
* @param string optional savepoint name
|
||||||
@@ -363,6 +389,7 @@ class dibi
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Commits statements in a transaction - Monostate for DibiConnection::commit($savepoint = NULL).
|
* Commits statements in a transaction - Monostate for DibiConnection::commit($savepoint = NULL).
|
||||||
* @param string optional savepoint name
|
* @param string optional savepoint name
|
||||||
@@ -375,6 +402,7 @@ class dibi
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Rollback changes in a transaction - Monostate for DibiConnection::rollback().
|
* Rollback changes in a transaction - Monostate for DibiConnection::rollback().
|
||||||
* @param string optional savepoint name
|
* @param string optional savepoint name
|
||||||
@@ -387,6 +415,7 @@ class dibi
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets a information about the current database - Monostate for DibiConnection::getDatabaseInfo().
|
* Gets a information about the current database - Monostate for DibiConnection::getDatabaseInfo().
|
||||||
* @return DibiDatabaseInfo
|
* @return DibiDatabaseInfo
|
||||||
@@ -397,6 +426,7 @@ class dibi
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Import SQL dump from file - extreme fast!
|
* Import SQL dump from file - extreme fast!
|
||||||
* @param string filename
|
* @param string filename
|
||||||
@@ -408,21 +438,24 @@ class dibi
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Replacement for majority of dibi::methods() in future.
|
* Replacement for majority of dibi::methods() in future.
|
||||||
*/
|
*/
|
||||||
public static function __callStatic($name, $args)
|
public static function __callStatic($name, $args)
|
||||||
{
|
{
|
||||||
//if ($name = 'select', 'update', ...') {
|
//if ($name = 'select', 'update', ...') {
|
||||||
// return self::command()->$name($args);
|
// return self::command()->$name($args);
|
||||||
//}
|
//}
|
||||||
return call_user_func_array(array(self::getConnection(), $name), $args);
|
return call_user_func_array(array(self::getConnection(), $name), $args);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************* fluent SQL builders ****************d*g**/
|
/********************* fluent SQL builders ****************d*g**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return DibiFluent
|
* @return DibiFluent
|
||||||
*/
|
*/
|
||||||
@@ -432,6 +465,7 @@ class dibi
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string column name
|
* @param string column name
|
||||||
* @return DibiFluent
|
* @return DibiFluent
|
||||||
@@ -443,6 +477,7 @@ class dibi
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string table
|
* @param string table
|
||||||
* @param array
|
* @param array
|
||||||
@@ -454,6 +489,7 @@ class dibi
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string table
|
* @param string table
|
||||||
* @param array
|
* @param array
|
||||||
@@ -465,6 +501,7 @@ class dibi
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string table
|
* @param string table
|
||||||
* @return DibiFluent
|
* @return DibiFluent
|
||||||
@@ -475,32 +512,37 @@ class dibi
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************* data types ****************d*g**/
|
/********************* data types ****************d*g**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @deprecated
|
* @return DibiDateTime
|
||||||
*/
|
*/
|
||||||
public static function datetime($time = NULL)
|
public static function datetime($time = NULL)
|
||||||
{
|
{
|
||||||
trigger_error(__METHOD__ . '() is deprecated; create DateTime object instead.', E_USER_WARNING);
|
trigger_error(__METHOD__ . '() is deprecated; create DibiDateTime object instead.', E_USER_WARNING);
|
||||||
return new DibiDateTime($time);
|
return new DibiDateTime($time);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @deprecated
|
* @deprecated
|
||||||
*/
|
*/
|
||||||
public static function date($date = NULL)
|
public static function date($date = NULL)
|
||||||
{
|
{
|
||||||
trigger_error(__METHOD__ . '() is deprecated; create DateTime object instead.', E_USER_WARNING);
|
trigger_error(__METHOD__ . '() is deprecated; create DibiDateTime object instead.', E_USER_WARNING);
|
||||||
return new DibiDateTime($date);
|
return new DibiDateTime($date);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************* substitutions ****************d*g**/
|
/********************* substitutions ****************d*g**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns substitution hashmap - Monostate for DibiConnection::getSubstitutes().
|
* Returns substitution hashmap - Monostate for DibiConnection::getSubstitutes().
|
||||||
* @return DibiHashMap
|
* @return DibiHashMap
|
||||||
@@ -511,6 +553,7 @@ class dibi
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** @deprecated */
|
/** @deprecated */
|
||||||
public static function addSubst($expr, $subst)
|
public static function addSubst($expr, $subst)
|
||||||
{
|
{
|
||||||
@@ -519,6 +562,7 @@ class dibi
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** @deprecated */
|
/** @deprecated */
|
||||||
public static function removeSubst($expr)
|
public static function removeSubst($expr)
|
||||||
{
|
{
|
||||||
@@ -534,6 +578,7 @@ class dibi
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** @deprecated */
|
/** @deprecated */
|
||||||
public static function setSubstFallback($callback)
|
public static function setSubstFallback($callback)
|
||||||
{
|
{
|
||||||
@@ -542,9 +587,11 @@ class dibi
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************* misc tools ****************d*g**/
|
/********************* misc tools ****************d*g**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Prints out a syntax highlighted version of the SQL command or DibiResult.
|
* Prints out a syntax highlighted version of the SQL command or DibiResult.
|
||||||
* @param string|DibiResult
|
* @param string|DibiResult
|
||||||
@@ -558,9 +605,7 @@ class dibi
|
|||||||
$sql->dump();
|
$sql->dump();
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
if ($sql === NULL) {
|
if ($sql === NULL) $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|SET|VALUES|LEFT\s+JOIN|INNER\s+JOIN|TRUNCATE';
|
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';
|
||||||
@@ -575,18 +620,13 @@ class dibi
|
|||||||
$sql = wordwrap($sql, 100);
|
$sql = wordwrap($sql, 100);
|
||||||
$sql = preg_replace("#([ \t]*\r?\n){2,}#", "\n", $sql);
|
$sql = preg_replace("#([ \t]*\r?\n){2,}#", "\n", $sql);
|
||||||
|
|
||||||
// syntax highlight
|
|
||||||
$highlighter = "#(/\\*.+?\\*/)|(\\*\\*.+?\\*\\*)|(?<=[\\s,(])($keywords1)(?=[\\s,)])|(?<=[\\s,(=])($keywords2)(?=[\\s,)=])#is";
|
|
||||||
if (PHP_SAPI === 'cli') {
|
if (PHP_SAPI === 'cli') {
|
||||||
if (substr(getenv('TERM'), 0, 5) === 'xterm') {
|
|
||||||
$sql = preg_replace_callback($highlighter, array('dibi', 'cliHighlightCallback'), $sql);
|
|
||||||
}
|
|
||||||
echo trim($sql) . "\n\n";
|
echo trim($sql) . "\n\n";
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
// syntax highlight
|
||||||
$sql = htmlSpecialChars($sql);
|
$sql = htmlSpecialChars($sql);
|
||||||
$sql = preg_replace_callback($highlighter, array('dibi', 'highlightCallback'), $sql);
|
$sql = preg_replace_callback("#(/\\*.+?\\*/)|(\\*\\*.+?\\*\\*)|(?<=[\\s,(])($keywords1)(?=[\\s,)])|(?<=[\\s,(=])($keywords2)(?=[\\s,)=])#is", array('dibi', 'highlightCallback'), $sql);
|
||||||
echo '<pre class="dump">', trim($sql), "</pre>\n\n";
|
echo '<pre class="dump">', trim($sql), "</pre>\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -598,37 +638,20 @@ class dibi
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private static function highlightCallback($matches)
|
private static function highlightCallback($matches)
|
||||||
{
|
{
|
||||||
if (!empty($matches[1])) { // comment
|
if (!empty($matches[1])) // comment
|
||||||
return '<em style="color:gray">' . $matches[1] . '</em>';
|
return '<em style="color:gray">' . $matches[1] . '</em>';
|
||||||
|
|
||||||
} elseif (!empty($matches[2])) { // error
|
if (!empty($matches[2])) // error
|
||||||
return '<strong style="color:red">' . $matches[2] . '</strong>';
|
return '<strong style="color:red">' . $matches[2] . '</strong>';
|
||||||
|
|
||||||
} elseif (!empty($matches[3])) { // most important keywords
|
if (!empty($matches[3])) // most important keywords
|
||||||
return '<strong style="color:blue">' . $matches[3] . '</strong>';
|
return '<strong style="color:blue">' . $matches[3] . '</strong>';
|
||||||
|
|
||||||
} elseif (!empty($matches[4])) { // other keywords
|
if (!empty($matches[4])) // other keywords
|
||||||
return '<strong style="color:green">' . $matches[4] . '</strong>';
|
return '<strong style="color:green">' . $matches[4] . '</strong>';
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private static function cliHighlightCallback($matches)
|
|
||||||
{
|
|
||||||
if (!empty($matches[1])) { // comment
|
|
||||||
return "\033[1;30m" . $matches[1] . "\033[0m";
|
|
||||||
|
|
||||||
} elseif (!empty($matches[2])) { // error
|
|
||||||
return "\033[1;31m" . $matches[2] . "\033[0m";
|
|
||||||
|
|
||||||
} elseif (!empty($matches[3])) { // most important keywords
|
|
||||||
return "\033[1;34m" . $matches[3] . "\033[0m";
|
|
||||||
|
|
||||||
} elseif (!empty($matches[4])) { // other keywords
|
|
||||||
return "\033[1;32m" . $matches[4] . "\033[0m";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -1,137 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This file is part of the "dibi" - smart database abstraction layer.
|
|
||||||
*
|
|
||||||
* Copyright (c) 2005 David Grudl (http://davidgrudl.com)
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view
|
|
||||||
* the file license.txt that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The dibi reflector for MSSQL2005 databases.
|
|
||||||
*
|
|
||||||
* @author Daniel Kouba
|
|
||||||
* @package dibi\drivers
|
|
||||||
* @internal
|
|
||||||
*/
|
|
||||||
class DibiMsSql2005Reflector extends DibiObject implements IDibiReflector
|
|
||||||
{
|
|
||||||
/** @var IDibiDriver */
|
|
||||||
private $driver;
|
|
||||||
|
|
||||||
|
|
||||||
public function __construct(IDibiDriver $driver)
|
|
||||||
{
|
|
||||||
$this->driver = $driver;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns list of tables.
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function getTables()
|
|
||||||
{
|
|
||||||
$res = $this->driver->query('SELECT TABLE_NAME, TABLE_TYPE FROM INFORMATION_SCHEMA.TABLES');
|
|
||||||
$tables = array();
|
|
||||||
while ($row = $res->fetch(FALSE)) {
|
|
||||||
$tables[] = array(
|
|
||||||
'name' => $row[0],
|
|
||||||
'view' => isset($row[1]) && $row[1] === 'VIEW',
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return $tables;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns metadata for all columns in a table.
|
|
||||||
* @param string
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function getColumns($table)
|
|
||||||
{
|
|
||||||
$res = $this->driver->query("
|
|
||||||
SELECT c.name as COLUMN_NAME, c.is_identity AS AUTO_INCREMENT
|
|
||||||
FROM sys.columns c
|
|
||||||
INNER JOIN sys.tables t ON c.object_id = t.object_id
|
|
||||||
WHERE t.name = {$this->driver->escape($table, dibi::TEXT)}
|
|
||||||
");
|
|
||||||
|
|
||||||
$autoIncrements = array();
|
|
||||||
while ($row = $res->fetch(TRUE)) {
|
|
||||||
$autoIncrements[$row['COLUMN_NAME']] = (bool) $row['AUTO_INCREMENT'];
|
|
||||||
}
|
|
||||||
|
|
||||||
$res = $this->driver->query("
|
|
||||||
SELECT C.COLUMN_NAME, C.DATA_TYPE, C.CHARACTER_MAXIMUM_LENGTH , C.COLUMN_DEFAULT , C.NUMERIC_PRECISION, C.NUMERIC_SCALE , C.IS_NULLABLE, Case When Z.CONSTRAINT_NAME Is Null Then 0 Else 1 End As IsPartOfPrimaryKey
|
|
||||||
FROM INFORMATION_SCHEMA.COLUMNS As C
|
|
||||||
Outer Apply (
|
|
||||||
SELECT CCU.CONSTRAINT_NAME
|
|
||||||
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS As TC
|
|
||||||
Join INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE As CCU
|
|
||||||
On CCU.CONSTRAINT_NAME = TC.CONSTRAINT_NAME
|
|
||||||
WHERE TC.TABLE_SCHEMA = C.TABLE_SCHEMA
|
|
||||||
And TC.TABLE_NAME = C.TABLE_NAME
|
|
||||||
And TC.CONSTRAINT_TYPE = 'PRIMARY KEY'
|
|
||||||
And CCU.COLUMN_NAME = C.COLUMN_NAME
|
|
||||||
) As Z
|
|
||||||
WHERE C.TABLE_NAME = {$this->driver->escape($table, dibi::TEXT)}
|
|
||||||
");
|
|
||||||
$columns = array();
|
|
||||||
while ($row = $res->fetch(TRUE)) {
|
|
||||||
$columns[] = array(
|
|
||||||
'name' => $row['COLUMN_NAME'],
|
|
||||||
'table' => $table,
|
|
||||||
'nativetype' => strtoupper($row['DATA_TYPE']),
|
|
||||||
'size' => $row['CHARACTER_MAXIMUM_LENGTH'],
|
|
||||||
'unsigned' => TRUE,
|
|
||||||
'nullable' => $row['IS_NULLABLE'] === 'YES',
|
|
||||||
'default' => $row['COLUMN_DEFAULT'],
|
|
||||||
'autoincrement' => $autoIncrements[$row['COLUMN_NAME']],
|
|
||||||
'vendor' => $row,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return $columns;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns metadata for all indexes in a table.
|
|
||||||
* @param string
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function getIndexes($table)
|
|
||||||
{
|
|
||||||
$keyUsagesRes = $this->driver->query("SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME = {$this->driver->escape($table, dibi::TEXT)}");
|
|
||||||
$keyUsages = array();
|
|
||||||
while( $row = $keyUsagesRes->fetch(TRUE) ) {
|
|
||||||
$keyUsages[$row['CONSTRAINT_NAME']][(int) $row['ORDINAL_POSITION'] - 1] = $row['COLUMN_NAME'];
|
|
||||||
}
|
|
||||||
|
|
||||||
$res = $this->driver->query("SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_NAME = {$this->driver->escape($table, dibi::TEXT)}");
|
|
||||||
$indexes = array();
|
|
||||||
while ($row = $res->fetch(TRUE)) {
|
|
||||||
$indexes[$row['CONSTRAINT_NAME']]['name'] = $row['CONSTRAINT_NAME'];
|
|
||||||
$indexes[$row['CONSTRAINT_NAME']]['unique'] = $row['CONSTRAINT_TYPE'] === 'UNIQUE';
|
|
||||||
$indexes[$row['CONSTRAINT_NAME']]['primary'] = $row['CONSTRAINT_TYPE'] === 'PRIMARY KEY';
|
|
||||||
$indexes[$row['CONSTRAINT_NAME']]['columns'] = isset($keyUsages[$row['CONSTRAINT_NAME']]) ? $keyUsages[$row['CONSTRAINT_NAME']] : array();
|
|
||||||
}
|
|
||||||
return array_values($indexes);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns metadata for all foreign keys in a table.
|
|
||||||
* @param string
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function getForeignKeys($table)
|
|
||||||
{
|
|
||||||
throw new DibiNotImplementedException;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@@ -56,12 +56,13 @@ class DibiFirebirdDriver extends DibiObject implements IDibiDriver, IDibiResultD
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Connects to a database.
|
* Connects to a database.
|
||||||
* @return void
|
* @return void
|
||||||
* @throws DibiException
|
* @throws DibiException
|
||||||
*/
|
*/
|
||||||
public function connect(array & $config)
|
public function connect(array &$config)
|
||||||
{
|
{
|
||||||
DibiConnection::alias($config, 'database', 'db');
|
DibiConnection::alias($config, 'database', 'db');
|
||||||
|
|
||||||
@@ -70,13 +71,11 @@ class DibiFirebirdDriver extends DibiObject implements IDibiDriver, IDibiResultD
|
|||||||
|
|
||||||
} else {
|
} else {
|
||||||
// default values
|
// default values
|
||||||
$config += array(
|
if (!isset($config['username'])) $config['username'] = ini_get('ibase.default_password');
|
||||||
'username' => ini_get('ibase.default_password'),
|
if (!isset($config['password'])) $config['password'] = ini_get('ibase.default_user');
|
||||||
'password' => ini_get('ibase.default_user'),
|
if (!isset($config['database'])) $config['database'] = ini_get('ibase.default_db');
|
||||||
'database' => ini_get('ibase.default_db'),
|
if (!isset($config['charset'])) $config['charset'] = ini_get('ibase.default_charset');
|
||||||
'charset' => ini_get('ibase.default_charset'),
|
if (!isset($config['buffers'])) $config['buffers'] = 0;
|
||||||
'buffers' => 0,
|
|
||||||
);
|
|
||||||
|
|
||||||
DibiDriverException::tryError();
|
DibiDriverException::tryError();
|
||||||
if (empty($config['persistent'])) {
|
if (empty($config['persistent'])) {
|
||||||
@@ -96,6 +95,7 @@ class DibiFirebirdDriver extends DibiObject implements IDibiDriver, IDibiResultD
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Disconnects from a database.
|
* Disconnects from a database.
|
||||||
* @return void
|
* @return void
|
||||||
@@ -106,6 +106,7 @@ class DibiFirebirdDriver extends DibiObject implements IDibiDriver, IDibiResultD
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Executes the SQL query.
|
* Executes the SQL query.
|
||||||
* @param string SQL statement.
|
* @param string SQL statement.
|
||||||
@@ -137,6 +138,7 @@ class DibiFirebirdDriver extends DibiObject implements IDibiDriver, IDibiResultD
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the number of affected rows by the last INSERT, UPDATE or DELETE query.
|
* Gets the number of affected rows by the last INSERT, UPDATE or DELETE query.
|
||||||
* @return int|FALSE number of rows or FALSE on error
|
* @return int|FALSE number of rows or FALSE on error
|
||||||
@@ -147,6 +149,7 @@ class DibiFirebirdDriver extends DibiObject implements IDibiDriver, IDibiResultD
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves the ID generated for an AUTO_INCREMENT column by the previous INSERT query.
|
* Retrieves the ID generated for an AUTO_INCREMENT column by the previous INSERT query.
|
||||||
* @param string generator name
|
* @param string generator name
|
||||||
@@ -158,6 +161,7 @@ class DibiFirebirdDriver extends DibiObject implements IDibiDriver, IDibiResultD
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Begins a transaction (if supported).
|
* Begins a transaction (if supported).
|
||||||
* @param string optional savepoint name
|
* @param string optional savepoint name
|
||||||
@@ -174,6 +178,7 @@ class DibiFirebirdDriver extends DibiObject implements IDibiDriver, IDibiResultD
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Commits statements in a transaction.
|
* Commits statements in a transaction.
|
||||||
* @param string optional savepoint name
|
* @param string optional savepoint name
|
||||||
@@ -194,6 +199,7 @@ class DibiFirebirdDriver extends DibiObject implements IDibiDriver, IDibiResultD
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Rollback changes in a transaction.
|
* Rollback changes in a transaction.
|
||||||
* @param string optional savepoint name
|
* @param string optional savepoint name
|
||||||
@@ -214,6 +220,7 @@ class DibiFirebirdDriver extends DibiObject implements IDibiDriver, IDibiResultD
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Is in transaction?
|
* Is in transaction?
|
||||||
* @return bool
|
* @return bool
|
||||||
@@ -224,6 +231,7 @@ class DibiFirebirdDriver extends DibiObject implements IDibiDriver, IDibiResultD
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the connection resource.
|
* Returns the connection resource.
|
||||||
* @return resource
|
* @return resource
|
||||||
@@ -234,6 +242,7 @@ class DibiFirebirdDriver extends DibiObject implements IDibiDriver, IDibiResultD
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the connection reflector.
|
* Returns the connection reflector.
|
||||||
* @return IDibiReflector
|
* @return IDibiReflector
|
||||||
@@ -244,6 +253,7 @@ class DibiFirebirdDriver extends DibiObject implements IDibiDriver, IDibiResultD
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Result set driver factory.
|
* Result set driver factory.
|
||||||
* @param resource
|
* @param resource
|
||||||
@@ -257,9 +267,11 @@ class DibiFirebirdDriver extends DibiObject implements IDibiDriver, IDibiResultD
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************* SQL ********************/
|
/********************* SQL ********************/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encodes data for use in a SQL statement.
|
* Encodes data for use in a SQL statement.
|
||||||
* @param mixed value
|
* @param mixed value
|
||||||
@@ -270,28 +282,29 @@ class DibiFirebirdDriver extends DibiObject implements IDibiDriver, IDibiResultD
|
|||||||
public function escape($value, $type)
|
public function escape($value, $type)
|
||||||
{
|
{
|
||||||
switch ($type) {
|
switch ($type) {
|
||||||
case dibi::TEXT:
|
case dibi::TEXT:
|
||||||
case dibi::BINARY:
|
case dibi::BINARY:
|
||||||
return "'" . str_replace("'", "''", $value) . "'";
|
return "'" . str_replace("'", "''", $value) . "'";
|
||||||
|
|
||||||
case dibi::IDENTIFIER:
|
case dibi::IDENTIFIER:
|
||||||
return $value;
|
return $value;
|
||||||
|
|
||||||
case dibi::BOOL:
|
case dibi::BOOL:
|
||||||
return $value ? 1 : 0;
|
return $value ? 1 : 0;
|
||||||
|
|
||||||
case dibi::DATE:
|
case dibi::DATE:
|
||||||
return $value instanceof DateTime ? $value->format("'Y-m-d'") : date("'Y-m-d'", $value);
|
return $value instanceof DateTime ? $value->format("'Y-m-d'") : date("'Y-m-d'", $value);
|
||||||
|
|
||||||
case dibi::DATETIME:
|
case dibi::DATETIME:
|
||||||
return $value instanceof DateTime ? $value->format("'Y-m-d H:i:s'") : date("'Y-m-d H:i:s'", $value);
|
return $value instanceof DateTime ? $value->format("'Y-m-d H:i:s'") : date("'Y-m-d H:i:s'", $value);
|
||||||
|
|
||||||
default:
|
default:
|
||||||
throw new InvalidArgumentException('Unsupported type.');
|
throw new InvalidArgumentException('Unsupported type.');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encodes string for use in a LIKE statement.
|
* Encodes string for use in a LIKE statement.
|
||||||
* @param string
|
* @param string
|
||||||
@@ -304,6 +317,7 @@ class DibiFirebirdDriver extends DibiObject implements IDibiDriver, IDibiResultD
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decodes data from result set.
|
* Decodes data from result set.
|
||||||
* @param string value
|
* @param string value
|
||||||
@@ -320,22 +334,28 @@ class DibiFirebirdDriver extends DibiObject implements IDibiDriver, IDibiResultD
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Injects LIMIT/OFFSET to the SQL query.
|
* Injects LIMIT/OFFSET to the SQL query.
|
||||||
|
* @param string &$sql The SQL query that will be modified.
|
||||||
|
* @param int $limit
|
||||||
|
* @param int $offset
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function applyLimit(& $sql, $limit, $offset)
|
public function applyLimit(&$sql, $limit, $offset)
|
||||||
{
|
{
|
||||||
if ($limit >= 0 && $offset > 0) {
|
if ($limit < 0 && $offset < 1) return;
|
||||||
// see http://scott.yang.id.au/2004/01/limit-in-select-statements-in-firebird/
|
|
||||||
$sql = 'SELECT FIRST ' . (int) $limit . ($offset > 0 ? ' SKIP ' . (int) $offset : '') . ' * FROM (' . $sql . ')';
|
// see http://scott.yang.id.au/2004/01/limit-in-select-statements-in-firebird/
|
||||||
}
|
$sql = 'SELECT FIRST ' . (int) $limit . ($offset > 0 ? ' SKIP ' . (int) $offset : '') . ' * FROM (' . $sql . ')';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************* result set ********************/
|
/********************* result set ********************/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Automatically frees the resources allocated for this result set.
|
* Automatically frees the resources allocated for this result set.
|
||||||
* @return void
|
* @return void
|
||||||
@@ -346,16 +366,18 @@ class DibiFirebirdDriver extends DibiObject implements IDibiDriver, IDibiResultD
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the number of rows in a result set.
|
* Returns the number of rows in a result set.
|
||||||
* @return int
|
* @return int
|
||||||
*/
|
*/
|
||||||
public function getRowCount()
|
public function getRowCount()
|
||||||
{
|
{
|
||||||
throw new DibiNotSupportedException("Firebird/Interbase do not support returning number of rows in result set.");
|
return ibase_num_fields($this->resultSet);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fetches the row at current position and moves the internal cursor to the next position.
|
* Fetches the row at current position and moves the internal cursor to the next position.
|
||||||
* @param bool TRUE for associative array, FALSE for numeric
|
* @param bool TRUE for associative array, FALSE for numeric
|
||||||
@@ -368,7 +390,7 @@ class DibiFirebirdDriver extends DibiObject implements IDibiDriver, IDibiResultD
|
|||||||
|
|
||||||
if (DibiDriverException::catchError($msg)) {
|
if (DibiDriverException::catchError($msg)) {
|
||||||
if (ibase_errcode() == self::ERROR_EXCEPTION_THROWN) {
|
if (ibase_errcode() == self::ERROR_EXCEPTION_THROWN) {
|
||||||
preg_match('/exception (\d+) (\w+) (.*)/is', ibase_errmsg(), $match);
|
preg_match('/exception (\d+) (\w+) (.*)/i', ibase_errmsg(), $match);
|
||||||
throw new DibiProcedureException($match[3], $match[1], $match[2], dibi::$sql);
|
throw new DibiProcedureException($match[3], $match[1], $match[2], dibi::$sql);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@@ -380,6 +402,7 @@ class DibiFirebirdDriver extends DibiObject implements IDibiDriver, IDibiResultD
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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
|
||||||
@@ -392,6 +415,7 @@ class DibiFirebirdDriver extends DibiObject implements IDibiDriver, IDibiResultD
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Frees the resources allocated for this result set.
|
* Frees the resources allocated for this result set.
|
||||||
* @return void
|
* @return void
|
||||||
@@ -403,6 +427,7 @@ class DibiFirebirdDriver extends DibiObject implements IDibiDriver, IDibiResultD
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the result set resource.
|
* Returns the result set resource.
|
||||||
* @return mysqli_result
|
* @return mysqli_result
|
||||||
@@ -414,6 +439,7 @@ class DibiFirebirdDriver extends DibiObject implements IDibiDriver, IDibiResultD
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns metadata for all columns in a result set.
|
* Returns metadata for all columns in a result set.
|
||||||
* @return array
|
* @return array
|
||||||
@@ -435,9 +461,11 @@ class DibiFirebirdDriver extends DibiObject implements IDibiDriver, IDibiResultD
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************* IDibiReflector ********************/
|
/********************* IDibiReflector ********************/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns list of tables.
|
* Returns list of tables.
|
||||||
* @return array
|
* @return array
|
||||||
@@ -461,6 +489,7 @@ class DibiFirebirdDriver extends DibiObject implements IDibiDriver, IDibiResultD
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns metadata for all columns in a table.
|
* Returns metadata for all columns in a table.
|
||||||
* @param string
|
* @param string
|
||||||
@@ -516,6 +545,7 @@ class DibiFirebirdDriver extends DibiObject implements IDibiDriver, IDibiResultD
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns metadata for all indexes in a table (the constraints are included).
|
* Returns metadata for all indexes in a table (the constraints are included).
|
||||||
* @param string
|
* @param string
|
||||||
@@ -550,6 +580,7 @@ class DibiFirebirdDriver extends DibiObject implements IDibiDriver, IDibiResultD
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns metadata for all foreign keys in a table.
|
* Returns metadata for all foreign keys in a table.
|
||||||
* @param string
|
* @param string
|
||||||
@@ -580,6 +611,7 @@ class DibiFirebirdDriver extends DibiObject implements IDibiDriver, IDibiResultD
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns list of indices in given table (the constraints are not listed).
|
* Returns list of indices in given table (the constraints are not listed).
|
||||||
* @param string
|
* @param string
|
||||||
@@ -602,6 +634,7 @@ class DibiFirebirdDriver extends DibiObject implements IDibiDriver, IDibiResultD
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns list of constraints in given table.
|
* Returns list of constraints in given table.
|
||||||
* @param string
|
* @param string
|
||||||
@@ -626,6 +659,7 @@ class DibiFirebirdDriver extends DibiObject implements IDibiDriver, IDibiResultD
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns metadata for all triggers in a table or database.
|
* Returns metadata for all triggers in a table or database.
|
||||||
* (Only if user has permissions on ALTER TABLE, INSERT/UPDATE/DELETE record in table)
|
* (Only if user has permissions on ALTER TABLE, INSERT/UPDATE/DELETE record in table)
|
||||||
@@ -675,6 +709,7 @@ class DibiFirebirdDriver extends DibiObject implements IDibiDriver, IDibiResultD
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns list of triggers for given table.
|
* Returns list of triggers for given table.
|
||||||
* (Only if user has permissions on ALTER TABLE, INSERT/UPDATE/DELETE record in table)
|
* (Only if user has permissions on ALTER TABLE, INSERT/UPDATE/DELETE record in table)
|
||||||
@@ -697,6 +732,7 @@ class DibiFirebirdDriver extends DibiObject implements IDibiDriver, IDibiResultD
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns metadata from stored procedures and their input and output parameters.
|
* Returns metadata from stored procedures and their input and output parameters.
|
||||||
* @param string
|
* @param string
|
||||||
@@ -750,6 +786,7 @@ class DibiFirebirdDriver extends DibiObject implements IDibiDriver, IDibiResultD
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns list of stored procedures.
|
* Returns list of stored procedures.
|
||||||
* @return array
|
* @return array
|
||||||
@@ -768,6 +805,7 @@ class DibiFirebirdDriver extends DibiObject implements IDibiDriver, IDibiResultD
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns list of generators.
|
* Returns list of generators.
|
||||||
* @return array
|
* @return array
|
||||||
@@ -787,6 +825,7 @@ class DibiFirebirdDriver extends DibiObject implements IDibiDriver, IDibiResultD
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns list of user defined functions (UDF).
|
* Returns list of user defined functions (UDF).
|
||||||
* @return array
|
* @return array
|
||||||
@@ -808,6 +847,8 @@ class DibiFirebirdDriver extends DibiObject implements IDibiDriver, IDibiResultD
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Database procedure exception.
|
* Database procedure exception.
|
||||||
*
|
*
|
||||||
@@ -834,6 +875,7 @@ class DibiProcedureException extends DibiException
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the exception severity.
|
* Gets the exception severity.
|
||||||
* @return string
|
* @return string
|
@@ -9,7 +9,7 @@
|
|||||||
* the file license.txt that was distributed with this source code.
|
* the file license.txt that was distributed with this source code.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
require_once dirname(__FILE__) . '/DibiMsSqlReflector.php';
|
require_once dirname(__FILE__) . '/mssql.reflector.php';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The dibi driver for MS SQL database.
|
* The dibi driver for MS SQL database.
|
||||||
@@ -38,6 +38,7 @@ class DibiMsSqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriv
|
|||||||
private $autoFree = TRUE;
|
private $autoFree = TRUE;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @throws DibiNotSupportedException
|
* @throws DibiNotSupportedException
|
||||||
*/
|
*/
|
||||||
@@ -49,12 +50,13 @@ class DibiMsSqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriv
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Connects to a database.
|
* Connects to a database.
|
||||||
* @return void
|
* @return void
|
||||||
* @throws DibiException
|
* @throws DibiException
|
||||||
*/
|
*/
|
||||||
public function connect(array & $config)
|
public function connect(array &$config)
|
||||||
{
|
{
|
||||||
if (isset($config['resource'])) {
|
if (isset($config['resource'])) {
|
||||||
$this->connection = $config['resource'];
|
$this->connection = $config['resource'];
|
||||||
@@ -74,6 +76,7 @@ class DibiMsSqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriv
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Disconnects from a database.
|
* Disconnects from a database.
|
||||||
* @return void
|
* @return void
|
||||||
@@ -84,6 +87,7 @@ class DibiMsSqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriv
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Executes the SQL query.
|
* Executes the SQL query.
|
||||||
* @param string SQL statement.
|
* @param string SQL statement.
|
||||||
@@ -103,6 +107,7 @@ class DibiMsSqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriv
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the number of affected rows by the last INSERT, UPDATE or DELETE query.
|
* Gets the number of affected rows by the last INSERT, UPDATE or DELETE query.
|
||||||
* @return int|FALSE number of rows or FALSE on error
|
* @return int|FALSE number of rows or FALSE on error
|
||||||
@@ -113,6 +118,7 @@ class DibiMsSqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriv
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves the ID generated for an AUTO_INCREMENT column by the previous INSERT query.
|
* Retrieves the ID generated for an AUTO_INCREMENT column by the previous INSERT query.
|
||||||
* @return int|FALSE int on success or FALSE on failure
|
* @return int|FALSE int on success or FALSE on failure
|
||||||
@@ -128,6 +134,7 @@ class DibiMsSqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriv
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Begins a transaction (if supported).
|
* Begins a transaction (if supported).
|
||||||
* @param string optional savepoint name
|
* @param string optional savepoint name
|
||||||
@@ -140,6 +147,7 @@ class DibiMsSqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriv
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Commits statements in a transaction.
|
* Commits statements in a transaction.
|
||||||
* @param string optional savepoint name
|
* @param string optional savepoint name
|
||||||
@@ -152,6 +160,7 @@ class DibiMsSqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriv
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Rollback changes in a transaction.
|
* Rollback changes in a transaction.
|
||||||
* @param string optional savepoint name
|
* @param string optional savepoint name
|
||||||
@@ -164,6 +173,7 @@ class DibiMsSqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriv
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the connection resource.
|
* Returns the connection resource.
|
||||||
* @return mixed
|
* @return mixed
|
||||||
@@ -174,6 +184,7 @@ class DibiMsSqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriv
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the connection reflector.
|
* Returns the connection reflector.
|
||||||
* @return IDibiReflector
|
* @return IDibiReflector
|
||||||
@@ -184,6 +195,7 @@ class DibiMsSqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriv
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Result set driver factory.
|
* Result set driver factory.
|
||||||
* @param resource
|
* @param resource
|
||||||
@@ -197,9 +209,11 @@ class DibiMsSqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriv
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************* SQL ****************d*g**/
|
/********************* SQL ****************d*g**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encodes data for use in a SQL statement.
|
* Encodes data for use in a SQL statement.
|
||||||
* @param mixed value
|
* @param mixed value
|
||||||
@@ -210,29 +224,30 @@ class DibiMsSqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriv
|
|||||||
public function escape($value, $type)
|
public function escape($value, $type)
|
||||||
{
|
{
|
||||||
switch ($type) {
|
switch ($type) {
|
||||||
case dibi::TEXT:
|
case dibi::TEXT:
|
||||||
case dibi::BINARY:
|
case dibi::BINARY:
|
||||||
return "'" . str_replace("'", "''", $value) . "'";
|
return "'" . str_replace("'", "''", $value) . "'";
|
||||||
|
|
||||||
case dibi::IDENTIFIER:
|
case dibi::IDENTIFIER:
|
||||||
// @see http://msdn.microsoft.com/en-us/library/ms176027.aspx
|
// @see http://msdn.microsoft.com/en-us/library/ms176027.aspx
|
||||||
return '[' . str_replace(array('[', ']'), array('[[', ']]'), $value) . ']';
|
return '[' . str_replace(array('[', ']'), array('[[', ']]'), $value) . ']';
|
||||||
|
|
||||||
case dibi::BOOL:
|
case dibi::BOOL:
|
||||||
return $value ? 1 : 0;
|
return $value ? 1 : 0;
|
||||||
|
|
||||||
case dibi::DATE:
|
case dibi::DATE:
|
||||||
return $value instanceof DateTime ? $value->format("'Y-m-d'") : date("'Y-m-d'", $value);
|
return $value instanceof DateTime ? $value->format("'Y-m-d'") : date("'Y-m-d'", $value);
|
||||||
|
|
||||||
case dibi::DATETIME:
|
case dibi::DATETIME:
|
||||||
return $value instanceof DateTime ? $value->format("'Y-m-d H:i:s'") : date("'Y-m-d H:i:s'", $value);
|
return $value instanceof DateTime ? $value->format("'Y-m-d H:i:s'") : date("'Y-m-d H:i:s'", $value);
|
||||||
|
|
||||||
default:
|
default:
|
||||||
throw new InvalidArgumentException('Unsupported type.');
|
throw new InvalidArgumentException('Unsupported type.');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encodes string for use in a LIKE statement.
|
* Encodes string for use in a LIKE statement.
|
||||||
* @param string
|
* @param string
|
||||||
@@ -246,6 +261,7 @@ class DibiMsSqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriv
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decodes data from result set.
|
* Decodes data from result set.
|
||||||
* @param string value
|
* @param string value
|
||||||
@@ -262,11 +278,15 @@ class DibiMsSqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriv
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Injects LIMIT/OFFSET to the SQL query.
|
* Injects LIMIT/OFFSET to the SQL query.
|
||||||
|
* @param string &$sql The SQL query that will be modified.
|
||||||
|
* @param int $limit
|
||||||
|
* @param int $offset
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function applyLimit(& $sql, $limit, $offset)
|
public function applyLimit(&$sql, $limit, $offset)
|
||||||
{
|
{
|
||||||
// offset support is missing
|
// offset support is missing
|
||||||
if ($limit >= 0) {
|
if ($limit >= 0) {
|
||||||
@@ -279,9 +299,11 @@ class DibiMsSqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriv
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************* result set ****************d*g**/
|
/********************* result set ****************d*g**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Automatically frees the resources allocated for this result set.
|
* Automatically frees the resources allocated for this result set.
|
||||||
* @return void
|
* @return void
|
||||||
@@ -292,6 +314,7 @@ class DibiMsSqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriv
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the number of rows in a result set.
|
* Returns the number of rows in a result set.
|
||||||
* @return int
|
* @return int
|
||||||
@@ -302,6 +325,7 @@ class DibiMsSqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriv
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fetches the row at current position and moves the internal cursor to the next position.
|
* Fetches the row at current position and moves the internal cursor to the next position.
|
||||||
* @param bool TRUE for associative array, FALSE for numeric
|
* @param bool TRUE for associative array, FALSE for numeric
|
||||||
@@ -313,6 +337,7 @@ class DibiMsSqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriv
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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
|
||||||
@@ -324,6 +349,7 @@ class DibiMsSqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriv
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Frees the resources allocated for this result set.
|
* Frees the resources allocated for this result set.
|
||||||
* @return void
|
* @return void
|
||||||
@@ -335,6 +361,7 @@ class DibiMsSqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriv
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns metadata for all columns in a result set.
|
* Returns metadata for all columns in a result set.
|
||||||
* @return array
|
* @return array
|
||||||
@@ -356,6 +383,7 @@ class DibiMsSqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriv
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the result set resource.
|
* Returns the result set resource.
|
||||||
* @return mixed
|
* @return mixed
|
444
dibi/drivers/DibiMsSqlReflector.php → dibi/drivers/mssql.reflector.php
Normal file → Executable file
444
dibi/drivers/DibiMsSqlReflector.php → dibi/drivers/mssql.reflector.php
Normal file → Executable file
@@ -1,219 +1,225 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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, 2010 David Grudl (http://davidgrudl.com)
|
* Copyright (c) 2005, 2010 David Grudl (http://davidgrudl.com)
|
||||||
*
|
*
|
||||||
* For the full copyright and license information, please view
|
* For the full copyright and license information, please view
|
||||||
* the file license.txt that was distributed with this source code.
|
* the file license.txt that was distributed with this source code.
|
||||||
*
|
*
|
||||||
* @package dibi\drivers
|
* @package dibi\drivers
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The dibi reflector for MsSQL databases.
|
* The dibi reflector for MsSQL databases.
|
||||||
*
|
*
|
||||||
* @author Steven Bredenberg
|
* @author Steven Bredenberg
|
||||||
* @package dibi\drivers
|
* @package dibi\drivers
|
||||||
* @internal
|
* @internal
|
||||||
*/
|
*/
|
||||||
class DibiMsSqlReflector extends DibiObject implements IDibiReflector
|
class DibiMsSqlReflector extends DibiObject implements IDibiReflector
|
||||||
{
|
{
|
||||||
/** @var IDibiDriver */
|
/** @var IDibiDriver */
|
||||||
private $driver;
|
private $driver;
|
||||||
|
|
||||||
|
|
||||||
public function __construct(IDibiDriver $driver)
|
|
||||||
{
|
public function __construct(IDibiDriver $driver)
|
||||||
$this->driver = $driver;
|
{
|
||||||
}
|
$this->driver = $driver;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns list of tables.
|
|
||||||
* @return array
|
/**
|
||||||
*/
|
* Returns list of tables.
|
||||||
public function getTables()
|
* @return array
|
||||||
{
|
*/
|
||||||
$res = $this->driver->query("
|
public function getTables()
|
||||||
SELECT TABLE_NAME, TABLE_TYPE
|
{
|
||||||
FROM INFORMATION_SCHEMA.TABLES
|
$res = $this->driver->query("
|
||||||
");
|
SELECT TABLE_NAME, TABLE_TYPE
|
||||||
$tables = array();
|
FROM INFORMATION_SCHEMA.TABLES
|
||||||
while ($row = $res->fetch(FALSE)) {
|
");
|
||||||
$tables[] = array(
|
$tables = array();
|
||||||
'name' => $row[0],
|
while ($row = $res->fetch(FALSE)) {
|
||||||
'view' => isset($row[1]) && $row[1] === 'VIEW',
|
$tables[] = array(
|
||||||
);
|
'name' => $row[0],
|
||||||
}
|
'view' => isset($row[1]) && $row[1] === 'VIEW',
|
||||||
return $tables;
|
);
|
||||||
}
|
}
|
||||||
|
return $tables;
|
||||||
|
}
|
||||||
/**
|
|
||||||
* Returns count of rows in a table
|
|
||||||
* @param string
|
|
||||||
* @return integer
|
/**
|
||||||
*/
|
* Returns count of rows in a table
|
||||||
public function getTableCount($table, $fallback=true)
|
* @param string
|
||||||
{
|
* @return integer
|
||||||
if (empty($table)) {
|
*/
|
||||||
return false;
|
public function getTableCount($table, $fallback=true)
|
||||||
}
|
{
|
||||||
$result = $this->driver->query("
|
if (empty($table)) {
|
||||||
SELECT MAX(rowcnt)
|
return false;
|
||||||
FROM sys.sysindexes
|
}
|
||||||
WHERE id=OBJECT_ID({$this->driver->escape($table, dibi::IDENTIFIER)})
|
$result = $this->driver->query("
|
||||||
");
|
SELECT MAX(rowcnt)
|
||||||
$row = $result->fetch(FALSE);
|
FROM sys.sysindexes
|
||||||
|
WHERE id=OBJECT_ID({$this->driver->escape($table, dibi::IDENTIFIER)})
|
||||||
if (!is_array($row) || count($row) < 1) {
|
");
|
||||||
if ($fallback) {
|
$row = $result->fetch(FALSE);
|
||||||
$row = $this->driver->query("SELECT COUNT(*) FROM {$this->driver->escape($table, dibi::IDENTIFIER)}")->fetch(FALSE);
|
|
||||||
$count = intval($row[0]);
|
if (!is_array($row) || count($row) < 1) {
|
||||||
} else {
|
if ($fallback) {
|
||||||
$count = false;
|
$row = $this->driver->query("SELECT COUNT(*) FROM {$this->driver->escape($table, dibi::IDENTIFIER)}")->fetch(FALSE);
|
||||||
}
|
$count = intval($row[0]);
|
||||||
} else {
|
} else {
|
||||||
$count = intval($row[0]);
|
$count = false;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
return $count;
|
$count = intval($row[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return $count;
|
||||||
/**
|
}
|
||||||
* Returns metadata for all columns in a table.
|
|
||||||
* @param string
|
|
||||||
* @return array
|
|
||||||
*/
|
/**
|
||||||
public function getColumns($table)
|
* Returns metadata for all columns in a table.
|
||||||
{
|
* @param string
|
||||||
$res = $this->driver->query("
|
* @return array
|
||||||
SELECT * FROM
|
*/
|
||||||
INFORMATION_SCHEMA.COLUMNS
|
public function getColumns($table)
|
||||||
WHERE TABLE_NAME = {$this->driver->escape($table, dibi::TEXT)}
|
{
|
||||||
ORDER BY TABLE_NAME, ORDINAL_POSITION
|
$res = $this->driver->query("
|
||||||
");
|
SELECT * FROM
|
||||||
$columns = array();
|
INFORMATION_SCHEMA.COLUMNS
|
||||||
while ($row = $res->fetch(TRUE)) {
|
WHERE TABLE_NAME = {$this->driver->escape($table, dibi::TEXT)}
|
||||||
$size = false;
|
ORDER BY TABLE_NAME, ORDINAL_POSITION
|
||||||
$type = strtoupper($row['DATA_TYPE']);
|
");
|
||||||
|
$columns = array();
|
||||||
$size_cols = array(
|
while ($row = $res->fetch(TRUE)) {
|
||||||
'DATETIME'=>'DATETIME_PRECISION',
|
$size = false;
|
||||||
'DECIMAL'=>'NUMERIC_PRECISION',
|
$type = strtoupper($row['DATA_TYPE']);
|
||||||
'CHAR'=>'CHARACTER_MAXIMUM_LENGTH',
|
|
||||||
'NCHAR'=>'CHARACTER_OCTET_LENGTH',
|
$size_cols = array(
|
||||||
'NVARCHAR'=>'CHARACTER_OCTET_LENGTH',
|
'DATETIME'=>'DATETIME_PRECISION',
|
||||||
'VARCHAR'=>'CHARACTER_OCTET_LENGTH'
|
'DECIMAL'=>'NUMERIC_PRECISION',
|
||||||
);
|
'CHAR'=>'CHARACTER_MAXIMUM_LENGTH',
|
||||||
|
'NCHAR'=>'CHARACTER_OCTET_LENGTH',
|
||||||
if (isset($size_cols[$type])) {
|
'NVARCHAR'=>'CHARACTER_OCTET_LENGTH',
|
||||||
if ($size_cols[$type]) {
|
'VARCHAR'=>'CHARACTER_OCTET_LENGTH'
|
||||||
$size = $row[$size_cols[$type]];
|
);
|
||||||
}
|
|
||||||
}
|
if (isset($size_cols[$type])) {
|
||||||
|
if ($size_cols[$type]) {
|
||||||
$columns[] = array(
|
$size = $row[$size_cols[$type]];
|
||||||
'name' => $row['COLUMN_NAME'],
|
}
|
||||||
'table' => $table,
|
}
|
||||||
'nativetype' => $type,
|
|
||||||
'size' => $size,
|
$columns[] = array(
|
||||||
'unsigned' => NULL,
|
'name' => $row['COLUMN_NAME'],
|
||||||
'nullable' => $row['IS_NULLABLE'] === 'YES',
|
'table' => $table,
|
||||||
'default' => $row['COLUMN_DEFAULT'],
|
'nativetype' => $type,
|
||||||
'autoincrement' => false,
|
'size' => $size,
|
||||||
'vendor' => $row,
|
'unsigned' => NULL,
|
||||||
);
|
'nullable' => $row['IS_NULLABLE'] === 'YES',
|
||||||
}
|
'default' => $row['COLUMN_DEFAULT'],
|
||||||
|
'autoincrement' => false,
|
||||||
return $columns;
|
'vendor' => $row,
|
||||||
}
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
return $columns;
|
||||||
* Returns metadata for all indexes in a table.
|
}
|
||||||
* @param string
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function getIndexes($table)
|
/**
|
||||||
{
|
* Returns metadata for all indexes in a table.
|
||||||
$res = $this->driver->query(
|
* @param string
|
||||||
"SELECT ind.name index_name, ind.index_id, ic.index_column_id,
|
* @return array
|
||||||
col.name column_name, ind.is_unique, ind.is_primary_key
|
*/
|
||||||
FROM sys.indexes ind
|
public function getIndexes($table)
|
||||||
INNER JOIN sys.index_columns ic ON
|
{
|
||||||
(ind.object_id = ic.object_id AND ind.index_id = ic.index_id)
|
$res = $this->driver->query(
|
||||||
INNER JOIN sys.columns col ON
|
"SELECT ind.name index_name, ind.index_id, ic.index_column_id,
|
||||||
(ic.object_id = col.object_id and ic.column_id = col.column_id)
|
col.name column_name, ind.is_unique, ind.is_primary_key
|
||||||
INNER JOIN sys.tables t ON
|
FROM sys.indexes ind
|
||||||
(ind.object_id = t.object_id)
|
INNER JOIN sys.index_columns ic ON
|
||||||
WHERE t.name = {$this->driver->escape($table, dibi::TEXT)}
|
(ind.object_id = ic.object_id AND ind.index_id = ic.index_id)
|
||||||
AND t.is_ms_shipped = 0
|
INNER JOIN sys.columns col ON
|
||||||
ORDER BY
|
(ic.object_id = col.object_id and ic.column_id = col.column_id)
|
||||||
t.name, ind.name, ind.index_id, ic.index_column_id
|
INNER JOIN sys.tables t ON
|
||||||
");
|
(ind.object_id = t.object_id)
|
||||||
|
WHERE t.name = {$this->driver->escape($table, dibi::TEXT)}
|
||||||
$indexes = array();
|
AND t.is_ms_shipped = 0
|
||||||
while ($row = $res->fetch(TRUE)) {
|
ORDER BY
|
||||||
$index_name = $row['index_name'];
|
t.name, ind.name, ind.index_id, ic.index_column_id
|
||||||
|
");
|
||||||
if (!isset($indexes[$index_name])) {
|
|
||||||
$indexes[$index_name] = array();
|
$indexes = array();
|
||||||
$indexes[$index_name]['name'] = $index_name;
|
while ($row = $res->fetch(TRUE)) {
|
||||||
$indexes[$index_name]['unique'] = (bool)$row['is_unique'];
|
$index_name = $row['index_name'];
|
||||||
$indexes[$index_name]['primary'] = (bool)$row['is_primary_key'];
|
|
||||||
$indexes[$index_name]['columns'] = array();
|
if (!isset($indexes[$index_name])) {
|
||||||
}
|
$indexes[$index_name] = array();
|
||||||
$indexes[$index_name]['columns'][] = $row['column_name'];
|
$indexes[$index_name]['name'] = $index_name;
|
||||||
}
|
$indexes[$index_name]['unique'] = (bool)$row['is_unique'];
|
||||||
|
$indexes[$index_name]['primary'] = (bool)$row['is_primary_key'];
|
||||||
return array_values($indexes);
|
$indexes[$index_name]['columns'] = array();
|
||||||
}
|
}
|
||||||
|
$indexes[$index_name]['columns'][] = $row['column_name'];
|
||||||
|
}
|
||||||
/**
|
|
||||||
* Returns metadata for all foreign keys in a table.
|
return array_values($indexes);
|
||||||
* @param string
|
}
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function getForeignKeys($table)
|
|
||||||
{
|
/**
|
||||||
$res = $this->driver->query("
|
* Returns metadata for all foreign keys in a table.
|
||||||
SELECT f.name AS foreign_key,
|
* @param string
|
||||||
OBJECT_NAME(f.parent_object_id) AS table_name,
|
* @return array
|
||||||
COL_NAME(fc.parent_object_id,
|
*/
|
||||||
fc.parent_column_id) AS column_name,
|
public function getForeignKeys($table)
|
||||||
OBJECT_NAME (f.referenced_object_id) AS reference_table_name,
|
{
|
||||||
COL_NAME(fc.referenced_object_id,
|
$res = $this->driver->query("
|
||||||
fc.referenced_column_id) AS reference_column_name,
|
SELECT f.name AS foreign_key,
|
||||||
fc.*
|
OBJECT_NAME(f.parent_object_id) AS table_name,
|
||||||
FROM sys.foreign_keys AS f
|
COL_NAME(fc.parent_object_id,
|
||||||
INNER JOIN sys.foreign_key_columns AS fc
|
fc.parent_column_id) AS column_name,
|
||||||
ON f.OBJECT_ID = fc.constraint_object_id
|
OBJECT_NAME (f.referenced_object_id) AS reference_table_name,
|
||||||
WHERE OBJECT_NAME(f.parent_object_id) = {$this->driver->escape($table, dibi::TEXT)}
|
COL_NAME(fc.referenced_object_id,
|
||||||
");
|
fc.referenced_column_id) AS reference_column_name,
|
||||||
|
fc.*
|
||||||
$keys = array();
|
FROM sys.foreign_keys AS f
|
||||||
while ($row = $res->fetch(TRUE)) {
|
INNER JOIN sys.foreign_key_columns AS fc
|
||||||
$key_name = $row['foreign_key'];
|
ON f.OBJECT_ID = fc.constraint_object_id
|
||||||
|
WHERE OBJECT_NAME(f.parent_object_id) = {$this->driver->escape($table, dibi::TEXT)}
|
||||||
if (!isset($keys[$key_name])) {
|
");
|
||||||
$keys[$key_name]['name'] = $row['foreign_key']; // foreign key name
|
|
||||||
$keys[$key_name]['local'] = array($row['column_name']); // local columns
|
$keys = array();
|
||||||
$keys[$key_name]['table'] = $row['reference_table_name']; // referenced table
|
while ($row = $res->fetch(TRUE)) {
|
||||||
$keys[$key_name]['foreign'] = array($row['reference_column_name']); // referenced columns
|
$key_name = $row['foreign_key'];
|
||||||
$keys[$key_name]['onDelete'] = false;
|
|
||||||
$keys[$key_name]['onUpdate'] = false;
|
if (!isset($keys[$key_name])) {
|
||||||
} else {
|
$keys[$key_name]['name'] = $row['foreign_key']; // foreign key name
|
||||||
$keys[$key_name]['local'][] = $row['column_name']; // local columns
|
$keys[$key_name]['local'] = array($row['column_name']); // local columns
|
||||||
$keys[$key_name]['foreign'][] = $row['reference_column_name']; // referenced columns
|
$keys[$key_name]['table'] = $row['reference_table_name']; // referenced table
|
||||||
}
|
$keys[$key_name]['foreign'] = array($row['reference_column_name']); // referenced columns
|
||||||
}
|
$keys[$key_name]['onDelete'] = false;
|
||||||
return array_values($keys);
|
$keys[$key_name]['onUpdate'] = false;
|
||||||
}
|
} else {
|
||||||
|
$keys[$key_name]['local'][] = $row['column_name']; // local columns
|
||||||
}
|
$keys[$key_name]['foreign'][] = $row['reference_column_name']; // referenced columns
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return array_values($keys);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -10,9 +10,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
require_once dirname(__FILE__) . '/DibiMsSql2005Reflector.php';
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The dibi driver for MS SQL Driver 2005 database.
|
* The dibi driver for MS SQL Driver 2005 database.
|
||||||
*
|
*
|
||||||
@@ -44,6 +41,7 @@ class DibiMsSql2005Driver extends DibiObject implements IDibiDriver, IDibiResult
|
|||||||
private $affectedRows = FALSE;
|
private $affectedRows = FALSE;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @throws DibiNotSupportedException
|
* @throws DibiNotSupportedException
|
||||||
*/
|
*/
|
||||||
@@ -55,12 +53,13 @@ class DibiMsSql2005Driver extends DibiObject implements IDibiDriver, IDibiResult
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Connects to a database.
|
* Connects to a database.
|
||||||
* @return void
|
* @return void
|
||||||
* @throws DibiException
|
* @throws DibiException
|
||||||
*/
|
*/
|
||||||
public function connect(array & $config)
|
public function connect(array &$config)
|
||||||
{
|
{
|
||||||
DibiConnection::alias($config, 'options|UID', 'username');
|
DibiConnection::alias($config, 'options|UID', 'username');
|
||||||
DibiConnection::alias($config, 'options|PWD', 'password');
|
DibiConnection::alias($config, 'options|PWD', 'password');
|
||||||
@@ -71,11 +70,6 @@ class DibiMsSql2005Driver extends DibiObject implements IDibiDriver, IDibiResult
|
|||||||
$this->connection = $config['resource'];
|
$this->connection = $config['resource'];
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// Default values
|
|
||||||
if (!isset($config['options']['CharacterSet'])) {
|
|
||||||
$config['options']['CharacterSet'] = 'UTF-8';
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->connection = sqlsrv_connect($config['host'], (array) $config['options']);
|
$this->connection = sqlsrv_connect($config['host'], (array) $config['options']);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -86,6 +80,7 @@ class DibiMsSql2005Driver extends DibiObject implements IDibiDriver, IDibiResult
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Disconnects from a database.
|
* Disconnects from a database.
|
||||||
* @return void
|
* @return void
|
||||||
@@ -96,6 +91,7 @@ class DibiMsSql2005Driver extends DibiObject implements IDibiDriver, IDibiResult
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Executes the SQL query.
|
* Executes the SQL query.
|
||||||
* @param string SQL statement.
|
* @param string SQL statement.
|
||||||
@@ -118,6 +114,7 @@ class DibiMsSql2005Driver extends DibiObject implements IDibiDriver, IDibiResult
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the number of affected rows by the last INSERT, UPDATE or DELETE query.
|
* Gets the number of affected rows by the last INSERT, UPDATE or DELETE query.
|
||||||
* @return int|FALSE number of rows or FALSE on error
|
* @return int|FALSE number of rows or FALSE on error
|
||||||
@@ -128,6 +125,7 @@ class DibiMsSql2005Driver extends DibiObject implements IDibiDriver, IDibiResult
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves the ID generated for an AUTO_INCREMENT column by the previous INSERT query.
|
* Retrieves the ID generated for an AUTO_INCREMENT column by the previous INSERT query.
|
||||||
* @return int|FALSE int on success or FALSE on failure
|
* @return int|FALSE int on success or FALSE on failure
|
||||||
@@ -143,6 +141,7 @@ class DibiMsSql2005Driver extends DibiObject implements IDibiDriver, IDibiResult
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Begins a transaction (if supported).
|
* Begins a transaction (if supported).
|
||||||
* @param string optional savepoint name
|
* @param string optional savepoint name
|
||||||
@@ -155,6 +154,7 @@ class DibiMsSql2005Driver extends DibiObject implements IDibiDriver, IDibiResult
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Commits statements in a transaction.
|
* Commits statements in a transaction.
|
||||||
* @param string optional savepoint name
|
* @param string optional savepoint name
|
||||||
@@ -167,6 +167,7 @@ class DibiMsSql2005Driver extends DibiObject implements IDibiDriver, IDibiResult
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Rollback changes in a transaction.
|
* Rollback changes in a transaction.
|
||||||
* @param string optional savepoint name
|
* @param string optional savepoint name
|
||||||
@@ -179,6 +180,7 @@ class DibiMsSql2005Driver extends DibiObject implements IDibiDriver, IDibiResult
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the connection resource.
|
* Returns the connection resource.
|
||||||
* @return mixed
|
* @return mixed
|
||||||
@@ -189,16 +191,18 @@ class DibiMsSql2005Driver extends DibiObject implements IDibiDriver, IDibiResult
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the connection reflector.
|
* Returns the connection reflector.
|
||||||
* @return IDibiReflector
|
* @return IDibiReflector
|
||||||
*/
|
*/
|
||||||
public function getReflector()
|
public function getReflector()
|
||||||
{
|
{
|
||||||
return new DibiMssql2005Reflector($this);
|
throw new DibiNotSupportedException;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Result set driver factory.
|
* Result set driver factory.
|
||||||
* @param resource
|
* @param resource
|
||||||
@@ -212,9 +216,11 @@ class DibiMsSql2005Driver extends DibiObject implements IDibiDriver, IDibiResult
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************* SQL ****************d*g**/
|
/********************* SQL ****************d*g**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encodes data for use in a SQL statement.
|
* Encodes data for use in a SQL statement.
|
||||||
* @param mixed value
|
* @param mixed value
|
||||||
@@ -225,29 +231,30 @@ class DibiMsSql2005Driver extends DibiObject implements IDibiDriver, IDibiResult
|
|||||||
public function escape($value, $type)
|
public function escape($value, $type)
|
||||||
{
|
{
|
||||||
switch ($type) {
|
switch ($type) {
|
||||||
case dibi::TEXT:
|
case dibi::TEXT:
|
||||||
case dibi::BINARY:
|
case dibi::BINARY:
|
||||||
return "'" . str_replace("'", "''", $value) . "'";
|
return "'" . str_replace("'", "''", $value) . "'";
|
||||||
|
|
||||||
case dibi::IDENTIFIER:
|
case dibi::IDENTIFIER:
|
||||||
// @see http://msdn.microsoft.com/en-us/library/ms176027.aspx
|
// @see http://msdn.microsoft.com/en-us/library/ms176027.aspx
|
||||||
return '[' . str_replace(']', ']]', $value) . ']';
|
return '[' . str_replace(array('[', ']'), array('[[', ']]'), $value) . ']';
|
||||||
|
|
||||||
case dibi::BOOL:
|
case dibi::BOOL:
|
||||||
return $value ? 1 : 0;
|
return $value ? 1 : 0;
|
||||||
|
|
||||||
case dibi::DATE:
|
case dibi::DATE:
|
||||||
return $value instanceof DateTime ? $value->format("'Y-m-d'") : date("'Y-m-d'", $value);
|
return $value instanceof DateTime ? $value->format("'Y-m-d'") : date("'Y-m-d'", $value);
|
||||||
|
|
||||||
case dibi::DATETIME:
|
case dibi::DATETIME:
|
||||||
return $value instanceof DateTime ? $value->format("'Y-m-d H:i:s'") : date("'Y-m-d H:i:s'", $value);
|
return $value instanceof DateTime ? $value->format("'Y-m-d H:i:s'") : date("'Y-m-d H:i:s'", $value);
|
||||||
|
|
||||||
default:
|
default:
|
||||||
throw new InvalidArgumentException('Unsupported type.');
|
throw new InvalidArgumentException('Unsupported type.');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encodes string for use in a LIKE statement.
|
* Encodes string for use in a LIKE statement.
|
||||||
* @param string
|
* @param string
|
||||||
@@ -261,6 +268,7 @@ class DibiMsSql2005Driver extends DibiObject implements IDibiDriver, IDibiResult
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decodes data from result set.
|
* Decodes data from result set.
|
||||||
* @param string value
|
* @param string value
|
||||||
@@ -277,15 +285,19 @@ class DibiMsSql2005Driver extends DibiObject implements IDibiDriver, IDibiResult
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Injects LIMIT/OFFSET to the SQL query.
|
* Injects LIMIT/OFFSET to the SQL query.
|
||||||
|
* @param string &$sql The SQL query that will be modified.
|
||||||
|
* @param int $limit
|
||||||
|
* @param int $offset
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function applyLimit(& $sql, $limit, $offset)
|
public function applyLimit(&$sql, $limit, $offset)
|
||||||
{
|
{
|
||||||
// offset support is missing
|
// offset support is missing
|
||||||
if ($limit >= 0) {
|
if ($limit >= 0) {
|
||||||
$sql = 'SELECT TOP ' . (int) $limit . ' * FROM (' . $sql . ') AS T ';
|
$sql = 'SELECT TOP ' . (int) $limit . ' * FROM (' . $sql . ')';
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($offset) {
|
if ($offset) {
|
||||||
@@ -294,9 +306,11 @@ class DibiMsSql2005Driver extends DibiObject implements IDibiDriver, IDibiResult
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************* result set ****************d*g**/
|
/********************* result set ****************d*g**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Automatically frees the resources allocated for this result set.
|
* Automatically frees the resources allocated for this result set.
|
||||||
* @return void
|
* @return void
|
||||||
@@ -307,6 +321,7 @@ class DibiMsSql2005Driver extends DibiObject implements IDibiDriver, IDibiResult
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the number of rows in a result set.
|
* Returns the number of rows in a result set.
|
||||||
* @return int
|
* @return int
|
||||||
@@ -317,6 +332,7 @@ class DibiMsSql2005Driver extends DibiObject implements IDibiDriver, IDibiResult
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fetches the row at current position and moves the internal cursor to the next position.
|
* Fetches the row at current position and moves the internal cursor to the next position.
|
||||||
* @param bool TRUE for associative array, FALSE for numeric
|
* @param bool TRUE for associative array, FALSE for numeric
|
||||||
@@ -328,6 +344,7 @@ class DibiMsSql2005Driver extends DibiObject implements IDibiDriver, IDibiResult
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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
|
||||||
@@ -339,6 +356,7 @@ class DibiMsSql2005Driver extends DibiObject implements IDibiDriver, IDibiResult
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Frees the resources allocated for this result set.
|
* Frees the resources allocated for this result set.
|
||||||
* @return void
|
* @return void
|
||||||
@@ -350,6 +368,7 @@ class DibiMsSql2005Driver extends DibiObject implements IDibiDriver, IDibiResult
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns metadata for all columns in a result set.
|
* Returns metadata for all columns in a result set.
|
||||||
* @return array
|
* @return array
|
||||||
@@ -368,6 +387,7 @@ class DibiMsSql2005Driver extends DibiObject implements IDibiDriver, IDibiResult
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the result set resource.
|
* Returns the result set resource.
|
||||||
* @return mixed
|
* @return mixed
|
@@ -10,7 +10,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
require_once dirname(__FILE__) . '/DibiMySqlReflector.php';
|
require_once dirname(__FILE__) . '/mysql.reflector.php';
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -53,6 +53,7 @@ class DibiMySqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriv
|
|||||||
private $buffered;
|
private $buffered;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @throws DibiNotSupportedException
|
* @throws DibiNotSupportedException
|
||||||
*/
|
*/
|
||||||
@@ -64,12 +65,13 @@ class DibiMySqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriv
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Connects to a database.
|
* Connects to a database.
|
||||||
* @return void
|
* @return void
|
||||||
* @throws DibiException
|
* @throws DibiException
|
||||||
*/
|
*/
|
||||||
public function connect(array & $config)
|
public function connect(array &$config)
|
||||||
{
|
{
|
||||||
if (isset($config['resource'])) {
|
if (isset($config['resource'])) {
|
||||||
$this->connection = $config['resource'];
|
$this->connection = $config['resource'];
|
||||||
@@ -77,21 +79,16 @@ class DibiMySqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriv
|
|||||||
} else {
|
} else {
|
||||||
// default values
|
// default values
|
||||||
DibiConnection::alias($config, 'flags', 'options');
|
DibiConnection::alias($config, 'flags', 'options');
|
||||||
$config += array(
|
if (!isset($config['charset'])) $config['charset'] = 'utf8';
|
||||||
'charset' => 'utf8',
|
if (!isset($config['username'])) $config['username'] = ini_get('mysql.default_user');
|
||||||
'timezone' => date('P'),
|
if (!isset($config['password'])) $config['password'] = ini_get('mysql.default_password');
|
||||||
'username' => ini_get('mysql.default_user'),
|
|
||||||
'password' => ini_get('mysql.default_password'),
|
|
||||||
);
|
|
||||||
if (!isset($config['host'])) {
|
if (!isset($config['host'])) {
|
||||||
$host = ini_get('mysql.default_host');
|
$host = ini_get('mysql.default_host');
|
||||||
if ($host) {
|
if ($host) {
|
||||||
$config['host'] = $host;
|
$config['host'] = $host;
|
||||||
$config['port'] = ini_get('mysql.default_port');
|
$config['port'] = ini_get('mysql.default_port');
|
||||||
} else {
|
} else {
|
||||||
if (!isset($config['socket'])) {
|
if (!isset($config['socket'])) $config['socket'] = ini_get('mysql.default_socket');
|
||||||
$config['socket'] = ini_get('mysql.default_socket');
|
|
||||||
}
|
|
||||||
$config['host'] = NULL;
|
$config['host'] = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -134,14 +131,13 @@ class DibiMySqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriv
|
|||||||
$this->query("SET sql_mode='$config[sqlmode]'");
|
$this->query("SET sql_mode='$config[sqlmode]'");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isset($config['timezone'])) {
|
$this->query("SET time_zone='" . date('P') . "'");
|
||||||
$this->query("SET time_zone='$config[timezone]'");
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->buffered = empty($config['unbuffered']);
|
$this->buffered = empty($config['unbuffered']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Disconnects from a database.
|
* Disconnects from a database.
|
||||||
* @return void
|
* @return void
|
||||||
@@ -152,6 +148,7 @@ class DibiMySqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriv
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Executes the SQL query.
|
* Executes the SQL query.
|
||||||
* @param string SQL statement.
|
* @param string SQL statement.
|
||||||
@@ -175,6 +172,7 @@ class DibiMySqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriv
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves information about the most recently executed query.
|
* Retrieves information about the most recently executed query.
|
||||||
* @return array
|
* @return array
|
||||||
@@ -183,9 +181,7 @@ class DibiMySqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriv
|
|||||||
{
|
{
|
||||||
$res = array();
|
$res = array();
|
||||||
preg_match_all('#(.+?): +(\d+) *#', mysql_info($this->connection), $matches, PREG_SET_ORDER);
|
preg_match_all('#(.+?): +(\d+) *#', mysql_info($this->connection), $matches, PREG_SET_ORDER);
|
||||||
if (preg_last_error()) {
|
if (preg_last_error()) throw new DibiPcreException;
|
||||||
throw new DibiPcreException;
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach ($matches as $m) {
|
foreach ($matches as $m) {
|
||||||
$res[$m[1]] = (int) $m[2];
|
$res[$m[1]] = (int) $m[2];
|
||||||
@@ -194,6 +190,7 @@ class DibiMySqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriv
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the number of affected rows by the last INSERT, UPDATE or DELETE query.
|
* Gets the number of affected rows by the last INSERT, UPDATE or DELETE query.
|
||||||
* @return int|FALSE number of rows or FALSE on error
|
* @return int|FALSE number of rows or FALSE on error
|
||||||
@@ -204,6 +201,7 @@ class DibiMySqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriv
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves the ID generated for an AUTO_INCREMENT column by the previous INSERT query.
|
* Retrieves the ID generated for an AUTO_INCREMENT column by the previous INSERT query.
|
||||||
* @return int|FALSE int on success or FALSE on failure
|
* @return int|FALSE int on success or FALSE on failure
|
||||||
@@ -214,6 +212,7 @@ class DibiMySqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriv
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Begins a transaction (if supported).
|
* Begins a transaction (if supported).
|
||||||
* @param string optional savepoint name
|
* @param string optional savepoint name
|
||||||
@@ -226,6 +225,7 @@ class DibiMySqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriv
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Commits statements in a transaction.
|
* Commits statements in a transaction.
|
||||||
* @param string optional savepoint name
|
* @param string optional savepoint name
|
||||||
@@ -238,6 +238,7 @@ class DibiMySqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriv
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Rollback changes in a transaction.
|
* Rollback changes in a transaction.
|
||||||
* @param string optional savepoint name
|
* @param string optional savepoint name
|
||||||
@@ -250,6 +251,7 @@ class DibiMySqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriv
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the connection resource.
|
* Returns the connection resource.
|
||||||
* @return mixed
|
* @return mixed
|
||||||
@@ -260,6 +262,7 @@ class DibiMySqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriv
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the connection reflector.
|
* Returns the connection reflector.
|
||||||
* @return IDibiReflector
|
* @return IDibiReflector
|
||||||
@@ -270,6 +273,7 @@ class DibiMySqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriv
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Result set driver factory.
|
* Result set driver factory.
|
||||||
* @param resource
|
* @param resource
|
||||||
@@ -283,9 +287,11 @@ class DibiMySqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriv
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************* SQL ****************d*g**/
|
/********************* SQL ****************d*g**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encodes data for use in a SQL statement.
|
* Encodes data for use in a SQL statement.
|
||||||
* @param mixed value
|
* @param mixed value
|
||||||
@@ -296,37 +302,38 @@ class DibiMySqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriv
|
|||||||
public function escape($value, $type)
|
public function escape($value, $type)
|
||||||
{
|
{
|
||||||
switch ($type) {
|
switch ($type) {
|
||||||
case dibi::TEXT:
|
case dibi::TEXT:
|
||||||
if (!is_resource($this->connection)) {
|
if (!is_resource($this->connection)) {
|
||||||
throw new DibiException('Lost connection to server.');
|
throw new DibiException('Lost connection to server.');
|
||||||
}
|
}
|
||||||
return "'" . mysql_real_escape_string($value, $this->connection) . "'";
|
return "'" . mysql_real_escape_string($value, $this->connection) . "'";
|
||||||
|
|
||||||
case dibi::BINARY:
|
case dibi::BINARY:
|
||||||
if (!is_resource($this->connection)) {
|
if (!is_resource($this->connection)) {
|
||||||
throw new DibiException('Lost connection to server.');
|
throw new DibiException('Lost connection to server.');
|
||||||
}
|
}
|
||||||
return "_binary'" . mysql_real_escape_string($value, $this->connection) . "'";
|
return "_binary'" . mysql_real_escape_string($value, $this->connection) . "'";
|
||||||
|
|
||||||
case dibi::IDENTIFIER:
|
case dibi::IDENTIFIER:
|
||||||
// @see http://dev.mysql.com/doc/refman/5.0/en/identifiers.html
|
// @see http://dev.mysql.com/doc/refman/5.0/en/identifiers.html
|
||||||
return '`' . str_replace('`', '``', $value) . '`';
|
return '`' . str_replace('`', '``', $value) . '`';
|
||||||
|
|
||||||
case dibi::BOOL:
|
case dibi::BOOL:
|
||||||
return $value ? 1 : 0;
|
return $value ? 1 : 0;
|
||||||
|
|
||||||
case dibi::DATE:
|
case dibi::DATE:
|
||||||
return $value instanceof DateTime ? $value->format("'Y-m-d'") : date("'Y-m-d'", $value);
|
return $value instanceof DateTime ? $value->format("'Y-m-d'") : date("'Y-m-d'", $value);
|
||||||
|
|
||||||
case dibi::DATETIME:
|
case dibi::DATETIME:
|
||||||
return $value instanceof DateTime ? $value->format("'Y-m-d H:i:s'") : date("'Y-m-d H:i:s'", $value);
|
return $value instanceof DateTime ? $value->format("'Y-m-d H:i:s'") : date("'Y-m-d H:i:s'", $value);
|
||||||
|
|
||||||
default:
|
default:
|
||||||
throw new InvalidArgumentException('Unsupported type.');
|
throw new InvalidArgumentException('Unsupported type.');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encodes string for use in a LIKE statement.
|
* Encodes string for use in a LIKE statement.
|
||||||
* @param string
|
* @param string
|
||||||
@@ -340,6 +347,7 @@ class DibiMySqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriv
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decodes data from result set.
|
* Decodes data from result set.
|
||||||
* @param string value
|
* @param string value
|
||||||
@@ -356,23 +364,29 @@ class DibiMySqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriv
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Injects LIMIT/OFFSET to the SQL query.
|
* Injects LIMIT/OFFSET to the SQL query.
|
||||||
|
* @param string &$sql The SQL query that will be modified.
|
||||||
|
* @param int $limit
|
||||||
|
* @param int $offset
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function applyLimit(& $sql, $limit, $offset)
|
public function applyLimit(&$sql, $limit, $offset)
|
||||||
{
|
{
|
||||||
if ($limit >= 0 || $offset > 0) {
|
if ($limit < 0 && $offset < 1) return;
|
||||||
// see http://dev.mysql.com/doc/refman/5.0/en/select.html
|
|
||||||
$sql .= ' LIMIT ' . ($limit < 0 ? '18446744073709551615' : (int) $limit)
|
// see http://dev.mysql.com/doc/refman/5.0/en/select.html
|
||||||
. ($offset > 0 ? ' OFFSET ' . (int) $offset : '');
|
$sql .= ' LIMIT ' . ($limit < 0 ? '18446744073709551615' : (int) $limit)
|
||||||
}
|
. ($offset > 0 ? ' OFFSET ' . (int) $offset : '');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************* result set ****************d*g**/
|
/********************* result set ****************d*g**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Automatically frees the resources allocated for this result set.
|
* Automatically frees the resources allocated for this result set.
|
||||||
* @return void
|
* @return void
|
||||||
@@ -383,6 +397,7 @@ class DibiMySqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriv
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the number of rows in a result set.
|
* Returns the number of rows in a result set.
|
||||||
* @return int
|
* @return int
|
||||||
@@ -396,6 +411,7 @@ class DibiMySqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriv
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fetches the row at current position and moves the internal cursor to the next position.
|
* Fetches the row at current position and moves the internal cursor to the next position.
|
||||||
* @param bool TRUE for associative array, FALSE for numeric
|
* @param bool TRUE for associative array, FALSE for numeric
|
||||||
@@ -407,6 +423,7 @@ class DibiMySqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriv
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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
|
||||||
@@ -423,6 +440,7 @@ class DibiMySqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriv
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Frees the resources allocated for this result set.
|
* Frees the resources allocated for this result set.
|
||||||
* @return void
|
* @return void
|
||||||
@@ -434,6 +452,7 @@ class DibiMySqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriv
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns metadata for all columns in a result set.
|
* Returns metadata for all columns in a result set.
|
||||||
* @return array
|
* @return array
|
||||||
@@ -456,6 +475,7 @@ class DibiMySqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriv
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the result set resource.
|
* Returns the result set resource.
|
||||||
* @return mixed
|
* @return mixed
|
@@ -23,12 +23,14 @@ class DibiMySqlReflector extends DibiObject implements IDibiReflector
|
|||||||
private $driver;
|
private $driver;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public function __construct(IDibiDriver $driver)
|
public function __construct(IDibiDriver $driver)
|
||||||
{
|
{
|
||||||
$this->driver = $driver;
|
$this->driver = $driver;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns list of tables.
|
* Returns list of tables.
|
||||||
* @return array
|
* @return array
|
||||||
@@ -52,6 +54,7 @@ class DibiMySqlReflector extends DibiObject implements IDibiReflector
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns metadata for all columns in a table.
|
* Returns metadata for all columns in a table.
|
||||||
* @param string
|
* @param string
|
||||||
@@ -85,6 +88,7 @@ class DibiMySqlReflector extends DibiObject implements IDibiReflector
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns metadata for all indexes in a table.
|
* Returns metadata for all indexes in a table.
|
||||||
* @param string
|
* @param string
|
||||||
@@ -111,6 +115,7 @@ class DibiMySqlReflector extends DibiObject implements IDibiReflector
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns metadata for all foreign keys in a table.
|
* Returns metadata for all foreign keys in a table.
|
||||||
* @param string
|
* @param string
|
@@ -10,7 +10,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
require_once dirname(__FILE__) . '/DibiMySqlReflector.php';
|
require_once dirname(__FILE__) . '/mysql.reflector.php';
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -54,6 +54,7 @@ class DibiMySqliDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
private $buffered;
|
private $buffered;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @throws DibiNotSupportedException
|
* @throws DibiNotSupportedException
|
||||||
*/
|
*/
|
||||||
@@ -65,12 +66,13 @@ class DibiMySqliDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Connects to a database.
|
* Connects to a database.
|
||||||
* @return void
|
* @return void
|
||||||
* @throws DibiException
|
* @throws DibiException
|
||||||
*/
|
*/
|
||||||
public function connect(array & $config)
|
public function connect(array &$config)
|
||||||
{
|
{
|
||||||
mysqli_report(MYSQLI_REPORT_OFF);
|
mysqli_report(MYSQLI_REPORT_OFF);
|
||||||
if (isset($config['resource'])) {
|
if (isset($config['resource'])) {
|
||||||
@@ -78,14 +80,11 @@ class DibiMySqliDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
|
|
||||||
} else {
|
} else {
|
||||||
// default values
|
// default values
|
||||||
$config += array(
|
if (!isset($config['charset'])) $config['charset'] = 'utf8';
|
||||||
'charset' => 'utf8',
|
if (!isset($config['username'])) $config['username'] = ini_get('mysqli.default_user');
|
||||||
'timezone' => date('P'),
|
if (!isset($config['password'])) $config['password'] = ini_get('mysqli.default_pw');
|
||||||
'username' => ini_get('mysqli.default_user'),
|
if (!isset($config['socket'])) $config['socket'] = ini_get('mysqli.default_socket');
|
||||||
'password' => ini_get('mysqli.default_pw'),
|
if (!isset($config['port'])) $config['port'] = NULL;
|
||||||
'socket' => ini_get('mysqli.default_socket'),
|
|
||||||
'port' => NULL,
|
|
||||||
);
|
|
||||||
if (!isset($config['host'])) {
|
if (!isset($config['host'])) {
|
||||||
$host = ini_get('mysqli.default_host');
|
$host = ini_get('mysqli.default_host');
|
||||||
if ($host) {
|
if ($host) {
|
||||||
@@ -133,14 +132,13 @@ class DibiMySqliDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
$this->query("SET sql_mode='$config[sqlmode]'");
|
$this->query("SET sql_mode='$config[sqlmode]'");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isset($config['timezone'])) {
|
$this->query("SET time_zone='" . date('P') . "'");
|
||||||
$this->query("SET time_zone='$config[timezone]'");
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->buffered = empty($config['unbuffered']);
|
$this->buffered = empty($config['unbuffered']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Disconnects from a database.
|
* Disconnects from a database.
|
||||||
* @return void
|
* @return void
|
||||||
@@ -151,6 +149,7 @@ class DibiMySqliDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Executes the SQL query.
|
* Executes the SQL query.
|
||||||
* @param string SQL statement.
|
* @param string SQL statement.
|
||||||
@@ -170,6 +169,7 @@ class DibiMySqliDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves information about the most recently executed query.
|
* Retrieves information about the most recently executed query.
|
||||||
* @return array
|
* @return array
|
||||||
@@ -178,9 +178,7 @@ class DibiMySqliDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
{
|
{
|
||||||
$res = array();
|
$res = array();
|
||||||
preg_match_all('#(.+?): +(\d+) *#', mysqli_info($this->connection), $matches, PREG_SET_ORDER);
|
preg_match_all('#(.+?): +(\d+) *#', mysqli_info($this->connection), $matches, PREG_SET_ORDER);
|
||||||
if (preg_last_error()) {
|
if (preg_last_error()) throw new DibiPcreException;
|
||||||
throw new DibiPcreException;
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach ($matches as $m) {
|
foreach ($matches as $m) {
|
||||||
$res[$m[1]] = (int) $m[2];
|
$res[$m[1]] = (int) $m[2];
|
||||||
@@ -189,6 +187,7 @@ class DibiMySqliDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the number of affected rows by the last INSERT, UPDATE or DELETE query.
|
* Gets the number of affected rows by the last INSERT, UPDATE or DELETE query.
|
||||||
* @return int|FALSE number of rows or FALSE on error
|
* @return int|FALSE number of rows or FALSE on error
|
||||||
@@ -199,6 +198,7 @@ class DibiMySqliDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves the ID generated for an AUTO_INCREMENT column by the previous INSERT query.
|
* Retrieves the ID generated for an AUTO_INCREMENT column by the previous INSERT query.
|
||||||
* @return int|FALSE int on success or FALSE on failure
|
* @return int|FALSE int on success or FALSE on failure
|
||||||
@@ -209,6 +209,7 @@ class DibiMySqliDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Begins a transaction (if supported).
|
* Begins a transaction (if supported).
|
||||||
* @param string optional savepoint name
|
* @param string optional savepoint name
|
||||||
@@ -221,6 +222,7 @@ class DibiMySqliDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Commits statements in a transaction.
|
* Commits statements in a transaction.
|
||||||
* @param string optional savepoint name
|
* @param string optional savepoint name
|
||||||
@@ -233,6 +235,7 @@ class DibiMySqliDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Rollback changes in a transaction.
|
* Rollback changes in a transaction.
|
||||||
* @param string optional savepoint name
|
* @param string optional savepoint name
|
||||||
@@ -245,6 +248,7 @@ class DibiMySqliDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the connection resource.
|
* Returns the connection resource.
|
||||||
* @return mysqli
|
* @return mysqli
|
||||||
@@ -255,6 +259,7 @@ class DibiMySqliDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the connection reflector.
|
* Returns the connection reflector.
|
||||||
* @return IDibiReflector
|
* @return IDibiReflector
|
||||||
@@ -265,6 +270,7 @@ class DibiMySqliDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Result set driver factory.
|
* Result set driver factory.
|
||||||
* @param mysqli_result
|
* @param mysqli_result
|
||||||
@@ -278,9 +284,11 @@ class DibiMySqliDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************* SQL ****************d*g**/
|
/********************* SQL ****************d*g**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encodes data for use in a SQL statement.
|
* Encodes data for use in a SQL statement.
|
||||||
* @param mixed value
|
* @param mixed value
|
||||||
@@ -291,30 +299,31 @@ class DibiMySqliDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
public function escape($value, $type)
|
public function escape($value, $type)
|
||||||
{
|
{
|
||||||
switch ($type) {
|
switch ($type) {
|
||||||
case dibi::TEXT:
|
case dibi::TEXT:
|
||||||
return "'" . mysqli_real_escape_string($this->connection, $value) . "'";
|
return "'" . mysqli_real_escape_string($this->connection, $value) . "'";
|
||||||
|
|
||||||
case dibi::BINARY:
|
case dibi::BINARY:
|
||||||
return "_binary'" . mysqli_real_escape_string($this->connection, $value) . "'";
|
return "_binary'" . mysqli_real_escape_string($this->connection, $value) . "'";
|
||||||
|
|
||||||
case dibi::IDENTIFIER:
|
case dibi::IDENTIFIER:
|
||||||
return '`' . str_replace('`', '``', $value) . '`';
|
return '`' . str_replace('`', '``', $value) . '`';
|
||||||
|
|
||||||
case dibi::BOOL:
|
case dibi::BOOL:
|
||||||
return $value ? 1 : 0;
|
return $value ? 1 : 0;
|
||||||
|
|
||||||
case dibi::DATE:
|
case dibi::DATE:
|
||||||
return $value instanceof DateTime ? $value->format("'Y-m-d'") : date("'Y-m-d'", $value);
|
return $value instanceof DateTime ? $value->format("'Y-m-d'") : date("'Y-m-d'", $value);
|
||||||
|
|
||||||
case dibi::DATETIME:
|
case dibi::DATETIME:
|
||||||
return $value instanceof DateTime ? $value->format("'Y-m-d H:i:s'") : date("'Y-m-d H:i:s'", $value);
|
return $value instanceof DateTime ? $value->format("'Y-m-d H:i:s'") : date("'Y-m-d H:i:s'", $value);
|
||||||
|
|
||||||
default:
|
default:
|
||||||
throw new InvalidArgumentException('Unsupported type.');
|
throw new InvalidArgumentException('Unsupported type.');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encodes string for use in a LIKE statement.
|
* Encodes string for use in a LIKE statement.
|
||||||
* @param string
|
* @param string
|
||||||
@@ -328,6 +337,7 @@ class DibiMySqliDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decodes data from result set.
|
* Decodes data from result set.
|
||||||
* @param string value
|
* @param string value
|
||||||
@@ -344,23 +354,29 @@ class DibiMySqliDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Injects LIMIT/OFFSET to the SQL query.
|
* Injects LIMIT/OFFSET to the SQL query.
|
||||||
|
* @param string &$sql The SQL query that will be modified.
|
||||||
|
* @param int $limit
|
||||||
|
* @param int $offset
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function applyLimit(& $sql, $limit, $offset)
|
public function applyLimit(&$sql, $limit, $offset)
|
||||||
{
|
{
|
||||||
if ($limit >= 0 || $offset > 0) {
|
if ($limit < 0 && $offset < 1) return;
|
||||||
// see http://dev.mysql.com/doc/refman/5.0/en/select.html
|
|
||||||
$sql .= ' LIMIT ' . ($limit < 0 ? '18446744073709551615' : (int) $limit)
|
// see http://dev.mysql.com/doc/refman/5.0/en/select.html
|
||||||
. ($offset > 0 ? ' OFFSET ' . (int) $offset : '');
|
$sql .= ' LIMIT ' . ($limit < 0 ? '18446744073709551615' : (int) $limit)
|
||||||
}
|
. ($offset > 0 ? ' OFFSET ' . (int) $offset : '');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************* result set ****************d*g**/
|
/********************* result set ****************d*g**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Automatically frees the resources allocated for this result set.
|
* Automatically frees the resources allocated for this result set.
|
||||||
* @return void
|
* @return void
|
||||||
@@ -371,6 +387,7 @@ class DibiMySqliDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the number of rows in a result set.
|
* Returns the number of rows in a result set.
|
||||||
* @return int
|
* @return int
|
||||||
@@ -384,6 +401,7 @@ class DibiMySqliDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fetches the row at current position and moves the internal cursor to the next position.
|
* Fetches the row at current position and moves the internal cursor to the next position.
|
||||||
* @param bool TRUE for associative array, FALSE for numeric
|
* @param bool TRUE for associative array, FALSE for numeric
|
||||||
@@ -395,6 +413,7 @@ class DibiMySqliDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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
|
||||||
@@ -410,6 +429,7 @@ class DibiMySqliDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Frees the resources allocated for this result set.
|
* Frees the resources allocated for this result set.
|
||||||
* @return void
|
* @return void
|
||||||
@@ -421,6 +441,7 @@ class DibiMySqliDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns metadata for all columns in a result set.
|
* Returns metadata for all columns in a result set.
|
||||||
* @return array
|
* @return array
|
||||||
@@ -454,6 +475,7 @@ class DibiMySqliDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the result set resource.
|
* Returns the result set resource.
|
||||||
* @return mysqli_result
|
* @return mysqli_result
|
@@ -42,6 +42,7 @@ class DibiOdbcDriver extends DibiObject implements IDibiDriver, IDibiResultDrive
|
|||||||
private $row = 0;
|
private $row = 0;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @throws DibiNotSupportedException
|
* @throws DibiNotSupportedException
|
||||||
*/
|
*/
|
||||||
@@ -53,22 +54,21 @@ class DibiOdbcDriver extends DibiObject implements IDibiDriver, IDibiResultDrive
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Connects to a database.
|
* Connects to a database.
|
||||||
* @return void
|
* @return void
|
||||||
* @throws DibiException
|
* @throws DibiException
|
||||||
*/
|
*/
|
||||||
public function connect(array & $config)
|
public function connect(array &$config)
|
||||||
{
|
{
|
||||||
if (isset($config['resource'])) {
|
if (isset($config['resource'])) {
|
||||||
$this->connection = $config['resource'];
|
$this->connection = $config['resource'];
|
||||||
} else {
|
} else {
|
||||||
// default values
|
// default values
|
||||||
$config += array(
|
if (!isset($config['username'])) $config['username'] = ini_get('odbc.default_user');
|
||||||
'username' => ini_get('odbc.default_user'),
|
if (!isset($config['password'])) $config['password'] = ini_get('odbc.default_pw');
|
||||||
'password' => ini_get('odbc.default_pw'),
|
if (!isset($config['dsn'])) $config['dsn'] = ini_get('odbc.default_db');
|
||||||
'dsn' => ini_get('odbc.default_db'),
|
|
||||||
);
|
|
||||||
|
|
||||||
if (empty($config['persistent'])) {
|
if (empty($config['persistent'])) {
|
||||||
$this->connection = @odbc_connect($config['dsn'], $config['username'], $config['password']); // intentionally @
|
$this->connection = @odbc_connect($config['dsn'], $config['username'], $config['password']); // intentionally @
|
||||||
@@ -83,6 +83,7 @@ class DibiOdbcDriver extends DibiObject implements IDibiDriver, IDibiResultDrive
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Disconnects from a database.
|
* Disconnects from a database.
|
||||||
* @return void
|
* @return void
|
||||||
@@ -93,6 +94,7 @@ class DibiOdbcDriver extends DibiObject implements IDibiDriver, IDibiResultDrive
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Executes the SQL query.
|
* Executes the SQL query.
|
||||||
* @param string SQL statement.
|
* @param string SQL statement.
|
||||||
@@ -114,6 +116,7 @@ class DibiOdbcDriver extends DibiObject implements IDibiDriver, IDibiResultDrive
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the number of affected rows by the last INSERT, UPDATE or DELETE query.
|
* Gets the number of affected rows by the last INSERT, UPDATE or DELETE query.
|
||||||
* @return int|FALSE number of rows or FALSE on error
|
* @return int|FALSE number of rows or FALSE on error
|
||||||
@@ -124,6 +127,7 @@ class DibiOdbcDriver extends DibiObject implements IDibiDriver, IDibiResultDrive
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves the ID generated for an AUTO_INCREMENT column by the previous INSERT query.
|
* Retrieves the ID generated for an AUTO_INCREMENT column by the previous INSERT query.
|
||||||
* @return int|FALSE int on success or FALSE on failure
|
* @return int|FALSE int on success or FALSE on failure
|
||||||
@@ -134,6 +138,7 @@ class DibiOdbcDriver extends DibiObject implements IDibiDriver, IDibiResultDrive
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Begins a transaction (if supported).
|
* Begins a transaction (if supported).
|
||||||
* @param string optional savepoint name
|
* @param string optional savepoint name
|
||||||
@@ -148,6 +153,7 @@ class DibiOdbcDriver extends DibiObject implements IDibiDriver, IDibiResultDrive
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Commits statements in a transaction.
|
* Commits statements in a transaction.
|
||||||
* @param string optional savepoint name
|
* @param string optional savepoint name
|
||||||
@@ -163,6 +169,7 @@ class DibiOdbcDriver extends DibiObject implements IDibiDriver, IDibiResultDrive
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Rollback changes in a transaction.
|
* Rollback changes in a transaction.
|
||||||
* @param string optional savepoint name
|
* @param string optional savepoint name
|
||||||
@@ -178,6 +185,7 @@ class DibiOdbcDriver extends DibiObject implements IDibiDriver, IDibiResultDrive
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Is in transaction?
|
* Is in transaction?
|
||||||
* @return bool
|
* @return bool
|
||||||
@@ -188,6 +196,7 @@ class DibiOdbcDriver extends DibiObject implements IDibiDriver, IDibiResultDrive
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the connection resource.
|
* Returns the connection resource.
|
||||||
* @return mixed
|
* @return mixed
|
||||||
@@ -198,6 +207,7 @@ class DibiOdbcDriver extends DibiObject implements IDibiDriver, IDibiResultDrive
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the connection reflector.
|
* Returns the connection reflector.
|
||||||
* @return IDibiReflector
|
* @return IDibiReflector
|
||||||
@@ -208,6 +218,7 @@ class DibiOdbcDriver extends DibiObject implements IDibiDriver, IDibiResultDrive
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Result set driver factory.
|
* Result set driver factory.
|
||||||
* @param resource
|
* @param resource
|
||||||
@@ -221,9 +232,11 @@ class DibiOdbcDriver extends DibiObject implements IDibiDriver, IDibiResultDrive
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************* SQL ****************d*g**/
|
/********************* SQL ****************d*g**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encodes data for use in a SQL statement.
|
* Encodes data for use in a SQL statement.
|
||||||
* @param mixed value
|
* @param mixed value
|
||||||
@@ -234,28 +247,29 @@ class DibiOdbcDriver extends DibiObject implements IDibiDriver, IDibiResultDrive
|
|||||||
public function escape($value, $type)
|
public function escape($value, $type)
|
||||||
{
|
{
|
||||||
switch ($type) {
|
switch ($type) {
|
||||||
case dibi::TEXT:
|
case dibi::TEXT:
|
||||||
case dibi::BINARY:
|
case dibi::BINARY:
|
||||||
return "'" . str_replace("'", "''", $value) . "'";
|
return "'" . str_replace("'", "''", $value) . "'";
|
||||||
|
|
||||||
case dibi::IDENTIFIER:
|
case dibi::IDENTIFIER:
|
||||||
return '[' . str_replace(array('[', ']'), array('[[', ']]'), $value) . ']';
|
return '[' . str_replace(array('[', ']'), array('[[', ']]'), $value) . ']';
|
||||||
|
|
||||||
case dibi::BOOL:
|
case dibi::BOOL:
|
||||||
return $value ? 1 : 0;
|
return $value ? 1 : 0;
|
||||||
|
|
||||||
case dibi::DATE:
|
case dibi::DATE:
|
||||||
return $value instanceof DateTime ? $value->format("#m/d/Y#") : date("#m/d/Y#", $value);
|
return $value instanceof DateTime ? $value->format("#m/d/Y#") : date("#m/d/Y#", $value);
|
||||||
|
|
||||||
case dibi::DATETIME:
|
case dibi::DATETIME:
|
||||||
return $value instanceof DateTime ? $value->format("#m/d/Y H:i:s#") : date("#m/d/Y H:i:s#", $value);
|
return $value instanceof DateTime ? $value->format("#m/d/Y H:i:s#") : date("#m/d/Y H:i:s#", $value);
|
||||||
|
|
||||||
default:
|
default:
|
||||||
throw new InvalidArgumentException('Unsupported type.');
|
throw new InvalidArgumentException('Unsupported type.');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encodes string for use in a LIKE statement.
|
* Encodes string for use in a LIKE statement.
|
||||||
* @param string
|
* @param string
|
||||||
@@ -269,6 +283,7 @@ class DibiOdbcDriver extends DibiObject implements IDibiDriver, IDibiResultDrive
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decodes data from result set.
|
* Decodes data from result set.
|
||||||
* @param string value
|
* @param string value
|
||||||
@@ -285,26 +300,30 @@ class DibiOdbcDriver extends DibiObject implements IDibiDriver, IDibiResultDrive
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Injects LIMIT/OFFSET to the SQL query.
|
* Injects LIMIT/OFFSET to the SQL query.
|
||||||
|
* @param string &$sql The SQL query that will be modified.
|
||||||
|
* @param int $limit
|
||||||
|
* @param int $offset
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function applyLimit(& $sql, $limit, $offset)
|
public function applyLimit(&$sql, $limit, $offset)
|
||||||
{
|
{
|
||||||
// offset support is missing
|
// offset support is missing
|
||||||
if ($limit >= 0) {
|
if ($limit >= 0) {
|
||||||
$sql = 'SELECT TOP ' . (int) $limit . ' * FROM (' . $sql . ')';
|
$sql = 'SELECT TOP ' . (int) $limit . ' * FROM (' . $sql . ')';
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($offset) {
|
if ($offset) throw new DibiNotSupportedException('Offset is not implemented in driver odbc.');
|
||||||
throw new DibiNotSupportedException('Offset is not implemented in driver odbc.');
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************* result set ****************d*g**/
|
/********************* result set ****************d*g**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Automatically frees the resources allocated for this result set.
|
* Automatically frees the resources allocated for this result set.
|
||||||
* @return void
|
* @return void
|
||||||
@@ -315,6 +334,7 @@ class DibiOdbcDriver extends DibiObject implements IDibiDriver, IDibiResultDrive
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the number of rows in a result set.
|
* Returns the number of rows in a result set.
|
||||||
* @return int
|
* @return int
|
||||||
@@ -326,6 +346,7 @@ class DibiOdbcDriver extends DibiObject implements IDibiDriver, IDibiResultDrive
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fetches the row at current position and moves the internal cursor to the next position.
|
* Fetches the row at current position and moves the internal cursor to the next position.
|
||||||
* @param bool TRUE for associative array, FALSE for numeric
|
* @param bool TRUE for associative array, FALSE for numeric
|
||||||
@@ -337,9 +358,7 @@ class DibiOdbcDriver extends DibiObject implements IDibiDriver, IDibiResultDrive
|
|||||||
return odbc_fetch_array($this->resultSet, ++$this->row);
|
return odbc_fetch_array($this->resultSet, ++$this->row);
|
||||||
} else {
|
} else {
|
||||||
$set = $this->resultSet;
|
$set = $this->resultSet;
|
||||||
if (!odbc_fetch_row($set, ++$this->row)) {
|
if (!odbc_fetch_row($set, ++$this->row)) return FALSE;
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
$count = odbc_num_fields($set);
|
$count = odbc_num_fields($set);
|
||||||
$cols = array();
|
$cols = array();
|
||||||
for ($i = 1; $i <= $count; $i++) $cols[] = odbc_result($set, $i);
|
for ($i = 1; $i <= $count; $i++) $cols[] = odbc_result($set, $i);
|
||||||
@@ -348,6 +367,7 @@ class DibiOdbcDriver extends DibiObject implements IDibiDriver, IDibiResultDrive
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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
|
||||||
@@ -360,6 +380,7 @@ class DibiOdbcDriver extends DibiObject implements IDibiDriver, IDibiResultDrive
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Frees the resources allocated for this result set.
|
* Frees the resources allocated for this result set.
|
||||||
* @return void
|
* @return void
|
||||||
@@ -371,6 +392,7 @@ class DibiOdbcDriver extends DibiObject implements IDibiDriver, IDibiResultDrive
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns metadata for all columns in a result set.
|
* Returns metadata for all columns in a result set.
|
||||||
* @return array
|
* @return array
|
||||||
@@ -391,6 +413,7 @@ class DibiOdbcDriver extends DibiObject implements IDibiDriver, IDibiResultDrive
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the result set resource.
|
* Returns the result set resource.
|
||||||
* @return mixed
|
* @return mixed
|
||||||
@@ -402,9 +425,11 @@ class DibiOdbcDriver extends DibiObject implements IDibiDriver, IDibiResultDrive
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************* IDibiReflector ****************d*g**/
|
/********************* IDibiReflector ****************d*g**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns list of tables.
|
* Returns list of tables.
|
||||||
* @return array
|
* @return array
|
||||||
@@ -426,6 +451,7 @@ class DibiOdbcDriver extends DibiObject implements IDibiDriver, IDibiResultDrive
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns metadata for all columns in a table.
|
* Returns metadata for all columns in a table.
|
||||||
* @param string
|
* @param string
|
||||||
@@ -452,6 +478,7 @@ class DibiOdbcDriver extends DibiObject implements IDibiDriver, IDibiResultDrive
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns metadata for all indexes in a table.
|
* Returns metadata for all indexes in a table.
|
||||||
* @param string
|
* @param string
|
||||||
@@ -463,6 +490,7 @@ class DibiOdbcDriver extends DibiObject implements IDibiDriver, IDibiResultDrive
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns metadata for all foreign keys in a table.
|
* Returns metadata for all foreign keys in a table.
|
||||||
* @param string
|
* @param string
|
@@ -21,7 +21,6 @@
|
|||||||
* - 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
|
|
||||||
* - lazy, profiler, result, substitutes, ... => see DibiConnection options
|
* - lazy, profiler, result, substitutes, ... => see DibiConnection options
|
||||||
*
|
*
|
||||||
* @author David Grudl
|
* @author David Grudl
|
||||||
@@ -45,6 +44,7 @@ class DibiOracleDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
private $fmtDate, $fmtDateTime;
|
private $fmtDate, $fmtDateTime;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @throws DibiNotSupportedException
|
* @throws DibiNotSupportedException
|
||||||
*/
|
*/
|
||||||
@@ -56,12 +56,13 @@ class DibiOracleDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Connects to a database.
|
* Connects to a database.
|
||||||
* @return void
|
* @return void
|
||||||
* @throws DibiException
|
* @throws DibiException
|
||||||
*/
|
*/
|
||||||
public function connect(array & $config)
|
public function connect(array &$config)
|
||||||
{
|
{
|
||||||
$foo = & $config['charset'];
|
$foo = & $config['charset'];
|
||||||
$this->fmtDate = isset($config['formatDate']) ? $config['formatDate'] : 'U';
|
$this->fmtDate = isset($config['formatDate']) ? $config['formatDate'] : 'U';
|
||||||
@@ -69,10 +70,8 @@ class DibiOracleDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
|
|
||||||
if (isset($config['resource'])) {
|
if (isset($config['resource'])) {
|
||||||
$this->connection = $config['resource'];
|
$this->connection = $config['resource'];
|
||||||
} elseif (empty($config['persistent'])) {
|
|
||||||
$this->connection = @oci_new_connect($config['username'], $config['password'], $config['database'], $config['charset']); // intentionally @
|
|
||||||
} else {
|
} else {
|
||||||
$this->connection = @oci_pconnect($config['username'], $config['password'], $config['database'], $config['charset']); // intentionally @
|
$this->connection = @oci_new_connect($config['username'], $config['password'], $config['database'], $config['charset']); // intentionally @
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$this->connection) {
|
if (!$this->connection) {
|
||||||
@@ -82,6 +81,7 @@ class DibiOracleDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Disconnects from a database.
|
* Disconnects from a database.
|
||||||
* @return void
|
* @return void
|
||||||
@@ -92,6 +92,7 @@ class DibiOracleDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Executes the SQL query.
|
* Executes the SQL query.
|
||||||
* @param string SQL statement.
|
* @param string SQL statement.
|
||||||
@@ -117,6 +118,7 @@ class DibiOracleDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the number of affected rows by the last INSERT, UPDATE or DELETE query.
|
* Gets the number of affected rows by the last INSERT, UPDATE or DELETE query.
|
||||||
* @return int|FALSE number of rows or FALSE on error
|
* @return int|FALSE number of rows or FALSE on error
|
||||||
@@ -127,6 +129,7 @@ class DibiOracleDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves the ID generated for an AUTO_INCREMENT column by the previous INSERT query.
|
* Retrieves the ID generated for an AUTO_INCREMENT column by the previous INSERT query.
|
||||||
* @return int|FALSE int on success or FALSE on failure
|
* @return int|FALSE int on success or FALSE on failure
|
||||||
@@ -138,6 +141,7 @@ class DibiOracleDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Begins a transaction (if supported).
|
* Begins a transaction (if supported).
|
||||||
* @param string optional savepoint name
|
* @param string optional savepoint name
|
||||||
@@ -149,6 +153,7 @@ class DibiOracleDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Commits statements in a transaction.
|
* Commits statements in a transaction.
|
||||||
* @param string optional savepoint name
|
* @param string optional savepoint name
|
||||||
@@ -165,6 +170,7 @@ class DibiOracleDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Rollback changes in a transaction.
|
* Rollback changes in a transaction.
|
||||||
* @param string optional savepoint name
|
* @param string optional savepoint name
|
||||||
@@ -181,6 +187,7 @@ class DibiOracleDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the connection resource.
|
* Returns the connection resource.
|
||||||
* @return mixed
|
* @return mixed
|
||||||
@@ -191,6 +198,7 @@ class DibiOracleDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the connection reflector.
|
* Returns the connection reflector.
|
||||||
* @return IDibiReflector
|
* @return IDibiReflector
|
||||||
@@ -201,6 +209,7 @@ class DibiOracleDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Result set driver factory.
|
* Result set driver factory.
|
||||||
* @param resource
|
* @param resource
|
||||||
@@ -214,9 +223,11 @@ class DibiOracleDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************* SQL ****************d*g**/
|
/********************* SQL ****************d*g**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encodes data for use in a SQL statement.
|
* Encodes data for use in a SQL statement.
|
||||||
* @param mixed value
|
* @param mixed value
|
||||||
@@ -227,29 +238,30 @@ class DibiOracleDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
public function escape($value, $type)
|
public function escape($value, $type)
|
||||||
{
|
{
|
||||||
switch ($type) {
|
switch ($type) {
|
||||||
case dibi::TEXT:
|
case dibi::TEXT:
|
||||||
case dibi::BINARY:
|
case dibi::BINARY:
|
||||||
return "'" . str_replace("'", "''", $value) . "'"; // TODO: not tested
|
return "'" . str_replace("'", "''", $value) . "'"; // TODO: not tested
|
||||||
|
|
||||||
case dibi::IDENTIFIER:
|
case dibi::IDENTIFIER:
|
||||||
// @see http://download.oracle.com/docs/cd/B10500_01/server.920/a96540/sql_elements9a.htm
|
// @see http://download.oracle.com/docs/cd/B10500_01/server.920/a96540/sql_elements9a.htm
|
||||||
return '"' . str_replace('"', '""', $value) . '"';
|
return '"' . str_replace('"', '""', $value) . '"';
|
||||||
|
|
||||||
case dibi::BOOL:
|
case dibi::BOOL:
|
||||||
return $value ? 1 : 0;
|
return $value ? 1 : 0;
|
||||||
|
|
||||||
case dibi::DATE:
|
case dibi::DATE:
|
||||||
return $value instanceof DateTime ? $value->format($this->fmtDate) : date($this->fmtDate, $value);
|
return $value instanceof DateTime ? $value->format($this->fmtDate) : date($this->fmtDate, $value);
|
||||||
|
|
||||||
case dibi::DATETIME:
|
case dibi::DATETIME:
|
||||||
return $value instanceof DateTime ? $value->format($this->fmtDateTime) : date($this->fmtDateTime, $value);
|
return $value instanceof DateTime ? $value->format($this->fmtDateTime) : date($this->fmtDateTime, $value);
|
||||||
|
|
||||||
default:
|
default:
|
||||||
throw new InvalidArgumentException('Unsupported type.');
|
throw new InvalidArgumentException('Unsupported type.');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encodes string for use in a LIKE statement.
|
* Encodes string for use in a LIKE statement.
|
||||||
* @param string
|
* @param string
|
||||||
@@ -264,6 +276,7 @@ class DibiOracleDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decodes data from result set.
|
* Decodes data from result set.
|
||||||
* @param string value
|
* @param string value
|
||||||
@@ -280,17 +293,19 @@ class DibiOracleDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Injects LIMIT/OFFSET to the SQL query.
|
* Injects LIMIT/OFFSET to the SQL query.
|
||||||
|
* @param string &$sql The SQL query that will be modified.
|
||||||
|
* @param int $limit
|
||||||
|
* @param int $offset
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function applyLimit(& $sql, $limit, $offset)
|
public function applyLimit(&$sql, $limit, $offset)
|
||||||
{
|
{
|
||||||
if ($offset > 0) {
|
if ($offset > 0) {
|
||||||
// see http://www.oracle.com/technology/oramag/oracle/06-sep/o56asktom.html
|
// see http://www.oracle.com/technology/oramag/oracle/06-sep/o56asktom.html
|
||||||
$sql = 'SELECT * FROM (SELECT t.*, ROWNUM AS "__rnum" FROM (' . $sql . ') t '
|
$sql = 'SELECT * FROM (SELECT t.*, ROWNUM AS "__rnum" FROM (' . $sql . ') t ' . ($limit >= 0 ? 'WHERE ROWNUM <= ' . ((int) $offset + (int) $limit) : '') . ') WHERE "__rnum" > '. (int) $offset;
|
||||||
. ($limit >= 0 ? 'WHERE ROWNUM <= ' . ((int) $offset + (int) $limit) : '')
|
|
||||||
. ') WHERE "__rnum" > '. (int) $offset;
|
|
||||||
|
|
||||||
} elseif ($limit >= 0) {
|
} elseif ($limit >= 0) {
|
||||||
$sql = 'SELECT * FROM (' . $sql . ') WHERE ROWNUM <= ' . (int) $limit;
|
$sql = 'SELECT * FROM (' . $sql . ') WHERE ROWNUM <= ' . (int) $limit;
|
||||||
@@ -298,9 +313,11 @@ class DibiOracleDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************* result set ****************d*g**/
|
/********************* result set ****************d*g**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Automatically frees the resources allocated for this result set.
|
* Automatically frees the resources allocated for this result set.
|
||||||
* @return void
|
* @return void
|
||||||
@@ -311,6 +328,7 @@ class DibiOracleDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the number of rows in a result set.
|
* Returns the number of rows in a result set.
|
||||||
* @return int
|
* @return int
|
||||||
@@ -321,6 +339,7 @@ class DibiOracleDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fetches the row at current position and moves the internal cursor to the next position.
|
* Fetches the row at current position and moves the internal cursor to the next position.
|
||||||
* @param bool TRUE for associative array, FALSE for numeric
|
* @param bool TRUE for associative array, FALSE for numeric
|
||||||
@@ -332,6 +351,7 @@ class DibiOracleDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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
|
||||||
@@ -343,6 +363,7 @@ class DibiOracleDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Frees the resources allocated for this result set.
|
* Frees the resources allocated for this result set.
|
||||||
* @return void
|
* @return void
|
||||||
@@ -354,6 +375,7 @@ class DibiOracleDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns metadata for all columns in a result set.
|
* Returns metadata for all columns in a result set.
|
||||||
* @return array
|
* @return array
|
||||||
@@ -374,6 +396,7 @@ class DibiOracleDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the result set resource.
|
* Returns the result set resource.
|
||||||
* @return mixed
|
* @return mixed
|
||||||
@@ -385,9 +408,11 @@ class DibiOracleDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************* IDibiReflector ****************d*g**/
|
/********************* IDibiReflector ****************d*g**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns list of tables.
|
* Returns list of tables.
|
||||||
* @return array
|
* @return array
|
||||||
@@ -408,6 +433,7 @@ class DibiOracleDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns metadata for all columns in a table.
|
* Returns metadata for all columns in a table.
|
||||||
* @param string
|
* @param string
|
||||||
@@ -419,6 +445,7 @@ class DibiOracleDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns metadata for all indexes in a table.
|
* Returns metadata for all indexes in a table.
|
||||||
* @param string
|
* @param string
|
||||||
@@ -430,6 +457,7 @@ class DibiOracleDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns metadata for all foreign keys in a table.
|
* Returns metadata for all foreign keys in a table.
|
||||||
* @param string
|
* @param string
|
@@ -10,8 +10,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
require_once dirname(__FILE__) . '/DibiMySqlReflector.php';
|
require_once dirname(__FILE__) . '/mysql.reflector.php';
|
||||||
require_once dirname(__FILE__) . '/DibiSqliteReflector.php';
|
require_once dirname(__FILE__) . '/sqlite.reflector.php';
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -43,6 +43,7 @@ class DibiPdoDriver extends DibiObject implements IDibiDriver, IDibiResultDriver
|
|||||||
private $driverName;
|
private $driverName;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @throws DibiNotSupportedException
|
* @throws DibiNotSupportedException
|
||||||
*/
|
*/
|
||||||
@@ -54,12 +55,13 @@ class DibiPdoDriver extends DibiObject implements IDibiDriver, IDibiResultDriver
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Connects to a database.
|
* Connects to a database.
|
||||||
* @return void
|
* @return void
|
||||||
* @throws DibiException
|
* @throws DibiException
|
||||||
*/
|
*/
|
||||||
public function connect(array & $config)
|
public function connect(array &$config)
|
||||||
{
|
{
|
||||||
$foo = & $config['dsn'];
|
$foo = & $config['dsn'];
|
||||||
$foo = & $config['options'];
|
$foo = & $config['options'];
|
||||||
@@ -83,6 +85,7 @@ class DibiPdoDriver extends DibiObject implements IDibiDriver, IDibiResultDriver
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Disconnects from a database.
|
* Disconnects from a database.
|
||||||
* @return void
|
* @return void
|
||||||
@@ -93,6 +96,7 @@ class DibiPdoDriver extends DibiObject implements IDibiDriver, IDibiResultDriver
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Executes the SQL query.
|
* Executes the SQL query.
|
||||||
* @param string SQL statement.
|
* @param string SQL statement.
|
||||||
@@ -127,6 +131,7 @@ class DibiPdoDriver extends DibiObject implements IDibiDriver, IDibiResultDriver
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the number of affected rows by the last INSERT, UPDATE or DELETE query.
|
* Gets the number of affected rows by the last INSERT, UPDATE or DELETE query.
|
||||||
* @return int|FALSE number of rows or FALSE on error
|
* @return int|FALSE number of rows or FALSE on error
|
||||||
@@ -137,6 +142,7 @@ class DibiPdoDriver extends DibiObject implements IDibiDriver, IDibiResultDriver
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves the ID generated for an AUTO_INCREMENT column by the previous INSERT query.
|
* Retrieves the ID generated for an AUTO_INCREMENT column by the previous INSERT query.
|
||||||
* @return int|FALSE int on success or FALSE on failure
|
* @return int|FALSE int on success or FALSE on failure
|
||||||
@@ -147,6 +153,7 @@ class DibiPdoDriver extends DibiObject implements IDibiDriver, IDibiResultDriver
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Begins a transaction (if supported).
|
* Begins a transaction (if supported).
|
||||||
* @param string optional savepoint name
|
* @param string optional savepoint name
|
||||||
@@ -162,6 +169,7 @@ class DibiPdoDriver extends DibiObject implements IDibiDriver, IDibiResultDriver
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Commits statements in a transaction.
|
* Commits statements in a transaction.
|
||||||
* @param string optional savepoint name
|
* @param string optional savepoint name
|
||||||
@@ -177,6 +185,7 @@ class DibiPdoDriver extends DibiObject implements IDibiDriver, IDibiResultDriver
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Rollback changes in a transaction.
|
* Rollback changes in a transaction.
|
||||||
* @param string optional savepoint name
|
* @param string optional savepoint name
|
||||||
@@ -192,6 +201,7 @@ class DibiPdoDriver extends DibiObject implements IDibiDriver, IDibiResultDriver
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the connection resource.
|
* Returns the connection resource.
|
||||||
* @return PDO
|
* @return PDO
|
||||||
@@ -202,6 +212,7 @@ class DibiPdoDriver extends DibiObject implements IDibiDriver, IDibiResultDriver
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the connection reflector.
|
* Returns the connection reflector.
|
||||||
* @return IDibiReflector
|
* @return IDibiReflector
|
||||||
@@ -209,19 +220,20 @@ class DibiPdoDriver extends DibiObject implements IDibiDriver, IDibiResultDriver
|
|||||||
public function getReflector()
|
public function getReflector()
|
||||||
{
|
{
|
||||||
switch ($this->driverName) {
|
switch ($this->driverName) {
|
||||||
case 'mysql':
|
case 'mysql':
|
||||||
return new DibiMySqlReflector($this);
|
return new DibiMySqlReflector($this);
|
||||||
|
|
||||||
case 'sqlite':
|
case 'sqlite':
|
||||||
case 'sqlite2':
|
case 'sqlite2':
|
||||||
return new DibiSqliteReflector($this);
|
return new DibiSqliteReflector($this);
|
||||||
|
|
||||||
default:
|
default:
|
||||||
throw new DibiNotSupportedException;
|
throw new DibiNotSupportedException;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Result set driver factory.
|
* Result set driver factory.
|
||||||
* @param PDOStatement
|
* @param PDOStatement
|
||||||
@@ -235,9 +247,11 @@ class DibiPdoDriver extends DibiObject implements IDibiDriver, IDibiResultDriver
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************* SQL ****************d*g**/
|
/********************* SQL ****************d*g**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encodes data for use in a SQL statement.
|
* Encodes data for use in a SQL statement.
|
||||||
* @param mixed value
|
* @param mixed value
|
||||||
@@ -248,51 +262,49 @@ class DibiPdoDriver extends DibiObject implements IDibiDriver, IDibiResultDriver
|
|||||||
public function escape($value, $type)
|
public function escape($value, $type)
|
||||||
{
|
{
|
||||||
switch ($type) {
|
switch ($type) {
|
||||||
case dibi::TEXT:
|
case dibi::TEXT:
|
||||||
return $this->connection->quote($value, PDO::PARAM_STR);
|
return $this->connection->quote($value, PDO::PARAM_STR);
|
||||||
|
|
||||||
case dibi::BINARY:
|
case dibi::BINARY:
|
||||||
return $this->connection->quote($value, PDO::PARAM_LOB);
|
return $this->connection->quote($value, PDO::PARAM_LOB);
|
||||||
|
|
||||||
case dibi::IDENTIFIER:
|
case dibi::IDENTIFIER:
|
||||||
switch ($this->driverName) {
|
switch ($this->driverName) {
|
||||||
case 'mysql':
|
case 'mysql':
|
||||||
return '`' . str_replace('`', '``', $value) . '`';
|
return '`' . str_replace('`', '``', $value) . '`';
|
||||||
|
|
||||||
case 'pgsql':
|
case 'pgsql':
|
||||||
return '"' . str_replace('"', '""', $value) . '"';
|
return '"' . str_replace('"', '""', $value) . '"';
|
||||||
|
|
||||||
case 'sqlite':
|
case 'sqlite':
|
||||||
case 'sqlite2':
|
case 'sqlite2':
|
||||||
return '[' . strtr($value, '[]', ' ') . ']';
|
return '[' . strtr($value, '[]', ' ') . ']';
|
||||||
|
|
||||||
case 'odbc':
|
case 'odbc':
|
||||||
case 'oci': // TODO: not tested
|
case 'oci': // TODO: not tested
|
||||||
case 'mssql':
|
case 'mssql':
|
||||||
return '[' . str_replace(array('[', ']'), array('[[', ']]'), $value) . ']';
|
return '[' . str_replace(array('[', ']'), array('[[', ']]'), $value) . ']';
|
||||||
|
|
||||||
case 'sqlsrv':
|
|
||||||
return '[' . str_replace(']', ']]', $value) . ']';
|
|
||||||
|
|
||||||
default:
|
|
||||||
return $value;
|
|
||||||
}
|
|
||||||
|
|
||||||
case dibi::BOOL:
|
|
||||||
return $this->connection->quote($value, PDO::PARAM_BOOL);
|
|
||||||
|
|
||||||
case dibi::DATE:
|
|
||||||
return $value instanceof DateTime ? $value->format("'Y-m-d'") : date("'Y-m-d'", $value);
|
|
||||||
|
|
||||||
case dibi::DATETIME:
|
|
||||||
return $value instanceof DateTime ? $value->format("'Y-m-d H:i:s'") : date("'Y-m-d H:i:s'", $value);
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
throw new InvalidArgumentException('Unsupported type.');
|
return $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
case dibi::BOOL:
|
||||||
|
return $this->connection->quote($value, PDO::PARAM_BOOL);
|
||||||
|
|
||||||
|
case dibi::DATE:
|
||||||
|
return $value instanceof DateTime ? $value->format("'Y-m-d'") : date("'Y-m-d'", $value);
|
||||||
|
|
||||||
|
case dibi::DATETIME:
|
||||||
|
return $value instanceof DateTime ? $value->format("'Y-m-d H:i:s'") : date("'Y-m-d H:i:s'", $value);
|
||||||
|
|
||||||
|
default:
|
||||||
|
throw new InvalidArgumentException('Unsupported type.');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encodes string for use in a LIKE statement.
|
* Encodes string for use in a LIKE statement.
|
||||||
* @param string
|
* @param string
|
||||||
@@ -305,6 +317,7 @@ class DibiPdoDriver extends DibiObject implements IDibiDriver, IDibiResultDriver
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decodes data from result set.
|
* Decodes data from result set.
|
||||||
* @param string value
|
* @param string value
|
||||||
@@ -321,64 +334,61 @@ class DibiPdoDriver extends DibiObject implements IDibiDriver, IDibiResultDriver
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Injects LIMIT/OFFSET to the SQL query.
|
* Injects LIMIT/OFFSET to the SQL query.
|
||||||
|
* @param string &$sql The SQL query that will be modified.
|
||||||
|
* @param int $limit
|
||||||
|
* @param int $offset
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function applyLimit(& $sql, $limit, $offset)
|
public function applyLimit(&$sql, $limit, $offset)
|
||||||
{
|
{
|
||||||
if ($limit < 0 && $offset < 1) {
|
if ($limit < 0 && $offset < 1) return;
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch ($this->driverName) {
|
switch ($this->driverName) {
|
||||||
case 'mysql':
|
case 'mysql':
|
||||||
$sql .= ' LIMIT ' . ($limit < 0 ? '18446744073709551615' : (int) $limit)
|
$sql .= ' LIMIT ' . ($limit < 0 ? '18446744073709551615' : (int) $limit)
|
||||||
. ($offset > 0 ? ' OFFSET ' . (int) $offset : '');
|
. ($offset > 0 ? ' OFFSET ' . (int) $offset : '');
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'pgsql':
|
||||||
|
if ($limit >= 0) $sql .= ' LIMIT ' . (int) $limit;
|
||||||
|
if ($offset > 0) $sql .= ' OFFSET ' . (int) $offset;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'sqlite':
|
||||||
|
case 'sqlite2':
|
||||||
|
$sql .= ' LIMIT ' . $limit . ($offset > 0 ? ' OFFSET ' . (int) $offset : '');
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'oci':
|
||||||
|
if ($offset > 0) {
|
||||||
|
$sql = 'SELECT * FROM (SELECT t.*, ROWNUM AS "__rnum" FROM (' . $sql . ') t ' . ($limit >= 0 ? 'WHERE ROWNUM <= ' . ((int) $offset + (int) $limit) : '') . ') WHERE "__rnum" > '. (int) $offset;
|
||||||
|
} elseif ($limit >= 0) {
|
||||||
|
$sql = 'SELECT * FROM (' . $sql . ') WHERE ROWNUM <= ' . (int) $limit;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'odbc':
|
||||||
|
case 'mssql':
|
||||||
|
if ($offset < 1) {
|
||||||
|
$sql = 'SELECT TOP ' . (int) $limit . ' * FROM (' . $sql . ')';
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
// intentionally break omitted
|
||||||
|
|
||||||
case 'pgsql':
|
default:
|
||||||
if ($limit >= 0) {
|
throw new DibiNotSupportedException('PDO or driver does not support applying limit or offset.');
|
||||||
$sql .= ' LIMIT ' . (int) $limit;
|
|
||||||
}
|
|
||||||
if ($offset > 0) {
|
|
||||||
$sql .= ' OFFSET ' . (int) $offset;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'sqlite':
|
|
||||||
case 'sqlite2':
|
|
||||||
$sql .= ' LIMIT ' . $limit . ($offset > 0 ? ' OFFSET ' . (int) $offset : '');
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'oci':
|
|
||||||
if ($offset > 0) {
|
|
||||||
$sql = 'SELECT * FROM (SELECT t.*, ROWNUM AS "__rnum" FROM (' . $sql . ') t '
|
|
||||||
. ($limit >= 0 ? 'WHERE ROWNUM <= ' . ((int) $offset + (int) $limit) : '')
|
|
||||||
. ') WHERE "__rnum" > '. (int) $offset;
|
|
||||||
} elseif ($limit >= 0) {
|
|
||||||
$sql = 'SELECT * FROM (' . $sql . ') WHERE ROWNUM <= ' . (int) $limit;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'odbc':
|
|
||||||
case 'mssql':
|
|
||||||
case 'sqlsrv':
|
|
||||||
if ($offset < 1) {
|
|
||||||
$sql = 'SELECT TOP ' . (int) $limit . ' * FROM (' . $sql . ') t';
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
// intentionally break omitted
|
|
||||||
|
|
||||||
default:
|
|
||||||
throw new DibiNotSupportedException('PDO or driver does not support applying limit or offset.');
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************* result set ****************d*g**/
|
/********************* result set ****************d*g**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the number of rows in a result set.
|
* Returns the number of rows in a result set.
|
||||||
* @return int
|
* @return int
|
||||||
@@ -389,6 +399,7 @@ class DibiPdoDriver extends DibiObject implements IDibiDriver, IDibiResultDriver
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fetches the row at current position and moves the internal cursor to the next position.
|
* Fetches the row at current position and moves the internal cursor to the next position.
|
||||||
* @param bool TRUE for associative array, FALSE for numeric
|
* @param bool TRUE for associative array, FALSE for numeric
|
||||||
@@ -400,6 +411,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
|
||||||
@@ -411,6 +423,7 @@ class DibiPdoDriver extends DibiObject implements IDibiDriver, IDibiResultDriver
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Frees the resources allocated for this result set.
|
* Frees the resources allocated for this result set.
|
||||||
* @return void
|
* @return void
|
||||||
@@ -421,6 +434,7 @@ class DibiPdoDriver extends DibiObject implements IDibiDriver, IDibiResultDriver
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns metadata for all columns in a result set.
|
* Returns metadata for all columns in a result set.
|
||||||
* @return array
|
* @return array
|
||||||
@@ -454,6 +468,7 @@ class DibiPdoDriver extends DibiObject implements IDibiDriver, IDibiResultDriver
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the result set resource.
|
* Returns the result set resource.
|
||||||
* @return PDOStatement
|
* @return PDOStatement
|
@@ -43,6 +43,7 @@ class DibiPostgreDriver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
private $escMethod = FALSE;
|
private $escMethod = FALSE;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @throws DibiNotSupportedException
|
* @throws DibiNotSupportedException
|
||||||
*/
|
*/
|
||||||
@@ -54,20 +55,19 @@ class DibiPostgreDriver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Connects to a database.
|
* Connects to a database.
|
||||||
* @return void
|
* @return void
|
||||||
* @throws DibiException
|
* @throws DibiException
|
||||||
*/
|
*/
|
||||||
public function connect(array & $config)
|
public function connect(array &$config)
|
||||||
{
|
{
|
||||||
if (isset($config['resource'])) {
|
if (isset($config['resource'])) {
|
||||||
$this->connection = $config['resource'];
|
$this->connection = $config['resource'];
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
$config += array(
|
if (!isset($config['charset'])) $config['charset'] = 'utf8';
|
||||||
'charset' => 'utf8',
|
|
||||||
);
|
|
||||||
if (isset($config['string'])) {
|
if (isset($config['string'])) {
|
||||||
$string = $config['string'];
|
$string = $config['string'];
|
||||||
} else {
|
} else {
|
||||||
@@ -75,9 +75,7 @@ class DibiPostgreDriver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
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,6 +110,7 @@ class DibiPostgreDriver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Disconnects from a database.
|
* Disconnects from a database.
|
||||||
* @return void
|
* @return void
|
||||||
@@ -122,6 +121,7 @@ class DibiPostgreDriver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Executes the SQL query.
|
* Executes the SQL query.
|
||||||
* @param string SQL statement.
|
* @param string SQL statement.
|
||||||
@@ -145,6 +145,7 @@ class DibiPostgreDriver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the number of affected rows by the last INSERT, UPDATE or DELETE query.
|
* Gets the number of affected rows by the last INSERT, UPDATE or DELETE query.
|
||||||
* @return int|FALSE number of rows or FALSE on error
|
* @return int|FALSE number of rows or FALSE on error
|
||||||
@@ -155,6 +156,7 @@ class DibiPostgreDriver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves the ID generated for an AUTO_INCREMENT column by the previous INSERT query.
|
* Retrieves the ID generated for an AUTO_INCREMENT column by the previous INSERT query.
|
||||||
* @return int|FALSE int on success or FALSE on failure
|
* @return int|FALSE int on success or FALSE on failure
|
||||||
@@ -168,15 +170,14 @@ class DibiPostgreDriver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
$res = $this->query("SELECT CURRVAL('$sequence')");
|
$res = $this->query("SELECT CURRVAL('$sequence')");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$res) {
|
if (!$res) return FALSE;
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
$row = $res->fetch(FALSE);
|
$row = $res->fetch(FALSE);
|
||||||
return is_array($row) ? $row[0] : FALSE;
|
return is_array($row) ? $row[0] : FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Begins a transaction (if supported).
|
* Begins a transaction (if supported).
|
||||||
* @param string optional savepoint name
|
* @param string optional savepoint name
|
||||||
@@ -189,6 +190,7 @@ class DibiPostgreDriver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Commits statements in a transaction.
|
* Commits statements in a transaction.
|
||||||
* @param string optional savepoint name
|
* @param string optional savepoint name
|
||||||
@@ -201,6 +203,7 @@ class DibiPostgreDriver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Rollback changes in a transaction.
|
* Rollback changes in a transaction.
|
||||||
* @param string optional savepoint name
|
* @param string optional savepoint name
|
||||||
@@ -213,6 +216,7 @@ class DibiPostgreDriver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Is in transaction?
|
* Is in transaction?
|
||||||
* @return bool
|
* @return bool
|
||||||
@@ -223,6 +227,7 @@ class DibiPostgreDriver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the connection resource.
|
* Returns the connection resource.
|
||||||
* @return mixed
|
* @return mixed
|
||||||
@@ -233,6 +238,7 @@ class DibiPostgreDriver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the connection reflector.
|
* Returns the connection reflector.
|
||||||
* @return IDibiReflector
|
* @return IDibiReflector
|
||||||
@@ -243,6 +249,7 @@ class DibiPostgreDriver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Result set driver factory.
|
* Result set driver factory.
|
||||||
* @param resource
|
* @param resource
|
||||||
@@ -256,9 +263,11 @@ class DibiPostgreDriver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************* SQL ****************d*g**/
|
/********************* SQL ****************d*g**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encodes data for use in a SQL statement.
|
* Encodes data for use in a SQL statement.
|
||||||
* @param mixed value
|
* @param mixed value
|
||||||
@@ -269,45 +278,46 @@ class DibiPostgreDriver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
public function escape($value, $type)
|
public function escape($value, $type)
|
||||||
{
|
{
|
||||||
switch ($type) {
|
switch ($type) {
|
||||||
case dibi::TEXT:
|
case dibi::TEXT:
|
||||||
if ($this->escMethod) {
|
if ($this->escMethod) {
|
||||||
if (!is_resource($this->connection)) {
|
if (!is_resource($this->connection)) {
|
||||||
throw new DibiException('Lost connection to server.');
|
throw new DibiException('Lost connection to server.');
|
||||||
}
|
|
||||||
return "'" . pg_escape_string($this->connection, $value) . "'";
|
|
||||||
} else {
|
|
||||||
return "'" . pg_escape_string($value) . "'";
|
|
||||||
}
|
}
|
||||||
|
return "'" . pg_escape_string($this->connection, $value) . "'";
|
||||||
|
} else {
|
||||||
|
return "'" . pg_escape_string($value) . "'";
|
||||||
|
}
|
||||||
|
|
||||||
case dibi::BINARY:
|
case dibi::BINARY:
|
||||||
if ($this->escMethod) {
|
if ($this->escMethod) {
|
||||||
if (!is_resource($this->connection)) {
|
if (!is_resource($this->connection)) {
|
||||||
throw new DibiException('Lost connection to server.');
|
throw new DibiException('Lost connection to server.');
|
||||||
}
|
|
||||||
return "'" . pg_escape_bytea($this->connection, $value) . "'";
|
|
||||||
} else {
|
|
||||||
return "'" . pg_escape_bytea($value) . "'";
|
|
||||||
}
|
}
|
||||||
|
return "'" . pg_escape_bytea($this->connection, $value) . "'";
|
||||||
|
} else {
|
||||||
|
return "'" . pg_escape_bytea($value) . "'";
|
||||||
|
}
|
||||||
|
|
||||||
case dibi::IDENTIFIER:
|
case dibi::IDENTIFIER:
|
||||||
// @see http://www.postgresql.org/docs/8.2/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS
|
// @see http://www.postgresql.org/docs/8.2/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS
|
||||||
return '"' . str_replace('"', '""', $value) . '"';
|
return '"' . str_replace('"', '""', $value) . '"';
|
||||||
|
|
||||||
case dibi::BOOL:
|
case dibi::BOOL:
|
||||||
return $value ? 'TRUE' : 'FALSE';
|
return $value ? 'TRUE' : 'FALSE';
|
||||||
|
|
||||||
case dibi::DATE:
|
case dibi::DATE:
|
||||||
return $value instanceof DateTime ? $value->format("'Y-m-d'") : date("'Y-m-d'", $value);
|
return $value instanceof DateTime ? $value->format("'Y-m-d'") : date("'Y-m-d'", $value);
|
||||||
|
|
||||||
case dibi::DATETIME:
|
case dibi::DATETIME:
|
||||||
return $value instanceof DateTime ? $value->format("'Y-m-d H:i:s'") : date("'Y-m-d H:i:s'", $value);
|
return $value instanceof DateTime ? $value->format("'Y-m-d H:i:s'") : date("'Y-m-d H:i:s'", $value);
|
||||||
|
|
||||||
default:
|
default:
|
||||||
throw new InvalidArgumentException('Unsupported type.');
|
throw new InvalidArgumentException('Unsupported type.');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encodes string for use in a LIKE statement.
|
* Encodes string for use in a LIKE statement.
|
||||||
* @param string
|
* @param string
|
||||||
@@ -327,6 +337,7 @@ class DibiPostgreDriver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decodes data from result set.
|
* Decodes data from result set.
|
||||||
* @param string value
|
* @param string value
|
||||||
@@ -343,25 +354,29 @@ class DibiPostgreDriver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Injects LIMIT/OFFSET to the SQL query.
|
* Injects LIMIT/OFFSET to the SQL query.
|
||||||
|
* @param string &$sql The SQL query that will be modified.
|
||||||
|
* @param int $limit
|
||||||
|
* @param int $offset
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function applyLimit(& $sql, $limit, $offset)
|
public function applyLimit(&$sql, $limit, $offset)
|
||||||
{
|
{
|
||||||
if ($limit >= 0) {
|
if ($limit >= 0)
|
||||||
$sql .= ' LIMIT ' . (int) $limit;
|
$sql .= ' LIMIT ' . (int) $limit;
|
||||||
}
|
|
||||||
|
|
||||||
if ($offset > 0) {
|
if ($offset > 0)
|
||||||
$sql .= ' OFFSET ' . (int) $offset;
|
$sql .= ' OFFSET ' . (int) $offset;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************* result set ****************d*g**/
|
/********************* result set ****************d*g**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Automatically frees the resources allocated for this result set.
|
* Automatically frees the resources allocated for this result set.
|
||||||
* @return void
|
* @return void
|
||||||
@@ -372,6 +387,7 @@ class DibiPostgreDriver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the number of rows in a result set.
|
* Returns the number of rows in a result set.
|
||||||
* @return int
|
* @return int
|
||||||
@@ -382,6 +398,7 @@ class DibiPostgreDriver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fetches the row at current position and moves the internal cursor to the next position.
|
* Fetches the row at current position and moves the internal cursor to the next position.
|
||||||
* @param bool TRUE for associative array, FALSE for numeric
|
* @param bool TRUE for associative array, FALSE for numeric
|
||||||
@@ -393,6 +410,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
|
||||||
@@ -404,6 +422,7 @@ class DibiPostgreDriver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Frees the resources allocated for this result set.
|
* Frees the resources allocated for this result set.
|
||||||
* @return void
|
* @return void
|
||||||
@@ -415,6 +434,7 @@ class DibiPostgreDriver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns metadata for all columns in a result set.
|
* Returns metadata for all columns in a result set.
|
||||||
* @return array
|
* @return array
|
||||||
@@ -437,6 +457,7 @@ class DibiPostgreDriver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the result set resource.
|
* Returns the result set resource.
|
||||||
* @return mixed
|
* @return mixed
|
||||||
@@ -448,9 +469,11 @@ class DibiPostgreDriver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************* IDibiReflector ****************d*g**/
|
/********************* IDibiReflector ****************d*g**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns list of tables.
|
* Returns list of tables.
|
||||||
* @return array
|
* @return array
|
||||||
@@ -479,6 +502,7 @@ class DibiPostgreDriver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns metadata for all columns in a table.
|
* Returns metadata for all columns in a table.
|
||||||
* @param string
|
* @param string
|
||||||
@@ -519,6 +543,7 @@ class DibiPostgreDriver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns metadata for all indexes in a table.
|
* Returns metadata for all indexes in a table.
|
||||||
* @param string
|
* @param string
|
||||||
@@ -560,6 +585,7 @@ class DibiPostgreDriver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns metadata for all foreign keys in a table.
|
* Returns metadata for all foreign keys in a table.
|
||||||
* @param string
|
* @param string
|
@@ -10,7 +10,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
require_once dirname(__FILE__) . '/DibiSqliteReflector.php';
|
require_once dirname(__FILE__) . '/sqlite.reflector.php';
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -48,6 +48,7 @@ class DibiSqliteDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
private $dbcharset, $charset;
|
private $dbcharset, $charset;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @throws DibiNotSupportedException
|
* @throws DibiNotSupportedException
|
||||||
*/
|
*/
|
||||||
@@ -59,12 +60,13 @@ class DibiSqliteDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Connects to a database.
|
* Connects to a database.
|
||||||
* @return void
|
* @return void
|
||||||
* @throws DibiException
|
* @throws DibiException
|
||||||
*/
|
*/
|
||||||
public function connect(array & $config)
|
public function connect(array &$config)
|
||||||
{
|
{
|
||||||
DibiConnection::alias($config, 'database', 'file');
|
DibiConnection::alias($config, 'database', 'file');
|
||||||
$this->fmtDate = isset($config['formatDate']) ? $config['formatDate'] : 'U';
|
$this->fmtDate = isset($config['formatDate']) ? $config['formatDate'] : 'U';
|
||||||
@@ -93,6 +95,7 @@ class DibiSqliteDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Disconnects from a database.
|
* Disconnects from a database.
|
||||||
* @return void
|
* @return void
|
||||||
@@ -103,6 +106,7 @@ class DibiSqliteDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Executes the SQL query.
|
* Executes the SQL query.
|
||||||
* @param string SQL statement.
|
* @param string SQL statement.
|
||||||
@@ -130,6 +134,7 @@ class DibiSqliteDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the number of affected rows by the last INSERT, UPDATE or DELETE query.
|
* Gets the number of affected rows by the last INSERT, UPDATE or DELETE query.
|
||||||
* @return int|FALSE number of rows or FALSE on error
|
* @return int|FALSE number of rows or FALSE on error
|
||||||
@@ -140,6 +145,7 @@ class DibiSqliteDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves the ID generated for an AUTO_INCREMENT column by the previous INSERT query.
|
* Retrieves the ID generated for an AUTO_INCREMENT column by the previous INSERT query.
|
||||||
* @return int|FALSE int on success or FALSE on failure
|
* @return int|FALSE int on success or FALSE on failure
|
||||||
@@ -150,6 +156,7 @@ class DibiSqliteDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Begins a transaction (if supported).
|
* Begins a transaction (if supported).
|
||||||
* @param string optional savepoint name
|
* @param string optional savepoint name
|
||||||
@@ -162,6 +169,7 @@ class DibiSqliteDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Commits statements in a transaction.
|
* Commits statements in a transaction.
|
||||||
* @param string optional savepoint name
|
* @param string optional savepoint name
|
||||||
@@ -174,6 +182,7 @@ class DibiSqliteDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Rollback changes in a transaction.
|
* Rollback changes in a transaction.
|
||||||
* @param string optional savepoint name
|
* @param string optional savepoint name
|
||||||
@@ -186,6 +195,7 @@ class DibiSqliteDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the connection resource.
|
* Returns the connection resource.
|
||||||
* @return mixed
|
* @return mixed
|
||||||
@@ -196,6 +206,7 @@ class DibiSqliteDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the connection reflector.
|
* Returns the connection reflector.
|
||||||
* @return IDibiReflector
|
* @return IDibiReflector
|
||||||
@@ -206,6 +217,7 @@ class DibiSqliteDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Result set driver factory.
|
* Result set driver factory.
|
||||||
* @param resource
|
* @param resource
|
||||||
@@ -219,9 +231,11 @@ class DibiSqliteDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************* SQL ****************d*g**/
|
/********************* SQL ****************d*g**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encodes data for use in a SQL statement.
|
* Encodes data for use in a SQL statement.
|
||||||
* @param mixed value
|
* @param mixed value
|
||||||
@@ -232,28 +246,29 @@ class DibiSqliteDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
public function escape($value, $type)
|
public function escape($value, $type)
|
||||||
{
|
{
|
||||||
switch ($type) {
|
switch ($type) {
|
||||||
case dibi::TEXT:
|
case dibi::TEXT:
|
||||||
case dibi::BINARY:
|
case dibi::BINARY:
|
||||||
return "'" . sqlite_escape_string($value) . "'";
|
return "'" . sqlite_escape_string($value) . "'";
|
||||||
|
|
||||||
case dibi::IDENTIFIER:
|
case dibi::IDENTIFIER:
|
||||||
return '[' . strtr($value, '[]', ' ') . ']';
|
return '[' . strtr($value, '[]', ' ') . ']';
|
||||||
|
|
||||||
case dibi::BOOL:
|
case dibi::BOOL:
|
||||||
return $value ? 1 : 0;
|
return $value ? 1 : 0;
|
||||||
|
|
||||||
case dibi::DATE:
|
case dibi::DATE:
|
||||||
return $value instanceof DateTime ? $value->format($this->fmtDate) : date($this->fmtDate, $value);
|
return $value instanceof DateTime ? $value->format($this->fmtDate) : date($this->fmtDate, $value);
|
||||||
|
|
||||||
case dibi::DATETIME:
|
case dibi::DATETIME:
|
||||||
return $value instanceof DateTime ? $value->format($this->fmtDateTime) : date($this->fmtDateTime, $value);
|
return $value instanceof DateTime ? $value->format($this->fmtDateTime) : date($this->fmtDateTime, $value);
|
||||||
|
|
||||||
default:
|
default:
|
||||||
throw new InvalidArgumentException('Unsupported type.');
|
throw new InvalidArgumentException('Unsupported type.');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encodes string for use in a LIKE statement.
|
* Encodes string for use in a LIKE statement.
|
||||||
* @param string
|
* @param string
|
||||||
@@ -266,6 +281,7 @@ class DibiSqliteDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decodes data from result set.
|
* Decodes data from result set.
|
||||||
* @param string value
|
* @param string value
|
||||||
@@ -282,21 +298,26 @@ class DibiSqliteDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Injects LIMIT/OFFSET to the SQL query.
|
* Injects LIMIT/OFFSET to the SQL query.
|
||||||
|
* @param string &$sql The SQL query that will be modified.
|
||||||
|
* @param int $limit
|
||||||
|
* @param int $offset
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function applyLimit(& $sql, $limit, $offset)
|
public function applyLimit(&$sql, $limit, $offset)
|
||||||
{
|
{
|
||||||
if ($limit >= 0 || $offset > 0) {
|
if ($limit < 0 && $offset < 1) return;
|
||||||
$sql .= ' LIMIT ' . (int) $limit . ($offset > 0 ? ' OFFSET ' . (int) $offset : '');
|
$sql .= ' LIMIT ' . $limit . ($offset > 0 ? ' OFFSET ' . (int) $offset : '');
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************* result set ****************d*g**/
|
/********************* result set ****************d*g**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the number of rows in a result set.
|
* Returns the number of rows in a result set.
|
||||||
* @return int
|
* @return int
|
||||||
@@ -310,6 +331,7 @@ class DibiSqliteDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fetches the row at current position and moves the internal cursor to the next position.
|
* Fetches the row at current position and moves the internal cursor to the next position.
|
||||||
* @param bool TRUE for associative array, FALSE for numeric
|
* @param bool TRUE for associative array, FALSE for numeric
|
||||||
@@ -333,6 +355,7 @@ class DibiSqliteDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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
|
||||||
@@ -348,6 +371,7 @@ class DibiSqliteDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Frees the resources allocated for this result set.
|
* Frees the resources allocated for this result set.
|
||||||
* @return void
|
* @return void
|
||||||
@@ -358,6 +382,7 @@ class DibiSqliteDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns metadata for all columns in a result set.
|
* Returns metadata for all columns in a result set.
|
||||||
* @return array
|
* @return array
|
||||||
@@ -380,6 +405,7 @@ class DibiSqliteDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the result set resource.
|
* Returns the result set resource.
|
||||||
* @return mixed
|
* @return mixed
|
||||||
@@ -390,9 +416,11 @@ class DibiSqliteDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************* user defined functions ****************d*g**/
|
/********************* user defined functions ****************d*g**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Registers an user defined function for use in SQL statements.
|
* Registers an user defined function for use in SQL statements.
|
||||||
* @param string function name
|
* @param string function name
|
||||||
@@ -406,6 +434,7 @@ class DibiSqliteDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Registers an aggregating user defined function for use in SQL statements.
|
* Registers an aggregating user defined function for use in SQL statements.
|
||||||
* @param string function name
|
* @param string function name
|
@@ -23,12 +23,14 @@ class DibiSqliteReflector extends DibiObject implements IDibiReflector
|
|||||||
private $driver;
|
private $driver;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public function __construct(IDibiDriver $driver)
|
public function __construct(IDibiDriver $driver)
|
||||||
{
|
{
|
||||||
$this->driver = $driver;
|
$this->driver = $driver;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns list of tables.
|
* Returns list of tables.
|
||||||
* @return array
|
* @return array
|
||||||
@@ -49,6 +51,7 @@ class DibiSqliteReflector extends DibiObject implements IDibiReflector
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns metadata for all columns in a table.
|
* Returns metadata for all columns in a table.
|
||||||
* @param string
|
* @param string
|
||||||
@@ -84,6 +87,7 @@ class DibiSqliteReflector extends DibiObject implements IDibiReflector
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns metadata for all indexes in a table.
|
* Returns metadata for all indexes in a table.
|
||||||
* @param string
|
* @param string
|
||||||
@@ -135,6 +139,7 @@ class DibiSqliteReflector extends DibiObject implements IDibiReflector
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns metadata for all foreign keys in a table.
|
* Returns metadata for all foreign keys in a table.
|
||||||
* @param string
|
* @param string
|
@@ -10,7 +10,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
require_once dirname(__FILE__) . '/DibiSqliteReflector.php';
|
require_once dirname(__FILE__) . '/sqlite.reflector.php';
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -46,6 +46,7 @@ class DibiSqlite3Driver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
private $dbcharset, $charset;
|
private $dbcharset, $charset;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @throws DibiNotSupportedException
|
* @throws DibiNotSupportedException
|
||||||
*/
|
*/
|
||||||
@@ -57,12 +58,13 @@ class DibiSqlite3Driver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Connects to a database.
|
* Connects to a database.
|
||||||
* @return void
|
* @return void
|
||||||
* @throws DibiException
|
* @throws DibiException
|
||||||
*/
|
*/
|
||||||
public function connect(array & $config)
|
public function connect(array &$config)
|
||||||
{
|
{
|
||||||
DibiConnection::alias($config, 'database', 'file');
|
DibiConnection::alias($config, 'database', 'file');
|
||||||
$this->fmtDate = isset($config['formatDate']) ? $config['formatDate'] : 'U';
|
$this->fmtDate = isset($config['formatDate']) ? $config['formatDate'] : 'U';
|
||||||
@@ -91,6 +93,7 @@ class DibiSqlite3Driver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Disconnects from a database.
|
* Disconnects from a database.
|
||||||
* @return void
|
* @return void
|
||||||
@@ -101,6 +104,7 @@ class DibiSqlite3Driver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Executes the SQL query.
|
* Executes the SQL query.
|
||||||
* @param string SQL statement.
|
* @param string SQL statement.
|
||||||
@@ -123,6 +127,7 @@ class DibiSqlite3Driver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the number of affected rows by the last INSERT, UPDATE or DELETE query.
|
* Gets the number of affected rows by the last INSERT, UPDATE or DELETE query.
|
||||||
* @return int|FALSE number of rows or FALSE on error
|
* @return int|FALSE number of rows or FALSE on error
|
||||||
@@ -133,6 +138,7 @@ class DibiSqlite3Driver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves the ID generated for an AUTO_INCREMENT column by the previous INSERT query.
|
* Retrieves the ID generated for an AUTO_INCREMENT column by the previous INSERT query.
|
||||||
* @return int|FALSE int on success or FALSE on failure
|
* @return int|FALSE int on success or FALSE on failure
|
||||||
@@ -143,6 +149,7 @@ class DibiSqlite3Driver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Begins a transaction (if supported).
|
* Begins a transaction (if supported).
|
||||||
* @param string optional savepoint name
|
* @param string optional savepoint name
|
||||||
@@ -155,6 +162,7 @@ class DibiSqlite3Driver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Commits statements in a transaction.
|
* Commits statements in a transaction.
|
||||||
* @param string optional savepoint name
|
* @param string optional savepoint name
|
||||||
@@ -167,6 +175,7 @@ class DibiSqlite3Driver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Rollback changes in a transaction.
|
* Rollback changes in a transaction.
|
||||||
* @param string optional savepoint name
|
* @param string optional savepoint name
|
||||||
@@ -179,6 +188,7 @@ class DibiSqlite3Driver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the connection resource.
|
* Returns the connection resource.
|
||||||
* @return mixed
|
* @return mixed
|
||||||
@@ -189,6 +199,7 @@ class DibiSqlite3Driver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the connection reflector.
|
* Returns the connection reflector.
|
||||||
* @return IDibiReflector
|
* @return IDibiReflector
|
||||||
@@ -199,6 +210,7 @@ class DibiSqlite3Driver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Result set driver factory.
|
* Result set driver factory.
|
||||||
* @param SQLite3Result
|
* @param SQLite3Result
|
||||||
@@ -212,9 +224,11 @@ class DibiSqlite3Driver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************* SQL ****************d*g**/
|
/********************* SQL ****************d*g**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encodes data for use in a SQL statement.
|
* Encodes data for use in a SQL statement.
|
||||||
* @param mixed value
|
* @param mixed value
|
||||||
@@ -225,30 +239,31 @@ class DibiSqlite3Driver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
public function escape($value, $type)
|
public function escape($value, $type)
|
||||||
{
|
{
|
||||||
switch ($type) {
|
switch ($type) {
|
||||||
case dibi::TEXT:
|
case dibi::TEXT:
|
||||||
return "'" . $this->connection->escapeString($value) . "'";
|
return "'" . $this->connection->escapeString($value) . "'";
|
||||||
|
|
||||||
case dibi::BINARY:
|
case dibi::BINARY:
|
||||||
return "X'" . bin2hex((string) $value) . "'";
|
return "X'" . bin2hex((string) $value) . "'";
|
||||||
|
|
||||||
case dibi::IDENTIFIER:
|
case dibi::IDENTIFIER:
|
||||||
return '[' . strtr($value, '[]', ' ') . ']';
|
return '[' . strtr($value, '[]', ' ') . ']';
|
||||||
|
|
||||||
case dibi::BOOL:
|
case dibi::BOOL:
|
||||||
return $value ? 1 : 0;
|
return $value ? 1 : 0;
|
||||||
|
|
||||||
case dibi::DATE:
|
case dibi::DATE:
|
||||||
return $value instanceof DateTime ? $value->format($this->fmtDate) : date($this->fmtDate, $value);
|
return $value instanceof DateTime ? $value->format($this->fmtDate) : date($this->fmtDate, $value);
|
||||||
|
|
||||||
case dibi::DATETIME:
|
case dibi::DATETIME:
|
||||||
return $value instanceof DateTime ? $value->format($this->fmtDateTime) : date($this->fmtDateTime, $value);
|
return $value instanceof DateTime ? $value->format($this->fmtDateTime) : date($this->fmtDateTime, $value);
|
||||||
|
|
||||||
default:
|
default:
|
||||||
throw new InvalidArgumentException('Unsupported type.');
|
throw new InvalidArgumentException('Unsupported type.');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encodes string for use in a LIKE statement.
|
* Encodes string for use in a LIKE statement.
|
||||||
* @param string
|
* @param string
|
||||||
@@ -262,6 +277,7 @@ class DibiSqlite3Driver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decodes data from result set.
|
* Decodes data from result set.
|
||||||
* @param string value
|
* @param string value
|
||||||
@@ -278,21 +294,26 @@ class DibiSqlite3Driver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Injects LIMIT/OFFSET to the SQL query.
|
* Injects LIMIT/OFFSET to the SQL query.
|
||||||
|
* @param string &$sql The SQL query that will be modified.
|
||||||
|
* @param int $limit
|
||||||
|
* @param int $offset
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function applyLimit(& $sql, $limit, $offset)
|
public function applyLimit(&$sql, $limit, $offset)
|
||||||
{
|
{
|
||||||
if ($limit >= 0 || $offset > 0) {
|
if ($limit < 0 && $offset < 1) return;
|
||||||
$sql .= ' LIMIT ' . (int) $limit . ($offset > 0 ? ' OFFSET ' . (int) $offset : '');
|
$sql .= ' LIMIT ' . $limit . ($offset > 0 ? ' OFFSET ' . (int) $offset : '');
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************* result set ****************d*g**/
|
/********************* result set ****************d*g**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Automatically frees the resources allocated for this result set.
|
* Automatically frees the resources allocated for this result set.
|
||||||
* @return void
|
* @return void
|
||||||
@@ -303,6 +324,7 @@ class DibiSqlite3Driver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the number of rows in a result set.
|
* Returns the number of rows in a result set.
|
||||||
* @return int
|
* @return int
|
||||||
@@ -314,6 +336,7 @@ class DibiSqlite3Driver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fetches the row at current position and moves the internal cursor to the next position.
|
* Fetches the row at current position and moves the internal cursor to the next position.
|
||||||
* @param bool TRUE for associative array, FALSE for numeric
|
* @param bool TRUE for associative array, FALSE for numeric
|
||||||
@@ -337,6 +360,7 @@ class DibiSqlite3Driver 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
|
||||||
@@ -349,6 +373,7 @@ class DibiSqlite3Driver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Frees the resources allocated for this result set.
|
* Frees the resources allocated for this result set.
|
||||||
* @return void
|
* @return void
|
||||||
@@ -360,6 +385,7 @@ class DibiSqlite3Driver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns metadata for all columns in a result set.
|
* Returns metadata for all columns in a result set.
|
||||||
* @return array
|
* @return array
|
||||||
@@ -381,6 +407,7 @@ class DibiSqlite3Driver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the result set resource.
|
* Returns the result set resource.
|
||||||
* @return mixed
|
* @return mixed
|
||||||
@@ -392,9 +419,11 @@ class DibiSqlite3Driver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************* user defined functions ****************d*g**/
|
/********************* user defined functions ****************d*g**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Registers an user defined function for use in SQL statements.
|
* Registers an user defined function for use in SQL statements.
|
||||||
* @param string function name
|
* @param string function name
|
||||||
@@ -408,6 +437,7 @@ class DibiSqlite3Driver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Registers an aggregating user defined function for use in SQL statements.
|
* Registers an aggregating user defined function for use in SQL statements.
|
||||||
* @param string function name
|
* @param string function name
|
@@ -10,6 +10,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* dibi connection.
|
* dibi connection.
|
||||||
*
|
*
|
||||||
@@ -44,6 +45,7 @@ class DibiConnection extends DibiObject
|
|||||||
private $substitutes;
|
private $substitutes;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Connection options: (see driver-specific options too)
|
* Connection options: (see driver-specific options too)
|
||||||
* - lazy (bool) => if TRUE, connection will be established only when required
|
* - lazy (bool) => if TRUE, connection will be established only when required
|
||||||
@@ -87,10 +89,10 @@ class DibiConnection extends DibiObject
|
|||||||
$config['driver'] = dibi::$defaultDriver;
|
$config['driver'] = dibi::$defaultDriver;
|
||||||
}
|
}
|
||||||
|
|
||||||
$class = preg_replace(array('#\W#', '#sql#'), array('_', 'Sql'), ucfirst(strtolower($config['driver'])));
|
$driver = preg_replace('#[^a-z0-9_]#', '_', strtolower($config['driver']));
|
||||||
$class = "Dibi{$class}Driver";
|
$class = "Dibi" . $driver . "Driver";
|
||||||
if (!class_exists($class, FALSE)) {
|
if (!class_exists($class, FALSE)) {
|
||||||
include_once dirname(__FILE__) . "/../drivers/$class.php";
|
include_once dirname(__FILE__) . "/../drivers/$driver.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'.");
|
||||||
@@ -137,6 +139,7 @@ class DibiConnection extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Automatically frees the resources allocated for this result set.
|
* Automatically frees the resources allocated for this result set.
|
||||||
* @return void
|
* @return void
|
||||||
@@ -148,6 +151,7 @@ class DibiConnection extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Connects to a database.
|
* Connects to a database.
|
||||||
* @return void
|
* @return void
|
||||||
@@ -167,6 +171,7 @@ class DibiConnection extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Disconnects from a database.
|
* Disconnects from a database.
|
||||||
* @return void
|
* @return void
|
||||||
@@ -178,6 +183,7 @@ class DibiConnection extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns TRUE when connection was established.
|
* Returns TRUE when connection was established.
|
||||||
* @return bool
|
* @return bool
|
||||||
@@ -188,6 +194,7 @@ class DibiConnection extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns configuration variable. If no $key is passed, returns the entire array.
|
* Returns configuration variable. If no $key is passed, returns the entire array.
|
||||||
* @see self::__construct
|
* @see self::__construct
|
||||||
@@ -209,6 +216,7 @@ class DibiConnection extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Apply configuration alias or default values.
|
* Apply configuration alias or default values.
|
||||||
* @param array connect configuration
|
* @param array connect configuration
|
||||||
@@ -216,12 +224,10 @@ class DibiConnection extends DibiObject
|
|||||||
* @param string alias key
|
* @param string alias key
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public static function alias(& $config, $key, $alias)
|
public static function alias(&$config, $key, $alias)
|
||||||
{
|
{
|
||||||
$foo = & $config;
|
$foo = & $config;
|
||||||
foreach (explode('|', $key) as $key) {
|
foreach (explode('|', $key) as $key) $foo = & $foo[$key];
|
||||||
$foo = & $foo[$key];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!isset($foo) && isset($config[$alias])) {
|
if (!isset($foo) && isset($config[$alias])) {
|
||||||
$foo = $config[$alias];
|
$foo = $config[$alias];
|
||||||
@@ -230,6 +236,7 @@ class DibiConnection extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the driver and connects to a database in lazy mode.
|
* Returns the driver and connects to a database in lazy mode.
|
||||||
* @return IDibiDriver
|
* @return IDibiDriver
|
||||||
@@ -241,6 +248,7 @@ class DibiConnection extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates (translates) and executes SQL query.
|
* Generates (translates) and executes SQL query.
|
||||||
* @param array|mixed one or more arguments
|
* @param array|mixed one or more arguments
|
||||||
@@ -254,6 +262,7 @@ class DibiConnection extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates SQL query.
|
* Generates SQL query.
|
||||||
* @param array|mixed one or more arguments
|
* @param array|mixed one or more arguments
|
||||||
@@ -267,6 +276,7 @@ class DibiConnection extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates and prints SQL query.
|
* Generates and prints SQL query.
|
||||||
* @param array|mixed one or more arguments
|
* @param array|mixed one or more arguments
|
||||||
@@ -290,6 +300,7 @@ class DibiConnection extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates (translates) and returns SQL query as DibiDataSource.
|
* Generates (translates) and returns SQL query as DibiDataSource.
|
||||||
* @param array|mixed one or more arguments
|
* @param array|mixed one or more arguments
|
||||||
@@ -303,6 +314,7 @@ class DibiConnection extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates SQL query.
|
* Generates SQL query.
|
||||||
* @param array
|
* @param array
|
||||||
@@ -315,6 +327,7 @@ class DibiConnection extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Executes the SQL query.
|
* Executes the SQL query.
|
||||||
* @param string SQL statement.
|
* @param string SQL statement.
|
||||||
@@ -346,6 +359,7 @@ class DibiConnection extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the number of affected rows by the last INSERT, UPDATE or DELETE query.
|
* Gets the number of affected rows by the last INSERT, UPDATE or DELETE query.
|
||||||
* @return int number of rows
|
* @return int number of rows
|
||||||
@@ -355,13 +369,12 @@ class DibiConnection extends DibiObject
|
|||||||
{
|
{
|
||||||
$this->connected || $this->connect();
|
$this->connected || $this->connect();
|
||||||
$rows = $this->driver->getAffectedRows();
|
$rows = $this->driver->getAffectedRows();
|
||||||
if (!is_int($rows) || $rows < 0) {
|
if (!is_int($rows) || $rows < 0) throw new DibiException('Cannot retrieve number of affected rows.');
|
||||||
throw new DibiException('Cannot retrieve number of affected rows.');
|
|
||||||
}
|
|
||||||
return $rows;
|
return $rows;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the number of affected rows. Alias for getAffectedRows().
|
* Gets the number of affected rows. Alias for getAffectedRows().
|
||||||
* @return int number of rows
|
* @return int number of rows
|
||||||
@@ -373,6 +386,7 @@ class DibiConnection extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves the ID generated for an AUTO_INCREMENT column by the previous INSERT query.
|
* Retrieves the ID generated for an AUTO_INCREMENT column by the previous INSERT query.
|
||||||
* @param string optional sequence name
|
* @param string optional sequence name
|
||||||
@@ -383,13 +397,12 @@ class DibiConnection extends DibiObject
|
|||||||
{
|
{
|
||||||
$this->connected || $this->connect();
|
$this->connected || $this->connect();
|
||||||
$id = $this->driver->getInsertId($sequence);
|
$id = $this->driver->getInsertId($sequence);
|
||||||
if ($id < 1) {
|
if ($id < 1) throw new DibiException('Cannot retrieve last generated ID.');
|
||||||
throw new DibiException('Cannot retrieve last generated ID.');
|
|
||||||
}
|
|
||||||
return (int) $id;
|
return (int) $id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves the ID generated for an AUTO_INCREMENT column. Alias for getInsertId().
|
* Retrieves the ID generated for an AUTO_INCREMENT column. Alias for getInsertId().
|
||||||
* @param string optional sequence name
|
* @param string optional sequence name
|
||||||
@@ -402,6 +415,7 @@ class DibiConnection extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Begins a transaction (if supported).
|
* Begins a transaction (if supported).
|
||||||
* @param string optional savepoint name
|
* @param string optional savepoint name
|
||||||
@@ -422,6 +436,7 @@ class DibiConnection extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Commits statements in a transaction.
|
* Commits statements in a transaction.
|
||||||
* @param string optional savepoint name
|
* @param string optional savepoint name
|
||||||
@@ -442,6 +457,7 @@ class DibiConnection extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Rollback changes in a transaction.
|
* Rollback changes in a transaction.
|
||||||
* @param string optional savepoint name
|
* @param string optional savepoint name
|
||||||
@@ -462,6 +478,7 @@ class DibiConnection extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Result set factory.
|
* Result set factory.
|
||||||
* @param IDibiResultDriver
|
* @param IDibiResultDriver
|
||||||
@@ -475,9 +492,11 @@ class DibiConnection extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************* fluent SQL builders ****************d*g**/
|
/********************* fluent SQL builders ****************d*g**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return DibiFluent
|
* @return DibiFluent
|
||||||
*/
|
*/
|
||||||
@@ -487,6 +506,7 @@ class DibiConnection extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string column name
|
* @param string column name
|
||||||
* @return DibiFluent
|
* @return DibiFluent
|
||||||
@@ -498,6 +518,7 @@ class DibiConnection extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string table
|
* @param string table
|
||||||
* @param array
|
* @param array
|
||||||
@@ -512,6 +533,7 @@ class DibiConnection extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string table
|
* @param string table
|
||||||
* @param array
|
* @param array
|
||||||
@@ -529,6 +551,7 @@ class DibiConnection extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string table
|
* @param string table
|
||||||
* @return DibiFluent
|
* @return DibiFluent
|
||||||
@@ -539,9 +562,11 @@ class DibiConnection extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************* substitutions ****************d*g**/
|
/********************* substitutions ****************d*g**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns substitution hashmap.
|
* Returns substitution hashmap.
|
||||||
* @return DibiHashMap
|
* @return DibiHashMap
|
||||||
@@ -552,6 +577,7 @@ class DibiConnection extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provides substitution.
|
* Provides substitution.
|
||||||
* @return string
|
* @return string
|
||||||
@@ -562,6 +588,7 @@ class DibiConnection extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Substitution callback.
|
* Substitution callback.
|
||||||
*/
|
*/
|
||||||
@@ -571,9 +598,11 @@ class DibiConnection extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************* shortcuts ****************d*g**/
|
/********************* shortcuts ****************d*g**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Executes SQL query and fetch result - shortcut for query() & fetch().
|
* Executes SQL query and fetch result - shortcut for query() & fetch().
|
||||||
* @param array|mixed one or more arguments
|
* @param array|mixed one or more arguments
|
||||||
@@ -587,6 +616,7 @@ class DibiConnection extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Executes SQL query and fetch results - shortcut for query() & fetchAll().
|
* Executes SQL query and fetch results - shortcut for query() & fetchAll().
|
||||||
* @param array|mixed one or more arguments
|
* @param array|mixed one or more arguments
|
||||||
@@ -600,6 +630,7 @@ class DibiConnection extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Executes SQL query and fetch first column - shortcut for query() & fetchSingle().
|
* Executes SQL query and fetch first column - shortcut for query() & fetchSingle().
|
||||||
* @param array|mixed one or more arguments
|
* @param array|mixed one or more arguments
|
||||||
@@ -613,6 +644,7 @@ class DibiConnection extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Executes SQL query and fetch pairs - shortcut for query() & fetchPairs().
|
* Executes SQL query and fetch pairs - shortcut for query() & fetchPairs().
|
||||||
* @param array|mixed one or more arguments
|
* @param array|mixed one or more arguments
|
||||||
@@ -626,9 +658,11 @@ class DibiConnection extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************* misc ****************d*g**/
|
/********************* misc ****************d*g**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Import SQL dump from file - extreme fast!
|
* Import SQL dump from file - extreme fast!
|
||||||
* @param string filename
|
* @param string filename
|
||||||
@@ -664,6 +698,7 @@ class DibiConnection extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets a information about the current database.
|
* Gets a information about the current database.
|
||||||
* @return DibiDatabaseInfo
|
* @return DibiDatabaseInfo
|
||||||
@@ -675,6 +710,7 @@ class DibiConnection extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Prevents unserialization.
|
* Prevents unserialization.
|
||||||
*/
|
*/
|
||||||
@@ -684,6 +720,7 @@ class DibiConnection extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Prevents serialization.
|
* Prevents serialization.
|
||||||
*/
|
*/
|
||||||
|
@@ -10,6 +10,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default implementation of IDataSource for dibi.
|
* Default implementation of IDataSource for dibi.
|
||||||
*
|
*
|
||||||
@@ -54,6 +55,7 @@ class DibiDataSource extends DibiObject implements IDataSource
|
|||||||
private $limit;
|
private $limit;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string SQL command or table or view name, as data source
|
* @param string SQL command or table or view name, as data source
|
||||||
* @param DibiConnection connection
|
* @param DibiConnection connection
|
||||||
@@ -69,11 +71,12 @@ class DibiDataSource extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Selects columns to query.
|
* Selects columns to query.
|
||||||
* @param string|array column name or array of column names
|
* @param string|array column name or array of column names
|
||||||
* @param string column alias
|
* @param string column alias
|
||||||
* @return self
|
* @return DibiDataSource provides a fluent interface
|
||||||
*/
|
*/
|
||||||
public function select($col, $as = NULL)
|
public function select($col, $as = NULL)
|
||||||
{
|
{
|
||||||
@@ -87,10 +90,11 @@ class DibiDataSource extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds conditions to query.
|
* Adds conditions to query.
|
||||||
* @param mixed conditions
|
* @param mixed conditions
|
||||||
* @return self
|
* @return DibiDataSource provides a fluent interface
|
||||||
*/
|
*/
|
||||||
public function where($cond)
|
public function where($cond)
|
||||||
{
|
{
|
||||||
@@ -105,11 +109,12 @@ class DibiDataSource extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Selects columns to order by.
|
* Selects columns to order by.
|
||||||
* @param string|array column name or array of column names
|
* @param string|array column name or array of column names
|
||||||
* @param string sorting direction
|
* @param string sorting direction
|
||||||
* @return self
|
* @return DibiDataSource provides a fluent interface
|
||||||
*/
|
*/
|
||||||
public function orderBy($row, $sorting = 'ASC')
|
public function orderBy($row, $sorting = 'ASC')
|
||||||
{
|
{
|
||||||
@@ -123,11 +128,12 @@ class DibiDataSource extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Limits number of rows.
|
* Limits number of rows.
|
||||||
* @param int limit
|
* @param int limit
|
||||||
* @param int offset
|
* @param int offset
|
||||||
* @return self
|
* @return DibiDataSource provides a fluent interface
|
||||||
*/
|
*/
|
||||||
public function applyLimit($limit, $offset = NULL)
|
public function applyLimit($limit, $offset = NULL)
|
||||||
{
|
{
|
||||||
@@ -138,6 +144,7 @@ class DibiDataSource extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the dibi connection.
|
* Returns the dibi connection.
|
||||||
* @return DibiConnection
|
* @return DibiConnection
|
||||||
@@ -148,9 +155,11 @@ class DibiDataSource extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************* executing ****************d*g**/
|
/********************* executing ****************d*g**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns (and queries) DibiResult.
|
* Returns (and queries) DibiResult.
|
||||||
* @return DibiResult
|
* @return DibiResult
|
||||||
@@ -164,6 +173,7 @@ class DibiDataSource extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return DibiResultIterator
|
* @return DibiResultIterator
|
||||||
*/
|
*/
|
||||||
@@ -173,6 +183,7 @@ class DibiDataSource extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates, executes SQL query and fetches the single row.
|
* Generates, executes SQL query and fetches the single row.
|
||||||
* @return DibiRow|FALSE array on success, FALSE if no next record
|
* @return DibiRow|FALSE array on success, FALSE if no next record
|
||||||
@@ -183,6 +194,7 @@ class DibiDataSource extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Like fetch(), but returns only first field.
|
* Like fetch(), but returns only first field.
|
||||||
* @return mixed value on success, FALSE if no next record
|
* @return mixed value on success, FALSE if no next record
|
||||||
@@ -193,6 +205,7 @@ class DibiDataSource extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fetches all records from table.
|
* Fetches all records from table.
|
||||||
* @return array
|
* @return array
|
||||||
@@ -203,6 +216,7 @@ class DibiDataSource extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fetches all records from table and returns associative tree.
|
* Fetches all records from table and returns associative tree.
|
||||||
* @param string associative descriptor
|
* @param string associative descriptor
|
||||||
@@ -214,6 +228,7 @@ class DibiDataSource extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fetches all records from table like $key => $value pairs.
|
* Fetches all records from table like $key => $value pairs.
|
||||||
* @param string associative key
|
* @param string associative key
|
||||||
@@ -226,6 +241,7 @@ class DibiDataSource extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Discards the internal cache.
|
* Discards the internal cache.
|
||||||
* @return void
|
* @return void
|
||||||
@@ -236,9 +252,11 @@ class DibiDataSource extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************* exporting ****************d*g**/
|
/********************* exporting ****************d*g**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns this data source wrapped in DibiFluent object.
|
* Returns this data source wrapped in DibiFluent object.
|
||||||
* @return DibiFluent
|
* @return DibiFluent
|
||||||
@@ -249,6 +267,7 @@ class DibiDataSource extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns this data source wrapped in DibiDataSource object.
|
* Returns this data source wrapped in DibiDataSource object.
|
||||||
* @return DibiDataSource
|
* @return DibiDataSource
|
||||||
@@ -259,6 +278,7 @@ class DibiDataSource extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns SQL query.
|
* Returns SQL query.
|
||||||
* @return string
|
* @return string
|
||||||
@@ -279,9 +299,11 @@ FROM %SQL', $this->sql, '
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************* counting ****************d*g**/
|
/********************* counting ****************d*g**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the number of rows in a given data source.
|
* Returns the number of rows in a given data source.
|
||||||
* @return int
|
* @return int
|
||||||
@@ -299,6 +321,7 @@ FROM %SQL', $this->sql, '
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the number of rows in a given data source.
|
* Returns the number of rows in a given data source.
|
||||||
* @return int
|
* @return int
|
||||||
|
@@ -10,6 +10,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reflection metadata class for a database.
|
* Reflection metadata class for a database.
|
||||||
*
|
*
|
||||||
@@ -32,6 +33,7 @@ class DibiDatabaseInfo extends DibiObject
|
|||||||
private $tables;
|
private $tables;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public function __construct(IDibiReflector $reflector, $name)
|
public function __construct(IDibiReflector $reflector, $name)
|
||||||
{
|
{
|
||||||
$this->reflector = $reflector;
|
$this->reflector = $reflector;
|
||||||
@@ -39,6 +41,7 @@ class DibiDatabaseInfo extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
@@ -48,6 +51,7 @@ class DibiDatabaseInfo extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return array of DibiTableInfo
|
* @return array of DibiTableInfo
|
||||||
*/
|
*/
|
||||||
@@ -58,6 +62,7 @@ class DibiDatabaseInfo extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return array of string
|
* @return array of string
|
||||||
*/
|
*/
|
||||||
@@ -72,6 +77,7 @@ class DibiDatabaseInfo extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string
|
* @param string
|
||||||
* @return DibiTableInfo
|
* @return DibiTableInfo
|
||||||
@@ -89,6 +95,7 @@ class DibiDatabaseInfo extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string
|
* @param string
|
||||||
* @return bool
|
* @return bool
|
||||||
@@ -100,6 +107,7 @@ class DibiDatabaseInfo extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
@@ -116,6 +124,8 @@ class DibiDatabaseInfo extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reflection metadata class for a database table.
|
* Reflection metadata class for a database table.
|
||||||
*
|
*
|
||||||
@@ -154,6 +164,7 @@ class DibiTableInfo extends DibiObject
|
|||||||
private $primaryKey;
|
private $primaryKey;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public function __construct(IDibiReflector $reflector, array $info)
|
public function __construct(IDibiReflector $reflector, array $info)
|
||||||
{
|
{
|
||||||
$this->reflector = $reflector;
|
$this->reflector = $reflector;
|
||||||
@@ -162,6 +173,7 @@ class DibiTableInfo extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
@@ -171,6 +183,7 @@ class DibiTableInfo extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
@@ -180,6 +193,7 @@ class DibiTableInfo extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return array of DibiColumnInfo
|
* @return array of DibiColumnInfo
|
||||||
*/
|
*/
|
||||||
@@ -190,6 +204,7 @@ class DibiTableInfo extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return array of string
|
* @return array of string
|
||||||
*/
|
*/
|
||||||
@@ -204,6 +219,7 @@ class DibiTableInfo extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string
|
* @param string
|
||||||
* @return DibiColumnInfo
|
* @return DibiColumnInfo
|
||||||
@@ -221,6 +237,7 @@ class DibiTableInfo extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string
|
* @param string
|
||||||
* @return bool
|
* @return bool
|
||||||
@@ -232,6 +249,7 @@ class DibiTableInfo extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return array of DibiForeignKeyInfo
|
* @return array of DibiForeignKeyInfo
|
||||||
*/
|
*/
|
||||||
@@ -242,6 +260,7 @@ class DibiTableInfo extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return array of DibiIndexInfo
|
* @return array of DibiIndexInfo
|
||||||
*/
|
*/
|
||||||
@@ -252,6 +271,7 @@ class DibiTableInfo extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return DibiIndexInfo
|
* @return DibiIndexInfo
|
||||||
*/
|
*/
|
||||||
@@ -262,6 +282,7 @@ class DibiTableInfo extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
@@ -276,6 +297,7 @@ class DibiTableInfo extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
@@ -297,6 +319,7 @@ class DibiTableInfo extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
@@ -308,6 +331,8 @@ class DibiTableInfo extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reflection metadata class for a result set.
|
* Reflection metadata class for a result set.
|
||||||
*
|
*
|
||||||
@@ -329,12 +354,14 @@ class DibiResultInfo extends DibiObject
|
|||||||
private $names;
|
private $names;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public function __construct(IDibiResultDriver $driver)
|
public function __construct(IDibiResultDriver $driver)
|
||||||
{
|
{
|
||||||
$this->driver = $driver;
|
$this->driver = $driver;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return array of DibiColumnInfo
|
* @return array of DibiColumnInfo
|
||||||
*/
|
*/
|
||||||
@@ -345,6 +372,7 @@ class DibiResultInfo extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param bool
|
* @param bool
|
||||||
* @return array of string
|
* @return array of string
|
||||||
@@ -360,6 +388,7 @@ class DibiResultInfo extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string
|
* @param string
|
||||||
* @return DibiColumnInfo
|
* @return DibiColumnInfo
|
||||||
@@ -377,6 +406,7 @@ class DibiResultInfo extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string
|
* @param string
|
||||||
* @return bool
|
* @return bool
|
||||||
@@ -388,6 +418,7 @@ class DibiResultInfo extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
@@ -405,6 +436,8 @@ class DibiResultInfo extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reflection metadata class for a table or result set column.
|
* Reflection metadata class for a table or result set column.
|
||||||
*
|
*
|
||||||
@@ -434,6 +467,7 @@ class DibiColumnInfo extends DibiObject
|
|||||||
private $info;
|
private $info;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public function __construct(IDibiReflector $reflector = NULL, array $info)
|
public function __construct(IDibiReflector $reflector = NULL, array $info)
|
||||||
{
|
{
|
||||||
$this->reflector = $reflector;
|
$this->reflector = $reflector;
|
||||||
@@ -441,6 +475,7 @@ class DibiColumnInfo extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
@@ -450,6 +485,7 @@ class DibiColumnInfo extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
@@ -459,6 +495,7 @@ class DibiColumnInfo extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
@@ -468,6 +505,7 @@ class DibiColumnInfo extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return DibiTableInfo
|
* @return DibiTableInfo
|
||||||
*/
|
*/
|
||||||
@@ -480,6 +518,7 @@ class DibiColumnInfo extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
@@ -489,6 +528,7 @@ class DibiColumnInfo extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
@@ -498,6 +538,7 @@ class DibiColumnInfo extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return mixed
|
* @return mixed
|
||||||
*/
|
*/
|
||||||
@@ -507,6 +548,7 @@ class DibiColumnInfo extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return int
|
* @return int
|
||||||
*/
|
*/
|
||||||
@@ -516,6 +558,7 @@ class DibiColumnInfo extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
@@ -525,6 +568,7 @@ class DibiColumnInfo extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
@@ -534,6 +578,7 @@ class DibiColumnInfo extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
@@ -543,6 +588,7 @@ class DibiColumnInfo extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return mixed
|
* @return mixed
|
||||||
*/
|
*/
|
||||||
@@ -552,6 +598,7 @@ class DibiColumnInfo extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string
|
* @param string
|
||||||
* @return mixed
|
* @return mixed
|
||||||
@@ -562,6 +609,7 @@ class DibiColumnInfo extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Heuristic type detection.
|
* Heuristic type detection.
|
||||||
* @param string
|
* @param string
|
||||||
@@ -573,13 +621,13 @@ class DibiColumnInfo extends DibiObject
|
|||||||
static $patterns = array(
|
static $patterns = array(
|
||||||
'^_' => 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' => dibi::TEXT,
|
||||||
'YEAR|BYTE|COUNTER|SERIAL|INT|LONG|SHORT' => dibi::INTEGER,
|
'YEAR|BYTE|COUNTER|SERIAL|INT|LONG' => 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
|
||||||
'DATE' => dibi::DATE,
|
'DATE' => dibi::DATE,
|
||||||
'BOOL' => dibi::BOOL,
|
'BOOL|BIT' => dibi::BOOL,
|
||||||
);
|
);
|
||||||
|
|
||||||
foreach ($patterns as $s => $val) {
|
foreach ($patterns as $s => $val) {
|
||||||
@@ -591,6 +639,7 @@ class DibiColumnInfo extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @internal
|
* @internal
|
||||||
*/
|
*/
|
||||||
@@ -605,6 +654,8 @@ class DibiColumnInfo extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reflection metadata class for a foreign key.
|
* Reflection metadata class for a foreign key.
|
||||||
*
|
*
|
||||||
@@ -624,6 +675,7 @@ class DibiForeignKeyInfo extends DibiObject
|
|||||||
private $references;
|
private $references;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public function __construct($name, array $references)
|
public function __construct($name, array $references)
|
||||||
{
|
{
|
||||||
$this->name = $name;
|
$this->name = $name;
|
||||||
@@ -631,6 +683,7 @@ class DibiForeignKeyInfo extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
@@ -640,6 +693,7 @@ class DibiForeignKeyInfo extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
@@ -651,6 +705,8 @@ class DibiForeignKeyInfo extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reflection metadata class for a index or primary key.
|
* Reflection metadata class for a index or primary key.
|
||||||
*
|
*
|
||||||
@@ -674,6 +730,7 @@ class DibiIndexInfo extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
@@ -683,6 +740,7 @@ class DibiIndexInfo extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
@@ -692,6 +750,7 @@ class DibiIndexInfo extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
@@ -701,6 +760,7 @@ class DibiIndexInfo extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
|
@@ -10,6 +10,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* DateTime with serialization and timestamp support for PHP 5.2.
|
* DateTime with serialization and timestamp support for PHP 5.2.
|
||||||
*
|
*
|
||||||
@@ -32,6 +33,7 @@ class DibiDateTime extends DateTime
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public function modifyClone($modify = '')
|
public function modifyClone($modify = '')
|
||||||
{
|
{
|
||||||
$dolly = clone($this);
|
$dolly = clone($this);
|
||||||
@@ -39,6 +41,7 @@ class DibiDateTime extends DateTime
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public function modify($modify)
|
public function modify($modify)
|
||||||
{
|
{
|
||||||
parent::modify($modify);
|
parent::modify($modify);
|
||||||
@@ -46,6 +49,7 @@ class DibiDateTime extends DateTime
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public function __sleep()
|
public function __sleep()
|
||||||
{
|
{
|
||||||
$this->fix = array($this->format('Y-m-d H:i:s'), $this->getTimezone()->getName());
|
$this->fix = array($this->format('Y-m-d H:i:s'), $this->getTimezone()->getName());
|
||||||
@@ -53,6 +57,7 @@ class DibiDateTime extends DateTime
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public function __wakeup()
|
public function __wakeup()
|
||||||
{
|
{
|
||||||
$this->__construct($this->fix[0], new DateTimeZone($this->fix[1]));
|
$this->__construct($this->fix[0], new DateTimeZone($this->fix[1]));
|
||||||
@@ -60,18 +65,21 @@ class DibiDateTime extends DateTime
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public function getTimestamp()
|
public function getTimestamp()
|
||||||
{
|
{
|
||||||
return (int) $this->format('U');
|
return (int) $this->format('U');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public function setTimestamp($timestamp)
|
public function setTimestamp($timestamp)
|
||||||
{
|
{
|
||||||
return $this->__construct(date('Y-m-d H:i:s', $timestamp), new DateTimeZone($this->getTimezone()->getName())); // getTimeZone() crashes in PHP 5.2.6
|
return $this->__construct(date('Y-m-d H:i:s', $timestamp), new DateTimeZone($this->getTimezone()->getName())); // getTimeZone() crashes in PHP 5.2.6
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public function __toString()
|
public function __toString()
|
||||||
{
|
{
|
||||||
return $this->format('Y-m-d H:i:s');
|
return $this->format('Y-m-d H:i:s');
|
||||||
|
@@ -10,6 +10,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Profiler & logger event.
|
* Profiler & logger event.
|
||||||
*
|
*
|
||||||
@@ -53,6 +54,7 @@ class DibiEvent
|
|||||||
public $source;
|
public $source;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public function __construct(DibiConnection $connection, $type, $sql = NULL)
|
public function __construct(DibiConnection $connection, $type, $sql = NULL)
|
||||||
{
|
{
|
||||||
$this->connection = $connection;
|
$this->connection = $connection;
|
||||||
@@ -83,6 +85,7 @@ class DibiEvent
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public function done($result = NULL)
|
public function done($result = NULL)
|
||||||
{
|
{
|
||||||
$this->result = $result;
|
$this->result = $result;
|
||||||
|
@@ -10,6 +10,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* dibi common exception.
|
* dibi common exception.
|
||||||
*
|
*
|
||||||
@@ -35,6 +36,7 @@ class DibiException extends Exception
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return string The SQL passed to the constructor
|
* @return string The SQL passed to the constructor
|
||||||
*/
|
*/
|
||||||
@@ -44,6 +46,7 @@ class DibiException extends Exception
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return string string represenation of exception with SQL command
|
* @return string string represenation of exception with SQL command
|
||||||
*/
|
*/
|
||||||
@@ -55,6 +58,8 @@ class DibiException extends Exception
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* database server exception.
|
* database server exception.
|
||||||
*
|
*
|
||||||
@@ -67,10 +72,12 @@ class DibiDriverException extends DibiException
|
|||||||
/********************* error catching ****************d*g**/
|
/********************* error catching ****************d*g**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** @var string */
|
/** @var string */
|
||||||
private static $errorMsg;
|
private static $errorMsg;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Starts catching potential errors/warnings.
|
* Starts catching potential errors/warnings.
|
||||||
* @return void
|
* @return void
|
||||||
@@ -82,6 +89,7 @@ class DibiDriverException extends DibiException
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns catched error/warning message.
|
* Returns catched error/warning message.
|
||||||
* @param string catched message
|
* @param string catched message
|
||||||
@@ -96,6 +104,7 @@ class DibiDriverException extends DibiException
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Internal error handler. Do not call directly.
|
* Internal error handler. Do not call directly.
|
||||||
* @internal
|
* @internal
|
||||||
@@ -115,6 +124,8 @@ class DibiDriverException extends DibiException
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* PCRE exception.
|
* PCRE exception.
|
||||||
*
|
*
|
||||||
@@ -138,6 +149,7 @@ class DibiPcreException extends Exception {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @package dibi
|
* @package dibi
|
||||||
*/
|
*/
|
||||||
@@ -145,6 +157,7 @@ class DibiNotImplementedException extends DibiException
|
|||||||
{}
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @package dibi
|
* @package dibi
|
||||||
*/
|
*/
|
||||||
|
@@ -10,6 +10,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* dibi file logger.
|
* dibi file logger.
|
||||||
*
|
*
|
||||||
@@ -25,6 +26,7 @@ class DibiFileLogger extends DibiObject
|
|||||||
public $filter;
|
public $filter;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public function __construct($file, $filter = NULL)
|
public function __construct($file, $filter = NULL)
|
||||||
{
|
{
|
||||||
$this->file = $file;
|
$this->file = $file;
|
||||||
@@ -32,6 +34,7 @@ class DibiFileLogger extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* After event notification.
|
* After event notification.
|
||||||
* @return void
|
* @return void
|
||||||
@@ -43,9 +46,7 @@ class DibiFileLogger extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
$handle = fopen($this->file, 'a');
|
$handle = fopen($this->file, 'a');
|
||||||
if (!$handle) {
|
if (!$handle) return; // or throw exception?
|
||||||
return; // or throw exception?
|
|
||||||
}
|
|
||||||
flock($handle, LOCK_EX);
|
flock($handle, LOCK_EX);
|
||||||
|
|
||||||
if ($event->result instanceof Exception) {
|
if ($event->result instanceof Exception) {
|
||||||
|
@@ -10,6 +10,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* dibi FirePHP logger.
|
* dibi FirePHP logger.
|
||||||
*
|
*
|
||||||
@@ -37,6 +38,7 @@ class DibiFirePhpLogger extends DibiObject
|
|||||||
private static $fireTable = array(array('Time', 'SQL Statement', 'Rows', 'Connection'));
|
private static $fireTable = array(array('Time', 'SQL Statement', 'Rows', 'Connection'));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
@@ -46,12 +48,14 @@ class DibiFirePhpLogger extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public function __construct($filter = NULL)
|
public function __construct($filter = NULL)
|
||||||
{
|
{
|
||||||
$this->filter = $filter ? (int) $filter : DibiEvent::QUERY;
|
$this->filter = $filter ? (int) $filter : DibiEvent::QUERY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* After event notification.
|
* After event notification.
|
||||||
* @return void
|
* @return void
|
||||||
|
@@ -10,6 +10,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* dibi SQL builder via fluent interfaces. EXPERIMENTAL!
|
* dibi SQL builder via fluent interfaces. EXPERIMENTAL!
|
||||||
*
|
*
|
||||||
@@ -100,6 +101,7 @@ class DibiFluent extends DibiObject implements IDataSource
|
|||||||
private static $normalizer;
|
private static $normalizer;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param DibiConnection
|
* @param DibiConnection
|
||||||
*/
|
*/
|
||||||
@@ -113,11 +115,12 @@ class DibiFluent extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Appends new argument to the clause.
|
* Appends new argument to the clause.
|
||||||
* @param string clause name
|
* @param string clause name
|
||||||
* @param array arguments
|
* @param array arguments
|
||||||
* @return self
|
* @return DibiFluent provides a fluent interface
|
||||||
*/
|
*/
|
||||||
public function __call($clause, $args)
|
public function __call($clause, $args)
|
||||||
{
|
{
|
||||||
@@ -202,10 +205,11 @@ class DibiFluent extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Switch to a clause.
|
* Switch to a clause.
|
||||||
* @param string clause name
|
* @param string clause name
|
||||||
* @return self
|
* @return DibiFluent provides a fluent interface
|
||||||
*/
|
*/
|
||||||
public function clause($clause, $remove = FALSE)
|
public function clause($clause, $remove = FALSE)
|
||||||
{
|
{
|
||||||
@@ -223,10 +227,11 @@ class DibiFluent extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Removes a clause.
|
* Removes a clause.
|
||||||
* @param string clause name
|
* @param string clause name
|
||||||
* @return self
|
* @return DibiFluent provides a fluent interface
|
||||||
*/
|
*/
|
||||||
public function removeClause($clause)
|
public function removeClause($clause)
|
||||||
{
|
{
|
||||||
@@ -235,11 +240,12 @@ class DibiFluent extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Change a SQL flag.
|
* Change a SQL flag.
|
||||||
* @param string flag name
|
* @param string flag name
|
||||||
* @param bool value
|
* @param bool value
|
||||||
* @return self
|
* @return DibiFluent provides a fluent interface
|
||||||
*/
|
*/
|
||||||
public function setFlag($flag, $value = TRUE)
|
public function setFlag($flag, $value = TRUE)
|
||||||
{
|
{
|
||||||
@@ -253,6 +259,7 @@ class DibiFluent extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Is a flag set?
|
* Is a flag set?
|
||||||
* @param string flag name
|
* @param string flag name
|
||||||
@@ -264,6 +271,7 @@ class DibiFluent extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns SQL command.
|
* Returns SQL command.
|
||||||
* @return string
|
* @return string
|
||||||
@@ -274,6 +282,7 @@ class DibiFluent extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the dibi connection.
|
* Returns the dibi connection.
|
||||||
* @return DibiConnection
|
* @return DibiConnection
|
||||||
@@ -284,11 +293,12 @@ class DibiFluent extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds DibiResult setup.
|
* Adds DibiResult setup.
|
||||||
* @param string method
|
* @param string method
|
||||||
* @param mixed args
|
* @param mixed args
|
||||||
* @return self
|
* @return DibiFluent provides a fluent interface
|
||||||
*/
|
*/
|
||||||
public function setupResult($method)
|
public function setupResult($method)
|
||||||
{
|
{
|
||||||
@@ -297,9 +307,11 @@ class DibiFluent extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************* executing ****************d*g**/
|
/********************* executing ****************d*g**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates and executes SQL query.
|
* Generates and executes SQL query.
|
||||||
* @param mixed what to return?
|
* @param mixed what to return?
|
||||||
@@ -313,6 +325,7 @@ class DibiFluent extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates, executes SQL query and fetches the single row.
|
* Generates, executes SQL query and fetches the single row.
|
||||||
* @return DibiRow|FALSE array on success, FALSE if no next record
|
* @return DibiRow|FALSE array on success, FALSE if no next record
|
||||||
@@ -327,6 +340,7 @@ class DibiFluent extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Like fetch(), but returns only first field.
|
* Like fetch(), but returns only first field.
|
||||||
* @return mixed value on success, FALSE if no next record
|
* @return mixed value on success, FALSE if no next record
|
||||||
@@ -341,6 +355,7 @@ class DibiFluent extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fetches all records from table.
|
* Fetches all records from table.
|
||||||
* @param int offset
|
* @param int offset
|
||||||
@@ -353,6 +368,7 @@ class DibiFluent extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fetches all records from table and returns associative tree.
|
* Fetches all records from table and returns associative tree.
|
||||||
* @param string associative descriptor
|
* @param string associative descriptor
|
||||||
@@ -364,6 +380,7 @@ class DibiFluent extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fetches all records from table like $key => $value pairs.
|
* Fetches all records from table like $key => $value pairs.
|
||||||
* @param string associative key
|
* @param string associative key
|
||||||
@@ -376,6 +393,7 @@ class DibiFluent extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Required by the IteratorAggregate interface.
|
* Required by the IteratorAggregate interface.
|
||||||
* @param int offset
|
* @param int offset
|
||||||
@@ -388,6 +406,7 @@ class DibiFluent extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates and prints SQL query or it's part.
|
* Generates and prints SQL query or it's part.
|
||||||
* @param string clause name
|
* @param string clause name
|
||||||
@@ -399,6 +418,7 @@ class DibiFluent extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return int
|
* @return int
|
||||||
*/
|
*/
|
||||||
@@ -410,6 +430,7 @@ class DibiFluent extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return DibiResult
|
* @return DibiResult
|
||||||
*/
|
*/
|
||||||
@@ -423,9 +444,11 @@ class DibiFluent extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************* exporting ****************d*g**/
|
/********************* exporting ****************d*g**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return DibiDataSource
|
* @return DibiDataSource
|
||||||
*/
|
*/
|
||||||
@@ -435,6 +458,7 @@ class DibiFluent extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns SQL query.
|
* Returns SQL query.
|
||||||
* @return string
|
* @return string
|
||||||
@@ -449,6 +473,7 @@ class DibiFluent extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates parameters for DibiTranslator.
|
* Generates parameters for DibiTranslator.
|
||||||
* @param string clause name
|
* @param string clause name
|
||||||
@@ -474,9 +499,7 @@ class DibiFluent extends DibiObject implements IDataSource
|
|||||||
if ($clause === $this->command && $this->flags) {
|
if ($clause === $this->command && $this->flags) {
|
||||||
$args[] = implode(' ', array_keys($this->flags));
|
$args[] = implode(' ', array_keys($this->flags));
|
||||||
}
|
}
|
||||||
foreach ($statement as $arg) {
|
foreach ($statement as $arg) $args[] = $arg;
|
||||||
$args[] = $arg;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -484,6 +507,7 @@ class DibiFluent extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Format camelCase clause name to UPPER CASE.
|
* Format camelCase clause name to UPPER CASE.
|
||||||
* @param string
|
* @param string
|
||||||
@@ -500,6 +524,7 @@ class DibiFluent extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public function __clone()
|
public function __clone()
|
||||||
{
|
{
|
||||||
// remove references
|
// remove references
|
||||||
|
@@ -10,6 +10,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Lazy cached storage.
|
* Lazy cached storage.
|
||||||
*
|
*
|
||||||
@@ -28,6 +29,7 @@ abstract class DibiHashMapBase
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public function setCallback($callback)
|
public function setCallback($callback)
|
||||||
{
|
{
|
||||||
if (!is_callable($callback)) {
|
if (!is_callable($callback)) {
|
||||||
@@ -38,6 +40,7 @@ abstract class DibiHashMapBase
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public function getCallback()
|
public function getCallback()
|
||||||
{
|
{
|
||||||
return $this->callback;
|
return $this->callback;
|
||||||
@@ -46,6 +49,7 @@ abstract class DibiHashMapBase
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Lazy cached storage.
|
* Lazy cached storage.
|
||||||
*
|
*
|
||||||
@@ -64,6 +68,7 @@ final class DibiHashMap extends DibiHashMapBase
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public function __get($nm)
|
public function __get($nm)
|
||||||
{
|
{
|
||||||
if ($nm == '') {
|
if ($nm == '') {
|
||||||
|
@@ -10,6 +10,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* SQL literal value.
|
* SQL literal value.
|
||||||
*
|
*
|
||||||
@@ -27,6 +28,7 @@ class DibiLiteral extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
|
@@ -10,6 +10,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* DibiObject is the ultimate ancestor of all instantiable classes.
|
* DibiObject is the ultimate ancestor of all instantiable classes.
|
||||||
*
|
*
|
||||||
@@ -57,6 +58,7 @@ abstract class DibiObject
|
|||||||
private static $extMethods;
|
private static $extMethods;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the name of the class of this object.
|
* Returns the name of the class of this object.
|
||||||
* @return string
|
* @return string
|
||||||
@@ -67,6 +69,7 @@ abstract class DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Access to reflection.
|
* Access to reflection.
|
||||||
* @return \ReflectionObject
|
* @return \ReflectionObject
|
||||||
@@ -77,6 +80,7 @@ abstract class DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Call to undefined method.
|
* Call to undefined method.
|
||||||
* @param string method name
|
* @param string method name
|
||||||
@@ -121,6 +125,7 @@ abstract class DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Call to undefined static method.
|
* Call to undefined static method.
|
||||||
* @param string method name (in lower case!)
|
* @param string method name (in lower case!)
|
||||||
@@ -135,6 +140,7 @@ abstract class DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adding method to class.
|
* Adding method to class.
|
||||||
* @param string method name
|
* @param string method name
|
||||||
@@ -152,9 +158,7 @@ abstract class DibiObject
|
|||||||
self::$extMethods[$pair[1]][''] = NULL;
|
self::$extMethods[$pair[1]][''] = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ($name === NULL) {
|
if ($name === NULL) return NULL;
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$name = strtolower($name);
|
$name = strtolower($name);
|
||||||
@@ -198,13 +202,14 @@ abstract class DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns property value. Do not call directly.
|
* Returns property value. Do not call directly.
|
||||||
* @param string property name
|
* @param string property name
|
||||||
* @return mixed property value
|
* @return mixed property value
|
||||||
* @throws \LogicException if the property is not defined.
|
* @throws \LogicException if the property is not defined.
|
||||||
*/
|
*/
|
||||||
public function & __get($name)
|
public function &__get($name)
|
||||||
{
|
{
|
||||||
$class = get_class($this);
|
$class = get_class($this);
|
||||||
|
|
||||||
@@ -217,8 +222,8 @@ abstract class DibiObject
|
|||||||
$m = 'get' . $name;
|
$m = 'get' . $name;
|
||||||
if (self::hasAccessor($class, $m)) {
|
if (self::hasAccessor($class, $m)) {
|
||||||
// ampersands:
|
// ampersands:
|
||||||
// - uses & __get() because declaration should be forward compatible (e.g. with Nette\Web\Html)
|
// - uses &__get() because declaration should be forward compatible (e.g. with Nette\Web\Html)
|
||||||
// - doesn't call & $this->$m because user could bypass property setter by: $x = & $obj->property; $x = 'new value';
|
// - doesn't call &$this->$m because user could bypass property setter by: $x = & $obj->property; $x = 'new value';
|
||||||
$val = $this->$m();
|
$val = $this->$m();
|
||||||
return $val;
|
return $val;
|
||||||
}
|
}
|
||||||
@@ -234,6 +239,7 @@ abstract class DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets value of a property. Do not call directly.
|
* Sets value of a property. Do not call directly.
|
||||||
* @param string property name
|
* @param string property name
|
||||||
@@ -268,6 +274,7 @@ abstract class DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Is property defined?
|
* Is property defined?
|
||||||
* @param string property name
|
* @param string property name
|
||||||
@@ -280,6 +287,7 @@ abstract class DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Access to undeclared property.
|
* Access to undeclared property.
|
||||||
* @param string property name
|
* @param string property name
|
||||||
@@ -293,6 +301,7 @@ abstract class DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Has property an accessor?
|
* Has property an accessor?
|
||||||
* @param string class name
|
* @param string class name
|
||||||
|
@@ -10,6 +10,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* dibi result set.
|
* dibi result set.
|
||||||
*
|
*
|
||||||
@@ -53,13 +54,11 @@ class DibiResult extends DibiObject implements IDataSource
|
|||||||
/** @var string returned object class */
|
/** @var string returned object class */
|
||||||
private $rowClass = 'DibiRow';
|
private $rowClass = 'DibiRow';
|
||||||
|
|
||||||
/** @var Callback returned object factory*/
|
|
||||||
private $rowFactory;
|
|
||||||
|
|
||||||
/** @var array format */
|
/** @var array format */
|
||||||
private $formats = array();
|
private $formats = array();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param IDibiResultDriver
|
* @param IDibiResultDriver
|
||||||
*/
|
*/
|
||||||
@@ -70,6 +69,7 @@ class DibiResult extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @deprecated
|
* @deprecated
|
||||||
*/
|
*/
|
||||||
@@ -79,6 +79,7 @@ class DibiResult extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Frees the resources allocated for this result set.
|
* Frees the resources allocated for this result set.
|
||||||
* @return void
|
* @return void
|
||||||
@@ -92,6 +93,7 @@ class DibiResult extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Safe access to property $driver.
|
* Safe access to property $driver.
|
||||||
* @return IDibiResultDriver
|
* @return IDibiResultDriver
|
||||||
@@ -107,9 +109,11 @@ class DibiResult extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************* rows ****************d*g**/
|
/********************* rows ****************d*g**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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
|
||||||
@@ -122,6 +126,7 @@ class DibiResult extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Required by the Countable interface.
|
* Required by the Countable interface.
|
||||||
* @return int
|
* @return int
|
||||||
@@ -132,6 +137,7 @@ class DibiResult extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the number of rows in a result set.
|
* Returns the number of rows in a result set.
|
||||||
* @return int
|
* @return int
|
||||||
@@ -142,6 +148,7 @@ class DibiResult extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the number of rows in a result set. Alias for getRowCount().
|
* Returns the number of rows in a result set. Alias for getRowCount().
|
||||||
* @deprecated
|
* @deprecated
|
||||||
@@ -153,6 +160,7 @@ class DibiResult extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Required by the IteratorAggregate interface.
|
* Required by the IteratorAggregate interface.
|
||||||
* @return DibiResultIterator
|
* @return DibiResultIterator
|
||||||
@@ -166,13 +174,15 @@ class DibiResult extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************* fetching rows ****************d*g**/
|
/********************* fetching rows ****************d*g**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set fetched object class. This class should extend the DibiRow class.
|
* Set fetched object class. This class should extend the DibiRow class.
|
||||||
* @param string
|
* @param string
|
||||||
* @return self
|
* @return DibiResult provides a fluent interface
|
||||||
*/
|
*/
|
||||||
public function setRowClass($class)
|
public function setRowClass($class)
|
||||||
{
|
{
|
||||||
@@ -181,6 +191,7 @@ class DibiResult extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns fetched object class name.
|
* Returns fetched object class name.
|
||||||
* @return string
|
* @return string
|
||||||
@@ -191,17 +202,6 @@ class DibiResult extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set a factory to create fetched object instances. These should extend the DibiRow class.
|
|
||||||
* @param callback
|
|
||||||
* @return self
|
|
||||||
*/
|
|
||||||
public function setRowFactory($callback)
|
|
||||||
{
|
|
||||||
$this->rowFactory = $callback;
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fetches the row at current position, process optional type conversion.
|
* Fetches the row at current position, process optional type conversion.
|
||||||
@@ -216,15 +216,14 @@ class DibiResult extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
$this->fetched = TRUE;
|
$this->fetched = TRUE;
|
||||||
$this->normalize($row);
|
$this->normalize($row);
|
||||||
if ($this->rowFactory) {
|
if ($this->rowClass) {
|
||||||
return call_user_func($this->rowFactory, $row);
|
|
||||||
} elseif ($this->rowClass) {
|
|
||||||
$row = new $this->rowClass($row);
|
$row = new $this->rowClass($row);
|
||||||
}
|
}
|
||||||
return $row;
|
return $row;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Like fetch(), but returns only first field.
|
* Like fetch(), but returns only first field.
|
||||||
* @return mixed value on success, FALSE if no next record
|
* @return mixed value on success, FALSE if no next record
|
||||||
@@ -241,6 +240,7 @@ class DibiResult extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fetches all records from table.
|
* Fetches all records from table.
|
||||||
* @param int offset
|
* @param int offset
|
||||||
@@ -252,15 +252,11 @@ class DibiResult extends DibiObject implements IDataSource
|
|||||||
$limit = $limit === NULL ? -1 : (int) $limit;
|
$limit = $limit === NULL ? -1 : (int) $limit;
|
||||||
$this->seek((int) $offset);
|
$this->seek((int) $offset);
|
||||||
$row = $this->fetch();
|
$row = $this->fetch();
|
||||||
if (!$row) {
|
if (!$row) return array(); // empty result set
|
||||||
return array(); // empty result set
|
|
||||||
}
|
|
||||||
|
|
||||||
$data = array();
|
$data = array();
|
||||||
do {
|
do {
|
||||||
if ($limit === 0) {
|
if ($limit === 0) break;
|
||||||
break;
|
|
||||||
}
|
|
||||||
$limit--;
|
$limit--;
|
||||||
$data[] = $row;
|
$data[] = $row;
|
||||||
} while ($row = $this->fetch());
|
} while ($row = $this->fetch());
|
||||||
@@ -269,6 +265,7 @@ class DibiResult extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fetches all records from table and returns associative tree.
|
* Fetches all records from table and returns associative tree.
|
||||||
* Examples:
|
* Examples:
|
||||||
@@ -288,9 +285,7 @@ class DibiResult extends DibiObject implements IDataSource
|
|||||||
|
|
||||||
$this->seek(0);
|
$this->seek(0);
|
||||||
$row = $this->fetch();
|
$row = $this->fetch();
|
||||||
if (!$row) {
|
if (!$row) return array(); // empty result set
|
||||||
return array(); // empty result set
|
|
||||||
}
|
|
||||||
|
|
||||||
$data = NULL;
|
$data = NULL;
|
||||||
$assoc = preg_split('#(\[\]|->|=|\|)#', $assoc, NULL, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
|
$assoc = preg_split('#(\[\]|->|=|\|)#', $assoc, NULL, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
|
||||||
@@ -349,6 +344,7 @@ class DibiResult extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @deprecated
|
* @deprecated
|
||||||
*/
|
*/
|
||||||
@@ -356,9 +352,7 @@ class DibiResult extends DibiObject implements IDataSource
|
|||||||
{
|
{
|
||||||
$this->seek(0);
|
$this->seek(0);
|
||||||
$row = $this->fetch();
|
$row = $this->fetch();
|
||||||
if (!$row) {
|
if (!$row) return array(); // empty result set
|
||||||
return array(); // empty result set
|
|
||||||
}
|
|
||||||
|
|
||||||
$data = NULL;
|
$data = NULL;
|
||||||
$assoc = explode(',', $assoc);
|
$assoc = explode(',', $assoc);
|
||||||
@@ -423,6 +417,7 @@ class DibiResult extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fetches all records from table like $key => $value pairs.
|
* Fetches all records from table like $key => $value pairs.
|
||||||
* @param string associative key
|
* @param string associative key
|
||||||
@@ -434,9 +429,7 @@ class DibiResult extends DibiObject implements IDataSource
|
|||||||
{
|
{
|
||||||
$this->seek(0);
|
$this->seek(0);
|
||||||
$row = $this->fetch();
|
$row = $this->fetch();
|
||||||
if (!$row) {
|
if (!$row) return array(); // empty result set
|
||||||
return array(); // empty result set
|
|
||||||
}
|
|
||||||
|
|
||||||
$data = array();
|
$data = array();
|
||||||
|
|
||||||
@@ -475,16 +468,18 @@ class DibiResult extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
do {
|
do {
|
||||||
$data[ (string) $row[$key] ] = $row[$value];
|
$data[ $row[$key] ] = $row[$value];
|
||||||
} while ($row = $this->fetch());
|
} while ($row = $this->fetch());
|
||||||
|
|
||||||
return $data;
|
return $data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************* column types ****************d*g**/
|
/********************* column types ****************d*g**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Autodetect column types.
|
* Autodetect column types.
|
||||||
* @return void
|
* @return void
|
||||||
@@ -500,6 +495,7 @@ class DibiResult extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Converts values to specified type and format.
|
* Converts values to specified type and format.
|
||||||
* @param array
|
* @param array
|
||||||
@@ -524,7 +520,7 @@ class DibiResult extends DibiObject implements IDataSource
|
|||||||
$row[$key] = ((bool) $value) && $value !== 'f' && $value !== 'F';
|
$row[$key] = ((bool) $value) && $value !== 'f' && $value !== 'F';
|
||||||
|
|
||||||
} elseif ($type === dibi::DATE || $type === dibi::DATETIME) {
|
} elseif ($type === dibi::DATE || $type === dibi::DATETIME) {
|
||||||
if ((int) $value === 0 && substr((string) $value, 0, 3) !== '00:') { // '', NULL, FALSE, '0000-00-00', ...
|
if ((int) $value === 0) { // '', NULL, FALSE, '0000-00-00', ...
|
||||||
|
|
||||||
} elseif (empty($this->formats[$type])) { // return DateTime object (default)
|
} elseif (empty($this->formats[$type])) { // return DateTime object (default)
|
||||||
$row[$key] = new DibiDateTime(is_numeric($value) ? date('Y-m-d H:i:s', $value) : $value);
|
$row[$key] = new DibiDateTime(is_numeric($value) ? date('Y-m-d H:i:s', $value) : $value);
|
||||||
@@ -547,11 +543,12 @@ class DibiResult extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Define column type.
|
* Define column type.
|
||||||
* @param string column
|
* @param string column
|
||||||
* @param string type (use constant Dibi::*)
|
* @param string type (use constant Dibi::*)
|
||||||
* @return self
|
* @return DibiResult provides a fluent interface
|
||||||
*/
|
*/
|
||||||
final public function setType($col, $type)
|
final public function setType($col, $type)
|
||||||
{
|
{
|
||||||
@@ -560,6 +557,7 @@ class DibiResult extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns column type.
|
* Returns column type.
|
||||||
* @return string
|
* @return string
|
||||||
@@ -570,11 +568,12 @@ class DibiResult extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets data format.
|
* Sets data format.
|
||||||
* @param string type (use constant Dibi::*)
|
* @param string type (use constant Dibi::*)
|
||||||
* @param string format
|
* @param string format
|
||||||
* @return self
|
* @return DibiResult provides a fluent interface
|
||||||
*/
|
*/
|
||||||
final public function setFormat($type, $format)
|
final public function setFormat($type, $format)
|
||||||
{
|
{
|
||||||
@@ -583,6 +582,7 @@ class DibiResult extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns data format.
|
* Returns data format.
|
||||||
* @return string
|
* @return string
|
||||||
@@ -593,9 +593,11 @@ class DibiResult extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************* meta info ****************d*g**/
|
/********************* meta info ****************d*g**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a meta information about the current result set.
|
* Returns a meta information about the current result set.
|
||||||
* @return DibiResultInfo
|
* @return DibiResultInfo
|
||||||
@@ -609,6 +611,7 @@ class DibiResult extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @deprecated
|
* @deprecated
|
||||||
*/
|
*/
|
||||||
@@ -618,6 +621,7 @@ class DibiResult extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** @deprecated */
|
/** @deprecated */
|
||||||
public function getColumnNames($fullNames = FALSE)
|
public function getColumnNames($fullNames = FALSE)
|
||||||
{
|
{
|
||||||
@@ -626,74 +630,43 @@ class DibiResult extends DibiObject implements IDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************* misc tools ****************d*g**/
|
/********************* misc tools ****************d*g**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Displays complete result set as HTML or text table for debug purposes.
|
* Displays complete result set as HTML table for debug purposes.
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
final public function dump()
|
final public function dump()
|
||||||
{
|
{
|
||||||
$i = 0;
|
$i = 0;
|
||||||
$this->seek(0);
|
$this->seek(0);
|
||||||
if (PHP_SAPI === 'cli') {
|
while ($row = $this->fetch()) {
|
||||||
$hasColors = (substr(getenv('TERM'), 0, 5) === 'xterm');
|
|
||||||
$maxLen = 0;
|
|
||||||
while ($row = $this->fetch()) {
|
|
||||||
if ($i === 0) {
|
|
||||||
foreach ($row as $col => $foo) {
|
|
||||||
$len = mb_strlen($col);
|
|
||||||
$maxLen = max($len, $maxLen);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($hasColors) {
|
|
||||||
echo "\033[1;37m#row: $i\033[0m\n";
|
|
||||||
} else {
|
|
||||||
echo "#row: $i\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach ($row as $col => $val) {
|
|
||||||
$spaces = $maxLen - mb_strlen($col) + 2;
|
|
||||||
echo "$col" . str_repeat(" ", $spaces) . "$val\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
echo "\n";
|
|
||||||
$i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($i === 0) {
|
if ($i === 0) {
|
||||||
echo "empty result set\n";
|
echo "\n<table class=\"dump\">\n<thead>\n\t<tr>\n\t\t<th>#row</th>\n";
|
||||||
}
|
|
||||||
echo "\n";
|
|
||||||
|
|
||||||
|
foreach ($row as $col => $foo) {
|
||||||
|
echo "\t\t<th>" . htmlSpecialChars($col) . "</th>\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "\t</tr>\n</thead>\n<tbody>\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "\t<tr>\n\t\t<th>", $i, "</th>\n";
|
||||||
|
foreach ($row as $col) {
|
||||||
|
//if (is_object($col)) $col = $col->__toString();
|
||||||
|
echo "\t\t<td>", htmlSpecialChars($col), "</td>\n";
|
||||||
|
}
|
||||||
|
echo "\t</tr>\n";
|
||||||
|
$i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($i === 0) {
|
||||||
|
echo '<p><em>empty result set</em></p>';
|
||||||
} else {
|
} else {
|
||||||
while ($row = $this->fetch()) {
|
echo "</tbody>\n</table>\n";
|
||||||
if ($i === 0) {
|
|
||||||
echo "\n<table class=\"dump\">\n<thead>\n\t<tr>\n\t\t<th>#row</th>\n";
|
|
||||||
|
|
||||||
foreach ($row as $col => $foo) {
|
|
||||||
echo "\t\t<th>" . htmlSpecialChars($col) . "</th>\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
echo "\t</tr>\n</thead>\n<tbody>\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
echo "\t<tr>\n\t\t<th>", $i, "</th>\n";
|
|
||||||
foreach ($row as $col) {
|
|
||||||
//if (is_object($col)) $col = $col->__toString();
|
|
||||||
echo "\t\t<td>", htmlSpecialChars($col), "</td>\n";
|
|
||||||
}
|
|
||||||
echo "\t</tr>\n";
|
|
||||||
$i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($i === 0) {
|
|
||||||
echo '<p><em>empty result set</em></p>';
|
|
||||||
} else {
|
|
||||||
echo "</tbody>\n</table>\n";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -10,6 +10,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* External result set iterator.
|
* External result set iterator.
|
||||||
*
|
*
|
||||||
@@ -46,6 +47,7 @@ class DibiResultIterator implements Iterator, Countable
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Rewinds the iterator to the first element.
|
* Rewinds the iterator to the first element.
|
||||||
* @return void
|
* @return void
|
||||||
@@ -58,6 +60,7 @@ class DibiResultIterator implements Iterator, Countable
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the key of the current element.
|
* Returns the key of the current element.
|
||||||
* @return mixed
|
* @return mixed
|
||||||
@@ -68,6 +71,7 @@ class DibiResultIterator implements Iterator, Countable
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the current element.
|
* Returns the current element.
|
||||||
* @return mixed
|
* @return mixed
|
||||||
@@ -78,6 +82,7 @@ class DibiResultIterator implements Iterator, Countable
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Moves forward to next element.
|
* Moves forward to next element.
|
||||||
* @return void
|
* @return void
|
||||||
@@ -89,6 +94,7 @@ class DibiResultIterator implements Iterator, Countable
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if there is a current element after calls to rewind() or next().
|
* Checks if there is a current element after calls to rewind() or next().
|
||||||
* @return bool
|
* @return bool
|
||||||
@@ -99,6 +105,7 @@ class DibiResultIterator implements Iterator, Countable
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Required by the Countable interface.
|
* Required by the Countable interface.
|
||||||
* @return int
|
* @return int
|
||||||
|
@@ -10,6 +10,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Result set single row.
|
* Result set single row.
|
||||||
*
|
*
|
||||||
@@ -21,18 +22,18 @@ class DibiRow implements ArrayAccess, IteratorAggregate, Countable
|
|||||||
|
|
||||||
public function __construct($arr)
|
public function __construct($arr)
|
||||||
{
|
{
|
||||||
foreach ($arr as $k => $v) {
|
foreach ($arr as $k => $v) $this->$k = $v;
|
||||||
$this->$k = $v;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public function toArray()
|
public function toArray()
|
||||||
{
|
{
|
||||||
return (array) $this;
|
return (array) $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Converts value to DateTime object.
|
* Converts value to DateTime object.
|
||||||
* @param string key
|
* @param string key
|
||||||
@@ -52,6 +53,7 @@ class DibiRow implements ArrayAccess, IteratorAggregate, Countable
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Converts value to UNIX timestamp.
|
* Converts value to UNIX timestamp.
|
||||||
* @param string key
|
* @param string key
|
||||||
@@ -67,6 +69,7 @@ class DibiRow implements ArrayAccess, IteratorAggregate, Countable
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Converts value to boolean.
|
* Converts value to boolean.
|
||||||
* @param string key
|
* @param string key
|
||||||
@@ -79,6 +82,7 @@ class DibiRow implements ArrayAccess, IteratorAggregate, Countable
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** @deprecated */
|
/** @deprecated */
|
||||||
public function asDate($key, $format = NULL)
|
public function asDate($key, $format = NULL)
|
||||||
{
|
{
|
||||||
@@ -91,39 +95,46 @@ class DibiRow implements ArrayAccess, IteratorAggregate, Countable
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************* interfaces ArrayAccess, Countable & IteratorAggregate ****************d*g**/
|
/********************* interfaces ArrayAccess, Countable & IteratorAggregate ****************d*g**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
final public function count()
|
final public function count()
|
||||||
{
|
{
|
||||||
return count((array) $this);
|
return count((array) $this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
final public function getIterator()
|
final public function getIterator()
|
||||||
{
|
{
|
||||||
return new ArrayIterator($this);
|
return new ArrayIterator($this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
final public function offsetSet($nm, $val)
|
final public function offsetSet($nm, $val)
|
||||||
{
|
{
|
||||||
$this->$nm = $val;
|
$this->$nm = $val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
final public function offsetGet($nm)
|
final public function offsetGet($nm)
|
||||||
{
|
{
|
||||||
return $this->$nm;
|
return $this->$nm;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
final public function offsetExists($nm)
|
final public function offsetExists($nm)
|
||||||
{
|
{
|
||||||
return isset($this->$nm);
|
return isset($this->$nm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
final public function offsetUnset($nm)
|
final public function offsetUnset($nm)
|
||||||
{
|
{
|
||||||
unset($this->$nm);
|
unset($this->$nm);
|
||||||
|
@@ -10,6 +10,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* dibi SQL translator.
|
* dibi SQL translator.
|
||||||
*
|
*
|
||||||
@@ -52,12 +53,14 @@ final class DibiTranslator extends DibiObject
|
|||||||
private $identifiers;
|
private $identifiers;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public function __construct(DibiConnection $connection)
|
public function __construct(DibiConnection $connection)
|
||||||
{
|
{
|
||||||
$this->connection = $connection;
|
$this->connection = $connection;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates SQL.
|
* Generates SQL.
|
||||||
* @param array
|
* @param array
|
||||||
@@ -91,7 +94,8 @@ final class DibiTranslator extends DibiObject
|
|||||||
|
|
||||||
// iterate
|
// iterate
|
||||||
$sql = array();
|
$sql = array();
|
||||||
while ($cursor < count($this->args)) {
|
while ($cursor < count($this->args))
|
||||||
|
{
|
||||||
$arg = $this->args[$cursor];
|
$arg = $this->args[$cursor];
|
||||||
$cursor++;
|
$cursor++;
|
||||||
|
|
||||||
@@ -122,9 +126,7 @@ final class DibiTranslator extends DibiObject
|
|||||||
array($this, 'cb'),
|
array($this, 'cb'),
|
||||||
substr($arg, $toSkip)
|
substr($arg, $toSkip)
|
||||||
);
|
);
|
||||||
if (preg_last_error()) {
|
if (preg_last_error()) throw new DibiPcreException;
|
||||||
throw new DibiPcreException;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -146,9 +148,7 @@ final class DibiTranslator extends DibiObject
|
|||||||
$commandIns = $commandIns === 'INSERT' || $commandIns === 'REPLAC';
|
$commandIns = $commandIns === 'INSERT' || $commandIns === 'REPLAC';
|
||||||
$sql[] = $this->formatValue($arg, $commandIns ? 'v' : 'a');
|
$sql[] = $this->formatValue($arg, $commandIns ? 'v' : 'a');
|
||||||
} else {
|
} else {
|
||||||
if ($lastArr === $cursor - 1) {
|
if ($lastArr === $cursor - 1) $sql[] = ',';
|
||||||
$sql[] = ',';
|
|
||||||
}
|
|
||||||
$sql[] = $this->formatValue($arg, $commandIns ? 'l' : 'a');
|
$sql[] = $this->formatValue($arg, $commandIns ? 'l' : 'a');
|
||||||
}
|
}
|
||||||
$lastArr = $cursor;
|
$lastArr = $cursor;
|
||||||
@@ -161,9 +161,7 @@ final class DibiTranslator extends DibiObject
|
|||||||
} // while
|
} // while
|
||||||
|
|
||||||
|
|
||||||
if ($comment) {
|
if ($comment) $sql[] = "*/";
|
||||||
$sql[] = "*/";
|
|
||||||
}
|
|
||||||
|
|
||||||
$sql = implode(' ', $sql);
|
$sql = implode(' ', $sql);
|
||||||
|
|
||||||
@@ -180,6 +178,7 @@ final class DibiTranslator extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Apply modifier to single value.
|
* Apply modifier to single value.
|
||||||
* @param mixed
|
* @param mixed
|
||||||
@@ -200,131 +199,131 @@ final class DibiTranslator extends DibiObject
|
|||||||
if (is_array($value)) {
|
if (is_array($value)) {
|
||||||
$vx = $kx = array();
|
$vx = $kx = array();
|
||||||
switch ($modifier) {
|
switch ($modifier) {
|
||||||
case 'and':
|
case 'and':
|
||||||
case 'or': // key=val AND key IS NULL AND ...
|
case 'or': // key=val AND key IS NULL AND ...
|
||||||
if (empty($value)) {
|
if (empty($value)) {
|
||||||
return '1=1';
|
return '1=1';
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ($value as $k => $v) {
|
foreach ($value as $k => $v) {
|
||||||
if (is_string($k)) {
|
if (is_string($k)) {
|
||||||
$pair = explode('%', $k, 2); // split into identifier & modifier
|
$pair = explode('%', $k, 2); // split into identifier & modifier
|
||||||
$k = $this->identifiers->{$pair[0]} . ' ';
|
$k = $this->identifiers->{$pair[0]} . ' ';
|
||||||
if (!isset($pair[1])) {
|
if (!isset($pair[1])) {
|
||||||
$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') { // TODO: this will be removed
|
} elseif ($pair[1] === 'ex') { // TODO: this will be removed
|
||||||
$vx[] = $k . $this->formatValue($v, 'ex');
|
$vx[] = $k . $this->formatValue($v, 'ex');
|
||||||
|
|
||||||
|
} else {
|
||||||
|
$v = $this->formatValue($v, $pair[1]);
|
||||||
|
if ($pair[1] === 'l' || $pair[1] === 'in') {
|
||||||
|
$op = 'IN ';
|
||||||
|
} elseif (strpos($pair[1], 'like') !== FALSE) {
|
||||||
|
$op = 'LIKE ';
|
||||||
|
} elseif ($v === 'NULL') {
|
||||||
|
$op = 'IS ';
|
||||||
} else {
|
} else {
|
||||||
$v = $this->formatValue($v, $pair[1]);
|
$op = '= ';
|
||||||
if ($pair[1] === 'l' || $pair[1] === 'in') {
|
|
||||||
$op = 'IN ';
|
|
||||||
} elseif (strpos($pair[1], 'like') !== FALSE) {
|
|
||||||
$op = 'LIKE ';
|
|
||||||
} elseif ($v === 'NULL') {
|
|
||||||
$op = 'IS ';
|
|
||||||
} else {
|
|
||||||
$op = '= ';
|
|
||||||
}
|
|
||||||
$vx[] = $k . $op . $v;
|
|
||||||
}
|
}
|
||||||
|
$vx[] = $k . $op . $v;
|
||||||
} else {
|
|
||||||
$vx[] = $this->formatValue($v, 'ex');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
$vx[] = $this->formatValue($v, 'ex');
|
||||||
}
|
}
|
||||||
return '(' . implode(') ' . strtoupper($modifier) . ' (', $vx) . ')';
|
}
|
||||||
|
return '(' . implode(') ' . strtoupper($modifier) . ' (', $vx) . ')';
|
||||||
|
|
||||||
case 'n': // key, key, ... identifier names
|
case 'n': // key, key, ... identifier names
|
||||||
foreach ($value as $k => $v) {
|
foreach ($value as $k => $v) {
|
||||||
if (is_string($k)) {
|
if (is_string($k)) {
|
||||||
$vx[] = $this->identifiers->$k . (empty($v) ? '' : ' AS ' . $this->identifiers->$v);
|
$vx[] = $this->identifiers->$k . (empty($v) ? '' : ' AS ' . $this->identifiers->$v);
|
||||||
} else {
|
} else {
|
||||||
$pair = explode('%', $v, 2); // split into identifier & modifier
|
$pair = explode('%', $v, 2); // split into identifier & modifier
|
||||||
$vx[] = $this->identifiers->{$pair[0]};
|
$vx[] = $this->identifiers->{$pair[0]};
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return implode(', ', $vx);
|
}
|
||||||
|
return implode(', ', $vx);
|
||||||
|
|
||||||
|
|
||||||
case 'a': // key=val, key=val, ...
|
case 'a': // key=val, key=val, ...
|
||||||
foreach ($value as $k => $v) {
|
foreach ($value as $k => $v) {
|
||||||
$pair = explode('%', $k, 2); // split into identifier & modifier
|
$pair = explode('%', $k, 2); // split into identifier & modifier
|
||||||
$vx[] = $this->identifiers->{$pair[0]} . '='
|
$vx[] = $this->identifiers->{$pair[0]} . '='
|
||||||
. $this->formatValue($v, isset($pair[1]) ? $pair[1] : (is_array($v) ? 'ex' : FALSE));
|
. $this->formatValue($v, isset($pair[1]) ? $pair[1] : (is_array($v) ? 'ex' : FALSE));
|
||||||
}
|
}
|
||||||
return implode(', ', $vx);
|
return implode(', ', $vx);
|
||||||
|
|
||||||
|
|
||||||
case 'in':// replaces scalar %in modifier!
|
case 'in':// replaces scalar %in modifier!
|
||||||
case 'l': // (val, val, ...)
|
case 'l': // (val, val, ...)
|
||||||
foreach ($value as $k => $v) {
|
foreach ($value as $k => $v) {
|
||||||
$pair = explode('%', $k, 2); // split into identifier & modifier
|
$pair = explode('%', $k, 2); // split into identifier & modifier
|
||||||
$vx[] = $this->formatValue($v, isset($pair[1]) ? $pair[1] : (is_array($v) ? 'ex' : FALSE));
|
$vx[] = $this->formatValue($v, isset($pair[1]) ? $pair[1] : (is_array($v) ? 'ex' : FALSE));
|
||||||
}
|
}
|
||||||
return '(' . (($vx || $modifier === 'l') ? implode(', ', $vx) : 'NULL') . ')';
|
return '(' . (($vx || $modifier === 'l') ? implode(', ', $vx) : 'NULL') . ')';
|
||||||
|
|
||||||
|
|
||||||
case 'v': // (key, key, ...) VALUES (val, val, ...)
|
case 'v': // (key, key, ...) VALUES (val, val, ...)
|
||||||
foreach ($value as $k => $v) {
|
foreach ($value as $k => $v) {
|
||||||
$pair = explode('%', $k, 2); // split into identifier & modifier
|
$pair = explode('%', $k, 2); // split into identifier & modifier
|
||||||
$kx[] = $this->identifiers->{$pair[0]};
|
$kx[] = $this->identifiers->{$pair[0]};
|
||||||
$vx[] = $this->formatValue($v, isset($pair[1]) ? $pair[1] : (is_array($v) ? 'ex' : FALSE));
|
$vx[] = $this->formatValue($v, isset($pair[1]) ? $pair[1] : (is_array($v) ? 'ex' : FALSE));
|
||||||
}
|
}
|
||||||
return '(' . implode(', ', $kx) . ') VALUES (' . implode(', ', $vx) . ')';
|
return '(' . implode(', ', $kx) . ') VALUES (' . implode(', ', $vx) . ')';
|
||||||
|
|
||||||
case 'm': // (key, key, ...) VALUES (val, val, ...), (val, val, ...), ...
|
case 'm': // (key, key, ...) VALUES (val, val, ...), (val, val, ...), ...
|
||||||
foreach ($value as $k => $v) {
|
foreach ($value as $k => $v) {
|
||||||
if (is_array($v)) {
|
if (is_array($v)) {
|
||||||
if (isset($proto)) {
|
if (isset($proto)) {
|
||||||
if ($proto !== array_keys($v)) {
|
if ($proto !== array_keys($v)) {
|
||||||
$this->hasError = TRUE;
|
$this->hasError = TRUE;
|
||||||
return '**Multi-insert array "' . $k . '" is different.**';
|
return '**Multi-insert array "' . $k . '" is different.**';
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$proto = array_keys($v);
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
$this->hasError = TRUE;
|
$proto = array_keys($v);
|
||||||
return '**Unexpected type ' . gettype($v) . '**';
|
|
||||||
}
|
|
||||||
|
|
||||||
$pair = explode('%', $k, 2); // split into identifier & modifier
|
|
||||||
$kx[] = $this->identifiers->{$pair[0]};
|
|
||||||
foreach ($v as $k2 => $v2) {
|
|
||||||
$vx[$k2][] = $this->formatValue($v2, isset($pair[1]) ? $pair[1] : (is_array($v2) ? 'ex' : FALSE));
|
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
$this->hasError = TRUE;
|
||||||
|
return '**Unexpected type ' . gettype($v) . '**';
|
||||||
}
|
}
|
||||||
foreach ($vx as $k => $v) {
|
|
||||||
$vx[$k] = '(' . implode(', ', $v) . ')';
|
|
||||||
}
|
|
||||||
return '(' . implode(', ', $kx) . ') VALUES ' . implode(', ', $vx);
|
|
||||||
|
|
||||||
case 'by': // key ASC, key DESC
|
$pair = explode('%', $k, 2); // split into identifier & modifier
|
||||||
foreach ($value as $k => $v) {
|
$kx[] = $this->identifiers->{$pair[0]};
|
||||||
if (is_array($v)) {
|
foreach ($v as $k2 => $v2) {
|
||||||
$vx[] = $this->formatValue($v, 'ex');
|
$vx[$k2][] = $this->formatValue($v2, isset($pair[1]) ? $pair[1] : (is_array($v2) ? 'ex' : FALSE));
|
||||||
} elseif (is_string($k)) {
|
|
||||||
$v = (is_string($v) && strncasecmp($v, 'd', 1)) || $v > 0 ? 'ASC' : 'DESC';
|
|
||||||
$vx[] = $this->identifiers->$k . ' ' . $v;
|
|
||||||
} else {
|
|
||||||
$vx[] = $this->identifiers->$v;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return implode(', ', $vx);
|
}
|
||||||
|
foreach ($vx as $k => $v) {
|
||||||
|
$vx[$k] = '(' . implode(', ', $v) . ')';
|
||||||
|
}
|
||||||
|
return '(' . implode(', ', $kx) . ') VALUES ' . implode(', ', $vx);
|
||||||
|
|
||||||
case 'ex':
|
case 'by': // key ASC, key DESC
|
||||||
case 'sql':
|
foreach ($value as $k => $v) {
|
||||||
$translator = new self($this->connection);
|
if (is_array($v)) {
|
||||||
return $translator->translate($value);
|
$vx[] = $this->formatValue($v, 'ex');
|
||||||
|
} elseif (is_string($k)) {
|
||||||
default: // value, value, value - all with the same modifier
|
$v = (is_string($v) && strncasecmp($v, 'd', 1)) || $v > 0 ? 'ASC' : 'DESC';
|
||||||
foreach ($value as $v) {
|
$vx[] = $this->identifiers->$k . ' ' . $v;
|
||||||
$vx[] = $this->formatValue($v, $modifier);
|
} else {
|
||||||
|
$vx[] = $this->identifiers->$v;
|
||||||
}
|
}
|
||||||
return implode(', ', $vx);
|
}
|
||||||
|
return implode(', ', $vx);
|
||||||
|
|
||||||
|
case 'ex':
|
||||||
|
case 'sql':
|
||||||
|
$translator = new self($this->connection);
|
||||||
|
return $translator->translate($value);
|
||||||
|
|
||||||
|
default: // value, value, value - all with the same modifier
|
||||||
|
foreach ($value as $v) {
|
||||||
|
$vx[] = $this->formatValue($v, $modifier);
|
||||||
|
}
|
||||||
|
return implode(', ', $vx);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -337,98 +336,94 @@ final class DibiTranslator extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch ($modifier) {
|
switch ($modifier) {
|
||||||
case 's': // string
|
case 's': // string
|
||||||
case 'bin':// binary
|
case 'bin':// binary
|
||||||
case 'b': // boolean
|
case 'b': // boolean
|
||||||
return $value === NULL ? 'NULL' : $this->driver->escape($value, $modifier);
|
return $value === NULL ? 'NULL' : $this->driver->escape($value, $modifier);
|
||||||
|
|
||||||
case 'sN': // string or NULL
|
case 'sN': // string or NULL
|
||||||
case 'sn':
|
case 'sn':
|
||||||
return $value == '' ? 'NULL' : $this->driver->escape($value, dibi::TEXT); // notice two equal signs
|
return $value == '' ? 'NULL' : $this->driver->escape($value, dibi::TEXT); // notice two equal signs
|
||||||
|
|
||||||
case 'iN': // signed int or NULL
|
case 'iN': // signed int or NULL
|
||||||
case 'in': // deprecated
|
case 'in': // deprecated
|
||||||
if ($value == '') {
|
if ($value == '') $value = NULL;
|
||||||
$value = NULL;
|
// intentionally break omitted
|
||||||
}
|
|
||||||
// intentionally break omitted
|
|
||||||
|
|
||||||
case 'i': // signed int
|
case 'i': // signed int
|
||||||
case 'u': // unsigned int, ignored
|
case 'u': // unsigned int, ignored
|
||||||
// support for long numbers - keep them unchanged
|
// support for long numbers - keep them unchanged
|
||||||
if (is_string($value) && preg_match('#[+-]?\d++(e\d+)?\z#A', $value)) {
|
if (is_string($value) && preg_match('#[+-]?\d++(e\d+)?\z#A', $value)) {
|
||||||
return $value;
|
|
||||||
} else {
|
|
||||||
return $value === NULL ? 'NULL' : (string) (int) ($value + 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
case 'f': // float
|
|
||||||
// support for extreme numbers - keep them unchanged
|
|
||||||
if (is_string($value) && is_numeric($value) && strpos($value, 'x') === FALSE) {
|
|
||||||
return $value; // something like -9E-005 is accepted by SQL, HEX values are not
|
|
||||||
} else {
|
|
||||||
return $value === NULL ? 'NULL' : rtrim(rtrim(number_format($value + 0, 10, '.', ''), '0'), '.');
|
|
||||||
}
|
|
||||||
|
|
||||||
case 'd': // date
|
|
||||||
case 't': // datetime
|
|
||||||
if ($value === NULL) {
|
|
||||||
return 'NULL';
|
|
||||||
} else {
|
|
||||||
if (is_numeric($value)) {
|
|
||||||
$value = (int) $value; // timestamp
|
|
||||||
|
|
||||||
} elseif (is_string($value)) {
|
|
||||||
$value = new DateTime($value);
|
|
||||||
}
|
|
||||||
return $this->driver->escape($value, $modifier);
|
|
||||||
}
|
|
||||||
|
|
||||||
case 'by':
|
|
||||||
case 'n': // identifier name
|
|
||||||
return $this->identifiers->$value;
|
|
||||||
|
|
||||||
case 'ex':
|
|
||||||
case 'sql': // preserve as dibi-SQL (TODO: leave only %ex)
|
|
||||||
$value = (string) $value;
|
|
||||||
// speed-up - is regexp required?
|
|
||||||
$toSkip = strcspn($value, '`[\'":');
|
|
||||||
if (strlen($value) !== $toSkip) {
|
|
||||||
$value = substr($value, 0, $toSkip)
|
|
||||||
. preg_replace_callback(
|
|
||||||
'/(?=[`[\'":])(?:`(.+?)`|\[(.+?)\]|(\')((?:\'\'|[^\'])*)\'|(")((?:""|[^"])*)"|(\'|")|:(\S*?:)([a-zA-Z0-9._]?))/s',
|
|
||||||
array($this, 'cb'),
|
|
||||||
substr($value, $toSkip)
|
|
||||||
);
|
|
||||||
if (preg_last_error()) {
|
|
||||||
throw new DibiPcreException;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $value;
|
return $value;
|
||||||
|
} else {
|
||||||
|
return $value === NULL ? 'NULL' : (string) (int) ($value + 0);
|
||||||
|
}
|
||||||
|
|
||||||
case 'SQL': // preserve as real SQL (TODO: rename to %sql)
|
case 'f': // float
|
||||||
return (string) $value;
|
// support for extreme numbers - keep them unchanged
|
||||||
|
if (is_string($value) && is_numeric($value) && strpos($value, 'x') === FALSE) {
|
||||||
|
return $value; // something like -9E-005 is accepted by SQL, HEX values are not
|
||||||
|
} else {
|
||||||
|
return $value === NULL ? 'NULL' : rtrim(rtrim(number_format($value + 0, 10, '.', ''), '0'), '.');
|
||||||
|
}
|
||||||
|
|
||||||
case 'like~': // LIKE string%
|
case 'd': // date
|
||||||
return $this->driver->escapeLike($value, 1);
|
case 't': // datetime
|
||||||
|
if ($value === NULL) {
|
||||||
|
return 'NULL';
|
||||||
|
} else {
|
||||||
|
if (is_numeric($value)) {
|
||||||
|
$value = (int) $value; // timestamp
|
||||||
|
|
||||||
case '~like': // LIKE %string
|
} elseif (is_string($value)) {
|
||||||
return $this->driver->escapeLike($value, -1);
|
$value = new DateTime($value);
|
||||||
|
}
|
||||||
|
return $this->driver->escape($value, $modifier);
|
||||||
|
}
|
||||||
|
|
||||||
case '~like~': // LIKE %string%
|
case 'by':
|
||||||
return $this->driver->escapeLike($value, 0);
|
case 'n': // identifier name
|
||||||
|
return $this->identifiers->$value;
|
||||||
|
|
||||||
case 'and':
|
case 'ex':
|
||||||
case 'or':
|
case 'sql': // preserve as dibi-SQL (TODO: leave only %ex)
|
||||||
case 'a':
|
$value = (string) $value;
|
||||||
case 'l':
|
// speed-up - is regexp required?
|
||||||
case 'v':
|
$toSkip = strcspn($value, '`[\'":');
|
||||||
$this->hasError = TRUE;
|
if (strlen($value) !== $toSkip) {
|
||||||
return '**Unexpected type ' . gettype($value) . '**';
|
$value = substr($value, 0, $toSkip)
|
||||||
|
. preg_replace_callback(
|
||||||
|
'/(?=[`[\'":])(?:`(.+?)`|\[(.+?)\]|(\')((?:\'\'|[^\'])*)\'|(")((?:""|[^"])*)"|(\'|")|:(\S*?:)([a-zA-Z0-9._]?))/s',
|
||||||
|
array($this, 'cb'),
|
||||||
|
substr($value, $toSkip)
|
||||||
|
);
|
||||||
|
if (preg_last_error()) throw new DibiPcreException;
|
||||||
|
}
|
||||||
|
return $value;
|
||||||
|
|
||||||
default:
|
case 'SQL': // preserve as real SQL (TODO: rename to %sql)
|
||||||
$this->hasError = TRUE;
|
return (string) $value;
|
||||||
return "**Unknown or invalid modifier %$modifier**";
|
|
||||||
|
case 'like~': // LIKE string%
|
||||||
|
return $this->driver->escapeLike($value, 1);
|
||||||
|
|
||||||
|
case '~like': // LIKE %string
|
||||||
|
return $this->driver->escapeLike($value, -1);
|
||||||
|
|
||||||
|
case '~like~': // LIKE %string%
|
||||||
|
return $this->driver->escapeLike($value, 0);
|
||||||
|
|
||||||
|
case 'and':
|
||||||
|
case 'or':
|
||||||
|
case 'a':
|
||||||
|
case 'l':
|
||||||
|
case 'v':
|
||||||
|
$this->hasError = TRUE;
|
||||||
|
return '**Unexpected type ' . gettype($value) . '**';
|
||||||
|
|
||||||
|
default:
|
||||||
|
$this->hasError = TRUE;
|
||||||
|
return "**Unknown or invalid modifier %$modifier**";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -462,6 +457,7 @@ final class DibiTranslator extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* PREG callback from translate() or formatValue().
|
* PREG callback from translate() or formatValue().
|
||||||
* @param array
|
* @param array
|
||||||
@@ -540,16 +536,12 @@ final class DibiTranslator extends DibiObject
|
|||||||
return '';
|
return '';
|
||||||
|
|
||||||
} elseif ($mod === 'lmt') { // apply limit
|
} elseif ($mod === 'lmt') { // apply limit
|
||||||
if ($this->args[$cursor] !== NULL) {
|
if ($this->args[$cursor] !== NULL) $this->limit = (int) $this->args[$cursor];
|
||||||
$this->limit = (int) $this->args[$cursor];
|
|
||||||
}
|
|
||||||
$cursor++;
|
$cursor++;
|
||||||
return '';
|
return '';
|
||||||
|
|
||||||
} elseif ($mod === 'ofs') { // apply offset
|
} elseif ($mod === 'ofs') { // apply offset
|
||||||
if ($this->args[$cursor] !== NULL) {
|
if ($this->args[$cursor] !== NULL) $this->offset = (int) $this->args[$cursor];
|
||||||
$this->offset = (int) $this->args[$cursor];
|
|
||||||
}
|
|
||||||
$cursor++;
|
$cursor++;
|
||||||
return '';
|
return '';
|
||||||
|
|
||||||
@@ -559,23 +551,21 @@ final class DibiTranslator extends DibiObject
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->comment) {
|
if ($this->comment) return '...';
|
||||||
return '...';
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($matches[1]) { // SQL identifiers: `ident`
|
if ($matches[1]) // SQL identifiers: `ident`
|
||||||
return $this->identifiers->{$matches[1]};
|
return $this->identifiers->{$matches[1]};
|
||||||
|
|
||||||
} elseif ($matches[2]) { // SQL identifiers: [ident]
|
if ($matches[2]) // SQL identifiers: [ident]
|
||||||
return $this->identifiers->{$matches[2]};
|
return $this->identifiers->{$matches[2]};
|
||||||
|
|
||||||
} elseif ($matches[3]) { // SQL strings: '...'
|
if ($matches[3]) // SQL strings: '...'
|
||||||
return $this->driver->escape( str_replace("''", "'", $matches[4]), dibi::TEXT);
|
return $this->driver->escape( str_replace("''", "'", $matches[4]), dibi::TEXT);
|
||||||
|
|
||||||
} elseif ($matches[5]) { // SQL strings: "..."
|
if ($matches[5]) // SQL strings: "..."
|
||||||
return $this->driver->escape( str_replace('""', '"', $matches[6]), dibi::TEXT);
|
return $this->driver->escape( str_replace('""', '"', $matches[6]), dibi::TEXT);
|
||||||
|
|
||||||
} elseif ($matches[7]) { // string quote
|
if ($matches[7]) { // string quote
|
||||||
$this->hasError = TRUE;
|
$this->hasError = TRUE;
|
||||||
return '**Alone quote**';
|
return '**Alone quote**';
|
||||||
}
|
}
|
||||||
@@ -590,6 +580,7 @@ final class DibiTranslator extends DibiObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Apply substitutions to indentifier and delimites it.
|
* Apply substitutions to indentifier and delimites it.
|
||||||
* @param string indentifier
|
* @param string indentifier
|
||||||
@@ -601,9 +592,7 @@ final class DibiTranslator extends DibiObject
|
|||||||
$value = $this->connection->substitute($value);
|
$value = $this->connection->substitute($value);
|
||||||
$parts = explode('.', $value);
|
$parts = explode('.', $value);
|
||||||
foreach ($parts as & $v) {
|
foreach ($parts as & $v) {
|
||||||
if ($v !== '*') {
|
if ($v !== '*') $v = $this->driver->escape($v, dibi::IDENTIFIER);
|
||||||
$v = $this->driver->escape($v, dibi::IDENTIFIER);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return implode('.', $parts);
|
return implode('.', $parts);
|
||||||
}
|
}
|
||||||
|
@@ -10,6 +10,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provides an interface between a dataset and data-aware components.
|
* Provides an interface between a dataset and data-aware components.
|
||||||
* @package dibi
|
* @package dibi
|
||||||
@@ -21,6 +22,7 @@ interface IDataSource extends Countable, IteratorAggregate
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* dibi driver interface.
|
* dibi driver interface.
|
||||||
* @package dibi
|
* @package dibi
|
||||||
@@ -34,7 +36,7 @@ interface IDibiDriver
|
|||||||
* @return void
|
* @return void
|
||||||
* @throws DibiException
|
* @throws DibiException
|
||||||
*/
|
*/
|
||||||
function connect(array & $config);
|
function connect(array &$config);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Disconnects from a database.
|
* Disconnects from a database.
|
||||||
@@ -118,13 +120,19 @@ interface IDibiDriver
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Injects LIMIT/OFFSET to the SQL query.
|
* Injects LIMIT/OFFSET to the SQL query.
|
||||||
|
* @param string &$sql The SQL query that will be modified.
|
||||||
|
* @param int $limit
|
||||||
|
* @param int $offset
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
function applyLimit(& $sql, $limit, $offset);
|
function applyLimit(&$sql, $limit, $offset);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* dibi result set driver interface.
|
* dibi result set driver interface.
|
||||||
* @package dibi
|
* @package dibi
|
||||||
@@ -185,6 +193,9 @@ interface IDibiResultDriver
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* dibi driver reflection.
|
* dibi driver reflection.
|
||||||
*
|
*
|
||||||
|
@@ -23,6 +23,7 @@ render(){$obLevel=ob_get_level();$panels=array();foreach($this->panels
|
|||||||
as$id=>$panel){try{$panels[]=array('id'=>preg_replace('#[^a-z0-9]+#i','-',$id),'tab'=>$tab=(string)$panel->getTab(),'panel'=>$tab?(string)$panel->getPanel():NULL);}catch(Exception$e){$panels[]=array('id'=>"error-$id",'tab'=>"Error: $id",'panel'=>nl2br(htmlSpecialChars((string)$e)));while(ob_get_level()>$obLevel){ob_end_clean();}}}?>
|
as$id=>$panel){try{$panels[]=array('id'=>preg_replace('#[^a-z0-9]+#i','-',$id),'tab'=>$tab=(string)$panel->getTab(),'panel'=>$tab?(string)$panel->getPanel():NULL);}catch(Exception$e){$panels[]=array('id'=>"error-$id",'tab'=>"Error: $id",'panel'=>nl2br(htmlSpecialChars((string)$e)));while(ob_get_level()>$obLevel){ob_end_clean();}}}?>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<!-- Nette Debug Bar -->
|
<!-- Nette Debug Bar -->
|
||||||
|
|
||||||
<?php ob_start()?>
|
<?php ob_start()?>
|
||||||
@@ -129,6 +130,7 @@ htmlspecialchars('; caused by '.get_class($ex).' '.$ex->getMessage().($ex->getCo
|
|||||||
</head>
|
</head>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<div id="netteBluescreen">
|
<div id="netteBluescreen">
|
||||||
<a id="netteBluescreenIcon" href="#" rel="next"><abbr>▼</abbr></a
|
<a id="netteBluescreenIcon" href="#" rel="next"><abbr>▼</abbr></a
|
||||||
@@ -144,6 +146,7 @@ urlencode($title.' '.preg_replace('#\'.*\'|".*"#Us','',$exception->getMessage())
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<?php $ex=$exception;$level=0;?>
|
<?php $ex=$exception;$level=0;?>
|
||||||
<?php do{?>
|
<?php do{?>
|
||||||
|
|
||||||
@@ -162,6 +165,7 @@ htmlspecialchars($ex->getMessage())?></b></p>
|
|||||||
<?php endif?>
|
<?php endif?>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<?php foreach($panels
|
<?php foreach($panels
|
||||||
as$panel):?>
|
as$panel):?>
|
||||||
<?php $panel=call_user_func($panel,$ex);if(empty($panel['tab'])||empty($panel['panel']))continue;?>
|
<?php $panel=call_user_func($panel,$ex);if(empty($panel['tab'])||empty($panel['panel']))continue;?>
|
||||||
@@ -176,6 +180,7 @@ htmlSpecialChars($panel['tab'])?> <abbr>▼</abbr></a></h2>
|
|||||||
<?php endforeach?>
|
<?php endforeach?>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<?php $stack=$ex->getTrace();$expanded=NULL?>
|
<?php $stack=$ex->getTrace();$expanded=NULL?>
|
||||||
<?php if(strpos($ex->getFile(),$expandPath)===0){foreach($stack
|
<?php if(strpos($ex->getFile(),$expandPath)===0){foreach($stack
|
||||||
as$key=>$row){if(isset($row['file'])&&strpos($row['file'],$expandPath)!==0){$expanded=$key;break;}}}?>
|
as$key=>$row){if(isset($row['file'])&&strpos($row['file'],$expandPath)!==0){$expanded=$key;break;}}}?>
|
||||||
@@ -191,6 +196,7 @@ self::highlightFile($ex->getFile(),$ex->getLine(),15,isset($ex->context)?$ex->co
|
|||||||
</div></div>
|
</div></div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<?php if(isset($stack[0]['class'])&&$stack[0]['class']==='NDebugger'&&($stack[0]['function']==='_shutdownHandler'||$stack[0]['function']==='_errorHandler'))unset($stack[0])?>
|
<?php if(isset($stack[0]['class'])&&$stack[0]['class']==='NDebugger'&&($stack[0]['function']==='_shutdownHandler'||$stack[0]['function']==='_errorHandler'))unset($stack[0])?>
|
||||||
<?php if($stack):?>
|
<?php if($stack):?>
|
||||||
<div class="panel">
|
<div class="panel">
|
||||||
@@ -245,6 +251,7 @@ self::highlightFile($row['file'],$row['line'])?></div>
|
|||||||
<?php endif?>
|
<?php endif?>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<?php if(isset($ex->context)&&is_array($ex->context)):?>
|
<?php if(isset($ex->context)&&is_array($ex->context)):?>
|
||||||
<div class="panel">
|
<div class="panel">
|
||||||
<h2><a href="#" rel="netteBsPnl<?php echo++$counter?>">Variables <abbr>►</abbr></a></h2>
|
<h2><a href="#" rel="netteBsPnl<?php echo++$counter?>">Variables <abbr>►</abbr></a></h2>
|
||||||
@@ -265,6 +272,7 @@ as$k=>$v){echo'<tr><th>$',htmlspecialchars($k),'</th><td>',NDebugHelpers::clicka
|
|||||||
<?php while(--$level)echo'</div></div>'?>
|
<?php while(--$level)echo'</div></div>'?>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<?php $bottomPanels=array()?>
|
<?php $bottomPanels=array()?>
|
||||||
<?php foreach($panels
|
<?php foreach($panels
|
||||||
as$panel):?>
|
as$panel):?>
|
||||||
@@ -280,6 +288,7 @@ htmlSpecialChars($panel['tab'])?> <abbr>►</abbr></a></h2>
|
|||||||
<?php endforeach?>
|
<?php endforeach?>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="panel">
|
<div class="panel">
|
||||||
<h2><a href="#" rel="netteBsPnl<?php echo++$counter?>">Environment <abbr>►</abbr></a></h2>
|
<h2><a href="#" rel="netteBsPnl<?php echo++$counter?>">Environment <abbr>►</abbr></a></h2>
|
||||||
|
|
||||||
@@ -327,6 +336,7 @@ as$k=>$v)echo'<tr><th>',htmlspecialchars($k),'</th><td>',NDebugHelpers::clickabl
|
|||||||
</div></div>
|
</div></div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="panel">
|
<div class="panel">
|
||||||
<h2><a href="#" rel="netteBsPnl<?php echo++$counter?>">HTTP request <abbr>►</abbr></a></h2>
|
<h2><a href="#" rel="netteBsPnl<?php echo++$counter?>">HTTP request <abbr>►</abbr></a></h2>
|
||||||
|
|
||||||
@@ -361,6 +371,7 @@ foreach($GLOBALS[$name]as$k=>$v)echo'<tr><th>',htmlspecialchars($k),'</th><td>',
|
|||||||
</div></div>
|
</div></div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="panel">
|
<div class="panel">
|
||||||
<h2><a href="#" rel="netteBsPnl<?php echo++$counter?>">HTTP response <abbr>►</abbr></a></h2>
|
<h2><a href="#" rel="netteBsPnl<?php echo++$counter?>">HTTP response <abbr>►</abbr></a></h2>
|
||||||
|
|
||||||
@@ -377,6 +388,7 @@ htmlspecialchars($s),'<br>';?></pre>
|
|||||||
</div></div>
|
</div></div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<?php foreach($bottomPanels
|
<?php foreach($bottomPanels
|
||||||
as$panel):?>
|
as$panel):?>
|
||||||
<div class="panel">
|
<div class="panel">
|
||||||
@@ -389,6 +401,7 @@ htmlSpecialChars($panel['tab'])?> <abbr>▼</abbr></a></h2>
|
|||||||
<?php endforeach?>
|
<?php endforeach?>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>Report generated at <?php echo@date('Y/m/d H:i:s',NDebugger::$time)?></li>
|
<li>Report generated at <?php echo@date('Y/m/d H:i:s',NDebugger::$time)?></li>
|
||||||
<?php if(preg_match('#^https?://#',NDebugger::$source)):?>
|
<?php if(preg_match('#^https?://#',NDebugger::$source)):?>
|
||||||
|
@@ -18,6 +18,7 @@ project or top-level domain, and choose a name that stands on its own merits.
|
|||||||
If your stuff is good, it will not take long to establish a reputation for yourselves.
|
If your stuff is good, it will not take long to establish a reputation for yourselves.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
New BSD License
|
New BSD License
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
@@ -50,6 +51,7 @@ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|||||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
GNU General Public License
|
GNU General Public License
|
||||||
--------------------------
|
--------------------------
|
||||||
|
|
||||||
|
@@ -4,8 +4,8 @@
|
|||||||
|
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
require dirname(__FILE__) . '/Nette/Debugger.php';
|
require_once 'Nette/Debugger.php';
|
||||||
require dirname(__FILE__) . '/../dibi/dibi.php';
|
require_once '../dibi/dibi.php';
|
||||||
|
|
||||||
|
|
||||||
// connects to SQlite using dibi class
|
// connects to SQlite using dibi class
|
||||||
@@ -23,6 +23,8 @@ try {
|
|||||||
echo "</p>\n";
|
echo "</p>\n";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// connects to SQlite using DibiConnection object
|
// connects to SQlite using DibiConnection object
|
||||||
echo '<p>Connecting to Sqlite: ';
|
echo '<p>Connecting to Sqlite: ';
|
||||||
try {
|
try {
|
||||||
@@ -38,6 +40,8 @@ try {
|
|||||||
echo "</p>\n";
|
echo "</p>\n";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// connects to MySQL using DSN
|
// connects to MySQL using DSN
|
||||||
echo '<p>Connecting to MySQL: ';
|
echo '<p>Connecting to MySQL: ';
|
||||||
try {
|
try {
|
||||||
@@ -50,6 +54,8 @@ try {
|
|||||||
echo "</p>\n";
|
echo "</p>\n";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// connects to MySQLi using array
|
// connects to MySQLi using array
|
||||||
echo '<p>Connecting to MySQLi: ';
|
echo '<p>Connecting to MySQLi: ';
|
||||||
try {
|
try {
|
||||||
@@ -72,6 +78,8 @@ try {
|
|||||||
echo "</p>\n";
|
echo "</p>\n";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// connects to ODBC
|
// connects to ODBC
|
||||||
echo '<p>Connecting to ODBC: ';
|
echo '<p>Connecting to ODBC: ';
|
||||||
try {
|
try {
|
||||||
@@ -89,6 +97,8 @@ try {
|
|||||||
echo "</p>\n";
|
echo "</p>\n";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// connects to PostgreSql
|
// connects to PostgreSql
|
||||||
echo '<p>Connecting to PostgreSql: ';
|
echo '<p>Connecting to PostgreSql: ';
|
||||||
try {
|
try {
|
||||||
@@ -105,6 +115,8 @@ try {
|
|||||||
echo "</p>\n";
|
echo "</p>\n";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// connects to PDO
|
// connects to PDO
|
||||||
echo '<p>Connecting to Sqlite via PDO: ';
|
echo '<p>Connecting to Sqlite via PDO: ';
|
||||||
try {
|
try {
|
||||||
@@ -120,6 +132,7 @@ try {
|
|||||||
echo "</p>\n";
|
echo "</p>\n";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// connects to MS SQL
|
// connects to MS SQL
|
||||||
echo '<p>Connecting to MS SQL: ';
|
echo '<p>Connecting to MS SQL: ';
|
||||||
try {
|
try {
|
||||||
@@ -137,6 +150,7 @@ try {
|
|||||||
echo "</p>\n";
|
echo "</p>\n";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// connects to MS SQL 2005
|
// connects to MS SQL 2005
|
||||||
echo '<p>Connecting to MS SQL 2005: ';
|
echo '<p>Connecting to MS SQL 2005: ';
|
||||||
try {
|
try {
|
||||||
@@ -155,6 +169,7 @@ try {
|
|||||||
echo "</p>\n";
|
echo "</p>\n";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// connects to Oracle
|
// connects to Oracle
|
||||||
echo '<p>Connecting to Oracle: ';
|
echo '<p>Connecting to Oracle: ';
|
||||||
try {
|
try {
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 1.1 KiB |
@@ -4,8 +4,8 @@
|
|||||||
|
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
require dirname(__FILE__) . '/Nette/Debugger.php';
|
require_once 'Nette/Debugger.php';
|
||||||
require dirname(__FILE__) . '/../dibi/dibi.php';
|
require_once '../dibi/dibi.php';
|
||||||
|
|
||||||
|
|
||||||
dibi::connect(array(
|
dibi::connect(array(
|
||||||
@@ -14,6 +14,7 @@ dibi::connect(array(
|
|||||||
));
|
));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// retrieve database reflection
|
// retrieve database reflection
|
||||||
$database = dibi::getDatabaseInfo();
|
$database = dibi::getDatabaseInfo();
|
||||||
|
|
||||||
@@ -25,6 +26,7 @@ foreach ($database->getTables() as $table) {
|
|||||||
echo "</ul>\n";
|
echo "</ul>\n";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// table reflection
|
// table reflection
|
||||||
$table = $database->getTable('products');
|
$table = $database->getTable('products');
|
||||||
|
|
||||||
@@ -38,6 +40,7 @@ foreach ($table->getColumns() as $column) {
|
|||||||
echo "</ul>\n";
|
echo "</ul>\n";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
echo "Indexes";
|
echo "Indexes";
|
||||||
echo "<ul>\n";
|
echo "<ul>\n";
|
||||||
foreach ($table->getIndexes() as $index) {
|
foreach ($table->getIndexes() as $index) {
|
||||||
|
@@ -4,8 +4,8 @@
|
|||||||
|
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
require dirname(__FILE__) . '/Nette/Debugger.php';
|
require_once 'Nette/Debugger.php';
|
||||||
require dirname(__FILE__) . '/../dibi/dibi.php';
|
require_once '../dibi/dibi.php';
|
||||||
|
|
||||||
|
|
||||||
dibi::connect(array(
|
dibi::connect(array(
|
||||||
@@ -14,6 +14,7 @@ dibi::connect(array(
|
|||||||
));
|
));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
$res = dibi::query('
|
$res = dibi::query('
|
||||||
SELECT * FROM products
|
SELECT * FROM products
|
||||||
INNER JOIN orders USING (product_id)
|
INNER JOIN orders USING (product_id)
|
||||||
|
@@ -4,8 +4,8 @@
|
|||||||
|
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
require dirname(__FILE__) . '/Nette/Debugger.php';
|
require_once 'Nette/Debugger.php';
|
||||||
require dirname(__FILE__) . '/../dibi/dibi.php';
|
require_once '../dibi/dibi.php';
|
||||||
|
|
||||||
ndebug();
|
ndebug();
|
||||||
|
|
||||||
|
@@ -4,8 +4,8 @@
|
|||||||
|
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
require dirname(__FILE__) . '/Nette/Debugger.php';
|
require_once 'Nette/Debugger.php';
|
||||||
require dirname(__FILE__) . '/../dibi/dibi.php';
|
require_once '../dibi/dibi.php';
|
||||||
|
|
||||||
|
|
||||||
dibi::connect(array(
|
dibi::connect(array(
|
||||||
|
@@ -10,8 +10,8 @@
|
|||||||
|
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
require dirname(__FILE__) . '/Nette/Debugger.php';
|
require_once 'Nette/Debugger.php';
|
||||||
require dirname(__FILE__) . '/../dibi/dibi.php';
|
require_once '../dibi/dibi.php';
|
||||||
|
|
||||||
|
|
||||||
// enable Nette Debugger
|
// enable Nette Debugger
|
||||||
@@ -31,6 +31,7 @@ dibi::connect(array(
|
|||||||
dibi::query('SELECT * FROM customers WHERE customer_id < ?', 38);
|
dibi::query('SELECT * FROM customers WHERE customer_id < ?', 38);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
dibi::connect(array(
|
dibi::connect(array(
|
||||||
'driver' => 'sqlite',
|
'driver' => 'sqlite',
|
||||||
'database' => 'data/sample.sdb',
|
'database' => 'data/sample.sdb',
|
||||||
|
@@ -1,7 +1,5 @@
|
|||||||
<!DOCTYPE html><link rel="stylesheet" href="data/style.css">
|
<!DOCTYPE html><link rel="stylesheet" href="data/style.css">
|
||||||
|
|
||||||
<style> html { background: url(data/arrow.png) no-repeat bottom right; height: 100%; } </style>
|
|
||||||
|
|
||||||
<h1>Nette Debugger & Variables | dibi</h1>
|
<h1>Nette Debugger & Variables | dibi</h1>
|
||||||
|
|
||||||
<p>Dibi can dump variables via Nette Debugger, part of Nette Framework.</p>
|
<p>Dibi can dump variables via Nette Debugger, part of Nette Framework.</p>
|
||||||
@@ -12,8 +10,8 @@
|
|||||||
|
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
require dirname(__FILE__) . '/Nette/Debugger.php';
|
require_once 'Nette/Debugger.php';
|
||||||
require dirname(__FILE__) . '/../dibi/dibi.php';
|
require_once '../dibi/dibi.php';
|
||||||
|
|
||||||
|
|
||||||
// enable Nette Debugger
|
// enable Nette Debugger
|
||||||
|
@@ -4,13 +4,13 @@
|
|||||||
|
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
require dirname(__FILE__) . '/Nette/Debugger.php';
|
require_once 'Nette/Debugger.php';
|
||||||
require dirname(__FILE__) . '/../dibi/dibi.php';
|
require_once '../dibi/dibi.php';
|
||||||
|
|
||||||
|
|
||||||
dibi::connect(array(
|
dibi::connect(array(
|
||||||
'driver' => 'sqlite3',
|
'driver' => 'sqlite',
|
||||||
'database' => 'data/sample.s3db',
|
'database' => 'data/sample.sdb',
|
||||||
));
|
));
|
||||||
|
|
||||||
|
|
||||||
@@ -32,6 +32,8 @@ dibi::test('
|
|||||||
// -> SELECT * FROM customers WHERE name LIKE 'K%'
|
// -> SELECT * FROM customers WHERE name LIKE 'K%'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// if & else & (optional) end
|
// if & else & (optional) end
|
||||||
dibi::test("
|
dibi::test("
|
||||||
SELECT *
|
SELECT *
|
||||||
@@ -43,6 +45,7 @@ dibi::test("
|
|||||||
// -> SELECT * FROM people WHERE id > 0 AND bar=2
|
// -> SELECT * FROM people WHERE id > 0 AND bar=2
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// nested condition
|
// nested condition
|
||||||
dibi::test('
|
dibi::test('
|
||||||
SELECT *
|
SELECT *
|
||||||
@@ -53,10 +56,3 @@ dibi::test('
|
|||||||
%else 1 LIMIT 10 %end'
|
%else 1 LIMIT 10 %end'
|
||||||
);
|
);
|
||||||
// -> SELECT * FROM customers WHERE LIMIT 10
|
// -> SELECT * FROM customers WHERE LIMIT 10
|
||||||
|
|
||||||
|
|
||||||
// IF()
|
|
||||||
dibi::test('UPDATE products SET', array(
|
|
||||||
'price' => array('IF(price_fixed, price, ?)', 123),
|
|
||||||
));
|
|
||||||
// -> SELECT * FROM customers WHERE LIMIT 10
|
|
||||||
|
@@ -4,15 +4,15 @@
|
|||||||
|
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
require dirname(__FILE__) . '/Nette/Debugger.php';
|
require_once 'Nette/Debugger.php';
|
||||||
require dirname(__FILE__) . '/../dibi/dibi.php';
|
require_once '../dibi/dibi.php';
|
||||||
|
|
||||||
date_default_timezone_set('Europe/Prague');
|
date_default_timezone_set('Europe/Prague');
|
||||||
|
|
||||||
|
|
||||||
dibi::connect(array(
|
dibi::connect(array(
|
||||||
'driver' => 'sqlite3',
|
'driver' => 'sqlite',
|
||||||
'database' => 'data/sample.s3db',
|
'database' => 'data/sample.sdb',
|
||||||
));
|
));
|
||||||
|
|
||||||
|
|
||||||
@@ -29,6 +29,7 @@ dibi::test('
|
|||||||
// -> SELECT COUNT(*) as [count] FROM [comments] WHERE [ip] LIKE '192.168.%' AND [date] > 876693600
|
// -> SELECT COUNT(*) as [count] FROM [comments] WHERE [ip] LIKE '192.168.%' AND [date] > 876693600
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// dibi detects INSERT or REPLACE command
|
// dibi detects INSERT or REPLACE command
|
||||||
dibi::test('
|
dibi::test('
|
||||||
REPLACE INTO products', array(
|
REPLACE INTO products', array(
|
||||||
@@ -39,6 +40,7 @@ dibi::test('
|
|||||||
// -> REPLACE INTO products ([title], [price], [active]) VALUES ('Super product', 318, 1)
|
// -> REPLACE INTO products ([title], [price], [active]) VALUES ('Super product', 318, 1)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// multiple INSERT command
|
// multiple INSERT command
|
||||||
$array = array(
|
$array = array(
|
||||||
'title' => 'Super Product',
|
'title' => 'Super Product',
|
||||||
@@ -50,6 +52,7 @@ dibi::test("INSERT INTO products", $array, $array, $array);
|
|||||||
// -> INSERT INTO products ([title], [price], [brand], [created]) VALUES ('Super Product', ...) , (...) , (...)
|
// -> INSERT INTO products ([title], [price], [brand], [created]) VALUES ('Super Product', ...) , (...) , (...)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// dibi detects UPDATE command
|
// dibi detects UPDATE command
|
||||||
dibi::test("
|
dibi::test("
|
||||||
UPDATE colors SET", array(
|
UPDATE colors SET", array(
|
||||||
@@ -60,6 +63,7 @@ dibi::test("
|
|||||||
// -> UPDATE colors SET [color]='blue', [order]=12 WHERE id=123
|
// -> UPDATE colors SET [color]='blue', [order]=12 WHERE id=123
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// modifier applied to array
|
// modifier applied to array
|
||||||
$array = array(1, 2, 3);
|
$array = array(1, 2, 3);
|
||||||
dibi::test("
|
dibi::test("
|
||||||
@@ -70,6 +74,7 @@ dibi::test("
|
|||||||
// -> SELECT * FROM people WHERE id IN ( 1, 2, 3 )
|
// -> SELECT * FROM people WHERE id IN ( 1, 2, 3 )
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// modifier %by for ORDER BY
|
// modifier %by for ORDER BY
|
||||||
$order = array(
|
$order = array(
|
||||||
'field1' => 'asc',
|
'field1' => 'asc',
|
||||||
@@ -83,6 +88,7 @@ dibi::test("
|
|||||||
// -> SELECT * FROM people ORDER BY [field1] ASC, [field2] DESC
|
// -> SELECT * FROM people ORDER BY [field1] ASC, [field2] DESC
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// indentifiers and strings syntax mix
|
// indentifiers and strings syntax mix
|
||||||
dibi::test('UPDATE [table] SET `item` = "5 1/4"" diskette"');
|
dibi::test('UPDATE [table] SET `item` = "5 1/4"" diskette"');
|
||||||
// -> UPDATE [table] SET [item] = '5 1/4" diskette'
|
// -> UPDATE [table] SET [item] = '5 1/4" diskette'
|
||||||
|
@@ -4,8 +4,8 @@
|
|||||||
|
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
require dirname(__FILE__) . '/Nette/Debugger.php';
|
require_once 'Nette/Debugger.php';
|
||||||
require dirname(__FILE__) . '/../dibi/dibi.php';
|
require_once '../dibi/dibi.php';
|
||||||
|
|
||||||
ndebug();
|
ndebug();
|
||||||
date_default_timezone_set('Europe/Prague');
|
date_default_timezone_set('Europe/Prague');
|
||||||
@@ -27,10 +27,12 @@ $res->setType('customer_id', Dibi::INTEGER)
|
|||||||
|
|
||||||
dump( $res->fetch() );
|
dump( $res->fetch() );
|
||||||
// outputs:
|
// outputs:
|
||||||
// DibiRow(3) {
|
// object(DibiRow)#3 (3) {
|
||||||
// customer_id => 1
|
// customer_id => int(1)
|
||||||
// name => "Dave Lister" (11)
|
// name => string(11) "Dave Lister"
|
||||||
// added => "2007-03-11 17:20:03" (19)
|
// added => object(DateTime53) {}
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// using auto-detection (works well with MySQL or other strictly typed databases)
|
// using auto-detection (works well with MySQL or other strictly typed databases)
|
||||||
@@ -38,7 +40,8 @@ $res = dibi::query('SELECT * FROM [customers]');
|
|||||||
|
|
||||||
dump( $res->fetch() );
|
dump( $res->fetch() );
|
||||||
// outputs:
|
// outputs:
|
||||||
// DibiRow(3) {
|
// object(DibiRow)#3 (3) {
|
||||||
// customer_id => 1
|
// customer_id => int(1)
|
||||||
// name => "Dave Lister" (11)
|
// name => string(11) "Dave Lister"
|
||||||
// added => "2007-03-11 17:20:03" (19)
|
// added => string(15) "17:20 11.3.2007"
|
||||||
|
// }
|
||||||
|
@@ -4,12 +4,13 @@
|
|||||||
|
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
require dirname(__FILE__) . '/Nette/Debugger.php';
|
require_once 'Nette/Debugger.php';
|
||||||
require dirname(__FILE__) . '/../dibi/dibi.php';
|
require_once '../dibi/dibi.php';
|
||||||
|
|
||||||
date_default_timezone_set('Europe/Prague');
|
date_default_timezone_set('Europe/Prague');
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// CHANGE TO REAL PARAMETERS!
|
// CHANGE TO REAL PARAMETERS!
|
||||||
dibi::connect(array(
|
dibi::connect(array(
|
||||||
'driver' => 'sqlite',
|
'driver' => 'sqlite',
|
||||||
@@ -19,6 +20,7 @@ dibi::connect(array(
|
|||||||
));
|
));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// generate and dump SQL
|
// generate and dump SQL
|
||||||
dibi::test("
|
dibi::test("
|
||||||
INSERT INTO [mytable]", array(
|
INSERT INTO [mytable]", array(
|
||||||
|
@@ -4,8 +4,8 @@
|
|||||||
|
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
require dirname(__FILE__) . '/Nette/Debugger.php';
|
require_once 'Nette/Debugger.php';
|
||||||
require dirname(__FILE__) . '/../dibi/dibi.php';
|
require_once '../dibi/dibi.php';
|
||||||
|
|
||||||
ndebug();
|
ndebug();
|
||||||
|
|
||||||
@@ -15,6 +15,7 @@ dibi::connect(array(
|
|||||||
));
|
));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// using the "prototype" to add custom method to class DibiResult
|
// using the "prototype" to add custom method to class DibiResult
|
||||||
function DibiResult_prototype_fetchShuffle(DibiResult $obj)
|
function DibiResult_prototype_fetchShuffle(DibiResult $obj)
|
||||||
{
|
{
|
||||||
|
@@ -4,8 +4,8 @@
|
|||||||
|
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
require dirname(__FILE__) . '/Nette/Debugger.php';
|
require_once 'Nette/Debugger.php';
|
||||||
require dirname(__FILE__) . '/../dibi/dibi.php';
|
require_once '../dibi/dibi.php';
|
||||||
|
|
||||||
date_default_timezone_set('Europe/Prague');
|
date_default_timezone_set('Europe/Prague');
|
||||||
|
|
||||||
@@ -35,6 +35,7 @@ dibi::select('product_id')->as('id')
|
|||||||
// USING (product_id) INNER JOIN customers USING (customer_id) ORDER BY [title]
|
// USING (product_id) INNER JOIN customers USING (customer_id) ORDER BY [title]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// SELECT ...
|
// SELECT ...
|
||||||
echo dibi::select('title')->as('id')
|
echo dibi::select('title')->as('id')
|
||||||
->from('products')
|
->from('products')
|
||||||
@@ -42,6 +43,7 @@ echo dibi::select('title')->as('id')
|
|||||||
// -> Chair (as result of query: SELECT [title] AS [id] FROM [products])
|
// -> Chair (as result of query: SELECT [title] AS [id] FROM [products])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// INSERT ...
|
// INSERT ...
|
||||||
dibi::insert('products', $record)
|
dibi::insert('products', $record)
|
||||||
->setFlag('IGNORE')
|
->setFlag('IGNORE')
|
||||||
@@ -49,6 +51,7 @@ dibi::insert('products', $record)
|
|||||||
// -> INSERT IGNORE INTO [products] ([title], [price], [active]) VALUES ('Super product', 318, 1)
|
// -> INSERT IGNORE INTO [products] ([title], [price], [active]) VALUES ('Super product', 318, 1)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// UPDATE ...
|
// UPDATE ...
|
||||||
dibi::update('products', $record)
|
dibi::update('products', $record)
|
||||||
->where('product_id = ?', $id)
|
->where('product_id = ?', $id)
|
||||||
@@ -56,6 +59,7 @@ dibi::update('products', $record)
|
|||||||
// -> UPDATE [products] SET [title]='Super product', [price]=318, [active]=1 WHERE product_id = 10
|
// -> UPDATE [products] SET [title]='Super product', [price]=318, [active]=1 WHERE product_id = 10
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// DELETE ...
|
// DELETE ...
|
||||||
dibi::delete('products')
|
dibi::delete('products')
|
||||||
->where('product_id = ?', $id)
|
->where('product_id = ?', $id)
|
||||||
@@ -63,6 +67,7 @@ dibi::delete('products')
|
|||||||
// -> DELETE FROM [products] WHERE product_id = 10
|
// -> DELETE FROM [products] WHERE product_id = 10
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// custom commands
|
// custom commands
|
||||||
dibi::command()
|
dibi::command()
|
||||||
->update('products')
|
->update('products')
|
||||||
@@ -72,6 +77,7 @@ dibi::command()
|
|||||||
// -> UPDATE [products] SET [title]='Super product', [price]=318, [active]=1 WHERE product_id = 10
|
// -> UPDATE [products] SET [title]='Super product', [price]=318, [active]=1 WHERE product_id = 10
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
dibi::command()
|
dibi::command()
|
||||||
->truncate('products')
|
->truncate('products')
|
||||||
->test();
|
->test();
|
||||||
|
@@ -4,8 +4,8 @@
|
|||||||
|
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
require dirname(__FILE__) . '/Nette/Debugger.php';
|
require_once 'Nette/Debugger.php';
|
||||||
require dirname(__FILE__) . '/../dibi/dibi.php';
|
require_once '../dibi/dibi.php';
|
||||||
|
|
||||||
|
|
||||||
dibi::connect(array(
|
dibi::connect(array(
|
||||||
@@ -19,11 +19,13 @@ dibi::test('SELECT * FROM [products]');
|
|||||||
// -> SELECT * FROM [products]
|
// -> SELECT * FROM [products]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// with limit = 2
|
// with limit = 2
|
||||||
dibi::test('SELECT * FROM [products] %lmt', 2);
|
dibi::test('SELECT * FROM [products] %lmt', 2);
|
||||||
// -> SELECT * FROM [products] LIMIT 2
|
// -> SELECT * FROM [products] LIMIT 2
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// with limit = 2, offset = 1
|
// with limit = 2, offset = 1
|
||||||
dibi::test('SELECT * FROM [products] %lmt %ofs', 2, 1);
|
dibi::test('SELECT * FROM [products] %lmt %ofs', 2, 1);
|
||||||
// -> SELECT * FROM [products] LIMIT 2 OFFSET 1
|
// -> SELECT * FROM [products] LIMIT 2 OFFSET 1
|
||||||
|
@@ -4,8 +4,8 @@
|
|||||||
|
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
require dirname(__FILE__) . '/Nette/Debugger.php';
|
require_once 'Nette/Debugger.php';
|
||||||
require dirname(__FILE__) . '/../dibi/dibi.php';
|
require_once '../dibi/dibi.php';
|
||||||
|
|
||||||
date_default_timezone_set('Europe/Prague');
|
date_default_timezone_set('Europe/Prague');
|
||||||
|
|
||||||
@@ -21,6 +21,7 @@ dibi::connect(array(
|
|||||||
));
|
));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$res = dibi::query('SELECT * FROM [customers] WHERE [customer_id] = ?', 1);
|
$res = dibi::query('SELECT * FROM [customers] WHERE [customer_id] = ?', 1);
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
<?php ob_start() // needed by FirePHP ?>
|
<?php ob_start(1) // needed by FirePHP ?>
|
||||||
|
|
||||||
<!DOCTYPE html><link rel="stylesheet" href="data/style.css">
|
<!DOCTYPE html><link rel="stylesheet" href="data/style.css">
|
||||||
|
|
||||||
@@ -6,8 +6,8 @@
|
|||||||
|
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
require dirname(__FILE__) . '/Nette/Debugger.php';
|
require_once 'Nette/Debugger.php';
|
||||||
require dirname(__FILE__) . '/../dibi/dibi.php';
|
require_once '../dibi/dibi.php';
|
||||||
|
|
||||||
|
|
||||||
dibi::connect(array(
|
dibi::connect(array(
|
||||||
|
@@ -4,8 +4,8 @@
|
|||||||
|
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
require dirname(__FILE__) . '/Nette/Debugger.php';
|
require_once 'Nette/Debugger.php';
|
||||||
require dirname(__FILE__) . '/../dibi/dibi.php';
|
require_once '../dibi/dibi.php';
|
||||||
|
|
||||||
|
|
||||||
dibi::connect(array(
|
dibi::connect(array(
|
||||||
@@ -14,6 +14,8 @@ dibi::connect(array(
|
|||||||
));
|
));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// create new substitution :blog: ==> wp_
|
// create new substitution :blog: ==> wp_
|
||||||
dibi::getSubstitutes()->blog = 'wp_';
|
dibi::getSubstitutes()->blog = 'wp_';
|
||||||
|
|
||||||
@@ -21,6 +23,9 @@ dibi::test("SELECT * FROM [:blog:items]");
|
|||||||
// -> SELECT * FROM [wp_items]
|
// -> SELECT * FROM [wp_items]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// create new substitution :: (empty) ==> my_
|
// create new substitution :: (empty) ==> my_
|
||||||
dibi::getSubstitutes()->{''} = 'my_';
|
dibi::getSubstitutes()->{''} = 'my_';
|
||||||
|
|
||||||
@@ -28,6 +33,9 @@ dibi::test("UPDATE ::table SET [text]='Hello World'");
|
|||||||
// -> UPDATE my_table SET [text]='Hello World'
|
// -> UPDATE my_table SET [text]='Hello World'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// create substitutions using fallback callback
|
// create substitutions using fallback callback
|
||||||
function substFallBack($expr)
|
function substFallBack($expr)
|
||||||
{
|
{
|
||||||
|
@@ -4,8 +4,8 @@
|
|||||||
|
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
require dirname(__FILE__) . '/Nette/Debugger.php';
|
require_once 'Nette/Debugger.php';
|
||||||
require dirname(__FILE__) . '/../dibi/dibi.php';
|
require_once '../dibi/dibi.php';
|
||||||
|
|
||||||
|
|
||||||
dibi::connect(array(
|
dibi::connect(array(
|
||||||
|
55
license.md
55
license.md
@@ -1,55 +0,0 @@
|
|||||||
Licenses
|
|
||||||
========
|
|
||||||
|
|
||||||
Good news! You may use Dibi under the terms of either the New BSD License
|
|
||||||
or the GNU General Public License (GPL) version 2 or 3.
|
|
||||||
|
|
||||||
The BSD License is recommended for most projects. It is easy to understand and it
|
|
||||||
places almost no restrictions on what you can do with the framework. If the GPL
|
|
||||||
fits better to your project, you can use the framework under this license.
|
|
||||||
|
|
||||||
You don't have to notify anyone which license you are using. You can freely
|
|
||||||
use Dibi in commercial projects as long as the copyright header
|
|
||||||
remains intact.
|
|
||||||
|
|
||||||
|
|
||||||
New BSD License
|
|
||||||
---------------
|
|
||||||
|
|
||||||
Copyright (c) 2004, 2013 David Grudl (http://davidgrudl.com)
|
|
||||||
All rights reserved.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
* Neither the name of "Dibi" nor the names of its contributors
|
|
||||||
may be used to endorse or promote products derived from this software
|
|
||||||
without specific prior written permission.
|
|
||||||
|
|
||||||
This software is provided by the copyright holders and contributors "as is" and
|
|
||||||
any express or implied warranties, including, but not limited to, the implied
|
|
||||||
warranties of merchantability and fitness for a particular purpose are
|
|
||||||
disclaimed. In no event shall the copyright owner or contributors be liable for
|
|
||||||
any direct, indirect, incidental, special, exemplary, or consequential damages
|
|
||||||
(including, but not limited to, procurement of substitute goods or services;
|
|
||||||
loss of use, data, or profits; or business interruption) however caused and on
|
|
||||||
any theory of liability, whether in contract, strict liability, or tort
|
|
||||||
(including negligence or otherwise) arising in any way out of the use of this
|
|
||||||
software, even if advised of the possibility of such damage.
|
|
||||||
|
|
||||||
|
|
||||||
GNU General Public License
|
|
||||||
--------------------------
|
|
||||||
|
|
||||||
GPL licenses are very very long, so instead of including them here we offer
|
|
||||||
you URLs with full text:
|
|
||||||
|
|
||||||
- [GPL version 2](http://www.gnu.org/licenses/gpl-2.0.html)
|
|
||||||
- [GPL version 3](http://www.gnu.org/licenses/gpl-3.0.html)
|
|
61
license.txt
Normal file
61
license.txt
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
Licenses
|
||||||
|
========
|
||||||
|
|
||||||
|
Good news! You may use Dibi under the terms of either the New BSD License
|
||||||
|
or the GNU General Public License (GPL) version 2 or 3.
|
||||||
|
|
||||||
|
The BSD License is recommended for most projects. It is easy to understand and it
|
||||||
|
places almost no restrictions on what you can do with the library. If the GPL
|
||||||
|
fits better to your project, you can use the Dibi under this license.
|
||||||
|
|
||||||
|
You don't have to notify anyone which license you are using. You can freely
|
||||||
|
use Dibi in commercial projects as long as the copyright header
|
||||||
|
remains intact.
|
||||||
|
|
||||||
|
Please do not use word "Dibi" in the name of your project or top-level domain,
|
||||||
|
and choose a name that stands on its own merits. If your stuff is good,
|
||||||
|
it will not take long to establish a reputation for yourselves.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
New BSD License
|
||||||
|
---------------
|
||||||
|
|
||||||
|
Copyright (c) 2005, 2012 David Grudl (http://davidgrudl.com)
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer in the documentation
|
||||||
|
and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
* Neither the name of "Dibi" nor the names of its contributors
|
||||||
|
may be used to endorse or promote products derived from this software
|
||||||
|
without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||||
|
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||||
|
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
GNU General Public License
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
GPL licenses are very very long, so instead of including them here we offer
|
||||||
|
you URLs with full text:
|
||||||
|
|
||||||
|
- GPL version 2: http://www.gnu.org/licenses/gpl-2.0.html
|
||||||
|
- GPL version 3: http://www.gnu.org/licenses/gpl-3.0.html
|
126
readme.md
126
readme.md
@@ -1,126 +0,0 @@
|
|||||||
[Dibi](http://dibiphp.com) - smart database layer for PHP
|
|
||||||
=========================================================
|
|
||||||
|
|
||||||
Database access functions in PHP are not standardised. This library
|
|
||||||
hides the differences between them, a above all, it gives you a very handy interface.
|
|
||||||
|
|
||||||
The best way how to install Dibi is to use a [Composer](http://getcomposer.org/download):
|
|
||||||
|
|
||||||
php composer.phar require dibi/dibi
|
|
||||||
|
|
||||||
Or you can download a latest package from http://dibiphp.com. In this
|
|
||||||
package is also `Dibi.minified`, shrinked single-file version of whole Dibi,
|
|
||||||
useful when you don't want to modify library, but just use it.
|
|
||||||
|
|
||||||
Dibi requires PHP 5.2.0 or later. It has been tested with PHP 5.5 too.
|
|
||||||
|
|
||||||
|
|
||||||
Examples
|
|
||||||
--------
|
|
||||||
|
|
||||||
Refer to the `examples` directory for examples. Dibi documentation is
|
|
||||||
available on the [homepage](http://dibiphp.com).
|
|
||||||
|
|
||||||
Connect to database:
|
|
||||||
|
|
||||||
```php
|
|
||||||
// connect to database (static way)
|
|
||||||
dibi::connect(array(
|
|
||||||
'driver' => 'mysql',
|
|
||||||
'host' => 'localhost',
|
|
||||||
'username' => 'root',
|
|
||||||
'password' => '***',
|
|
||||||
));
|
|
||||||
|
|
||||||
// or object way; in all other examples use $connection-> instead of dibi::
|
|
||||||
$connection = new DibiConnection($options);
|
|
||||||
```
|
|
||||||
|
|
||||||
SELECT, INSERT, UPDATE
|
|
||||||
|
|
||||||
```php
|
|
||||||
dibi::query('SELECT * FROM users WHERE id = ?', $id);
|
|
||||||
|
|
||||||
$arr = array(
|
|
||||||
'name' => 'John',
|
|
||||||
'is_admin' => TRUE,
|
|
||||||
);
|
|
||||||
dibi::query('INSERT INTO users', $arr);
|
|
||||||
// INSERT INTO users (`name`, `is_admin`) VALUES ('John', 1)
|
|
||||||
|
|
||||||
dibi::query('UPDATE users SET', $arr, 'WHERE `id`=?', $x);
|
|
||||||
// UPDATE users SET `name`='John', `is_admin`=1 WHERE `id` = 123
|
|
||||||
|
|
||||||
dibi::query('UPDATE users SET', array(
|
|
||||||
'title' => array('SHA1(?)', 'tajneheslo'),
|
|
||||||
));
|
|
||||||
// UPDATE users SET 'title' = SHA1('tajneheslo')
|
|
||||||
```
|
|
||||||
|
|
||||||
Getting results
|
|
||||||
|
|
||||||
```php
|
|
||||||
$result = dibi::query('SELECT * FROM users');
|
|
||||||
|
|
||||||
$value = $result->fetchSingle(); // single value
|
|
||||||
$all = $result->fetchAll(); // all rows
|
|
||||||
$assoc = $result->fetchAssoc('id'); // all rows as associative array
|
|
||||||
$pairs = $result->fetchPairs('customerID', 'name'); // all rows as key => value pairs
|
|
||||||
|
|
||||||
// iterating
|
|
||||||
foreach ($result as $n => $row) {
|
|
||||||
print_r($row);
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
Modifiers for arrays:
|
|
||||||
|
|
||||||
```php
|
|
||||||
dibi::query('SELECT * FROM users WHERE %and', array(
|
|
||||||
array('number > ?', 10),
|
|
||||||
array('number < ?', 100),
|
|
||||||
));
|
|
||||||
// SELECT * FROM users WHERE (number > 10) AND (number < 100)
|
|
||||||
```
|
|
||||||
|
|
||||||
<table>
|
|
||||||
<tr><td> %and </td><td> </td><td> `[key]=val AND [key2]="val2" AND ...` </td></tr>
|
|
||||||
<tr><td> %or </td><td> </td><td> `[key]=val OR [key2]="val2" OR ...` </td></tr>
|
|
||||||
<tr><td> %a </td><td> assoc </td><td> `[key]=val, [key2]="val2", ...` </td></tr>
|
|
||||||
<tr><td> %l %in </td><td> list </td><td> `(val, "val2", ...)` </td></tr>
|
|
||||||
<tr><td> %v </td><td> values </td><td> `([key], [key2], ...) VALUES (val, "val2", ...)` </td></tr>
|
|
||||||
<tr><td> %m </td><td> multivalues </td><td> `([key], [key2], ...) VALUES (val, "val2", ...), (val, "val2", ...), ...` </td></tr>
|
|
||||||
<tr><td> %by </td><td> ordering </td><td> `[key] ASC, [key2] DESC ...` </td></tr>
|
|
||||||
<tr><td> %n </td><td> identifiers </td><td> `[key], [key2] AS alias, ...` </td></tr>
|
|
||||||
<tr><td> other </td><td> - </td><td> `val, val2, ...` </td></tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
|
|
||||||
Modifiers for LIKE
|
|
||||||
|
|
||||||
```php
|
|
||||||
dibi::query("SELECT * FROM table WHERE name LIKE %like~", $query);
|
|
||||||
```
|
|
||||||
|
|
||||||
<table>
|
|
||||||
<tr><td> %like~ </td><td> begins with </td></tr>
|
|
||||||
<tr><td> %~like </td><td> ends with </td></tr>
|
|
||||||
<tr><td> %~like~ </td><td> contains </td></tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
DateTime:
|
|
||||||
|
|
||||||
```php
|
|
||||||
dibi::query('UPDATE users SET', array(
|
|
||||||
'time' => new DateTime,
|
|
||||||
));
|
|
||||||
// UPDATE users SET ('2008-01-01 01:08:10')
|
|
||||||
```
|
|
||||||
|
|
||||||
Testing:
|
|
||||||
|
|
||||||
```php
|
|
||||||
echo dibi::$sql; // last SQL query
|
|
||||||
echo dibi::$elapsedTime;
|
|
||||||
echo dibi::$numOfQueries;
|
|
||||||
echo dibi::$totalTime;
|
|
31
readme.txt
Normal file
31
readme.txt
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
Introduction
|
||||||
|
------------
|
||||||
|
|
||||||
|
Thank you for downloading Dibi!
|
||||||
|
|
||||||
|
Database access functions in PHP are not standardised. This is class library
|
||||||
|
to hide the differences between the different databases access.
|
||||||
|
|
||||||
|
|
||||||
|
Documentation and Examples
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
Refer to the 'examples' directory for examples. Dibi documentation is
|
||||||
|
available on the homepage:
|
||||||
|
|
||||||
|
http://dibiphp.com
|
||||||
|
|
||||||
|
|
||||||
|
Dibi.minified
|
||||||
|
-------------
|
||||||
|
|
||||||
|
This is shrinked single-file version of whole Dibi, useful when you don't
|
||||||
|
want to modify library, but just use it.
|
||||||
|
|
||||||
|
This is exactly the same as normal version, just only comments and
|
||||||
|
whitespaces are removed.
|
||||||
|
|
||||||
|
|
||||||
|
-----
|
||||||
|
For more information, visit the author's weblog (in czech language):
|
||||||
|
http://phpfashion.com
|
@@ -4,14 +4,17 @@
|
|||||||
* Test: Cloning of DibiFluent
|
* Test: Cloning of DibiFluent
|
||||||
*
|
*
|
||||||
* @author David Grudl
|
* @author David Grudl
|
||||||
|
* @category Dibi
|
||||||
|
* @subpackage UnitTests
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
require dirname(__FILE__) . '/bootstrap.php';
|
|
||||||
|
require dirname(__FILE__) . '/initialize.php';
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
dibi::connect($config['sqlite3']);
|
dibi::connect($config['sqlite']);
|
||||||
|
|
||||||
|
|
||||||
$fluent = new DibiFluent(dibi::getConnection());
|
$fluent = new DibiFluent(dibi::getConnection());
|
||||||
@@ -20,21 +23,50 @@ $dolly = clone $fluent;
|
|||||||
$dolly->where('y=1');
|
$dolly->where('y=1');
|
||||||
$dolly->clause('FOO');
|
$dolly->clause('FOO');
|
||||||
|
|
||||||
Assert::same( 'SELECT * FROM [table] WHERE x=1', (string) $fluent );
|
$fluent->test();
|
||||||
Assert::same( 'SELECT * FROM [table] WHERE x=1 AND y=1 FOO', (string) $dolly );
|
$dolly->test();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
$fluent = dibi::select('id')->from('table')->where('id = %i',1);
|
$fluent = dibi::select('id')->from('table')->where('id = %i',1);
|
||||||
$dolly = clone $fluent;
|
$dolly = clone $fluent;
|
||||||
$dolly->where('cd = %i',5);
|
$dolly->where('cd = %i',5);
|
||||||
|
|
||||||
Assert::same( 'SELECT [id] FROM [table] WHERE id = 1', (string) $fluent );
|
$fluent->test();
|
||||||
Assert::same( 'SELECT [id] FROM [table] WHERE id = 1 AND cd = 5', (string) $dolly );
|
$dolly->test();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
$fluent = dibi::select("*")->from("table");
|
$fluent = dibi::select("*")->from("table");
|
||||||
$dolly = clone $fluent;
|
$dolly = clone $fluent;
|
||||||
$dolly->removeClause("select")->select("count(*)");
|
$dolly->removeClause("select")->select("count(*)");
|
||||||
|
|
||||||
Assert::same( 'SELECT * FROM [table]', (string) $fluent );
|
$fluent->test();
|
||||||
Assert::same( 'SELECT count(*) FROM [table]', (string) $dolly );
|
$dolly->test();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
__halt_compiler() ?>
|
||||||
|
|
||||||
|
------EXPECT------
|
||||||
|
SELECT *
|
||||||
|
FROM [table]
|
||||||
|
WHERE x=1
|
||||||
|
|
||||||
|
SELECT *
|
||||||
|
FROM [table]
|
||||||
|
WHERE x=1 AND y=1 FOO
|
||||||
|
|
||||||
|
SELECT [id]
|
||||||
|
FROM [table]
|
||||||
|
WHERE id = 1
|
||||||
|
|
||||||
|
SELECT [id]
|
||||||
|
FROM [table]
|
||||||
|
WHERE id = 1 AND cd = 5
|
||||||
|
|
||||||
|
SELECT *
|
||||||
|
FROM [table]
|
||||||
|
|
||||||
|
SELECT count(*)
|
||||||
|
FROM [table]
|
||||||
|
138
tests/NetteTest/Assert.php
Normal file
138
tests/NetteTest/Assert.php
Normal file
@@ -0,0 +1,138 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Nette Framework
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) 2004 David Grudl
|
||||||
|
* @license http://nette.org/license Nette license
|
||||||
|
* @link http://nette.org
|
||||||
|
* @category Nette
|
||||||
|
* @package Nette\Test
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Asseratation test helpers.
|
||||||
|
*
|
||||||
|
* @author David Grudl
|
||||||
|
* @package Nette\Test
|
||||||
|
*/
|
||||||
|
class Assert
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks assertation.
|
||||||
|
* @param mixed expected
|
||||||
|
* @param mixed actual
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public static function same($expected, $actual)
|
||||||
|
{
|
||||||
|
if ($actual !== $expected) {
|
||||||
|
self::note('Failed asserting that ' . self::dump($actual) . ' is not identical to ' . self::dump($expected));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks TRUE assertation.
|
||||||
|
* @param mixed actual
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public static function true($actual)
|
||||||
|
{
|
||||||
|
if ($actual !== TRUE) {
|
||||||
|
self::note('Failed asserting that ' . self::dump($actual) . ' is not TRUE');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks FALSE assertation.
|
||||||
|
* @param mixed actual
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public static function false($actual)
|
||||||
|
{
|
||||||
|
if ($actual !== FALSE) {
|
||||||
|
self::note('Failed asserting that ' . self::dump($actual) . ' is not FALSE');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks NULL assertation.
|
||||||
|
* @param mixed actual
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public static function null($actual)
|
||||||
|
{
|
||||||
|
if ($actual !== NULL) {
|
||||||
|
self::note('Failed asserting that ' . self::dump($actual) . ' is not NULL');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dumps information about a variable in readable format.
|
||||||
|
* @param mixed variable to dump
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
private static function dump($var)
|
||||||
|
{
|
||||||
|
if (is_bool($var)) {
|
||||||
|
return $var ? 'TRUE' : 'FALSE';
|
||||||
|
|
||||||
|
} elseif ($var === NULL) {
|
||||||
|
return "NULL";
|
||||||
|
|
||||||
|
} elseif (is_int($var)) {
|
||||||
|
return "$var";
|
||||||
|
|
||||||
|
} elseif (is_float($var)) {
|
||||||
|
return "$var";
|
||||||
|
|
||||||
|
} elseif (is_string($var)) {
|
||||||
|
return var_export($var, TRUE);
|
||||||
|
|
||||||
|
} elseif (is_array($var)) {
|
||||||
|
return "array(" . count($var) . ")";
|
||||||
|
|
||||||
|
} elseif ($var instanceof Exception) {
|
||||||
|
return 'Exception ' . get_class($var) . ': ' . ($var->getCode() ? '#' . $var->getCode() . ' ' : '') . $var->getMessage();
|
||||||
|
|
||||||
|
} elseif (is_object($var)) {
|
||||||
|
$arr = (array) $var;
|
||||||
|
return "object(" . get_class($var) . ") (" . count($arr) . ")";
|
||||||
|
|
||||||
|
} elseif (is_resource($var)) {
|
||||||
|
return "resource(" . get_resource_type($var) . ")";
|
||||||
|
|
||||||
|
} else {
|
||||||
|
return "unknown type";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns message and file and line from call stack.
|
||||||
|
* @param string
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
private static function note($message)
|
||||||
|
{
|
||||||
|
echo $message;
|
||||||
|
$trace = debug_backtrace();
|
||||||
|
if (isset($trace[1]['file'], $trace[1]['line'])) {
|
||||||
|
echo ' in file ' . $trace[1]['file'] . ' on line ' . $trace[1]['line'];
|
||||||
|
}
|
||||||
|
echo "\n\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
43
tests/NetteTest/RunTests.php
Normal file
43
tests/NetteTest/RunTests.php
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
|
||||||
|
Nette Test Framework (v0.3)
|
||||||
|
---------------------------
|
||||||
|
<?php
|
||||||
|
|
||||||
|
require_once dirname(__FILE__) . '/TestRunner.php';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Help
|
||||||
|
*/
|
||||||
|
if (!isset($_SERVER['argv'][1])) { ?>
|
||||||
|
Usage:
|
||||||
|
php RunTests.php [options] [file or directory]
|
||||||
|
|
||||||
|
Options:
|
||||||
|
-p <php> Specify PHP-CGI executable to run.
|
||||||
|
-c <path> Look for php.ini in directory <path> or use <path> as php.ini.
|
||||||
|
-d key=val Define INI entry 'key' with value 'val'.
|
||||||
|
-l <path> Specify path to shared library files (LD_LIBRARY_PATH)
|
||||||
|
-e <name> Load php environment <name>
|
||||||
|
-s Show information about skipped tests
|
||||||
|
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute tests
|
||||||
|
*/
|
||||||
|
try {
|
||||||
|
@unlink(dirname(__FILE__) . '/coverage.tmp'); // @ - file may not exist
|
||||||
|
|
||||||
|
$manager = new TestRunner;
|
||||||
|
$manager->parseConfigFile();
|
||||||
|
$manager->parseArguments();
|
||||||
|
$res = $manager->run();
|
||||||
|
die($res ? 0 : 1);
|
||||||
|
|
||||||
|
} catch (Exception $e) {
|
||||||
|
echo 'Error: ', $e->getMessage(), "\n";
|
||||||
|
die(2);
|
||||||
|
}
|
400
tests/NetteTest/TestCase.php
Normal file
400
tests/NetteTest/TestCase.php
Normal file
@@ -0,0 +1,400 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Nette Framework
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) 2004 David Grudl
|
||||||
|
* @license http://nette.org/license Nette license
|
||||||
|
* @link http://nette.org
|
||||||
|
* @category Nette
|
||||||
|
* @package Nette\Test
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Single test case.
|
||||||
|
*
|
||||||
|
* @author David Grudl
|
||||||
|
* @package Nette\Test
|
||||||
|
*/
|
||||||
|
class TestCase
|
||||||
|
{
|
||||||
|
/** @var string test file */
|
||||||
|
private $file;
|
||||||
|
|
||||||
|
/** @var array test file multiparts */
|
||||||
|
private $sections;
|
||||||
|
|
||||||
|
/** @var string test output */
|
||||||
|
private $output;
|
||||||
|
|
||||||
|
/** @var string output headers in raw format */
|
||||||
|
private $headers;
|
||||||
|
|
||||||
|
/** @var string PHP command line */
|
||||||
|
private $cmdLine;
|
||||||
|
|
||||||
|
/** @var string PHP command line */
|
||||||
|
private $phpVersion;
|
||||||
|
|
||||||
|
/** @var array */
|
||||||
|
private static $cachedPhp;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string test file name
|
||||||
|
* @param string PHP command line
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function __construct($testFile)
|
||||||
|
{
|
||||||
|
$this->file = (string) $testFile;
|
||||||
|
$this->sections = self::parseSections($this->file);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Runs single test.
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function run()
|
||||||
|
{
|
||||||
|
// pre-skip?
|
||||||
|
$options = $this->sections['options'];
|
||||||
|
if (isset($options['skip'])) {
|
||||||
|
$message = $options['skip'] ? $options['skip'] : 'No message.';
|
||||||
|
throw new TestCaseException($message, TestCaseException::SKIPPED);
|
||||||
|
|
||||||
|
} elseif (isset($options['phpversion'])) {
|
||||||
|
$operator = '>=';
|
||||||
|
if (preg_match('#^(<=|le|<|lt|==|=|eq|!=|<>|ne|>=|ge|>|gt)#', $options['phpversion'], $matches)) {
|
||||||
|
$options['phpversion'] = trim(substr($options['phpversion'], strlen($matches[1])));
|
||||||
|
$operator = $matches[1];
|
||||||
|
}
|
||||||
|
if (version_compare($options['phpversion'], $this->phpVersion, $operator)) {
|
||||||
|
throw new TestCaseException("Requires PHP $operator $options[phpversion].", TestCaseException::SKIPPED);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->execute();
|
||||||
|
$output = $this->output;
|
||||||
|
$headers = array_change_key_case(self::parseLines($this->headers, ':'), CASE_LOWER);
|
||||||
|
$tests = 0;
|
||||||
|
|
||||||
|
// post-skip?
|
||||||
|
if (isset($headers['x-nette-test-skip'])) {
|
||||||
|
throw new TestCaseException($headers['x-nette-test-skip'], TestCaseException::SKIPPED);
|
||||||
|
}
|
||||||
|
|
||||||
|
// compare output
|
||||||
|
$expectedOutput = $this->getExpectedOutput();
|
||||||
|
if ($expectedOutput !== NULL) {
|
||||||
|
$tests++;
|
||||||
|
$binary = (bool) preg_match('#[\x00-\x08\x0B\x0C\x0E-\x1F]#', $expectedOutput);
|
||||||
|
if ($binary) {
|
||||||
|
if ($expectedOutput !== $output) {
|
||||||
|
throw new TestCaseException("Binary output doesn't match.");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$output = self::normalize($output, isset($options['keeptrailingspaces']));
|
||||||
|
$expectedOutput = self::normalize($expectedOutput, isset($options['keeptrailingspaces']));
|
||||||
|
if (!$this->compare($output, $expectedOutput)) {
|
||||||
|
throw new TestCaseException("Output doesn't match.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// compare headers
|
||||||
|
$expectedHeaders = $this->getExpectedHeaders();
|
||||||
|
if ($expectedHeaders !== NULL) {
|
||||||
|
$tests++;
|
||||||
|
$expectedHeaders = self::normalize($expectedHeaders, FALSE);
|
||||||
|
$expectedHeaders = array_change_key_case(self::parseLines($expectedHeaders, ':'), CASE_LOWER);
|
||||||
|
foreach ($expectedHeaders as $name => $header) {
|
||||||
|
if (!isset($headers[$name])) {
|
||||||
|
throw new TestCaseException("Missing header '$name'.");
|
||||||
|
|
||||||
|
} elseif (!$this->compare($headers[$name], $header)) {
|
||||||
|
throw new TestCaseException("Header '$name' doesn't match.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$tests) { // expecting no output
|
||||||
|
if (trim($output) !== '') {
|
||||||
|
throw new TestCaseException("Empty output doesn't match.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets PHP command line.
|
||||||
|
* @param string
|
||||||
|
* @param string
|
||||||
|
* @param string
|
||||||
|
* @return TestCase provides a fluent interface
|
||||||
|
*/
|
||||||
|
public function setPhp($binary, $args, $environment)
|
||||||
|
{
|
||||||
|
if (isset(self::$cachedPhp[$binary])) {
|
||||||
|
$this->phpVersion = self::$cachedPhp[$binary];
|
||||||
|
|
||||||
|
} else {
|
||||||
|
exec($environment . escapeshellarg($binary) . ' -v', $output, $res);
|
||||||
|
if ($res !== 0 && $res !== 255) {
|
||||||
|
throw new Exception("Unable to execute '$binary -v'.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!preg_match('#^PHP (\S+).*cli#i', $output[0], $matches)) {
|
||||||
|
throw new Exception("Unable to detect PHP version (output: $output[0]).");
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->phpVersion = self::$cachedPhp[$binary] = $matches[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->cmdLine = $environment . escapeshellarg($binary) . $args;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute test.
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
private function execute()
|
||||||
|
{
|
||||||
|
$this->headers = $this->output = NULL;
|
||||||
|
|
||||||
|
$tempFile = tempnam('', 'tmp');
|
||||||
|
if (!$tempFile) {
|
||||||
|
throw new Exception("Unable to create temporary file.");
|
||||||
|
}
|
||||||
|
|
||||||
|
$command = $this->cmdLine;
|
||||||
|
if (isset($this->sections['options']['phpini'])) {
|
||||||
|
foreach (explode(';', $this->sections['options']['phpini']) as $item) {
|
||||||
|
$command .= " -d " . escapeshellarg(trim($item));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$command .= ' ' . escapeshellarg($this->file) . ' > ' . escapeshellarg($tempFile);
|
||||||
|
|
||||||
|
chdir(dirname($this->file));
|
||||||
|
exec($command, $foo, $res);
|
||||||
|
if ($res === 255) {
|
||||||
|
// exit_status 255 => parse or fatal error
|
||||||
|
|
||||||
|
} elseif ($res !== 0) {
|
||||||
|
throw new Exception("Unable to execute '$command'.");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->output = file_get_contents($tempFile);
|
||||||
|
unlink($tempFile);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns test file section.
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getSection($name)
|
||||||
|
{
|
||||||
|
return isset($this->sections[$name]) ? $this->sections[$name] : NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns test name.
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getName()
|
||||||
|
{
|
||||||
|
return $this->sections['options']['name'];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns test output.
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getOutput()
|
||||||
|
{
|
||||||
|
return $this->output;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns output headers.
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getHeaders()
|
||||||
|
{
|
||||||
|
return $this->headers;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns expected output.
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getExpectedOutput()
|
||||||
|
{
|
||||||
|
if (isset($this->sections['expect'])) {
|
||||||
|
return $this->sections['expect'];
|
||||||
|
|
||||||
|
} elseif (is_file($expFile = str_replace('.phpt', '', $this->file) . '.expect')) {
|
||||||
|
return file_get_contents($expFile);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns expected headers.
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getExpectedHeaders()
|
||||||
|
{
|
||||||
|
return $this->getSection('expectheaders');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/********************* helpers ****************d*g**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Splits file into sections.
|
||||||
|
* @param string file
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public static function parseSections($testFile)
|
||||||
|
{
|
||||||
|
$content = file_get_contents($testFile);
|
||||||
|
$sections = array(
|
||||||
|
'options' => array(),
|
||||||
|
);
|
||||||
|
|
||||||
|
// phpDoc
|
||||||
|
$phpDoc = preg_match('#^/\*\*(.*?)\*/#ms', $content, $matches) ? trim($matches[1]) : '';
|
||||||
|
preg_match_all('#^\s*\*\s*@(\S+)(.*)#mi', $phpDoc, $matches, PREG_SET_ORDER);
|
||||||
|
foreach ($matches as $match) {
|
||||||
|
$sections['options'][strtolower($match[1])] = isset($match[2]) ? trim($match[2]) : TRUE;
|
||||||
|
}
|
||||||
|
$sections['options']['name'] = preg_match('#^\s*\*\s*TEST:(.*)#mi', $phpDoc, $matches) ? trim($matches[1]) : $testFile;
|
||||||
|
|
||||||
|
// file parts
|
||||||
|
$tmp = preg_split('#^-{3,}([^\s-]+)-{1,}(?:\r?\n|$)#m', $content, -1, PREG_SPLIT_DELIM_CAPTURE);
|
||||||
|
$i = 1;
|
||||||
|
while (isset($tmp[$i])) {
|
||||||
|
$sections[strtolower($tmp[$i])] = $tmp[$i+1];
|
||||||
|
$i += 2;
|
||||||
|
}
|
||||||
|
return $sections;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Splits HTTP headers into array.
|
||||||
|
* @param string
|
||||||
|
* @param string
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public static function parseLines($raw, $separator)
|
||||||
|
{
|
||||||
|
$headers = array();
|
||||||
|
foreach (explode("\r\n", $raw) as $header) {
|
||||||
|
$a = strpos($header, $separator);
|
||||||
|
if ($a !== FALSE) {
|
||||||
|
$headers[trim(substr($header, 0, $a))] = (string) trim(substr($header, $a + 1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $headers;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compares results.
|
||||||
|
* @param string
|
||||||
|
* @param string
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public static function compare($left, $right)
|
||||||
|
{
|
||||||
|
$right = strtr($right, array(
|
||||||
|
'%a%' => '[^\r\n]+', // one or more of anything except the end of line characters
|
||||||
|
'%a?%'=> '[^\r\n]*', // zero or more of anything except the end of line characters
|
||||||
|
'%A%' => '.+', // one or more of anything including the end of line characters
|
||||||
|
'%A?%'=> '.*', // zero or more of anything including the end of line characters
|
||||||
|
'%s%' => '[\t ]+', // one or more white space characters except the end of line characters
|
||||||
|
'%s?%'=> '[\t ]*', // zero or more white space characters except the end of line characters
|
||||||
|
'%S%' => '\S+', // one or more of characters except the white space
|
||||||
|
'%S?%'=> '\S*', // zero or more of characters except the white space
|
||||||
|
'%c%' => '[^\r\n]', // a single character of any sort (except the end of line)
|
||||||
|
'%d%' => '[0-9]+', // one or more digits
|
||||||
|
'%d?%'=> '[0-9]*', // zero or more digits
|
||||||
|
'%i%' => '[+-]?[0-9]+', // signed integer value
|
||||||
|
'%f%' => '[+-]?\.?\d+\.?\d*(?:[Ee][+-]?\d+)?', // floating point number
|
||||||
|
'%h%' => '[0-9a-fA-F]+',// one or more HEX digits
|
||||||
|
'%ns%'=> '(?:[_0-9a-zA-Z\\\\]+\\\\|N)?',// PHP namespace
|
||||||
|
'%[^' => '[^', // reg-exp
|
||||||
|
'%[' => '[', // reg-exp
|
||||||
|
']%' => ']+', // reg-exp
|
||||||
|
|
||||||
|
'.' => '\.', '\\' => '\\\\', '+' => '\+', '*' => '\*', '?' => '\?', '[' => '\[', '^' => '\^', ']' => '\]', '$' => '\$', '(' => '\(', ')' => '\)', // preg quote
|
||||||
|
'{' => '\{', '}' => '\}', '=' => '\=', '!' => '\!', '>' => '\>', '<' => '\<', '|' => '\|', ':' => '\:', '-' => '\-', "\x00" => '\000', '#' => '\#', // preg quote
|
||||||
|
));
|
||||||
|
|
||||||
|
return (bool) preg_match("#^$right$#s", $left);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Normalizes whitespace
|
||||||
|
* @param string
|
||||||
|
* @param bool
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public static function normalize($s, $keepTrailingSpaces)
|
||||||
|
{
|
||||||
|
$s = str_replace("\n", PHP_EOL, str_replace("\r\n", "\n", $s)); // normalize EOL
|
||||||
|
if (!$keepTrailingSpaces) {
|
||||||
|
$s = preg_replace("#[\t ]+(\r?\n)#", '$1', $s); // multiline right trim
|
||||||
|
$s = rtrim($s); // ending trim
|
||||||
|
}
|
||||||
|
return $s;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Single test exception.
|
||||||
|
*
|
||||||
|
* @author David Grudl
|
||||||
|
* @package Nette\Test
|
||||||
|
*/
|
||||||
|
class TestCaseException extends Exception
|
||||||
|
{
|
||||||
|
const SKIPPED = 1;
|
||||||
|
|
||||||
|
}
|
312
tests/NetteTest/TestHelpers.php
Normal file
312
tests/NetteTest/TestHelpers.php
Normal file
@@ -0,0 +1,312 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Nette Framework
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) 2004 David Grudl
|
||||||
|
* @license http://nette.org/license Nette license
|
||||||
|
* @link http://nette.org
|
||||||
|
* @category Nette
|
||||||
|
* @package Nette\Test
|
||||||
|
*/
|
||||||
|
|
||||||
|
require dirname(__FILE__) . '/TestCase.php';
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test helpers.
|
||||||
|
*
|
||||||
|
* @author David Grudl
|
||||||
|
* @package Nette\Test
|
||||||
|
*/
|
||||||
|
class TestHelpers
|
||||||
|
{
|
||||||
|
/** @var int */
|
||||||
|
static public $maxDepth = 5;
|
||||||
|
|
||||||
|
/** @var array */
|
||||||
|
private static $sections;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configures PHP and environment.
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public static function startup()
|
||||||
|
{
|
||||||
|
error_reporting(E_ALL | E_STRICT);
|
||||||
|
ini_set('display_errors', TRUE);
|
||||||
|
ini_set('html_errors', FALSE);
|
||||||
|
ini_set('log_errors', FALSE);
|
||||||
|
|
||||||
|
|
||||||
|
$_SERVER = array_intersect_key($_SERVER, array_flip(array('PHP_SELF', 'SCRIPT_NAME', 'SERVER_ADDR', 'SERVER_SOFTWARE', 'HTTP_HOST', 'DOCUMENT_ROOT', 'OS')));
|
||||||
|
$_SERVER['REQUEST_TIME'] = 1234567890;
|
||||||
|
$_ENV = array();
|
||||||
|
|
||||||
|
if (PHP_SAPI !== 'cli') {
|
||||||
|
header('Content-Type: text/plain; charset=utf-8');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (extension_loaded('xdebug')) {
|
||||||
|
xdebug_disable();
|
||||||
|
xdebug_start_code_coverage(XDEBUG_CC_UNUSED | XDEBUG_CC_DEAD_CODE);
|
||||||
|
register_shutdown_function(array(__CLASS__, 'prepareSaveCoverage'));
|
||||||
|
}
|
||||||
|
|
||||||
|
set_exception_handler(array(__CLASS__, 'exceptionHandler'));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Purges directory.
|
||||||
|
* @param string
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public static function purge($dir)
|
||||||
|
{
|
||||||
|
@mkdir($dir); // @ - directory may already exist
|
||||||
|
foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir), RecursiveIteratorIterator::CHILD_FIRST) as $entry) {
|
||||||
|
if ($entry->getBasename() === '.gitignore') {
|
||||||
|
// ignore
|
||||||
|
} elseif ($entry->isDir()) {
|
||||||
|
rmdir($entry);
|
||||||
|
} else {
|
||||||
|
unlink($entry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns current test section.
|
||||||
|
* @param string
|
||||||
|
* @param string
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public static function getSection($file, $section)
|
||||||
|
{
|
||||||
|
if (!isset(self::$sections[$file])) {
|
||||||
|
self::$sections[$file] = TestCase::parseSections($file);
|
||||||
|
}
|
||||||
|
|
||||||
|
$lowerSection = strtolower($section);
|
||||||
|
if (!isset(self::$sections[$file][$lowerSection])) {
|
||||||
|
throw new Exception("Missing section '$section' in file '$file'.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (in_array($section, array('GET', 'POST', 'SERVER'), TRUE)) {
|
||||||
|
return TestCase::parseLines(self::$sections[$file][$lowerSection], '=');
|
||||||
|
} else {
|
||||||
|
return self::$sections[$file][$lowerSection];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes new message.
|
||||||
|
* @param string
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public static function note($message = NULL)
|
||||||
|
{
|
||||||
|
echo $message ? "$message\n\n" : "===\n\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dumps information about a variable in readable format.
|
||||||
|
* @param mixed variable to dump
|
||||||
|
* @param string
|
||||||
|
* @return mixed variable itself or dump
|
||||||
|
*/
|
||||||
|
public static function dump($var, $message = NULL)
|
||||||
|
{
|
||||||
|
if ($message) {
|
||||||
|
echo $message . (preg_match('#[.:?]$#', $message) ? ' ' : ': ');
|
||||||
|
}
|
||||||
|
|
||||||
|
self::_dump($var, 0);
|
||||||
|
echo "\n";
|
||||||
|
return $var;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private static function _dump(& $var, $level = 0)
|
||||||
|
{
|
||||||
|
static $tableUtf, $tableBin, $reBinary = '#[^\x09\x0A\x0D\x20-\x7E\xA0-\x{10FFFF}]#u';
|
||||||
|
if ($tableUtf === NULL) {
|
||||||
|
foreach (range("\x00", "\xFF") as $ch) {
|
||||||
|
if (ord($ch) < 32 && strpos("\r\n\t", $ch) === FALSE) $tableUtf[$ch] = $tableBin[$ch] = '\\x' . str_pad(dechex(ord($ch)), 2, '0', STR_PAD_LEFT);
|
||||||
|
elseif (ord($ch) < 127) $tableUtf[$ch] = $tableBin[$ch] = $ch;
|
||||||
|
else { $tableUtf[$ch] = $ch; $tableBin[$ch] = '\\x' . dechex(ord($ch)); }
|
||||||
|
}
|
||||||
|
$tableBin["\\"] = '\\\\';
|
||||||
|
$tableBin["\r"] = '\\r';
|
||||||
|
$tableBin["\n"] = '\\n';
|
||||||
|
$tableBin["\t"] = '\\t';
|
||||||
|
$tableUtf['\\x'] = $tableBin['\\x'] = '\\\\x';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_bool($var)) {
|
||||||
|
echo ($var ? 'TRUE' : 'FALSE') . "\n";
|
||||||
|
|
||||||
|
} elseif ($var === NULL) {
|
||||||
|
echo "NULL\n";
|
||||||
|
|
||||||
|
} elseif (is_int($var)) {
|
||||||
|
echo "$var\n";
|
||||||
|
|
||||||
|
} elseif (is_float($var)) {
|
||||||
|
$var = (string) $var;
|
||||||
|
if (strpos($var, '.') === FALSE) $var .= '.0';
|
||||||
|
echo "$var\n";
|
||||||
|
|
||||||
|
} elseif (is_string($var)) {
|
||||||
|
$s = strtr($var, preg_match($reBinary, $var) || preg_last_error() ? $tableBin : $tableUtf);
|
||||||
|
echo "\"$s\"\n";
|
||||||
|
|
||||||
|
} elseif (is_array($var)) {
|
||||||
|
echo "array(";
|
||||||
|
$space = str_repeat("\t", $level);
|
||||||
|
|
||||||
|
static $marker;
|
||||||
|
if ($marker === NULL) $marker = uniqid("\x00", TRUE);
|
||||||
|
if (empty($var)) {
|
||||||
|
|
||||||
|
} elseif (isset($var[$marker])) {
|
||||||
|
echo " *RECURSION* ";
|
||||||
|
|
||||||
|
} elseif ($level < self::$maxDepth) {
|
||||||
|
echo "\n";
|
||||||
|
$vector = range(0, count($var) - 1) === array_keys($var);
|
||||||
|
$var[$marker] = 0;
|
||||||
|
foreach ($var as $k => &$v) {
|
||||||
|
if ($k === $marker) continue;
|
||||||
|
if ($vector) {
|
||||||
|
echo "$space\t";
|
||||||
|
} else {
|
||||||
|
$k = is_int($k) ? $k : '"' . strtr($k, preg_match($reBinary, $k) || preg_last_error() ? $tableBin : $tableUtf) . '"';
|
||||||
|
echo "$space\t$k => ";
|
||||||
|
}
|
||||||
|
self::_dump($v, $level + 1);
|
||||||
|
}
|
||||||
|
unset($var[$marker]);
|
||||||
|
echo "$space";
|
||||||
|
|
||||||
|
} else {
|
||||||
|
echo " ... ";
|
||||||
|
}
|
||||||
|
echo ")\n";
|
||||||
|
|
||||||
|
} elseif ($var instanceof Exception) {
|
||||||
|
echo 'Exception ', get_class($var), ': ', ($var->getCode() ? '#' . $var->getCode() . ' ' : '') . $var->getMessage(), "\n";
|
||||||
|
|
||||||
|
} elseif (is_object($var)) {
|
||||||
|
$arr = (array) $var;
|
||||||
|
echo get_class($var) . "(";
|
||||||
|
$space = str_repeat("\t", $level);
|
||||||
|
|
||||||
|
static $list = array();
|
||||||
|
if (empty($arr)) {
|
||||||
|
|
||||||
|
} elseif (in_array($var, $list, TRUE)) {
|
||||||
|
echo " *RECURSION* ";
|
||||||
|
|
||||||
|
} elseif ($level < self::$maxDepth) {
|
||||||
|
echo "\n";
|
||||||
|
$list[] = $var;
|
||||||
|
foreach ($arr as $k => &$v) {
|
||||||
|
$m = '';
|
||||||
|
if ($k[0] === "\x00") {
|
||||||
|
$m = $k[1] === '*' ? ' protected' : ' private';
|
||||||
|
$k = substr($k, strrpos($k, "\x00") + 1);
|
||||||
|
}
|
||||||
|
$k = strtr($k, preg_match($reBinary, $k) || preg_last_error() ? $tableBin : $tableUtf);
|
||||||
|
echo "$space\t\"$k\"$m => ";
|
||||||
|
echo self::_dump($v, $level + 1);
|
||||||
|
}
|
||||||
|
array_pop($list);
|
||||||
|
echo "$space";
|
||||||
|
|
||||||
|
} else {
|
||||||
|
echo " ... ";
|
||||||
|
}
|
||||||
|
echo ")\n";
|
||||||
|
|
||||||
|
} elseif (is_resource($var)) {
|
||||||
|
echo get_resource_type($var) . " resource\n";
|
||||||
|
|
||||||
|
} else {
|
||||||
|
echo "unknown type\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Custom exception handler.
|
||||||
|
* @param Exception
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public static function exceptionHandler(Exception $exception)
|
||||||
|
{
|
||||||
|
echo 'Error: Uncaught ';
|
||||||
|
echo $exception;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Coverage saving helper.
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public static function prepareSaveCoverage()
|
||||||
|
{
|
||||||
|
register_shutdown_function(array(__CLASS__, 'saveCoverage'));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Saves information about code coverage.
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public static function saveCoverage()
|
||||||
|
{
|
||||||
|
$file = dirname(__FILE__) . '/coverage.tmp';
|
||||||
|
$coverage = @unserialize(file_get_contents($file));
|
||||||
|
$root = realpath(dirname(__FILE__) . '/../../Nette') . DIRECTORY_SEPARATOR;
|
||||||
|
|
||||||
|
foreach (xdebug_get_code_coverage() as $filename => $lines) {
|
||||||
|
if (strncmp($root, $filename, strlen($root))) continue;
|
||||||
|
|
||||||
|
foreach ($lines as $num => $val) {
|
||||||
|
if (empty($coverage[$filename][$num]) || $val > 0) {
|
||||||
|
$coverage[$filename][$num] = $val; // -1 => untested; -2 => dead code
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
file_put_contents($file, serialize($coverage));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Skips this test.
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public static function skip($message = 'No message.')
|
||||||
|
{
|
||||||
|
header('X-Nette-Test-Skip: '. $message);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
230
tests/NetteTest/TestRunner.php
Normal file
230
tests/NetteTest/TestRunner.php
Normal file
@@ -0,0 +1,230 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Nette Framework
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) 2004 David Grudl
|
||||||
|
* @license http://nette.org/license Nette license
|
||||||
|
* @link http://nette.org
|
||||||
|
* @category Nette
|
||||||
|
* @package Nette\Test
|
||||||
|
*/
|
||||||
|
|
||||||
|
require dirname(__FILE__) . '/TestCase.php';
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test runner.
|
||||||
|
*
|
||||||
|
* @author David Grudl
|
||||||
|
* @package Nette\Test
|
||||||
|
*/
|
||||||
|
class TestRunner
|
||||||
|
{
|
||||||
|
const OUTPUT = 'output';
|
||||||
|
const EXPECTED = 'expect';
|
||||||
|
const HEADERS = 'headers';
|
||||||
|
|
||||||
|
/** @var string path to test file/directory */
|
||||||
|
public $path;
|
||||||
|
|
||||||
|
/** @var string php-cgi binary */
|
||||||
|
public $phpBinary;
|
||||||
|
|
||||||
|
/** @var string php-cgi command-line arguments */
|
||||||
|
public $phpArgs;
|
||||||
|
|
||||||
|
/** @var string php-cgi environment variables */
|
||||||
|
public $phpEnvironment;
|
||||||
|
|
||||||
|
/** @var bool display skipped tests information? */
|
||||||
|
public $displaySkipped = FALSE;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Runs all tests.
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function run()
|
||||||
|
{
|
||||||
|
$count = 0;
|
||||||
|
$failed = $passed = $skipped = array();
|
||||||
|
|
||||||
|
if (is_file($this->path)) {
|
||||||
|
$files = array($this->path);
|
||||||
|
} else {
|
||||||
|
$files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($this->path));
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($files as $entry) {
|
||||||
|
$entry = (string) $entry;
|
||||||
|
$info = pathinfo($entry);
|
||||||
|
if (!isset($info['extension']) || $info['extension'] !== 'phpt') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$count++;
|
||||||
|
$testCase = new TestCase($entry);
|
||||||
|
$testCase->setPhp($this->phpBinary, $this->phpArgs, $this->phpEnvironment);
|
||||||
|
|
||||||
|
try {
|
||||||
|
$testCase->run();
|
||||||
|
echo '.';
|
||||||
|
$passed[] = array($testCase->getName(), $entry);
|
||||||
|
|
||||||
|
} catch (TestCaseException $e) {
|
||||||
|
if ($e->getCode() === TestCaseException::SKIPPED) {
|
||||||
|
echo 's';
|
||||||
|
$skipped[] = array($testCase->getName(), $entry, $e->getMessage());
|
||||||
|
|
||||||
|
} else {
|
||||||
|
echo 'F';
|
||||||
|
$failed[] = array($testCase->getName(), $entry, $e->getMessage());
|
||||||
|
|
||||||
|
$this->log($entry, $testCase->getOutput(), self::OUTPUT);
|
||||||
|
$this->log($entry, $testCase->getExpectedOutput(), self::EXPECTED);
|
||||||
|
|
||||||
|
if ($testCase->getExpectedHeaders() !== NULL) {
|
||||||
|
$this->log($entry, $testCase->getHeaders(), self::OUTPUT, self::HEADERS);
|
||||||
|
$this->log($entry, $testCase->getExpectedHeaders(), self::EXPECTED, self::HEADERS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$failedCount = count($failed);
|
||||||
|
$skippedCount = count($skipped);
|
||||||
|
|
||||||
|
if ($this->displaySkipped && $skippedCount) {
|
||||||
|
echo "\n\nSkipped:\n";
|
||||||
|
foreach ($skipped as $i => $item) {
|
||||||
|
list($name, $file, $message) = $item;
|
||||||
|
echo "\n", ($i + 1), ") $name\n $message\n $file\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$count) {
|
||||||
|
echo "No tests found\n";
|
||||||
|
|
||||||
|
} elseif ($failedCount) {
|
||||||
|
echo "\n\nFailures:\n";
|
||||||
|
foreach ($failed as $i => $item) {
|
||||||
|
list($name, $file, $message) = $item;
|
||||||
|
echo "\n", ($i + 1), ") $name\n $message\n $file\n";
|
||||||
|
}
|
||||||
|
echo "\nFAILURES! ($count tests, $failedCount failures, $skippedCount skipped)\n";
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
echo "\n\nOK ($count tests, $skippedCount skipped)\n";
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns output file for logging.
|
||||||
|
* @param string
|
||||||
|
* @param string
|
||||||
|
* @param string
|
||||||
|
* @param string
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function log($testFile, $content, $type, $section = '')
|
||||||
|
{
|
||||||
|
$file = dirname($testFile) . '/' . $type . '/' . basename($testFile, '.phpt') . ($section ? ".$section" : '') . '.raw';
|
||||||
|
@mkdir(dirname($file)); // @ - directory may already exist
|
||||||
|
file_put_contents($file, $content);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses configuration file.
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function parseConfigFile()
|
||||||
|
{
|
||||||
|
$configFile = dirname(__FILE__) . '/config.ini';
|
||||||
|
if (file_exists($configFile)) {
|
||||||
|
$this->config = parse_ini_file($configFile, TRUE);
|
||||||
|
if ($this->config === FALSE) {
|
||||||
|
throw new Exception('Config file parsing failed.');
|
||||||
|
}
|
||||||
|
foreach ($this->config as & $environment) {
|
||||||
|
$environment += array(
|
||||||
|
'binary' => 'php-cgi',
|
||||||
|
'args' => '',
|
||||||
|
'environment' => '',
|
||||||
|
);
|
||||||
|
// shorthand options
|
||||||
|
if (isset($environment['php.ini'])) {
|
||||||
|
$environment['args'] .= ' -c '. escapeshellarg($environment['php.ini']);
|
||||||
|
}
|
||||||
|
if (isset($environment['libraries'])) {
|
||||||
|
$environment['environment'] .= 'LD_LIBRARY_PATH='. escapeshellarg($environment['libraries']) .' ';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses command line arguments.
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function parseArguments()
|
||||||
|
{
|
||||||
|
$this->phpBinary = 'php-cgi';
|
||||||
|
$this->phpArgs = '';
|
||||||
|
$this->phpEnvironment = '';
|
||||||
|
$this->path = getcwd(); // current directory
|
||||||
|
|
||||||
|
$args = new ArrayIterator(array_slice(isset($_SERVER['argv']) ? $_SERVER['argv'] : array(), 1));
|
||||||
|
foreach ($args as $arg) {
|
||||||
|
if (!preg_match('#^[-/][a-z]$#', $arg)) {
|
||||||
|
if ($path = realpath($arg)) {
|
||||||
|
$this->path = $path;
|
||||||
|
} else {
|
||||||
|
throw new Exception("Invalid path '$arg'.");
|
||||||
|
}
|
||||||
|
|
||||||
|
} else switch ($arg[1]) {
|
||||||
|
case 'p':
|
||||||
|
$args->next();
|
||||||
|
$this->phpBinary = $args->current();
|
||||||
|
break;
|
||||||
|
case 'c':
|
||||||
|
case 'd':
|
||||||
|
$args->next();
|
||||||
|
$this->phpArgs .= " -$arg[1] " . escapeshellarg($args->current());
|
||||||
|
break;
|
||||||
|
case 'l':
|
||||||
|
$args->next();
|
||||||
|
$this->phpEnvironment .= 'LD_LIBRARY_PATH='. escapeshellarg($args->current()) . ' ';
|
||||||
|
break;
|
||||||
|
case 'e':
|
||||||
|
$args->next();
|
||||||
|
$name = $args->current();
|
||||||
|
if (!isset($this->config[$name])) {
|
||||||
|
throw new Exception("Unknown environment name '$name'.");
|
||||||
|
}
|
||||||
|
$this->phpBinary = $this->config[$name]['binary'];
|
||||||
|
$this->phpArgs = $this->config[$name]['args'];
|
||||||
|
$this->phpEnvironment = $this->config[$name]['environment'];
|
||||||
|
break;
|
||||||
|
case 's':
|
||||||
|
$this->displaySkipped = TRUE;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new Exception("Unknown option -$arg[1].");
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -1,18 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Test initialization and helpers.
|
|
||||||
*
|
|
||||||
* @author David Grudl
|
|
||||||
* @package Nette\Test
|
|
||||||
*/
|
|
||||||
|
|
||||||
require dirname(__FILE__) . '/../vendor/nette/tester/Tester/bootstrap.php';
|
|
||||||
require dirname(__FILE__) . '/../dibi/dibi.php';
|
|
||||||
|
|
||||||
date_default_timezone_set('Europe/Prague');
|
|
||||||
class_alias('Tester\Assert', 'Assert');
|
|
||||||
|
|
||||||
// load connections
|
|
||||||
define('DIR', dirname(__FILE__));
|
|
||||||
$config = parse_ini_file(dirname(__FILE__) . '/config.ini', TRUE);
|
|
26
tests/initialize.php
Normal file
26
tests/initialize.php
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test initialization and helpers.
|
||||||
|
*
|
||||||
|
* @author David Grudl
|
||||||
|
* @package Nette\Test
|
||||||
|
*/
|
||||||
|
|
||||||
|
require dirname(__FILE__) . '/NetteTest/TestHelpers.php';
|
||||||
|
require dirname(__FILE__) . '/NetteTest/Assert.php';
|
||||||
|
require dirname(__FILE__) . '/../dibi/dibi.php';
|
||||||
|
|
||||||
|
date_default_timezone_set('Europe/Prague');
|
||||||
|
|
||||||
|
TestHelpers::startup();
|
||||||
|
|
||||||
|
if (function_exists('class_alias')) {
|
||||||
|
class_alias('TestHelpers', 'T');
|
||||||
|
} else {
|
||||||
|
class T extends TestHelpers {}
|
||||||
|
}
|
||||||
|
|
||||||
|
// load connections
|
||||||
|
define('DIR', dirname(__FILE__));
|
||||||
|
$config = parse_ini_file('config.ini', TRUE);
|
@@ -1 +1 @@
|
|||||||
Dibi 2.1.1 (revision $WCREV$ released on $WCDATE$)
|
Dibi 2.0.3 (revision $WCREV$ released on $WCDATE$)
|
||||||
|
Reference in New Issue
Block a user