1
0
mirror of https://github.com/dg/dibi.git synced 2025-09-02 18:42:36 +02:00

Compare commits

...

17 Commits

Author SHA1 Message Date
David Grudl
a57f3dfc83 Released version 2.2.3 2015-01-13 06:07:08 +01:00
David Grudl
2702de6ccb composer.json: removed branch alias 2015-01-13 06:06:10 +01:00
David Grudl
73e1f366d4 removed tests 2015-01-13 06:05:14 +01:00
MartyIX
656cbfc40c DibiFluent: add leftJoin and on to phpdoc. 2015-01-13 06:02:58 +01:00
Petr BAGR Smrkovský
e778096641 DibiResult: float detection locale fix [Closes #154] 2015-01-13 06:01:54 +01:00
David Grudl
68521d69e3 * .travis: added code checker 2015-01-13 06:01:54 +01:00
David Grudl
a68886f51d examples: improved Tracy examples 2015-01-13 06:01:54 +01:00
David Grudl
f534c15f0e Merge pull request #155 from JirkaChadima/dbliblimitsupport
MSSQL: Adds limit support for PDO dblib driver on unix
2014-11-04 23:47:23 +01:00
Jirka Chadima
985f59a2b2 MSSQL: Adds limit support for PDO dblib driver on unix 2014-11-04 11:43:05 +01:00
David Grudl
6fc99254ab Merge pull request #152 from zeleznypa/master
Oracle does not support any brackets around table name
2014-10-26 14:01:41 +01:00
Pavel Zelezny
dc688f3ee7 Oracle use double quotes for escaping 2014-10-26 13:56:34 +01:00
David Grudl
cde5af7cbe Merge pull request #142 from JanRossler/multi-search-path
PostgreSQL: fixed identifier escaping in reflection.
2014-07-16 17:46:08 +02:00
Rossler Jan
7c35e49a1c PostgreSQL: fixed identifier escaping in reflection. 2014-07-16 14:06:14 +02:00
David Grudl
6b08cf0711 Merge pull request #140 from JanRossler/multi-search-path
PostgreSQL: fixed search path resolution in table and column reflection.
2014-07-16 11:46:38 +02:00
David Grudl
4b0ebc76b0 Merge pull request #141 from JanRossler/php52
DibiDateTime: Restored php 5.2 support.
2014-07-15 12:46:42 +02:00
Rossler Jan
5993ea8aaf DibiDateTime: Restored php 5.2 support. 2014-07-15 12:39:51 +02:00
Rossler Jan
f89a2310cc PostgreSQL: fixed search path resolution in table and column reflection. 2014-07-07 01:51:56 +02:00
24 changed files with 51 additions and 333 deletions

2
.gitattributes vendored
View File

@@ -1,4 +1,2 @@
.gitattributes export-ignore .gitattributes export-ignore
.gitignore export-ignore .gitignore export-ignore
.travis.yml export-ignore
tests/ export-ignore

View File

@@ -1,21 +0,0 @@
language: php
php:
- 5.3.3
- 5.4
- 5.5
- 5.6
- hhvm
matrix:
allow_failures:
- php: hhvm
script: vendor/bin/tester tests -s -c tests/php-unix.ini
after_failure:
# Print *.actual content
- for i in $(find tests -name \*.actual); do echo "--- $i"; cat $i; echo; echo; done
before_script:
# Install Nette Tester
- composer install --no-interaction --dev --prefer-source

View File

@@ -14,18 +14,12 @@
"php": ">=5.2.0" "php": ">=5.2.0"
}, },
"require-dev": { "require-dev": {
"tracy/tracy": "~2.2", "tracy/tracy": "~2.2"
"nette/tester": "~1.1"
}, },
"replace": { "replace": {
"dg/dibi": "self.version" "dg/dibi": "self.version"
}, },
"autoload": { "autoload": {
"classmap": ["dibi/"] "classmap": ["dibi/"]
},
"extra": {
"branch-alias": {
"dev-master": "2.2-dev"
}
} }
} }

View File

@@ -255,6 +255,7 @@ class DibiPdoDriver extends DibiObject implements IDibiDriver, IDibiResultDriver
case 'mysql': case 'mysql':
return '`' . str_replace('`', '``', $value) . '`'; return '`' . str_replace('`', '``', $value) . '`';
case 'oci':
case 'pgsql': case 'pgsql':
return '"' . str_replace('"', '""', $value) . '"'; return '"' . str_replace('"', '""', $value) . '"';
@@ -263,7 +264,6 @@ class DibiPdoDriver extends DibiObject implements IDibiDriver, IDibiResultDriver
return '[' . strtr($value, '[]', ' ') . ']'; return '[' . strtr($value, '[]', ' ') . ']';
case 'odbc': case 'odbc':
case 'oci': // TODO: not tested
case 'mssql': case 'mssql':
return '[' . str_replace(array('[', ']'), array('[[', ']]'), $value) . ']'; return '[' . str_replace(array('[', ']'), array('[[', ']]'), $value) . ']';
@@ -359,6 +359,7 @@ class DibiPdoDriver extends DibiObject implements IDibiDriver, IDibiResultDriver
break; break;
case 'odbc': case 'odbc':
case 'dblib':
case 'mssql': case 'mssql':
case 'sqlsrv': case 'sqlsrv':
if ($offset < 1) { if ($offset < 1) {

View File

@@ -450,7 +450,7 @@ class DibiPostgreDriver extends DibiObject implements IDibiDriver, IDibiResultDr
FROM FROM
information_schema.tables information_schema.tables
WHERE WHERE
table_schema = current_schema()"; table_schema = ANY (current_schemas(false))";
if ($version >= 9.3) { if ($version >= 9.3) {
$query .= " $query .= "
@@ -460,7 +460,7 @@ class DibiPostgreDriver extends DibiObject implements IDibiDriver, IDibiResultDr
FROM FROM
pg_matviews pg_matviews
WHERE WHERE
schemaname = current_schema()"; schemaname = ANY (current_schemas(false))";
} }
$res = $this->query($query); $res = $this->query($query);
@@ -476,20 +476,22 @@ class DibiPostgreDriver extends DibiObject implements IDibiDriver, IDibiResultDr
*/ */
public function getColumns($table) public function getColumns($table)
{ {
$_table = $this->escape($table, dibi::TEXT); $_table = $this->escape($this->escape($table, dibi::IDENTIFIER), dibi::TEXT);
$res = $this->query(" $res = $this->query("
SELECT indkey SELECT indkey
FROM pg_class FROM pg_class
LEFT JOIN pg_index on pg_class.oid = pg_index.indrelid AND pg_index.indisprimary LEFT JOIN pg_index on pg_class.oid = pg_index.indrelid AND pg_index.indisprimary
WHERE pg_class.relname = $_table WHERE pg_class.oid = $_table::regclass
"); ");
$primary = (int) pg_fetch_object($res->resultSet)->indkey; $primary = (int) pg_fetch_object($res->resultSet)->indkey;
$res = $this->query(" $res = $this->query("
SELECT * SELECT *
FROM information_schema.columns FROM information_schema.columns c
WHERE table_name = $_table AND table_schema = current_schema() JOIN pg_class ON pg_class.relname = c.table_name
ORDER BY ordinal_position JOIN pg_namespace nsp ON nsp.oid = pg_class.relnamespace AND nsp.nspname = c.table_schema
WHERE pg_class.oid = $_table::regclass
ORDER BY c.ordinal_position
"); ");
if (!$res->getRowCount()) { if (!$res->getRowCount()) {
@@ -541,11 +543,18 @@ class DibiPostgreDriver extends DibiObject implements IDibiDriver, IDibiResultDr
*/ */
public function getIndexes($table) public function getIndexes($table)
{ {
$_table = $this->escape($table, dibi::TEXT); $_table = $this->escape($this->escape($table, dibi::IDENTIFIER), dibi::TEXT);
$res = $this->query(" $res = $this->query("
SELECT ordinal_position, column_name SELECT
FROM information_schema.columns a.attnum AS ordinal_position,
WHERE table_name = $_table AND table_schema = current_schema() a.attname AS column_name
FROM
pg_attribute a
JOIN pg_class cls ON a.attrelid = cls.oid
WHERE
a.attrelid = $_table::regclass
AND a.attnum > 0
AND NOT a.attisdropped
ORDER BY ordinal_position ORDER BY ordinal_position
"); ");
@@ -559,7 +568,7 @@ class DibiPostgreDriver extends DibiObject implements IDibiDriver, IDibiResultDr
FROM pg_class FROM pg_class
LEFT JOIN pg_index on pg_class.oid = pg_index.indrelid LEFT JOIN pg_index on pg_class.oid = pg_index.indrelid
INNER JOIN pg_class as pg_class2 on pg_class2.oid = pg_index.indexrelid INNER JOIN pg_class as pg_class2 on pg_class2.oid = pg_index.indexrelid
WHERE pg_class.relname = $_table WHERE pg_class.oid = $_table::regclass
"); ");
$indexes = array(); $indexes = array();
@@ -582,7 +591,7 @@ class DibiPostgreDriver extends DibiObject implements IDibiDriver, IDibiResultDr
*/ */
public function getForeignKeys($table) public function getForeignKeys($table)
{ {
$_table = $this->escape($table, dibi::TEXT); $_table = $this->escape($this->escape($table, dibi::IDENTIFIER), dibi::TEXT);
$res = $this->query(" $res = $this->query("
SELECT SELECT

View File

@@ -39,8 +39,8 @@ class dibi
FIELD_TIME = dibi::TIME; FIELD_TIME = dibi::TIME;
/** version */ /** version */
const VERSION = '2.2.2', const VERSION = '2.2.3',
REVISION = 'released on 2014-06-30'; REVISION = 'released on 2015-01-13';
/** sorting order */ /** sorting order */
const ASC = 'ASC', const ASC = 'ASC',

View File

@@ -44,7 +44,7 @@ class DibiDateTime extends DateTime
public function setTimestamp($timestamp) public function setTimestamp($timestamp)
{ {
$zone = PHP_VERSION_ID === 50206 ? new \DateTimeZone($this->getTimezone()->getName()) : $this->getTimezone(); $zone = PHP_VERSION_ID === 50206 ? new DateTimeZone($this->getTimezone()->getName()) : $this->getTimezone();
$this->__construct('@' . $timestamp); $this->__construct('@' . $timestamp);
$this->setTimeZone($zone); $this->setTimeZone($zone);
return $this; return $this;

View File

@@ -24,6 +24,8 @@
* @method DibiFluent orderBy($field) * @method DibiFluent orderBy($field)
* @method DibiFluent limit(int $limit) * @method DibiFluent limit(int $limit)
* @method DibiFluent offset(int $offset) * @method DibiFluent offset(int $offset)
* @method DibiFluent leftJoin($table)
* @method DibiFluent on($cond)
*/ */
class DibiFluent extends DibiObject implements IDataSource class DibiFluent extends DibiObject implements IDataSource
{ {

View File

@@ -500,7 +500,7 @@ class DibiResult extends DibiObject implements IDataSource
$row[$key] = is_float($tmp = $value * 1) ? $value : $tmp; $row[$key] = is_float($tmp = $value * 1) ? $value : $tmp;
} elseif ($type === dibi::FLOAT) { } elseif ($type === dibi::FLOAT) {
$row[$key] = ltrim((string) ($tmp = (float) $value), '0') === ltrim(rtrim(rtrim($value, '0'), '.'), '0') ? $tmp : $value; $row[$key] = str_replace(',', '.', ltrim((string) ($tmp = (float) $value), '0')) === ltrim(rtrim(rtrim($value, '0'), '.'), '0') ? $tmp : $value;
} elseif ($type === dibi::BOOL) { } elseif ($type === dibi::BOOL) {
$row[$key] = ((bool) $value) && $value !== 'f' && $value !== 'F'; $row[$key] = ((bool) $value) && $value !== 'f' && $value !== 'F';

View File

@@ -2,11 +2,7 @@
<h1>Tracy & SQL Exceptions | dibi</h1> <h1>Tracy & SQL Exceptions | dibi</h1>
<p>Dibi can display and log exceptions via Tracy, part of Nette Framework.</p> <p>Dibi can display and log exceptions via <a href="http://tracy.nette.org">Tracy</a>.</p>
<ul>
<li>Tracy Debugger: http://tracy.nette.org
</ul>
<?php <?php
@@ -15,10 +11,11 @@ if (@!include __DIR__ . '/../vendor/autoload.php') {
} }
// enable Tracy
Tracy\Debugger::enable(); Tracy\Debugger::enable();
dibi::connect(array( $connection = dibi::connect(array(
'driver' => 'sqlite3', 'driver' => 'sqlite3',
'database' => 'data/sample.s3db', 'database' => 'data/sample.s3db',
'profiler' => array( 'profiler' => array(
@@ -27,17 +24,9 @@ dibi::connect(array(
)); ));
// throws error because SQL is bad // add panel to debug bar
dibi::query('SELECT * FROM customers WHERE customer_id < ?', 38); $panel = new Dibi\Bridges\Tracy\Panel;
$panel->register($connection);
dibi::connect(array(
'driver' => 'sqlite3',
'database' => 'data/sample.s3db',
'profiler' => array(
'run' => TRUE,
)
));
// throws error because SQL is bad // throws error because SQL is bad

View File

@@ -2,13 +2,9 @@
<style> html { background: url(data/arrow.png) no-repeat bottom right; height: 100%; } </style> <style> html { background: url(data/arrow.png) no-repeat bottom right; height: 100%; } </style>
<h1>Tracy & Variables | dibi</h1> <h1>Tracy | dibi</h1>
<p>Dibi can dump variables via Tracy, part of Nette Framework.</p> <p>Dibi can log queries and dump variables to the <a href="http://tracy.nette.org">Tracy</a>.</p>
<ul>
<li>Tracy Debugger: http://tracy.nette.org
</ul>
<?php <?php
@@ -17,10 +13,11 @@ if (@!include __DIR__ . '/../vendor/autoload.php') {
} }
// enable Tracy
Tracy\Debugger::enable(); Tracy\Debugger::enable();
dibi::connect(array( $connection = dibi::connect(array(
'driver' => 'sqlite3', 'driver' => 'sqlite3',
'database' => 'data/sample.s3db', 'database' => 'data/sample.s3db',
'profiler' => array( 'profiler' => array(
@@ -29,4 +26,13 @@ dibi::connect(array(
)); ));
// add panel to debug bar
$panel = new Dibi\Bridges\Tracy\Panel;
$panel->register($connection);
// query will be logged
dibi::query('SELECT 123');
// result set will be dumped
Tracy\Debugger::barDump( dibi::fetchAll('SELECT * FROM customers WHERE customer_id < ?', 38), '[customers]' ); Tracy\Debugger::barDump( dibi::fetchAll('SELECT * FROM customers WHERE customer_id < ?', 38), '[customers]' );

View File

@@ -2,7 +2,6 @@
========================================================= =========================================================
[![Downloads this Month](https://img.shields.io/packagist/dm/dibi/dibi.svg)](https://packagist.org/packages/dibi/dibi) [![Downloads this Month](https://img.shields.io/packagist/dm/dibi/dibi.svg)](https://packagist.org/packages/dibi/dibi)
[![Build Status](https://travis-ci.org/dg/dibi.svg?branch=master)](https://travis-ci.org/dg/dibi)
Database access functions in PHP are not standardised. This library Database access functions in PHP are not standardised. This library
hides the differences between them, and above all, it gives you a very handy interface. hides the differences between them, and above all, it gives you a very handy interface.

4
tests/.gitignore vendored
View File

@@ -1,4 +0,0 @@
/*/output
/coverage.dat
/test.log
/tmp

View File

@@ -1,40 +0,0 @@
<?php
/**
* Test: Cloning of DibiFluent
*
* @author David Grudl
*/
use Tester\Assert;
require __DIR__ . '/bootstrap.php';
dibi::connect($config['sqlite3']);
$fluent = new DibiFluent(dibi::getConnection());
$fluent->select('*')->from('table')->where('x=1');
$dolly = clone $fluent;
$dolly->where('y=1');
$dolly->clause('FOO');
Assert::same( 'SELECT * FROM [table] WHERE x=1', (string) $fluent );
Assert::same( 'SELECT * FROM [table] WHERE x=1 AND y=1 FOO', (string) $dolly );
$fluent = dibi::select('id')->from('table')->where('id = %i',1);
$dolly = clone $fluent;
$dolly->where('cd = %i',5);
Assert::same( 'SELECT [id] FROM [table] WHERE id = 1', (string) $fluent );
Assert::same( 'SELECT [id] FROM [table] WHERE id = 1 AND cd = 5', (string) $dolly );
$fluent = dibi::select("*")->from("table");
$dolly = clone $fluent;
$dolly->removeClause("select")->select("count(*)");
Assert::same( 'SELECT * FROM [table]', (string) $fluent );
Assert::same( 'SELECT count(*) FROM [table]', (string) $dolly );

View File

@@ -1,23 +0,0 @@
<?php
/**
* Test: DateTimeInterface of DibiTranslator
*
* @author Patrik Votoček
* @phpversion 5.5
*/
use Tester\Assert;
require __DIR__ . '/bootstrap.php';
$connection = new DibiConnection(array(
'driver' => 'sqlite3',
'database' => ':memory:',
));
$translator = new DibiTranslator($connection);
$datetime = new DateTime('1978-01-23 00:00:00');
Assert::equal($datetime->format('U'), $translator->formatValue(new DateTime($datetime->format('c')), NULL));
Assert::equal($datetime->format('U'), $translator->formatValue(new DateTimeImmutable($datetime->format('c')), NULL));

View File

@@ -1,18 +0,0 @@
<?php
// The Nette Tester command-line runner can be
// invoked through the command: ../../vendor/bin/tester .
if (@!include __DIR__ . '/../../vendor/autoload.php') {
echo 'Install Nette Tester using `composer update --dev`';
exit(1);
}
// configure environment
Tester\Environment::setup();
date_default_timezone_set('Europe/Prague');
// load connections
$config = require __DIR__ . '/config.php';

View File

@@ -1,77 +0,0 @@
<?php
return array(
'mysql' => array(
'driver' => 'mysql',
'host' => 'localhost',
'username' => 'root',
'password' => 'xxx',
'charset' => 'utf8',
),
'mysqli' => array(
'driver' => 'mysqli',
'host' => 'localhost',
'username' => 'dibi',
'password' => 'dibi',
'charset' => 'utf8',
),
'sqlite' => array(
'driver' => 'sqlite',
'database' => dirname(__FILE__) . '/data/sample.sdb',
),
'sqlite3' => array(
'driver' => 'sqlite3',
'database' => dirname(__FILE__) . '/data/sample.sdb3',
),
'odbc' => array(
'driver' => 'odbc',
'username' => 'dibi',
'password' => 'dibi',
'dsn' => 'Driver={Microsoft Access Driver (*.mdb)};Dbq=' . dirname(__FILE__) . '/data/sample.mdb',
),
'postgresql' => array(
'driver' => 'postgre',
'host' => 'localhost',
'port' => '5432',
'username' => 'dibi',
'password' => 'dibi',
'persistent' => '1',
),
'sqlite-pdo' => array(
'driver' => 'pdo',
'dsn' => 'sqlite2::' . dirname(__FILE__) . '/data/sample.sdb',
),
'mysql-pdo' => array(
'driver' => 'pdo',
'dsn' => 'mysql:host=localhost',
'username' => 'dibi',
'password' => 'dibi',
),
'mssql' => array(
'driver' => 'mssql',
'host' => 'localhost',
'username' => 'dibi',
'password' => 'dibi',
),
'mssql2005' => array(
'driver' => 'mssql2005',
'host' => '(local)',
'username' => 'dibi',
'password' => 'dibi',
),
'oracle' => array(
'driver' => 'oracle',
'username' => 'dibi',
'password' => 'dibi',
),
);

Binary file not shown.

View File

@@ -1,92 +0,0 @@
-- MySQL: 5.0.45
SET FOREIGN_KEY_CHECKS=0;
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
-- --------------------------------------------------------
DROP TABLE IF EXISTS `customers`;
CREATE TABLE IF NOT EXISTS `customers` (
`customer_id` int(11) NOT NULL auto_increment,
`name` varchar(100) default NULL,
PRIMARY KEY (`customer_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=7 ;
INSERT INTO `customers` (`customer_id`, `name`) VALUES
(1, 'Dave Lister'),
(2, 'Arnold Rimmer'),
(3, 'The Cat'),
(4, 'Holly'),
(5, 'Kryten'),
(6, 'Kristine Kochanski');
-- --------------------------------------------------------
DROP TABLE IF EXISTS `enumtest`;
CREATE TABLE IF NOT EXISTS `enumtest` (
`id` int(11) NOT NULL auto_increment,
`test` enum('a','b','c') NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
-- --------------------------------------------------------
DROP TABLE IF EXISTS `orders`;
CREATE TABLE IF NOT EXISTS `orders` (
`order_id` int(11) NOT NULL,
`customer_id` int(11) NOT NULL,
`product_id` int(11) NOT NULL,
`amount` float NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `orders` (`order_id`, `customer_id`, `product_id`, `amount`) VALUES
(1, 2, 1, 7),
(2, 2, 3, 2),
(3, 1, 2, 3),
(4, 6, 3, 5);
-- --------------------------------------------------------
DROP TABLE IF EXISTS `products`;
CREATE TABLE IF NOT EXISTS `products` (
`product_id` int(11) NOT NULL auto_increment,
`title` varchar(100) default NULL,
PRIMARY KEY (`product_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
INSERT INTO `products` (`product_id`, `title`) VALUES
(1, 'Chair'),
(2, 'Table'),
(3, 'Computer');
-- --------------------------------------------------------
DROP TABLE IF EXISTS `settest`;
CREATE TABLE IF NOT EXISTS `settest` (
`id` int(11) NOT NULL auto_increment,
`test` set('a','b','c') NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
-- --------------------------------------------------------
DROP TABLE IF EXISTS `where`;
CREATE TABLE IF NOT EXISTS `where` (
`select` int(11) NOT NULL,
`dot.dot` int(11) NOT NULL,
`is` int(11) NOT NULL,
`quot'n' space` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `where` (`select`, `dot.dot`, `is`, `quot'n' space`) VALUES
(1, 2, 3, 4);
SET FOREIGN_KEY_CHECKS=1;
SET SQL_MODE="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";

Binary file not shown.

Binary file not shown.

View File

@@ -1,2 +0,0 @@
[PHP]
;extension_dir = "./ext"

View File

@@ -1,3 +0,0 @@
[PHP]
extension_dir = "./ext"
extension=php_sqlite3.dll

View File

@@ -1 +1 @@
Dibi 2.2.2 (released on 2014-06-30) Dibi 2.2.3 (released on 2015-01-13)