Merge branch 'hotfix-codeigniter-upgrade'

This commit is contained in:
alext 2017-05-21 11:38:48 +02:00
commit 757556f849
207 changed files with 4521 additions and 1907 deletions

19
.gitignore vendored
View file

@ -1,17 +1,20 @@
.idea .idea/
.tmp-package .tmp-package/
composer composer/
easyappointments.zip *.zip
node_modules node_modules/
npm-debug.log npm-debug.log
src/storage/cache/* src/storage/cache/*
!src/storage/cache/.htaccess !src/storage/cache/.htaccess
!src/storage/cache/index.html !src/storage/cache/index.html
src/storage/logs/* src/storage/logs/*
!src/storage/logs/index.html !src/storage/logs/index.html
src/storage/sessions/*
!src/storage/sessions/.htaccess
!src/storage/sessions/index.html
src/storage/uploads/* src/storage/uploads/*
!src/storage/uploads/index.html !src/storage/uploads/index.html
src/config.php src/config.php
doc/apigen doc/apigen/
doc/jsdoc doc/jsdoc/
doc/plato doc/plato/

View file

@ -1,8 +1,11 @@
# Easy!Appointments - Changelog # Easy!Appointments - Changelog
This file contains the code changes that were introduced into each release This file contains the code changes that were introduced into each release (starting from v1.1.0) so that is easy for
(starting from v1.1.0) so that is easy for developers to maintain and readjust developers to maintain and readjust their custom modifications on the main project codebase.
their custom modifications on the main project codebase.
### Version 1.2.1
- #241: Set default sessions save_path directory because many servers do not have this option set.
- #306: Back-end login does not work with PHP 7.1.
### Version 1.2.0 ### Version 1.2.0
- #185: Enable fixed availabilities setting for services. - #185: Enable fixed availabilities setting for services.
@ -24,11 +27,13 @@ their custom modifications on the main project codebase.
- #22: Google Calendar Sync - Time Zone Issue - #22: Google Calendar Sync - Time Zone Issue
### Version 1.1.1 ### Version 1.1.1
- #116: Book advance timeout not taken into account for proposed appointments. - #116: Book advance timeout not taken into account for proposed appointments.
- #118: Google Calendar and notification mail problem bug. - #118: Google Calendar and notification mail problem bug.
- #120: Invalid appointment date set after editing an existing appointment. - #120: Invalid appointment date set after editing an existing appointment.
### Version 1.1.0 ### Version 1.1.0
- #4: Raising more useful exceptions and enable error logging by default. - #4: Raising more useful exceptions and enable error logging by default.
- #6: Business Logic created is not getting assigned to service provider. - #6: Business Logic created is not getting assigned to service provider.
- #10: Unable to use address tags in email address. - #10: Unable to use address tags in email address.

View file

@ -13,6 +13,7 @@ your existing website, because it can be installed in a single folder of the ser
both sites can share the same database. both sites can share the same database.
### Features ### Features
The project was designed to be flexible and reliable so as to be able to meet the needs of any The project was designed to be flexible and reliable so as to be able to meet the needs of any
kind of enterprise. You can read the main features of the system below: kind of enterprise. You can read the main features of the system below:
@ -26,12 +27,14 @@ kind of enterprise. You can read the main features of the system below:
* User community support. * User community support.
### Installation ### Installation
Since Easy!Appointments is a web application, it runs on a web server and thus you will need to Since Easy!Appointments is a web application, it runs on a web server and thus you will need to
perform the following steps in order to install the system on your server: perform the following steps in order to install the system on your server:
* Make sure that your server has Apache, PHP and MySQL installed. * Make sure that your server has Apache, PHP and MySQL installed.
* Create a new database (or use an existing). * Create a new database (or use an existing).
* Copy the "easyappointments" source folder on your server. * Copy the "easyappointments" source folder on your server.
* Ensure that the "storage" directory is writable.
* Rename the "config-sample.php" file to "config.php" and set your server properties. * Rename the "config-sample.php" file to "config.php" and set your server properties.
* Open your browser on the Easy!Appointments URL and follow the installation guide. * Open your browser on the Easy!Appointments URL and follow the installation guide.
* That's it! You can now use Easy!Appointments at your will. * That's it! You can now use Easy!Appointments at your will.
@ -44,12 +47,14 @@ You can also report problems on the [issues page](https://github.com/alextselegi
and help the development progress. and help the development progress.
### User Feedback ### User Feedback
Whether it is new ideas or defects, your feedback is highly appreciated and will be taken into Whether it is new ideas or defects, your feedback is highly appreciated and will be taken into
consideration for the following releases of the project. Share your experience and discuss your consideration for the following releases of the project. Share your experience and discuss your
thoughts with other users through communities. Create issues with suggestions on new features or thoughts with other users through communities. Create issues with suggestions on new features or
bug reports. bug reports.
### Translate Easy!Appointments ### Translate Easy!Appointments
As of version 1.0 Easy!Appointments supports translated user interface. If you want to contribute to the As of version 1.0 Easy!Appointments supports translated user interface. If you want to contribute to the
translation process read the [get involved](https://github.com/alextselegidis/easyappointments/wiki/Get-Involved!) translation process read the [get involved](https://github.com/alextselegidis/easyappointments/wiki/Get-Involved!)
page for additional information. page for additional information.

View file

@ -12,7 +12,7 @@
"vendor-dir": "composer" "vendor-dir": "composer"
}, },
"require-dev": { "require-dev": {
"codeigniter/framework": "^3.0", "codeigniter/framework": "~3.1.4",
"phpunit/phpunit": "^5.6" "phpunit/phpunit": "^5.6"
}, },
"require": { "require": {

101
composer.lock generated
View file

@ -4,8 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"hash": "52a00fed1a89eb4d3d6321de418669f0", "content-hash": "25bac256233b0471e7cc3b8922e61b61",
"content-hash": "fe4302679c1523cf63192337d8f4a61f",
"packages": [ "packages": [
{ {
"name": "gregwar/captcha", "name": "gregwar/captcha",
@ -53,32 +52,47 @@
"captcha", "captcha",
"spam" "spam"
], ],
"time": "2015-09-11 15:23:20" "time": "2015-09-11T15:23:20+00:00"
}, },
{ {
"name": "phpmailer/phpmailer", "name": "phpmailer/phpmailer",
"version": "v5.2.14", "version": "v5.2.23",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/PHPMailer/PHPMailer.git", "url": "https://github.com/PHPMailer/PHPMailer.git",
"reference": "e774bc9152de85547336e22b8926189e582ece95" "reference": "7115df4a6f76281109ebe352900c42403b728bb4"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/e774bc9152de85547336e22b8926189e582ece95", "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/7115df4a6f76281109ebe352900c42403b728bb4",
"reference": "e774bc9152de85547336e22b8926189e582ece95", "reference": "7115df4a6f76281109ebe352900c42403b728bb4",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=5.0.0" "php": ">=5.0.0"
}, },
"require-dev": { "require-dev": {
"phpdocumentor/phpdocumentor": "*", "doctrine/annotations": "1.2.*",
"phpunit/phpunit": "4.7.*" "jms/serializer": "0.16.*",
"phpdocumentor/phpdocumentor": "2.*",
"phpunit/phpunit": "4.8.*",
"symfony/debug": "2.8.*",
"symfony/filesystem": "2.8.*",
"symfony/translation": "2.8.*",
"symfony/yaml": "2.8.*",
"zendframework/zend-cache": "2.5.1",
"zendframework/zend-config": "2.5.1",
"zendframework/zend-eventmanager": "2.5.1",
"zendframework/zend-filter": "2.5.1",
"zendframework/zend-i18n": "2.5.1",
"zendframework/zend-json": "2.5.1",
"zendframework/zend-math": "2.5.1",
"zendframework/zend-serializer": "2.5.*",
"zendframework/zend-servicemanager": "2.5.*",
"zendframework/zend-stdlib": "2.5.1"
}, },
"suggest": { "suggest": {
"league/oauth2-client": "Needed for XOAUTH2 authentication", "league/oauth2-google": "Needed for Google XOAUTH2 authentication"
"league/oauth2-google": "Needed for Gmail XOAUTH2"
}, },
"type": "library", "type": "library",
"autoload": { "autoload": {
@ -114,29 +128,30 @@
} }
], ],
"description": "PHPMailer is a full-featured email creation and transfer class for PHP", "description": "PHPMailer is a full-featured email creation and transfer class for PHP",
"time": "2015-11-01 10:15:28" "time": "2017-03-15T19:32:56+00:00"
} }
], ],
"packages-dev": [ "packages-dev": [
{ {
"name": "codeigniter/framework", "name": "codeigniter/framework",
"version": "3.0.6", "version": "3.1.4",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/bcit-ci/CodeIgniter.git", "url": "https://github.com/bcit-ci/CodeIgniter.git",
"reference": "8082544c5b4b33175790f505587e202e3ca9e488" "reference": "873608df8be83420474e3cf9fc749a8ed12a6c09"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/bcit-ci/CodeIgniter/zipball/8082544c5b4b33175790f505587e202e3ca9e488", "url": "https://api.github.com/repos/bcit-ci/CodeIgniter/zipball/873608df8be83420474e3cf9fc749a8ed12a6c09",
"reference": "8082544c5b4b33175790f505587e202e3ca9e488", "reference": "873608df8be83420474e3cf9fc749a8ed12a6c09",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=5.2.4" "php": ">=5.2.4"
}, },
"require-dev": { "require-dev": {
"mikey179/vfsstream": "1.1.*" "mikey179/vfsstream": "1.1.*",
"phpunit/phpunit": "4.* || 5.*"
}, },
"suggest": { "suggest": {
"paragonie/random_compat": "Provides better randomness in PHP 5.x" "paragonie/random_compat": "Provides better randomness in PHP 5.x"
@ -148,7 +163,7 @@
], ],
"description": "The CodeIgniter framework", "description": "The CodeIgniter framework",
"homepage": "https://codeigniter.com", "homepage": "https://codeigniter.com",
"time": "2016-03-21 16:26:30" "time": "2017-03-20T15:51:08+00:00"
}, },
{ {
"name": "doctrine/instantiator", "name": "doctrine/instantiator",
@ -202,7 +217,7 @@
"constructor", "constructor",
"instantiate" "instantiate"
], ],
"time": "2015-06-14 21:17:01" "time": "2015-06-14T21:17:01+00:00"
}, },
{ {
"name": "myclabs/deep-copy", "name": "myclabs/deep-copy",
@ -244,7 +259,7 @@
"object", "object",
"object graph" "object graph"
], ],
"time": "2016-10-31 17:19:45" "time": "2016-10-31T17:19:45+00:00"
}, },
{ {
"name": "phpdocumentor/reflection-common", "name": "phpdocumentor/reflection-common",
@ -298,7 +313,7 @@
"reflection", "reflection",
"static analysis" "static analysis"
], ],
"time": "2015-12-27 11:43:31" "time": "2015-12-27T11:43:31+00:00"
}, },
{ {
"name": "phpdocumentor/reflection-docblock", "name": "phpdocumentor/reflection-docblock",
@ -343,7 +358,7 @@
} }
], ],
"description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
"time": "2016-09-30 07:12:33" "time": "2016-09-30T07:12:33+00:00"
}, },
{ {
"name": "phpdocumentor/type-resolver", "name": "phpdocumentor/type-resolver",
@ -390,7 +405,7 @@
"email": "me@mikevanriel.com" "email": "me@mikevanriel.com"
} }
], ],
"time": "2016-06-10 07:14:17" "time": "2016-06-10T07:14:17+00:00"
}, },
{ {
"name": "phpspec/prophecy", "name": "phpspec/prophecy",
@ -452,7 +467,7 @@
"spy", "spy",
"stub" "stub"
], ],
"time": "2016-06-07 08:13:47" "time": "2016-06-07T08:13:47+00:00"
}, },
{ {
"name": "phpunit/php-code-coverage", "name": "phpunit/php-code-coverage",
@ -515,7 +530,7 @@
"testing", "testing",
"xunit" "xunit"
], ],
"time": "2016-11-01 05:06:24" "time": "2016-11-01T05:06:24+00:00"
}, },
{ {
"name": "phpunit/php-file-iterator", "name": "phpunit/php-file-iterator",
@ -562,7 +577,7 @@
"filesystem", "filesystem",
"iterator" "iterator"
], ],
"time": "2015-06-21 13:08:43" "time": "2015-06-21T13:08:43+00:00"
}, },
{ {
"name": "phpunit/php-text-template", "name": "phpunit/php-text-template",
@ -603,7 +618,7 @@
"keywords": [ "keywords": [
"template" "template"
], ],
"time": "2015-06-21 13:50:34" "time": "2015-06-21T13:50:34+00:00"
}, },
{ {
"name": "phpunit/php-timer", "name": "phpunit/php-timer",
@ -647,7 +662,7 @@
"keywords": [ "keywords": [
"timer" "timer"
], ],
"time": "2016-05-12 18:03:57" "time": "2016-05-12T18:03:57+00:00"
}, },
{ {
"name": "phpunit/php-token-stream", "name": "phpunit/php-token-stream",
@ -696,7 +711,7 @@
"keywords": [ "keywords": [
"tokenizer" "tokenizer"
], ],
"time": "2015-09-15 10:49:45" "time": "2015-09-15T10:49:45+00:00"
}, },
{ {
"name": "phpunit/phpunit", "name": "phpunit/phpunit",
@ -778,7 +793,7 @@
"testing", "testing",
"xunit" "xunit"
], ],
"time": "2016-10-25 07:40:25" "time": "2016-10-25T07:40:25+00:00"
}, },
{ {
"name": "phpunit/phpunit-mock-objects", "name": "phpunit/phpunit-mock-objects",
@ -837,7 +852,7 @@
"mock", "mock",
"xunit" "xunit"
], ],
"time": "2016-10-09 07:01:45" "time": "2016-10-09T07:01:45+00:00"
}, },
{ {
"name": "sebastian/code-unit-reverse-lookup", "name": "sebastian/code-unit-reverse-lookup",
@ -882,7 +897,7 @@
], ],
"description": "Looks up which function or method a line of code belongs to", "description": "Looks up which function or method a line of code belongs to",
"homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
"time": "2016-02-13 06:45:14" "time": "2016-02-13T06:45:14+00:00"
}, },
{ {
"name": "sebastian/comparator", "name": "sebastian/comparator",
@ -946,7 +961,7 @@
"compare", "compare",
"equality" "equality"
], ],
"time": "2015-07-26 15:48:44" "time": "2015-07-26T15:48:44+00:00"
}, },
{ {
"name": "sebastian/diff", "name": "sebastian/diff",
@ -998,7 +1013,7 @@
"keywords": [ "keywords": [
"diff" "diff"
], ],
"time": "2015-12-08 07:14:41" "time": "2015-12-08T07:14:41+00:00"
}, },
{ {
"name": "sebastian/environment", "name": "sebastian/environment",
@ -1048,7 +1063,7 @@
"environment", "environment",
"hhvm" "hhvm"
], ],
"time": "2016-08-18 05:49:44" "time": "2016-08-18T05:49:44+00:00"
}, },
{ {
"name": "sebastian/exporter", "name": "sebastian/exporter",
@ -1115,7 +1130,7 @@
"export", "export",
"exporter" "exporter"
], ],
"time": "2016-06-17 09:04:28" "time": "2016-06-17T09:04:28+00:00"
}, },
{ {
"name": "sebastian/global-state", "name": "sebastian/global-state",
@ -1166,7 +1181,7 @@
"keywords": [ "keywords": [
"global state" "global state"
], ],
"time": "2015-10-12 03:26:01" "time": "2015-10-12T03:26:01+00:00"
}, },
{ {
"name": "sebastian/object-enumerator", "name": "sebastian/object-enumerator",
@ -1212,7 +1227,7 @@
], ],
"description": "Traverses array structures and object graphs to enumerate all referenced objects", "description": "Traverses array structures and object graphs to enumerate all referenced objects",
"homepage": "https://github.com/sebastianbergmann/object-enumerator/", "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
"time": "2016-01-28 13:25:10" "time": "2016-01-28T13:25:10+00:00"
}, },
{ {
"name": "sebastian/recursion-context", "name": "sebastian/recursion-context",
@ -1265,7 +1280,7 @@
], ],
"description": "Provides functionality to recursively process PHP variables", "description": "Provides functionality to recursively process PHP variables",
"homepage": "http://www.github.com/sebastianbergmann/recursion-context", "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
"time": "2015-11-11 19:50:13" "time": "2015-11-11T19:50:13+00:00"
}, },
{ {
"name": "sebastian/resource-operations", "name": "sebastian/resource-operations",
@ -1307,7 +1322,7 @@
], ],
"description": "Provides a list of PHP built-in functions that operate on resources", "description": "Provides a list of PHP built-in functions that operate on resources",
"homepage": "https://www.github.com/sebastianbergmann/resource-operations", "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
"time": "2015-07-28 20:34:47" "time": "2015-07-28T20:34:47+00:00"
}, },
{ {
"name": "sebastian/version", "name": "sebastian/version",
@ -1350,7 +1365,7 @@
], ],
"description": "Library that helps with managing the version number of Git-hosted PHP projects", "description": "Library that helps with managing the version number of Git-hosted PHP projects",
"homepage": "https://github.com/sebastianbergmann/version", "homepage": "https://github.com/sebastianbergmann/version",
"time": "2016-02-04 12:56:52" "time": "2016-02-04T12:56:52+00:00"
}, },
{ {
"name": "symfony/yaml", "name": "symfony/yaml",
@ -1399,7 +1414,7 @@
], ],
"description": "Symfony Yaml Component", "description": "Symfony Yaml Component",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"time": "2016-10-24 18:41:13" "time": "2016-10-24T18:41:13+00:00"
}, },
{ {
"name": "webmozart/assert", "name": "webmozart/assert",
@ -1449,7 +1464,7 @@
"check", "check",
"validate" "validate"
], ],
"time": "2016-08-09 15:02:57" "time": "2016-08-09T15:02:57+00:00"
} }
], ],
"aliases": [], "aliases": [],

View file

@ -45,6 +45,6 @@ The following link points to a common question that many users ask. The default
(https://groups.google.com/d/msg/easy-appointments/Mdt98fbF8hE/9CEjOvW7FAAJ) (https://groups.google.com/d/msg/easy-appointments/Mdt98fbF8hE/9CEjOvW7FAAJ)
*This document applies to Easy!Appointments v1.2*. *This document applies to Easy!Appointments v1.2.1*.
[Back](readme.md) [Back](readme.md)

View file

@ -5,17 +5,21 @@
Easy!Appointments is an open source project and thus the connection with the users community is stronger than commercial projects. People can contribute in the development and spread of this project and make it even better so that they, themselves can take advantage of it in order to fulfill their business needs. Bellow are described the ways that you can help Easy!Appointments get better. Easy!Appointments is an open source project and thus the connection with the users community is stronger than commercial projects. People can contribute in the development and spread of this project and make it even better so that they, themselves can take advantage of it in order to fulfill their business needs. Bellow are described the ways that you can help Easy!Appointments get better.
### Testing ### Testing
The most important goal of Easy!Appointments is performance and stability and that means that **everything must work as expected**. Even though the project has been tested thoroughly during its Beta phase it is important that bugs are tracked down and are fixed as soon as possible. The most important goal of Easy!Appointments is performance and stability and that means that **everything must work as expected**. Even though the project has been tested thoroughly during its Beta phase it is important that bugs are tracked down and are fixed as soon as possible.
### Suggestions ### Suggestions
Everything you might suggest about the project will be taken into concern and is highly appreciated. Your ideas of new features and enhancements are very important and will help Easy!Appointments become even better. So do not hesitate to submit your suggestions and feature requests to [E!A Submission Form](http://easyappointments.org/submission.php) Everything you might suggest about the project will be taken into concern and is highly appreciated. Your ideas of new features and enhancements are very important and will help Easy!Appointments become even better. So do not hesitate to submit your suggestions and feature requests to [E!A Submission Form](http://easyappointments.org/submission.php)
### Translation ### Translation
You are more than welcome to help with the translation progress of the user interface. The application is already translated into a big variety of languages but as new features are added new strings need to be translated. You can send your translations with a pull request in GitHub or per email to [alextselegidis@gmail.com](mailto:alextselegidis@gmail.com) You are more than welcome to help with the translation progress of the user interface. The application is already translated into a big variety of languages but as new features are added new strings need to be translated. You can send your translations with a pull request in GitHub or per email to [alextselegidis@gmail.com](mailto:alextselegidis@gmail.com)
### User Feedback ### User Feedback
It would be much appreciated if you would take 5 minutes of your time to fill this small form on your experience with Easy!Appointments. User feedback is very important and will help with the future planning of the project. Fill the [E!A Feedback Form](https://docs.google.com/forms/d/15dw1jl7lUgw4q-XXMn13Gx_e8zJxAiyWYMOdqtZqIHU/viewform). It would be much appreciated if you would take 5 minutes of your time to fill this small form on your experience with Easy!Appointments. User feedback is very important and will help with the future planning of the project. Fill the [E!A Feedback Form](https://docs.google.com/forms/d/15dw1jl7lUgw4q-XXMn13Gx_e8zJxAiyWYMOdqtZqIHU/viewform).
*This document applies to Easy!Appointments v1.2*. *This document applies to Easy!Appointments v1.2.1*.
[Back](readme.md) [Back](readme.md)

View file

@ -49,6 +49,6 @@ Google Developers https://developers.google.com/google-apps/calendar
E!A Support Group https://groups.google.com/forum/#!forum/easy-appointments E!A Support Group https://groups.google.com/forum/#!forum/easy-appointments
*This document applies to Easy!Appointments v1.2*. *This document applies to Easy!Appointments v1.2.1*.
[Back](readme.md) [Back](readme.md)

View file

@ -6,13 +6,14 @@
Easy!Appointments is a web appointment scheduler that can be installed and run in web servers. Users will be able to reach the application through their web browsers by using an active internet connection, just like visiting a normal website. The installation process is very similar to other popular web systems like WordPress and Joomla, so it is very likely that you will be familiar with the next steps. Follow this article strictly in order to complete the installation with no problems. After that, read the "Configuration" section for adjusting the system to fit your needs. Easy!Appointments is a web appointment scheduler that can be installed and run in web servers. Users will be able to reach the application through their web browsers by using an active internet connection, just like visiting a normal website. The installation process is very similar to other popular web systems like WordPress and Joomla, so it is very likely that you will be familiar with the next steps. Follow this article strictly in order to complete the installation with no problems. After that, read the "Configuration" section for adjusting the system to fit your needs.
### Installation ### Installation
There are 5 steps you must follow during the installation process. There are 6 steps you must follow during the installation process.
1. **Make sure that your server has at least the following applications/tools installed: Apache(v2.4), PHP(v5.4) and MySQL(v5.5).** Easy!Appointments needs these programs to run. Most of the web hosting companies provide these tools within their Linux hosting plans. If you want to install Easy!Appointments on your local server use one of the pre-made bundles available on the web (XAMPP, MAMP, WAMP ...), all of which are free to use. If you plan to use the Google Calendar synchronization you will need the **php_curl** extension installed and enabled as well. 1. **Make sure that your server has at least the following applications/tools installed: Apache(v2.4), PHP(v5.6) and MySQL(v5.5).** Easy!Appointments needs these programs to run. Most of the web hosting companies provide these tools within their Linux hosting plans. If you want to install Easy!Appointments on your local server use one of the pre-made bundles available on the web (XAMPP, MAMP, WAMP ...), all of which are free to use. If you plan to use the Google Calendar synchronization you will need the **php_curl** extension installed and enabled as well.
2. **Create a new database (or use an existing one).** The database is necessary for storing the system data. Therefore your hosting plan must include at least one MySQL database. You must also get the database administration credentials because they will be needed later on. 2. **Create a new database (or use an existing one).** The database is necessary for storing the system data. Therefore your hosting plan must include at least one MySQL database. You must also get the database administration credentials because they will be needed later on.
3. **Upload the Easy!Appointments source files to your server.** You can place the files into a directory with named "easyappointments" or "appointments" or "book" etc. Make sure that you mark the Easy!Appointments folder URL because it will be needed in the following step. For example if the system files are placed in the this directory ".../httpdocs/easyappointments/" then the URL to this folder will be "http://your-domain.com/easyappointments". This URL will be needed in the following step. 3. **Upload the Easy!Appointments source files to your server.** You can place the files into a directory with named "easyappointments" or "appointments" or "book" etc. Make sure that you mark the Easy!Appointments folder URL because it will be needed in the following step. For example if the system files are placed in the this directory ".../httpdocs/easyappointments/" then the URL to this folder will be "http://your-domain.com/easyappointments". This URL will be needed in the following steps.
4. **Edit the "config.php" file and set your server properties.** Like other web systems Easy!Appointments needs to know how to connect to the database and the base URL of the installation. You can also provide the Google Calendar API keys in this file, if you want to use the Google Calendar Sync feature. NOTE that you will need to create an API key before that in the Google Cloud Console. 4. **Ensure that the "storage" directory is writable.** Session information, logs and any other kind of files will land into the "storage" directory so make sure that it has the correct permissions and that is writable.
5. **Open a web browser and head to the Easy!Appointments installation folder URL.** The first time you open this page an installation guide will be shown. Fill in the administrator user and company settings and press the "Install" button. That's it! You can now use the application at your own will. 5. **Edit the "config.php" file and set your server properties.** Like other web systems Easy!Appointments needs to know how to connect to the database and the base URL of the installation. You can also provide the Google Calendar API keys in this file, if you want to use the Google Calendar Sync feature. NOTE that you will need to create an API key before that in the Google Cloud Console.
6. **Open a web browser and head to the Easy!Appointments installation folder URL.** The first time you open this page an installation guide will be shown. Fill in the administrator user and company settings and press the "Install" button. That's it! You can now use the application at your own will.
### Configuration ### Configuration
@ -28,6 +29,6 @@ Finally just add a link in your website that points to your Easy!Appointments in
Happy Bookin'! Happy Bookin'!
*This document applies to Easy!Appointments v1.2*. *This document applies to Easy!Appointments v1.2.1*.
[Back](readme.md) [Back](readme.md)

View file

@ -14,6 +14,6 @@ Easy!Appointments is based upon CodeIgniter (PHP Framework) and it uses its buil
Follow these steps in order to add or adjust your translations and modify the message of the user interface of Easy!Appointments. If you want contribute to the translation process of Easy!Appointments please read the [Get Involved](https://github.com/alextselegidis/easyappointments/wiki/Get-Involved!) wiki page for more information. Please share your translations with the user community. Follow these steps in order to add or adjust your translations and modify the message of the user interface of Easy!Appointments. If you want contribute to the translation process of Easy!Appointments please read the [Get Involved](https://github.com/alextselegidis/easyappointments/wiki/Get-Involved!) wiki page for more information. Please share your translations with the user community.
*This document applies to Easy!Appointments v1.2*. *This document applies to Easy!Appointments v1.2.1*.
[Back](readme.md) [Back](readme.md)

View file

@ -10,4 +10,4 @@ Welcome to the documentation pages of Easy!Appointments. Navigate through the av
- [Get Involved!](get-involved.md) - [Get Involved!](get-involved.md)
- [FAQ](faq.md) - [FAQ](faq.md)
*This document applies to Easy!Appointments v1.2*. *This document applies to Easy!Appointments v1.2.1*.

View file

@ -433,6 +433,6 @@ fastcgi_param PHP_AUTH_PW $http_authorization;
[[Source]](http://serverfault.com/a/520943) [[Source]](http://serverfault.com/a/520943)
*This document applies to Easy!Appointments v1.2*. *This document applies to Easy!Appointments v1.2.1*.
[Back](readme.md) [Back](readme.md)

View file

@ -8,10 +8,14 @@ This page will guide you through the update procedure of your Easy!Appointments
If by chance you get a 500 Internal Server Error message then you must check the error log files of your server. These kind of errors comes mostly due to problematic server configuration (permissions, credentials etc). If by chance you get a 500 Internal Server Error message then you must check the error log files of your server. These kind of errors comes mostly due to problematic server configuration (permissions, credentials etc).
### Updating from v1.1.x to v1.2.x
Version v1.2 introduces two new folders in the root directory of the project, the "engine" and the "storage" directory. Ensure that the storage directory is writable and has the correct permissions.
### Updating from v1.0 to v1.1.x ### Updating from v1.0 to v1.1.x
Many core files were changed in v1.1 and it would be better if you replace all the Easy!Appointments files of version 1.0 with the new ones. Use the data of the old `configuration.php` file in the new `config.php` and open the `http://url-to-ea-installation/index.php/backend/update` as already mentioned. Your new version should work just fine! Many core files were changed in v1.1 and it would be better if you replace all the Easy!Appointments files of version 1.0 with the new ones. Use the data of the old `configuration.php` file in the new `config.php` and open the `http://url-to-ea-installation/index.php/backend/update` as already mentioned. Your new version should work just fine!
*This document applies to Easy!Appointments v1.2*. *This document applies to Easy!Appointments v1.2.1*.
[Back](readme.md) [Back](readme.md)

View file

@ -51,8 +51,26 @@ gulp.task('build', function(done) {
fs.copySync('LICENSE', '.tmp-package/LICENSE'); fs.copySync('LICENSE', '.tmp-package/LICENSE');
del.sync([ del.sync([
'.tmp-package/application/logs/*', '.tmp-package/storage/uploads/*',
'!.tmp-package/application/logs/index.html' '!.tmp-package/storage/uploads/index.html'
]);
del.sync([
'.tmp-package/storage/logs/*',
'!.tmp-package/storage/logs/.htaccess',
'!.tmp-package/storage/logs/index.html'
]);
del.sync([
'.tmp-package/storage/sessions/*',
'!.tmp-package/storage/sessions/.htaccess',
'!.tmp-package/storage/sessions/index.html'
]);
del.sync([
'.tmp-package/storage/cache/*',
'!.tmp-package/storage/cache/.htaccess',
'!.tmp-package/storage/cache/index.html'
]); ]);
zip('.tmp-package', { saveTo: 'easyappointments.zip' }, function (err, buffer) { zip('.tmp-package', { saveTo: 'easyappointments.zip' }, function (err, buffer) {

View file

@ -1,6 +1,6 @@
{ {
"name": "easyappointments", "name": "easyappointments",
"version": "1.2.0", "version": "1.2.1",
"description": "Open Source Web Scheduler", "description": "Open Source Web Scheduler",
"repository": { "repository": {
"type": "git", "type": "git",

View file

@ -8,7 +8,7 @@
| Declare some of the global config values of Easy!Appointments. | Declare some of the global config values of Easy!Appointments.
| |
*/ */
$config['version'] = '1.2'; // This must be changed manually. $config['version'] = '1.2.1'; // This must be changed manually.
$config['release_label'] = ''; // Leave empty for no title or add Alpha, Beta etc ... $config['release_label'] = ''; // Leave empty for no title or add Alpha, Beta etc ...
$config['google_sync_feature'] = Config::GOOGLE_SYNC_FEATURE; $config['google_sync_feature'] = Config::GOOGLE_SYNC_FEATURE;
@ -292,9 +292,9 @@ $config['encryption_key'] = Config::BASE_URL;
| |
*/ */
$config['sess_driver'] = 'files'; $config['sess_driver'] = 'files';
$config['sess_cookie_name'] = 'ci_session'; $config['sess_cookie_name'] = 'ea_session';
$config['sess_expiration'] = 7200; $config['sess_expiration'] = 7200;
$config['sess_save_path'] = NULL; $config['sess_save_path'] = __DIR__ . '/../../storage/sessions';
$config['sess_match_ip'] = FALSE; $config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300; $config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE; $config['sess_regenerate_destroy'] = FALSE;

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 1.0.0 * @since Version 1.0.0

View file

@ -0,0 +1 @@
deny from all

View file

@ -0,0 +1,10 @@
<html>
<head>
<title>403 Forbidden</title>
</head>
<body>
<p>Directory access is forbidden.</p>
</body>
</html>

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 1.0.0 * @since Version 1.0.0

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 1.0.0 * @since Version 1.0.0
@ -55,7 +55,7 @@ defined('BASEPATH') OR exit('No direct script access allowed');
* @var string * @var string
* *
*/ */
define('CI_VERSION', '3.0.6'); const CI_VERSION = '3.1.4';
/* /*
* ------------------------------------------------------ * ------------------------------------------------------
@ -67,7 +67,10 @@ defined('BASEPATH') OR exit('No direct script access allowed');
require_once(APPPATH.'config/'.ENVIRONMENT.'/constants.php'); require_once(APPPATH.'config/'.ENVIRONMENT.'/constants.php');
} }
require_once(APPPATH.'config/constants.php'); if (file_exists(APPPATH.'config/constants.php'))
{
require_once(APPPATH.'config/constants.php');
}
/* /*
* ------------------------------------------------------ * ------------------------------------------------------
@ -416,14 +419,29 @@ if ( ! is_php('5.4'))
$params = array($method, array_slice($URI->rsegments, 2)); $params = array($method, array_slice($URI->rsegments, 2));
$method = '_remap'; $method = '_remap';
} }
// WARNING: It appears that there are issues with is_callable() even in PHP 5.2! elseif ( ! method_exists($class, $method))
// Furthermore, there are bug reports and feature/change requests related to it
// that make it unreliable to use in this context. Please, DO NOT change this
// work-around until a better alternative is available.
elseif ( ! in_array(strtolower($method), array_map('strtolower', get_class_methods($class)), TRUE))
{ {
$e404 = TRUE; $e404 = TRUE;
} }
/**
* DO NOT CHANGE THIS, NOTHING ELSE WORKS!
*
* - method_exists() returns true for non-public methods, which passes the previous elseif
* - is_callable() returns false for PHP 4-style constructors, even if there's a __construct()
* - method_exists($class, '__construct') won't work because CI_Controller::__construct() is inherited
* - People will only complain if this doesn't work, even though it is documented that it shouldn't.
*
* ReflectionMethod::isConstructor() is the ONLY reliable check,
* knowing which method will be executed as a constructor.
*/
elseif ( ! is_callable(array($class, $method)) && strcasecmp($class, $method) === 0)
{
$reflection = new ReflectionMethod($class, $method);
if ( ! $reflection->isPublic() OR $reflection->isConstructor())
{
$e404 = TRUE;
}
}
} }
if ($e404) if ($e404)

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 1.0.0 * @since Version 1.0.0
@ -319,17 +319,13 @@ if ( ! function_exists('get_mimes'))
if (empty($_mimes)) if (empty($_mimes))
{ {
$_mimes = file_exists(APPPATH.'config/mimes.php')
? include(APPPATH.'config/mimes.php')
: array();
if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/mimes.php')) if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/mimes.php'))
{ {
$_mimes = include(APPPATH.'config/'.ENVIRONMENT.'/mimes.php'); $_mimes = array_merge($_mimes, include(APPPATH.'config/'.ENVIRONMENT.'/mimes.php'));
}
elseif (file_exists(APPPATH.'config/mimes.php'))
{
$_mimes = include(APPPATH.'config/mimes.php');
}
else
{
$_mimes = array();
} }
} }
@ -355,7 +351,7 @@ if ( ! function_exists('is_https'))
{ {
return TRUE; return TRUE;
} }
elseif (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') elseif (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) === 'https')
{ {
return TRUE; return TRUE;
} }
@ -410,11 +406,6 @@ if ( ! function_exists('show_error'))
if ($status_code < 100) if ($status_code < 100)
{ {
$exit_status = $status_code + 9; // 9 is EXIT__AUTO_MIN $exit_status = $status_code + 9; // 9 is EXIT__AUTO_MIN
if ($exit_status > 125) // 125 is EXIT__AUTO_MAX
{
$exit_status = 1; // EXIT_ERROR
}
$status_code = 500; $status_code = 500;
} }
else else
@ -544,13 +535,18 @@ if ( ! function_exists('set_status_header'))
416 => 'Requested Range Not Satisfiable', 416 => 'Requested Range Not Satisfiable',
417 => 'Expectation Failed', 417 => 'Expectation Failed',
422 => 'Unprocessable Entity', 422 => 'Unprocessable Entity',
426 => 'Upgrade Required',
428 => 'Precondition Required',
429 => 'Too Many Requests',
431 => 'Request Header Fields Too Large',
500 => 'Internal Server Error', 500 => 'Internal Server Error',
501 => 'Not Implemented', 501 => 'Not Implemented',
502 => 'Bad Gateway', 502 => 'Bad Gateway',
503 => 'Service Unavailable', 503 => 'Service Unavailable',
504 => 'Gateway Timeout', 504 => 'Gateway Timeout',
505 => 'HTTP Version Not Supported' 505 => 'HTTP Version Not Supported',
511 => 'Network Authentication Required',
); );
if (isset($stati[$code])) if (isset($stati[$code]))
@ -566,12 +562,12 @@ if ( ! function_exists('set_status_header'))
if (strpos(PHP_SAPI, 'cgi') === 0) if (strpos(PHP_SAPI, 'cgi') === 0)
{ {
header('Status: '.$code.' '.$text, TRUE); header('Status: '.$code.' '.$text, TRUE);
return;
} }
else
{ $server_protocol = (isset($_SERVER['SERVER_PROTOCOL']) && in_array($_SERVER['SERVER_PROTOCOL'], array('HTTP/1.0', 'HTTP/1.1', 'HTTP/2'), TRUE))
$server_protocol = isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.1'; ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.1';
header($server_protocol.' '.$code.' '.$text, TRUE, $code); header($server_protocol.' '.$code.' '.$text, TRUE, $code);
}
} }
} }
@ -598,7 +594,7 @@ if ( ! function_exists('_error_handler'))
*/ */
function _error_handler($severity, $message, $filepath, $line) function _error_handler($severity, $message, $filepath, $line)
{ {
$is_error = (((E_ERROR | E_COMPILE_ERROR | E_CORE_ERROR | E_USER_ERROR) & $severity) === $severity); $is_error = (((E_ERROR | E_PARSE | E_COMPILE_ERROR | E_CORE_ERROR | E_USER_ERROR) & $severity) === $severity);
// When an error occurred, set the status header to '500 Internal Server Error' // When an error occurred, set the status header to '500 Internal Server Error'
// to indicate to the client something went wrong. // to indicate to the client something went wrong.
@ -656,6 +652,7 @@ if ( ! function_exists('_exception_handler'))
$_error =& load_class('Exceptions', 'core'); $_error =& load_class('Exceptions', 'core');
$_error->log_exception('error', 'Exception: '.$exception->getMessage(), $exception->getFile(), $exception->getLine()); $_error->log_exception('error', 'Exception: '.$exception->getMessage(), $exception->getFile(), $exception->getLine());
is_cli() OR set_status_header(500);
// Should we display the error? // Should we display the error?
if (str_ireplace(array('off', 'none', 'no', 'false', 'null'), '', ini_get('display_errors'))) if (str_ireplace(array('off', 'none', 'no', 'false', 'null'), '', ini_get('display_errors')))
{ {
@ -716,8 +713,9 @@ if ( ! function_exists('remove_invisible_characters'))
// carriage return (dec 13) and horizontal tab (dec 09) // carriage return (dec 13) and horizontal tab (dec 09)
if ($url_encoded) if ($url_encoded)
{ {
$non_displayables[] = '/%0[0-8bcef]/'; // url encoded 00-08, 11, 12, 14, 15 $non_displayables[] = '/%0[0-8bcef]/i'; // url encoded 00-08, 11, 12, 14, 15
$non_displayables[] = '/%1[0-9a-f]/'; // url encoded 16-31 $non_displayables[] = '/%1[0-9a-f]/i'; // url encoded 16-31
$non_displayables[] = '/%7f/i'; // url encoded 127
} }
$non_displayables[] = '/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S'; // 00-08, 11, 12, 14-31, 127 $non_displayables[] = '/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S'; // 00-08, 11, 12, 14-31, 127
@ -821,7 +819,7 @@ if ( ! function_exists('function_usable'))
* terminate script execution if a disabled function is executed. * terminate script execution if a disabled function is executed.
* *
* The above described behavior turned out to be a bug in Suhosin, * The above described behavior turned out to be a bug in Suhosin,
* but even though a fix was commited for 0.9.34 on 2012-02-12, * but even though a fix was committed for 0.9.34 on 2012-02-12,
* that version is yet to be released. This function will therefore * that version is yet to be released. This function will therefore
* be just temporary, but would probably be kept for a few years. * be just temporary, but would probably be kept for a few years.
* *

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 1.0.0 * @since Version 1.0.0
@ -319,7 +319,7 @@ class CI_Config {
} }
} }
return $base_url.ltrim($this->_uri_string($uri), '/'); return $base_url.$this->_uri_string($uri);
} }
// ------------------------------------------------------------- // -------------------------------------------------------------
@ -337,11 +337,8 @@ class CI_Config {
{ {
if ($this->item('enable_query_strings') === FALSE) if ($this->item('enable_query_strings') === FALSE)
{ {
if (is_array($uri)) is_array($uri) && $uri = implode('/', $uri);
{ return ltrim($uri, '/');
$uri = implode('/', $uri);
}
return trim($uri, '/');
} }
elseif (is_array($uri)) elseif (is_array($uri))
{ {

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 1.0.0 * @since Version 1.0.0

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 1.0.0 * @since Version 1.0.0
@ -207,7 +207,6 @@ class CI_Exceptions {
} }
else else
{ {
set_status_header(500);
$templates_path .= 'html'.DIRECTORY_SEPARATOR; $templates_path .= 'html'.DIRECTORY_SEPARATOR;
} }

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 1.0.0 * @since Version 1.0.0

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 1.0.0 * @since Version 1.0.0
@ -359,7 +359,7 @@ class CI_Input {
* @param bool $httponly Whether to only makes the cookie accessible via HTTP (no javascript) * @param bool $httponly Whether to only makes the cookie accessible via HTTP (no javascript)
* @return void * @return void
*/ */
public function set_cookie($name, $value = '', $expire = '', $domain = '', $path = '/', $prefix = '', $secure = FALSE, $httponly = FALSE) public function set_cookie($name, $value = '', $expire = '', $domain = '', $path = '/', $prefix = '', $secure = NULL, $httponly = NULL)
{ {
if (is_array($name)) if (is_array($name))
{ {
@ -388,15 +388,13 @@ class CI_Input {
$path = config_item('cookie_path'); $path = config_item('cookie_path');
} }
if ($secure === FALSE && config_item('cookie_secure') === TRUE) $secure = ($secure === NULL && config_item('cookie_secure') !== NULL)
{ ? (bool) config_item('cookie_secure')
$secure = config_item('cookie_secure'); : (bool) $secure;
}
if ($httponly === FALSE && config_item('cookie_httponly') !== FALSE) $httponly = ($httponly === NULL && config_item('cookie_httponly') !== NULL)
{ ? (bool) config_item('cookie_httponly')
$httponly = config_item('cookie_httponly'); : (bool) $httponly;
}
if ( ! is_numeric($expire)) if ( ! is_numeric($expire))
{ {
@ -519,9 +517,9 @@ class CI_Input {
if ($separator === ':') if ($separator === ':')
{ {
$netaddr = explode(':', str_replace('::', str_repeat(':', 9 - substr_count($netaddr, ':')), $netaddr)); $netaddr = explode(':', str_replace('::', str_repeat(':', 9 - substr_count($netaddr, ':')), $netaddr));
for ($i = 0; $i < 8; $i++) for ($j = 0; $j < 8; $j++)
{ {
$netaddr[$i] = intval($netaddr[$i], 16); $netaddr[$j] = intval($netaddr[$j], 16);
} }
} }
else else
@ -760,30 +758,32 @@ class CI_Input {
// If header is already defined, return it immediately // If header is already defined, return it immediately
if ( ! empty($this->headers)) if ( ! empty($this->headers))
{ {
return $this->headers; return $this->_fetch_from_array($this->headers, NULL, $xss_clean);
} }
// In Apache, you can simply call apache_request_headers() // In Apache, you can simply call apache_request_headers()
if (function_exists('apache_request_headers')) if (function_exists('apache_request_headers'))
{ {
return $this->headers = apache_request_headers(); $this->headers = apache_request_headers();
} }
else
$this->headers['Content-Type'] = isset($_SERVER['CONTENT_TYPE']) ? $_SERVER['CONTENT_TYPE'] : @getenv('CONTENT_TYPE');
foreach ($_SERVER as $key => $val)
{ {
if (sscanf($key, 'HTTP_%s', $header) === 1) isset($_SERVER['CONTENT_TYPE']) && $this->headers['Content-Type'] = $_SERVER['CONTENT_TYPE'];
{
// take SOME_HEADER and turn it into Some-Header
$header = str_replace('_', ' ', strtolower($header));
$header = str_replace(' ', '-', ucwords($header));
$this->headers[$header] = $this->_fetch_from_array($_SERVER, $key, $xss_clean); foreach ($_SERVER as $key => $val)
{
if (sscanf($key, 'HTTP_%s', $header) === 1)
{
// take SOME_HEADER and turn it into Some-Header
$header = str_replace('_', ' ', strtolower($header));
$header = str_replace(' ', '-', ucwords($header));
$this->headers[$header] = $_SERVER[$key];
}
} }
} }
return $this->headers; return $this->_fetch_from_array($this->headers, NULL, $xss_clean);
} }
// -------------------------------------------------------------------- // --------------------------------------------------------------------

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 1.0.0 * @since Version 1.0.0

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 1.0.0 * @since Version 1.0.0
@ -486,7 +486,7 @@ class CI_Loader {
*/ */
public function view($view, $vars = array(), $return = FALSE) public function view($view, $vars = array(), $return = FALSE)
{ {
return $this->_ci_load(array('_ci_view' => $view, '_ci_vars' => $this->_ci_object_to_array($vars), '_ci_return' => $return)); return $this->_ci_load(array('_ci_view' => $view, '_ci_vars' => $this->_ci_prepare_view_vars($vars), '_ci_return' => $return));
} }
// -------------------------------------------------------------------- // --------------------------------------------------------------------
@ -519,19 +519,13 @@ class CI_Loader {
*/ */
public function vars($vars, $val = '') public function vars($vars, $val = '')
{ {
if (is_string($vars)) $vars = is_string($vars)
{ ? array($vars => $val)
$vars = array($vars => $val); : $this->_ci_prepare_view_vars($vars);
}
$vars = $this->_ci_object_to_array($vars); foreach ($vars as $key => $val)
if (is_array($vars) && count($vars) > 0)
{ {
foreach ($vars as $key => $val) $this->_ci_cached_vars[$key] = $val;
{
$this->_ci_cached_vars[$key] = $val;
}
} }
return $this; return $this;
@ -591,15 +585,21 @@ class CI_Loader {
*/ */
public function helper($helpers = array()) public function helper($helpers = array())
{ {
foreach ($this->_ci_prep_filename($helpers, '_helper') as $helper) is_array($helpers) OR $helpers = array($helpers);
foreach ($helpers as &$helper)
{ {
$filename = basename($helper);
$filepath = ($filename === $helper) ? '' : substr($helper, 0, strlen($helper) - strlen($filename));
$filename = strtolower(preg_replace('#(_helper)?(\.php)?$#i', '', $filename)).'_helper';
$helper = $filepath.$filename;
if (isset($this->_ci_helpers[$helper])) if (isset($this->_ci_helpers[$helper]))
{ {
continue; continue;
} }
// Is this a helper extension request? // Is this a helper extension request?
$ext_helper = config_item('subclass_prefix').$helper; $ext_helper = config_item('subclass_prefix').$filename;
$ext_loaded = FALSE; $ext_loaded = FALSE;
foreach ($this->_ci_helper_paths as $path) foreach ($this->_ci_helper_paths as $path)
{ {
@ -934,18 +934,7 @@ class CI_Loader {
* the two types and cache them so that views that are embedded within * the two types and cache them so that views that are embedded within
* other views can have access to these variables. * other views can have access to these variables.
*/ */
if (is_array($_ci_vars)) empty($_ci_vars) OR $this->_ci_cached_vars = array_merge($this->_ci_cached_vars, $_ci_vars);
{
foreach (array_keys($_ci_vars) as $key)
{
if (strncmp($key, '_ci_', 4) === 0)
{
unset($_ci_vars[$key]);
}
}
$this->_ci_cached_vars = array_merge($this->_ci_cached_vars, $_ci_vars);
}
extract($this->_ci_cached_vars); extract($this->_ci_cached_vars);
/* /*
@ -1106,7 +1095,7 @@ class CI_Loader {
* @used-by CI_Loader::_ci_load_library() * @used-by CI_Loader::_ci_load_library()
* @uses CI_Loader::_ci_init_library() * @uses CI_Loader::_ci_init_library()
* *
* @param string $library Library name to load * @param string $library_name Library name to load
* @param string $file_path Path to the library filename, relative to libraries/ * @param string $file_path Path to the library filename, relative to libraries/
* @param mixed $params Optional parameters to pass to the class constructor * @param mixed $params Optional parameters to pass to the class constructor
* @param string $object_name Optional object name to assign to * @param string $object_name Optional object name to assign to
@ -1376,17 +1365,32 @@ class CI_Loader {
// -------------------------------------------------------------------- // --------------------------------------------------------------------
/** /**
* CI Object to Array translator * Prepare variables for _ci_vars, to be later extract()-ed inside views
* *
* Takes an object as input and converts the class variables to * Converts objects to associative arrays and filters-out internal
* an associative array with key/value pairs. * variable names (i.e. keys prefixed with '_ci_').
* *
* @param object $object Object data to translate * @param mixed $vars
* @return array * @return array
*/ */
protected function _ci_object_to_array($object) protected function _ci_prepare_view_vars($vars)
{ {
return is_object($object) ? get_object_vars($object) : $object; if ( ! is_array($vars))
{
$vars = is_object($vars)
? get_object_vars($vars)
: array();
}
foreach (array_keys($vars) as $key)
{
if (strncmp($key, '_ci_', 4) === 0)
{
unset($vars[$key]);
}
}
return $vars;
} }
// -------------------------------------------------------------------- // --------------------------------------------------------------------
@ -1404,34 +1408,4 @@ class CI_Loader {
$CI =& get_instance(); $CI =& get_instance();
return $CI->$component; return $CI->$component;
} }
// --------------------------------------------------------------------
/**
* Prep filename
*
* This function prepares filenames of various items to
* make their loading more reliable.
*
* @param string|string[] $filename Filename(s)
* @param string $extension Filename extension
* @return array
*/
protected function _ci_prep_filename($filename, $extension)
{
if ( ! is_array($filename))
{
return array(strtolower(str_replace(array($extension, '.php'), '', $filename).$extension));
}
else
{
foreach ($filename as $key => $val)
{
$filename[$key] = strtolower(str_replace(array($extension, '.php'), '', $val).$extension);
}
return $filename;
}
}
} }

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 1.0.0 * @since Version 1.0.0
@ -104,6 +104,13 @@ class CI_Log {
*/ */
protected $_levels = array('ERROR' => 1, 'DEBUG' => 2, 'INFO' => 3, 'ALL' => 4); protected $_levels = array('ERROR' => 1, 'DEBUG' => 2, 'INFO' => 3, 'ALL' => 4);
/**
* mbstring.func_overload flag
*
* @var bool
*/
protected static $func_overload;
// -------------------------------------------------------------------- // --------------------------------------------------------------------
/** /**
@ -115,6 +122,8 @@ class CI_Log {
{ {
$config =& get_config(); $config =& get_config();
isset(self::$func_overload) OR self::$func_overload = (extension_loaded('mbstring') && ini_get('mbstring.func_overload'));
$this->_log_path = ($config['log_path'] !== '') ? $config['log_path'] : APPPATH.'logs/'; $this->_log_path = ($config['log_path'] !== '') ? $config['log_path'] : APPPATH.'logs/';
$this->_file_ext = (isset($config['log_file_extension']) && $config['log_file_extension'] !== '') $this->_file_ext = (isset($config['log_file_extension']) && $config['log_file_extension'] !== '')
? ltrim($config['log_file_extension'], '.') : 'php'; ? ltrim($config['log_file_extension'], '.') : 'php';
@ -208,9 +217,9 @@ class CI_Log {
$message .= $this->_format_line($level, $date, $msg); $message .= $this->_format_line($level, $date, $msg);
for ($written = 0, $length = strlen($message); $written < $length; $written += $result) for ($written = 0, $length = self::strlen($message); $written < $length; $written += $result)
{ {
if (($result = fwrite($fp, substr($message, $written))) === FALSE) if (($result = fwrite($fp, self::substr($message, $written))) === FALSE)
{ {
break; break;
} }
@ -237,11 +246,51 @@ class CI_Log {
* *
* @param string $level The error level * @param string $level The error level
* @param string $date Formatted date string * @param string $date Formatted date string
* @param string $msg The log message * @param string $message The log message
* @return string Formatted log line with a new line character '\n' at the end * @return string Formatted log line with a new line character '\n' at the end
*/ */
protected function _format_line($level, $date, $message) protected function _format_line($level, $date, $message)
{ {
return $level.' - '.$date.' --> '.$message."\n"; return $level.' - '.$date.' --> '.$message."\n";
} }
// --------------------------------------------------------------------
/**
* Byte-safe strlen()
*
* @param string $str
* @return int
*/
protected static function strlen($str)
{
return (self::$func_overload)
? mb_strlen($str, '8bit')
: strlen($str);
}
// --------------------------------------------------------------------
/**
* Byte-safe substr()
*
* @param string $str
* @param int $start
* @param int $length
* @return string
*/
protected static function substr($str, $start, $length = NULL)
{
if (self::$func_overload)
{
// mb_substr($str, $start, null, '8bit') returns an empty
// string on PHP 5.3
isset($length) OR $length = ($start >= 0 ? self::strlen($str) - $start : -$start);
return mb_substr($str, $start, $length, '8bit');
}
return isset($length)
? substr($str, $start, $length)
: substr($str, $start);
}
} }

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 1.0.0 * @since Version 1.0.0

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 1.0.0 * @since Version 1.0.0
@ -122,6 +122,13 @@ class CI_Output {
*/ */
public $parse_exec_vars = TRUE; public $parse_exec_vars = TRUE;
/**
* mbstring.func_overload flag
*
* @var bool
*/
protected static $func_overload;
/** /**
* Class constructor * Class constructor
* *
@ -138,6 +145,8 @@ class CI_Output {
&& extension_loaded('zlib') && extension_loaded('zlib')
); );
isset(self::$func_overload) OR self::$func_overload = (extension_loaded('mbstring') && ini_get('mbstring.func_overload'));
// Get mime types for later // Get mime types for later
$this->mimes =& get_mimes(); $this->mimes =& get_mimes();
@ -285,7 +294,7 @@ class CI_Output {
/** /**
* Get Header * Get Header
* *
* @param string $header_name * @param string $header
* @return string * @return string
*/ */
public function get_header($header) public function get_header($header)
@ -302,11 +311,12 @@ class CI_Output {
return NULL; return NULL;
} }
for ($i = 0, $c = count($headers); $i < $c; $i++) // Count backwards, in order to get the last matching header
for ($c = count($headers) - 1; $c > -1; $c--)
{ {
if (strncasecmp($header, $headers[$i], $l = strlen($header)) === 0) if (strncasecmp($header, $headers[$c], $l = self::strlen($header)) === 0)
{ {
return trim(substr($headers[$i], $l+1)); return trim(self::substr($headers[$c], $l+1));
} }
} }
@ -480,13 +490,13 @@ class CI_Output {
if (isset($_SERVER['HTTP_ACCEPT_ENCODING']) && strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== FALSE) if (isset($_SERVER['HTTP_ACCEPT_ENCODING']) && strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== FALSE)
{ {
header('Content-Encoding: gzip'); header('Content-Encoding: gzip');
header('Content-Length: '.strlen($output)); header('Content-Length: '.self::strlen($output));
} }
else else
{ {
// User agent doesn't support gzip compression, // User agent doesn't support gzip compression,
// so we'll have to decompress our cache // so we'll have to decompress our cache
$output = gzinflate(substr($output, 10, -8)); $output = gzinflate(self::substr($output, 10, -8));
} }
} }
@ -601,9 +611,9 @@ class CI_Output {
$output = $cache_info.'ENDCI--->'.$output; $output = $cache_info.'ENDCI--->'.$output;
for ($written = 0, $length = strlen($output); $written < $length; $written += $result) for ($written = 0, $length = self::strlen($output); $written < $length; $written += $result)
{ {
if (($result = fwrite($fp, substr($output, $written))) === FALSE) if (($result = fwrite($fp, self::substr($output, $written))) === FALSE)
{ {
break; break;
} }
@ -711,7 +721,7 @@ class CI_Output {
} }
// Display the cache // Display the cache
$this->_display(substr($cache, strlen($match[0]))); $this->_display(self::substr($cache, self::strlen($match[0])));
log_message('debug', 'Cache file is current. Sending it to browser.'); log_message('debug', 'Cache file is current. Sending it to browser.');
return TRUE; return TRUE;
} }
@ -797,4 +807,43 @@ class CI_Output {
} }
} }
// --------------------------------------------------------------------
/**
* Byte-safe strlen()
*
* @param string $str
* @return int
*/
protected static function strlen($str)
{
return (self::$func_overload)
? mb_strlen($str, '8bit')
: strlen($str);
}
// --------------------------------------------------------------------
/**
* Byte-safe substr()
*
* @param string $str
* @param int $start
* @param int $length
* @return string
*/
protected static function substr($str, $start, $length = NULL)
{
if (self::$func_overload)
{
// mb_substr($str, $start, null, '8bit') returns an empty
// string on PHP 5.3
isset($length) OR $length = ($start >= 0 ? self::strlen($str) - $start : -$start);
return mb_substr($str, $start, $length, '8bit');
}
return isset($length)
? substr($str, $start, $length)
: substr($str, $start);
}
} }

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 1.0.0 * @since Version 1.0.0

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 1.0.0 * @since Version 1.0.0
@ -133,15 +133,16 @@ class CI_Security {
* @var array * @var array
*/ */
protected $_never_allowed_str = array( protected $_never_allowed_str = array(
'document.cookie' => '[removed]', 'document.cookie' => '[removed]',
'document.write' => '[removed]', 'document.write' => '[removed]',
'.parentNode' => '[removed]', '.parentNode' => '[removed]',
'.innerHTML' => '[removed]', '.innerHTML' => '[removed]',
'-moz-binding' => '[removed]', '-moz-binding' => '[removed]',
'<!--' => '&lt;!--', '<!--' => '&lt;!--',
'-->' => '--&gt;', '-->' => '--&gt;',
'<![CDATA[' => '&lt;![CDATA[', '<![CDATA[' => '&lt;![CDATA[',
'<comment>' => '&lt;comment&gt;' '<comment>' => '&lt;comment&gt;',
'<%' => '&lt;&#37;'
); );
/** /**
@ -223,14 +224,11 @@ class CI_Security {
} }
} }
// Do the tokens exist in both the _POST and _COOKIE arrays? // Check CSRF token validity, but don't error on mismatch just yet - we'll want to regenerate
if ( ! isset($_POST[$this->_csrf_token_name], $_COOKIE[$this->_csrf_cookie_name]) $valid = isset($_POST[$this->_csrf_token_name], $_COOKIE[$this->_csrf_cookie_name])
OR $_POST[$this->_csrf_token_name] !== $_COOKIE[$this->_csrf_cookie_name]) // Do the tokens match? && hash_equals($_POST[$this->_csrf_token_name], $_COOKIE[$this->_csrf_cookie_name]);
{
$this->csrf_show_error();
}
// We kill this since we're done and we don't want to polute the _POST array // We kill this since we're done and we don't want to pollute the _POST array
unset($_POST[$this->_csrf_token_name]); unset($_POST[$this->_csrf_token_name]);
// Regenerate on every submission? // Regenerate on every submission?
@ -244,6 +242,11 @@ class CI_Security {
$this->_csrf_set_hash(); $this->_csrf_set_hash();
$this->csrf_set_cookie(); $this->csrf_set_cookie();
if ($valid !== TRUE)
{
$this->csrf_show_error();
}
log_message('info', 'CSRF token verified'); log_message('info', 'CSRF token verified');
return $this; return $this;
} }
@ -351,9 +354,9 @@ class CI_Security {
// Is the string an array? // Is the string an array?
if (is_array($str)) if (is_array($str))
{ {
while (list($key) = each($str)) foreach ($str as $key => &$value)
{ {
$str[$key] = $this->xss_clean($str[$key]); $str[$key] = $this->xss_clean($value);
} }
return $str; return $str;
@ -371,11 +374,17 @@ class CI_Security {
* *
* Note: Use rawurldecode() so it does not remove plus signs * Note: Use rawurldecode() so it does not remove plus signs
*/ */
do if (stripos($str, '%') !== false)
{ {
$str = rawurldecode($str); do
{
$oldstr = $str;
$str = rawurldecode($str);
$str = preg_replace_callback('#%(?:\s*[0-9a-f]){2,}#i', array($this, '_urldecodespaces'), $str);
}
while ($oldstr !== $str);
unset($oldstr);
} }
while (preg_match('/%[0-9a-f]{2,}/i', $str));
/* /*
* Convert character entities to ASCII * Convert character entities to ASCII
@ -466,7 +475,7 @@ class CI_Security {
if (preg_match('/<a/i', $str)) if (preg_match('/<a/i', $str))
{ {
$str = preg_replace_callback('#<a[^a-z0-9>]+([^>]*?)(?:>|$)#si', array($this, '_js_link_removal'), $str); $str = preg_replace_callback('#<a(?:rea)?[^a-z0-9>]+([^>]*?)(?:>|$)#si', array($this, '_js_link_removal'), $str);
} }
if (preg_match('/<img/i', $str)) if (preg_match('/<img/i', $str))
@ -492,7 +501,7 @@ class CI_Security {
* Becomes: &lt;blink&gt; * Becomes: &lt;blink&gt;
*/ */
$pattern = '#' $pattern = '#'
.'<((?<slash>/*\s*)(?<tagName>[a-z0-9]+)(?=[^a-z0-9]|$)' // tag start and name, followed by a non-tag character .'<((?<slash>/*\s*)((?<tagName>[a-z0-9]+)(?=[^a-z0-9]|$)|.+)' // tag start and name, followed by a non-tag character
.'[^\s\042\047a-z0-9>/=]*' // a valid attribute character immediately after the tag would count as a separator .'[^\s\042\047a-z0-9>/=]*' // a valid attribute character immediately after the tag would count as a separator
// optional attributes // optional attributes
.'(?<attributes>(?:[\s\042\047/=]*' // non-attribute characters, excluding > (tag close) for obvious reasons .'(?<attributes>(?:[\s\042\047/=]*' // non-attribute characters, excluding > (tag close) for obvious reasons
@ -669,6 +678,22 @@ class CI_Security {
? ENT_COMPAT | ENT_HTML5 ? ENT_COMPAT | ENT_HTML5
: ENT_COMPAT; : ENT_COMPAT;
if ( ! isset($_entities))
{
$_entities = array_map('strtolower', get_html_translation_table(HTML_ENTITIES, $flag, $charset));
// If we're not on PHP 5.4+, add the possibly dangerous HTML 5
// entities to the array manually
if ($flag === ENT_COMPAT)
{
$_entities[':'] = '&colon;';
$_entities['('] = '&lpar;';
$_entities[')'] = '&rpar;';
$_entities["\n"] = '&NewLine;';
$_entities["\t"] = '&Tab;';
}
}
do do
{ {
$str_compare = $str; $str_compare = $str;
@ -676,27 +701,6 @@ class CI_Security {
// Decode standard entities, avoiding false positives // Decode standard entities, avoiding false positives
if (preg_match_all('/&[a-z]{2,}(?![a-z;])/i', $str, $matches)) if (preg_match_all('/&[a-z]{2,}(?![a-z;])/i', $str, $matches))
{ {
if ( ! isset($_entities))
{
$_entities = array_map(
'strtolower',
is_php('5.3.4')
? get_html_translation_table(HTML_ENTITIES, $flag, $charset)
: get_html_translation_table(HTML_ENTITIES, $flag)
);
// If we're not on PHP 5.4+, add the possibly dangerous HTML 5
// entities to the array manually
if ($flag === ENT_COMPAT)
{
$_entities[':'] = '&colon;';
$_entities['('] = '&lpar;';
$_entities[')'] = '&rpar;';
$_entities["\n"] = '&newline;';
$_entities["\t"] = '&tab;';
}
}
$replace = array(); $replace = array();
$matches = array_unique(array_map('strtolower', $matches[0])); $matches = array_unique(array_map('strtolower', $matches[0]));
foreach ($matches as &$match) foreach ($matches as &$match)
@ -707,7 +711,7 @@ class CI_Security {
} }
} }
$str = str_ireplace(array_keys($replace), array_values($replace), $str); $str = str_replace(array_keys($replace), array_values($replace), $str);
} }
// Decode numeric & UTF16 two byte entities // Decode numeric & UTF16 two byte entities
@ -716,6 +720,11 @@ class CI_Security {
$flag, $flag,
$charset $charset
); );
if ($flag === ENT_COMPAT)
{
$str = str_replace(array_values($_entities), array_keys($_entities), $str);
}
} }
while ($str_compare !== $str); while ($str_compare !== $str);
return $str; return $str;
@ -774,6 +783,24 @@ class CI_Security {
// ---------------------------------------------------------------- // ----------------------------------------------------------------
/**
* URL-decode taking spaces into account
*
* @see https://github.com/bcit-ci/CodeIgniter/issues/4877
* @param array $matches
* @return string
*/
protected function _urldecodespaces($matches)
{
$input = $matches[0];
$nospaces = preg_replace('#\s+#', '', $input);
return ($nospaces === $input)
? $input
: rawurldecode($nospaces);
}
// ----------------------------------------------------------------
/** /**
* Compact Exploded Words * Compact Exploded Words
* *
@ -803,7 +830,7 @@ class CI_Security {
protected function _sanitize_naughty_html($matches) protected function _sanitize_naughty_html($matches)
{ {
static $naughty_tags = array( static $naughty_tags = array(
'alert', 'prompt', 'confirm', 'applet', 'audio', 'basefont', 'base', 'behavior', 'bgsound', 'alert', 'area', 'prompt', 'confirm', 'applet', 'audio', 'basefont', 'base', 'behavior', 'bgsound',
'blink', 'body', 'embed', 'expression', 'form', 'frameset', 'frame', 'head', 'html', 'ilayer', 'blink', 'body', 'embed', 'expression', 'form', 'frameset', 'frame', 'head', 'html', 'ilayer',
'iframe', 'input', 'button', 'select', 'isindex', 'layer', 'link', 'meta', 'keygen', 'object', 'iframe', 'input', 'button', 'select', 'isindex', 'layer', 'link', 'meta', 'keygen', 'object',
'plaintext', 'style', 'script', 'textarea', 'title', 'math', 'video', 'svg', 'xml', 'xss' 'plaintext', 'style', 'script', 'textarea', 'title', 'math', 'video', 'svg', 'xml', 'xss'
@ -842,7 +869,7 @@ class CI_Security {
// Each iteration filters a single attribute // Each iteration filters a single attribute
do do
{ {
// Strip any non-alpha characters that may preceed an attribute. // Strip any non-alpha characters that may precede an attribute.
// Browsers often parse these incorrectly and that has been a // Browsers often parse these incorrectly and that has been a
// of numerous XSS issues we've had. // of numerous XSS issues we've had.
$matches['attributes'] = preg_replace('#^[^a-z]+#i', '', $matches['attributes']); $matches['attributes'] = preg_replace('#^[^a-z]+#i', '', $matches['attributes']);
@ -900,7 +927,7 @@ class CI_Security {
return str_replace( return str_replace(
$match[1], $match[1],
preg_replace( preg_replace(
'#href=.*?(?:(?:alert|prompt|confirm)(?:\(|&\#40;)|javascript:|livescript:|mocha:|charset=|window\.|document\.|\.cookie|<script|<xss|data\s*:)#si', '#href=.*?(?:(?:alert|prompt|confirm)(?:\(|&\#40;)|javascript:|livescript:|mocha:|charset=|window\.|document\.|\.cookie|<script|<xss|d\s*a\s*t\s*a\s*:)#si',
'', '',
$this->_filter_attributes($match[1]) $this->_filter_attributes($match[1])
), ),

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 1.0.0 * @since Version 1.0.0

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 2.0.0 * @since Version 2.0.0

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 3.0.0 * @since Version 3.0.0
@ -119,7 +119,7 @@ if ( ! function_exists('hash_pbkdf2'))
*/ */
function hash_pbkdf2($algo, $password, $salt, $iterations, $length = 0, $raw_output = FALSE) function hash_pbkdf2($algo, $password, $salt, $iterations, $length = 0, $raw_output = FALSE)
{ {
if ( ! in_array($algo, hash_algos(), TRUE)) if ( ! in_array(strtolower($algo), hash_algos(), TRUE))
{ {
trigger_error('hash_pbkdf2(): Unknown hashing algorithm: '.$algo, E_USER_WARNING); trigger_error('hash_pbkdf2(): Unknown hashing algorithm: '.$algo, E_USER_WARNING);
return FALSE; return FALSE;
@ -173,7 +173,9 @@ if ( ! function_exists('hash_pbkdf2'))
return FALSE; return FALSE;
} }
$hash_length = strlen(hash($algo, NULL, TRUE)); $hash_length = defined('MB_OVERLOAD_STRING')
? mb_strlen(hash($algo, NULL, TRUE), '8bit')
: strlen(hash($algo, NULL, TRUE));
empty($length) && $length = $hash_length; empty($length) && $length = $hash_length;
// Pre-hash password inputs longer than the algorithm's block size // Pre-hash password inputs longer than the algorithm's block size
@ -221,14 +223,14 @@ if ( ! function_exists('hash_pbkdf2'))
'whirlpool' => 64 'whirlpool' => 64
); );
if (isset($block_sizes[$algo]) && strlen($password) > $block_sizes[$algo]) if (isset($block_sizes[$algo], $password[$block_sizes[$algo]]))
{ {
$password = hash($algo, $password, TRUE); $password = hash($algo, $password, TRUE);
} }
$hash = ''; $hash = '';
// Note: Blocks are NOT 0-indexed // Note: Blocks are NOT 0-indexed
for ($bc = ceil($length / $hash_length), $bi = 1; $bi <= $bc; $bi++) for ($bc = (int) ceil($length / $hash_length), $bi = 1; $bi <= $bc; $bi++)
{ {
$key = $derived_key = hash_hmac($algo, $salt.pack('N', $bi), $password, TRUE); $key = $derived_key = hash_hmac($algo, $salt.pack('N', $bi), $password, TRUE);
for ($i = 1; $i < $iterations; $i++) for ($i = 1; $i < $iterations; $i++)
@ -240,6 +242,13 @@ if ( ! function_exists('hash_pbkdf2'))
} }
// This is not RFC-compatible, but we're aiming for natural PHP compatibility // This is not RFC-compatible, but we're aiming for natural PHP compatibility
return substr($raw_output ? $hash : bin2hex($hash), 0, $length); if ( ! $raw_output)
{
$hash = bin2hex($hash);
}
return defined('MB_OVERLOAD_STRING')
? mb_substr($hash, 0, $length, '8bit')
: substr($hash, 0, $length);
} }
} }

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 3.0.0 * @since Version 3.0.0

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 3.0.0 * @since Version 3.0.0
@ -50,7 +50,7 @@ defined('BASEPATH') OR exit('No direct script access allowed');
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
if (is_php('5.5') OR ! is_php('5.3.7') OR ! defined('CRYPT_BLOWFISH') OR CRYPT_BLOWFISH !== 1 OR defined('HHVM_VERSION')) if (is_php('5.5') OR ! defined('CRYPT_BLOWFISH') OR CRYPT_BLOWFISH !== 1 OR defined('HHVM_VERSION'))
{ {
return; return;
} }
@ -94,8 +94,8 @@ if ( ! function_exists('password_hash'))
*/ */
function password_hash($password, $algo, array $options = array()) function password_hash($password, $algo, array $options = array())
{ {
static $func_override; static $func_overload;
isset($func_override) OR $func_override = (extension_loaded('mbstring') && ini_get('mbstring.func_override')); isset($func_overload) OR $func_overload = (extension_loaded('mbstring') && ini_get('mbstring.func_overload'));
if ($algo !== 1) if ($algo !== 1)
{ {
@ -109,21 +109,29 @@ if ( ! function_exists('password_hash'))
return NULL; return NULL;
} }
if (isset($options['salt']) && ($saltlen = ($func_override ? mb_strlen($options['salt'], '8bit') : strlen($options['salt']))) < 22) if (isset($options['salt']) && ($saltlen = ($func_overload ? mb_strlen($options['salt'], '8bit') : strlen($options['salt']))) < 22)
{ {
trigger_error('password_hash(): Provided salt is too short: '.$saltlen.' expecting 22', E_USER_WARNING); trigger_error('password_hash(): Provided salt is too short: '.$saltlen.' expecting 22', E_USER_WARNING);
return NULL; return NULL;
} }
elseif ( ! isset($options['salt'])) elseif ( ! isset($options['salt']))
{ {
if (defined('MCRYPT_DEV_URANDOM')) if (function_exists('random_bytes'))
{
try
{
$options['salt'] = random_bytes(16);
}
catch (Exception $e)
{
log_message('error', 'compat/password: Error while trying to use random_bytes(): '.$e->getMessage());
return FALSE;
}
}
elseif (defined('MCRYPT_DEV_URANDOM'))
{ {
$options['salt'] = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM); $options['salt'] = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM);
} }
elseif (function_exists('openssl_random_pseudo_bytes'))
{
$options['salt'] = openssl_random_pseudo_bytes(16);
}
elseif (DIRECTORY_SEPARATOR === '/' && (is_readable($dev = '/dev/arandom') OR is_readable($dev = '/dev/urandom'))) elseif (DIRECTORY_SEPARATOR === '/' && (is_readable($dev = '/dev/arandom') OR is_readable($dev = '/dev/urandom')))
{ {
if (($fp = fopen($dev, 'rb')) === FALSE) if (($fp = fopen($dev, 'rb')) === FALSE)
@ -136,7 +144,7 @@ if ( ! function_exists('password_hash'))
is_php('5.4') && stream_set_chunk_size($fp, 16); is_php('5.4') && stream_set_chunk_size($fp, 16);
$options['salt'] = ''; $options['salt'] = '';
for ($read = 0; $read < 16; $read = ($func_override) ? mb_strlen($options['salt'], '8bit') : strlen($options['salt'])) for ($read = 0; $read < 16; $read = ($func_overload) ? mb_strlen($options['salt'], '8bit') : strlen($options['salt']))
{ {
if (($read = fread($fp, 16 - $read)) === FALSE) if (($read = fread($fp, 16 - $read)) === FALSE)
{ {
@ -148,6 +156,16 @@ if ( ! function_exists('password_hash'))
fclose($fp); fclose($fp);
} }
elseif (function_exists('openssl_random_pseudo_bytes'))
{
$is_secure = NULL;
$options['salt'] = openssl_random_pseudo_bytes(16, $is_secure);
if ($is_secure !== TRUE)
{
log_message('error', 'compat/password: openssl_random_pseudo_bytes() set the $cryto_strong flag to FALSE');
return FALSE;
}
}
else else
{ {
log_message('error', 'compat/password: No CSPRNG available.'); log_message('error', 'compat/password: No CSPRNG available.');

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 3.0.0 * @since Version 3.0.0
@ -62,7 +62,7 @@ if ( ! function_exists('array_column'))
* array_column() * array_column()
* *
* @link http://php.net/array_column * @link http://php.net/array_column
* @param string $array * @param array $array
* @param mixed $column_key * @param mixed $column_key
* @param mixed $index_key * @param mixed $index_key
* @return array * @return array
@ -153,7 +153,7 @@ if ( ! function_exists('hex2bin'))
*/ */
function hex2bin($data) function hex2bin($data)
{ {
if (in_array($type = gettype($data), array('array', 'double', 'object'), TRUE)) if (in_array($type = gettype($data), array('array', 'double', 'object', 'resource'), TRUE))
{ {
if ($type === 'object' && method_exists($data, '__toString')) if ($type === 'object' && method_exists($data, '__toString'))
{ {
@ -180,210 +180,3 @@ if ( ! function_exists('hex2bin'))
return pack('H*', $data); return pack('H*', $data);
} }
} }
// ------------------------------------------------------------------------
if (is_php('5.3'))
{
return;
}
// ------------------------------------------------------------------------
if ( ! function_exists('array_replace'))
{
/**
* array_replace()
*
* @link http://php.net/array_replace
* @return array
*/
function array_replace()
{
$arrays = func_get_args();
if (($c = count($arrays)) === 0)
{
trigger_error('array_replace() expects at least 1 parameter, 0 given', E_USER_WARNING);
return NULL;
}
elseif ($c === 1)
{
if ( ! is_array($arrays[0]))
{
trigger_error('array_replace(): Argument #1 is not an array', E_USER_WARNING);
return NULL;
}
return $arrays[0];
}
$array = array_shift($arrays);
$c--;
for ($i = 0; $i < $c; $i++)
{
if ( ! is_array($arrays[$i]))
{
trigger_error('array_replace(): Argument #'.($i + 2).' is not an array', E_USER_WARNING);
return NULL;
}
elseif (empty($arrays[$i]))
{
continue;
}
foreach (array_keys($arrays[$i]) as $key)
{
$array[$key] = $arrays[$i][$key];
}
}
return $array;
}
}
// ------------------------------------------------------------------------
if ( ! function_exists('array_replace_recursive'))
{
/**
* array_replace_recursive()
*
* @link http://php.net/array_replace_recursive
* @return array
*/
function array_replace_recursive()
{
$arrays = func_get_args();
if (($c = count($arrays)) === 0)
{
trigger_error('array_replace_recursive() expects at least 1 parameter, 0 given', E_USER_WARNING);
return NULL;
}
elseif ($c === 1)
{
if ( ! is_array($arrays[0]))
{
trigger_error('array_replace_recursive(): Argument #1 is not an array', E_USER_WARNING);
return NULL;
}
return $arrays[0];
}
$array = array_shift($arrays);
$c--;
for ($i = 0; $i < $c; $i++)
{
if ( ! is_array($arrays[$i]))
{
trigger_error('array_replace_recursive(): Argument #'.($i + 2).' is not an array', E_USER_WARNING);
return NULL;
}
elseif (empty($arrays[$i]))
{
continue;
}
foreach (array_keys($arrays[$i]) as $key)
{
$array[$key] = (is_array($arrays[$i][$key]) && isset($array[$key]) && is_array($array[$key]))
? array_replace_recursive($array[$key], $arrays[$i][$key])
: $arrays[$i][$key];
}
}
return $array;
}
}
// ------------------------------------------------------------------------
if ( ! function_exists('quoted_printable_encode'))
{
/**
* quoted_printable_encode()
*
* @link http://php.net/quoted_printable_encode
* @param string $str
* @return string
*/
function quoted_printable_encode($str)
{
if (strlen($str) === 0)
{
return '';
}
elseif (in_array($type = gettype($str), array('array', 'object'), TRUE))
{
if ($type === 'object' && method_exists($str, '__toString'))
{
$str = (string) $str;
}
else
{
trigger_error('quoted_printable_encode() expects parameter 1 to be string, '.$type.' given', E_USER_WARNING);
return NULL;
}
}
if (function_exists('imap_8bit'))
{
return imap_8bit($str);
}
$i = $lp = 0;
$output = '';
$hex = '0123456789ABCDEF';
$length = (extension_loaded('mbstring') && ini_get('mbstring.func_overload'))
? mb_strlen($str, '8bit')
: strlen($str);
while ($length--)
{
if ((($c = $str[$i++]) === "\015") && isset($str[$i]) && ($str[$i] === "\012") && $length > 0)
{
$output .= "\015".$str[$i++];
$length--;
$lp = 0;
continue;
}
if (
ctype_cntrl($c)
OR (ord($c) === 0x7f)
OR (ord($c) & 0x80)
OR ($c === '=')
OR ($c === ' ' && isset($str[$i]) && $str[$i] === "\015")
)
{
if (
(($lp += 3) > 75 && ord($c) <= 0x7f)
OR (ord($c) > 0x7f && ord($c) <= 0xdf && ($lp + 3) > 75)
OR (ord($c) > 0xdf && ord($c) <= 0xef && ($lp + 6) > 75)
OR (ord($c) > 0xef && ord($c) <= 0xf4 && ($lp + 9) > 75)
)
{
$output .= "=\015\012";
$lp = 3;
}
$output .= '='.$hex[ord($c) >> 4].$hex[ord($c) & 0xf];
continue;
}
if ((++$lp) > 75)
{
$output .= "=\015\012";
$lp = 1;
}
$output .= $c;
}
return $output;
}
}

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 1.0.0 * @since Version 1.0.0

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 1.0.0 * @since Version 1.0.0

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 1.0.0 * @since Version 1.0.0
@ -980,7 +980,7 @@ abstract class CI_DB_driver {
*/ */
public function compile_binds($sql, $binds) public function compile_binds($sql, $binds)
{ {
if (empty($binds) OR empty($this->bind_marker) OR strpos($sql, $this->bind_marker) === FALSE) if (empty($this->bind_marker) OR strpos($sql, $this->bind_marker) === FALSE)
{ {
return $sql; return $sql;
} }
@ -1000,7 +1000,7 @@ abstract class CI_DB_driver {
$ml = strlen($this->bind_marker); $ml = strlen($this->bind_marker);
// Make sure not to replace a chunk inside a string that happens to match the bind marker // Make sure not to replace a chunk inside a string that happens to match the bind marker
if ($c = preg_match_all("/'[^']*'/i", $sql, $matches)) if ($c = preg_match_all("/'[^']*'|\"[^\"]*\"/i", $sql, $matches))
{ {
$c = preg_match_all('/'.preg_quote($this->bind_marker, '/').'/i', $c = preg_match_all('/'.preg_quote($this->bind_marker, '/').'/i',
str_replace($matches[0], str_replace($matches[0],
@ -1173,14 +1173,14 @@ abstract class CI_DB_driver {
// -------------------------------------------------------------------- // --------------------------------------------------------------------
/** /**
* Platform-dependant string escape * Platform-dependent string escape
* *
* @param string * @param string
* @return string * @return string
*/ */
protected function _escape_str($str) protected function _escape_str($str)
{ {
return str_replace("'", "''", remove_invisible_characters($str)); return str_replace("'", "''", remove_invisible_characters($str, FALSE));
} }
// -------------------------------------------------------------------- // --------------------------------------------------------------------

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 1.0.0 * @since Version 1.0.0
@ -184,7 +184,7 @@ abstract class CI_DB_forge {
{ {
return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE;
} }
elseif ( ! $this->db->query(sprintf($this->_create_database, $db_name, $this->db->char_set, $this->db->dbcollat))) elseif ( ! $this->db->query(sprintf($this->_create_database, $this->db->escape_identifiers($db_name), $this->db->char_set, $this->db->dbcollat)))
{ {
return ($this->db->db_debug) ? $this->db->display_error('db_unable_to_drop') : FALSE; return ($this->db->db_debug) ? $this->db->display_error('db_unable_to_drop') : FALSE;
} }
@ -211,7 +211,7 @@ abstract class CI_DB_forge {
{ {
return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE;
} }
elseif ( ! $this->db->query(sprintf($this->_drop_database, $db_name))) elseif ( ! $this->db->query(sprintf($this->_drop_database, $this->db->escape_identifiers($db_name))))
{ {
return ($this->db->db_debug) ? $this->db->display_error('db_unable_to_drop') : FALSE; return ($this->db->db_debug) ? $this->db->display_error('db_unable_to_drop') : FALSE;
} }
@ -348,7 +348,7 @@ abstract class CI_DB_forge {
if (($result = $this->db->query($sql)) !== FALSE) if (($result = $this->db->query($sql)) !== FALSE)
{ {
empty($this->db->data_cache['table_names']) OR $this->db->data_cache['table_names'][] = $table; isset($this->db->data_cache['table_names']) && $this->db->data_cache['table_names'][] = $table;
// Most databases don't support creating indexes from within the CREATE TABLE statement // Most databases don't support creating indexes from within the CREATE TABLE statement
if ( ! empty($this->keys)) if ( ! empty($this->keys))

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 1.0.0 * @since Version 1.0.0
@ -149,6 +149,13 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
*/ */
protected $qb_set = array(); protected $qb_set = array();
/**
* QB data set for update_batch()
*
* @var array
*/
protected $qb_set_ub = array();
/** /**
* QB aliased tables list * QB aliased tables list
* *
@ -207,6 +214,13 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
*/ */
protected $qb_cache_join = array(); protected $qb_cache_join = array();
/**
* QB Cache aliased tables list
*
* @var array
*/
protected $qb_cache_aliased_tables = array();
/** /**
* QB Cache WHERE data * QB Cache WHERE data
* *
@ -679,7 +693,7 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
// value appears not to have been set, assign the test to IS NULL // value appears not to have been set, assign the test to IS NULL
$k .= ' IS NULL'; $k .= ' IS NULL';
} }
elseif (preg_match('/\s*(!?=|<>|IS(?:\s+NOT)?)\s*$/i', $k, $match, PREG_OFFSET_CAPTURE)) elseif (preg_match('/\s*(!?=|<>|\sIS(?:\s+NOT)?\s)\s*$/i', $k, $match, PREG_OFFSET_CAPTURE))
{ {
$k = substr($k, 0, $match[0][1]).($match[1][0] === '=' ? ' IS NULL' : ' IS NOT NULL'); $k = substr($k, 0, $match[0][1]).($match[1][0] === '=' ? ' IS NULL' : ' IS NOT NULL');
} }
@ -1271,7 +1285,7 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
*/ */
protected function _limit($sql) protected function _limit($sql)
{ {
return $sql.' LIMIT '.($this->qb_offset ? $this->qb_offset.', ' : '').$this->qb_limit; return $sql.' LIMIT '.($this->qb_offset ? $this->qb_offset.', ' : '').(int) $this->qb_limit;
} }
// -------------------------------------------------------------------- // --------------------------------------------------------------------
@ -1395,7 +1409,7 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
$this->qb_orderby = NULL; $this->qb_orderby = NULL;
} }
$result = ($this->qb_distinct === TRUE) $result = ($this->qb_distinct === TRUE OR ! empty($this->qb_groupby) OR ! empty($this->qb_cache_groupby))
? $this->query($this->_count_string.$this->protect_identifiers('numrows')."\nFROM (\n".$this->_compile_select()."\n) CI_count_all_results") ? $this->query($this->_count_string.$this->protect_identifiers('numrows')."\nFROM (\n".$this->_compile_select()."\n) CI_count_all_results")
: $this->query($this->_compile_select($this->_count_string.$this->protect_identifiers('numrows'))); : $this->query($this->_compile_select($this->_count_string.$this->protect_identifiers('numrows')));
@ -1498,8 +1512,10 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
$affected_rows = 0; $affected_rows = 0;
for ($i = 0, $total = count($this->qb_set); $i < $total; $i += $batch_size) for ($i = 0, $total = count($this->qb_set); $i < $total; $i += $batch_size)
{ {
$this->query($this->_insert_batch($this->protect_identifiers($table, TRUE, $escape, FALSE), $this->qb_keys, array_slice($this->qb_set, $i, $batch_size))); if ($this->query($this->_insert_batch($this->protect_identifiers($table, TRUE, $escape, FALSE), $this->qb_keys, array_slice($this->qb_set, $i, $batch_size))))
$affected_rows += $this->affected_rows(); {
$affected_rows += $this->affected_rows();
}
} }
$this->_reset_write(); $this->_reset_write();
@ -1544,7 +1560,7 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
is_bool($escape) OR $escape = $this->_protect_identifiers; is_bool($escape) OR $escape = $this->_protect_identifiers;
$keys = array_keys($this->_object_to_array(current($key))); $keys = array_keys($this->_object_to_array(reset($key)));
sort($keys); sort($keys);
foreach ($key as $row) foreach ($key as $row)
@ -1884,7 +1900,7 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
if ($set === NULL) if ($set === NULL)
{ {
if (empty($this->qb_set)) if (empty($this->qb_set_ub))
{ {
return ($this->db_debug) ? $this->display_error('db_must_use_set') : FALSE; return ($this->db_debug) ? $this->display_error('db_must_use_set') : FALSE;
} }
@ -1911,10 +1927,13 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
// Batch this baby // Batch this baby
$affected_rows = 0; $affected_rows = 0;
for ($i = 0, $total = count($this->qb_set); $i < $total; $i += $batch_size) for ($i = 0, $total = count($this->qb_set_ub); $i < $total; $i += $batch_size)
{ {
$this->query($this->_update_batch($this->protect_identifiers($table, TRUE, NULL, FALSE), array_slice($this->qb_set, $i, $batch_size), $this->protect_identifiers($index))); if ($this->query($this->_update_batch($this->protect_identifiers($table, TRUE, NULL, FALSE), array_slice($this->qb_set_ub, $i, $batch_size), $index)))
$affected_rows += $this->affected_rows(); {
$affected_rows += $this->affected_rows();
}
$this->qb_where = array(); $this->qb_where = array();
} }
@ -1939,13 +1958,13 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
$ids = array(); $ids = array();
foreach ($values as $key => $val) foreach ($values as $key => $val)
{ {
$ids[] = $val[$index]; $ids[] = $val[$index]['value'];
foreach (array_keys($val) as $field) foreach (array_keys($val) as $field)
{ {
if ($field !== $index) if ($field !== $index)
{ {
$final[$field][] = 'WHEN '.$index.' = '.$val[$index].' THEN '.$val[$field]; $final[$val[$field]['field']][] = 'WHEN '.$val[$index]['field'].' = '.$val[$index]['value'].' THEN '.$val[$field]['value'];
} }
} }
} }
@ -1958,7 +1977,7 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
.'ELSE '.$k.' END, '; .'ELSE '.$k.' END, ';
} }
$this->where($index.' IN('.implode(',', $ids).')', NULL, FALSE); $this->where($val[$index]['field'].' IN('.implode(',', $ids).')', NULL, FALSE);
return 'UPDATE '.$table.' SET '.substr($cases, 0, -2).$this->_compile_wh('qb_where'); return 'UPDATE '.$table.' SET '.substr($cases, 0, -2).$this->_compile_wh('qb_where');
} }
@ -1995,7 +2014,10 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
$index_set = TRUE; $index_set = TRUE;
} }
$clean[$this->protect_identifiers($k2, FALSE, $escape)] = ($escape === FALSE) ? $v2 : $this->escape($v2); $clean[$k2] = array(
'field' => $this->protect_identifiers($k2, FALSE, $escape),
'value' => ($escape === FALSE ? $v2 : $this->escape($v2))
);
} }
if ($index_set === FALSE) if ($index_set === FALSE)
@ -2003,7 +2025,7 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
return $this->display_error('db_batch_missing_index'); return $this->display_error('db_batch_missing_index');
} }
$this->qb_set[] = $clean; $this->qb_set_ub[] = $clean;
} }
return $this; return $this;
@ -2266,9 +2288,14 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
$table = trim(strrchr($table, ' ')); $table = trim(strrchr($table, ' '));
// Store the alias, if it doesn't already exist // Store the alias, if it doesn't already exist
if ( ! in_array($table, $this->qb_aliased_tables)) if ( ! in_array($table, $this->qb_aliased_tables, TRUE))
{ {
$this->qb_aliased_tables[] = $table; $this->qb_aliased_tables[] = $table;
if ($this->qb_caching === TRUE && ! in_array($table, $this->qb_cache_aliased_tables, TRUE))
{
$this->qb_cache_aliased_tables[] = $table;
$this->qb_cache_exists[] = 'aliased_tables';
}
} }
} }
} }
@ -2335,7 +2362,7 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
.$this->_compile_order_by(); // ORDER BY .$this->_compile_order_by(); // ORDER BY
// LIMIT // LIMIT
if ($this->qb_limit) if ($this->qb_limit OR $this->qb_offset)
{ {
return $this->_limit($sql."\n"); return $this->_limit($sql."\n");
} }
@ -2426,7 +2453,7 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
* *
* Escapes identifiers in GROUP BY statements at execution time. * Escapes identifiers in GROUP BY statements at execution time.
* *
* Required so that aliases are tracked properly, regardless of wether * Required so that aliases are tracked properly, regardless of whether
* group_by() is called prior to from(), join() and dbprefix is added * group_by() is called prior to from(), join() and dbprefix is added
* only if needed. * only if needed.
* *
@ -2462,7 +2489,7 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
* *
* Escapes identifiers in ORDER BY statements at execution time. * Escapes identifiers in ORDER BY statements at execution time.
* *
* Required so that aliases are tracked properly, regardless of wether * Required so that aliases are tracked properly, regardless of whether
* order_by() is called prior to from(), join() and dbprefix is added * order_by() is called prior to from(), join() and dbprefix is added
* only if needed. * only if needed.
* *
@ -2470,26 +2497,27 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
*/ */
protected function _compile_order_by() protected function _compile_order_by()
{ {
if (is_array($this->qb_orderby) && count($this->qb_orderby) > 0) if (empty($this->qb_orderby))
{ {
for ($i = 0, $c = count($this->qb_orderby); $i < $c; $i++) return '';
{ }
if ($this->qb_orderby[$i]['escape'] !== FALSE && ! $this->_is_literal($this->qb_orderby[$i]['field']))
{
$this->qb_orderby[$i]['field'] = $this->protect_identifiers($this->qb_orderby[$i]['field']);
}
$this->qb_orderby[$i] = $this->qb_orderby[$i]['field'].$this->qb_orderby[$i]['direction']; for ($i = 0, $c = count($this->qb_orderby); $i < $c; $i++)
{
if (is_string($this->qb_orderby[$i]))
{
continue;
} }
return $this->qb_orderby = "\nORDER BY ".implode(', ', $this->qb_orderby); if ($this->qb_orderby[$i]['escape'] !== FALSE && ! $this->_is_literal($this->qb_orderby[$i]['field']))
} {
elseif (is_string($this->qb_orderby)) $this->qb_orderby[$i]['field'] = $this->protect_identifiers($this->qb_orderby[$i]['field']);
{ }
return $this->qb_orderby;
$this->qb_orderby[$i] = $this->qb_orderby[$i]['field'].$this->qb_orderby[$i]['direction'];
} }
return ''; return "\nORDER BY ".implode(', ', $this->qb_orderby);
} }
// -------------------------------------------------------------------- // --------------------------------------------------------------------
@ -2610,7 +2638,8 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
'qb_cache_orderby' => array(), 'qb_cache_orderby' => array(),
'qb_cache_set' => array(), 'qb_cache_set' => array(),
'qb_cache_exists' => array(), 'qb_cache_exists' => array(),
'qb_cache_no_escape' => array() 'qb_cache_no_escape' => array(),
'qb_cache_aliased_tables' => array()
)); ));
return $this; return $this;
@ -2661,13 +2690,6 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
$this->qb_no_escape = $qb_no_escape; $this->qb_no_escape = $qb_no_escape;
} }
} }
// If we are "protecting identifiers" we need to examine the "from"
// portion of the query to determine if there are any aliases
if ($this->_protect_identifiers === TRUE && count($this->qb_cache_from) > 0)
{
$this->_track_aliases($this->qb_from);
}
} }
// -------------------------------------------------------------------- // --------------------------------------------------------------------
@ -2770,6 +2792,7 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
{ {
$this->_reset_run(array( $this->_reset_run(array(
'qb_set' => array(), 'qb_set' => array(),
'qb_set_ub' => array(),
'qb_from' => array(), 'qb_from' => array(),
'qb_join' => array(), 'qb_join' => array(),
'qb_where' => array(), 'qb_where' => array(),

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 1.0.0 * @since Version 1.0.0
@ -660,7 +660,7 @@ class CI_DB_result {
*/ */
protected function _fetch_object($class_name = 'stdClass') protected function _fetch_object($class_name = 'stdClass')
{ {
return array(); return new $class_name();
} }
} }

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 1.0.0 * @since Version 1.0.0

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 2.1.0 * @since Version 2.1.0
@ -250,7 +250,7 @@ class CI_DB_cubrid_driver extends CI_DB {
// -------------------------------------------------------------------- // --------------------------------------------------------------------
/** /**
* Platform-dependant string escape * Platform-dependent string escape
* *
* @param string * @param string
* @return string * @return string
@ -361,7 +361,7 @@ class CI_DB_cubrid_driver extends CI_DB {
* Error * Error
* *
* Returns an array containing code and message of the last * Returns an array containing code and message of the last
* database error that has occured. * database error that has occurred.
* *
* @return array * @return array
*/ */

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 2.1.0 * @since Version 2.1.0
@ -178,6 +178,9 @@ class CI_DB_cubrid_forge extends CI_DB_forge {
$attributes['TYPE'] = 'INTEGER'; $attributes['TYPE'] = 'INTEGER';
$attributes['UNSIGNED'] = FALSE; $attributes['UNSIGNED'] = FALSE;
return; return;
case 'LONGTEXT':
$attributes['TYPE'] = 'STRING';
return;
default: return; default: return;
} }
} }

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 2.1.0 * @since Version 2.1.0

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 2.1.0 * @since Version 2.1.0

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 3.0.0 * @since Version 3.0.0
@ -294,7 +294,7 @@ class CI_DB_ibase_driver extends CI_DB {
* Error * Error
* *
* Returns an array containing code and message of the last * Returns an array containing code and message of the last
* database error that has occured. * database error that has occurred.
* *
* @return array * @return array
*/ */
@ -383,6 +383,23 @@ class CI_DB_ibase_driver extends CI_DB {
// -------------------------------------------------------------------- // --------------------------------------------------------------------
/**
* Insert batch statement
*
* Generates a platform-specific insert string from the supplied data.
*
* @param string $table Table name
* @param array $keys INSERT keys
* @param array $values INSERT values
* @return string|bool
*/
protected function _insert_batch($table, $keys, $values)
{
return ($this->db_debug) ? $this->display_error('db_unsupported_feature') : FALSE;
}
// --------------------------------------------------------------------
/** /**
* Close DB Connection * Close DB Connection
* *

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 3.0.0 * @since Version 3.0.0
@ -111,7 +111,7 @@ class CI_DB_ibase_forge extends CI_DB_forge {
* @param string $db_name (ignored) * @param string $db_name (ignored)
* @return bool * @return bool
*/ */
public function drop_database($db_name = '') public function drop_database($db_name)
{ {
if ( ! ibase_drop_db($this->conn_id)) if ( ! ibase_drop_db($this->conn_id))
{ {

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 3.0.0 * @since Version 3.0.0

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 3.0.0 * @since Version 3.0.0

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 1.3.0 * @since Version 1.3.0
@ -158,6 +158,7 @@ class CI_DB_mssql_driver extends CI_DB {
if (mssql_select_db('['.$database.']', $this->conn_id)) if (mssql_select_db('['.$database.']', $this->conn_id))
{ {
$this->database = $database; $this->database = $database;
$this->data_cache = array();
return TRUE; return TRUE;
} }
@ -351,7 +352,7 @@ class CI_DB_mssql_driver extends CI_DB {
* Error * Error
* *
* Returns an array containing code and message of the last * Returns an array containing code and message of the last
* database error that has occured. * database error that has occurred.
* *
* @return array * @return array
*/ */
@ -499,7 +500,7 @@ class CI_DB_mssql_driver extends CI_DB {
return parent::_insert_batch($table, $keys, $values); return parent::_insert_batch($table, $keys, $values);
} }
return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; return ($this->db_debug) ? $this->display_error('db_unsupported_feature') : FALSE;
} }
// -------------------------------------------------------------------- // --------------------------------------------------------------------

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 1.3.0 * @since Version 1.3.0
@ -113,6 +113,11 @@ class CI_DB_mssql_forge extends CI_DB_forge {
*/ */
protected function _attr_type(&$attributes) protected function _attr_type(&$attributes)
{ {
if (isset($attributes['CONSTRAINT']) && strpos($attributes['TYPE'], 'INT') !== FALSE)
{
unset($attributes['CONSTRAINT']);
}
switch (strtoupper($attributes['TYPE'])) switch (strtoupper($attributes['TYPE']))
{ {
case 'MEDIUMINT': case 'MEDIUMINT':

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 1.3.0 * @since Version 1.3.0

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 1.3.0 * @since Version 1.3.0

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 1.0.0 * @since Version 1.0.0
@ -208,6 +208,7 @@ class CI_DB_mysql_driver extends CI_DB {
if (mysql_select_db($database, $this->conn_id)) if (mysql_select_db($database, $this->conn_id))
{ {
$this->database = $database; $this->database = $database;
$this->data_cache = array();
return TRUE; return TRUE;
} }
@ -336,7 +337,7 @@ class CI_DB_mysql_driver extends CI_DB {
// -------------------------------------------------------------------- // --------------------------------------------------------------------
/** /**
* Platform-dependant string escape * Platform-dependent string escape
* *
* @param string * @param string
* @return string * @return string
@ -447,7 +448,7 @@ class CI_DB_mysql_driver extends CI_DB {
* Error * Error
* *
* Returns an array containing code and message of the last * Returns an array containing code and message of the last
* database error that has occured. * database error that has occurred.
* *
* @return array * @return array
*/ */

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 1.0.0 * @since Version 1.0.0

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 1.0.0 * @since Version 1.0.0

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 1.0.0 * @since Version 1.0.0

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 1.3.0 * @since Version 1.3.0
@ -125,8 +125,7 @@ class CI_DB_mysqli_driver extends CI_DB {
} }
else else
{ {
// Persistent connection support was added in PHP 5.3.0 $hostname = ($persistent === TRUE)
$hostname = ($persistent === TRUE && is_php('5.3'))
? 'p:'.$this->hostname : $this->hostname; ? 'p:'.$this->hostname : $this->hostname;
$port = empty($this->port) ? NULL : $this->port; $port = empty($this->port) ? NULL : $this->port;
$socket = NULL; $socket = NULL;
@ -184,7 +183,7 @@ class CI_DB_mysqli_driver extends CI_DB {
// https://bugs.php.net/bug.php?id=68344 // https://bugs.php.net/bug.php?id=68344
elseif (defined('MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT')) elseif (defined('MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT'))
{ {
$this->_mysqli->options(MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT, TRUE); $client_flags |= MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT;
} }
} }
@ -211,7 +210,7 @@ class CI_DB_mysqli_driver extends CI_DB {
$this->_mysqli->close(); $this->_mysqli->close();
$message = 'MySQLi was configured for an SSL connection, but got an unencrypted connection instead!'; $message = 'MySQLi was configured for an SSL connection, but got an unencrypted connection instead!';
log_message('error', $message); log_message('error', $message);
return ($this->db->db_debug) ? $this->db->display_error($message, '', TRUE) : FALSE; return ($this->db_debug) ? $this->display_error($message, '', TRUE) : FALSE;
} }
return $this->_mysqli; return $this->_mysqli;
@ -256,6 +255,7 @@ class CI_DB_mysqli_driver extends CI_DB {
if ($this->conn_id->select_db($database)) if ($this->conn_id->select_db($database))
{ {
$this->database = $database; $this->database = $database;
$this->data_cache = array();
return TRUE; return TRUE;
} }
@ -381,7 +381,7 @@ class CI_DB_mysqli_driver extends CI_DB {
// -------------------------------------------------------------------- // --------------------------------------------------------------------
/** /**
* Platform-dependant string escape * Platform-dependent string escape
* *
* @param string * @param string
* @return string * @return string
@ -501,8 +501,8 @@ class CI_DB_mysqli_driver extends CI_DB {
if ( ! empty($this->_mysqli->connect_errno)) if ( ! empty($this->_mysqli->connect_errno))
{ {
return array( return array(
'code' => $this->_mysqli->connect_errno, 'code' => $this->_mysqli->connect_errno,
'message' => is_php('5.2.9') ? $this->_mysqli->connect_error : mysqli_connect_error() 'message' => $this->_mysqli->connect_error
); );
} }

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 1.3.0 * @since Version 1.3.0

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 1.3.0 * @since Version 1.3.0

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 1.3.0 * @since Version 1.3.0

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 1.4.1 * @since Version 1.4.1
@ -386,7 +386,7 @@ class CI_DB_oci8_driver extends CI_DB {
*/ */
protected function _trans_begin() protected function _trans_begin()
{ {
$this->commit_mode = is_php('5.3.2') ? OCI_NO_AUTO_COMMIT : OCI_DEFAULT; $this->commit_mode = OCI_NO_AUTO_COMMIT;
return TRUE; return TRUE;
} }
@ -553,29 +553,35 @@ class CI_DB_oci8_driver extends CI_DB {
* Error * Error
* *
* Returns an array containing code and message of the last * Returns an array containing code and message of the last
* database error that has occured. * database error that has occurred.
* *
* @return array * @return array
*/ */
public function error() public function error()
{ {
/* oci_error() returns an array that already contains the // oci_error() returns an array that already contains
* 'code' and 'message' keys, so we can just return it. // 'code' and 'message' keys, but it can return false
*/ // if there was no error ....
if (is_resource($this->curs_id)) if (is_resource($this->curs_id))
{ {
return oci_error($this->curs_id); $error = oci_error($this->curs_id);
} }
elseif (is_resource($this->stmt_id)) elseif (is_resource($this->stmt_id))
{ {
return oci_error($this->stmt_id); $error = oci_error($this->stmt_id);
} }
elseif (is_resource($this->conn_id)) elseif (is_resource($this->conn_id))
{ {
return oci_error($this->conn_id); $error = oci_error($this->conn_id);
}
else
{
$error = oci_error();
} }
return oci_error(); return is_array($error)
? $error
: array('code' => '', 'message' => '');
} }
// -------------------------------------------------------------------- // --------------------------------------------------------------------

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 1.4.1 * @since Version 1.4.1
@ -53,6 +53,13 @@ class CI_DB_oci8_forge extends CI_DB_forge {
*/ */
protected $_create_database = FALSE; protected $_create_database = FALSE;
/**
* CREATE TABLE IF statement
*
* @var string
*/
protected $_create_table_if = FALSE;
/** /**
* DROP DATABASE statement * DROP DATABASE statement
* *
@ -119,6 +126,8 @@ class CI_DB_oci8_forge extends CI_DB_forge {
$sqls[] = $sql.' RENAME COLUMN '.$this->db->escape_identifiers($field[$i]['name']) $sqls[] = $sql.' RENAME COLUMN '.$this->db->escape_identifiers($field[$i]['name'])
.' '.$this->db->escape_identifiers($field[$i]['new_name']); .' '.$this->db->escape_identifiers($field[$i]['new_name']);
} }
$field[$i] = "\n\t".$field[$i]['_literal'];
} }
} }
@ -129,7 +138,7 @@ class CI_DB_oci8_forge extends CI_DB_forge {
// RENAME COLUMN must be executed after MODIFY // RENAME COLUMN must be executed after MODIFY
array_unshift($sqls, $sql); array_unshift($sqls, $sql);
return $sql; return $sqls;
} }
// -------------------------------------------------------------------- // --------------------------------------------------------------------
@ -146,4 +155,33 @@ class CI_DB_oci8_forge extends CI_DB_forge {
// Not supported - sequences and triggers must be used instead // Not supported - sequences and triggers must be used instead
} }
// --------------------------------------------------------------------
/**
* Field attribute TYPE
*
* Performs a data type mapping between different databases.
*
* @param array &$attributes
* @return void
*/
protected function _attr_type(&$attributes)
{
switch (strtoupper($attributes['TYPE']))
{
case 'TINYINT':
$attributes['TYPE'] = 'NUMBER';
return;
case 'MEDIUMINT':
$attributes['TYPE'] = 'NUMBER';
return;
case 'INT':
$attributes['TYPE'] = 'NUMBER';
return;
case 'BIGINT':
$attributes['TYPE'] = 'NUMBER';
return;
default: return;
}
}
} }

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 1.4.1 * @since Version 1.4.1

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 1.4.1 * @since Version 1.4.1

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 1.3.0 * @since Version 1.3.0
@ -50,7 +50,7 @@ defined('BASEPATH') OR exit('No direct script access allowed');
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @link https://codeigniter.com/user_guide/database/ * @link https://codeigniter.com/user_guide/database/
*/ */
class CI_DB_odbc_driver extends CI_DB { class CI_DB_odbc_driver extends CI_DB_driver {
/** /**
* Database driver * Database driver
@ -93,6 +93,22 @@ class CI_DB_odbc_driver extends CI_DB {
// -------------------------------------------------------------------- // --------------------------------------------------------------------
/**
* ODBC result ID resource returned from odbc_prepare()
*
* @var resource
*/
private $odbc_result;
/**
* Values to use with odbc_execute() for prepared statements
*
* @var array
*/
private $binds = array();
// --------------------------------------------------------------------
/** /**
* Class constructor * Class constructor
* *
@ -127,6 +143,74 @@ class CI_DB_odbc_driver extends CI_DB {
// -------------------------------------------------------------------- // --------------------------------------------------------------------
/**
* Compile Bindings
*
* @param string $sql SQL statement
* @param array $binds An array of values to bind
* @return string
*/
public function compile_binds($sql, $binds)
{
if (empty($binds) OR empty($this->bind_marker) OR strpos($sql, $this->bind_marker) === FALSE)
{
return $sql;
}
elseif ( ! is_array($binds))
{
$binds = array($binds);
$bind_count = 1;
}
else
{
// Make sure we're using numeric keys
$binds = array_values($binds);
$bind_count = count($binds);
}
// We'll need the marker length later
$ml = strlen($this->bind_marker);
// Make sure not to replace a chunk inside a string that happens to match the bind marker
if ($c = preg_match_all("/'[^']*'|\"[^\"]*\"/i", $sql, $matches))
{
$c = preg_match_all('/'.preg_quote($this->bind_marker, '/').'/i',
str_replace($matches[0],
str_replace($this->bind_marker, str_repeat(' ', $ml), $matches[0]),
$sql, $c),
$matches, PREG_OFFSET_CAPTURE);
// Bind values' count must match the count of markers in the query
if ($bind_count !== $c)
{
return $sql;
}
}
elseif (($c = preg_match_all('/'.preg_quote($this->bind_marker, '/').'/i', $sql, $matches, PREG_OFFSET_CAPTURE)) !== $bind_count)
{
return $sql;
}
if ($this->bind_marker !== '?')
{
do
{
$c--;
$sql = substr_replace($sql, '?', $matches[0][$c][1], $ml);
}
while ($c !== 0);
}
if (FALSE !== ($this->odbc_result = odbc_prepare($this->conn_id, $sql)))
{
$this->binds = array_values($binds);
}
return $sql;
}
// --------------------------------------------------------------------
/** /**
* Execute the query * Execute the query
* *
@ -135,7 +219,25 @@ class CI_DB_odbc_driver extends CI_DB {
*/ */
protected function _execute($sql) protected function _execute($sql)
{ {
return odbc_exec($this->conn_id, $sql); if ( ! isset($this->odbc_result))
{
return odbc_exec($this->conn_id, $sql);
}
elseif ($this->odbc_result === FALSE)
{
return FALSE;
}
if (TRUE === ($success = odbc_execute($this->odbc_result, $this->binds)))
{
// For queries that return result sets, return the result_id resource on success
$this->is_write_type($sql) OR $success = $this->odbc_result;
}
$this->odbc_result = NULL;
$this->binds = array();
return $success;
} }
// -------------------------------------------------------------------- // --------------------------------------------------------------------
@ -196,7 +298,7 @@ class CI_DB_odbc_driver extends CI_DB {
*/ */
public function is_write_type($sql) public function is_write_type($sql)
{ {
if (preg_match('#^(INSERT|UPDATE).*RETURNING\s.+(\,\s?.+)*$#i', $sql)) if (preg_match('#^(INSERT|UPDATE).*RETURNING\s.+(\,\s?.+)*$#is', $sql))
{ {
return FALSE; return FALSE;
} }
@ -207,14 +309,14 @@ class CI_DB_odbc_driver extends CI_DB {
// -------------------------------------------------------------------- // --------------------------------------------------------------------
/** /**
* Platform-dependant string escape * Platform-dependent string escape
* *
* @param string * @param string
* @return string * @return string
*/ */
protected function _escape_str($str) protected function _escape_str($str)
{ {
return remove_invisible_characters($str); $this->display_error('db_unsupported_feature');
} }
// -------------------------------------------------------------------- // --------------------------------------------------------------------
@ -238,7 +340,7 @@ class CI_DB_odbc_driver extends CI_DB {
*/ */
public function insert_id() public function insert_id()
{ {
return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; return ($this->db_debug) ? $this->display_error('db_unsupported_feature') : FALSE;
} }
// -------------------------------------------------------------------- // --------------------------------------------------------------------
@ -300,7 +402,7 @@ class CI_DB_odbc_driver extends CI_DB {
* Error * Error
* *
* Returns an array containing code and message of the last * Returns an array containing code and message of the last
* database error that has occured. * database error that has occurred.
* *
* @return array * @return array
*/ */
@ -311,58 +413,6 @@ class CI_DB_odbc_driver extends CI_DB {
// -------------------------------------------------------------------- // --------------------------------------------------------------------
/**
* Update statement
*
* Generates a platform-specific update string from the supplied data
*
* @param string $table
* @param array $values
* @return string
*/
protected function _update($table, $values)
{
$this->qb_limit = FALSE;
$this->qb_orderby = array();
return parent::_update($table, $values);
}
// --------------------------------------------------------------------
/**
* Truncate statement
*
* Generates a platform-specific truncate string from the supplied data
*
* If the database does not support the TRUNCATE statement,
* then this method maps to 'DELETE FROM table'
*
* @param string $table
* @return string
*/
protected function _truncate($table)
{
return 'DELETE FROM '.$table;
}
// --------------------------------------------------------------------
/**
* Delete statement
*
* Generates a platform-specific delete string from the supplied data
*
* @param string $table
* @return string
*/
protected function _delete($table)
{
$this->qb_limit = FALSE;
return parent::_delete($table);
}
// --------------------------------------------------------------------
/** /**
* Close DB Connection * Close DB Connection
* *
@ -372,5 +422,4 @@ class CI_DB_odbc_driver extends CI_DB {
{ {
odbc_close($this->conn_id); odbc_close($this->conn_id);
} }
} }

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 1.3.0 * @since Version 1.3.0

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 1.3.0 * @since Version 1.3.0

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 1.3.0 * @since Version 1.3.0

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 2.1.0 * @since Version 2.1.0
@ -126,7 +126,10 @@ class CI_DB_pdo_driver extends CI_DB {
*/ */
public function db_connect($persistent = FALSE) public function db_connect($persistent = FALSE)
{ {
$this->options[PDO::ATTR_PERSISTENT] = $persistent; if ($persistent === TRUE)
{
$this->options[PDO::ATTR_PERSISTENT] = TRUE;
}
try try
{ {
@ -220,7 +223,7 @@ class CI_DB_pdo_driver extends CI_DB {
// -------------------------------------------------------------------- // --------------------------------------------------------------------
/** /**
* Platform-dependant string escape * Platform-dependent string escape
* *
* @param string * @param string
* @return string * @return string
@ -282,7 +285,7 @@ class CI_DB_pdo_driver extends CI_DB {
* Error * Error
* *
* Returns an array containing code and message of the last * Returns an array containing code and message of the last
* database error that has occured. * database error that has occurred.
* *
* @return array * @return array
*/ */
@ -307,52 +310,6 @@ class CI_DB_pdo_driver extends CI_DB {
// -------------------------------------------------------------------- // --------------------------------------------------------------------
/**
* Update_Batch statement
*
* Generates a platform-specific batch update string from the supplied data
*
* @param string $table Table name
* @param array $values Update data
* @param string $index WHERE key
* @return string
*/
protected function _update_batch($table, $values, $index)
{
$ids = array();
foreach ($values as $key => $val)
{
$ids[] = $val[$index];
foreach (array_keys($val) as $field)
{
if ($field !== $index)
{
$final[$field][] = 'WHEN '.$index.' = '.$val[$index].' THEN '.$val[$field];
}
}
}
$cases = '';
foreach ($final as $k => $v)
{
$cases .= $k.' = CASE '."\n";
foreach ($v as $row)
{
$cases .= $row."\n";
}
$cases .= 'ELSE '.$k.' END, ';
}
$this->where($index.' IN('.implode(',', $ids).')', NULL, FALSE);
return 'UPDATE '.$table.' SET '.substr($cases, 0, -2).$this->_compile_wh('qb_where');
}
// --------------------------------------------------------------------
/** /**
* Truncate statement * Truncate statement
* *

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 2.1.0 * @since Version 2.1.0

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 2.1.0 * @since Version 2.1.0

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 2.1.0 * @since Version 2.1.0

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 3.0.0 * @since Version 3.0.0

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 3.0.0 * @since Version 3.0.0

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 3.0.0 * @since Version 3.0.0
@ -170,47 +170,6 @@ class CI_DB_pdo_cubrid_driver extends CI_DB_pdo_driver {
// -------------------------------------------------------------------- // --------------------------------------------------------------------
/**
* Update_Batch statement
*
* Generates a platform-specific batch update string from the supplied data
*
* @param string $table Table name
* @param array $values Update data
* @param string $index WHERE key
* @return string
*/
protected function _update_batch($table, $values, $index)
{
$ids = array();
foreach ($values as $key => $val)
{
$ids[] = $val[$index];
foreach (array_keys($val) as $field)
{
if ($field !== $index)
{
$final[$field][] = 'WHEN '.$index.' = '.$val[$index].' THEN '.$val[$field];
}
}
}
$cases = '';
foreach ($final as $k => $v)
{
$cases .= $k." = CASE \n"
.implode("\n", $v)."\n"
.'ELSE '.$k.' END), ';
}
$this->where($index.' IN('.implode(',', $ids).')', NULL, FALSE);
return 'UPDATE '.$table.' SET '.substr($cases, 0, -2).$this->_compile_wh('qb_where');
}
// --------------------------------------------------------------------
/** /**
* Truncate statement * Truncate statement
* *

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 3.0.0 * @since Version 3.0.0
@ -178,6 +178,9 @@ class CI_DB_pdo_cubrid_forge extends CI_DB_pdo_forge {
$attributes['TYPE'] = 'INTEGER'; $attributes['TYPE'] = 'INTEGER';
$attributes['UNSIGNED'] = FALSE; $attributes['UNSIGNED'] = FALSE;
return; return;
case 'LONGTEXT':
$attributes['TYPE'] = 'STRING';
return;
default: return; default: return;
} }
} }

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 3.0.0 * @since Version 3.0.0
@ -126,7 +126,12 @@ class CI_DB_pdo_dblib_driver extends CI_DB_pdo_driver {
*/ */
public function db_connect($persistent = FALSE) public function db_connect($persistent = FALSE)
{ {
$this->conn_id = parent::db_connect($persistent); if ($persistent === TRUE)
{
log_message('debug', "dblib driver doesn't support persistent connections");
}
$this->conn_id = parent::db_connect(FALSE);
if ( ! is_object($this->conn_id)) if ( ! is_object($this->conn_id))
{ {
@ -326,7 +331,7 @@ class CI_DB_pdo_dblib_driver extends CI_DB_pdo_driver {
return parent::_insert_batch($table, $keys, $values); return parent::_insert_batch($table, $keys, $values);
} }
return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; return ($this->db_debug) ? $this->display_error('db_unsupported_feature') : FALSE;
} }
} }

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 3.0.0 * @since Version 3.0.0
@ -111,6 +111,11 @@ class CI_DB_pdo_dblib_forge extends CI_DB_pdo_forge {
*/ */
protected function _attr_type(&$attributes) protected function _attr_type(&$attributes)
{ {
if (isset($attributes['CONSTRAINT']) && strpos($attributes['TYPE'], 'INT') !== FALSE)
{
unset($attributes['CONSTRAINT']);
}
switch (strtoupper($attributes['TYPE'])) switch (strtoupper($attributes['TYPE']))
{ {
case 'MEDIUMINT': case 'MEDIUMINT':

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 3.0.0 * @since Version 3.0.0
@ -260,4 +260,20 @@ class CI_DB_pdo_firebird_driver extends CI_DB_pdo_driver {
return preg_replace('`SELECT`i', 'SELECT '.$select, $sql); return preg_replace('`SELECT`i', 'SELECT '.$select, $sql);
} }
// --------------------------------------------------------------------
/**
* Insert batch statement
*
* Generates a platform-specific insert string from the supplied data.
*
* @param string $table Table name
* @param array $keys INSERT keys
* @param array $values INSERT values
* @return string|bool
*/
protected function _insert_batch($table, $keys, $values)
{
return ($this->db_debug) ? $this->display_error('db_unsupported_feature') : FALSE;
}
} }

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 3.0.0 * @since Version 3.0.0
@ -97,7 +97,7 @@ class CI_DB_pdo_firebird_forge extends CI_DB_pdo_forge {
* @param string $db_name (ignored) * @param string $db_name (ignored)
* @return bool * @return bool
*/ */
public function drop_database($db_name = '') public function drop_database($db_name)
{ {
if ( ! ibase_drop_db($this->conn_id)) if ( ! ibase_drop_db($this->conn_id))
{ {

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 3.0.0 * @since Version 3.0.0

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 3.0.0 * @since Version 3.0.0

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 3.0.0 * @since Version 3.0.0

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 3.0.0 * @since Version 3.0.0

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 3.0.0 * @since Version 3.0.0
@ -106,7 +106,7 @@ class CI_DB_pdo_mysql_driver extends CI_DB_pdo_driver {
empty($this->database) OR $this->dsn .= ';dbname='.$this->database; empty($this->database) OR $this->dsn .= ';dbname='.$this->database;
empty($this->char_set) OR $this->dsn .= ';charset='.$this->char_set; empty($this->char_set) OR $this->dsn .= ';charset='.$this->char_set;
} }
elseif ( ! empty($this->char_set) && strpos($this->dsn, 'charset=', 6) === FALSE && is_php('5.3.6')) elseif ( ! empty($this->char_set) && strpos($this->dsn, 'charset=', 6) === FALSE)
{ {
$this->dsn .= ';charset='.$this->char_set; $this->dsn .= ';charset='.$this->char_set;
} }
@ -122,17 +122,6 @@ class CI_DB_pdo_mysql_driver extends CI_DB_pdo_driver {
*/ */
public function db_connect($persistent = FALSE) public function db_connect($persistent = FALSE)
{ {
/* Prior to PHP 5.3.6, even if the charset was supplied in the DSN
* on connect - it was ignored. This is a work-around for the issue.
*
* Reference: http://www.php.net/manual/en/ref.pdo-mysql.connection.php
*/
if ( ! is_php('5.3.6') && ! empty($this->char_set))
{
$this->options[PDO::MYSQL_ATTR_INIT_COMMAND] = 'SET NAMES '.$this->char_set
.(empty($this->dbcollat) ? '' : ' COLLATE '.$this->dbcollat);
}
if (isset($this->stricton)) if (isset($this->stricton))
{ {
if ($this->stricton) if ($this->stricton)
@ -169,8 +158,7 @@ class CI_DB_pdo_mysql_driver extends CI_DB_pdo_driver {
$this->options[PDO::MYSQL_ATTR_COMPRESS] = TRUE; $this->options[PDO::MYSQL_ATTR_COMPRESS] = TRUE;
} }
// SSL support was added to PDO_MYSQL in PHP 5.3.7 if (is_array($this->encrypt))
if (is_array($this->encrypt) && is_php('5.3.7'))
{ {
$ssl = array(); $ssl = array();
empty($this->encrypt['ssl_key']) OR $ssl[PDO::MYSQL_ATTR_SSL_KEY] = $this->encrypt['ssl_key']; empty($this->encrypt['ssl_key']) OR $ssl[PDO::MYSQL_ATTR_SSL_KEY] = $this->encrypt['ssl_key'];
@ -194,7 +182,7 @@ class CI_DB_pdo_mysql_driver extends CI_DB_pdo_driver {
{ {
$message = 'PDO_MYSQL was configured for an SSL connection, but got an unencrypted connection instead!'; $message = 'PDO_MYSQL was configured for an SSL connection, but got an unencrypted connection instead!';
log_message('error', $message); log_message('error', $message);
return ($this->db->db_debug) ? $this->db->display_error($message, '', TRUE) : FALSE; return ($this->db_debug) ? $this->display_error($message, '', TRUE) : FALSE;
} }
return $pdo; return $pdo;
@ -218,6 +206,56 @@ class CI_DB_pdo_mysql_driver extends CI_DB_pdo_driver {
if (FALSE !== $this->simple_query('USE '.$this->escape_identifiers($database))) if (FALSE !== $this->simple_query('USE '.$this->escape_identifiers($database)))
{ {
$this->database = $database; $this->database = $database;
$this->data_cache = array();
return TRUE;
}
return FALSE;
}
// --------------------------------------------------------------------
/**
* Begin Transaction
*
* @return bool
*/
protected function _trans_begin()
{
$this->conn_id->setAttribute(PDO::ATTR_AUTOCOMMIT, FALSE);
return $this->conn_id->beginTransaction();
}
// --------------------------------------------------------------------
/**
* Commit Transaction
*
* @return bool
*/
protected function _trans_commit()
{
if ($this->conn_id->commit())
{
$this->conn_id->setAttribute(PDO::ATTR_AUTOCOMMIT, TRUE);
return TRUE;
}
return FALSE;
}
// --------------------------------------------------------------------
/**
* Rollback Transaction
*
* @return bool
*/
protected function _trans_rollback()
{
if ($this->conn_id->rollBack())
{
$this->conn_id->setAttribute(PDO::ATTR_AUTOCOMMIT, TRUE);
return TRUE; return TRUE;
} }

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 3.0.0 * @since Version 3.0.0

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 3.0.0 * @since Version 3.0.0

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 3.0.0 * @since Version 3.0.0
@ -53,6 +53,13 @@ class CI_DB_pdo_oci_forge extends CI_DB_pdo_forge {
*/ */
protected $_create_database = FALSE; protected $_create_database = FALSE;
/**
* CREATE TABLE IF statement
*
* @var string
*/
protected $_create_table_if = FALSE;
/** /**
* DROP DATABASE statement * DROP DATABASE statement
* *
@ -60,13 +67,6 @@ class CI_DB_pdo_oci_forge extends CI_DB_pdo_forge {
*/ */
protected $_drop_database = FALSE; protected $_drop_database = FALSE;
/**
* CREATE TABLE IF statement
*
* @var string
*/
protected $_create_table_if = 'CREATE TABLE IF NOT EXISTS';
/** /**
* UNSIGNED support * UNSIGNED support
* *
@ -146,4 +146,31 @@ class CI_DB_pdo_oci_forge extends CI_DB_pdo_forge {
// Not supported - sequences and triggers must be used instead // Not supported - sequences and triggers must be used instead
} }
/**
* Field attribute TYPE
*
* Performs a data type mapping between different databases.
*
* @param array &$attributes
* @return void
*/
protected function _attr_type(&$attributes)
{
switch (strtoupper($attributes['TYPE']))
{
case 'TINYINT':
$attributes['TYPE'] = 'NUMBER';
return;
case 'MEDIUMINT':
$attributes['TYPE'] = 'NUMBER';
return;
case 'INT':
$attributes['TYPE'] = 'NUMBER';
return;
case 'BIGINT':
$attributes['TYPE'] = 'NUMBER';
return;
default: return;
}
}
} }

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 3.0.0 * @since Version 3.0.0
@ -160,6 +160,19 @@ class CI_DB_pdo_odbc_driver extends CI_DB_pdo_driver {
// -------------------------------------------------------------------- // --------------------------------------------------------------------
/**
* Platform-dependent string escape
*
* @param string
* @return string
*/
protected function _escape_str($str)
{
$this->display_error('db_unsupported_feature');
}
// --------------------------------------------------------------------
/** /**
* Determines if a query is a "write" type. * Determines if a query is a "write" type.
* *
@ -168,7 +181,7 @@ class CI_DB_pdo_odbc_driver extends CI_DB_pdo_driver {
*/ */
public function is_write_type($sql) public function is_write_type($sql)
{ {
if (preg_match('#^(INSERT|UPDATE).*RETURNING\s.+(\,\s?.+)*$#i', $sql)) if (preg_match('#^(INSERT|UPDATE).*RETURNING\s.+(\,\s?.+)*$#is', $sql))
{ {
return FALSE; return FALSE;
} }
@ -213,72 +226,4 @@ class CI_DB_pdo_odbc_driver extends CI_DB_pdo_driver {
{ {
return 'SELECT column_name FROM information_schema.columns WHERE table_name = '.$this->escape($table); return 'SELECT column_name FROM information_schema.columns WHERE table_name = '.$this->escape($table);
} }
// --------------------------------------------------------------------
/**
* Update statement
*
* Generates a platform-specific update string from the supplied data
*
* @param string $table
* @param array $values
* @return string
*/
protected function _update($table, $values)
{
$this->qb_limit = FALSE;
$this->qb_orderby = array();
return parent::_update($table, $values);
}
// --------------------------------------------------------------------
/**
* Truncate statement
*
* Generates a platform-specific truncate string from the supplied data
*
* If the database does not support the TRUNCATE statement,
* then this method maps to 'DELETE FROM table'
*
* @param string $table
* @return string
*/
protected function _truncate($table)
{
return 'DELETE FROM '.$table;
}
// --------------------------------------------------------------------
/**
* Delete statement
*
* Generates a platform-specific delete string from the supplied data
*
* @param string the table name
* @return string
*/
protected function _delete($table)
{
$this->qb_limit = FALSE;
return parent::_delete($table);
}
// --------------------------------------------------------------------
/**
* LIMIT
*
* Generates a platform-specific LIMIT clause
*
* @param string $sql SQL Query
* @return string
*/
protected function _limit($sql)
{
return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.$this->qb_limit.' ', $sql);
}
} }

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 3.0.0 * @since Version 3.0.0

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 3.0.0 * @since Version 3.0.0
@ -154,7 +154,7 @@ class CI_DB_pdo_pgsql_driver extends CI_DB_pdo_driver {
*/ */
public function is_write_type($sql) public function is_write_type($sql)
{ {
if (preg_match('#^(INSERT|UPDATE).*RETURNING\s.+(\,\s?.+)*$#i', $sql)) if (preg_match('#^(INSERT|UPDATE).*RETURNING\s.+(\,\s?.+)*$#is', $sql))
{ {
return FALSE; return FALSE;
} }
@ -326,13 +326,13 @@ class CI_DB_pdo_pgsql_driver extends CI_DB_pdo_driver {
$ids = array(); $ids = array();
foreach ($values as $key => $val) foreach ($values as $key => $val)
{ {
$ids[] = $val[$index]; $ids[] = $val[$index]['value'];
foreach (array_keys($val) as $field) foreach (array_keys($val) as $field)
{ {
if ($field !== $index) if ($field !== $index)
{ {
$final[$field][] = 'WHEN '.$val[$index].' THEN '.$val[$field]; $final[$val[$field]['field']][] = 'WHEN '.$val[$index]['value'].' THEN '.$val[$field]['value'];
} }
} }
} }
@ -340,12 +340,12 @@ class CI_DB_pdo_pgsql_driver extends CI_DB_pdo_driver {
$cases = ''; $cases = '';
foreach ($final as $k => $v) foreach ($final as $k => $v)
{ {
$cases .= $k.' = (CASE '.$index."\n" $cases .= $k.' = (CASE '.$val[$index]['field']."\n"
.implode("\n", $v)."\n" .implode("\n", $v)."\n"
.'ELSE '.$k.' END), '; .'ELSE '.$k.' END), ';
} }
$this->where($index.' IN('.implode(',', $ids).')', NULL, FALSE); $this->where($val[$index]['field'].' IN('.implode(',', $ids).')', NULL, FALSE);
return 'UPDATE '.$table.' SET '.substr($cases, 0, -2).$this->_compile_wh('qb_where'); return 'UPDATE '.$table.' SET '.substr($cases, 0, -2).$this->_compile_wh('qb_where');
} }

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 3.0.0 * @since Version 3.0.0
@ -168,7 +168,7 @@ class CI_DB_pdo_pgsql_forge extends CI_DB_pdo_forge {
*/ */
protected function _attr_type(&$attributes) protected function _attr_type(&$attributes)
{ {
// Reset field lenghts for data types that don't support it // Reset field lengths for data types that don't support it
if (isset($attributes['CONSTRAINT']) && stripos($attributes['TYPE'], 'int') !== FALSE) if (isset($attributes['CONSTRAINT']) && stripos($attributes['TYPE'], 'int') !== FALSE)
{ {
$attributes['CONSTRAINT'] = NULL; $attributes['CONSTRAINT'] = NULL;

View file

@ -6,7 +6,7 @@
* *
* This content is released under the MIT License (MIT) * This content is released under the MIT License (MIT)
* *
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology * Copyright (c) 2014 - 2017, British Columbia Institute of Technology
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -29,7 +29,7 @@
* @package CodeIgniter * @package CodeIgniter
* @author EllisLab Dev Team * @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License * @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com * @link https://codeigniter.com
* @since Version 3.0.0 * @since Version 3.0.0
@ -66,7 +66,7 @@ class CI_DB_pdo_sqlite_driver extends CI_DB_pdo_driver {
* *
* @var array * @var array
*/ */
protected $_random_keyword = ' RANDOM()'; protected $_random_keyword = array('RANDOM()', 'RANDOM()');
// -------------------------------------------------------------------- // --------------------------------------------------------------------

Some files were not shown because too many files have changed in this diff Show more