mirror of
https://github.com/dg/dibi.git
synced 2025-08-30 17:29:53 +02:00
Compare commits
53 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
da9c42d540 | ||
|
e8559898f1 | ||
|
ece85e8b48 | ||
|
acd5ac8616 | ||
|
44876973f5 | ||
|
0e5d951dfb | ||
|
126422ad7e | ||
|
277f52c928 | ||
|
80ac569621 | ||
|
d9628f933d | ||
|
f7009f3e0c | ||
|
36d30c1fcf | ||
|
ae6c8756b6 | ||
|
6b2c996b16 | ||
|
718c617764 | ||
|
6194152e67 | ||
|
d39603e23d | ||
|
22e6ea4e40 | ||
|
f0d2c3f414 | ||
|
873ed3115d | ||
|
73289d0569 | ||
|
7b899ddda5 | ||
|
8860268791 | ||
|
551b576271 | ||
|
74d0a78ec2 | ||
|
be7c3f095d | ||
|
3a6dc07da8 | ||
|
9b070bb737 | ||
|
917971992f | ||
|
bc564555f8 | ||
|
3e20a6b8fc | ||
|
c019e7cac2 | ||
|
2294c195f4 | ||
|
25246529f7 | ||
|
d405ec369b | ||
|
b7974fe192 | ||
|
80f1898e1b | ||
|
8e8e6dfdca | ||
|
6510fcce25 | ||
|
b7d84b90ef | ||
|
2571e54f3c | ||
|
15e6d9f738 | ||
|
ddfd4a0f1a | ||
|
4e838fc2b5 | ||
|
37487816db | ||
|
0c099bb2bc | ||
|
1786c861b9 | ||
|
bc0578928f | ||
|
12a07ff6ad | ||
|
b50f59c64c | ||
|
fdebf349f5 | ||
|
954c2f25d0 | ||
|
43dccb1ba2 |
2
.gitattributes
vendored
2
.gitattributes
vendored
@@ -1,4 +1,6 @@
|
||||
.gitattributes export-ignore
|
||||
.gitignore export-ignore
|
||||
.github export-ignore
|
||||
.travis.yml export-ignore
|
||||
appveyor.yml export-ignore
|
||||
tests/ export-ignore
|
||||
|
16
.github/issue_template.md
vendored
Normal file
16
.github/issue_template.md
vendored
Normal file
@@ -0,0 +1,16 @@
|
||||
- bug report? yes/no
|
||||
- feature request? yes/no
|
||||
- version: ?.?.? <!-- exact release version, for bug reports -->
|
||||
|
||||
### Description
|
||||
...
|
||||
|
||||
### Steps To Reproduce
|
||||
... If possible a minimal demo of the problem ...
|
||||
|
||||
<!--
|
||||
REMEMBER, AN ISSUE IS NOT THE PLACE TO ASK QUESTIONS. We will be happy to help you on Gitter https://gitter.im/nette/nette
|
||||
|
||||
A good bug report shouldn't leave others needing to chase you up for more information. Please try to be as detailed as possible in your report.
|
||||
Feature requests are welcome. Explain your intentions. It's up to you to make a strong case to convince the project's developers of the merits of this feature.
|
||||
-->
|
11
.github/pull_request_template.md
vendored
Normal file
11
.github/pull_request_template.md
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
- bug fix? yes/no <!-- #issue numbers, if any -->
|
||||
- new feature? yes/no
|
||||
- BC break? yes/no
|
||||
|
||||
<!--
|
||||
Describe your changes here to communicate to the maintainers why we should accept this pull request.
|
||||
|
||||
Please add new tests to show the fix or feature works.
|
||||
|
||||
Thanks for contributing!
|
||||
-->
|
17
.travis.yml
17
.travis.yml
@@ -4,14 +4,10 @@ php:
|
||||
- 5.5
|
||||
- 5.6
|
||||
- 7.0
|
||||
- hhvm
|
||||
|
||||
matrix:
|
||||
allow_failures:
|
||||
- php: hhvm
|
||||
- 7.1
|
||||
|
||||
script:
|
||||
- vendor/bin/tester tests -s -p php -c tests/php-unix.ini
|
||||
- vendor/bin/tester tests -s -p php -c tests/php-unix.ini $COVERAGE
|
||||
- php temp/code-checker/src/code-checker.php --short-arrays
|
||||
|
||||
after_failure:
|
||||
@@ -22,6 +18,7 @@ before_script:
|
||||
# Install Nette Tester & Code Checker
|
||||
- travis_retry composer install --no-interaction
|
||||
- travis_retry composer create-project nette/code-checker temp/code-checker ~2.5 --no-interaction
|
||||
- if [ $TRAVIS_PHP_VERSION == "7.0" ]; then COVERAGE="-p phpdbg --coverage ./coverage.xml --coverage-src ./src"; fi
|
||||
|
||||
# Create databases.ini
|
||||
- cp ./tests/databases.travis.ini ./tests/databases.ini
|
||||
@@ -29,6 +26,14 @@ before_script:
|
||||
# Create Postgre database
|
||||
- psql -c 'CREATE DATABASE dibi_test' -U postgres
|
||||
|
||||
after_script:
|
||||
# Report Code Coverage
|
||||
- >
|
||||
if [ "$COVERAGE" != "" ]; then
|
||||
wget https://github.com/satooshi/php-coveralls/releases/download/v1.0.1/coveralls.phar
|
||||
&& php coveralls.phar --verbose --config tests/.coveralls.yml
|
||||
|| true; fi
|
||||
|
||||
sudo: false
|
||||
|
||||
cache:
|
||||
|
36
appveyor.yml
36
appveyor.yml
@@ -1,26 +1,27 @@
|
||||
build: off
|
||||
cache:
|
||||
- c:\php -> appveyor.yml
|
||||
- c:\php5 -> appveyor.yml
|
||||
- c:\php7 -> appveyor.yml
|
||||
- '%LOCALAPPDATA%\Composer\files -> appveyor.yml'
|
||||
|
||||
clone_folder: c:\projects\dibi
|
||||
|
||||
services:
|
||||
- mssql2012sp1
|
||||
- mssql2014
|
||||
# - mssql2014
|
||||
- mysql
|
||||
|
||||
init:
|
||||
- SET PATH=c:\php;%PATH%
|
||||
- SET PHP=1
|
||||
- SET PATH=c:\php5;%PATH%
|
||||
- SET ANSICON=121x90 (121x90)
|
||||
|
||||
install:
|
||||
# Install PHP
|
||||
- IF EXIST c:\php (SET PHP=0) ELSE (mkdir c:\php)
|
||||
- IF %PHP%==1 cd c:\php
|
||||
- IF %PHP%==1 appveyor DownloadFile http://windows.php.net/downloads/releases/archives/php-5.6.14-Win32-VC11-x86.zip
|
||||
- IF %PHP%==1 7z x php-5.6.14-Win32-VC11-x86.zip >nul
|
||||
# Install PHP 5
|
||||
- IF EXIST c:\php5 (SET PHP=0) ELSE (SET PHP=1)
|
||||
- IF %PHP%==1 mkdir c:\php5
|
||||
- IF %PHP%==1 cd c:\php5
|
||||
- IF %PHP%==1 curl https://windows.php.net/downloads/releases/archives/php-5.6.14-Win32-VC11-x86.zip --output php.zip
|
||||
- IF %PHP%==1 7z x php.zip >nul
|
||||
- IF %PHP%==1 echo extension_dir=ext >> php.ini
|
||||
- IF %PHP%==1 echo extension=php_openssl.dll >> php.ini
|
||||
- IF %PHP%==1 appveyor DownloadFile https://files.nette.org/misc/php-sqlsrv.zip
|
||||
@@ -28,9 +29,21 @@ install:
|
||||
- IF %PHP%==1 copy SQLSRV\php_sqlsrv_56_ts.dll ext\php_sqlsrv_ts.dll
|
||||
- IF %PHP%==1 copy SQLSRV\php_pdo_sqlsrv_56_ts.dll ext\php_pdo_sqlsrv_ts.dll
|
||||
- IF %PHP%==1 del /Q *.zip
|
||||
- cd c:\projects\dibi
|
||||
|
||||
# Install PHP 7
|
||||
- IF EXIST c:\php7 (SET PHP=0) ELSE (SET PHP=1)
|
||||
- IF %PHP%==1 mkdir c:\php7
|
||||
- IF %PHP%==1 cd c:\php7
|
||||
- IF %PHP%==1 curl https://windows.php.net/downloads/releases/archives/php-7.0.3-Win32-VC14-x86.zip --output php.zip
|
||||
- IF %PHP%==1 7z x php.zip >nul
|
||||
- IF %PHP%==1 echo extension_dir=ext >> php.ini
|
||||
- IF %PHP%==1 appveyor DownloadFile https://files.nette.org/misc/php-sqlsrv.zip
|
||||
- IF %PHP%==1 7z x php-sqlsrv.zip >nul
|
||||
- IF %PHP%==1 copy SQLSRV\php_sqlsrv_7_ts.dll ext\php_sqlsrv_ts.dll
|
||||
- IF %PHP%==1 del /Q *.zip
|
||||
|
||||
# Install Nette Tester
|
||||
- cd c:\projects\dibi
|
||||
- appveyor DownloadFile https://getcomposer.org/composer.phar
|
||||
- php composer.phar install --prefer-dist --no-interaction --no-progress
|
||||
|
||||
@@ -38,7 +51,8 @@ install:
|
||||
- copy tests\databases.appveyor.ini tests\databases.ini
|
||||
|
||||
test_script:
|
||||
- vendor\bin\tester tests -s -p php -c tests\php-win.ini
|
||||
- vendor\bin\tester tests -s -p c:\php5\php -c tests\php5-win.ini
|
||||
- vendor\bin\tester tests -s -p c:\php7\php -c tests\php7-win.ini
|
||||
|
||||
on_failure:
|
||||
# Print *.actual content
|
||||
|
@@ -15,10 +15,10 @@
|
||||
},
|
||||
"require-dev": {
|
||||
"tracy/tracy": "~2.2",
|
||||
"nette/tester": "~1.3"
|
||||
"nette/tester": "~1.7"
|
||||
},
|
||||
"replace": {
|
||||
"dg/dibi": "self.version"
|
||||
"dg/dibi": "*"
|
||||
},
|
||||
"autoload": {
|
||||
"classmap": ["src/"],
|
||||
|
@@ -1,27 +1,31 @@
|
||||
How to contribute & use the issue tracker
|
||||
=========================================
|
||||
|
||||
The issue tracker is the preferred channel for bug reports, features requests
|
||||
and submitting pull requests, but please respect the following restrictions:
|
||||
Dibi welcomes your contributions. There are several ways to help out:
|
||||
|
||||
* Please **do not** use the issue tracker for personal support requests (use
|
||||
[dibi forum](https://forum.dibiphp.com) or [Stack Overflow](http://stackoverflow.com)).
|
||||
* Create an issue on GitHub, if you have found a bug
|
||||
* Write test cases for open bug issues
|
||||
* Write fixes for open bug/feature issues, preferably with test cases included
|
||||
* Contribute to the documentation
|
||||
|
||||
* Please **do not** derail or troll issues. Keep the discussion on topic and
|
||||
respect the opinions of others.
|
||||
Issues
|
||||
------
|
||||
|
||||
* Use the GitHub **issue search** — check if the issue has already been
|
||||
reported.
|
||||
Please **do not use the issue tracker to ask questions**. We will be happy to help you
|
||||
on [Dibi forum](https://forum.dibiphp.com).
|
||||
|
||||
A good **bug report** shouldn't leave others needing to chase you up for more
|
||||
A good bug report shouldn't leave others needing to chase you up for more
|
||||
information. Please try to be as detailed as possible in your report.
|
||||
|
||||
**Feature requests** are welcome. But take a moment to find out whether your idea
|
||||
fits with the scope and aims of the project. It's up to *you* to make a strong
|
||||
case to convince the project's developers of the merits of this feature.
|
||||
|
||||
We welcome **pull requests**. If you'd like to contribute, please take a moment
|
||||
to [read the guidelines](https://nette.org/en/contributing) in order to make
|
||||
the contribution process easy and effective for everyone involved.
|
||||
Contributing
|
||||
------------
|
||||
|
||||
Thanks!
|
||||
The best way to propose a feature is to discuss your ideas on [Dibi forum](https://forum.dibiphp.com) before implementing them.
|
||||
|
||||
Please do not fix whitespace, format code, or make a purely cosmetic patch.
|
||||
|
||||
Thanks! :heart:
|
||||
|
@@ -1,7 +1,3 @@
|
||||
<!DOCTYPE html><link rel="stylesheet" href="data/style.css">
|
||||
|
||||
<h1>Fetching Examples | dibi</h1>
|
||||
|
||||
<?php
|
||||
|
||||
if (@!include __DIR__ . '/../vendor/autoload.php') {
|
||||
@@ -10,6 +6,12 @@ if (@!include __DIR__ . '/../vendor/autoload.php') {
|
||||
|
||||
Tracy\Debugger::enable();
|
||||
|
||||
?>
|
||||
<!DOCTYPE html><link rel="stylesheet" href="data/style.css">
|
||||
|
||||
<h1>Fetching Examples | dibi</h1>
|
||||
|
||||
<?php
|
||||
|
||||
dibi::connect([
|
||||
'driver' => 'sqlite3',
|
||||
|
@@ -1,7 +1,3 @@
|
||||
<!DOCTYPE html><link rel="stylesheet" href="data/style.css">
|
||||
|
||||
<h1>Result Set Data Types | dibi</h1>
|
||||
|
||||
<?php
|
||||
|
||||
use Dibi\Type;
|
||||
@@ -14,6 +10,12 @@ Tracy\Debugger::enable();
|
||||
|
||||
date_default_timezone_set('Europe/Prague');
|
||||
|
||||
?>
|
||||
<!DOCTYPE html><link rel="stylesheet" href="data/style.css">
|
||||
|
||||
<h1>Result Set Data Types | dibi</h1>
|
||||
|
||||
<?php
|
||||
|
||||
dibi::connect([
|
||||
'driver' => 'sqlite3',
|
||||
|
@@ -1,9 +1,3 @@
|
||||
<!DOCTYPE html><link rel="stylesheet" href="data/style.css">
|
||||
|
||||
<h1>Tracy & SQL Exceptions | dibi</h1>
|
||||
|
||||
<p>Dibi can display and log exceptions via <a href="https://tracy.nette.org">Tracy</a>.</p>
|
||||
|
||||
<?php
|
||||
|
||||
if (@!include __DIR__ . '/../vendor/autoload.php') {
|
||||
@@ -31,3 +25,9 @@ $panel->register($connection);
|
||||
|
||||
// throws error because SQL is bad
|
||||
dibi::query('SELECT FROM customers WHERE customer_id < ?', 38);
|
||||
|
||||
?><!DOCTYPE html><link rel="stylesheet" href="data/style.css">
|
||||
|
||||
<h1>Tracy & SQL Exceptions | dibi</h1>
|
||||
|
||||
<p>Dibi can display and log exceptions via <a href="https://tracy.nette.org">Tracy</a>.</p>
|
||||
|
@@ -1,11 +1,3 @@
|
||||
<!DOCTYPE html><link rel="stylesheet" href="data/style.css">
|
||||
|
||||
<style> html { background: url(data/arrow.png) no-repeat bottom right; height: 100%; } </style>
|
||||
|
||||
<h1>Tracy | dibi</h1>
|
||||
|
||||
<p>Dibi can log queries and dump variables to the <a href="https://tracy.nette.org">Tracy</a>.</p>
|
||||
|
||||
<?php
|
||||
|
||||
if (@!include __DIR__ . '/../vendor/autoload.php') {
|
||||
@@ -36,3 +28,13 @@ dibi::query('SELECT 123');
|
||||
|
||||
// result set will be dumped
|
||||
Tracy\Debugger::barDump(dibi::fetchAll('SELECT * FROM customers WHERE customer_id < ?', 38), '[customers]');
|
||||
|
||||
|
||||
?>
|
||||
<!DOCTYPE html><link rel="stylesheet" href="data/style.css">
|
||||
|
||||
<style> html { background: url(data/arrow.png) no-repeat bottom right; height: 100%; } </style>
|
||||
|
||||
<h1>Tracy | dibi</h1>
|
||||
|
||||
<p>Dibi can log queries and dump variables to the <a href="https://tracy.nette.org">Tracy</a>.</p>
|
||||
|
@@ -1,7 +1,3 @@
|
||||
<!DOCTYPE html><link rel="stylesheet" href="data/style.css">
|
||||
|
||||
<h1>Using Extension Methods | dibi</h1>
|
||||
|
||||
<?php
|
||||
|
||||
if (@!include __DIR__ . '/../vendor/autoload.php') {
|
||||
@@ -10,6 +6,12 @@ if (@!include __DIR__ . '/../vendor/autoload.php') {
|
||||
|
||||
Tracy\Debugger::enable();
|
||||
|
||||
?>
|
||||
<!DOCTYPE html><link rel="stylesheet" href="data/style.css">
|
||||
|
||||
<h1>Using Extension Methods | dibi</h1>
|
||||
|
||||
<?php
|
||||
|
||||
dibi::connect([
|
||||
'driver' => 'sqlite3',
|
||||
|
@@ -63,7 +63,7 @@ class Panel implements Tracy\IBarPanel
|
||||
|
||||
/**
|
||||
* Returns blue-screen custom tab.
|
||||
* @return mixed
|
||||
* @return array|NULL
|
||||
*/
|
||||
public static function renderException($e)
|
||||
{
|
||||
@@ -78,7 +78,7 @@ class Panel implements Tracy\IBarPanel
|
||||
|
||||
/**
|
||||
* Returns HTML code for custom tab. (Tracy\IBarPanel)
|
||||
* @return mixed
|
||||
* @return string
|
||||
*/
|
||||
public function getTab()
|
||||
{
|
||||
@@ -88,35 +88,39 @@ class Panel implements Tracy\IBarPanel
|
||||
$totalTime += $event->time;
|
||||
}
|
||||
return '<span title="dibi"><svg viewBox="0 0 2048 2048" style="vertical-align: bottom; width:1.23em; height:1.55em"><path fill="' . ($count ? '#b079d6' : '#aaa') . '" d="M1024 896q237 0 443-43t325-127v170q0 69-103 128t-280 93.5-385 34.5-385-34.5-280-93.5-103-128v-170q119 84 325 127t443 43zm0 768q237 0 443-43t325-127v170q0 69-103 128t-280 93.5-385 34.5-385-34.5-280-93.5-103-128v-170q119 84 325 127t443 43zm0-384q237 0 443-43t325-127v170q0 69-103 128t-280 93.5-385 34.5-385-34.5-280-93.5-103-128v-170q119 84 325 127t443 43zm0-1152q208 0 385 34.5t280 93.5 103 128v128q0 69-103 128t-280 93.5-385 34.5-385-34.5-280-93.5-103-128v-128q0-69 103-128t280-93.5 385-34.5z"/></svg><span class="tracy-label">'
|
||||
. $count . ' queries'
|
||||
. ($totalTime ? sprintf(' / %0.1f ms', $totalTime * 1000) : '')
|
||||
. $count . ' queries'
|
||||
. ($totalTime ? ' / ' . number_format($totalTime * 1000, 1, '.', ' ') . ' ms' : '')
|
||||
. '</span></span>';
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns HTML code for custom panel. (Tracy\IBarPanel)
|
||||
* @return mixed
|
||||
* @return string|NULL
|
||||
*/
|
||||
public function getPanel()
|
||||
{
|
||||
if (!$this->events) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
$totalTime = $s = NULL;
|
||||
$h = 'htmlSpecialChars';
|
||||
foreach ($this->events as $event) {
|
||||
$totalTime += $event->time;
|
||||
$connection = $event->connection;
|
||||
$explain = NULL; // EXPLAIN is called here to work SELECT FOUND_ROWS()
|
||||
if ($this->explain && $event->type === Event::SELECT) {
|
||||
try {
|
||||
$backup = [$event->connection->onEvent, \dibi::$numOfQueries, \dibi::$totalTime];
|
||||
$event->connection->onEvent = NULL;
|
||||
$cmd = is_string($this->explain) ? $this->explain : ($event->connection->getConfig('driver') === 'oracle' ? 'EXPLAIN PLAN FOR' : 'EXPLAIN');
|
||||
$explain = Helpers::dump($event->connection->nativeQuery("$cmd $event->sql"), TRUE);
|
||||
$backup = [$connection->onEvent, \dibi::$numOfQueries, \dibi::$totalTime];
|
||||
$connection->onEvent = NULL;
|
||||
$cmd = is_string($this->explain) ? $this->explain : ($connection->getConfig('driver') === 'oracle' ? 'EXPLAIN PLAN FOR' : 'EXPLAIN');
|
||||
$explain = @Helpers::dump($connection->nativeQuery("$cmd $event->sql"), TRUE);
|
||||
} catch (Dibi\Exception $e) {
|
||||
}
|
||||
list($event->connection->onEvent, \dibi::$numOfQueries, \dibi::$totalTime) = $backup;
|
||||
list($connection->onEvent, \dibi::$numOfQueries, \dibi::$totalTime) = $backup;
|
||||
}
|
||||
|
||||
$s .= '<tr><td>' . sprintf('%0.3f', $event->time * 1000);
|
||||
$s .= '<tr><td>' . number_format($event->time * 1000, 3, '.', ' ');
|
||||
if ($explain) {
|
||||
static $counter;
|
||||
$counter++;
|
||||
@@ -131,17 +135,19 @@ class Panel implements Tracy\IBarPanel
|
||||
$s .= Tracy\Helpers::editorLink($event->source[0], $event->source[1]);//->class('tracy-DibiProfiler-source');
|
||||
}
|
||||
|
||||
$s .= "</td><td>{$event->count}</td><td>{$h($event->connection->getConfig('driver') . '/' . $event->connection->getConfig('name'))}</td></tr>";
|
||||
$s .= "</td><td>{$event->count}</td></tr>";
|
||||
}
|
||||
|
||||
return empty($this->events) ? '' :
|
||||
'<style> #tracy-debug td.tracy-DibiProfiler-sql { background: white !important }
|
||||
return '<style> #tracy-debug td.tracy-DibiProfiler-sql { background: white !important }
|
||||
#tracy-debug .tracy-DibiProfiler-source { color: #999 !important }
|
||||
#tracy-debug tracy-DibiProfiler tr table { margin: 8px 0; max-height: 150px; overflow:auto } </style>
|
||||
<h1>Queries: ' . count($this->events) . ($totalTime === NULL ? '' : sprintf(', time: %0.3f ms', $totalTime * 1000)) . '</h1>
|
||||
<h1>Queries: ' . count($this->events)
|
||||
. ($totalTime === NULL ? '' : ', time: ' . number_format($totalTime * 1000, 1, '.', ' ') . ' ms') . ', '
|
||||
. htmlSpecialChars($connection->getConfig('driver') . ($connection->getConfig('name') ? '/' . $connection->getConfig('name') : '')
|
||||
. ($connection->getConfig('host') ? ' @ ' . $connection->getConfig('host') : '')) . '</h1>
|
||||
<div class="tracy-inner tracy-DibiProfiler">
|
||||
<table>
|
||||
<tr><th>Time ms</th><th>SQL Statement</th><th>Rows</th><th>Connection</th></tr>' . $s . '
|
||||
<tr><th>Time ms</th><th>SQL Statement</th><th>Rows</th></tr>' . $s . '
|
||||
</table>
|
||||
</div>';
|
||||
}
|
||||
|
@@ -97,7 +97,7 @@ class Connection
|
||||
$this->config = $config;
|
||||
|
||||
// profiler
|
||||
$profilerCfg = & $config['profiler'];
|
||||
$profilerCfg = &$config['profiler'];
|
||||
if (is_scalar($profilerCfg)) {
|
||||
$profilerCfg = ['run' => (bool) $profilerCfg];
|
||||
}
|
||||
@@ -204,7 +204,7 @@ class Connection
|
||||
|
||||
|
||||
/** @deprecated */
|
||||
public static function alias(& $config, $key, $alias)
|
||||
public static function alias(&$config, $key, $alias)
|
||||
{
|
||||
trigger_error(__METHOD__ . '() is deprecated, use Helpers::alias().', E_USER_DEPRECATED);
|
||||
Helpers::alias($config, $key, $alias);
|
||||
@@ -225,7 +225,7 @@ class Connection
|
||||
/**
|
||||
* Generates (translates) and executes SQL query.
|
||||
* @param array|mixed one or more arguments
|
||||
* @return Result|int result set object (if any)
|
||||
* @return Result|int result set or number of affected rows
|
||||
* @throws Exception
|
||||
*/
|
||||
final public function query($args)
|
||||
@@ -289,7 +289,7 @@ class Connection
|
||||
* @param array
|
||||
* @return string
|
||||
*/
|
||||
private function translateArgs($args)
|
||||
protected function translateArgs($args)
|
||||
{
|
||||
$this->connected || $this->connect();
|
||||
if (!$this->translator) {
|
||||
@@ -303,7 +303,7 @@ class Connection
|
||||
/**
|
||||
* Executes the SQL query.
|
||||
* @param string SQL statement.
|
||||
* @return Result|int result set object (if any)
|
||||
* @return Result|int result set or number of affected rows
|
||||
* @throws Exception
|
||||
*/
|
||||
final public function nativeQuery($sql)
|
||||
@@ -473,7 +473,7 @@ class Connection
|
||||
|
||||
|
||||
/**
|
||||
* @param string column name
|
||||
* @param mixed column name
|
||||
* @return Fluent
|
||||
*/
|
||||
public function select($args)
|
||||
@@ -555,7 +555,7 @@ class Connection
|
||||
/**
|
||||
* Executes SQL query and fetch result - shortcut for query() & fetch().
|
||||
* @param array|mixed one or more arguments
|
||||
* @return Row
|
||||
* @return Row|FALSE
|
||||
* @throws Exception
|
||||
*/
|
||||
public function fetch($args)
|
||||
@@ -581,7 +581,7 @@ class Connection
|
||||
/**
|
||||
* Executes SQL query and fetch first column - shortcut for query() & fetchSingle().
|
||||
* @param array|mixed one or more arguments
|
||||
* @return string
|
||||
* @return mixed
|
||||
* @throws Exception
|
||||
*/
|
||||
public function fetchSingle($args)
|
||||
@@ -594,7 +594,7 @@ class Connection
|
||||
/**
|
||||
* Executes SQL query and fetch pairs - shortcut for query() & fetchPairs().
|
||||
* @param array|mixed one or more arguments
|
||||
* @return string
|
||||
* @return array
|
||||
* @throws Exception
|
||||
*/
|
||||
public function fetchPairs($args)
|
||||
|
@@ -40,10 +40,10 @@ class DataSource implements IDataSource
|
||||
/** @var array */
|
||||
private $conds = [];
|
||||
|
||||
/** @var int */
|
||||
/** @var int|NULL */
|
||||
private $offset;
|
||||
|
||||
/** @var int */
|
||||
/** @var int|NULL */
|
||||
private $limit;
|
||||
|
||||
|
||||
@@ -118,7 +118,7 @@ class DataSource implements IDataSource
|
||||
|
||||
/**
|
||||
* Limits number of rows.
|
||||
* @param int limit
|
||||
* @param int|NULL limit
|
||||
* @param int offset
|
||||
* @return self
|
||||
*/
|
||||
@@ -168,7 +168,7 @@ class DataSource implements IDataSource
|
||||
|
||||
/**
|
||||
* Generates, executes SQL query and fetches the single row.
|
||||
* @return Row|FALSE array on success, FALSE if no next record
|
||||
* @return Row|FALSE
|
||||
*/
|
||||
public function fetch()
|
||||
{
|
||||
|
@@ -15,6 +15,9 @@ class DateTime extends \DateTime
|
||||
{
|
||||
use Strict;
|
||||
|
||||
/**
|
||||
* @param string|int
|
||||
*/
|
||||
public function __construct($time = 'now', \DateTimeZone $timezone = NULL)
|
||||
{
|
||||
if (is_numeric($time)) {
|
||||
@@ -55,4 +58,18 @@ class DateTime extends \DateTime
|
||||
return $this->format('Y-m-d H:i:s');
|
||||
}
|
||||
|
||||
|
||||
public function __wakeup()
|
||||
{
|
||||
if (isset($this->fix, $this->fix[1])) {
|
||||
$this->__construct($this->fix[0], new \DateTimeZone($this->fix[1]));
|
||||
unset($this->fix);
|
||||
} elseif (isset($this->fix)) {
|
||||
$this->__construct($this->fix[0]);
|
||||
unset($this->fix);
|
||||
} else {
|
||||
parent::__wakeup();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -28,16 +28,16 @@ class FirebirdDriver implements Dibi\Driver, Dibi\ResultDriver, Dibi\Reflector
|
||||
|
||||
const ERROR_EXCEPTION_THROWN = -836;
|
||||
|
||||
/** @var resource Connection resource */
|
||||
/** @var resource|NULL */
|
||||
private $connection;
|
||||
|
||||
/** @var resource Resultset resource */
|
||||
/** @var resource|NULL */
|
||||
private $resultSet;
|
||||
|
||||
/** @var bool */
|
||||
private $autoFree = TRUE;
|
||||
|
||||
/** @var resource Resultset resource */
|
||||
/** @var resource|NULL */
|
||||
private $transaction;
|
||||
|
||||
/** @var bool */
|
||||
@@ -60,7 +60,7 @@ class FirebirdDriver implements Dibi\Driver, Dibi\ResultDriver, Dibi\Reflector
|
||||
* @return void
|
||||
* @throws Dibi\Exception
|
||||
*/
|
||||
public function connect(array & $config)
|
||||
public function connect(array &$config)
|
||||
{
|
||||
Dibi\Helpers::alias($config, 'database', 'db');
|
||||
|
||||
@@ -78,9 +78,9 @@ class FirebirdDriver implements Dibi\Driver, Dibi\ResultDriver, Dibi\Reflector
|
||||
];
|
||||
|
||||
if (empty($config['persistent'])) {
|
||||
$this->connection = ibase_connect($config['database'], $config['username'], $config['password'], $config['charset'], $config['buffers']); // intentionally @
|
||||
$this->connection = @ibase_connect($config['database'], $config['username'], $config['password'], $config['charset'], $config['buffers']); // intentionally @
|
||||
} else {
|
||||
$this->connection = ibase_pconnect($config['database'], $config['username'], $config['password'], $config['charset'], $config['buffers']); // intentionally @
|
||||
$this->connection = @ibase_pconnect($config['database'], $config['username'], $config['password'], $config['charset'], $config['buffers']); // intentionally @
|
||||
}
|
||||
|
||||
if (!is_resource($this->connection)) {
|
||||
@@ -96,7 +96,7 @@ class FirebirdDriver implements Dibi\Driver, Dibi\ResultDriver, Dibi\Reflector
|
||||
*/
|
||||
public function disconnect()
|
||||
{
|
||||
ibase_close($this->connection);
|
||||
@ibase_close($this->connection); // @ - connection can be already disconnected
|
||||
}
|
||||
|
||||
|
||||
@@ -123,6 +123,7 @@ class FirebirdDriver implements Dibi\Driver, Dibi\ResultDriver, Dibi\Reflector
|
||||
} elseif (is_resource($res)) {
|
||||
return $this->createResultDriver($res);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
@@ -215,7 +216,7 @@ class FirebirdDriver implements Dibi\Driver, Dibi\ResultDriver, Dibi\Reflector
|
||||
|
||||
/**
|
||||
* Returns the connection resource.
|
||||
* @return resource
|
||||
* @return resource|NULL
|
||||
*/
|
||||
public function getResource()
|
||||
{
|
||||
@@ -260,24 +261,40 @@ class FirebirdDriver implements Dibi\Driver, Dibi\ResultDriver, Dibi\Reflector
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
public function escapeBinary($value)
|
||||
{
|
||||
return "'" . str_replace("'", "''", $value) . "'";
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
public function escapeIdentifier($value)
|
||||
{
|
||||
return '"' . str_replace('"', '""', $value). '"';
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param bool
|
||||
* @return string
|
||||
*/
|
||||
public function escapeBool($value)
|
||||
{
|
||||
return $value ? 1 : 0;
|
||||
return $value ? '1' : '0';
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param \DateTime|\DateTimeInterface|string|int
|
||||
* @return string
|
||||
*/
|
||||
public function escapeDate($value)
|
||||
{
|
||||
if (!$value instanceof \DateTime && !$value instanceof \DateTimeInterface) {
|
||||
@@ -287,6 +304,10 @@ class FirebirdDriver implements Dibi\Driver, Dibi\ResultDriver, Dibi\Reflector
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param \DateTime|\DateTimeInterface|string|int
|
||||
* @return string
|
||||
*/
|
||||
public function escapeDateTime($value)
|
||||
{
|
||||
if (!$value instanceof \DateTime && !$value instanceof \DateTimeInterface) {
|
||||
@@ -329,13 +350,16 @@ class FirebirdDriver implements Dibi\Driver, Dibi\ResultDriver, Dibi\Reflector
|
||||
|
||||
/**
|
||||
* Injects LIMIT/OFFSET to the SQL query.
|
||||
* @param string
|
||||
* @param int|NULL
|
||||
* @param int|NULL
|
||||
* @return void
|
||||
*/
|
||||
public function applyLimit(& $sql, $limit, $offset)
|
||||
public function applyLimit(&$sql, $limit, $offset)
|
||||
{
|
||||
if ($limit >= 0 && $offset > 0) {
|
||||
// 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 . ')';
|
||||
if ($limit > 0 || $offset > 0) {
|
||||
// http://www.firebirdsql.org/refdocs/langrefupd20-select.html
|
||||
$sql = 'SELECT ' . ($limit > 0 ? 'FIRST ' . (int) $limit : '') . ($offset > 0 ? ' SKIP ' . (int) $offset : '') . ' * FROM (' . $sql . ')';
|
||||
}
|
||||
}
|
||||
|
||||
@@ -370,7 +394,7 @@ class FirebirdDriver implements Dibi\Driver, Dibi\ResultDriver, Dibi\Reflector
|
||||
*/
|
||||
public function fetch($assoc)
|
||||
{
|
||||
$result = $assoc ? ibase_fetch_assoc($this->resultSet, IBASE_TEXT) : ibase_fetch_row($this->resultSet, IBASE_TEXT); // intentionally @
|
||||
$result = $assoc ? @ibase_fetch_assoc($this->resultSet, IBASE_TEXT) : @ibase_fetch_row($this->resultSet, IBASE_TEXT); // intentionally @
|
||||
|
||||
if (ibase_errcode()) {
|
||||
if (ibase_errcode() == self::ERROR_EXCEPTION_THROWN) {
|
||||
@@ -378,7 +402,7 @@ class FirebirdDriver implements Dibi\Driver, Dibi\ResultDriver, Dibi\Reflector
|
||||
throw new Dibi\ProcedureException($match[3], $match[1], $match[2]);
|
||||
|
||||
} else {
|
||||
throw new Dibi\DriverException($msg, ibase_errcode());
|
||||
throw new Dibi\DriverException(ibase_errmsg(), ibase_errcode());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -411,7 +435,7 @@ class FirebirdDriver implements Dibi\Driver, Dibi\ResultDriver, Dibi\Reflector
|
||||
|
||||
/**
|
||||
* Returns the result set resource.
|
||||
* @return resource
|
||||
* @return resource|NULL
|
||||
*/
|
||||
public function getResultResource()
|
||||
{
|
||||
|
@@ -26,10 +26,10 @@ class MsSqlDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
{
|
||||
use Dibi\Strict;
|
||||
|
||||
/** @var resource Connection resource */
|
||||
/** @var resource|NULL */
|
||||
private $connection;
|
||||
|
||||
/** @var resource Resultset resource */
|
||||
/** @var resource|NULL */
|
||||
private $resultSet;
|
||||
|
||||
/** @var bool */
|
||||
@@ -52,7 +52,7 @@ class MsSqlDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
* @return void
|
||||
* @throws Dibi\Exception
|
||||
*/
|
||||
public function connect(array & $config)
|
||||
public function connect(array &$config)
|
||||
{
|
||||
if (isset($config['resource'])) {
|
||||
$this->connection = $config['resource'];
|
||||
@@ -78,7 +78,7 @@ class MsSqlDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
*/
|
||||
public function disconnect()
|
||||
{
|
||||
mssql_close($this->connection);
|
||||
@mssql_close($this->connection); // @ - connection can be already disconnected
|
||||
}
|
||||
|
||||
|
||||
@@ -98,6 +98,7 @@ class MsSqlDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
} elseif (is_resource($res)) {
|
||||
return $this->createResultDriver($res);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
@@ -164,7 +165,7 @@ class MsSqlDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
|
||||
/**
|
||||
* Returns the connection resource.
|
||||
* @return mixed
|
||||
* @return resource|NULL
|
||||
*/
|
||||
public function getResource()
|
||||
{
|
||||
@@ -200,7 +201,7 @@ class MsSqlDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
|
||||
/**
|
||||
* Encodes data for use in a SQL statement.
|
||||
* @param mixed value
|
||||
* @param string value
|
||||
* @return string encoded value
|
||||
*/
|
||||
public function escapeText($value)
|
||||
@@ -209,12 +210,20 @@ class MsSqlDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
public function escapeBinary($value)
|
||||
{
|
||||
return "'" . str_replace("'", "''", $value) . "'";
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
public function escapeIdentifier($value)
|
||||
{
|
||||
// @see https://msdn.microsoft.com/en-us/library/ms176027.aspx
|
||||
@@ -222,12 +231,20 @@ class MsSqlDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param bool
|
||||
* @return string
|
||||
*/
|
||||
public function escapeBool($value)
|
||||
{
|
||||
return $value ? 1 : 0;
|
||||
return $value ? '1' : '0';
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param \DateTime|\DateTimeInterface|string|int
|
||||
* @return string
|
||||
*/
|
||||
public function escapeDate($value)
|
||||
{
|
||||
if (!$value instanceof \DateTime && !$value instanceof \DateTimeInterface) {
|
||||
@@ -237,6 +254,10 @@ class MsSqlDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param \DateTime|\DateTimeInterface|string|int
|
||||
* @return string
|
||||
*/
|
||||
public function escapeDateTime($value)
|
||||
{
|
||||
if (!$value instanceof \DateTime && !$value instanceof \DateTimeInterface) {
|
||||
@@ -280,9 +301,12 @@ class MsSqlDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
|
||||
/**
|
||||
* Injects LIMIT/OFFSET to the SQL query.
|
||||
* @param string
|
||||
* @param int|NULL
|
||||
* @param int|NULL
|
||||
* @return void
|
||||
*/
|
||||
public function applyLimit(& $sql, $limit, $offset)
|
||||
public function applyLimit(&$sql, $limit, $offset)
|
||||
{
|
||||
if ($offset) {
|
||||
throw new Dibi\NotSupportedException('Offset is not supported by this database.');
|
||||
@@ -375,7 +399,7 @@ class MsSqlDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
|
||||
/**
|
||||
* Returns the result set resource.
|
||||
* @return mixed
|
||||
* @return resource|NULL
|
||||
*/
|
||||
public function getResultResource()
|
||||
{
|
||||
|
@@ -36,10 +36,10 @@ class MySqlDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
const ERROR_DUPLICATE_ENTRY = 1062;
|
||||
const ERROR_DATA_TRUNCATED = 1265;
|
||||
|
||||
/** @var resource Connection resource */
|
||||
/** @var resource|NULL */
|
||||
private $connection;
|
||||
|
||||
/** @var resource Resultset resource */
|
||||
/** @var resource|NULL */
|
||||
private $resultSet;
|
||||
|
||||
/** @var bool */
|
||||
@@ -65,7 +65,7 @@ class MySqlDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
* @return void
|
||||
* @throws Dibi\Exception
|
||||
*/
|
||||
public function connect(array & $config)
|
||||
public function connect(array &$config)
|
||||
{
|
||||
if (isset($config['resource'])) {
|
||||
$this->connection = $config['resource'];
|
||||
@@ -139,7 +139,7 @@ class MySqlDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
*/
|
||||
public function disconnect()
|
||||
{
|
||||
mysql_close($this->connection);
|
||||
@mysql_close($this->connection); // @ - connection can be already disconnected
|
||||
}
|
||||
|
||||
|
||||
@@ -243,7 +243,7 @@ class MySqlDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
|
||||
/**
|
||||
* Returns the connection resource.
|
||||
* @return mixed
|
||||
* @return resource|NULL
|
||||
*/
|
||||
public function getResource()
|
||||
{
|
||||
@@ -279,7 +279,7 @@ class MySqlDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
|
||||
/**
|
||||
* Encodes data for use in a SQL statement.
|
||||
* @param mixed value
|
||||
* @param string value
|
||||
* @return string encoded value
|
||||
*/
|
||||
public function escapeText($value)
|
||||
@@ -291,6 +291,10 @@ class MySqlDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
public function escapeBinary($value)
|
||||
{
|
||||
if (!is_resource($this->connection)) {
|
||||
@@ -300,6 +304,10 @@ class MySqlDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
public function escapeIdentifier($value)
|
||||
{
|
||||
// @see http://dev.mysql.com/doc/refman/5.0/en/identifiers.html
|
||||
@@ -307,12 +315,20 @@ class MySqlDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param bool
|
||||
* @return string
|
||||
*/
|
||||
public function escapeBool($value)
|
||||
{
|
||||
return $value ? 1 : 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param \DateTime|\DateTimeInterface|string|int
|
||||
* @return string
|
||||
*/
|
||||
public function escapeDate($value)
|
||||
{
|
||||
if (!$value instanceof \DateTime && !$value instanceof \DateTimeInterface) {
|
||||
@@ -322,6 +338,10 @@ class MySqlDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param \DateTime|\DateTimeInterface|string|int
|
||||
* @return string
|
||||
*/
|
||||
public function escapeDateTime($value)
|
||||
{
|
||||
if (!$value instanceof \DateTime && !$value instanceof \DateTimeInterface) {
|
||||
@@ -365,9 +385,12 @@ class MySqlDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
|
||||
/**
|
||||
* Injects LIMIT/OFFSET to the SQL query.
|
||||
* @param string
|
||||
* @param int|NULL
|
||||
* @param int|NULL
|
||||
* @return void
|
||||
*/
|
||||
public function applyLimit(& $sql, $limit, $offset)
|
||||
public function applyLimit(&$sql, $limit, $offset)
|
||||
{
|
||||
if ($limit < 0 || $offset < 0) {
|
||||
throw new Dibi\NotSupportedException('Negative offset or limit.');
|
||||
@@ -469,7 +492,7 @@ class MySqlDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
|
||||
/**
|
||||
* Returns the result set resource.
|
||||
* @return mixed
|
||||
* @return resource|NULL
|
||||
*/
|
||||
public function getResultResource()
|
||||
{
|
||||
|
@@ -37,10 +37,10 @@ class MySqliDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
const ERROR_DUPLICATE_ENTRY = 1062;
|
||||
const ERROR_DATA_TRUNCATED = 1265;
|
||||
|
||||
/** @var mysqli Connection resource */
|
||||
/** @var \mysqli|NULL */
|
||||
private $connection;
|
||||
|
||||
/** @var mysqli_result Resultset resource */
|
||||
/** @var \mysqli_result|NULL */
|
||||
private $resultSet;
|
||||
|
||||
/** @var bool */
|
||||
@@ -66,7 +66,7 @@ class MySqliDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
* @return void
|
||||
* @throws Dibi\Exception
|
||||
*/
|
||||
public function connect(array & $config)
|
||||
public function connect(array &$config)
|
||||
{
|
||||
mysqli_report(MYSQLI_REPORT_OFF);
|
||||
if (isset($config['resource'])) {
|
||||
@@ -93,8 +93,8 @@ class MySqliDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
}
|
||||
}
|
||||
|
||||
$foo = & $config['flags'];
|
||||
$foo = & $config['database'];
|
||||
$foo = &$config['flags'];
|
||||
$foo = &$config['database'];
|
||||
|
||||
$this->connection = mysqli_init();
|
||||
if (isset($config['options'])) {
|
||||
@@ -138,7 +138,7 @@ class MySqliDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
*/
|
||||
public function disconnect()
|
||||
{
|
||||
mysqli_close($this->connection);
|
||||
@mysqli_close($this->connection); // @ - connection can be already disconnected
|
||||
}
|
||||
|
||||
|
||||
@@ -158,6 +158,7 @@ class MySqliDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
} elseif (is_object($res)) {
|
||||
return $this->createResultDriver($res);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
@@ -258,7 +259,7 @@ class MySqliDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
|
||||
/**
|
||||
* Returns the connection resource.
|
||||
* @return mysqli
|
||||
* @return \mysqli
|
||||
*/
|
||||
public function getResource()
|
||||
{
|
||||
@@ -278,7 +279,6 @@ class MySqliDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
|
||||
/**
|
||||
* Result set driver factory.
|
||||
* @param mysqli_result
|
||||
* @return Dibi\ResultDriver
|
||||
*/
|
||||
public function createResultDriver(\mysqli_result $resource)
|
||||
@@ -294,7 +294,7 @@ class MySqliDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
|
||||
/**
|
||||
* Encodes data for use in a SQL statement.
|
||||
* @param mixed value
|
||||
* @param string value
|
||||
* @return string encoded value
|
||||
*/
|
||||
public function escapeText($value)
|
||||
@@ -303,24 +303,40 @@ class MySqliDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
public function escapeBinary($value)
|
||||
{
|
||||
return "_binary'" . mysqli_real_escape_string($this->connection, $value) . "'";
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
public function escapeIdentifier($value)
|
||||
{
|
||||
return '`' . str_replace('`', '``', $value) . '`';
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param bool
|
||||
* @return string
|
||||
*/
|
||||
public function escapeBool($value)
|
||||
{
|
||||
return $value ? 1 : 0;
|
||||
return $value ? '1' : '0';
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param \DateTime|\DateTimeInterface|string|int
|
||||
* @return string
|
||||
*/
|
||||
public function escapeDate($value)
|
||||
{
|
||||
if (!$value instanceof \DateTime && !$value instanceof \DateTimeInterface) {
|
||||
@@ -330,6 +346,10 @@ class MySqliDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param \DateTime|\DateTimeInterface|string|int
|
||||
* @return string
|
||||
*/
|
||||
public function escapeDateTime($value)
|
||||
{
|
||||
if (!$value instanceof \DateTime && !$value instanceof \DateTimeInterface) {
|
||||
@@ -373,9 +393,12 @@ class MySqliDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
|
||||
/**
|
||||
* Injects LIMIT/OFFSET to the SQL query.
|
||||
* @param string
|
||||
* @param int|NULL
|
||||
* @param int|NULL
|
||||
* @return void
|
||||
*/
|
||||
public function applyLimit(& $sql, $limit, $offset)
|
||||
public function applyLimit(&$sql, $limit, $offset)
|
||||
{
|
||||
if ($limit < 0 || $offset < 0) {
|
||||
throw new Dibi\NotSupportedException('Negative offset or limit.');
|
||||
@@ -488,7 +511,7 @@ class MySqliDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
|
||||
/**
|
||||
* Returns the result set resource.
|
||||
* @return mysqli_result
|
||||
* @return \mysqli_result|NULL
|
||||
*/
|
||||
public function getResultResource()
|
||||
{
|
||||
|
@@ -25,10 +25,10 @@ class OdbcDriver implements Dibi\Driver, Dibi\ResultDriver, Dibi\Reflector
|
||||
{
|
||||
use Dibi\Strict;
|
||||
|
||||
/** @var resource Connection resource */
|
||||
/** @var resource|NULL */
|
||||
private $connection;
|
||||
|
||||
/** @var resource Resultset resource */
|
||||
/** @var resource|NULL */
|
||||
private $resultSet;
|
||||
|
||||
/** @var bool */
|
||||
@@ -57,7 +57,7 @@ class OdbcDriver implements Dibi\Driver, Dibi\ResultDriver, Dibi\Reflector
|
||||
* @return void
|
||||
* @throws Dibi\Exception
|
||||
*/
|
||||
public function connect(array & $config)
|
||||
public function connect(array &$config)
|
||||
{
|
||||
if (isset($config['resource'])) {
|
||||
$this->connection = $config['resource'];
|
||||
@@ -88,7 +88,7 @@ class OdbcDriver implements Dibi\Driver, Dibi\ResultDriver, Dibi\Reflector
|
||||
*/
|
||||
public function disconnect()
|
||||
{
|
||||
odbc_close($this->connection);
|
||||
@odbc_close($this->connection); // @ - connection can be already disconnected
|
||||
}
|
||||
|
||||
|
||||
@@ -110,6 +110,7 @@ class OdbcDriver implements Dibi\Driver, Dibi\ResultDriver, Dibi\Reflector
|
||||
$this->affectedRows = odbc_num_rows($res);
|
||||
return $this->createResultDriver($res);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
@@ -189,7 +190,7 @@ class OdbcDriver implements Dibi\Driver, Dibi\ResultDriver, Dibi\Reflector
|
||||
|
||||
/**
|
||||
* Returns the connection resource.
|
||||
* @return mixed
|
||||
* @return resource|NULL
|
||||
*/
|
||||
public function getResource()
|
||||
{
|
||||
@@ -225,7 +226,7 @@ class OdbcDriver implements Dibi\Driver, Dibi\ResultDriver, Dibi\Reflector
|
||||
|
||||
/**
|
||||
* Encodes data for use in a SQL statement.
|
||||
* @param mixed value
|
||||
* @param string value
|
||||
* @return string encoded value
|
||||
*/
|
||||
public function escapeText($value)
|
||||
@@ -234,24 +235,40 @@ class OdbcDriver implements Dibi\Driver, Dibi\ResultDriver, Dibi\Reflector
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
public function escapeBinary($value)
|
||||
{
|
||||
return "'" . str_replace("'", "''", $value) . "'";
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
public function escapeIdentifier($value)
|
||||
{
|
||||
return '[' . str_replace(['[', ']'], ['[[', ']]'], $value) . ']';
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param bool
|
||||
* @return string
|
||||
*/
|
||||
public function escapeBool($value)
|
||||
{
|
||||
return $value ? 1 : 0;
|
||||
return $value ? '1' : '0';
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param \DateTime|\DateTimeInterface|string|int
|
||||
* @return string
|
||||
*/
|
||||
public function escapeDate($value)
|
||||
{
|
||||
if (!$value instanceof \DateTime && !$value instanceof \DateTimeInterface) {
|
||||
@@ -261,6 +278,10 @@ class OdbcDriver implements Dibi\Driver, Dibi\ResultDriver, Dibi\Reflector
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param \DateTime|\DateTimeInterface|string|int
|
||||
* @return string
|
||||
*/
|
||||
public function escapeDateTime($value)
|
||||
{
|
||||
if (!$value instanceof \DateTime && !$value instanceof \DateTimeInterface) {
|
||||
@@ -304,9 +325,12 @@ class OdbcDriver implements Dibi\Driver, Dibi\ResultDriver, Dibi\Reflector
|
||||
|
||||
/**
|
||||
* Injects LIMIT/OFFSET to the SQL query.
|
||||
* @param string
|
||||
* @param int|NULL
|
||||
* @param int|NULL
|
||||
* @return void
|
||||
*/
|
||||
public function applyLimit(& $sql, $limit, $offset)
|
||||
public function applyLimit(&$sql, $limit, $offset)
|
||||
{
|
||||
if ($offset) {
|
||||
throw new Dibi\NotSupportedException('Offset is not supported by this database.');
|
||||
@@ -413,7 +437,7 @@ class OdbcDriver implements Dibi\Driver, Dibi\ResultDriver, Dibi\Reflector
|
||||
|
||||
/**
|
||||
* Returns the result set resource.
|
||||
* @return mixed
|
||||
* @return resource|NULL
|
||||
*/
|
||||
public function getResultResource()
|
||||
{
|
||||
|
@@ -29,10 +29,10 @@ class OracleDriver implements Dibi\Driver, Dibi\ResultDriver, Dibi\Reflector
|
||||
{
|
||||
use Dibi\Strict;
|
||||
|
||||
/** @var resource Connection resource */
|
||||
/** @var resource|NULL */
|
||||
private $connection;
|
||||
|
||||
/** @var resource Resultset resource */
|
||||
/** @var resource|NULL */
|
||||
private $resultSet;
|
||||
|
||||
/** @var bool */
|
||||
@@ -44,6 +44,9 @@ class OracleDriver implements Dibi\Driver, Dibi\ResultDriver, Dibi\Reflector
|
||||
/** @var string Date and datetime format */
|
||||
private $fmtDate, $fmtDateTime;
|
||||
|
||||
/** @var int|FALSE Number of affected rows */
|
||||
private $affectedRows = FALSE;
|
||||
|
||||
|
||||
/**
|
||||
* @throws Dibi\NotSupportedException
|
||||
@@ -61,9 +64,9 @@ class OracleDriver implements Dibi\Driver, Dibi\ResultDriver, Dibi\Reflector
|
||||
* @return void
|
||||
* @throws Dibi\Exception
|
||||
*/
|
||||
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->fmtDateTime = isset($config['formatDateTime']) ? $config['formatDateTime'] : 'U';
|
||||
|
||||
@@ -92,7 +95,7 @@ class OracleDriver implements Dibi\Driver, Dibi\ResultDriver, Dibi\Reflector
|
||||
*/
|
||||
public function disconnect()
|
||||
{
|
||||
oci_close($this->connection);
|
||||
@oci_close($this->connection); // @ - connection can be already disconnected
|
||||
}
|
||||
|
||||
|
||||
@@ -104,6 +107,7 @@ class OracleDriver implements Dibi\Driver, Dibi\ResultDriver, Dibi\Reflector
|
||||
*/
|
||||
public function query($sql)
|
||||
{
|
||||
$this->affectedRows = FALSE;
|
||||
$res = oci_parse($this->connection, $sql);
|
||||
if ($res) {
|
||||
@oci_execute($res, $this->autocommit ? OCI_COMMIT_ON_SUCCESS : OCI_DEFAULT);
|
||||
@@ -112,12 +116,14 @@ class OracleDriver implements Dibi\Driver, Dibi\ResultDriver, Dibi\Reflector
|
||||
throw self::createException($err['message'], $err['code'], $sql);
|
||||
|
||||
} elseif (is_resource($res)) {
|
||||
$this->affectedRows = oci_num_rows($res);
|
||||
return $this->createResultDriver($res);
|
||||
}
|
||||
} else {
|
||||
$err = oci_error($this->connection);
|
||||
throw new Dibi\DriverException($err['message'], $err['code'], $sql);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
@@ -147,7 +153,7 @@ class OracleDriver implements Dibi\Driver, Dibi\ResultDriver, Dibi\Reflector
|
||||
*/
|
||||
public function getAffectedRows()
|
||||
{
|
||||
throw new Dibi\NotImplementedException;
|
||||
return $this->affectedRows;
|
||||
}
|
||||
|
||||
|
||||
@@ -207,7 +213,7 @@ class OracleDriver implements Dibi\Driver, Dibi\ResultDriver, Dibi\Reflector
|
||||
|
||||
/**
|
||||
* Returns the connection resource.
|
||||
* @return mixed
|
||||
* @return resource|NULL
|
||||
*/
|
||||
public function getResource()
|
||||
{
|
||||
@@ -243,7 +249,7 @@ class OracleDriver implements Dibi\Driver, Dibi\ResultDriver, Dibi\Reflector
|
||||
|
||||
/**
|
||||
* Encodes data for use in a SQL statement.
|
||||
* @param mixed value
|
||||
* @param string value
|
||||
* @return string encoded value
|
||||
*/
|
||||
public function escapeText($value)
|
||||
@@ -252,12 +258,20 @@ class OracleDriver implements Dibi\Driver, Dibi\ResultDriver, Dibi\Reflector
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
public function escapeBinary($value)
|
||||
{
|
||||
return "'" . str_replace("'", "''", $value) . "'"; // TODO: not tested
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
public function escapeIdentifier($value)
|
||||
{
|
||||
// @see http://download.oracle.com/docs/cd/B10500_01/server.920/a96540/sql_elements9a.htm
|
||||
@@ -265,12 +279,20 @@ class OracleDriver implements Dibi\Driver, Dibi\ResultDriver, Dibi\Reflector
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param bool
|
||||
* @return string
|
||||
*/
|
||||
public function escapeBool($value)
|
||||
{
|
||||
return $value ? 1 : 0;
|
||||
return $value ? '1' : '0';
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param \DateTime|\DateTimeInterface|string|int
|
||||
* @return string
|
||||
*/
|
||||
public function escapeDate($value)
|
||||
{
|
||||
if (!$value instanceof \DateTime && !$value instanceof \DateTimeInterface) {
|
||||
@@ -280,6 +302,10 @@ class OracleDriver implements Dibi\Driver, Dibi\ResultDriver, Dibi\Reflector
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param \DateTime|\DateTimeInterface|string|int
|
||||
* @return string
|
||||
*/
|
||||
public function escapeDateTime($value)
|
||||
{
|
||||
if (!$value instanceof \DateTime && !$value instanceof \DateTimeInterface) {
|
||||
@@ -324,9 +350,12 @@ class OracleDriver implements Dibi\Driver, Dibi\ResultDriver, Dibi\Reflector
|
||||
|
||||
/**
|
||||
* Injects LIMIT/OFFSET to the SQL query.
|
||||
* @param string
|
||||
* @param int|NULL
|
||||
* @param int|NULL
|
||||
* @return void
|
||||
*/
|
||||
public function applyLimit(& $sql, $limit, $offset)
|
||||
public function applyLimit(&$sql, $limit, $offset)
|
||||
{
|
||||
if ($limit < 0 || $offset < 0) {
|
||||
throw new Dibi\NotSupportedException('Negative offset or limit.');
|
||||
@@ -422,7 +451,7 @@ class OracleDriver implements Dibi\Driver, Dibi\ResultDriver, Dibi\Reflector
|
||||
|
||||
/**
|
||||
* Returns the result set resource.
|
||||
* @return mixed
|
||||
* @return resource|NULL
|
||||
*/
|
||||
public function getResultResource()
|
||||
{
|
||||
@@ -461,7 +490,20 @@ class OracleDriver implements Dibi\Driver, Dibi\ResultDriver, Dibi\Reflector
|
||||
*/
|
||||
public function getColumns($table)
|
||||
{
|
||||
throw new Dibi\NotImplementedException;
|
||||
$res = $this->query('SELECT * FROM "ALL_TAB_COLUMNS" WHERE "TABLE_NAME" = ' . $this->escapeText($table));
|
||||
$columns = [];
|
||||
while ($row = $res->fetch(TRUE)) {
|
||||
$columns[] = [
|
||||
'table' => $row['TABLE_NAME'],
|
||||
'name' => $row['COLUMN_NAME'],
|
||||
'nativetype' => $row['DATA_TYPE'],
|
||||
'size' => isset($row['DATA_LENGTH']) ? $row['DATA_LENGTH'] : NULL,
|
||||
'nullable' => $row['NULLABLE'] === 'Y',
|
||||
'default' => $row['DATA_DEFAULT'],
|
||||
'vendor' => $row,
|
||||
];
|
||||
}
|
||||
return $columns;
|
||||
}
|
||||
|
||||
|
||||
|
@@ -30,7 +30,7 @@ class PdoDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
/** @var PDO Connection resource */
|
||||
private $connection;
|
||||
|
||||
/** @var \PDOStatement Resultset resource */
|
||||
/** @var \PDOStatement|NULL Resultset resource */
|
||||
private $resultSet;
|
||||
|
||||
/** @var int|FALSE Affected rows */
|
||||
@@ -40,7 +40,7 @@ class PdoDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
private $driverName;
|
||||
|
||||
/** @var string */
|
||||
private $serverVersion;
|
||||
private $serverVersion = '';
|
||||
|
||||
|
||||
/**
|
||||
@@ -59,10 +59,10 @@ class PdoDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
* @return void
|
||||
* @throws Dibi\Exception
|
||||
*/
|
||||
public function connect(array & $config)
|
||||
public function connect(array &$config)
|
||||
{
|
||||
$foo = & $config['dsn'];
|
||||
$foo = & $config['options'];
|
||||
$foo = &$config['dsn'];
|
||||
$foo = &$config['options'];
|
||||
Dibi\Helpers::alias($config, 'resource', 'pdo');
|
||||
|
||||
if ($config['resource'] instanceof PDO) {
|
||||
@@ -112,7 +112,7 @@ class PdoDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
if (isset($list[$cmd])) {
|
||||
$this->affectedRows = $this->connection->exec($sql);
|
||||
if ($this->affectedRows !== FALSE) {
|
||||
return;
|
||||
return NULL;
|
||||
}
|
||||
} else {
|
||||
$res = $this->connection->query($sql);
|
||||
@@ -254,7 +254,7 @@ class PdoDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
|
||||
/**
|
||||
* Encodes data for use in a SQL statement.
|
||||
* @param mixed value
|
||||
* @param string value
|
||||
* @return string encoded value
|
||||
*/
|
||||
public function escapeText($value)
|
||||
@@ -267,6 +267,10 @@ class PdoDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
public function escapeBinary($value)
|
||||
{
|
||||
if ($this->driverName === 'odbc') {
|
||||
@@ -277,6 +281,10 @@ class PdoDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
public function escapeIdentifier($value)
|
||||
{
|
||||
switch ($this->driverName) {
|
||||
@@ -304,16 +312,24 @@ class PdoDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param bool
|
||||
* @return string
|
||||
*/
|
||||
public function escapeBool($value)
|
||||
{
|
||||
if ($this->driverName === 'pgsql') {
|
||||
return $value ? 'TRUE' : 'FALSE';
|
||||
} else {
|
||||
return $value ? 1 : 0;
|
||||
return $value ? '1' : '0';
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param \DateTime|\DateTimeInterface|string|int
|
||||
* @return string
|
||||
*/
|
||||
public function escapeDate($value)
|
||||
{
|
||||
if (!$value instanceof \DateTime && !$value instanceof \DateTimeInterface) {
|
||||
@@ -323,6 +339,10 @@ class PdoDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param \DateTime|\DateTimeInterface|string|int
|
||||
* @return string
|
||||
*/
|
||||
public function escapeDateTime($value)
|
||||
{
|
||||
if (!$value instanceof \DateTime && !$value instanceof \DateTimeInterface) {
|
||||
@@ -394,9 +414,12 @@ class PdoDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
|
||||
/**
|
||||
* Injects LIMIT/OFFSET to the SQL query.
|
||||
* @param string
|
||||
* @param int|NULL
|
||||
* @param int|NULL
|
||||
* @return void
|
||||
*/
|
||||
public function applyLimit(& $sql, $limit, $offset)
|
||||
public function applyLimit(&$sql, $limit, $offset)
|
||||
{
|
||||
if ($limit < 0 || $offset < 0) {
|
||||
throw new Dibi\NotSupportedException('Negative offset or limit.');
|
||||
@@ -548,7 +571,7 @@ class PdoDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
|
||||
/**
|
||||
* Returns the result set resource.
|
||||
* @return \PDOStatement
|
||||
* @return \PDOStatement|NULL
|
||||
*/
|
||||
public function getResultResource()
|
||||
{
|
||||
|
@@ -26,10 +26,10 @@ class PostgreDriver implements Dibi\Driver, Dibi\ResultDriver, Dibi\Reflector
|
||||
{
|
||||
use Dibi\Strict;
|
||||
|
||||
/** @var resource Connection resource */
|
||||
/** @var resource|NULL */
|
||||
private $connection;
|
||||
|
||||
/** @var resource Resultset resource */
|
||||
/** @var resource|NULL */
|
||||
private $resultSet;
|
||||
|
||||
/** @var bool */
|
||||
@@ -55,7 +55,7 @@ class PostgreDriver implements Dibi\Driver, Dibi\ResultDriver, Dibi\Reflector
|
||||
* @return void
|
||||
* @throws Dibi\Exception
|
||||
*/
|
||||
public function connect(array & $config)
|
||||
public function connect(array &$config)
|
||||
{
|
||||
$error = NULL;
|
||||
if (isset($config['resource'])) {
|
||||
@@ -78,7 +78,7 @@ class PostgreDriver implements Dibi\Driver, Dibi\ResultDriver, Dibi\Reflector
|
||||
}
|
||||
}
|
||||
|
||||
set_error_handler(function($severity, $message) use (& $error) {
|
||||
set_error_handler(function($severity, $message) use (&$error) {
|
||||
$error = $message;
|
||||
});
|
||||
if (empty($config['persistent'])) {
|
||||
@@ -100,7 +100,7 @@ class PostgreDriver implements Dibi\Driver, Dibi\ResultDriver, Dibi\Reflector
|
||||
}
|
||||
|
||||
if (isset($config['schema'])) {
|
||||
$this->query('SET search_path TO "' . $config['schema'] . '"');
|
||||
$this->query('SET search_path TO "' . implode('", "', (array) $config['schema']) . '"');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -111,7 +111,7 @@ class PostgreDriver implements Dibi\Driver, Dibi\ResultDriver, Dibi\Reflector
|
||||
*/
|
||||
public function disconnect()
|
||||
{
|
||||
pg_close($this->connection);
|
||||
@pg_close($this->connection); // @ - connection can be already disconnected
|
||||
}
|
||||
|
||||
|
||||
@@ -145,6 +145,7 @@ class PostgreDriver implements Dibi\Driver, Dibi\ResultDriver, Dibi\Reflector
|
||||
return $this->createResultDriver($res);
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
@@ -256,7 +257,7 @@ class PostgreDriver implements Dibi\Driver, Dibi\ResultDriver, Dibi\Reflector
|
||||
|
||||
/**
|
||||
* Returns the connection resource.
|
||||
* @return mixed
|
||||
* @return resource|NULL
|
||||
*/
|
||||
public function getResource()
|
||||
{
|
||||
@@ -292,7 +293,7 @@ class PostgreDriver implements Dibi\Driver, Dibi\ResultDriver, Dibi\Reflector
|
||||
|
||||
/**
|
||||
* Encodes data for use in a SQL statement.
|
||||
* @param mixed value
|
||||
* @param string value
|
||||
* @return string encoded value
|
||||
*/
|
||||
public function escapeText($value)
|
||||
@@ -304,6 +305,10 @@ class PostgreDriver implements Dibi\Driver, Dibi\ResultDriver, Dibi\Reflector
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
public function escapeBinary($value)
|
||||
{
|
||||
if (!is_resource($this->connection)) {
|
||||
@@ -313,6 +318,10 @@ class PostgreDriver implements Dibi\Driver, Dibi\ResultDriver, Dibi\Reflector
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
public function escapeIdentifier($value)
|
||||
{
|
||||
// @see http://www.postgresql.org/docs/8.2/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS
|
||||
@@ -320,12 +329,20 @@ class PostgreDriver implements Dibi\Driver, Dibi\ResultDriver, Dibi\Reflector
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param bool
|
||||
* @return string
|
||||
*/
|
||||
public function escapeBool($value)
|
||||
{
|
||||
return $value ? 'TRUE' : 'FALSE';
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param \DateTime|\DateTimeInterface|string|int
|
||||
* @return string
|
||||
*/
|
||||
public function escapeDate($value)
|
||||
{
|
||||
if (!$value instanceof \DateTime && !$value instanceof \DateTimeInterface) {
|
||||
@@ -335,6 +352,10 @@ class PostgreDriver implements Dibi\Driver, Dibi\ResultDriver, Dibi\Reflector
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param \DateTime|\DateTimeInterface|string|int
|
||||
* @return string
|
||||
*/
|
||||
public function escapeDateTime($value)
|
||||
{
|
||||
if (!$value instanceof \DateTime && !$value instanceof \DateTimeInterface) {
|
||||
@@ -380,9 +401,12 @@ class PostgreDriver implements Dibi\Driver, Dibi\ResultDriver, Dibi\Reflector
|
||||
|
||||
/**
|
||||
* Injects LIMIT/OFFSET to the SQL query.
|
||||
* @param string
|
||||
* @param int|NULL
|
||||
* @param int|NULL
|
||||
* @return void
|
||||
*/
|
||||
public function applyLimit(& $sql, $limit, $offset)
|
||||
public function applyLimit(&$sql, $limit, $offset)
|
||||
{
|
||||
if ($limit < 0 || $offset < 0) {
|
||||
throw new Dibi\NotSupportedException('Negative offset or limit.');
|
||||
@@ -475,7 +499,7 @@ class PostgreDriver implements Dibi\Driver, Dibi\ResultDriver, Dibi\Reflector
|
||||
|
||||
/**
|
||||
* Returns the result set resource.
|
||||
* @return mixed
|
||||
* @return resource|NULL
|
||||
*/
|
||||
public function getResultResource()
|
||||
{
|
||||
|
@@ -27,10 +27,10 @@ class Sqlite3Driver implements Dibi\Driver, Dibi\ResultDriver
|
||||
{
|
||||
use Dibi\Strict;
|
||||
|
||||
/** @var SQLite3 Connection resource */
|
||||
/** @var SQLite3|NULL */
|
||||
private $connection;
|
||||
|
||||
/** @var \SQLite3Result Resultset resource */
|
||||
/** @var \SQLite3Result|NULL */
|
||||
private $resultSet;
|
||||
|
||||
/** @var bool */
|
||||
@@ -59,7 +59,7 @@ class Sqlite3Driver implements Dibi\Driver, Dibi\ResultDriver
|
||||
* @return void
|
||||
* @throws Dibi\Exception
|
||||
*/
|
||||
public function connect(array & $config)
|
||||
public function connect(array &$config)
|
||||
{
|
||||
Dibi\Helpers::alias($config, 'database', 'file');
|
||||
$this->fmtDate = isset($config['formatDate']) ? $config['formatDate'] : 'U';
|
||||
@@ -118,6 +118,7 @@ class Sqlite3Driver implements Dibi\Driver, Dibi\ResultDriver
|
||||
} elseif ($res instanceof \SQLite3Result) {
|
||||
return $this->createResultDriver($res);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
@@ -209,7 +210,7 @@ class Sqlite3Driver implements Dibi\Driver, Dibi\ResultDriver
|
||||
|
||||
/**
|
||||
* Returns the connection resource.
|
||||
* @return mixed
|
||||
* @return SQLite3
|
||||
*/
|
||||
public function getResource()
|
||||
{
|
||||
@@ -245,7 +246,7 @@ class Sqlite3Driver implements Dibi\Driver, Dibi\ResultDriver
|
||||
|
||||
/**
|
||||
* Encodes data for use in a SQL statement.
|
||||
* @param mixed value
|
||||
* @param string value
|
||||
* @return string encoded value
|
||||
*/
|
||||
public function escapeText($value)
|
||||
@@ -254,24 +255,40 @@ class Sqlite3Driver implements Dibi\Driver, Dibi\ResultDriver
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
public function escapeBinary($value)
|
||||
{
|
||||
return "X'" . bin2hex((string) $value) . "'";
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
public function escapeIdentifier($value)
|
||||
{
|
||||
return '[' . strtr($value, '[]', ' ') . ']';
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param bool
|
||||
* @return string
|
||||
*/
|
||||
public function escapeBool($value)
|
||||
{
|
||||
return $value ? 1 : 0;
|
||||
return $value ? '1' : '0';
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param \DateTime|\DateTimeInterface|string|int
|
||||
* @return string
|
||||
*/
|
||||
public function escapeDate($value)
|
||||
{
|
||||
if (!$value instanceof \DateTime && !$value instanceof \DateTimeInterface) {
|
||||
@@ -281,6 +298,10 @@ class Sqlite3Driver implements Dibi\Driver, Dibi\ResultDriver
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param \DateTime|\DateTimeInterface|string|int
|
||||
* @return string
|
||||
*/
|
||||
public function escapeDateTime($value)
|
||||
{
|
||||
if (!$value instanceof \DateTime && !$value instanceof \DateTimeInterface) {
|
||||
@@ -324,9 +345,12 @@ class Sqlite3Driver implements Dibi\Driver, Dibi\ResultDriver
|
||||
|
||||
/**
|
||||
* Injects LIMIT/OFFSET to the SQL query.
|
||||
* @param string
|
||||
* @param int|NULL
|
||||
* @param int|NULL
|
||||
* @return void
|
||||
*/
|
||||
public function applyLimit(& $sql, $limit, $offset)
|
||||
public function applyLimit(&$sql, $limit, $offset)
|
||||
{
|
||||
if ($limit < 0 || $offset < 0) {
|
||||
throw new Dibi\NotSupportedException('Negative offset or limit.');
|
||||
@@ -431,7 +455,7 @@ class Sqlite3Driver implements Dibi\Driver, Dibi\ResultDriver
|
||||
|
||||
/**
|
||||
* Returns the result set resource.
|
||||
* @return mixed
|
||||
* @return \SQLite3Result|NULL
|
||||
*/
|
||||
public function getResultResource()
|
||||
{
|
||||
|
@@ -29,10 +29,10 @@ class SqlsrvDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
{
|
||||
use Dibi\Strict;
|
||||
|
||||
/** @var resource Connection resource */
|
||||
/** @var resource|NULL */
|
||||
private $connection;
|
||||
|
||||
/** @var resource Resultset resource */
|
||||
/** @var resource|NULL */
|
||||
private $resultSet;
|
||||
|
||||
/** @var bool */
|
||||
@@ -42,7 +42,7 @@ class SqlsrvDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
private $affectedRows = FALSE;
|
||||
|
||||
/** @var string */
|
||||
private $version;
|
||||
private $version = '';
|
||||
|
||||
|
||||
/**
|
||||
@@ -61,7 +61,7 @@ class SqlsrvDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
* @return void
|
||||
* @throws Dibi\Exception
|
||||
*/
|
||||
public function connect(array & $config)
|
||||
public function connect(array &$config)
|
||||
{
|
||||
Helpers::alias($config, 'options|UID', 'username');
|
||||
Helpers::alias($config, 'options|PWD', 'password');
|
||||
@@ -72,7 +72,7 @@ class SqlsrvDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
$this->connection = $config['resource'];
|
||||
|
||||
} else {
|
||||
$options = & $config['options'];
|
||||
$options = $config['options'];
|
||||
|
||||
// Default values
|
||||
if (!isset($options['CharacterSet'])) {
|
||||
@@ -99,7 +99,7 @@ class SqlsrvDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
*/
|
||||
public function disconnect()
|
||||
{
|
||||
sqlsrv_close($this->connection);
|
||||
@sqlsrv_close($this->connection); // @ - connection can be already disconnected
|
||||
}
|
||||
|
||||
|
||||
@@ -122,6 +122,7 @@ class SqlsrvDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
$this->affectedRows = sqlsrv_rows_affected($res);
|
||||
return $this->createResultDriver($res);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
@@ -141,7 +142,7 @@ class SqlsrvDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
*/
|
||||
public function getInsertId($sequence)
|
||||
{
|
||||
$res = sqlsrv_query($this->connection, 'SELECT @@IDENTITY');
|
||||
$res = sqlsrv_query($this->connection, 'SELECT SCOPE_IDENTITY()');
|
||||
if (is_resource($res)) {
|
||||
$row = sqlsrv_fetch_array($res, SQLSRV_FETCH_NUMERIC);
|
||||
return $row[0];
|
||||
@@ -188,7 +189,7 @@ class SqlsrvDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
|
||||
/**
|
||||
* Returns the connection resource.
|
||||
* @return mixed
|
||||
* @return resource|NULL
|
||||
*/
|
||||
public function getResource()
|
||||
{
|
||||
@@ -224,7 +225,7 @@ class SqlsrvDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
|
||||
/**
|
||||
* Encodes data for use in a SQL statement.
|
||||
* @param mixed value
|
||||
* @param string value
|
||||
* @return string encoded value
|
||||
*/
|
||||
public function escapeText($value)
|
||||
@@ -233,12 +234,20 @@ class SqlsrvDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
public function escapeBinary($value)
|
||||
{
|
||||
return "'" . str_replace("'", "''", $value) . "'";
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
public function escapeIdentifier($value)
|
||||
{
|
||||
// @see https://msdn.microsoft.com/en-us/library/ms176027.aspx
|
||||
@@ -246,12 +255,20 @@ class SqlsrvDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param bool
|
||||
* @return string
|
||||
*/
|
||||
public function escapeBool($value)
|
||||
{
|
||||
return $value ? 1 : 0;
|
||||
return $value ? '1' : '0';
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param \DateTime|\DateTimeInterface|string|int
|
||||
* @return string
|
||||
*/
|
||||
public function escapeDate($value)
|
||||
{
|
||||
if (!$value instanceof \DateTime && !$value instanceof \DateTimeInterface) {
|
||||
@@ -261,6 +278,10 @@ class SqlsrvDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param \DateTime|\DateTimeInterface|string|int
|
||||
* @return string
|
||||
*/
|
||||
public function escapeDateTime($value)
|
||||
{
|
||||
if (!$value instanceof \DateTime && !$value instanceof \DateTimeInterface) {
|
||||
@@ -304,14 +325,17 @@ class SqlsrvDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
|
||||
/**
|
||||
* Injects LIMIT/OFFSET to the SQL query.
|
||||
* @param string
|
||||
* @param int|NULL
|
||||
* @param int|NULL
|
||||
* @return void
|
||||
*/
|
||||
public function applyLimit(& $sql, $limit, $offset)
|
||||
public function applyLimit(&$sql, $limit, $offset)
|
||||
{
|
||||
if ($limit < 0 || $offset < 0) {
|
||||
throw new Dibi\NotSupportedException('Negative offset or limit.');
|
||||
|
||||
} elseif (version_compare($this->version, 11, '<')) { // 11 == SQL Server 2012
|
||||
} elseif (version_compare($this->version, '11', '<')) { // 11 == SQL Server 2012
|
||||
if ($offset) {
|
||||
throw new Dibi\NotSupportedException('Offset is not supported by this database.');
|
||||
|
||||
@@ -405,7 +429,7 @@ class SqlsrvDriver implements Dibi\Driver, Dibi\ResultDriver
|
||||
|
||||
/**
|
||||
* Returns the result set resource.
|
||||
* @return mixed
|
||||
* @return resource|NULL
|
||||
*/
|
||||
public function getResultResource()
|
||||
{
|
||||
|
@@ -25,6 +25,7 @@ namespace Dibi;
|
||||
* @method Fluent innerJoin(...$table)
|
||||
* @method Fluent rightJoin(...$table)
|
||||
* @method Fluent outerJoin(...$table)
|
||||
* @method Fluent as(...$field)
|
||||
* @method Fluent on(...$cond)
|
||||
* @method Fluent using(...$cond)
|
||||
*/
|
||||
@@ -129,19 +130,19 @@ class Fluent implements IDataSource
|
||||
if (isset(self::$masks[$clause])) {
|
||||
$this->clauses = array_fill_keys(self::$masks[$clause], NULL);
|
||||
}
|
||||
$this->cursor = & $this->clauses[$clause];
|
||||
$this->cursor = &$this->clauses[$clause];
|
||||
$this->cursor = [];
|
||||
$this->command = $clause;
|
||||
}
|
||||
|
||||
// auto-switch to a clause
|
||||
if (isset(self::$clauseSwitches[$clause])) {
|
||||
$this->cursor = & $this->clauses[self::$clauseSwitches[$clause]];
|
||||
$this->cursor = &$this->clauses[self::$clauseSwitches[$clause]];
|
||||
}
|
||||
|
||||
if (array_key_exists($clause, $this->clauses)) {
|
||||
// append to clause
|
||||
$this->cursor = & $this->clauses[$clause];
|
||||
$this->cursor = &$this->clauses[$clause];
|
||||
|
||||
// TODO: really delete?
|
||||
if ($args === [self::REMOVE]) {
|
||||
@@ -180,7 +181,7 @@ class Fluent implements IDataSource
|
||||
return $this;
|
||||
|
||||
} elseif (is_string($arg) && preg_match('#^[a-z:_][a-z0-9_.:]*\z#i', $arg)) { // identifier
|
||||
$args = ['%n', $arg];
|
||||
$args = [$clause === 'AS' ? '%N' : '%n', $arg];
|
||||
|
||||
} elseif (is_array($arg) || ($arg instanceof \Traversable && !$arg instanceof self)) { // any array
|
||||
if (isset(self::$modifiers[$clause])) {
|
||||
@@ -210,7 +211,7 @@ class Fluent implements IDataSource
|
||||
*/
|
||||
public function clause($clause)
|
||||
{
|
||||
$this->cursor = & $this->clauses[self::$normalizer->$clause];
|
||||
$this->cursor = &$this->clauses[self::$normalizer->$clause];
|
||||
if ($this->cursor === NULL) {
|
||||
$this->cursor = [];
|
||||
}
|
||||
@@ -299,7 +300,7 @@ class Fluent implements IDataSource
|
||||
/**
|
||||
* Generates and executes SQL query.
|
||||
* @param mixed what to return?
|
||||
* @return Result|int result set object (if any)
|
||||
* @return Result|int result set or number of affected rows
|
||||
* @throws Exception
|
||||
*/
|
||||
public function execute($return = NULL)
|
||||
@@ -318,7 +319,7 @@ class Fluent implements IDataSource
|
||||
|
||||
/**
|
||||
* Generates, executes SQL query and fetches the single row.
|
||||
* @return Row|FALSE array on success, FALSE if no next record
|
||||
* @return Row|FALSE
|
||||
*/
|
||||
public function fetch()
|
||||
{
|
||||
@@ -511,10 +512,10 @@ class Fluent implements IDataSource
|
||||
{
|
||||
// remove references
|
||||
foreach ($this->clauses as $clause => $val) {
|
||||
$this->clauses[$clause] = & $val;
|
||||
$this->clauses[$clause] = &$val;
|
||||
unset($val);
|
||||
}
|
||||
$this->cursor = & $foo;
|
||||
$this->cursor = &$foo;
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -50,14 +50,14 @@ class Helpers
|
||||
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\t<th>" . htmlSpecialChars((string) $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) {
|
||||
echo "\t\t<td>", htmlSpecialChars($col), "</td>\n";
|
||||
echo "\t\t<td>", htmlSpecialChars((string) $col), "</td>\n";
|
||||
}
|
||||
echo "\t</tr>\n";
|
||||
}
|
||||
@@ -220,11 +220,11 @@ class Helpers
|
||||
* @param string alias key
|
||||
* @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) {
|
||||
$foo = & $foo[$key];
|
||||
$foo = &$foo[$key];
|
||||
}
|
||||
|
||||
if (!isset($foo) && isset($config[$alias])) {
|
||||
|
@@ -19,10 +19,10 @@ use Dibi\Type;
|
||||
* @property-read Table $table
|
||||
* @property-read string $type
|
||||
* @property-read mixed $nativeType
|
||||
* @property-read int $size
|
||||
* @property-read bool $unsigned
|
||||
* @property-read bool $nullable
|
||||
* @property-read bool $autoIncrement
|
||||
* @property-read int|NULL $size
|
||||
* @property-read bool|NULL $unsigned
|
||||
* @property-read bool|NULL $nullable
|
||||
* @property-read bool|NULL $autoIncrement
|
||||
* @property-read mixed $default
|
||||
*/
|
||||
class Column
|
||||
@@ -83,7 +83,7 @@ class Column
|
||||
|
||||
|
||||
/**
|
||||
* @return string
|
||||
* @return string|NULL
|
||||
*/
|
||||
public function getTableName()
|
||||
{
|
||||
@@ -101,7 +101,7 @@ class Column
|
||||
|
||||
|
||||
/**
|
||||
* @return mixed
|
||||
* @return string
|
||||
*/
|
||||
public function getNativeType()
|
||||
{
|
||||
@@ -110,7 +110,7 @@ class Column
|
||||
|
||||
|
||||
/**
|
||||
* @return int
|
||||
* @return int|NULL
|
||||
*/
|
||||
public function getSize()
|
||||
{
|
||||
@@ -119,7 +119,7 @@ class Column
|
||||
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
* @return bool|NULL
|
||||
*/
|
||||
public function isUnsigned()
|
||||
{
|
||||
@@ -128,7 +128,7 @@ class Column
|
||||
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
* @return bool|NULL
|
||||
*/
|
||||
public function isNullable()
|
||||
{
|
||||
@@ -137,7 +137,7 @@ class Column
|
||||
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
* @return bool|NULL
|
||||
*/
|
||||
public function isAutoIncrement()
|
||||
{
|
||||
|
@@ -184,7 +184,7 @@ class Result implements IDataSource
|
||||
/**
|
||||
* Fetches the row at current position, process optional type conversion.
|
||||
* and moves the internal cursor to the next position
|
||||
* @return Row|FALSE array on success, FALSE if no next record
|
||||
* @return Row|FALSE
|
||||
*/
|
||||
final public function fetch()
|
||||
{
|
||||
@@ -271,7 +271,7 @@ class Result implements IDataSource
|
||||
}
|
||||
|
||||
$data = NULL;
|
||||
$assoc = preg_split('#(\[\]|->|=|\|)#', $assoc, NULL, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
|
||||
$assoc = preg_split('#(\[\]|->|=|\|)#', $assoc, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
|
||||
|
||||
// check columns
|
||||
foreach ($assoc as $as) {
|
||||
@@ -291,12 +291,12 @@ class Result implements IDataSource
|
||||
|
||||
// make associative tree
|
||||
do {
|
||||
$x = & $data;
|
||||
$x = &$data;
|
||||
|
||||
// iterative deepening
|
||||
foreach ($assoc as $i => $as) {
|
||||
if ($as === '[]') { // indexed-array node
|
||||
$x = & $x[];
|
||||
$x = &$x[];
|
||||
|
||||
} elseif ($as === '=') { // "value" node
|
||||
$x = $row->{$assoc[$i + 1]};
|
||||
@@ -305,14 +305,14 @@ class Result implements IDataSource
|
||||
} elseif ($as === '->') { // "object" node
|
||||
if ($x === NULL) {
|
||||
$x = clone $row;
|
||||
$x = & $x->{$assoc[$i + 1]};
|
||||
$x = &$x->{$assoc[$i + 1]};
|
||||
$x = NULL; // prepare child node
|
||||
} else {
|
||||
$x = & $x->{$assoc[$i + 1]};
|
||||
$x = &$x->{$assoc[$i + 1]};
|
||||
}
|
||||
|
||||
} elseif ($as !== '|') { // associative-array node
|
||||
$x = & $x[$row->$as];
|
||||
$x = &$x[$row->$as];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -356,32 +356,32 @@ class Result implements IDataSource
|
||||
}
|
||||
|
||||
do {
|
||||
$x = & $data;
|
||||
$x = &$data;
|
||||
|
||||
foreach ($assoc as $i => $as) {
|
||||
if ($as === '#') { // indexed-array node
|
||||
$x = & $x[];
|
||||
$x = &$x[];
|
||||
|
||||
} elseif ($as === '=') { // "record" node
|
||||
if ($x === NULL) {
|
||||
$x = $row->toArray();
|
||||
$x = & $x[ $assoc[$i + 1] ];
|
||||
$x = &$x[ $assoc[$i + 1] ];
|
||||
$x = NULL; // prepare child node
|
||||
} else {
|
||||
$x = & $x[ $assoc[$i + 1] ];
|
||||
$x = &$x[ $assoc[$i + 1] ];
|
||||
}
|
||||
|
||||
} elseif ($as === '@') { // "object" node
|
||||
if ($x === NULL) {
|
||||
$x = clone $row;
|
||||
$x = & $x->{$assoc[$i + 1]};
|
||||
$x = &$x->{$assoc[$i + 1]};
|
||||
$x = NULL; // prepare child node
|
||||
} else {
|
||||
$x = & $x->{$assoc[$i + 1]};
|
||||
$x = &$x->{$assoc[$i + 1]};
|
||||
}
|
||||
|
||||
} else { // associative-array node
|
||||
$x = & $x[$row->$as];
|
||||
$x = &$x[$row->$as];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -483,7 +483,7 @@ class Result implements IDataSource
|
||||
* @param array
|
||||
* @return void
|
||||
*/
|
||||
private function normalize(array & $row)
|
||||
private function normalize(array &$row)
|
||||
{
|
||||
foreach ($this->types as $key => $type) {
|
||||
if (!isset($row[$key])) { // NULL
|
||||
@@ -499,7 +499,7 @@ class Result implements IDataSource
|
||||
: $tmp;
|
||||
|
||||
} elseif ($type === Type::FLOAT) {
|
||||
$value = ltrim($value, '0');
|
||||
$value = ltrim((string) $value, '0');
|
||||
$p = strpos($value, '.');
|
||||
if ($p !== FALSE) {
|
||||
$value = rtrim(rtrim($value, '0'), '.');
|
||||
@@ -515,7 +515,7 @@ class Result implements IDataSource
|
||||
$row[$key] = ((bool) $value) && $value !== 'f' && $value !== 'F';
|
||||
|
||||
} elseif ($type === Type::DATETIME || $type === Type::DATE || $type === Type::TIME) {
|
||||
if ((int) $value !== 0 || substr((string) $value, 0, 3) === '00:') { // '', NULL, FALSE, '0000-00-00', ...
|
||||
if ($value && substr((string) $value, 0, 3) !== '000') { // '', NULL, FALSE, '0000-00-00', ...
|
||||
$value = new DateTime($value);
|
||||
$row[$key] = empty($this->formats[$type]) ? $value : $value->format($this->formats[$type]);
|
||||
} else {
|
||||
@@ -558,9 +558,9 @@ class Result implements IDataSource
|
||||
|
||||
|
||||
/**
|
||||
* Sets data format.
|
||||
* @param string type (use constant Type::*)
|
||||
* @param string format
|
||||
* Sets date format.
|
||||
* @param string
|
||||
* @param string|NULL format
|
||||
* @return self
|
||||
*/
|
||||
final public function setFormat($type, $format)
|
||||
@@ -572,7 +572,7 @@ class Result implements IDataSource
|
||||
|
||||
/**
|
||||
* Returns data format.
|
||||
* @return string
|
||||
* @return string|NULL
|
||||
*/
|
||||
final public function getFormat($type)
|
||||
{
|
||||
|
@@ -27,7 +27,7 @@ class ResultIterator implements \Iterator, \Countable
|
||||
/** @var Result */
|
||||
private $result;
|
||||
|
||||
/** @var int */
|
||||
/** @var mixed */
|
||||
private $row;
|
||||
|
||||
/** @var int */
|
||||
|
@@ -38,7 +38,7 @@ class Row implements \ArrayAccess, \IteratorAggregate, \Countable
|
||||
{
|
||||
$time = $this[$key];
|
||||
if (!$time instanceof DateTime) {
|
||||
if ((int) $time === 0 && substr((string) $time, 0, 3) !== '00:') { // '', NULL, FALSE, '0000-00-00', ...
|
||||
if (!$time || substr((string) $time, 0, 3) === '000') { // '', NULL, FALSE, '0000-00-00', ...
|
||||
return NULL;
|
||||
}
|
||||
$time = new DateTime($time);
|
||||
|
@@ -105,7 +105,7 @@ trait Strict
|
||||
|
||||
/**
|
||||
* @param string method name
|
||||
* @param callabke
|
||||
* @param callable
|
||||
* @return mixed
|
||||
*/
|
||||
public static function extensionMethod($name, $callback = NULL)
|
||||
@@ -131,7 +131,7 @@ trait Strict
|
||||
|
||||
$list = & self::$extMethods[strtolower($name)];
|
||||
if ($callback === NULL) { // getter
|
||||
$cache = & $list[''][$class];
|
||||
$cache = &$list[''][$class];
|
||||
if (isset($cache)) {
|
||||
return $cache;
|
||||
}
|
||||
|
@@ -73,8 +73,8 @@ final class Translator
|
||||
|
||||
$commandIns = NULL;
|
||||
$lastArr = NULL;
|
||||
$cursor = & $this->cursor;
|
||||
$comment = & $this->comment;
|
||||
$cursor = &$this->cursor;
|
||||
$comment = &$this->comment;
|
||||
|
||||
// iterate
|
||||
$sql = [];
|
||||
@@ -225,7 +225,7 @@ final class Translator
|
||||
case 'n': // key, key, ... identifier names
|
||||
foreach ($value as $k => $v) {
|
||||
if (is_string($k)) {
|
||||
$vx[] = $this->identifiers->$k . (empty($v) ? '' : ' AS ' . $this->identifiers->$v);
|
||||
$vx[] = $this->identifiers->$k . (empty($v) ? '' : ' AS ' . $this->driver->escapeIdentifier($v));
|
||||
} else {
|
||||
$pair = explode('%', $v, 2); // split into identifier & modifier
|
||||
$vx[] = $this->identifiers->{$pair[0]};
|
||||
@@ -246,7 +246,7 @@ final class Translator
|
||||
case 'in':// replaces scalar %in modifier!
|
||||
case 'l': // (val, val, ...)
|
||||
foreach ($value as $k => $v) {
|
||||
$pair = explode('%', $k, 2); // split into identifier & modifier
|
||||
$pair = explode('%', (string) $k, 2); // split into identifier & modifier
|
||||
$vx[] = $this->formatValue($v, isset($pair[1]) ? $pair[1] : (is_array($v) ? 'ex' : FALSE));
|
||||
}
|
||||
return '(' . (($vx || $modifier === 'l') ? implode(', ', $vx) : 'NULL') . ')';
|
||||
@@ -316,7 +316,7 @@ final class Translator
|
||||
if ($value !== NULL && !is_scalar($value)) { // array is already processed
|
||||
if ($value instanceof Literal && ($modifier === 'sql' || $modifier === 'SQL')) {
|
||||
$modifier = 'SQL';
|
||||
} elseif (($value instanceof \DateTime || $value instanceof \DateTimeInterface) && ($modifier === 'd' || $modifier === 't')) {
|
||||
} elseif (($value instanceof \DateTime || $value instanceof \DateTimeInterface) && ($modifier === 'd' || $modifier === 't' || $modifier === 'dt')) {
|
||||
// continue
|
||||
} else {
|
||||
$type = is_object($value) ? get_class($value) : gettype($value);
|
||||
@@ -326,7 +326,7 @@ final class Translator
|
||||
|
||||
switch ($modifier) {
|
||||
case 's': // string
|
||||
return $value === NULL ? 'NULL' : $this->driver->escapeText($value);
|
||||
return $value === NULL ? 'NULL' : $this->driver->escapeText((string) $value);
|
||||
|
||||
case 'bin':// binary
|
||||
return $value === NULL ? 'NULL' : $this->driver->escapeBinary($value);
|
||||
@@ -336,7 +336,7 @@ final class Translator
|
||||
|
||||
case 'sN': // string or NULL
|
||||
case 'sn':
|
||||
return $value == '' ? 'NULL' : $this->driver->escapeText($value); // notice two equal signs
|
||||
return $value == '' ? 'NULL' : $this->driver->escapeText((string) $value); // notice two equal signs
|
||||
|
||||
case 'in': // deprecated
|
||||
trigger_error('Modifier %in is deprecated, use %iN.', E_USER_DEPRECATED);
|
||||
@@ -380,9 +380,12 @@ final class Translator
|
||||
}
|
||||
|
||||
case 'by':
|
||||
case 'n': // identifier name
|
||||
case 'n': // composed identifier name
|
||||
return $this->identifiers->$value;
|
||||
|
||||
case 'N': // identifier name
|
||||
return $this->driver->escapeIdentifier($value);
|
||||
|
||||
case 'ex':
|
||||
case 'sql': // preserve as dibi-SQL (TODO: leave only %ex)
|
||||
$value = (string) $value;
|
||||
@@ -477,7 +480,7 @@ final class Translator
|
||||
|
||||
|
||||
if (!empty($matches[11])) { // placeholder
|
||||
$cursor = & $this->cursor;
|
||||
$cursor = &$this->cursor;
|
||||
|
||||
if ($cursor >= count($this->args)) {
|
||||
return $this->errors[] = '**Extra placeholder**';
|
||||
@@ -489,7 +492,7 @@ final class Translator
|
||||
|
||||
if (!empty($matches[10])) { // modifier
|
||||
$mod = $matches[10];
|
||||
$cursor = & $this->cursor;
|
||||
$cursor = &$this->cursor;
|
||||
|
||||
if ($cursor >= count($this->args) && $mod !== 'else' && $mod !== 'end') {
|
||||
return $this->errors[] = "**Extra modifier %$mod**";
|
||||
@@ -597,7 +600,7 @@ final class Translator
|
||||
{
|
||||
$value = $this->connection->substitute($value);
|
||||
$parts = explode('.', $value);
|
||||
foreach ($parts as & $v) {
|
||||
foreach ($parts as &$v) {
|
||||
if ($v !== '*') {
|
||||
$v = $this->driver->escapeIdentifier($v);
|
||||
}
|
||||
|
@@ -22,8 +22,8 @@ class dibi
|
||||
|
||||
/** version */
|
||||
const
|
||||
VERSION = '3.0.3',
|
||||
REVISION = 'released on 2016-02-21';
|
||||
VERSION = '3.0.9',
|
||||
REVISION = 'released on 2018-03-09';
|
||||
|
||||
/** sorting order */
|
||||
const
|
||||
@@ -90,7 +90,7 @@ class dibi
|
||||
* @return Dibi\Connection
|
||||
* @throws Dibi\Exception
|
||||
*/
|
||||
public static function connect($config = [], $name = 0)
|
||||
public static function connect($config = [], $name = '0')
|
||||
{
|
||||
return self::$connection = self::$registry[$name] = new Dibi\Connection($config, $name);
|
||||
}
|
||||
@@ -167,7 +167,7 @@ class dibi
|
||||
/**
|
||||
* Generates and executes SQL query - Monostate for Dibi\Connection::query().
|
||||
* @param array|mixed one or more arguments
|
||||
* @return Dibi\Result|int result set object (if any)
|
||||
* @return Dibi\Result|int result set or number of affected rows
|
||||
* @throws Dibi\Exception
|
||||
*/
|
||||
public static function query($args)
|
||||
@@ -180,7 +180,7 @@ class dibi
|
||||
/**
|
||||
* Executes the SQL query - Monostate for Dibi\Connection::nativeQuery().
|
||||
* @param string SQL statement.
|
||||
* @return Dibi\Result|int result set object (if any)
|
||||
* @return Dibi\Result|int result set or number of affected rows
|
||||
*/
|
||||
public static function nativeQuery($sql)
|
||||
{
|
||||
@@ -241,7 +241,7 @@ class dibi
|
||||
/**
|
||||
* Executes SQL query and fetch first column - Monostate for Dibi\Connection::query() & fetchSingle().
|
||||
* @param array|mixed one or more arguments
|
||||
* @return string
|
||||
* @return mixed
|
||||
* @throws Dibi\Exception
|
||||
*/
|
||||
public static function fetchSingle($args)
|
||||
@@ -254,7 +254,7 @@ class dibi
|
||||
/**
|
||||
* Executes SQL query and fetch pairs - Monostate for Dibi\Connection::query() & fetchPairs().
|
||||
* @param array|mixed one or more arguments
|
||||
* @return string
|
||||
* @return array
|
||||
* @throws Dibi\Exception
|
||||
*/
|
||||
public static function fetchPairs($args)
|
||||
@@ -382,7 +382,7 @@ class dibi
|
||||
|
||||
|
||||
/**
|
||||
* @param string column name
|
||||
* @param mixed column name
|
||||
* @return Dibi\Fluent
|
||||
*/
|
||||
public static function select($args)
|
||||
|
@@ -13,8 +13,6 @@ namespace Dibi;
|
||||
*/
|
||||
class Exception extends \Exception
|
||||
{
|
||||
use Strict;
|
||||
|
||||
/** @var string|NULL */
|
||||
private $sql;
|
||||
|
||||
@@ -25,7 +23,7 @@ class Exception extends \Exception
|
||||
* @param mixed
|
||||
* @param string SQL command
|
||||
*/
|
||||
public function __construct($message = NULL, $code = 0, $sql = NULL)
|
||||
public function __construct($message = '', $code = 0, $sql = NULL)
|
||||
{
|
||||
parent::__construct($message);
|
||||
$this->code = $code;
|
||||
@@ -66,7 +64,6 @@ class DriverException extends Exception
|
||||
*/
|
||||
class PcreException extends Exception
|
||||
{
|
||||
use Strict;
|
||||
|
||||
public function __construct($message = '%msg.')
|
||||
{
|
||||
|
@@ -30,7 +30,7 @@ interface Driver
|
||||
* @return void
|
||||
* @throws Exception
|
||||
*/
|
||||
function connect(array & $config);
|
||||
function connect(array &$config);
|
||||
|
||||
/**
|
||||
* Disconnects from a database.
|
||||
@@ -97,19 +97,39 @@ interface Driver
|
||||
|
||||
/**
|
||||
* Encodes data for use in a SQL statement.
|
||||
* @param mixed value
|
||||
* @param string value
|
||||
* @return string encoded value
|
||||
*/
|
||||
function escapeText($value);
|
||||
|
||||
/**
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function escapeBinary($value);
|
||||
|
||||
/**
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
function escapeIdentifier($value);
|
||||
|
||||
/**
|
||||
* @param bool
|
||||
* @return string
|
||||
*/
|
||||
function escapeBool($value);
|
||||
|
||||
/**
|
||||
* @param \DateTime|\DateTimeInterface|string|int
|
||||
* @return string
|
||||
*/
|
||||
function escapeDate($value);
|
||||
|
||||
/**
|
||||
* @param \DateTime|\DateTimeInterface|string|int
|
||||
* @return string
|
||||
*/
|
||||
function escapeDateTime($value);
|
||||
|
||||
/**
|
||||
@@ -122,9 +142,12 @@ interface Driver
|
||||
|
||||
/**
|
||||
* Injects LIMIT/OFFSET to the SQL query.
|
||||
* @param string
|
||||
* @param int|NULL
|
||||
* @param int|NULL
|
||||
* @return void
|
||||
*/
|
||||
function applyLimit(& $sql, $limit, $offset);
|
||||
function applyLimit(&$sql, $limit, $offset);
|
||||
|
||||
}
|
||||
|
||||
|
@@ -14,32 +14,34 @@ if (PHP_VERSION_ID < 50404) {
|
||||
spl_autoload_register(function ($class) {
|
||||
static $map = [
|
||||
'dibi' => 'dibi.php',
|
||||
'Dibi\Bridges\Nette\DibiExtension22' => 'Bridges/Nette/DibiExtension22.php',
|
||||
'Dibi\Bridges\Nette\DibiExtension21' => 'Bridges/Nette/DibiExtension21.php',
|
||||
'Dibi\Bridges\Nette\DibiExtension22' => 'Bridges/Nette/DibiExtension22.php',
|
||||
'Dibi\Bridges\Nette\Panel' => 'Bridges/Nette/Panel.php',
|
||||
'Dibi\Bridges\Tracy\Panel' => 'Bridges/Tracy/Panel.php',
|
||||
'Dibi\Connection' => 'Connection.php',
|
||||
'Dibi\ConstraintViolationException' => 'exceptions.php',
|
||||
'Dibi\DataSource' => 'DataSource.php',
|
||||
'Dibi\DateTime' => 'DateTime.php',
|
||||
'Dibi\Driver' => 'interfaces.php',
|
||||
'Dibi\DriverException' => 'exceptions.php',
|
||||
'Dibi\Drivers\FirebirdDriver' => 'Drivers/FirebirdDriver.php',
|
||||
'Dibi\Drivers\SqlsrvDriver' => 'Drivers/SqlsrvDriver.php',
|
||||
'Dibi\Drivers\SqlsrvReflector' => 'Drivers/SqlsrvReflector.php',
|
||||
'Dibi\Drivers\MsSqlDriver' => 'Drivers/MsSqlDriver.php',
|
||||
'Dibi\Drivers\MsSqlReflector' => 'Drivers/MsSqlReflector.php',
|
||||
'Dibi\Drivers\MySqlDriver' => 'Drivers/MySqlDriver.php',
|
||||
'Dibi\Drivers\MySqliDriver' => 'Drivers/MySqliDriver.php',
|
||||
'Dibi\Drivers\MySqlReflector' => 'Drivers/MySqlReflector.php',
|
||||
'Dibi\Drivers\MySqliDriver' => 'Drivers/MySqliDriver.php',
|
||||
'Dibi\Drivers\OdbcDriver' => 'Drivers/OdbcDriver.php',
|
||||
'Dibi\Drivers\OracleDriver' => 'Drivers/OracleDriver.php',
|
||||
'Dibi\Drivers\PdoDriver' => 'Drivers/PdoDriver.php',
|
||||
'Dibi\Drivers\PostgreDriver' => 'Drivers/PostgreDriver.php',
|
||||
'Dibi\Drivers\Sqlite3Driver' => 'Drivers/Sqlite3Driver.php',
|
||||
'Dibi\Drivers\SqliteReflector' => 'Drivers/SqliteReflector.php',
|
||||
'Dibi\Drivers\SqlsrvDriver' => 'Drivers/SqlsrvDriver.php',
|
||||
'Dibi\Drivers\SqlsrvReflector' => 'Drivers/SqlsrvReflector.php',
|
||||
'Dibi\Event' => 'Event.php',
|
||||
'Dibi\Exception' => 'exceptions.php',
|
||||
'Dibi\Fluent' => 'Fluent.php',
|
||||
'Dibi\ForeignKeyConstraintViolationException' => 'exceptions.php',
|
||||
'Dibi\HashMap' => 'HashMap.php',
|
||||
'Dibi\HashMapBase' => 'HashMap.php',
|
||||
'Dibi\Helpers' => 'Helpers.php',
|
||||
@@ -48,6 +50,7 @@ spl_autoload_register(function ($class) {
|
||||
'Dibi\Loggers\FileLogger' => 'Loggers/FileLogger.php',
|
||||
'Dibi\Loggers\FirePhpLogger' => 'Loggers/FirePhpLogger.php',
|
||||
'Dibi\NotImplementedException' => 'exceptions.php',
|
||||
'Dibi\NotNullConstraintViolationException' => 'exceptions.php',
|
||||
'Dibi\NotSupportedException' => 'exceptions.php',
|
||||
'Dibi\PcreException' => 'exceptions.php',
|
||||
'Dibi\ProcedureException' => 'exceptions.php',
|
||||
@@ -65,8 +68,8 @@ spl_autoload_register(function ($class) {
|
||||
'Dibi\Strict' => 'Strict.php',
|
||||
'Dibi\Translator' => 'Translator.php',
|
||||
'Dibi\Type' => 'Type.php',
|
||||
'Dibi\UniqueConstraintViolationException' => 'exceptions.php',
|
||||
], $old2new = [
|
||||
'Dibi' => 'dibi.php',
|
||||
'DibiColumnInfo' => 'Dibi\Reflection\Column',
|
||||
'DibiConnection' => 'Dibi\Connection',
|
||||
'DibiDatabaseInfo' => 'Dibi\Reflection\Database',
|
||||
|
4
tests/.coveralls.yml
Normal file
4
tests/.coveralls.yml
Normal file
@@ -0,0 +1,4 @@
|
||||
# for php-coveralls
|
||||
service_name: travis-ci
|
||||
coverage_clover: coverage.xml
|
||||
json_path: coverage.json
|
@@ -73,13 +73,13 @@ system = sqlsrv
|
||||
;password = "Password12!"
|
||||
;system = sqlsrv
|
||||
|
||||
[sqlsrv 2014]
|
||||
driver = sqlsrv
|
||||
host = "(local)\SQL2014"
|
||||
database = master
|
||||
username = sa
|
||||
password = "Password12!"
|
||||
system = sqlsrv
|
||||
;[sqlsrv 2014]
|
||||
;driver = sqlsrv
|
||||
;host = "(local)\SQL2014"
|
||||
;database = master
|
||||
;username = sa
|
||||
;password = "Password12!"
|
||||
;system = sqlsrv
|
||||
|
||||
;[sqlsrv 2014-pdo]
|
||||
;driver = pdo
|
||||
|
@@ -29,10 +29,22 @@ test(function () use ($config) { // lazy
|
||||
|
||||
|
||||
test(function () use ($config) { // query string
|
||||
$conn = new Connection(http_build_query($config, NULL, '&'));
|
||||
$conn = new Connection(http_build_query($config, '', '&'));
|
||||
Assert::true($conn->isConnected());
|
||||
|
||||
Assert::null($conn->getConfig('lazy'));
|
||||
Assert::same($config['driver'], $conn->getConfig('driver'));
|
||||
Assert::type('Dibi\Driver', $conn->getDriver());
|
||||
});
|
||||
|
||||
|
||||
test(function () use ($config) {
|
||||
$conn = new Connection($config);
|
||||
Assert::true($conn->isConnected());
|
||||
|
||||
$conn->disconnect();
|
||||
Assert::false($conn->isConnected());
|
||||
|
||||
$conn->disconnect();
|
||||
Assert::false($conn->isConnected());
|
||||
});
|
||||
|
@@ -10,7 +10,7 @@ class MockDriver extends Dibi\Drivers\SqlsrvDriver
|
||||
function __construct()
|
||||
{}
|
||||
|
||||
function connect(array & $config)
|
||||
function connect(array &$config)
|
||||
{}
|
||||
|
||||
function query($sql)
|
||||
|
@@ -26,19 +26,19 @@ Assert::same(
|
||||
(string) $fluent
|
||||
);
|
||||
|
||||
$fluent->from('table')->as('tableAlias')
|
||||
$fluent->from('table')->as('table.Alias')
|
||||
->innerJoin('table1')->on('table.col = table1.col')
|
||||
->innerJoin('table2')->on('table.col = table2.col');
|
||||
|
||||
Assert::same(
|
||||
reformat('SELECT * , [a] , [b] AS [bAlias] , [c], [d], [e] , [d] FROM [table] AS [tableAlias] INNER JOIN [table1] ON table.col = table1.col INNER JOIN [table2] ON table.col = table2.col'),
|
||||
reformat('SELECT * , [a] , [b] AS [bAlias] , [c], [d], [e] , [d] FROM [table] AS [table.Alias] INNER JOIN [table1] ON table.col = table1.col INNER JOIN [table2] ON table.col = table2.col'),
|
||||
(string) $fluent
|
||||
);
|
||||
|
||||
$fluent->from('anotherTable');
|
||||
|
||||
Assert::same(
|
||||
reformat('SELECT * , [a] , [b] AS [bAlias] , [c], [d], [e] , [d] FROM [table] AS [tableAlias] INNER JOIN [table1] ON table.col = table1.col INNER JOIN [table2] ON table.col = table2.col , [anotherTable]'),
|
||||
reformat('SELECT * , [a] , [b] AS [bAlias] , [c], [d], [e] , [d] FROM [table] AS [table.Alias] INNER JOIN [table1] ON table.col = table1.col INNER JOIN [table2] ON table.col = table2.col , [anotherTable]'),
|
||||
(string) $fluent
|
||||
);
|
||||
|
||||
|
@@ -15,7 +15,7 @@ class MockResult extends Dibi\Result
|
||||
{
|
||||
$normalize = new ReflectionMethod('Dibi\Result', 'normalize');
|
||||
$normalize->setAccessible(TRUE);
|
||||
$normalize->invokeArgs($this, [& $row]);
|
||||
$normalize->invokeArgs($this, [&$row]);
|
||||
return $row;
|
||||
}
|
||||
}
|
||||
@@ -139,7 +139,7 @@ test(function () {
|
||||
Assert::same(['col' => 1], $result->test(['col' => TRUE]));
|
||||
Assert::same(['col' => 0], $result->test(['col' => FALSE]));
|
||||
|
||||
Assert::same(['col' => 0], $result->test(['col' => '']));
|
||||
Assert::same(['col' => 0], @$result->test(['col' => ''])); // triggers warning in PHP 7.1
|
||||
Assert::same(['col' => 0], $result->test(['col' => '0']));
|
||||
Assert::same(['col' => 1], $result->test(['col' => '1']));
|
||||
Assert::same(['col' => 10], $result->test(['col' => '10']));
|
||||
|
28
tests/dibi/Sqlsrv.insert.phpt
Normal file
28
tests/dibi/Sqlsrv.insert.phpt
Normal file
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @dataProvider? ../databases.ini sqlsrv
|
||||
*/
|
||||
|
||||
use Tester\Assert;
|
||||
|
||||
require __DIR__ . '/bootstrap.php';
|
||||
|
||||
$conn = new Dibi\Connection($config);
|
||||
$conn->loadFile(__DIR__ . "/data/sqlsrv.insert.sql");
|
||||
|
||||
for ($i = 1; $i <= 5; $i++) {
|
||||
$conn->query('INSERT INTO %n DEFAULT VALUES', 'aaa');
|
||||
Assert::equal($i, $conn->getInsertId());
|
||||
}
|
||||
|
||||
$conn->query('INSERT INTO %n DEFAULT VALUES', 'aab');
|
||||
Assert::equal(1, $conn->getInsertId());
|
||||
|
||||
$conn->query(
|
||||
'CREATE TRIGGER %n ON %n AFTER INSERT AS INSERT INTO %n DEFAULT VALUES',
|
||||
'UpdAAB', 'aab', 'aaa'
|
||||
);
|
||||
|
||||
$conn->query('INSERT INTO %n DEFAULT VALUES', 'aab');
|
||||
Assert::equal(2, $conn->getInsertId());
|
@@ -280,7 +280,7 @@ $array2 = ['one', 'two', 'three'];
|
||||
$array3 = [
|
||||
'col1' => 'one',
|
||||
'col2' => 'two',
|
||||
'col3' => 'three',
|
||||
'col3' => 'thr.ee',
|
||||
];
|
||||
$array4 = [
|
||||
'a' => 12,
|
||||
@@ -301,8 +301,8 @@ WHERE (`test`.`a` LIKE '1995-03-01'
|
||||
OR `b2` IN ('1', '2', '3' )
|
||||
OR `b3` IN ( )
|
||||
OR `b4` IN ( 'one', 'two', 'three' )
|
||||
OR `b5` IN (`col1` AS `one`, `col2` AS `two`, `col3` AS `three` )
|
||||
OR `b6` IN ('one', 'two', 'three')
|
||||
OR `b5` IN (`col1` AS `one`, `col2` AS `two`, `col3` AS `thr.ee` )
|
||||
OR `b6` IN ('one', 'two', 'thr.ee')
|
||||
OR `b7` IN (NULL)
|
||||
OR `b8` IN (RAND() `col1` > `col2` )
|
||||
OR `b9` IN (RAND(), [col1] > [col2] )
|
||||
@@ -322,8 +322,8 @@ WHERE ("test"."a" LIKE \'1995-03-01\'
|
||||
OR "b2" IN (\'1\', \'2\', \'3\' )
|
||||
OR "b3" IN ( )
|
||||
OR "b4" IN ( \'one\', \'two\', \'three\' )
|
||||
OR "b5" IN ("col1" AS "one", "col2" AS "two", "col3" AS "three" )
|
||||
OR "b6" IN (\'one\', \'two\', \'three\')
|
||||
OR "b5" IN ("col1" AS "one", "col2" AS "two", "col3" AS "thr.ee" )
|
||||
OR "b6" IN (\'one\', \'two\', \'thr.ee\')
|
||||
OR "b7" IN (NULL)
|
||||
OR "b8" IN (RAND() "col1" > "col2" )
|
||||
OR "b9" IN (RAND(), [col1] > [col2] )
|
||||
@@ -343,8 +343,8 @@ WHERE ([test].[a] LIKE #03/01/1995#
|
||||
OR [b2] IN ('1', '2', '3' )
|
||||
OR [b3] IN ( )
|
||||
OR [b4] IN ( 'one', 'two', 'three' )
|
||||
OR [b5] IN ([col1] AS [one], [col2] AS [two], [col3] AS [three] )
|
||||
OR [b6] IN ('one', 'two', 'three')
|
||||
OR [b5] IN ([col1] AS [one], [col2] AS [two], [col3] AS [thr.ee] )
|
||||
OR [b6] IN ('one', 'two', 'thr.ee')
|
||||
OR [b7] IN (NULL)
|
||||
OR [b8] IN (RAND() [col1] > [col2] )
|
||||
OR [b9] IN (RAND(), [col1] > [col2] )
|
||||
@@ -364,8 +364,8 @@ WHERE ([test].[a] LIKE '1995-03-01'
|
||||
OR [b2] IN ('1', '2', '3' )
|
||||
OR [b3] IN ( )
|
||||
OR [b4] IN ( 'one', 'two', 'three' )
|
||||
OR [b5] IN ([col1] AS [one], [col2] AS [two], [col3] AS [three] )
|
||||
OR [b6] IN ('one', 'two', 'three')
|
||||
OR [b5] IN ([col1] AS [one], [col2] AS [two], [col3] AS [thr.ee] )
|
||||
OR [b6] IN ('one', 'two', 'thr.ee')
|
||||
OR [b7] IN (NULL)
|
||||
OR [b8] IN (RAND() [col1] > [col2] )
|
||||
OR [b9] IN (RAND(), [col1] > [col2] )
|
||||
@@ -522,7 +522,7 @@ Assert::same(
|
||||
|
||||
Assert::same(
|
||||
reformat('INSERT INTO 0'),
|
||||
$conn->translate('INSERT INTO %f', 'ahoj')
|
||||
@$conn->translate('INSERT INTO %f', 'ahoj') // triggers warning in PHP 7.1
|
||||
);
|
||||
|
||||
|
||||
@@ -542,6 +542,12 @@ Assert::same(
|
||||
);
|
||||
|
||||
|
||||
Assert::same(
|
||||
reformat('SELECT [a].[b] AS [c.d]'),
|
||||
$conn->translate('SELECT %n AS %N', 'a.b', 'c.d')
|
||||
);
|
||||
|
||||
|
||||
setLocale(LC_ALL, 'czech');
|
||||
|
||||
Assert::same(
|
||||
|
@@ -1,5 +1,3 @@
|
||||
/*!40102 SET storage_engine = InnoDB */;
|
||||
|
||||
DROP DATABASE IF EXISTS dibi_test;
|
||||
CREATE DATABASE dibi_test;
|
||||
USE dibi_test;
|
||||
|
5
tests/dibi/data/sqlsrv.insert.sql
Normal file
5
tests/dibi/data/sqlsrv.insert.sql
Normal file
@@ -0,0 +1,5 @@
|
||||
IF OBJECT_ID('aaa', 'U') IS NOT NULL DROP TABLE aaa;
|
||||
IF OBJECT_ID('aab', 'U') IS NOT NULL DROP TABLE aab;
|
||||
|
||||
CREATE TABLE aaa ( [id] int NOT NULL IDENTITY PRIMARY KEY )
|
||||
CREATE TABLE aab ( [id] int NOT NULL IDENTITY PRIMARY KEY )
|
17
tests/php7-win.ini
Normal file
17
tests/php7-win.ini
Normal file
@@ -0,0 +1,17 @@
|
||||
[PHP]
|
||||
extension_dir = "./ext"
|
||||
;extension=php_mssql.dll
|
||||
extension=php_mysqli.dll
|
||||
;extension=php_oci8.dll
|
||||
;extension=php_oci8_11g.dll
|
||||
;extension=php_pdo_firebird.dll
|
||||
;extension=php_pdo_mssql.dll
|
||||
extension=php_pdo_mysql.dll
|
||||
;extension=php_pdo_oci.dll
|
||||
extension=php_pdo_odbc.dll
|
||||
extension=php_pdo_pgsql.dll
|
||||
extension=php_pdo_sqlite.dll
|
||||
extension=php_pgsql.dll
|
||||
extension=php_sqlite3.dll
|
||||
extension=php_sqlsrv_ts.dll
|
||||
extension=php_odbc.dll
|
Reference in New Issue
Block a user