summaryrefslogtreecommitdiff
path: root/vendor
diff options
context:
space:
mode:
authorAndrew Dolgov <[email protected]>2022-07-16 16:30:46 +0300
committerAndrew Dolgov <[email protected]>2022-07-16 16:30:46 +0300
commitb8c1d622a77226b14fb307cfe3e0f4cea9e4268a (patch)
tree3df519798dcfef20c96a079e0956ebcd5509b619 /vendor
parentfdd1c43612011060b4b876db438eb7ec62dd077d (diff)
add missing files for forked idiorm
Diffstat (limited to 'vendor')
-rw-r--r--vendor/j4mie/idiorm/.gitattributes5
-rw-r--r--vendor/j4mie/idiorm/.gitignore7
-rw-r--r--vendor/j4mie/idiorm/.travis.yml42
-rw-r--r--vendor/j4mie/idiorm/phpunit.xml12
-rw-r--r--vendor/j4mie/idiorm/test/CacheIntegrationTest.php43
-rw-r--r--vendor/j4mie/idiorm/test/CacheTest.php42
-rw-r--r--vendor/j4mie/idiorm/test/CacheTest53.php82
-rw-r--r--vendor/j4mie/idiorm/test/ConfigTest.php125
-rw-r--r--vendor/j4mie/idiorm/test/ConfigTest53.php36
-rw-r--r--vendor/j4mie/idiorm/test/IdiormResultSetTest.php81
-rw-r--r--vendor/j4mie/idiorm/test/MulitpleConnectionTest.php52
-rw-r--r--vendor/j4mie/idiorm/test/ORMTest.php185
-rw-r--r--vendor/j4mie/idiorm/test/QueryBuilderMssqlTest.php32
-rw-r--r--vendor/j4mie/idiorm/test/QueryBuilderPsr1Test53.php582
-rw-r--r--vendor/j4mie/idiorm/test/QueryBuilderTest.php696
-rw-r--r--vendor/j4mie/idiorm/test/bootstrap.php126
-rw-r--r--vendor/j4mie/idiorm/test/docker_for_php52/Dockerfile182
-rw-r--r--vendor/j4mie/idiorm/test/docker_for_php52/README.md23
-rw-r--r--vendor/j4mie/idiorm/test/docker_for_php52/php.ini1342
19 files changed, 3695 insertions, 0 deletions
diff --git a/vendor/j4mie/idiorm/.gitattributes b/vendor/j4mie/idiorm/.gitattributes
new file mode 100644
index 000000000..be8c7b340
--- /dev/null
+++ b/vendor/j4mie/idiorm/.gitattributes
@@ -0,0 +1,5 @@
+.gitignore export-ignore
+.gitattributes export-ignore
+/test export-ignore
+.travis.yml export-ignore
+phpunit.xml export-ignore
diff --git a/vendor/j4mie/idiorm/.gitignore b/vendor/j4mie/idiorm/.gitignore
new file mode 100644
index 000000000..34b5c58a7
--- /dev/null
+++ b/vendor/j4mie/idiorm/.gitignore
@@ -0,0 +1,7 @@
+*.swp
+*.sqlite
+docs/_build
+/phpunit.phar
+/vendor
+/composer.lock
+.DS_Store
diff --git a/vendor/j4mie/idiorm/.travis.yml b/vendor/j4mie/idiorm/.travis.yml
new file mode 100644
index 000000000..fee02856e
--- /dev/null
+++ b/vendor/j4mie/idiorm/.travis.yml
@@ -0,0 +1,42 @@
+language: php
+php:
+ - 5.4
+ - 5.6
+ - 7.0
+ - 7.1
+ - hhvm
+env: PHPV=0
+matrix:
+ include:
+ - php: 5.2
+ dist: precise
+ env: PHPV=52
+ - php: 5.3
+ dist: precise
+before_install: |
+ if [ "$PHPV" -eq 52 ]; then
+ pecl install phar
+ fi
+install: |
+ if [ "$PHPV" -ne 52 ]; then
+ composer install
+ else
+ # special handling for PHP 5.2 testing as there is no composer available
+ export X="$HOME/.idiorm/bin"
+ mkdir -p "$X"
+ curl -sSfL https://github.com/treffynnon/php5.2-phpunit3.6.12-phar/releases/download/1.0.2/php52-phpunit.phar -o "$X/phpunit"
+ chmod +x "$X/phpunit"
+ fi
+script: |
+ if [ "$PHPV" -ne 52 ]; then
+ composer run-script test -- --colors --coverage-text
+ else
+ # special handling for PHP 5.2 testing as there is no composer available
+ # we need phpunit-3.6.12, but there is no phar file for it so comment out for now
+ $X/phpunit --colors --coverage-text
+ fi
+cache:
+ directories:
+ - $HOME/.composer/cache
+ - $HOME/.idiorm
+ - vendor \ No newline at end of file
diff --git a/vendor/j4mie/idiorm/phpunit.xml b/vendor/j4mie/idiorm/phpunit.xml
new file mode 100644
index 000000000..efbc81c44
--- /dev/null
+++ b/vendor/j4mie/idiorm/phpunit.xml
@@ -0,0 +1,12 @@
+<phpunit backupGlobals="true"
+ backupStaticAttributes="false"
+ bootstrap="test/bootstrap.php"
+ cacheTokens="false"
+ colors="true">
+ <testsuites>
+ <testsuite name="Idiorm Test Suite">
+ <directory suffix="Test.php">test</directory>
+ <directory suffix="Test53.php" phpVersion="5.3.0" phpVersionOperator=">=">test</directory>
+ </testsuite>
+ </testsuites>
+</phpunit> \ No newline at end of file
diff --git a/vendor/j4mie/idiorm/test/CacheIntegrationTest.php b/vendor/j4mie/idiorm/test/CacheIntegrationTest.php
new file mode 100644
index 000000000..0a5dc6101
--- /dev/null
+++ b/vendor/j4mie/idiorm/test/CacheIntegrationTest.php
@@ -0,0 +1,43 @@
+<?php
+
+class CacheIntegrationTest extends PHPUnit_Framework_TestCase {
+
+ public function setUp() {
+ ORM::configure('sqlite::memory:');
+ ORM::configure('logging', true);
+ ORM::configure('caching', true);
+
+ ORM::raw_execute('CREATE TABLE `league` ( `class_id` INTEGER )');
+ // needs to be individually inserted to support SQLite before
+ // version 3.7.11
+ ORM::raw_execute('INSERT INTO `league`(`class_id`) VALUES (1)');
+ ORM::raw_execute('INSERT INTO `league`(`class_id`) VALUES (2)');
+ ORM::raw_execute('INSERT INTO `league`(`class_id`) VALUES (3)');
+
+ $x = ORM::for_table('league')->count();
+ $this->assertEquals(3, $x);
+ }
+
+ public function tearDown() {
+ ORM::raw_execute('DROP TABLE `league`');
+ }
+
+ public function testRegressionForPullRequest319() {
+ $rs = ORM::for_table('league')->where('class_id', 1);
+ $total = $rs->count();
+ $this->assertEquals(1, $total);
+ $row = $rs->find_one();
+ $this->assertEquals(array('class_id' => 1), $row->as_array());
+
+ $rs = ORM::for_table('league')->where('class_id', 1);
+ $total = $rs->count();
+ $this->assertEquals(1, $total);
+ try {
+ $row = $rs->find_one();
+ } catch(PDOException $e) {
+ $this->fail("Caching is breaking subsequent queries!\n{$e->getMessage()}");
+ }
+ $this->assertEquals(array('class_id' => 1), $row->as_array());
+ }
+
+}
diff --git a/vendor/j4mie/idiorm/test/CacheTest.php b/vendor/j4mie/idiorm/test/CacheTest.php
new file mode 100644
index 000000000..a3daa91d0
--- /dev/null
+++ b/vendor/j4mie/idiorm/test/CacheTest.php
@@ -0,0 +1,42 @@
+<?php
+
+class CacheTest extends PHPUnit_Framework_TestCase {
+
+ const ALTERNATE = 'alternate'; // Used as name of alternate connection
+
+ public function setUp() {
+ // Set up the dummy database connections
+ ORM::set_db(new MockPDO('sqlite::memory:'));
+ ORM::set_db(new MockDifferentPDO('sqlite::memory:'), self::ALTERNATE);
+
+ // Enable logging
+ ORM::configure('logging', true);
+ ORM::configure('logging', true, self::ALTERNATE);
+ ORM::configure('caching', true);
+ ORM::configure('caching', true, self::ALTERNATE);
+ }
+
+ public function tearDown() {
+ ORM::reset_config();
+ ORM::reset_db();
+ }
+
+ // Test caching. This is a bit of a hack.
+ public function testQueryGenerationOnlyOccursOnce() {
+ ORM::for_table('widget')->where('name', 'Fred')->where('age', 17)->find_one();
+ ORM::for_table('widget')->where('name', 'Bob')->where('age', 42)->find_one();
+ $expected = ORM::get_last_query();
+ ORM::for_table('widget')->where('name', 'Fred')->where('age', 17)->find_one(); // this shouldn't run a query!
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testQueryGenerationOnlyOccursOnceWithMultipleConnections() {
+ // Test caching with multiple connections (also a bit of a hack)
+ ORM::for_table('widget', self::ALTERNATE)->where('name', 'Steve')->where('age', 80)->find_one();
+ ORM::for_table('widget', self::ALTERNATE)->where('name', 'Tom')->where('age', 120)->find_one();
+ $expected = ORM::get_last_query();
+ ORM::for_table('widget', self::ALTERNATE)->where('name', 'Steve')->where('age', 80)->find_one(); // this shouldn't run a query!
+ $this->assertEquals($expected, ORM::get_last_query(self::ALTERNATE));
+ }
+
+} \ No newline at end of file
diff --git a/vendor/j4mie/idiorm/test/CacheTest53.php b/vendor/j4mie/idiorm/test/CacheTest53.php
new file mode 100644
index 000000000..bc30b0aaf
--- /dev/null
+++ b/vendor/j4mie/idiorm/test/CacheTest53.php
@@ -0,0 +1,82 @@
+<?php
+
+class CacheTest53 extends PHPUnit_Framework_TestCase {
+
+ const ALTERNATE = 'alternate'; // Used as name of alternate connection
+
+ public function setUp() {
+ // Set up the dummy database connections
+ ORM::set_db(new MockPDO('sqlite::memory:'));
+ ORM::set_db(new MockDifferentPDO('sqlite::memory:'), self::ALTERNATE);
+
+ // Enable logging
+ ORM::configure('logging', true);
+ ORM::configure('logging', true, self::ALTERNATE);
+ ORM::configure('caching', true);
+ ORM::configure('caching', true, self::ALTERNATE);
+ }
+
+ public function tearDown() {
+ ORM::reset_config();
+ ORM::reset_db();
+ }
+
+
+ public function testCustomCacheCallback() {
+ $phpunit = $this;
+ $my_cache = array();
+ ORM::configure('caching_auto_clear', true);
+
+ ORM::configure('create_cache_key', function ($query, $parameters, $table_name, $connection) use ($phpunit, &$my_cache) {
+ $phpunit->assertEquals(true, is_string($query));
+ $phpunit->assertEquals(true, is_array($parameters));
+ $phpunit->assertEquals(true, is_string($connection));
+ $phpunit->assertEquals('widget', $table_name);
+ $parameter_string = join(',', $parameters);
+ $key = $query . ':' . $parameter_string;
+ $my_key = 'some-prefix'.crc32($key);
+ return $my_key;
+ });
+ ORM::configure('cache_query_result', function ($cache_key, $value, $table_name, $connection_name) use ($phpunit, &$my_cache) {
+ $phpunit->assertEquals(true, is_string($cache_key));
+ $phpunit->assertEquals('widget', $table_name);
+ $my_cache[$cache_key] = $value;
+ });
+ ORM::configure('check_query_cache', function ($cache_key, $table_name, $connection_name) use ($phpunit, &$my_cache) {
+ $phpunit->assertEquals(true, is_string($cache_key));
+ $phpunit->assertEquals(true, is_string($connection_name));
+ $phpunit->assertEquals('widget', $table_name);
+
+ if(isset($my_cache) and isset($my_cache[$cache_key])){
+ $phpunit->assertEquals(true, is_array($my_cache[$cache_key]));
+ return $my_cache[$cache_key];
+ } else {
+ return false;
+ }
+ });
+ ORM::configure('clear_cache', function ($table_name, $connection_name) use ($phpunit, &$my_cache) {
+ $phpunit->assertEquals(true, is_string($table_name));
+ $phpunit->assertEquals(true, is_string($connection_name));
+ $my_cache = array();
+ });
+ ORM::for_table('widget')->where('name', 'Fred')->where('age', 21)->find_one();
+ ORM::for_table('widget')->where('name', 'Fred')->where('age', 21)->find_one();
+ ORM::for_table('widget')->where('name', 'Bob')->where('age', 42)->find_one();
+
+ //our custom cache should be full now
+ $this->assertEquals(true, !empty($my_cache));
+
+ //checking custom cache key
+ foreach($my_cache as $k=>$v){
+ $this->assertEquals('some-prefix', substr($k,0,11));
+ }
+
+ $new = ORM::for_table('widget')->create();
+ $new->name = "Joe";
+ $new->age = 25;
+ $saved = $new->save();
+
+ //our custom cache should be empty now
+ $this->assertEquals(true, empty($my_cache));
+ }
+} \ No newline at end of file
diff --git a/vendor/j4mie/idiorm/test/ConfigTest.php b/vendor/j4mie/idiorm/test/ConfigTest.php
new file mode 100644
index 000000000..c6f4631ad
--- /dev/null
+++ b/vendor/j4mie/idiorm/test/ConfigTest.php
@@ -0,0 +1,125 @@
+<?php
+
+class ConfigTest extends PHPUnit_Framework_TestCase {
+
+ public function setUp() {
+ // Enable logging
+ ORM::configure('logging', true);
+
+ // Set up the dummy database connection
+ $db = new MockPDO('sqlite::memory:');
+ ORM::set_db($db);
+
+ ORM::configure('id_column', 'primary_key');
+ }
+
+ public function tearDown() {
+ ORM::reset_config();
+ ORM::reset_db();
+ }
+
+ protected function setUpIdColumnOverrides() {
+ ORM::configure('id_column_overrides', array(
+ 'widget' => 'widget_id',
+ 'widget_handle' => 'widget_handle_id',
+ ));
+ }
+
+ protected function tearDownIdColumnOverrides() {
+ ORM::configure('id_column_overrides', array());
+ }
+
+ public function testSettingIdColumn() {
+ ORM::for_table('widget')->find_one(5);
+ $expected = "SELECT * FROM `widget` WHERE `primary_key` = '5' LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testSettingIdColumnOverridesOne() {
+ $this->setUpIdColumnOverrides();
+
+ ORM::for_table('widget')->find_one(5);
+ $expected = "SELECT * FROM `widget` WHERE `widget_id` = '5' LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+
+ $this->tearDownIdColumnOverrides();
+ }
+
+ public function testSettingIdColumnOverridesTwo() {
+ $this->setUpIdColumnOverrides();
+
+ ORM::for_table('widget_handle')->find_one(5);
+ $expected = "SELECT * FROM `widget_handle` WHERE `widget_handle_id` = '5' LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+
+ $this->tearDownIdColumnOverrides();
+ }
+
+ public function testSettingIdColumnOverridesThree() {
+ $this->setUpIdColumnOverrides();
+
+ ORM::for_table('widget_nozzle')->find_one(5);
+ $expected = "SELECT * FROM `widget_nozzle` WHERE `primary_key` = '5' LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+
+ $this->tearDownIdColumnOverrides();
+ }
+
+ public function testInstanceIdColumnOne() {
+ $this->setUpIdColumnOverrides();
+
+ ORM::for_table('widget')->use_id_column('new_id')->find_one(5);
+ $expected = "SELECT * FROM `widget` WHERE `new_id` = '5' LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+
+ $this->tearDownIdColumnOverrides();
+ }
+
+ public function testInstanceIdColumnTwo() {
+ $this->setUpIdColumnOverrides();
+
+ ORM::for_table('widget_handle')->use_id_column('new_id')->find_one(5);
+ $expected = "SELECT * FROM `widget_handle` WHERE `new_id` = '5' LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+
+ $this->tearDownIdColumnOverrides();
+ }
+
+ public function testInstanceIdColumnThree() {
+ $this->setUpIdColumnOverrides();
+
+ ORM::for_table('widget_nozzle')->use_id_column('new_id')->find_one(5);
+ $expected = "SELECT * FROM `widget_nozzle` WHERE `new_id` = '5' LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+
+ $this->tearDownIdColumnOverrides();
+ }
+
+ public function testGetConfig() {
+ $this->assertTrue(ORM::get_config('logging'));
+ ORM::configure('logging', false);
+ $this->assertFalse(ORM::get_config('logging'));
+ ORM::configure('logging', true);
+ }
+
+ public function testGetConfigArray() {
+ $expected = array(
+ 'connection_string' => 'sqlite::memory:',
+ 'id_column' => 'primary_key',
+ 'id_column_overrides' => array(),
+ 'error_mode' => PDO::ERRMODE_EXCEPTION,
+ 'username' => null,
+ 'password' => null,
+ 'driver_options' => null,
+ 'identifier_quote_character' => '`',
+ 'logging' => true,
+ 'logger' => null,
+ 'caching' => false,
+ 'caching_auto_clear' => false,
+ 'return_result_sets' => false,
+ 'limit_clause_style' => 'limit',
+ );
+ $this->assertEquals($expected, ORM::get_config());
+ }
+
+}
diff --git a/vendor/j4mie/idiorm/test/ConfigTest53.php b/vendor/j4mie/idiorm/test/ConfigTest53.php
new file mode 100644
index 000000000..ef8af778a
--- /dev/null
+++ b/vendor/j4mie/idiorm/test/ConfigTest53.php
@@ -0,0 +1,36 @@
+<?php
+
+class ConfigTest53 extends PHPUnit_Framework_TestCase {
+
+ public function setUp() {
+ // Enable logging
+ ORM::configure('logging', true);
+
+ // Set up the dummy database connection
+ $db = new MockPDO('sqlite::memory:');
+ ORM::set_db($db);
+
+ ORM::configure('id_column', 'primary_key');
+ }
+
+ public function tearDown() {
+ ORM::configure('logging', false);
+ ORM::set_db(null);
+
+ ORM::configure('id_column', 'id');
+ }
+
+ public function testLoggerCallback() {
+ ORM::configure('logger', function($log_string) {
+ return $log_string;
+ });
+ $function = ORM::get_config('logger');
+ $this->assertTrue(is_callable($function));
+
+ $log_string = "UPDATE `widget` SET `added` = NOW() WHERE `id` = '1'";
+ $this->assertEquals($log_string, $function($log_string));
+
+ ORM::configure('logger', null);
+ }
+
+} \ No newline at end of file
diff --git a/vendor/j4mie/idiorm/test/IdiormResultSetTest.php b/vendor/j4mie/idiorm/test/IdiormResultSetTest.php
new file mode 100644
index 000000000..c458d9972
--- /dev/null
+++ b/vendor/j4mie/idiorm/test/IdiormResultSetTest.php
@@ -0,0 +1,81 @@
+<?php
+
+class IdiormResultSetTest extends PHPUnit_Framework_TestCase {
+
+ public function setUp() {
+ // Enable logging
+ ORM::configure('logging', true);
+
+ // Set up the dummy database connection
+ $db = new MockPDO('sqlite::memory:');
+ ORM::set_db($db);
+ }
+
+ public function tearDown() {
+ ORM::reset_config();
+ ORM::reset_db();
+ }
+
+ public function testGet() {
+ $IdiormResultSet = new IdiormResultSet();
+ $this->assertInternalType('array', $IdiormResultSet->get_results());
+ }
+
+ public function testConstructor() {
+ $result_set = array('item' => new stdClass);
+ $IdiormResultSet = new IdiormResultSet($result_set);
+ $this->assertSame($IdiormResultSet->get_results(), $result_set);
+ }
+
+ public function testSetResultsAndGetResults() {
+ $result_set = array('item' => new stdClass);
+ $IdiormResultSet = new IdiormResultSet();
+ $IdiormResultSet->set_results($result_set);
+ $this->assertSame($IdiormResultSet->get_results(), $result_set);
+ }
+
+ public function testAsArray() {
+ $result_set = array('item' => new stdClass);
+ $IdiormResultSet = new IdiormResultSet();
+ $IdiormResultSet->set_results($result_set);
+ $this->assertSame($IdiormResultSet->as_array(), $result_set);
+ }
+
+ public function testCount() {
+ $result_set = array('item' => new stdClass);
+ $IdiormResultSet = new IdiormResultSet($result_set);
+ $this->assertSame($IdiormResultSet->count(), 1);
+ $this->assertSame(count($IdiormResultSet), 1);
+ }
+
+ public function testGetIterator() {
+ $result_set = array('item' => new stdClass);
+ $IdiormResultSet = new IdiormResultSet($result_set);
+ $this->assertInstanceOf('ArrayIterator', $IdiormResultSet->getIterator());
+ }
+
+ public function testForeach() {
+ $result_set = array('item' => new stdClass);
+ $IdiormResultSet = new IdiormResultSet($result_set);
+ $return_array = array();
+ foreach($IdiormResultSet as $key => $record) {
+ $return_array[$key] = $record;
+ }
+ $this->assertSame($result_set, $return_array);
+ }
+
+ public function testCallingMethods() {
+ $result_set = array('item' => ORM::for_table('test'), 'item2' => ORM::for_table('test'));
+ $IdiormResultSet = new IdiormResultSet($result_set);
+ $IdiormResultSet->set('field', 'value')->set('field2', 'value');
+
+ foreach($IdiormResultSet as $record) {
+ $this->assertTrue(isset($record->field));
+ $this->assertSame($record->field, 'value');
+
+ $this->assertTrue(isset($record->field2));
+ $this->assertSame($record->field2, 'value');
+ }
+ }
+
+} \ No newline at end of file
diff --git a/vendor/j4mie/idiorm/test/MulitpleConnectionTest.php b/vendor/j4mie/idiorm/test/MulitpleConnectionTest.php
new file mode 100644
index 000000000..a58f3ca83
--- /dev/null
+++ b/vendor/j4mie/idiorm/test/MulitpleConnectionTest.php
@@ -0,0 +1,52 @@
+<?php
+
+class MultipleConnectionTest extends PHPUnit_Framework_TestCase {
+
+ const ALTERNATE = 'alternate'; // Used as name of alternate connection
+
+ public function setUp() {
+ // Set up the dummy database connections
+ ORM::set_db(new MockPDO('sqlite::memory:'));
+ ORM::set_db(new MockDifferentPDO('sqlite::memory:'), self::ALTERNATE);
+
+ // Enable logging
+ ORM::configure('logging', true);
+ ORM::configure('logging', true, self::ALTERNATE);
+ }
+
+ public function tearDown() {
+ ORM::reset_config();
+ ORM::reset_db();
+ }
+
+ public function testMultiplePdoConnections() {
+ $this->assertInstanceOf('MockPDO', ORM::get_db());
+ $this->assertInstanceOf('MockPDO', ORM::get_db(ORM::DEFAULT_CONNECTION));
+ $this->assertInstanceOf('MockDifferentPDO', ORM::get_db(self::ALTERNATE));
+ }
+
+ public function testRawExecuteOverAlternateConnection() {
+ $expected = "SELECT * FROM `foo`";
+ ORM::raw_execute("SELECT * FROM `foo`", array(), self::ALTERNATE);
+
+ $this->assertEquals($expected, ORM::get_last_query(self::ALTERNATE));
+ }
+
+ public function testFindOneOverDifferentConnections() {
+ ORM::for_table('widget')->find_one();
+ $statementOne = ORM::get_last_statement();
+ $this->assertInstanceOf('MockPDOStatement', $statementOne);
+
+ ORM::for_table('person', self::ALTERNATE)->find_one();
+ $statementOne = ORM::get_last_statement(); // get_statement is *not* per connection
+ $this->assertInstanceOf('MockDifferentPDOStatement', $statementOne);
+
+ $expected = "SELECT * FROM `widget` LIMIT 1";
+ $this->assertNotEquals($expected, ORM::get_last_query()); // Because get_last_query() is across *all* connections
+ $this->assertEquals($expected, ORM::get_last_query(ORM::DEFAULT_CONNECTION));
+
+ $expectedToo = "SELECT * FROM `person` LIMIT 1";
+ $this->assertEquals($expectedToo, ORM::get_last_query(self::ALTERNATE));
+ }
+
+} \ No newline at end of file
diff --git a/vendor/j4mie/idiorm/test/ORMTest.php b/vendor/j4mie/idiorm/test/ORMTest.php
new file mode 100644
index 000000000..b85b0f65a
--- /dev/null
+++ b/vendor/j4mie/idiorm/test/ORMTest.php
@@ -0,0 +1,185 @@
+<?php
+
+class ORMTest extends PHPUnit_Framework_TestCase {
+
+ public function setUp() {
+ // Enable logging
+ ORM::configure('logging', true);
+
+ // Set up the dummy database connection
+ $db = new MockPDO('sqlite::memory:');
+ ORM::set_db($db);
+ }
+
+ public function tearDown() {
+ ORM::reset_config();
+ ORM::reset_db();
+ }
+
+ public function testStaticAtrributes() {
+ $this->assertEquals('0', ORM::CONDITION_FRAGMENT);
+ $this->assertEquals('1', ORM::CONDITION_VALUES);
+ }
+
+ public function testForTable() {
+ $result = ORM::for_table('test');
+ $this->assertInstanceOf('ORM', $result);
+ }
+
+ public function testCreate() {
+ $model = ORM::for_table('test')->create();
+ $this->assertInstanceOf('ORM', $model);
+ $this->assertTrue($model->is_new());
+ }
+
+ public function testIsNew() {
+ $model = ORM::for_table('test')->create();
+ $this->assertTrue($model->is_new());
+
+ $model = ORM::for_table('test')->create(array('test' => 'test'));
+ $this->assertTrue($model->is_new());
+ }
+
+ public function testIsDirty() {
+ $model = ORM::for_table('test')->create();
+ $this->assertFalse($model->is_dirty('test'));
+
+ $model = ORM::for_table('test')->create(array('test' => 'test'));
+ $this->assertTrue($model->is_dirty('test'));
+
+ $model->test = null;
+ $this->assertTrue($model->is_dirty('test'));
+
+ $model->test = '';
+ $this->assertTrue($model->is_dirty('test'));
+ }
+
+ public function testArrayAccess() {
+ $value = 'test';
+ $model = ORM::for_table('test')->create();
+ $model['test'] = $value;
+ $this->assertTrue(isset($model['test']));
+ $this->assertEquals($model['test'], $value);
+ unset($model['test']);
+ $this->assertFalse(isset($model['test']));
+ }
+
+ public function testFindResultSet() {
+ $result_set = ORM::for_table('test')->find_result_set();
+ $this->assertInstanceOf('IdiormResultSet', $result_set);
+ $this->assertSame(count($result_set), 5);
+ }
+
+ public function testFindResultSetByDefault() {
+ ORM::configure('return_result_sets', true);
+
+ $result_set = ORM::for_table('test')->find_many();
+ $this->assertInstanceOf('IdiormResultSet', $result_set);
+ $this->assertSame(count($result_set), 5);
+
+ ORM::configure('return_result_sets', false);
+
+ $result_set = ORM::for_table('test')->find_many();
+ $this->assertInternalType('array', $result_set);
+ $this->assertSame(count($result_set), 5);
+ }
+
+ public function testGetLastPdoStatement() {
+ ORM::for_table('widget')->where('name', 'Fred')->find_one();
+ $statement = ORM::get_last_statement();
+ $this->assertInstanceOf('MockPDOStatement', $statement);
+ }
+
+ /**
+ * @expectedException IdiormMethodMissingException
+ */
+ public function testInvalidORMFunctionCallShouldCreateException() {
+ $orm = ORM::for_table('test');
+ $orm->invalidFunctionCall();
+ }
+
+ /**
+ * @expectedException IdiormMethodMissingException
+ */
+ public function testInvalidResultsSetFunctionCallShouldCreateException() {
+ $resultSet = ORM::for_table('test')->find_result_set();
+ $resultSet->invalidFunctionCall();
+ }
+
+ /**
+ * These next two tests are needed because if you have select()ed some fields,
+ * but not the primary key, then the primary key is not available for the
+ * update/delete query - see issue #203.
+ * We need to change the primary key here to something other than `id`
+ * becuase MockPDOStatement->fetch() always returns an id.
+ */
+ public function testUpdateNullPrimaryKey() {
+ try {
+ $widget = ORM::for_table('widget')
+ ->use_id_column('primary')
+ ->select('foo')
+ ->where('primary', 1)
+ ->find_one()
+ ;
+
+ $widget->foo = 'bar';
+ $widget->save();
+
+ throw new Exception('Test did not throw expected exception');
+ } catch (Exception $e) {
+ $this->assertEquals($e->getMessage(), 'Primary key ID missing from row or is null');
+ }
+ }
+
+ public function testDeleteNullPrimaryKey() {
+ try {
+ $widget = ORM::for_table('widget')
+ ->use_id_column('primary')
+ ->select('foo')
+ ->where('primary', 1)
+ ->find_one()
+ ;
+
+ $widget->delete();
+
+ throw new Exception('Test did not throw expected exception');
+ } catch (Exception $e) {
+ $this->assertEquals($e->getMessage(), 'Primary key ID missing from row or is null');
+ }
+ }
+
+ public function testNullPrimaryKey() {
+ try {
+ $widget = ORM::for_table('widget')
+ ->use_id_column('primary')
+ ->select('foo')
+ ->where('primary', 1)
+ ->find_one()
+ ;
+
+ $widget->id(true);
+
+ throw new Exception('Test did not throw expected exception');
+ } catch (Exception $e) {
+ $this->assertEquals($e->getMessage(), 'Primary key ID missing from row or is null');
+ }
+ }
+
+ public function testNullPrimaryKeyPart() {
+ try {
+ $widget = ORM::for_table('widget')
+ ->use_id_column(array('id', 'primary'))
+ ->select('foo')
+ ->where('id', 1)
+ ->where('primary', 1)
+ ->find_one()
+ ;
+
+ $widget->id(true);
+
+ throw new Exception('Test did not throw expected exception');
+ } catch (Exception $e) {
+ $this->assertEquals($e->getMessage(), 'Primary key ID contains null value(s)');
+ }
+ }
+} \ No newline at end of file
diff --git a/vendor/j4mie/idiorm/test/QueryBuilderMssqlTest.php b/vendor/j4mie/idiorm/test/QueryBuilderMssqlTest.php
new file mode 100644
index 000000000..be67b3316
--- /dev/null
+++ b/vendor/j4mie/idiorm/test/QueryBuilderMssqlTest.php
@@ -0,0 +1,32 @@
+<?php
+
+class QueryBuilderMssqlTest extends PHPUnit_Framework_TestCase {
+
+ public function setUp() {
+ // Enable logging
+ ORM::configure('logging', true);
+
+ // Set up the dummy database connection
+ $db = new MockMsSqlPDO('sqlite::memory:');
+ ORM::set_db($db);
+ }
+
+ public function tearDown() {
+ ORM::reset_config();
+ ORM::reset_db();
+ }
+
+ public function testFindOne() {
+ ORM::for_table('widget')->find_one();
+ $expected = 'SELECT TOP 1 * FROM "widget"';
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testLimit() {
+ ORM::for_table('widget')->limit(5)->find_many();
+ $expected = 'SELECT TOP 5 * FROM "widget"';
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+}
+
diff --git a/vendor/j4mie/idiorm/test/QueryBuilderPsr1Test53.php b/vendor/j4mie/idiorm/test/QueryBuilderPsr1Test53.php
new file mode 100644
index 000000000..3b267eba6
--- /dev/null
+++ b/vendor/j4mie/idiorm/test/QueryBuilderPsr1Test53.php
@@ -0,0 +1,582 @@
+<?php
+
+class QueryBuilderPsr1Test53 extends PHPUnit_Framework_TestCase {
+
+ public function setUp() {
+ // Enable logging
+ ORM::configure('logging', true);
+
+ // Set up the dummy database connection
+ $db = new MockPDO('sqlite::memory:');
+ ORM::setDb($db);
+ }
+
+ public function tearDown() {
+ ORM::configure('logging', false);
+ ORM::setDb(null);
+ }
+
+ public function testFindMany() {
+ ORM::forTable('widget')->findMany();
+ $expected = "SELECT * FROM `widget`";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testFindOne() {
+ ORM::forTable('widget')->findOne();
+ $expected = "SELECT * FROM `widget` LIMIT 1";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testFindOneWithPrimaryKeyFilter() {
+ ORM::forTable('widget')->findOne(5);
+ $expected = "SELECT * FROM `widget` WHERE `id` = '5' LIMIT 1";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testWhereIdIs() {
+ ORM::forTable('widget')->whereIdIs(5)->findOne();
+ $expected = "SELECT * FROM `widget` WHERE `id` = '5' LIMIT 1";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testSingleWhereClause() {
+ ORM::forTable('widget')->where('name', 'Fred')->findOne();
+ $expected = "SELECT * FROM `widget` WHERE `name` = 'Fred' LIMIT 1";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testMultipleWhereClauses() {
+ ORM::forTable('widget')->where('name', 'Fred')->where('age', 10)->findOne();
+ $expected = "SELECT * FROM `widget` WHERE `name` = 'Fred' AND `age` = '10' LIMIT 1";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testWhereNotEqual() {
+ ORM::forTable('widget')->whereNotEqual('name', 'Fred')->findMany();
+ $expected = "SELECT * FROM `widget` WHERE `name` != 'Fred'";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testWhereLike() {
+ ORM::forTable('widget')->whereLike('name', '%Fred%')->findOne();
+ $expected = "SELECT * FROM `widget` WHERE `name` LIKE '%Fred%' LIMIT 1";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testWhereNotLike() {
+ ORM::forTable('widget')->whereNotLike('name', '%Fred%')->findOne();
+ $expected = "SELECT * FROM `widget` WHERE `name` NOT LIKE '%Fred%' LIMIT 1";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testWhereIn() {
+ ORM::forTable('widget')->whereIn('name', array('Fred', 'Joe'))->findMany();
+ $expected = "SELECT * FROM `widget` WHERE `name` IN ('Fred', 'Joe')";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testWhereNotIn() {
+ ORM::forTable('widget')->whereNotIn('name', array('Fred', 'Joe'))->findMany();
+ $expected = "SELECT * FROM `widget` WHERE `name` NOT IN ('Fred', 'Joe')";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testLimit() {
+ ORM::forTable('widget')->limit(5)->findMany();
+ $expected = "SELECT * FROM `widget` LIMIT 5";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testLimitAndOffset() {
+ ORM::forTable('widget')->limit(5)->offset(5)->findMany();
+ $expected = "SELECT * FROM `widget` LIMIT 5 OFFSET 5";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testOrderByDesc() {
+ ORM::forTable('widget')->orderByDesc('name')->findOne();
+ $expected = "SELECT * FROM `widget` ORDER BY `name` DESC LIMIT 1";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testOrderByAsc() {
+ ORM::forTable('widget')->orderByAsc('name')->findOne();
+ $expected = "SELECT * FROM `widget` ORDER BY `name` ASC LIMIT 1";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testOrderByExpression() {
+ ORM::forTable('widget')->orderByExpr('SOUNDEX(`name`)')->findOne();
+ $expected = "SELECT * FROM `widget` ORDER BY SOUNDEX(`name`) LIMIT 1";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testMultipleOrderBy() {
+ ORM::forTable('widget')->orderByAsc('name')->orderByDesc('age')->findOne();
+ $expected = "SELECT * FROM `widget` ORDER BY `name` ASC, `age` DESC LIMIT 1";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testGroupBy() {
+ ORM::forTable('widget')->groupBy('name')->findMany();
+ $expected = "SELECT * FROM `widget` GROUP BY `name`";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testMultipleGroupBy() {
+ ORM::forTable('widget')->groupBy('name')->groupBy('age')->findMany();
+ $expected = "SELECT * FROM `widget` GROUP BY `name`, `age`";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testGroupByExpression() {
+ ORM::forTable('widget')->groupByExpr("FROM_UNIXTIME(`time`, '%Y-%m')")->findMany();
+ $expected = "SELECT * FROM `widget` GROUP BY FROM_UNIXTIME(`time`, '%Y-%m')";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testHaving() {
+ ORM::forTable('widget')->groupBy('name')->having('name', 'Fred')->findOne();
+ $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` = 'Fred' LIMIT 1";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testMultipleHaving() {
+ ORM::forTable('widget')->groupBy('name')->having('name', 'Fred')->having('age', 10)->findOne();
+ $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` = 'Fred' AND `age` = '10' LIMIT 1";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testHavingNotEqual() {
+ ORM::forTable('widget')->groupBy('name')->havingNotEqual('name', 'Fred')->findMany();
+ $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` != 'Fred'";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testHavingLike() {
+ ORM::forTable('widget')->groupBy('name')->havingLike('name', '%Fred%')->findOne();
+ $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` LIKE '%Fred%' LIMIT 1";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testHavingNotLike() {
+ ORM::forTable('widget')->groupBy('name')->havingNotLike('name', '%Fred%')->findOne();
+ $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` NOT LIKE '%Fred%' LIMIT 1";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testHavingIn() {
+ ORM::forTable('widget')->groupBy('name')->havingIn('name', array('Fred', 'Joe'))->findMany();
+ $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` IN ('Fred', 'Joe')";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testHavingNotIn() {
+ ORM::forTable('widget')->groupBy('name')->havingNotIn('name', array('Fred', 'Joe'))->findMany();
+ $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` NOT IN ('Fred', 'Joe')";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testHavingLessThan() {
+ ORM::forTable('widget')->groupBy('name')->havingLt('age', 10)->havingGt('age', 5)->findMany();
+ $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `age` < '10' AND `age` > '5'";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testHavingLessThanOrEqualAndGreaterThanOrEqual() {
+ ORM::forTable('widget')->groupBy('name')->havingLte('age', 10)->havingGte('age', 5)->findMany();
+ $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `age` <= '10' AND `age` >= '5'";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testHavingNull() {
+ ORM::forTable('widget')->groupBy('name')->havingNull('name')->findMany();
+ $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` IS NULL";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testHavingNotNull() {
+ ORM::forTable('widget')->groupBy('name')->havingNotNull('name')->findMany();
+ $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` IS NOT NULL";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testRawHaving() {
+ ORM::forTable('widget')->groupBy('name')->havingRaw('`name` = ? AND (`age` = ? OR `age` = ?)', array('Fred', 5, 10))->findMany();
+ $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` = 'Fred' AND (`age` = '5' OR `age` = '10')";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testComplexQuery() {
+ ORM::forTable('widget')->where('name', 'Fred')->limit(5)->offset(5)->orderByAsc('name')->findMany();
+ $expected = "SELECT * FROM `widget` WHERE `name` = 'Fred' ORDER BY `name` ASC LIMIT 5 OFFSET 5";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testWhereLessThanAndGreaterThan() {
+ ORM::forTable('widget')->whereLt('age', 10)->whereGt('age', 5)->findMany();
+ $expected = "SELECT * FROM `widget` WHERE `age` < '10' AND `age` > '5'";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testWhereLessThanAndEqualAndGreaterThanAndEqual() {
+ ORM::forTable('widget')->whereLte('age', 10)->whereGte('age', 5)->findMany();
+ $expected = "SELECT * FROM `widget` WHERE `age` <= '10' AND `age` >= '5'";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testWhereNull() {
+ ORM::forTable('widget')->whereNull('name')->findMany();
+ $expected = "SELECT * FROM `widget` WHERE `name` IS NULL";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testWhereNotNull() {
+ ORM::forTable('widget')->whereNotNull('name')->findMany();
+ $expected = "SELECT * FROM `widget` WHERE `name` IS NOT NULL";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testRawWhereClause() {
+ ORM::forTable('widget')->whereRaw('`name` = ? AND (`age` = ? OR `age` = ?)', array('Fred', 5, 10))->findMany();
+ $expected = "SELECT * FROM `widget` WHERE `name` = 'Fred' AND (`age` = '5' OR `age` = '10')";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testRawWhereClauseWithPercentSign() {
+ ORM::forTable('widget')->whereRaw('STRFTIME("%Y", "now") = ?', array(2012))->findMany();
+ $expected = "SELECT * FROM `widget` WHERE STRFTIME(\"%Y\", \"now\") = '2012'";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testRawWhereClauseWithNoParameters() {
+ ORM::forTable('widget')->whereRaw('`name` = "Fred"')->findMany();
+ $expected = "SELECT * FROM `widget` WHERE `name` = \"Fred\"";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testRawWhereClauseInMethodChain() {
+ ORM::forTable('widget')->where('age', 18)->whereRaw('(`name` = ? OR `name` = ?)', array('Fred', 'Bob'))->where('size', 'large')->findMany();
+ $expected = "SELECT * FROM `widget` WHERE `age` = '18' AND (`name` = 'Fred' OR `name` = 'Bob') AND `size` = 'large'";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testRawQuery() {
+ ORM::forTable('widget')->rawQuery('SELECT `w`.* FROM `widget` w')->findMany();
+ $expected = "SELECT `w`.* FROM `widget` w";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testRawQueryWithParameters() {
+ ORM::forTable('widget')->rawQuery('SELECT `w`.* FROM `widget` w WHERE `name` = ? AND `age` = ?', array('Fred', 5))->findMany();
+ $expected = "SELECT `w`.* FROM `widget` w WHERE `name` = 'Fred' AND `age` = '5'";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testRawQueryWithNamedPlaceholders() {
+ ORM::forTable('widget')->rawQuery('SELECT `w`.* FROM `widget` w WHERE `name` = :name AND `age` = :age', array(':name' => 'Fred', ':age' => 5))->findMany();
+ $expected = "SELECT `w`.* FROM `widget` w WHERE `name` = 'Fred' AND `age` = '5'";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testSimpleResultColumn() {
+ ORM::forTable('widget')->select('name')->findMany();
+ $expected = "SELECT `name` FROM `widget`";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testMultipleSimpleResultColumns() {
+ ORM::forTable('widget')->select('name')->select('age')->findMany();
+ $expected = "SELECT `name`, `age` FROM `widget`";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testSpecifyTableNameAndColumnInResultColumns() {
+ ORM::forTable('widget')->select('widget.name')->findMany();
+ $expected = "SELECT `widget`.`name` FROM `widget`";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testMainTableAlias() {
+ ORM::forTable('widget')->tableAlias('w')->findMany();
+ $expected = "SELECT * FROM `widget` `w`";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testAliasesInResultColumns() {
+ ORM::forTable('widget')->select('widget.name', 'widget_name')->findMany();
+ $expected = "SELECT `widget`.`name` AS `widget_name` FROM `widget`";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testAliasesInSelectManyResults() {
+ ORM::forTable('widget')->selectMany(array('widget_name' => 'widget.name'), 'widget_handle')->findMany();
+ $expected = "SELECT `widget`.`name` AS `widget_name`, `widget_handle` FROM `widget`";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testLiteralExpressionInResultColumn() {
+ ORM::forTable('widget')->selectExpr('COUNT(*)', 'count')->findMany();
+ $expected = "SELECT COUNT(*) AS `count` FROM `widget`";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testLiteralExpressionInSelectManyResultColumns() {
+ ORM::forTable('widget')->selectManyExpr(array('count' => 'COUNT(*)'), 'SUM(widget_order)')->findMany();
+ $expected = "SELECT COUNT(*) AS `count`, SUM(widget_order) FROM `widget`";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testSimpleJoin() {
+ ORM::forTable('widget')->join('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))->findMany();
+ $expected = "SELECT * FROM `widget` JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testSimpleJoinWithWhereIdIsMethod() {
+ ORM::forTable('widget')->join('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))->findOne(5);
+ $expected = "SELECT * FROM `widget` JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id` WHERE `widget`.`id` = '5' LIMIT 1";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testInnerJoin() {
+ ORM::forTable('widget')->innerJoin('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))->findMany();
+ $expected = "SELECT * FROM `widget` INNER JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testLeftOuterJoin() {
+ ORM::forTable('widget')->leftOuterJoin('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))->findMany();
+ $expected = "SELECT * FROM `widget` LEFT OUTER JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testRightOuterJoin() {
+ ORM::forTable('widget')->rightOuterJoin('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))->findMany();
+ $expected = "SELECT * FROM `widget` RIGHT OUTER JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testFullOuterJoin() {
+ ORM::forTable('widget')->fullOuterJoin('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))->findMany();
+ $expected = "SELECT * FROM `widget` FULL OUTER JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testMultipleJoinSources() {
+ ORM::forTable('widget')
+ ->join('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))
+ ->join('widget_nozzle', array('widget_nozzle.widget_id', '=', 'widget.id'))
+ ->findMany();
+ $expected = "SELECT * FROM `widget` JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id` JOIN `widget_nozzle` ON `widget_nozzle`.`widget_id` = `widget`.`id`";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testJoinWithAliases() {
+ ORM::forTable('widget')->join('widget_handle', array('wh.widget_id', '=', 'widget.id'), 'wh')->findMany();
+ $expected = "SELECT * FROM `widget` JOIN `widget_handle` `wh` ON `wh`.`widget_id` = `widget`.`id`";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testJoinWithAliasesAndWhere() {
+ ORM::forTable('widget')->tableAlias('w')->join('widget_handle', array('wh.widget_id', '=', 'w.id'), 'wh')->whereEqual('id', 1)->findMany();
+ $expected = "SELECT * FROM `widget` `w` JOIN `widget_handle` `wh` ON `wh`.`widget_id` = `w`.`id` WHERE `w`.`id` = '1'";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testJoinWithStringConstraint() {
+ ORM::forTable('widget')->join('widget_handle', "widget_handle.widget_id = widget.id")->findMany();
+ $expected = "SELECT * FROM `widget` JOIN `widget_handle` ON widget_handle.widget_id = widget.id";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testRawJoin() {
+ ORM::forTable('widget')->rawJoin('INNER JOIN ( SELECT * FROM `widget_handle` )', array('widget_handle.widget_id', '=', 'widget.id'), 'widget_handle')->findMany();
+ $expected = "SELECT * FROM `widget` INNER JOIN ( SELECT * FROM `widget_handle` ) `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testRawJoinWithParameters() {
+ ORM::forTable('widget')->rawJoin('INNER JOIN ( SELECT * FROM `widget_handle` WHERE `widget_handle`.name LIKE ? AND `widget_handle`.category = ?)', array('widget_handle.widget_id', '=', 'widget.id'), 'widget_handle', array('%button%', 2))->findMany();
+ $expected = "SELECT * FROM `widget` INNER JOIN ( SELECT * FROM `widget_handle` WHERE `widget_handle`.name LIKE '%button%' AND `widget_handle`.category = '2') `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testRawJoinAndRawWhereWithParameters() {
+ ORM::forTable('widget')
+ ->rawJoin('INNER JOIN ( SELECT * FROM `widget_handle` WHERE `widget_handle`.name LIKE ? AND `widget_handle`.category = ?)', array('widget_handle.widget_id', '=', 'widget.id'), 'widget_handle', array('%button%', 2))
+ ->rawJoin('INNER JOIN ( SELECT * FROM `person` WHERE `person`.name LIKE ?)', array('person.id', '=', 'widget.person_id'), 'person', array('%Fred%'))
+ ->whereRaw('`id` > ? AND `id` < ?', array(5, 10))
+ ->findMany();
+ $expected = "SELECT * FROM `widget` INNER JOIN ( SELECT * FROM `widget_handle` WHERE `widget_handle`.name LIKE '%button%' AND `widget_handle`.category = '2') `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id` INNER JOIN ( SELECT * FROM `person` WHERE `person`.name LIKE '%Fred%') `person` ON `person`.`id` = `widget`.`person_id` WHERE `id` > '5' AND `id` < '10'";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testSelectWithDistinct() {
+ ORM::forTable('widget')->distinct()->select('name')->findMany();
+ $expected = "SELECT DISTINCT `name` FROM `widget`";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testInsertData() {
+ $widget = ORM::forTable('widget')->create();
+ $widget->name = "Fred";
+ $widget->age = 10;
+ $widget->save();
+ $expected = "INSERT INTO `widget` (`name`, `age`) VALUES ('Fred', '10')";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testInsertDataContainingAnExpression() {
+ $widget = ORM::forTable('widget')->create();
+ $widget->name = "Fred";
+ $widget->age = 10;
+ $widget->setExpr('added', 'NOW()');
+ $widget->save();
+ $expected = "INSERT INTO `widget` (`name`, `age`, `added`) VALUES ('Fred', '10', NOW())";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testInsertDataUsingArrayAccess() {
+ $widget = ORM::forTable('widget')->create();
+ $widget['name'] = "Fred";
+ $widget['age'] = 10;
+ $widget->save();
+ $expected = "INSERT INTO `widget` (`name`, `age`) VALUES ('Fred', '10')";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testUpdateData() {
+ $widget = ORM::forTable('widget')->findOne(1);
+ $widget->name = "Fred";
+ $widget->age = 10;
+ $widget->save();
+ $expected = "UPDATE `widget` SET `name` = 'Fred', `age` = '10' WHERE `id` = '1'";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testUpdateDataContainingAnExpression() {
+ $widget = ORM::forTable('widget')->findOne(1);
+ $widget->name = "Fred";
+ $widget->age = 10;
+ $widget->setExpr('added', 'NOW()');
+ $widget->save();
+ $expected = "UPDATE `widget` SET `name` = 'Fred', `age` = '10', `added` = NOW() WHERE `id` = '1'";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testUpdateMultipleFields() {
+ $widget = ORM::forTable('widget')->findOne(1);
+ $widget->set(array("name" => "Fred", "age" => 10));
+ $widget->save();
+ $expected = "UPDATE `widget` SET `name` = 'Fred', `age` = '10' WHERE `id` = '1'";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testUpdateMultipleFieldsContainingAnExpression() {
+ $widget = ORM::forTable('widget')->findOne(1);
+ $widget->set(array("name" => "Fred", "age" => 10));
+ $widget->setExpr(array("added" => "NOW()", "lat_long" => "GeomFromText('POINT(1.2347 2.3436)')"));
+ $widget->save();
+ $expected = "UPDATE `widget` SET `name` = 'Fred', `age` = '10', `added` = NOW(), `lat_long` = GeomFromText('POINT(1.2347 2.3436)') WHERE `id` = '1'";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testUpdateMultipleFieldsContainingAnExpressionAndOverridePreviouslySetExpression() {
+ $widget = ORM::forTable('widget')->findOne(1);
+ $widget->set(array("name" => "Fred", "age" => 10));
+ $widget->setExpr(array("added" => "NOW()", "lat_long" => "GeomFromText('POINT(1.2347 2.3436)')"));
+ $widget->lat_long = 'unknown';
+ $widget->save();
+ $expected = "UPDATE `widget` SET `name` = 'Fred', `age` = '10', `added` = NOW(), `lat_long` = 'unknown' WHERE `id` = '1'";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testDeleteData() {
+ $widget = ORM::forTable('widget')->findOne(1);
+ $widget->delete();
+ $expected = "DELETE FROM `widget` WHERE `id` = '1'";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testDeleteMany() {
+ ORM::forTable('widget')->whereEqual('age', 10)->delete_many();
+ $expected = "DELETE FROM `widget` WHERE `age` = '10'";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testCount() {
+ ORM::forTable('widget')->count();
+ $expected = "SELECT COUNT(*) AS `count` FROM `widget` LIMIT 1";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testIgnoreSelectAndCount() {
+ ORM::forTable('widget')->select('test')->count();
+ $expected = "SELECT COUNT(*) AS `count` FROM `widget` LIMIT 1";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testMax() {
+ ORM::forTable('person')->max('height');
+ $expected = "SELECT MAX(`height`) AS `max` FROM `person` LIMIT 1";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testMin() {
+ ORM::forTable('person')->min('height');
+ $expected = "SELECT MIN(`height`) AS `min` FROM `person` LIMIT 1";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testAvg() {
+ ORM::forTable('person')->avg('height');
+ $expected = "SELECT AVG(`height`) AS `avg` FROM `person` LIMIT 1";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testSum() {
+ ORM::forTable('person')->sum('height');
+ $expected = "SELECT SUM(`height`) AS `sum` FROM `person` LIMIT 1";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ /**
+ * Regression tests
+ */
+ public function testIssue12IncorrectQuotingOfColumnWildcard() {
+ ORM::forTable('widget')->select('widget.*')->findOne();
+ $expected = "SELECT `widget`.* FROM `widget` LIMIT 1";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testIssue57LogQueryRaisesWarningWhenPercentSymbolSupplied() {
+ ORM::forTable('widget')->whereRaw('username LIKE "ben%"')->findMany();
+ $expected = 'SELECT * FROM `widget` WHERE username LIKE "ben%"';
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testIssue57LogQueryRaisesWarningWhenQuestionMarkSupplied() {
+ ORM::forTable('widget')->whereRaw('comments LIKE "has been released?%"')->findMany();
+ $expected = 'SELECT * FROM `widget` WHERE comments LIKE "has been released?%"';
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testIssue74EscapingQuoteMarksIn_quote_identifier_part() {
+ $widget = ORM::forTable('widget')->findOne(1);
+ $widget->set('ad`ded', '2013-01-04');
+ $widget->save();
+ $expected = "UPDATE `widget` SET `ad``ded` = '2013-01-04' WHERE `id` = '1'";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testIssue90UsingSetExprAloneDoesTriggerQueryGeneration() {
+ $widget = ORM::forTable('widget')->findOne(1);
+ $widget->setExpr('added', 'NOW()');
+ $widget->save();
+ $expected = "UPDATE `widget` SET `added` = NOW() WHERE `id` = '1'";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+}
+
diff --git a/vendor/j4mie/idiorm/test/QueryBuilderTest.php b/vendor/j4mie/idiorm/test/QueryBuilderTest.php
new file mode 100644
index 000000000..bbd5831f8
--- /dev/null
+++ b/vendor/j4mie/idiorm/test/QueryBuilderTest.php
@@ -0,0 +1,696 @@
+<?php
+
+class QueryBuilderTest extends PHPUnit_Framework_TestCase {
+
+ public function setUp() {
+ // Enable logging
+ ORM::configure('logging', true);
+
+ // Set up the dummy database connection
+ $db = new MockPDO('sqlite::memory:');
+ ORM::set_db($db);
+ }
+
+ public function tearDown() {
+ ORM::reset_config();
+ ORM::reset_db();
+ }
+
+ public function testFindMany() {
+ ORM::for_table('widget')->find_many();
+ $expected = "SELECT * FROM `widget`";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testFindOne() {
+ ORM::for_table('widget')->find_one();
+ $expected = "SELECT * FROM `widget` LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testFindOneWithPrimaryKeyFilter() {
+ ORM::for_table('widget')->find_one(5);
+ $expected = "SELECT * FROM `widget` WHERE `id` = '5' LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testWhereIdIs() {
+ ORM::for_table('widget')->where_id_is(5)->find_one();
+ $expected = "SELECT * FROM `widget` WHERE `id` = '5' LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testWhereIdIn() {
+ ORM::for_table('widget')->where_id_in(array(4, 5))->find_many();
+ $expected = "SELECT * FROM `widget` WHERE `id` IN ('4', '5')";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testSingleWhereClause() {
+ ORM::for_table('widget')->where('name', 'Fred')->find_one();
+ $expected = "SELECT * FROM `widget` WHERE `name` = 'Fred' LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testMultipleWhereClauses() {
+ ORM::for_table('widget')->where('name', 'Fred')->where('age', 10)->find_one();
+ $expected = "SELECT * FROM `widget` WHERE `name` = 'Fred' AND `age` = '10' LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testWhereNotEqual() {
+ ORM::for_table('widget')->where_not_equal('name', 'Fred')->find_many();
+ $expected = "SELECT * FROM `widget` WHERE `name` != 'Fred'";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testWhereLike() {
+ ORM::for_table('widget')->where_like('name', '%Fred%')->find_one();
+ $expected = "SELECT * FROM `widget` WHERE `name` LIKE '%Fred%' LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testWhereNotLike() {
+ ORM::for_table('widget')->where_not_like('name', '%Fred%')->find_one();
+ $expected = "SELECT * FROM `widget` WHERE `name` NOT LIKE '%Fred%' LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testWhereIn() {
+ ORM::for_table('widget')->where_in('name', array('Fred', 'Joe'))->find_many();
+ $expected = "SELECT * FROM `widget` WHERE `name` IN ('Fred', 'Joe')";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testWhereNotIn() {
+ ORM::for_table('widget')->where_not_in('name', array('Fred', 'Joe'))->find_many();
+ $expected = "SELECT * FROM `widget` WHERE `name` NOT IN ('Fred', 'Joe')";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testWhereAnyIs() {
+ ORM::for_table('widget')->where_any_is(array(
+ array('name' => 'Joe', 'age' => 10),
+ array('name' => 'Fred', 'age' => 20)))->find_many();
+ $expected = "SELECT * FROM `widget` WHERE (( `name` = 'Joe' AND `age` = '10' ) OR ( `name` = 'Fred' AND `age` = '20' ))";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testWhereAnyIsOverrideOneColumn() {
+ ORM::for_table('widget')->where_any_is(array(
+ array('name' => 'Joe', 'age' => 10),
+ array('name' => 'Fred', 'age' => 20)), array('age' => '>'))->find_many();
+ $expected = "SELECT * FROM `widget` WHERE (( `name` = 'Joe' AND `age` > '10' ) OR ( `name` = 'Fred' AND `age` > '20' ))";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testWhereAnyIsOverrideAllOperators() {
+ ORM::for_table('widget')->where_any_is(array(
+ array('score' => '5', 'age' => 10),
+ array('score' => '15', 'age' => 20)), '>')->find_many();
+ $expected = "SELECT * FROM `widget` WHERE (( `score` > '5' AND `age` > '10' ) OR ( `score` > '15' AND `age` > '20' ))";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testLimit() {
+ ORM::for_table('widget')->limit(5)->find_many();
+ $expected = "SELECT * FROM `widget` LIMIT 5";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testLimitAndOffset() {
+ ORM::for_table('widget')->limit(5)->offset(5)->find_many();
+ $expected = "SELECT * FROM `widget` LIMIT 5 OFFSET 5";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testOrderByDesc() {
+ ORM::for_table('widget')->order_by_desc('name')->find_one();
+ $expected = "SELECT * FROM `widget` ORDER BY `name` DESC LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testOrderByAsc() {
+ ORM::for_table('widget')->order_by_asc('name')->find_one();
+ $expected = "SELECT * FROM `widget` ORDER BY `name` ASC LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testOrderByExpression() {
+ ORM::for_table('widget')->order_by_expr('SOUNDEX(`name`)')->find_one();
+ $expected = "SELECT * FROM `widget` ORDER BY SOUNDEX(`name`) LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testMultipleOrderBy() {
+ ORM::for_table('widget')->order_by_asc('name')->order_by_desc('age')->find_one();
+ $expected = "SELECT * FROM `widget` ORDER BY `name` ASC, `age` DESC LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testGroupBy() {
+ ORM::for_table('widget')->group_by('name')->find_many();
+ $expected = "SELECT * FROM `widget` GROUP BY `name`";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testMultipleGroupBy() {
+ ORM::for_table('widget')->group_by('name')->group_by('age')->find_many();
+ $expected = "SELECT * FROM `widget` GROUP BY `name`, `age`";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testGroupByExpression() {
+ ORM::for_table('widget')->group_by_expr("FROM_UNIXTIME(`time`, '%Y-%m')")->find_many();
+ $expected = "SELECT * FROM `widget` GROUP BY FROM_UNIXTIME(`time`, '%Y-%m')";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testHaving() {
+ ORM::for_table('widget')->group_by('name')->having('name', 'Fred')->find_one();
+ $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` = 'Fred' LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testMultipleHaving() {
+ ORM::for_table('widget')->group_by('name')->having('name', 'Fred')->having('age', 10)->find_one();
+ $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` = 'Fred' AND `age` = '10' LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testHavingNotEqual() {
+ ORM::for_table('widget')->group_by('name')->having_not_equal('name', 'Fred')->find_many();
+ $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` != 'Fred'";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testHavingLike() {
+ ORM::for_table('widget')->group_by('name')->having_like('name', '%Fred%')->find_one();
+ $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` LIKE '%Fred%' LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testHavingNotLike() {
+ ORM::for_table('widget')->group_by('name')->having_not_like('name', '%Fred%')->find_one();
+ $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` NOT LIKE '%Fred%' LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testHavingIn() {
+ ORM::for_table('widget')->group_by('name')->having_in('name', array('Fred', 'Joe'))->find_many();
+ $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` IN ('Fred', 'Joe')";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testHavingNotIn() {
+ ORM::for_table('widget')->group_by('name')->having_not_in('name', array('Fred', 'Joe'))->find_many();
+ $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` NOT IN ('Fred', 'Joe')";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testHavingLessThan() {
+ ORM::for_table('widget')->group_by('name')->having_lt('age', 10)->having_gt('age', 5)->find_many();
+ $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `age` < '10' AND `age` > '5'";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testHavingLessThanOrEqualAndGreaterThanOrEqual() {
+ ORM::for_table('widget')->group_by('name')->having_lte('age', 10)->having_gte('age', 5)->find_many();
+ $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `age` <= '10' AND `age` >= '5'";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testHavingNull() {
+ ORM::for_table('widget')->group_by('name')->having_null('name')->find_many();
+ $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` IS NULL";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testHavingNotNull() {
+ ORM::for_table('widget')->group_by('name')->having_not_null('name')->find_many();
+ $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` IS NOT NULL";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testRawHaving() {
+ ORM::for_table('widget')->group_by('name')->having_raw('`name` = ? AND (`age` = ? OR `age` = ?)', array('Fred', 5, 10))->find_many();
+ $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` = 'Fred' AND (`age` = '5' OR `age` = '10')";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testComplexQuery() {
+ ORM::for_table('widget')->where('name', 'Fred')->limit(5)->offset(5)->order_by_asc('name')->find_many();
+ $expected = "SELECT * FROM `widget` WHERE `name` = 'Fred' ORDER BY `name` ASC LIMIT 5 OFFSET 5";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testWhereLessThanAndGreaterThan() {
+ ORM::for_table('widget')->where_lt('age', 10)->where_gt('age', 5)->find_many();
+ $expected = "SELECT * FROM `widget` WHERE `age` < '10' AND `age` > '5'";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testWhereLessThanAndEqualAndGreaterThanAndEqual() {
+ ORM::for_table('widget')->where_lte('age', 10)->where_gte('age', 5)->find_many();
+ $expected = "SELECT * FROM `widget` WHERE `age` <= '10' AND `age` >= '5'";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testWhereNull() {
+ ORM::for_table('widget')->where_null('name')->find_many();
+ $expected = "SELECT * FROM `widget` WHERE `name` IS NULL";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testWhereNotNull() {
+ ORM::for_table('widget')->where_not_null('name')->find_many();
+ $expected = "SELECT * FROM `widget` WHERE `name` IS NOT NULL";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testRawWhereClause() {
+ ORM::for_table('widget')->where_raw('`name` = ? AND (`age` = ? OR `age` = ?)', array('Fred', 5, 10))->find_many();
+ $expected = "SELECT * FROM `widget` WHERE `name` = 'Fred' AND (`age` = '5' OR `age` = '10')";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testRawWhereClauseWithPercentSign() {
+ ORM::for_table('widget')->where_raw('STRFTIME("%Y", "now") = ?', array(2012))->find_many();
+ $expected = "SELECT * FROM `widget` WHERE STRFTIME(\"%Y\", \"now\") = '2012'";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testRawWhereClauseWithNoParameters() {
+ ORM::for_table('widget')->where_raw('`name` = "Fred"')->find_many();
+ $expected = "SELECT * FROM `widget` WHERE `name` = \"Fred\"";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testRawWhereClauseInMethodChain() {
+ ORM::for_table('widget')->where('age', 18)->where_raw('(`name` = ? OR `name` = ?)', array('Fred', 'Bob'))->where('size', 'large')->find_many();
+ $expected = "SELECT * FROM `widget` WHERE `age` = '18' AND (`name` = 'Fred' OR `name` = 'Bob') AND `size` = 'large'";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testRawWhereClauseMultiples() {
+ ORM::for_table('widget')->where('age', 18)->where_raw('(`name` = ? OR `name` = ?)', array('Fred', 'Bob'))->where_raw('(`name` = ? OR `name` = ?)', array('Sarah', 'Jane'))->where('size', 'large')->find_many();
+ $expected = "SELECT * FROM `widget` WHERE `age` = '18' AND (`name` = 'Fred' OR `name` = 'Bob') AND (`name` = 'Sarah' OR `name` = 'Jane') AND `size` = 'large'";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testRawQuery() {
+ ORM::for_table('widget')->raw_query('SELECT `w`.* FROM `widget` w')->find_many();
+ $expected = "SELECT `w`.* FROM `widget` w";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testRawQueryWithParameters() {
+ ORM::for_table('widget')->raw_query('SELECT `w`.* FROM `widget` w WHERE `name` = ? AND `age` = ?', array('Fred', 5))->find_many();
+ $expected = "SELECT `w`.* FROM `widget` w WHERE `name` = 'Fred' AND `age` = '5'";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testRawQueryWithNamedPlaceholders() {
+ ORM::for_table('widget')->raw_query('SELECT `w`.* FROM `widget` w WHERE `name` = :name AND `age` = :age', array(':name' => 'Fred', ':age' => 5))->find_many();
+ $expected = "SELECT `w`.* FROM `widget` w WHERE `name` = 'Fred' AND `age` = '5'";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testSimpleResultColumn() {
+ ORM::for_table('widget')->select('name')->find_many();
+ $expected = "SELECT `name` FROM `widget`";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testMultipleSimpleResultColumns() {
+ ORM::for_table('widget')->select('name')->select('age')->find_many();
+ $expected = "SELECT `name`, `age` FROM `widget`";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testSpecifyTableNameAndColumnInResultColumns() {
+ ORM::for_table('widget')->select('widget.name')->find_many();
+ $expected = "SELECT `widget`.`name` FROM `widget`";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testMainTableAlias() {
+ ORM::for_table('widget')->table_alias('w')->find_many();
+ $expected = "SELECT * FROM `widget` `w`";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testAliasesInResultColumns() {
+ ORM::for_table('widget')->select('widget.name', 'widget_name')->find_many();
+ $expected = "SELECT `widget`.`name` AS `widget_name` FROM `widget`";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testAliasesInSelectManyResults() {
+ ORM::for_table('widget')->select_many(array('widget_name' => 'widget.name'), 'widget_handle')->find_many();
+ $expected = "SELECT `widget`.`name` AS `widget_name`, `widget_handle` FROM `widget`";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testLiteralExpressionInResultColumn() {
+ ORM::for_table('widget')->select_expr('COUNT(*)', 'count')->find_many();
+ $expected = "SELECT COUNT(*) AS `count` FROM `widget`";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testLiteralExpressionInSelectManyResultColumns() {
+ ORM::for_table('widget')->select_many_expr(array('count' => 'COUNT(*)'), 'SUM(widget_order)')->find_many();
+ $expected = "SELECT COUNT(*) AS `count`, SUM(widget_order) FROM `widget`";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testSimpleJoin() {
+ ORM::for_table('widget')->join('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))->find_many();
+ $expected = "SELECT * FROM `widget` JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testSimpleJoinWithWhereIdIsMethod() {
+ ORM::for_table('widget')->join('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))->find_one(5);
+ $expected = "SELECT * FROM `widget` JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id` WHERE `widget`.`id` = '5' LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testInnerJoin() {
+ ORM::for_table('widget')->inner_join('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))->find_many();
+ $expected = "SELECT * FROM `widget` INNER JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testLeftOuterJoin() {
+ ORM::for_table('widget')->left_outer_join('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))->find_many();
+ $expected = "SELECT * FROM `widget` LEFT OUTER JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testRightOuterJoin() {
+ ORM::for_table('widget')->right_outer_join('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))->find_many();
+ $expected = "SELECT * FROM `widget` RIGHT OUTER JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testFullOuterJoin() {
+ ORM::for_table('widget')->full_outer_join('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))->find_many();
+ $expected = "SELECT * FROM `widget` FULL OUTER JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testMultipleJoinSources() {
+ ORM::for_table('widget')
+ ->join('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))
+ ->join('widget_nozzle', array('widget_nozzle.widget_id', '=', 'widget.id'))
+ ->find_many();
+ $expected = "SELECT * FROM `widget` JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id` JOIN `widget_nozzle` ON `widget_nozzle`.`widget_id` = `widget`.`id`";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testJoinWithAliases() {
+ ORM::for_table('widget')->join('widget_handle', array('wh.widget_id', '=', 'widget.id'), 'wh')->find_many();
+ $expected = "SELECT * FROM `widget` JOIN `widget_handle` `wh` ON `wh`.`widget_id` = `widget`.`id`";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testJoinWithAliasesAndWhere() {
+ ORM::for_table('widget')->table_alias('w')->join('widget_handle', array('wh.widget_id', '=', 'w.id'), 'wh')->where_equal('id', 1)->find_many();
+ $expected = "SELECT * FROM `widget` `w` JOIN `widget_handle` `wh` ON `wh`.`widget_id` = `w`.`id` WHERE `w`.`id` = '1'";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testJoinWithStringConstraint() {
+ ORM::for_table('widget')->join('widget_handle', "widget_handle.widget_id = widget.id")->find_many();
+ $expected = "SELECT * FROM `widget` JOIN `widget_handle` ON widget_handle.widget_id = widget.id";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testRawJoin() {
+ ORM::for_table('widget')->raw_join('INNER JOIN ( SELECT * FROM `widget_handle` )', array('widget_handle.widget_id', '=', 'widget.id'), 'widget_handle')->find_many();
+ $expected = "SELECT * FROM `widget` INNER JOIN ( SELECT * FROM `widget_handle` ) `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testRawJoinWithParameters() {
+ ORM::for_table('widget')->raw_join('INNER JOIN ( SELECT * FROM `widget_handle` WHERE `widget_handle`.name LIKE ? AND `widget_handle`.category = ?)', array('widget_handle.widget_id', '=', 'widget.id'), 'widget_handle', array('%button%', 2))->find_many();
+ $expected = "SELECT * FROM `widget` INNER JOIN ( SELECT * FROM `widget_handle` WHERE `widget_handle`.name LIKE '%button%' AND `widget_handle`.category = '2') `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testRawJoinAndRawWhereWithParameters() {
+ ORM::for_table('widget')
+ ->raw_join('INNER JOIN ( SELECT * FROM `widget_handle` WHERE `widget_handle`.name LIKE ? AND `widget_handle`.category = ?)', array('widget_handle.widget_id', '=', 'widget.id'), 'widget_handle', array('%button%', 2))
+ ->raw_join('INNER JOIN ( SELECT * FROM `person` WHERE `person`.name LIKE ?)', array('person.id', '=', 'widget.person_id'), 'person', array('%Fred%'))
+ ->where_raw('`id` > ? AND `id` < ?', array(5, 10))
+ ->find_many();
+ $expected = "SELECT * FROM `widget` INNER JOIN ( SELECT * FROM `widget_handle` WHERE `widget_handle`.name LIKE '%button%' AND `widget_handle`.category = '2') `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id` INNER JOIN ( SELECT * FROM `person` WHERE `person`.name LIKE '%Fred%') `person` ON `person`.`id` = `widget`.`person_id` WHERE `id` > '5' AND `id` < '10'";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testSelectWithDistinct() {
+ ORM::for_table('widget')->distinct()->select('name')->find_many();
+ $expected = "SELECT DISTINCT `name` FROM `widget`";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testInsertData() {
+ $widget = ORM::for_table('widget')->create();
+ $widget->name = "Fred";
+ $widget->age = 10;
+ $widget->save();
+ $expected = "INSERT INTO `widget` (`name`, `age`) VALUES ('Fred', '10')";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testInsertDataContainingAnExpression() {
+ $widget = ORM::for_table('widget')->create();
+ $widget->name = "Fred";
+ $widget->age = 10;
+ $widget->set_expr('added', 'NOW()');
+ $widget->save();
+ $expected = "INSERT INTO `widget` (`name`, `age`, `added`) VALUES ('Fred', '10', NOW())";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testInsertDataUsingArrayAccess() {
+ $widget = ORM::for_table('widget')->create();
+ $widget['name'] = "Fred";
+ $widget['age'] = 10;
+ $widget->save();
+ $expected = "INSERT INTO `widget` (`name`, `age`) VALUES ('Fred', '10')";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testUpdateData() {
+ $widget = ORM::for_table('widget')->find_one(1);
+ $widget->name = "Fred";
+ $widget->age = 10;
+ $widget->save();
+ $expected = "UPDATE `widget` SET `name` = 'Fred', `age` = '10' WHERE `id` = '1'";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testUpdateDataContainingAnExpression() {
+ $widget = ORM::for_table('widget')->find_one(1);
+ $widget->name = "Fred";
+ $widget->age = 10;
+ $widget->set_expr('added', 'NOW()');
+ $widget->save();
+ $expected = "UPDATE `widget` SET `name` = 'Fred', `age` = '10', `added` = NOW() WHERE `id` = '1'";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testUpdateMultipleFields() {
+ $widget = ORM::for_table('widget')->find_one(1);
+ $widget->set(array("name" => "Fred", "age" => 10));
+ $widget->save();
+ $expected = "UPDATE `widget` SET `name` = 'Fred', `age` = '10' WHERE `id` = '1'";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testUpdateMultipleFieldsContainingAnExpression() {
+ $widget = ORM::for_table('widget')->find_one(1);
+ $widget->set(array("name" => "Fred", "age" => 10));
+ $widget->set_expr(array("added" => "NOW()", "lat_long" => "GeomFromText('POINT(1.2347 2.3436)')"));
+ $widget->save();
+ $expected = "UPDATE `widget` SET `name` = 'Fred', `age` = '10', `added` = NOW(), `lat_long` = GeomFromText('POINT(1.2347 2.3436)') WHERE `id` = '1'";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testUpdateMultipleFieldsContainingAnExpressionAndOverridePreviouslySetExpression() {
+ $widget = ORM::for_table('widget')->find_one(1);
+ $widget->set(array("name" => "Fred", "age" => 10));
+ $widget->set_expr(array("added" => "NOW()", "lat_long" => "GeomFromText('POINT(1.2347 2.3436)')"));
+ $widget->lat_long = 'unknown';
+ $widget->save();
+ $expected = "UPDATE `widget` SET `name` = 'Fred', `age` = '10', `added` = NOW(), `lat_long` = 'unknown' WHERE `id` = '1'";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testDeleteData() {
+ $widget = ORM::for_table('widget')->find_one(1);
+ $widget->delete();
+ $expected = "DELETE FROM `widget` WHERE `id` = '1'";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testDeleteMany() {
+ ORM::for_table('widget')->where_equal('age', 10)->delete_many();
+ $expected = "DELETE FROM `widget` WHERE `age` = '10'";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testCount() {
+ ORM::for_table('widget')->count();
+ $expected = "SELECT COUNT(*) AS `count` FROM `widget` LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testIgnoreSelectAndCount() {
+ ORM::for_table('widget')->select('test')->count();
+ $expected = "SELECT COUNT(*) AS `count` FROM `widget` LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testMax() {
+ ORM::for_table('person')->max('height');
+ $expected = "SELECT MAX(`height`) AS `max` FROM `person` LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testMin() {
+ ORM::for_table('person')->min('height');
+ $expected = "SELECT MIN(`height`) AS `min` FROM `person` LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testAvg() {
+ ORM::for_table('person')->avg('height');
+ $expected = "SELECT AVG(`height`) AS `avg` FROM `person` LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testSum() {
+ ORM::for_table('person')->sum('height');
+ $expected = "SELECT SUM(`height`) AS `sum` FROM `person` LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function test_quote_identifier_part() {
+ $widget = ORM::for_table('widget')->find_one(1);
+ $widget->set('added', '2013-01-04');
+ $widget->save();
+ $expected = "UPDATE `widget` SET `added` = '2013-01-04' WHERE `id` = '1'";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function test_quote_multiple_identifiers_part() {
+ $record = ORM::for_table('widget')->use_id_column(array('id1', 'id2'))->create();
+ $expected = "`id1`, `id2`";
+ $this->assertEquals($expected, $record->_quote_identifier($record->_get_id_column_name()));
+ }
+
+ /**
+ * Compound primary key tests
+ */
+ public function testFindOneWithCompoundPrimaryKey() {
+ $record = ORM::for_table('widget')->use_id_column(array('id1', 'id2'));
+ $record->findOne(array('id1' => 10, 'name' => 'Joe', 'id2' => 20));
+ $expected = "SELECT * FROM `widget` WHERE `id1` = '10' AND `id2` = '20' LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testInsertWithCompoundPrimaryKey() {
+ $record = ORM::for_table('widget')->use_id_column(array('id1', 'id2'))->create();
+ $record->set('id1', 10);
+ $record->set('id2', 20);
+ $record->set('name', 'Joe');
+ $record->save();
+ $expected = "INSERT INTO `widget` (`id1`, `id2`, `name`) VALUES ('10', '20', 'Joe')";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testUpdateWithCompoundPrimaryKey() {
+ $record = ORM::for_table('widget')->use_id_column(array('id1', 'id2'))->create();
+ $record->set('id1', 10);
+ $record->set('id2', 20);
+ $record->set('name', 'Joe');
+ $record->save();
+ $record->set('name', 'John');
+ $record->save();
+ $expected = "UPDATE `widget` SET `name` = 'John' WHERE `id1` = '10' AND `id2` = '20'";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testDeleteWithCompoundPrimaryKey() {
+ $record = ORM::for_table('widget')->use_id_column(array('id1', 'id2'))->create();
+ $record->set('id1', 10);
+ $record->set('id2', 20);
+ $record->set('name', 'Joe');
+ $record->save();
+ $record->delete();
+ $expected = "DELETE FROM `widget` WHERE `id1` = '10' AND `id2` = '20'";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testWhereIdInWithCompoundPrimaryKey() {
+ $record = ORM::for_table('widget')->use_id_column(array('id1', 'id2'));
+ $record->where_id_in(array(
+ array('id1' => 10, 'name' => 'Joe', 'id2' => 20),
+ array('id1' => 20, 'name' => 'Joe', 'id2' => 30)))->find_many();
+ $expected = "SELECT * FROM `widget` WHERE (( `id1` = '10' AND `id2` = '20' ) OR ( `id1` = '20' AND `id2` = '30' ))";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ /**
+ * Regression tests
+ */
+ public function testIssue12IncorrectQuotingOfColumnWildcard() {
+ ORM::for_table('widget')->select('widget.*')->find_one();
+ $expected = "SELECT `widget`.* FROM `widget` LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testIssue57LogQueryRaisesWarningWhenPercentSymbolSupplied() {
+ ORM::for_table('widget')->where_raw('username LIKE "ben%"')->find_many();
+ $expected = 'SELECT * FROM `widget` WHERE username LIKE "ben%"';
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testIssue57LogQueryRaisesWarningWhenQuestionMarkSupplied() {
+ ORM::for_table('widget')->where_raw('comments LIKE "has been released?%"')->find_many();
+ $expected = 'SELECT * FROM `widget` WHERE comments LIKE "has been released?%"';
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testIssue74EscapingQuoteMarksIn_quote_identifier_part() {
+ $widget = ORM::for_table('widget')->find_one(1);
+ $widget->set('ad`ded', '2013-01-04');
+ $widget->save();
+ $expected = "UPDATE `widget` SET `ad``ded` = '2013-01-04' WHERE `id` = '1'";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testIssue90UsingSetExprAloneDoesTriggerQueryGeneration() {
+ $widget = ORM::for_table('widget')->find_one(1);
+ $widget->set_expr('added', 'NOW()');
+ $widget->save();
+ $expected = "UPDATE `widget` SET `added` = NOW() WHERE `id` = '1'";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testIssue176LimitDoesntWorkFirstTime() {
+ ORM::reset_config();
+ ORM::reset_db();
+
+ ORM::configure('logging', true);
+ ORM::configure('connection_string', 'sqlite::memory:');
+
+ ORM::for_table('sqlite_master')->limit(1)->find_array();
+ $expected = "SELECT * FROM `sqlite_master` LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+}
+
diff --git a/vendor/j4mie/idiorm/test/bootstrap.php b/vendor/j4mie/idiorm/test/bootstrap.php
new file mode 100644
index 000000000..7fa1c48b6
--- /dev/null
+++ b/vendor/j4mie/idiorm/test/bootstrap.php
@@ -0,0 +1,126 @@
+<?php
+
+require_once dirname(__FILE__) . '/../idiorm.php';
+
+/**
+ *
+ * Mock version of the PDOStatement class.
+ *
+ */
+class MockPDOStatement extends PDOStatement {
+ private $current_row = 0;
+ private $statement = NULL;
+ private $bindParams = array();
+
+ /**
+ * Store the statement that gets passed to the constructor
+ */
+ public function __construct($statement) {
+ $this->statement = $statement;
+ }
+
+ /**
+ * Check that the array
+ */
+ public function execute($params = NULL) {
+ $count = 0;
+ $m = array();
+ if (is_null($params)) $params = $this->bindParams;
+ if (preg_match_all('/"[^"\\\\]*(?:\\?)[^"\\\\]*"|\'[^\'\\\\]*(?:\\?)[^\'\\\\]*\'|(\\?)/', $this->statement, $m, PREG_SET_ORDER)) {
+ $count = count($m);
+ for ($v = 0; $v < $count; $v++) {
+ if (count($m[$v]) == 1) unset($m[$v]);
+ }
+ $count = count($m);
+ for ($i = 0; $i < $count; $i++) {
+ if (!isset($params[$i])) {
+ ob_start();
+ var_dump($m, $params);
+ $output = ob_get_clean();
+ throw new Exception('Incorrect parameter count. Expected ' . $count . ' got ' . count($params) . ".\n" . $this->statement . "\n" . $output);
+ }
+ }
+ }
+ }
+
+ /**
+ * Add data to arrays
+ */
+ public function bindParam($paramno, &$param, $type = NULL, $maxlen = NULL, $driverdata = NULL)
+ {
+ // Do check on type
+ if (!is_int($type) || ($type != PDO::PARAM_STR && $type != PDO::PARAM_NULL && $type != PDO::PARAM_BOOL && $type != PDO::PARAM_INT))
+ throw new Exception('Incorrect parameter type. Expected $type to be an integer.');
+
+ // Add param to array
+ $this->bindParams[is_int($paramno) ? --$paramno : $paramno] = $param;
+ }
+
+ /**
+ * Return some dummy data
+ */
+ public function fetch($fetch_style=PDO::FETCH_BOTH, $cursor_orientation=PDO::FETCH_ORI_NEXT, $cursor_offset=0) {
+ if ($this->current_row == 5) {
+ return false;
+ } else {
+ return array('name' => 'Fred', 'age' => 10, 'id' => ++$this->current_row);
+ }
+ }
+}
+
+/**
+ * Another mock PDOStatement class, used for testing multiple connections
+ */
+class MockDifferentPDOStatement extends MockPDOStatement { }
+
+/**
+ *
+ * Mock database class implementing a subset
+ * of the PDO API.
+ *
+ */
+class MockPDO extends PDO {
+
+ /**
+ * Return a dummy PDO statement
+ */
+ public function prepare($statement, $driver_options=array()) {
+ $this->last_query = new MockPDOStatement($statement);
+ return $this->last_query;
+ }
+}
+
+/**
+ * A different mock database class, for testing multiple connections
+ * Mock database class implementing a subset of the PDO API.
+ */
+class MockDifferentPDO extends MockPDO {
+
+ /**
+ * Return a dummy PDO statement
+ */
+ public function prepare($statement, $driver_options = array()) {
+ $this->last_query = new MockDifferentPDOStatement($statement);
+ return $this->last_query;
+ }
+}
+
+class MockMsSqlPDO extends MockPDO {
+
+ public $fake_driver = 'mssql';
+
+ /**
+ * If we are asking for the name of the driver, check if a fake one
+ * has been set.
+ */
+ public function getAttribute($attribute) {
+ if ($attribute == self::ATTR_DRIVER_NAME) {
+ if (!is_null($this->fake_driver)) {
+ return $this->fake_driver;
+ }
+ }
+
+ return parent::getAttribute($attribute);
+ }
+
+}
diff --git a/vendor/j4mie/idiorm/test/docker_for_php52/Dockerfile b/vendor/j4mie/idiorm/test/docker_for_php52/Dockerfile
new file mode 100644
index 000000000..f9640b66a
--- /dev/null
+++ b/vendor/j4mie/idiorm/test/docker_for_php52/Dockerfile
@@ -0,0 +1,182 @@
+FROM ubuntu:12.04
+
+# configuration mostly copied from https://github.com/kuborgh/docker-php-5.2
+
+RUN mkdir /php && \
+ cd /php && \
+ apt-get update && \
+ apt-get install -y --no-install-recommends \
+ autoconf binutils build-essential bzip2 ca-certificates \
+ comerr-dev cpp cpp-4.6 dpkg-dev g++ g++-4.6 gcc gcc-4.6 krb5-multidev \
+ libapr1-dev libaprutil1-dev libaspell-dev libaspell15 libbz2-dev \
+ libc-client2007e libc-client2007e-dev libc-dev-bin libc6-dev libcurl3 \
+ libcurl4-openssl-dev libdpkg-perl libexpat1-dev libfreetype6 \
+ libfreetype6-dev libgcrypt11-dev libgdbm-dev libgmp10 libgnutls-dev \
+ libgnutls-openssl27 libgnutlsxx27 libgomp1 libgpg-error-dev \
+ libgssapi-krb5-2 libgssrpc4 libice-dev libice6 libidn11 libidn11-dev \
+ libjpeg-dev libjpeg-turbo8 libjpeg-turbo8-dev libjpeg8 libjpeg8-dev \
+ libk5crypto3 libkadm5clnt-mit8 libkadm5srv-mit8 libkdb5-6 libkeyutils1 \
+ libkrb5-3 libkrb5-dev libkrb5support0 libldap2-dev libltdl-dev libltdl7 \
+ libmagic-dev libmagic1 libmcrypt-dev libmcrypt4 libmhash-dev libmhash2 \
+ libmpc2 libmpfr4 libncurses5-dev \
+ libp11-kit-dev libpam0g-dev libpcre3-dev libpcrecpp0 libpng12-dev libpopt0 \
+ libpq-dev libpq5 libpspell-dev libpthread-stubs0 libpthread-stubs0-dev \
+ libquadmath0 libreadline-dev libreadline6-dev librtmp-dev librtmp0 \
+ libsm-dev libsm6 libsqlite3-dev libssl-dev libstdc++6-4.6-dev libt1-5 \
+ libt1-dev libtasn1-3-dev libtimedate-perl libtinfo-dev libx11-6 libx11-data \
+ libx11-dev libxau-dev libxau6 libxaw7 libxaw7-dev libxcb1 libxcb1-dev \
+ libxdmcp-dev libxdmcp6 libxext-dev libxext6 libxml2 libxml2-dev libxmu-dev \
+ libxmu-headers libxmu6 libxpm-dev libxpm4 libxt-dev libxt6 linux-libc-dev \
+ m4 make mlock mysql-common openssl patch pkg-config uuid-dev wget \
+ x11-common x11proto-core-dev x11proto-input-dev x11proto-kb-dev \
+ x11proto-xext-dev xorg-sgml-doctools xtrans-dev zlib1g-dev \
+ && \
+ wget http://museum.php.net/php5/php-5.2.17.tar.bz2 && \
+ tar xfj php-5.2.17.tar.bz2 && \
+ ln -s /usr/lib/x86_64-linux-gnu/libjpeg.* /usr/lib/ && \
+ ln -s /usr/lib/x86_64-linux-gnu/libpng.* /usr/lib/ && \
+ ln -s /usr/lib/x86_64-linux-gnu/libkrb5.* /usr/lib/ && \
+ ln -s /usr/lib/x86_64-linux-gnu/libmysqlclient.* /usr/lib/ && \
+ cd php-5.2.17; \
+ wget -c -t 3 -O ./debian_patches_disable_SSLv2_for_openssl_1_0_0.patch https://bugs.php.net/patch-display.php\?bug_id\=54736\&patch\=debian_patches_disable_SSLv2_for_openssl_1_0_0.patch\&revision=1305414559\&download\=1 && \
+ patch -p1 -b < debian_patches_disable_SSLv2_for_openssl_1_0_0.patch && \
+
+ ./configure \
+ --bindir=/usr/bin \
+ --sbindir=/usr/sbin \
+ --prefix=/usr \
+ --build=i686-pc-linux-gnu \
+ --host=i686-pc-linux-gnu \
+ --mandir=/usr/share/man \
+ --infodir=/usr/share/info \
+ --datadir=/usr/share \
+ --sysconfdir=/etc \
+ --localstatedir=/var/lib \
+ --prefix=/usr/lib/php5.2 \
+ --mandir=/usr/lib/php5.2/man \
+ --infodir=/usr/lib/php5.2/info \
+ --libdir=/usr/lib/php5.2/lib \
+ --with-libdir=lib \
+ --with-pear \
+ --disable-maintainer-zts \
+ --enable-bcmath \
+ --with-bz2 \
+ --enable-calendar \
+ --with-curl \
+ --with-curlwrappers \
+ --disable-dbase \
+ --enable-exif \
+ --without-fbsql \
+ --without-fdftk \
+ --enable-ftp \
+ --with-gettext \
+ --without-gmp \
+ --disable-ipv6 \
+ --with-kerberos \
+ --enable-mbstring \
+ --with-mcrypt \
+ --with-mhash \
+ --without-msql \
+ --without-mssql \
+ --with-ncurses \
+ --with-openssl \
+ --with-openssl-dir=/usr \
+ --disable-pcntl \
+ --without-pgsql \
+ --with-pspell \
+ --without-recode \
+ --disable-shmop \
+ --without-snmp \
+ --enable-soap \
+ --enable-sockets \
+ --without-sybase-ct \
+ --disable-sysvmsg \
+ --disable-sysvsem \
+ --disable-sysvshm \
+ --without-tidy \
+ --disable-wddx \
+ --disable-xmlreader \
+ --disable-xmlwriter \
+ --with-xmlrpc \
+ --without-xsl \
+ --enable-zip \
+ --with-zlib \
+ --disable-debug \
+ --enable-dba \
+ --without-cdb \
+ --disable-flatfile \
+ --with-gdbm \
+ --disable-inifile \
+ --without-qdbm \
+ --with-freetype-dir=/usr \
+ --with-t1lib=/usr \
+ --disable-gd-jis-conv \
+ --with-jpeg-dir=/usr \
+ --with-png-dir=/usr \
+ --without-xpm-dir \
+ --with-gd \
+ --with-imap \
+ --with-imap-ssl \
+ --without-interbase \
+ --without-mysql \
+ --without-mysqli \
+ --without-oci8 \
+ --without-pdo-dblib \
+ --without-pdo-mysql \
+ --without-pdo-pgsql \
+ --without-pdo-odbc \
+ --with-readline \
+ --without-libedit \
+ --without-mm \
+ --with-pcre-regex \
+ --with-config-file-path=/etc/php/cli-php5.2 \
+ --with-config-file-scan-dir=/etc/php/cli-php5.2/ext-active \
+ --enable-cli \
+ --disable-cgi \
+ --disable-embed \
+ --with-pic \
+ && \
+ make clean && \
+ make && \
+ make install && \
+
+ pecl install phar && \
+
+ wget https://github.com/treffynnon/php5.2-phpunit3.6.12-phar/releases/download/1.0.2/php52-phpunit.phar -O ~/phpunit && \
+ chmod +x ~/phpunit && \
+
+ cd /php && \
+
+ rm -Rf /php && \
+ rm -Rf /var/cache/* && \
+ rm -Rf /tmp/pear && \
+ apt-get purge -y \
+ apache2-prefork-dev autoconf binutils build-essential bzip2 \
+ comerr-dev cpp cpp-4.6 dpkg-dev g++ g++-4.6 gcc gcc-4.6 krb5-multidev \
+ libapr1-dev libaprutil1-dev libaspell-dev libbz2-dev \
+ libc-client2007e-dev libc-dev-bin libc6-dev \
+ libcurl4-openssl-dev libdpkg-perl libexpat1-dev \
+ libfreetype6-dev libgcrypt11-dev libgdbm-dev libgmp10 libgnutls-dev \
+ libgnutls-openssl27 libgnutlsxx27 libgomp1 libgpg-error-dev \
+ libgssrpc4 libice-dev libice6 libidn11-dev \
+ libjpeg-dev libjpeg-turbo8-dev libjpeg8-dev \
+ libkadm5clnt-mit8 libkadm5srv-mit8 libkdb5-6 \
+ libkrb5-dev libldap2-dev libltdl-dev libltdl7 \
+ libmagic-dev libmcrypt-dev libmhash-dev \
+ libmpc2 libmpfr4 libmysqlclient-dev libncurses5-dev \
+ libp11-kit-dev libpam0g-dev libpcre3-dev libpcrecpp0 libpng12-dev libpopt0 \
+ libpq-dev libpq5 libpspell-dev libpthread-stubs0 libpthread-stubs0-dev \
+ libquadmath0 libreadline-dev libreadline6-dev librtmp-dev \
+ libsm-dev libsm6 libsqlite3-dev libssl-dev libstdc++6-4.6-dev \
+ libt1-dev libtasn1-3-dev libtimedate-perl libtinfo-dev \
+ libx11-dev libxau-dev libxaw7 libxaw7-dev libxcb1-dev \
+ libxdmcp-dev libxext-dev libxext6 libxml2-dev libxmu-dev \
+ libxmu-headers libxmu6 libxpm-dev libxpm4 libxt-dev libxt6 linux-libc-dev \
+ m4 make patch pkg-config uuid-dev wget \
+ x11-common x11proto-core-dev x11proto-input-dev x11proto-kb-dev \
+ x11proto-xext-dev xorg-sgml-doctools xtrans-dev zlib1g-dev \
+ && \
+ apt-get clean && \
+ rm -rf /var/lib/apt/lists/*
+
+COPY php.ini /etc/php/cli-php5.2/ \ No newline at end of file
diff --git a/vendor/j4mie/idiorm/test/docker_for_php52/README.md b/vendor/j4mie/idiorm/test/docker_for_php52/README.md
new file mode 100644
index 000000000..80a6fb707
--- /dev/null
+++ b/vendor/j4mie/idiorm/test/docker_for_php52/README.md
@@ -0,0 +1,23 @@
+# Docker for PHP 5.2 testing
+
+Run all the following commands from this diretory.
+
+# Building the image
+
+ docker build . -f Dockerfile -t treffynnon/php5.2cli
+
+# Run the tests
+
+ docker run -t -v $(realpath ../..):/tmp/idiorm --rm treffynnon/php5.2cli /root/phpunit -c /tmp/idiorm/phpunit.xml
+
+# Running the container interactively
+
+ docker run -it -v $(realpath ../..):/tmp/idiorm --rm treffynnon/php5.2cli
+
+# Running the tests
+
+ ~/phpunit -c tmp/idiorm/phpunit.xml
+
+# Getting out of the interactive container
+
+ exit \ No newline at end of file
diff --git a/vendor/j4mie/idiorm/test/docker_for_php52/php.ini b/vendor/j4mie/idiorm/test/docker_for_php52/php.ini
new file mode 100644
index 000000000..e5395ce30
--- /dev/null
+++ b/vendor/j4mie/idiorm/test/docker_for_php52/php.ini
@@ -0,0 +1,1342 @@
+[PHP]
+
+;;;;;;;;;;;;;;;;;;;
+; About php.ini ;
+;;;;;;;;;;;;;;;;;;;
+; This file controls many aspects of PHP's behavior. In order for PHP to
+; read it, it must be named 'php.ini'. PHP looks for it in the current
+; working directory, in the path designated by the environment variable
+; PHPRC, and in the path that was defined in compile time (in that order).
+; Under Windows, the compile-time path is the Windows directory. The
+; path in which the php.ini file is looked for can be overridden using
+; the -c argument in command line mode.
+;
+; The syntax of the file is extremely simple. Whitespace and Lines
+; beginning with a semicolon are silently ignored (as you probably guessed).
+; Section headers (e.g. [Foo]) are also silently ignored, even though
+; they might mean something in the future.
+;
+; Directives are specified using the following syntax:
+; directive = value
+; Directive names are *case sensitive* - foo=bar is different from FOO=bar.
+;
+; The value can be a string, a number, a PHP constant (e.g. E_ALL or M_PI), one
+; of the INI constants (On, Off, True, False, Yes, No and None) or an expression
+; (e.g. E_ALL & ~E_NOTICE), or a quoted string ("foo").
+;
+; Expressions in the INI file are limited to bitwise operators and parentheses:
+; | bitwise OR
+; & bitwise AND
+; ~ bitwise NOT
+; ! boolean NOT
+;
+; Boolean flags can be turned on using the values 1, On, True or Yes.
+; They can be turned off using the values 0, Off, False or No.
+;
+; An empty string can be denoted by simply not writing anything after the equal
+; sign, or by using the None keyword:
+;
+; foo = ; sets foo to an empty string
+; foo = none ; sets foo to an empty string
+; foo = "none" ; sets foo to the string 'none'
+;
+; If you use constants in your value, and these constants belong to a
+; dynamically loaded extension (either a PHP extension or a Zend extension),
+; you may only use these constants *after* the line that loads the extension.
+;
+;
+;;;;;;;;;;;;;;;;;;;
+; About this file ;
+;;;;;;;;;;;;;;;;;;;
+; This is the recommended, PHP 5-style version of the php.ini-dist file. It
+; sets some non standard settings, that make PHP more efficient, more secure,
+; and encourage cleaner coding.
+;
+; The price is that with these settings, PHP may be incompatible with some
+; applications, and sometimes, more difficult to develop with. Using this
+; file is warmly recommended for production sites. As all of the changes from
+; the standard settings are thoroughly documented, you can go over each one,
+; and decide whether you want to use it or not.
+;
+; For general information about the php.ini file, please consult the php.ini-dist
+; file, included in your PHP distribution.
+;
+; This file is different from the php.ini-dist file in the fact that it features
+; different values for several directives, in order to improve performance, while
+; possibly breaking compatibility with the standard out-of-the-box behavior of
+; PHP. Please make sure you read what's different, and modify your scripts
+; accordingly, if you decide to use this file instead.
+;
+; - register_long_arrays = Off [Performance]
+; Disables registration of the older (and deprecated) long predefined array
+; variables ($HTTP_*_VARS). Instead, use the superglobals that were
+; introduced in PHP 4.1.0
+; - display_errors = Off [Security]
+; With this directive set to off, errors that occur during the execution of
+; scripts will no longer be displayed as a part of the script output, and thus,
+; will no longer be exposed to remote users. With some errors, the error message
+; content may expose information about your script, web server, or database
+; server that may be exploitable for hacking. Production sites should have this
+; directive set to off.
+; - log_errors = On [Security]
+; This directive complements the above one. Any errors that occur during the
+; execution of your script will be logged (typically, to your server's error log,
+; but can be configured in several ways). Along with setting display_errors to off,
+; this setup gives you the ability to fully understand what may have gone wrong,
+; without exposing any sensitive information to remote users.
+; - output_buffering = 4096 [Performance]
+; Set a 4KB output buffer. Enabling output buffering typically results in less
+; writes, and sometimes less packets sent on the wire, which can often lead to
+; better performance. The gain this directive actually yields greatly depends
+; on which Web server you're working with, and what kind of scripts you're using.
+; - register_argc_argv = Off [Performance]
+; Disables registration of the somewhat redundant $argv and $argc global
+; variables.
+; - magic_quotes_gpc = Off [Performance]
+; Input data is no longer escaped with slashes so that it can be sent into
+; SQL databases without further manipulation. Instead, you should use the
+; database vendor specific escape string function on each input element you
+; wish to send to a database.
+; - variables_order = "GPCS" [Performance]
+; The environment variables are not hashed into the $_ENV. To access
+; environment variables, you can use getenv() instead.
+; - error_reporting = E_ALL [Code Cleanliness, Security(?)]
+; By default, PHP suppresses errors of type E_NOTICE. These error messages
+; are emitted for non-critical errors, but that could be a symptom of a bigger
+; problem. Most notably, this will cause error messages about the use
+; of uninitialized variables to be displayed.
+; - allow_call_time_pass_reference = Off [Code cleanliness]
+; It's not possible to decide to force a variable to be passed by reference
+; when calling a function. The PHP 4 style to do this is by making the
+; function require the relevant argument by reference.
+; - short_open_tag = Off [Portability]
+; Using short tags is discouraged when developing code meant for redistribution
+; since short tags may not be supported on the target server.
+
+;;;;;;;;;;;;;;;;;;;;
+; Language Options ;
+;;;;;;;;;;;;;;;;;;;;
+
+; Enable the PHP scripting language engine under Apache.
+engine = On
+
+; Enable compatibility mode with Zend Engine 1 (PHP 4.x)
+zend.ze1_compatibility_mode = Off
+
+; Allow the <? tag. Otherwise, only <?php and <script> tags are recognized.
+; NOTE: Using short tags should be avoided when developing applications or
+; libraries that are meant for redistribution, or deployment on PHP
+; servers which are not under your control, because short tags may not
+; be supported on the target server. For portable, redistributable code,
+; be sure not to use short tags.
+short_open_tag = Off
+
+; Allow ASP-style <% %> tags.
+asp_tags = Off
+
+; The number of significant digits displayed in floating point numbers.
+precision = 14
+
+; Enforce year 2000 compliance (will cause problems with non-compliant browsers)
+y2k_compliance = On
+
+; Output buffering allows you to send header lines (including cookies) even
+; after you send body content, at the price of slowing PHP's output layer a
+; bit. You can enable output buffering during runtime by calling the output
+; buffering functions. You can also enable output buffering for all files by
+; setting this directive to On. If you wish to limit the size of the buffer
+; to a certain size - you can use a maximum number of bytes instead of 'On', as
+; a value for this directive (e.g., output_buffering=4096).
+output_buffering = 4096
+
+; You can redirect all of the output of your scripts to a function. For
+; example, if you set output_handler to "mb_output_handler", character
+; encoding will be transparently converted to the specified encoding.
+; Setting any output handler automatically turns on output buffering.
+; Note: People who wrote portable scripts should not depend on this ini
+; directive. Instead, explicitly set the output handler using ob_start().
+; Using this ini directive may cause problems unless you know what script
+; is doing.
+; Note: You cannot use both "mb_output_handler" with "ob_iconv_handler"
+; and you cannot use both "ob_gzhandler" and "zlib.output_compression".
+; Note: output_handler must be empty if this is set 'On' !!!!
+; Instead you must use zlib.output_handler.
+;output_handler =
+
+; Transparent output compression using the zlib library
+; Valid values for this option are 'off', 'on', or a specific buffer size
+; to be used for compression (default is 4KB)
+; Note: Resulting chunk size may vary due to nature of compression. PHP
+; outputs chunks that are few hundreds bytes each as a result of
+; compression. If you prefer a larger chunk size for better
+; performance, enable output_buffering in addition.
+; Note: You need to use zlib.output_handler instead of the standard
+; output_handler, or otherwise the output will be corrupted.
+zlib.output_compression = Off
+;zlib.output_compression_level = -1
+
+; You cannot specify additional output handlers if zlib.output_compression
+; is activated here. This setting does the same as output_handler but in
+; a different order.
+;zlib.output_handler =
+
+; Implicit flush tells PHP to tell the output layer to flush itself
+; automatically after every output block. This is equivalent to calling the
+; PHP function flush() after each and every call to print() or echo() and each
+; and every HTML block. Turning this option on has serious performance
+; implications and is generally recommended for debugging purposes only.
+implicit_flush = Off
+
+; The unserialize callback function will be called (with the undefined class'
+; name as parameter), if the unserializer finds an undefined class
+; which should be instantiated.
+; A warning appears if the specified function is not defined, or if the
+; function doesn't include/implement the missing class.
+; So only set this entry, if you really want to implement such a
+; callback-function.
+unserialize_callback_func=
+
+; When floats & doubles are serialized store serialize_precision significant
+; digits after the floating point. The default value ensures that when floats
+; are decoded with unserialize, the data will remain the same.
+serialize_precision = 100
+
+; Whether to enable the ability to force arguments to be passed by reference
+; at function call time. This method is deprecated and is likely to be
+; unsupported in future versions of PHP/Zend. The encouraged method of
+; specifying which arguments should be passed by reference is in the function
+; declaration. You're encouraged to try and turn this option Off and make
+; sure your scripts work properly with it in order to ensure they will work
+; with future versions of the language (you will receive a warning each time
+; you use this feature, and the argument will be passed by value instead of by
+; reference).
+allow_call_time_pass_reference = Off
+
+;
+; Safe Mode
+;
+safe_mode = Off
+
+; By default, Safe Mode does a UID compare check when
+; opening files. If you want to relax this to a GID compare,
+; then turn on safe_mode_gid.
+safe_mode_gid = Off
+
+; When safe_mode is on, UID/GID checks are bypassed when
+; including files from this directory and its subdirectories.
+; (directory must also be in include_path or full path must
+; be used when including)
+safe_mode_include_dir =
+
+; When safe_mode is on, only executables located in the safe_mode_exec_dir
+; will be allowed to be executed via the exec family of functions.
+safe_mode_exec_dir =
+
+; Setting certain environment variables may be a potential security breach.
+; This directive contains a comma-delimited list of prefixes. In Safe Mode,
+; the user may only alter environment variables whose names begin with the
+; prefixes supplied here. By default, users will only be able to set
+; environment variables that begin with PHP_ (e.g. PHP_FOO=BAR).
+;
+; Note: If this directive is empty, PHP will let the user modify ANY
+; environment variable!
+safe_mode_allowed_env_vars = PHP_
+
+; This directive contains a comma-delimited list of environment variables that
+; the end user won't be able to change using putenv(). These variables will be
+; protected even if safe_mode_allowed_env_vars is set to allow to change them.
+safe_mode_protected_env_vars = LD_LIBRARY_PATH
+
+; open_basedir, if set, limits all file operations to the defined directory
+; and below. This directive makes most sense if used in a per-directory
+; or per-virtualhost web server configuration file. This directive is
+; *NOT* affected by whether Safe Mode is turned On or Off.
+;open_basedir =
+
+; This directive allows you to disable certain functions for security reasons.
+; It receives a comma-delimited list of function names. This directive is
+; *NOT* affected by whether Safe Mode is turned On or Off.
+disable_functions =
+
+; This directive allows you to disable certain classes for security reasons.
+; It receives a comma-delimited list of class names. This directive is
+; *NOT* affected by whether Safe Mode is turned On or Off.
+disable_classes =
+
+; Colors for Syntax Highlighting mode. Anything that's acceptable in
+; <span style="color: ???????"> would work.
+;highlight.string = #DD0000
+;highlight.comment = #FF9900
+;highlight.keyword = #007700
+;highlight.bg = #FFFFFF
+;highlight.default = #0000BB
+;highlight.html = #000000
+
+; If enabled, the request will be allowed to complete even if the user aborts
+; the request. Consider enabling it if executing long request, which may end up
+; being interrupted by the user or a browser timing out.
+; ignore_user_abort = On
+
+; Determines the size of the realpath cache to be used by PHP. This value should
+; be increased on systems where PHP opens many files to reflect the quantity of
+; the file operations performed.
+; realpath_cache_size=16k
+
+; Duration of time, in seconds for which to cache realpath information for a given
+; file or directory. For systems with rarely changing files, consider increasing this
+; value.
+; realpath_cache_ttl=120
+
+;
+; Misc
+;
+; Decides whether PHP may expose the fact that it is installed on the server
+; (e.g. by adding its signature to the Web server header). It is no security
+; threat in any way, but it makes it possible to determine whether you use PHP
+; on your server or not.
+expose_php = Off
+
+
+;;;;;;;;;;;;;;;;;;;
+; Resource Limits ;
+;;;;;;;;;;;;;;;;;;;
+
+max_execution_time = 30 ; Maximum execution time of each script, in seconds
+max_input_time = 60 ; Maximum amount of time each script may spend parsing request data
+;max_input_nesting_level = 64 ; Maximum input variable nesting level
+memory_limit = 128M ; Maximum amount of memory a script may consume (128MB)
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Error handling and logging ;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+; error_reporting is a bit-field. Or each number up to get desired error
+; reporting level
+; E_ALL - All errors and warnings (doesn't include E_STRICT)
+; E_ERROR - fatal run-time errors
+; E_RECOVERABLE_ERROR - almost fatal run-time errors
+; E_WARNING - run-time warnings (non-fatal errors)
+; E_PARSE - compile-time parse errors
+; E_NOTICE - run-time notices (these are warnings which often result
+; from a bug in your code, but it's possible that it was
+; intentional (e.g., using an uninitialized variable and
+; relying on the fact it's automatically initialized to an
+; empty string)
+; E_STRICT - run-time notices, enable to have PHP suggest changes
+; to your code which will ensure the best interoperability
+; and forward compatibility of your code
+; E_CORE_ERROR - fatal errors that occur during PHP's initial startup
+; E_CORE_WARNING - warnings (non-fatal errors) that occur during PHP's
+; initial startup
+; E_COMPILE_ERROR - fatal compile-time errors
+; E_COMPILE_WARNING - compile-time warnings (non-fatal errors)
+; E_USER_ERROR - user-generated error message
+; E_USER_WARNING - user-generated warning message
+; E_USER_NOTICE - user-generated notice message
+;
+; Examples:
+;
+; - Show all errors, except for notices and coding standards warnings
+;
+;error_reporting = E_ALL & ~E_NOTICE
+;
+; - Show all errors, except for notices
+;
+;error_reporting = E_ALL & ~E_NOTICE | E_STRICT
+;
+; - Show only errors
+;
+;error_reporting = E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR
+;
+; - Show all errors, except coding standards warnings
+;
+;error_reporting = E_ALL
+error_reporting = 6135
+
+; Print out errors (as a part of the output). For production web sites,
+; you're strongly encouraged to turn this feature off, and use error logging
+; instead (see below). Keeping display_errors enabled on a production web site
+; may reveal security information to end users, such as file paths on your Web
+; server, your database schema or other information.
+;
+; possible values for display_errors:
+;
+; Off - Do not display any errors
+; stderr - Display errors to STDERR (affects only CGI/CLI binaries!)
+; On or stdout - Display errors to STDOUT (default)
+;
+; To output errors to STDERR with CGI/CLI:
+;display_errors = "stderr"
+;
+; Default
+;
+display_errors = Off
+
+; Even when display_errors is on, errors that occur during PHP's startup
+; sequence are not displayed. It's strongly recommended to keep
+; display_startup_errors off, except for when debugging.
+display_startup_errors = Off
+
+; Log errors into a log file (server-specific log, stderr, or error_log (below))
+; As stated above, you're strongly advised to use error logging in place of
+; error displaying on production web sites.
+log_errors = On
+
+; Set maximum length of log_errors. In error_log information about the source is
+; added. The default is 1024 and 0 allows to not apply any maximum length at all.
+log_errors_max_len = 1024
+
+; Do not log repeated messages. Repeated errors must occur in same file on same
+; line unless ignore_repeated_source is set true.
+ignore_repeated_errors = Off
+
+; Ignore source of message when ignoring repeated messages. When this setting
+; is On you will not log errors with repeated messages from different files or
+; source lines.
+ignore_repeated_source = Off
+
+; If this parameter is set to Off, then memory leaks will not be shown (on
+; stdout or in the log). This has only effect in a debug compile, and if
+; error reporting includes E_WARNING in the allowed list
+report_memleaks = On
+
+;report_zend_debug = 0
+
+; Store the last error/warning message in $php_errormsg (boolean).
+track_errors = Off
+
+; Turn off normal error reporting and emit XML-RPC error XML
+;xmlrpc_errors = 0
+; An XML-RPC faultCode
+;xmlrpc_error_number = 0
+
+; Disable the inclusion of HTML tags in error messages.
+; Note: Never use this feature for production boxes.
+;html_errors = Off
+
+; If html_errors is set On PHP produces clickable error messages that direct
+; to a page describing the error or function causing the error in detail.
+; You can download a copy of the PHP manual from http://www.php.net/docs.php
+; and change docref_root to the base URL of your local copy including the
+; leading '/'. You must also specify the file extension being used including
+; the dot.
+; Note: Never use this feature for production boxes.
+;docref_root = "/phpmanual/"
+;docref_ext = .html
+
+; String to output before an error message.
+;error_prepend_string = "<font color=#ff0000>"
+
+; String to output after an error message.
+;error_append_string = "</font>"
+
+; Log errors to specified file.
+;error_log = filename
+
+; Log errors to syslog (Event Log on NT, not valid in Windows 95).
+;error_log = syslog
+
+
+;;;;;;;;;;;;;;;;;
+; Data Handling ;
+;;;;;;;;;;;;;;;;;
+;
+; Note - track_vars is ALWAYS enabled as of PHP 4.0.3
+
+; The separator used in PHP generated URLs to separate arguments.
+; Default is "&".
+;arg_separator.output = "&amp;"
+
+; List of separator(s) used by PHP to parse input URLs into variables.
+; Default is "&".
+; NOTE: Every character in this directive is considered as separator!
+;arg_separator.input = ";&"
+
+; This directive describes the order in which PHP registers GET, POST, Cookie,
+; Environment and Built-in variables (G, P, C, E & S respectively, often
+; referred to as EGPCS or GPC). Registration is done from left to right, newer
+; values override older values.
+variables_order = "GPCS"
+
+; Whether or not to register the EGPCS variables as global variables. You may
+; want to turn this off if you don't want to clutter your scripts' global scope
+; with user data. This makes most sense when coupled with track_vars - in which
+; case you can access all of the GPC variables through the $HTTP_*_VARS[],
+; variables.
+;
+; You should do your best to write your scripts so that they do not require
+; register_globals to be on; Using form variables as globals can easily lead
+; to possible security problems, if the code is not very well thought of.
+register_globals = Off
+
+; Whether or not to register the old-style input arrays, HTTP_GET_VARS
+; and friends. If you're not using them, it's recommended to turn them off,
+; for performance reasons.
+register_long_arrays = Off
+
+; This directive tells PHP whether to declare the argv&argc variables (that
+; would contain the GET information). If you don't use these variables, you
+; should turn it off for increased performance.
+register_argc_argv = Off
+
+; When enabled, the SERVER and ENV variables are created when they're first
+; used (Just In Time) instead of when the script starts. If these variables
+; are not used within a script, having this directive on will result in a
+; performance gain. The PHP directives register_globals, register_long_arrays,
+; and register_argc_argv must be disabled for this directive to have any affect.
+auto_globals_jit = On
+
+; Maximum size of POST data that PHP will accept.
+post_max_size = 8M
+
+; Magic quotes
+;
+
+; Magic quotes for incoming GET/POST/Cookie data.
+magic_quotes_gpc = Off
+
+; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc.
+magic_quotes_runtime = Off
+
+; Use Sybase-style magic quotes (escape ' with '' instead of \').
+magic_quotes_sybase = Off
+
+; Automatically add files before or after any PHP document.
+auto_prepend_file =
+auto_append_file =
+
+; As of 4.0b4, PHP always outputs a character encoding by default in
+; the Content-type: header. To disable sending of the charset, simply
+; set it to be empty.
+;
+; PHP's built-in default is text/html
+default_mimetype = "text/html"
+;default_charset = "iso-8859-1"
+
+; Always populate the $HTTP_RAW_POST_DATA variable.
+;always_populate_raw_post_data = On
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;
+; Paths and Directories ;
+;;;;;;;;;;;;;;;;;;;;;;;;;
+
+; UNIX: "/path1:/path2"
+include_path = ".:/usr/lib/php5.2/lib/php"
+;
+; Windows: "\path1;\path2"
+;include_path = ".;c:\php\includes"
+
+; The root of the PHP pages, used only if nonempty.
+; if PHP was not compiled with FORCE_REDIRECT, you SHOULD set doc_root
+; if you are running php as a CGI under any web server (other than IIS)
+; see documentation for security issues. The alternate is to use the
+; cgi.force_redirect configuration below
+doc_root =
+
+; The directory under which PHP opens the script using /~username used only
+; if nonempty.
+user_dir =
+
+; Directory in which the loadable extensions (modules) reside.
+extension_dir = "/usr/lib/php5.2/lib/extensions/no-debug-non-zts-20060613/"
+
+; Whether or not to enable the dl() function. The dl() function does NOT work
+; properly in multithreaded servers, such as IIS or Zeus, and is automatically
+; disabled on them.
+enable_dl = On
+
+; cgi.force_redirect is necessary to provide security running PHP as a CGI under
+; most web servers. Left undefined, PHP turns this on by default. You can
+; turn it off here AT YOUR OWN RISK
+; **You CAN safely turn this off for IIS, in fact, you MUST.**
+; cgi.force_redirect = 1
+
+; if cgi.nph is enabled it will force cgi to always sent Status: 200 with
+; every request.
+; cgi.nph = 1
+
+; if cgi.force_redirect is turned on, and you are not running under Apache or Netscape
+; (iPlanet) web servers, you MAY need to set an environment variable name that PHP
+; will look for to know it is OK to continue execution. Setting this variable MAY
+; cause security issues, KNOW WHAT YOU ARE DOING FIRST.
+; cgi.redirect_status_env = ;
+
+; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's
+; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok
+; what PATH_INFO is. For more information on PATH_INFO, see the cgi specs. Setting
+; this to 1 will cause PHP CGI to fix it's paths to conform to the spec. A setting
+; of zero causes PHP to behave as before. Default is 1. You should fix your scripts
+; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
+; cgi.fix_pathinfo=1
+
+; FastCGI under IIS (on WINNT based OS) supports the ability to impersonate
+; security tokens of the calling client. This allows IIS to define the
+; security context that the request runs under. mod_fastcgi under Apache
+; does not currently support this feature (03/17/2002)
+; Set to 1 if running under IIS. Default is zero.
+; fastcgi.impersonate = 1;
+
+; Disable logging through FastCGI connection
+; fastcgi.logging = 0
+
+; cgi.rfc2616_headers configuration option tells PHP what type of headers to
+; use when sending HTTP response code. If it's set 0 PHP sends Status: header that
+; is supported by Apache. When this option is set to 1 PHP will send
+; RFC2616 compliant header.
+; Default is zero.
+;cgi.rfc2616_headers = 0
+
+
+;;;;;;;;;;;;;;;;
+; File Uploads ;
+;;;;;;;;;;;;;;;;
+
+; Whether to allow HTTP file uploads.
+file_uploads = On
+
+; Temporary directory for HTTP uploaded files (will use system default if not
+; specified).
+;upload_tmp_dir =
+
+; Maximum allowed size for uploaded files.
+upload_max_filesize = 2M
+
+
+; Maximum number of files that can be uploaded via a single request
+max_file_uploads = 20
+
+;;;;;;;;;;;;;;;;;;
+; Fopen wrappers ;
+;;;;;;;;;;;;;;;;;;
+
+; Whether to allow the treatment of URLs (like http:// or ftp://) as files.
+allow_url_fopen = On
+
+; Whether to allow include/require to open URLs (like http:// or ftp://) as files.
+allow_url_include = Off
+
+; Define the anonymous ftp password (your email address)
+
+; Define the User-Agent string
+; user_agent="PHP"
+
+; Default timeout for socket based streams (seconds)
+default_socket_timeout = 60
+
+; If your scripts have to deal with files from Macintosh systems,
+; or you are running on a Mac and need to deal with files from
+; unix or win32 systems, setting this flag will cause PHP to
+; automatically detect the EOL character in those files so that
+; fgets() and file() will work regardless of the source of the file.
+; auto_detect_line_endings = Off
+
+
+;;;;;;;;;;;;;;;;;;;;;;
+; Dynamic Extensions ;
+;;;;;;;;;;;;;;;;;;;;;;
+;
+; If you wish to have an extension loaded automatically, use the following
+; syntax:
+;
+; extension=modulename.extension
+;
+; For example, on Windows:
+;
+; extension=msql.dll
+;
+; ... or under UNIX:
+;
+; extension=msql.so
+;
+; Note that it should be the name of the module only; no directory information
+; needs to go here. Specify the location of the extension with the
+; extension_dir directive above.
+
+
+; Windows Extensions
+; Note that ODBC support is built in, so no dll is needed for it.
+; Note that many DLL files are located in the extensions/ (PHP 4) ext/ (PHP 5)
+; extension folders as well as the separate PECL DLL download (PHP 5).
+; Be sure to appropriately set the extension_dir directive.
+
+;extension=php_bz2.dll
+;extension=php_curl.dll
+;extension=php_dba.dll
+;extension=php_dbase.dll
+;extension=php_fdf.dll
+;extension=php_gd2.dll
+;extension=php_gettext.dll
+;extension=php_gmp.dll
+;extension=php_ifx.dll
+;extension=php_imap.dll
+;extension=php_interbase.dll
+;extension=php_ldap.dll
+;extension=php_mbstring.dll
+;extension=php_exif.dll
+;extension=php_mcrypt.dll
+;extension=php_mhash.dll
+;extension=php_mime_magic.dll
+;extension=php_ming.dll
+;extension=php_msql.dll
+;extension=php_mssql.dll
+;extension=php_mysql.dll
+;extension=php_mysqli.dll
+;extension=php_oci8.dll
+;extension=php_openssl.dll
+;extension=php_pdo.dll
+;extension=php_pdo_firebird.dll
+;extension=php_pdo_mssql.dll
+;extension=php_pdo_mysql.dll
+;extension=php_pdo_oci.dll
+;extension=php_pdo_oci8.dll
+;extension=php_pdo_odbc.dll
+;extension=php_pdo_pgsql.dll
+;extension=php_pdo_sqlite.dll
+;extension=php_pgsql.dll
+;extension=php_pspell.dll
+;extension=php_shmop.dll
+;extension=php_snmp.dll
+;extension=php_soap.dll
+;extension=php_sockets.dll
+;extension=php_sqlite.dll
+;extension=php_sybase_ct.dll
+;extension=php_tidy.dll
+;extension=php_xmlrpc.dll
+;extension=php_xsl.dll
+;extension=php_zip.dll
+extension=phar.so
+
+;;;;;;;;;;;;;;;;;;;
+; Module Settings ;
+;;;;;;;;;;;;;;;;;;;
+
+[Date]
+; Defines the default timezone used by the date functions
+date.timezone = "Europe/Berlin"
+
+;date.default_latitude = 31.7667
+;date.default_longitude = 35.2333
+
+;date.sunrise_zenith = 90.583333
+;date.sunset_zenith = 90.583333
+
+[filter]
+;filter.default = unsafe_raw
+;filter.default_flags =
+
+[iconv]
+;iconv.input_encoding = ISO-8859-1
+;iconv.internal_encoding = ISO-8859-1
+;iconv.output_encoding = ISO-8859-1
+
+[sqlite]
+;sqlite.assoc_case = 0
+
+[Pcre]
+;PCRE library backtracking limit.
+;pcre.backtrack_limit=100000
+
+;PCRE library recursion limit.
+;Please note that if you set this value to a high number you may consume all
+;the available process stack and eventually crash PHP (due to reaching the
+;stack size limit imposed by the Operating System).
+;pcre.recursion_limit=100000
+
+[Syslog]
+; Whether or not to define the various syslog variables (e.g. $LOG_PID,
+; $LOG_CRON, etc.). Turning it off is a good idea performance-wise. In
+; runtime, you can define these variables by calling define_syslog_variables().
+define_syslog_variables = Off
+
+[mail function]
+; For Win32 only.
+SMTP = localhost
+smtp_port = 25
+
+; For Win32 only.
+;sendmail_from = [email protected]
+
+; For Unix only. You may supply arguments as well (default: "sendmail -t -i").
+sendmail_path = "/usr/sbin/ssmtp -t"
+
+; Force the addition of the specified parameters to be passed as extra parameters
+; to the sendmail binary. These parameters will always replace the value of
+; the 5th parameter to mail(), even in safe mode.
+;mail.force_extra_parameters =
+
+[SQL]
+sql.safe_mode = Off
+
+[ODBC]
+;odbc.default_db = Not yet implemented
+;odbc.default_user = Not yet implemented
+;odbc.default_pw = Not yet implemented
+
+; Allow or prevent persistent links.
+odbc.allow_persistent = On
+
+; Check that a connection is still valid before reuse.
+odbc.check_persistent = On
+
+; Maximum number of persistent links. -1 means no limit.
+odbc.max_persistent = -1
+
+; Maximum number of links (persistent + non-persistent). -1 means no limit.
+odbc.max_links = -1
+
+; Handling of LONG fields. Returns number of bytes to variables. 0 means
+; passthru.
+odbc.defaultlrl = 4096
+
+; Handling of binary data. 0 means passthru, 1 return as is, 2 convert to char.
+; See the documentation on odbc_binmode and odbc_longreadlen for an explanation
+; of uodbc.defaultlrl and uodbc.defaultbinmode
+odbc.defaultbinmode = 1
+
+[MySQL]
+; Allow or prevent persistent links.
+mysql.allow_persistent = On
+
+; Maximum number of persistent links. -1 means no limit.
+mysql.max_persistent = -1
+
+; Maximum number of links (persistent + non-persistent). -1 means no limit.
+mysql.max_links = -1
+
+; Default port number for mysql_connect(). If unset, mysql_connect() will use
+; the $MYSQL_TCP_PORT or the mysql-tcp entry in /etc/services or the
+; compile-time value defined MYSQL_PORT (in that order). Win32 will only look
+; at MYSQL_PORT.
+mysql.default_port =
+
+; Default socket name for local MySQL connects. If empty, uses the built-in
+; MySQL defaults.
+mysql.default_socket =
+
+; Default host for mysql_connect() (doesn't apply in safe mode).
+mysql.default_host =
+
+; Default user for mysql_connect() (doesn't apply in safe mode).
+mysql.default_user =
+
+; Default password for mysql_connect() (doesn't apply in safe mode).
+; Note that this is generally a *bad* idea to store passwords in this file.
+; *Any* user with PHP access can run 'echo get_cfg_var("mysql.default_password")
+; and reveal this password! And of course, any users with read access to this
+; file will be able to reveal the password as well.
+mysql.default_password =
+
+; Maximum time (in seconds) for connect timeout. -1 means no limit
+mysql.connect_timeout = 60
+
+; Trace mode. When trace_mode is active (=On), warnings for table/index scans and
+; SQL-Errors will be displayed.
+mysql.trace_mode = Off
+
+[MySQLi]
+
+; Maximum number of links. -1 means no limit.
+mysqli.max_links = -1
+
+; Default port number for mysqli_connect(). If unset, mysqli_connect() will use
+; the $MYSQL_TCP_PORT or the mysql-tcp entry in /etc/services or the
+; compile-time value defined MYSQL_PORT (in that order). Win32 will only look
+; at MYSQL_PORT.
+mysqli.default_port = 3306
+
+; Default socket name for local MySQL connects. If empty, uses the built-in
+; MySQL defaults.
+mysqli.default_socket =
+
+; Default host for mysql_connect() (doesn't apply in safe mode).
+mysqli.default_host =
+
+; Default user for mysql_connect() (doesn't apply in safe mode).
+mysqli.default_user =
+
+; Default password for mysqli_connect() (doesn't apply in safe mode).
+; Note that this is generally a *bad* idea to store passwords in this file.
+; *Any* user with PHP access can run 'echo get_cfg_var("mysqli.default_pw")
+; and reveal this password! And of course, any users with read access to this
+; file will be able to reveal the password as well.
+mysqli.default_pw =
+
+; Allow or prevent reconnect
+mysqli.reconnect = Off
+
+[mSQL]
+; Allow or prevent persistent links.
+msql.allow_persistent = On
+
+; Maximum number of persistent links. -1 means no limit.
+msql.max_persistent = -1
+
+; Maximum number of links (persistent+non persistent). -1 means no limit.
+msql.max_links = -1
+
+[OCI8]
+; enables privileged connections using external credentials (OCI_SYSOPER, OCI_SYSDBA)
+;oci8.privileged_connect = Off
+
+; Connection: The maximum number of persistent OCI8 connections per
+; process. Using -1 means no limit.
+;oci8.max_persistent = -1
+
+; Connection: The maximum number of seconds a process is allowed to
+; maintain an idle persistent connection. Using -1 means idle
+; persistent connections will be maintained forever.
+;oci8.persistent_timeout = -1
+
+; Connection: The number of seconds that must pass before issuing a
+; ping during oci_pconnect() to check the connection validity. When
+; set to 0, each oci_pconnect() will cause a ping. Using -1 disables
+; pings completely.
+;oci8.ping_interval = 60
+
+; Tuning: This option enables statement caching, and specifies how
+; many statements to cache. Using 0 disables statement caching.
+;oci8.statement_cache_size = 20
+
+; Tuning: Enables statement prefetching and sets the default number of
+; rows that will be fetched automatically after statement execution.
+;oci8.default_prefetch = 10
+
+; Compatibility. Using On means oci_close() will not close
+; oci_connect() and oci_new_connect() connections.
+;oci8.old_oci_close_semantics = Off
+
+[PostgresSQL]
+; Allow or prevent persistent links.
+pgsql.allow_persistent = On
+
+; Detect broken persistent links always with pg_pconnect().
+; Auto reset feature requires a little overheads.
+pgsql.auto_reset_persistent = Off
+
+; Maximum number of persistent links. -1 means no limit.
+pgsql.max_persistent = -1
+
+; Maximum number of links (persistent+non persistent). -1 means no limit.
+pgsql.max_links = -1
+
+; Ignore PostgreSQL backends Notice message or not.
+; Notice message logging require a little overheads.
+pgsql.ignore_notice = 0
+
+; Log PostgreSQL backends Notice message or not.
+; Unless pgsql.ignore_notice=0, module cannot log notice message.
+pgsql.log_notice = 0
+
+[Sybase]
+; Allow or prevent persistent links.
+sybase.allow_persistent = On
+
+; Maximum number of persistent links. -1 means no limit.
+sybase.max_persistent = -1
+
+; Maximum number of links (persistent + non-persistent). -1 means no limit.
+sybase.max_links = -1
+
+;sybase.interface_file = "/usr/sybase/interfaces"
+
+; Minimum error severity to display.
+sybase.min_error_severity = 10
+
+; Minimum message severity to display.
+sybase.min_message_severity = 10
+
+; Compatibility mode with old versions of PHP 3.0.
+; If on, this will cause PHP to automatically assign types to results according
+; to their Sybase type, instead of treating them all as strings. This
+; compatibility mode will probably not stay around forever, so try applying
+; whatever necessary changes to your code, and turn it off.
+sybase.compatability_mode = Off
+
+[Sybase-CT]
+; Allow or prevent persistent links.
+sybct.allow_persistent = On
+
+; Maximum number of persistent links. -1 means no limit.
+sybct.max_persistent = -1
+
+; Maximum number of links (persistent + non-persistent). -1 means no limit.
+sybct.max_links = -1
+
+; Minimum server message severity to display.
+sybct.min_server_severity = 10
+
+; Minimum client message severity to display.
+sybct.min_client_severity = 10
+
+[bcmath]
+; Number of decimal digits for all bcmath functions.
+bcmath.scale = 0
+
+[browscap]
+;browscap = extra/browscap.ini
+
+[Informix]
+; Default host for ifx_connect() (doesn't apply in safe mode).
+ifx.default_host =
+
+; Default user for ifx_connect() (doesn't apply in safe mode).
+ifx.default_user =
+
+; Default password for ifx_connect() (doesn't apply in safe mode).
+ifx.default_password =
+
+; Allow or prevent persistent links.
+ifx.allow_persistent = On
+
+; Maximum number of persistent links. -1 means no limit.
+ifx.max_persistent = -1
+
+; Maximum number of links (persistent + non-persistent). -1 means no limit.
+ifx.max_links = -1
+
+; If on, select statements return the contents of a text blob instead of its id.
+ifx.textasvarchar = 0
+
+; If on, select statements return the contents of a byte blob instead of its id.
+ifx.byteasvarchar = 0
+
+; Trailing blanks are stripped from fixed-length char columns. May help the
+; life of Informix SE users.
+ifx.charasvarchar = 0
+
+; If on, the contents of text and byte blobs are dumped to a file instead of
+; keeping them in memory.
+ifx.blobinfile = 0
+
+; NULL's are returned as empty strings, unless this is set to 1. In that case,
+; NULL's are returned as string 'NULL'.
+ifx.nullformat = 0
+
+[Session]
+; Handler used to store/retrieve data.
+session.save_handler = files
+
+; Argument passed to save_handler. In the case of files, this is the path
+; where data files are stored. Note: Windows users have to change this
+; variable in order to use PHP's session functions.
+;
+; As of PHP 4.0.1, you can define the path as:
+;
+; session.save_path = "N;/path"
+;
+; where N is an integer. Instead of storing all the session files in
+; /path, what this will do is use subdirectories N-levels deep, and
+; store the session data in those directories. This is useful if you
+; or your OS have problems with lots of files in one directory, and is
+; a more efficient layout for servers that handle lots of sessions.
+;
+; NOTE 1: PHP will not create this directory structure automatically.
+; You can use the script in the ext/session dir for that purpose.
+; NOTE 2: See the section on garbage collection below if you choose to
+; use subdirectories for session storage
+;
+; The file storage module creates files using mode 600 by default.
+; You can change that by using
+;
+; session.save_path = "N;MODE;/path"
+;
+; where MODE is the octal representation of the mode. Note that this
+; does not overwrite the process's umask.
+;session.save_path = "/tmp"
+
+; Whether to use cookies.
+session.use_cookies = 1
+
+;session.cookie_secure =
+
+; This option enables administrators to make their users invulnerable to
+; attacks which involve passing session ids in URLs; defaults to 0.
+; session.use_only_cookies = 1
+
+; Name of the session (used as cookie name).
+session.name = PHPSESSID
+
+; Initialize session on request startup.
+session.auto_start = 0
+
+; Lifetime in seconds of cookie or, if 0, until browser is restarted.
+session.cookie_lifetime = 28800
+
+; The path for which the cookie is valid.
+session.cookie_path = /
+
+; The domain for which the cookie is valid.
+session.cookie_domain =
+
+; Whether or not to add the httpOnly flag to the cookie, which makes it inaccessible to browser scripting languages such as JavaScript.
+session.cookie_httponly =
+
+; Handler used to serialize data. php is the standard serializer of PHP.
+session.serialize_handler = php
+
+; Define the probability that the 'garbage collection' process is started
+; on every session initialization.
+; The probability is calculated by using gc_probability/gc_divisor,
+; e.g. 1/100 means there is a 1% chance that the GC process starts
+; on each request.
+
+session.gc_probability = 1
+session.gc_divisor = 1000
+
+; After this number of seconds, stored data will be seen as 'garbage' and
+; cleaned up by the garbage collection process.
+session.gc_maxlifetime = 1440
+
+; NOTE: If you are using the subdirectory option for storing session files
+; (see session.save_path above), then garbage collection does *not*
+; happen automatically. You will need to do your own garbage
+; collection through a shell script, cron entry, or some other method.
+; For example, the following script would is the equivalent of
+; setting session.gc_maxlifetime to 1440 (1440 seconds = 24 minutes):
+; cd /path/to/sessions; find -cmin +24 | xargs rm
+
+; PHP 4.2 and less have an undocumented feature/bug that allows you to
+; to initialize a session variable in the global scope, albeit register_globals
+; is disabled. PHP 4.3 and later will warn you, if this feature is used.
+; You can disable the feature and the warning separately. At this time,
+; the warning is only displayed, if bug_compat_42 is enabled.
+
+session.bug_compat_42 = 0
+session.bug_compat_warn = 1
+
+; Check HTTP Referer to invalidate externally stored URLs containing ids.
+; HTTP_REFERER has to contain this substring for the session to be
+; considered as valid.
+session.referer_check =
+
+; How many bytes to read from the file.
+session.entropy_length = 0
+
+; Specified here to create the session id.
+session.entropy_file =
+
+;session.entropy_length = 16
+
+;session.entropy_file = /dev/urandom
+
+; Set to {nocache,private,public,} to determine HTTP caching aspects
+; or leave this empty to avoid sending anti-caching headers.
+session.cache_limiter = nocache
+
+; Document expires after n minutes.
+session.cache_expire = 180
+
+; trans sid support is disabled by default.
+; Use of trans sid may risk your users security.
+; Use this option with caution.
+; - User may send URL contains active session ID
+; to other person via. email/irc/etc.
+; - URL that contains active session ID may be stored
+; in publically accessible computer.
+; - User may access your site with the same session ID
+; always using URL stored in browser's history or bookmarks.
+session.use_trans_sid = 0
+
+; Select a hash function
+; 0: MD5 (128 bits)
+; 1: SHA-1 (160 bits)
+session.hash_function = 0
+
+; Define how many bits are stored in each character when converting
+; the binary hash data to something readable.
+;
+; 4 bits: 0-9, a-f
+; 5 bits: 0-9, a-v
+; 6 bits: 0-9, a-z, A-Z, "-", ","
+session.hash_bits_per_character = 5
+
+; The URL rewriter will look for URLs in a defined set of HTML tags.
+; form/fieldset are special; if you include them here, the rewriter will
+; add a hidden <input> field with the info which is otherwise appended
+; to URLs. If you want XHTML conformity, remove the form entry.
+; Note that all valid entries require a "=", even if no value follows.
+url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry"
+
+[MSSQL]
+; Allow or prevent persistent links.
+mssql.allow_persistent = On
+
+; Maximum number of persistent links. -1 means no limit.
+mssql.max_persistent = -1
+
+; Maximum number of links (persistent+non persistent). -1 means no limit.
+mssql.max_links = -1
+
+; Minimum error severity to display.
+mssql.min_error_severity = 10
+
+; Minimum message severity to display.
+mssql.min_message_severity = 10
+
+; Compatibility mode with old versions of PHP 3.0.
+mssql.compatability_mode = Off
+
+; Connect timeout
+;mssql.connect_timeout = 5
+
+; Query timeout
+;mssql.timeout = 60
+
+; Valid range 0 - 2147483647. Default = 4096.
+;mssql.textlimit = 4096
+
+; Valid range 0 - 2147483647. Default = 4096.
+;mssql.textsize = 4096
+
+; Limits the number of records in each batch. 0 = all records in one batch.
+;mssql.batchsize = 0
+
+; Specify how datetime and datetim4 columns are returned
+; On => Returns data converted to SQL server settings
+; Off => Returns values as YYYY-MM-DD hh:mm:ss
+;mssql.datetimeconvert = On
+
+; Use NT authentication when connecting to the server
+mssql.secure_connection = Off
+
+; Specify max number of processes. -1 = library default
+; msdlib defaults to 25
+; FreeTDS defaults to 4096
+;mssql.max_procs = -1
+
+; Specify client character set.
+; If empty or not set the client charset from freetds.comf is used
+; This is only used when compiled with FreeTDS
+;mssql.charset = "ISO-8859-1"
+
+[Assertion]
+; Assert(expr); active by default.
+;assert.active = On
+
+; Issue a PHP warning for each failed assertion.
+;assert.warning = On
+
+; Don't bail out by default.
+;assert.bail = Off
+
+; User-function to be called if an assertion fails.
+;assert.callback = 0
+
+; Eval the expression with current error_reporting(). Set to true if you want
+; error_reporting(0) around the eval().
+;assert.quiet_eval = 0
+
+[COM]
+; path to a file containing GUIDs, IIDs or filenames of files with TypeLibs
+;com.typelib_file =
+; allow Distributed-COM calls
+;com.allow_dcom = true
+; autoregister constants of a components typlib on com_load()
+;com.autoregister_typelib = true
+; register constants casesensitive
+;com.autoregister_casesensitive = false
+; show warnings on duplicate constant registrations
+;com.autoregister_verbose = true
+
+[mbstring]
+; language for internal character representation.
+;mbstring.language = Japanese
+
+; internal/script encoding.
+; Some encoding cannot work as internal encoding.
+; (e.g. SJIS, BIG5, ISO-2022-*)
+;mbstring.internal_encoding = EUC-JP
+
+; http input encoding.
+;mbstring.http_input = auto
+
+; http output encoding. mb_output_handler must be
+; registered as output buffer to function
+;mbstring.http_output = SJIS
+
+; enable automatic encoding translation according to
+; mbstring.internal_encoding setting. Input chars are
+; converted to internal encoding by setting this to On.
+; Note: Do _not_ use automatic encoding translation for
+; portable libs/applications.
+;mbstring.encoding_translation = Off
+
+; automatic encoding detection order.
+; auto means
+;mbstring.detect_order = auto
+
+; substitute_character used when character cannot be converted
+; one from another
+;mbstring.substitute_character = none;
+
+; overload(replace) single byte functions by mbstring functions.
+; mail(), ereg(), etc are overloaded by mb_send_mail(), mb_ereg(),
+; etc. Possible values are 0,1,2,4 or combination of them.
+; For example, 7 for overload everything.
+; 0: No overload
+; 1: Overload mail() function
+; 2: Overload str*() functions
+; 4: Overload ereg*() functions
+;mbstring.func_overload = 0
+
+; enable strict encoding detection.
+;mbstring.strict_detection = Off
+
+[FrontBase]
+;fbsql.allow_persistent = On
+;fbsql.autocommit = On
+;fbsql.show_timestamp_decimals = Off
+;fbsql.default_database =
+;fbsql.default_database_password =
+;fbsql.default_host =
+;fbsql.default_password =
+;fbsql.default_user = "_SYSTEM"
+;fbsql.generate_warnings = Off
+;fbsql.max_connections = 128
+;fbsql.max_links = 128
+;fbsql.max_persistent = -1
+;fbsql.max_results = 128
+
+[gd]
+; Tell the jpeg decode to libjpeg warnings and try to create
+; a gd image. The warning will then be displayed as notices
+; disabled by default
+;gd.jpeg_ignore_warning = 0
+
+[exif]
+; Exif UNICODE user comments are handled as UCS-2BE/UCS-2LE and JIS as JIS.
+; With mbstring support this will automatically be converted into the encoding
+; given by corresponding encode setting. When empty mbstring.internal_encoding
+; is used. For the decode settings you can distinguish between motorola and
+; intel byte order. A decode setting cannot be empty.
+;exif.encode_unicode = ISO-8859-15
+;exif.decode_unicode_motorola = UCS-2BE
+;exif.decode_unicode_intel = UCS-2LE
+;exif.encode_jis =
+;exif.decode_jis_motorola = JIS
+;exif.decode_jis_intel = JIS
+
+[Tidy]
+; The path to a default tidy configuration file to use when using tidy
+;tidy.default_config = /usr/local/lib/php/default.tcfg
+
+; Should tidy clean and repair output automatically?
+; WARNING: Do not use this option if you are generating non-html content
+; such as dynamic images
+tidy.clean_output = Off
+
+[soap]
+; Enables or disables WSDL caching feature.
+soap.wsdl_cache_enabled=1
+; Sets the directory name where SOAP extension will put cache files.
+soap.wsdl_cache_dir="/tmp"
+; (time to live) Sets the number of second while cached file will be used
+; instead of original one.
+soap.wsdl_cache_ttl=86400
+
+; Local Variables:
+; tab-width: 4
+; End: \ No newline at end of file